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 格式类似于:

https://example.page.link/?link=https://app.tdservice/account?to=create&apn=com.testDynamicAndroid.service.app&isi=1234567890&ibi=com.TestDynamiciOS.service

并且已经通过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是可行的。