iOS Firebase Dynamic Link 有奇怪的长动态 link url 格式问题
iOS Firebase Dynamic Link with weird long dynamic link url format issue
我在基于 FirebaseDynamicLinks (4.0.8) 的长动态 link 中遇到了一个奇怪的问题:
已尝试参考类似问题firebase/quickstart-ios/issues/380#issuecomment-343255857 and DynamicLinks.dynamicLinks().handleUniversalLink returns false
我的长动态 link 格式类似于:
并且已经通过appsearch-validation-tool
确认我的真实link是正常的
但是,我在 AppDelegate 中实现的 handleUniversalLink 没有回调,导致处理 return NO....
- (BOOL)application:(UIApplication *)application
continueUserActivity:(nonnull NSUserActivity *)userActivity
restorationHandler:
#if defined(__IPHONE_12_0) && (__IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_12_0)
(nonnull void (^)(NSArray<id<UIUserActivityRestoring>> * _Nullable))restorationHandler {
#else
(nonnull void (^)(NSArray *_Nullable))restorationHandler {
#endif // __IPHONE_12_0
if ([userActivity webpageURL] != nil) {
NSString *incomingURL = [userActivity webpageURL].absoluteString;
NSLog(@"Incoming URL is %@", incomingURL);
BOOL handled = [[FIRDynamicLinks dynamicLinks] handleUniversalLink:userActivity.webpageURL
completion:^(FIRDynamicLink * _Nullable dynamicLink,
NSError * _Nullable error) {
if (error != nil) {
return NSLog(@"Found an error! %@", error.localizedDescription);
}
if (dynamicLink != nil && dynamicLink.url != nil) {
[self handleIncomingDynamicLink:dynamicLink]; // additional declare
} else {
NSLog(@"This's weird. Dynamic link object has no url");
}
}];
if (handled) {
return YES;
} else {
// may do other things with incoming URL
return NO;
}
} else { return NO; }
}
NSDictionary *FIRDLDictionaryFromQuery(NSString *queryString) {
NSArray<NSString *> *keyValuePairs = [queryString componentsSeparatedByString:@"&"];
NSMutableDictionary *queryDictionary = [NSMutableDictionary dictionaryWithCapacity:keyValuePairs.count];
for (NSString *pair in keyValuePairs) {
NSArray *keyValuePair = [pair componentsSeparatedByString:@"="];
if (keyValuePair.count == 2) {
NSString *key = keyValuePair[0];
NSString *value = [keyValuePair[1] stringByRemovingPercentEncoding];
[queryDictionary setObject:value forKey:key];
}
}
}
然后我跟踪 FIRDynamicLinks 并找到了根本原因。
Dynamic link for iOS with filter char of @"&" and @"=" ,根据 keyValuePair.count == 2
,我的参数被丢弃 [link]。
由于我的长动态link在第一个[&]符号之前有两个[=]符号,keyValuePair.count是3.
所以我的动态 link 对象没有 link 参数和 return nil
我觉得url要参考Manually constructing a Dynamic Link URL,尽量一样
最后,我发现类似症状 Deep Link does not contain valid required params,link 值必须进行百分比编码,解决了我的困惑和问题。
不过有趣的是,Android没有这个症状的平台,同样的长动态link是可行的。
我在基于 FirebaseDynamicLinks (4.0.8) 的长动态 link 中遇到了一个奇怪的问题:
已尝试参考类似问题firebase/quickstart-ios/issues/380#issuecomment-343255857 and DynamicLinks.dynamicLinks().handleUniversalLink returns false
我的长动态 link 格式类似于:
并且已经通过appsearch-validation-tool
确认我的真实link是正常的但是,我在 AppDelegate 中实现的 handleUniversalLink 没有回调,导致处理 return NO....
- (BOOL)application:(UIApplication *)application
continueUserActivity:(nonnull NSUserActivity *)userActivity
restorationHandler:
#if defined(__IPHONE_12_0) && (__IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_12_0)
(nonnull void (^)(NSArray<id<UIUserActivityRestoring>> * _Nullable))restorationHandler {
#else
(nonnull void (^)(NSArray *_Nullable))restorationHandler {
#endif // __IPHONE_12_0
if ([userActivity webpageURL] != nil) {
NSString *incomingURL = [userActivity webpageURL].absoluteString;
NSLog(@"Incoming URL is %@", incomingURL);
BOOL handled = [[FIRDynamicLinks dynamicLinks] handleUniversalLink:userActivity.webpageURL
completion:^(FIRDynamicLink * _Nullable dynamicLink,
NSError * _Nullable error) {
if (error != nil) {
return NSLog(@"Found an error! %@", error.localizedDescription);
}
if (dynamicLink != nil && dynamicLink.url != nil) {
[self handleIncomingDynamicLink:dynamicLink]; // additional declare
} else {
NSLog(@"This's weird. Dynamic link object has no url");
}
}];
if (handled) {
return YES;
} else {
// may do other things with incoming URL
return NO;
}
} else { return NO; }
}
NSDictionary *FIRDLDictionaryFromQuery(NSString *queryString) {
NSArray<NSString *> *keyValuePairs = [queryString componentsSeparatedByString:@"&"];
NSMutableDictionary *queryDictionary = [NSMutableDictionary dictionaryWithCapacity:keyValuePairs.count];
for (NSString *pair in keyValuePairs) {
NSArray *keyValuePair = [pair componentsSeparatedByString:@"="];
if (keyValuePair.count == 2) {
NSString *key = keyValuePair[0];
NSString *value = [keyValuePair[1] stringByRemovingPercentEncoding];
[queryDictionary setObject:value forKey:key];
}
}
}
然后我跟踪 FIRDynamicLinks 并找到了根本原因。
Dynamic link for iOS with filter char of @"&" and @"=" ,根据 keyValuePair.count == 2
,我的参数被丢弃 [link]。
由于我的长动态link在第一个[&]符号之前有两个[=]符号,keyValuePair.count是3.
所以我的动态 link 对象没有 link 参数和 return nil
我觉得url要参考Manually constructing a Dynamic Link URL,尽量一样
最后,我发现类似症状 Deep Link does not contain valid required params,link 值必须进行百分比编码,解决了我的困惑和问题。
不过有趣的是,Android没有这个症状的平台,同样的长动态link是可行的。