在基于FirebaseDynamicLinks(4.0.8)的长动态链接上,我遇到一个奇怪的问题:
曾尝试提及类似的问题firebase/quickstart-ios/issues/380#issuecomment-343255857和DynamicLinks.dynamicLinks().handleUniversalLink returns false
我的长动态链接格式类似于:
并已通过appsearch-validation-tool确认我的真实链接是正常的
但是,我的AppDelegate中的handleUniversalLink实现没有回调,导致处理后的返回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; }
}
答案 0 :(得分:1)
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并找到根本原因。
iOS的动态链接,其过滤器字符为@“&”和@“ =”,根据keyValuePair.count == 2
,我的参数被删除了[link]的关键字。
由于我的长动态链接在第一个[&]符号之前有两个[=]符号,因此keyValuePair.count为3。
这样我的动态链接对象就没有链接参数并返回nil
我认为url必须引用Manually constructing a Dynamic Link URL,并尝试保持一致。
最后,我发现类似的症状Deep Link does not contain valid required params,链接值必须按百分比编码,从而解决了我的困惑和问题。
但是有趣的是,没有这种症状的Android平台,相同的长动态链接是可行的。