0

我的要求是从已经生成URI的动态链接中取出方案。URL即使在firebase示例应用程序中,它也是返回的深层链接 url,而不是 URI 方案。

例如:

当我单击电子邮件/笔记(https://my-app-code.app.goo.gl/value)中的动态链接 url 时,回调将是 continueuseractivity 函数,我使用以下块 -

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

获取网址(dynamicLink.url)。在这个块中,我得到了这个
-> my-web-url 的深层链接 url(这是我上面提到的长动态链接中链接参数的一部分)。

我的实际要求是获取与 URL 关联的 URI 方案 myappscheme://some-tag/some-tag-id 。我怎么得到这个?

我什至尝试了以下 -

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

在这两种情况下,我都没有得到 URI 方案。

请帮忙。

4

2 回答 2

1

亚历克斯说的是对的。这是不可能的,但有一个简单的解决方法。

我将所需的自定义 url 深层链接作为查询参数附加到我提供的 https 链接 url。

所以在你的情况下,它看起来像这样

https://my-app-code.app.goo.gl/?link=https://my-web-url.com/?myCustomSchemeUri%3Dmy-custom-scheme://my-custom-scheme-url&apn= id&isi=android-google-play-id&ibi=ios-bundle-id&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;
}

也许这个答案对你来说有点晚了,但我今天遇到了这个问题。无论如何,我希望这对其他人有帮助。

干杯,

阿莱西奥

于 2017-07-14T03:30:51.283 回答
1

您正在尝试做的事情目前在带有动态链接的 iOS 上是不可能的。您将 URI方案( myappscheme://) 与 URI路径( myappscheme://some-tag/some-tag-id) 混淆了。

据我所知,iOS 上的动态链接仅支持该方案(通过ius参数)。这很令人困惑,因为 Android 确实支持 URI 路径(通过al参数)。对于 iOS,您需要根据深层链接 URL 进行路由。

或者,您可以研究更强大的深度链接平台,例如Branch.io(完全披露:我在 Branch 团队)。Branch 确实支持包含您希望的任何数据的自定义链接参数,包括自定义 URI 路径。

于 2016-10-07T17:50:07.693 回答