首页 > 解决方案 > 带有奇怪的长动态链接 url 格式问题的 iOS Firebase 动态链接

问题描述

我遇到了一个基于 FirebaseDynamicLinks (4.0.8) 的长动态链接的奇怪问题:

已尝试参考类似问题firebase/quickstart-ios/issues/380#issuecomment-343255857DynamicLinks.dynamicLinks().handleUniversalLink 返回 false

我的长动态链接格式是这样的:

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确认我的真实链接是正常的

但是,我在 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; }
}

标签: iosobjective-cfirebasefirebase-dynamic-links

解决方案


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 construction a Dynamic Link URL,并尽量保持相同。

最后,我发现类似的症状Deep Link 不包含有效的必需参数,链接值必须以百分比编码,解决了我的困惑和我的问题。

不过有趣的是,Android平台没有这个症状,同样长的动态链接也是可行的。


推荐阅读