#ios #objective-c #firebase #uri-scheme #firebase-dynamic-links
#iOS #objective-c #firebase #uri-схема #firebase-dynamic-links
Вопрос:
Мое требование — извлечь URI
схему из сгенерированной динамической ссылки URL
. Даже в firebase
примере приложения возвращается URL-адрес глубокой ссылки, а не схема URI.
Например,:
- Наш URL-адрес динамической ссылки такой -> https://my-app-code.app.goo.gl/value .
- Схема пользовательского приложения iOS (добавлена из дополнительных параметров): myappscheme://some-tag/some-tag-id
- Длинный URL-адрес динамической ссылки -> https://my-app-code.app.goo.gl/?link=my-web-urlamp;apn=idamp;isi=android-google-play-idamp;ibi=ios-bundle-idamp;ius=ios-custom-app-scheme
Когда я нажимаю на 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, который я предоставил.
Итак, в вашем случае это будет выглядеть примерно так
Когда обратный вызов 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