iOS Firebase动态链接具有奇怪的长动态链接URL格式问题

时间:2020-05-04 12:34:57

标签: ios objective-c firebase firebase-dynamic-links

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

曾尝试提及类似的问题firebase/quickstart-ios/issues/380#issuecomment-343255857DynamicLinks.dynamicLinks().handleUniversalLink returns 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; }
}

1 个答案:

答案 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平台,相同的长动态链接是可行的。