Динамическая ссылка Firebase: как получить схему URI из генерируемой динамической ссылки?

#ios #objective-c #firebase #uri-scheme #firebase-dynamic-links

#iOS #objective-c #firebase #uri-схема #firebase-dynamic-links

Вопрос:

Мое требование — извлечь URI схему из сгенерированной динамической ссылки URL . Даже в firebase примере приложения возвращается URL-адрес глубокой ссылки, а не схема URI.

Например,:

Когда я нажимаю на URL динамической ссылки из email / notes (https://my-app-code.app.goo.gl/value ), обратным вызовом будет функция continueuseractivity, и я использую следующий блок —

 BOOL handled = [[FIRDynamicLinks dynamicLinks] handleUniversalLink:incomingUrl completion:^(FIRDynamicLink * _Nullable dynamicLink, NSError * _Nullable error)
  

чтобы получить URL-адрес (dynamicLink.url). В этом блоке я получаю URL-адрес глубокой ссылки, который выглядит следующим образом
-> my-web-url (который является частью параметра link в длинной динамической ссылке, о которой я упоминал выше).

Мое фактическое требование — получить схему URI myappscheme:// some-tag/ some-tag-id, которая связана с URL. Как мне это получить?

Я даже попробовал следующее —

 FIRDynamicLink *dynamicLink =  [[FIRDynamicLinks dynamicLinks] dynamicLinkFromCustomSchemeURL:url];
  

В любом случае я не получаю схему URI.

Пожалуйста, помогите.

Ответ №1:

То, что вы пытаетесь сделать, в настоящее время невозможно на iOS с динамическими ссылками.Вы путаете URI scheme ( myappscheme:// ) с URI path ( myappscheme://some-tag/some-tag-id ) .

Насколько мне известно, динамические ссылки на iOS поддерживают только схему (через ius параметр). Это сбивает с толку, потому что Android поддерживает путь URI (через al параметр). Для iOS вам нужно будет выполнить маршрутизацию на основе URL-адреса глубокой ссылки.

В качестве альтернативы, вы могли бы исследовать более надежную платформу глубокой компоновки, такую как Branch.io (полное раскрытие информации: я вхожу в команду Филиала). Ветка поддерживает пользовательские параметры ссылки, содержащие любые данные, которые вы хотите, включая пользовательский путь URI.

Ответ №2:

То, что сказал Алекс, верно. Это невозможно, но есть простой обходной путь.

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

Итак, в вашем случае это будет выглядеть примерно так

https://my-app-code.app.goo.gl/?link=https://my-web-url.com/?myCustomSchemeUri=my-custom-scheme://my-custom-scheme-urlamp;apn=idamp;isi=android-google-play-idamp;ibi=ios-bundle-idamp;ius=ios-custom-app-scheme

Когда обратный вызов continueuseractivity попадает в ваше приложение, вы можете извлечь параметр myCustomSchemeUri из строки запроса и использовать его по своему усмотрению.

Что-то вроде этого:

 - (BOOL)application:(UIApplication *)application
continueUserActivity:(NSUserActivity *)userActivity
restorationHandler:(void (^)(NSArray *))restorationHandler {

BOOL handled = [[FIRDynamicLinks dynamicLinks]
                handleUniversalLink:userActivity.webpageURL
                completion:^(FIRDynamicLink * _Nullable dynamicLink,
                             NSError * _Nullable error) {
                    // ...
                    NSURL *url = dynamicLink.url;
                    NSString *myUri = [url queryParameterValueWithName:@"customUri"];
                    if (myUri.lenghth > 0){
                        NSURL *myURL = [NSURL URLWithString:myUri];
                        if (myURL != nil){
                            //source application is your bundle id in this case
                            [self application:application openURL:myURL sourceApplication:@"com.yourbundle.id" annotation:@{}];
                        }
                    }
                }];
return handled;
}
  

И это метод, который я написал как категорию NSURL для извлечения параметра

 - (NSString *)queryParameterValueWithName:(NSString*)name{
NSURLComponents *urlComponents = [NSURLComponents componentsWithURL:self
                                            resolvingAgainstBaseURL:NO];
NSArray *queryItems = urlComponents.queryItems;
NSString *param = [self valueForKey:name
                      fromQueryItems:queryItems];
return param;
}

- (NSString *)valueForKey:(NSString *)key
       fromQueryItems:(NSArray *)queryItems
{
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"name=%@", key];
NSURLQueryItem *queryItem = [[queryItems
                              filteredArrayUsingPredicate:predicate]
                             firstObject];
return queryItem.value;
}
  

Возможно, этот ответ немного запоздал для вас, но я столкнулся с этой проблемой только сегодня.
В любом случае, я надеюсь, что это поможет кому-то еще.

Приветствия,

Alessio