iOS Firebase Dynami c Ссылка со странной длинной динамикой c Проблема с форматом URL ссылки - PullRequest
0 голосов
/ 04 мая 2020

Я столкнулся со странной проблемой с длинной динамической c базой ссылок на FirebaseDynamicLinks (4.0.8):

Попытался обратиться к аналогичным проблемам firebase / quickstart-ios / Issues / 380 # issuecomment -343255857 и DynamicLinks.dynamicLinks (). HandleUniversalLink возвращает false

Формат моей длинной ссылки Dynami c подобен следующему:

https://example.page.link/?link=https: //app.tdservice/account? to = create & apn = com.testDynami cAndroid .service.app & isi = 1234567890 & ibi = com.TestDynami ciOS .service

И уже подтвердите, что моя настоящая ссылка нормальная с помощью appsearch-validation-tool

Однако, моя реализация handleUniversalLink в AppDelegate без обратного вызова, вызывает обработанное возвращение 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 голосов
/ 04 мая 2020
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 и нашел причину root.

Dynami c ссылка для iOS с фильтром char из @ "&" и @ "=", в соответствии с keyValuePair.count == 2, мои параметры будут удалены, кто ключевое слово [ссылка].

Из-за моей длинной динамической c ссылки имеет два символа [=] перед первым символом [&], keyValuePair.count равен 3.

Так что мой динамический c объект ссылки не имеет 't link option и return nil

Я думаю, что URL должен ссылаться на Создание URL-адреса Dynami c вручную и пытаться быть таким же.

Наконец , Я обнаружил аналогичный симптом Deep Link не содержит допустимых обязательных параметров , значение ссылки должно быть закодировано в процентах, что решает мою путаницу и мою проблему.

Но интересная, Android платформа без этого Симптом, такая же длинная ссылка c работоспособна.

...