Ios Firebase动态链接:如何从生成的动态链接获取URI方案?

Ios Firebase动态链接:如何从生成的动态链接获取URI方案?,ios,objective-c,firebase,uri-scheme,firebase-dynamic-links,Ios,Objective C,Firebase,Uri Scheme,Firebase Dynamic Links,我的要求是从已生成的动态链接URL中获取URI方案。即使在firebase示例应用程序中,返回的也是深度链接url,而不是URI方案 例如: 我们的动态链接url是-> iOS自定义应用程序方案(从高级选项添加):我的appscheme://some-tag/some-tag-id 长动态链接url为-> 当我单击email/notes()中的动态链接url时,回调将是continueuseractivity函数,我使用以下块- BOOL handled = [[FIRDynamicLink

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

例如:

  • 我们的动态链接url是->
  • iOS自定义应用程序方案(从高级选项添加):我的appscheme://some-tag/some-tag-id
  • 长动态链接url为->
当我单击email/notes()中的动态链接url时,回调将是continueuseractivity函数,我使用以下块-

BOOL handled = [[FIRDynamicLinks dynamicLinks] handleUniversalLink:incomingUrl completion:^(FIRDynamicLink * _Nullable dynamicLink, NSError * _Nullable error)
获取url(dynamicLink.url)。在这个块中,我得到了深层链接url,这是
->我的web url(它是我上面提到的长动态链接中链接参数的一部分)

我的实际需求是获取我的URI方案appscheme://some-tag/some-tag-id 它与URL关联。如何获得此信息?

我甚至试过下面的方法-

FIRDynamicLink *dynamicLink =  [[FIRDynamicLinks dynamicLinks] dynamicLinkFromCustomSchemeURL:url];
在这两种情况下,我都没有得到URI方案


请提供帮助。

您试图在具有动态链接的iOS上执行的操作目前不可能。您将URI方案(
myappscheme://
)与URI路径(
my>相混淆appscheme://some-tag/some-tag-id

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


或者,您可以研究一个更健壮的深度链接平台,如(完全公开:我在分支团队中)。Branch不支持包含您想要的任何数据的自定义链接参数,包括自定义URI路径。

在具有动态链接的iOS上,您目前无法尝试执行的操作。您将URI方案(
myappscheme://
)与URI路径(
my)混淆了appscheme://some-tag/some-tag-id

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


或者,您可以研究一个更健壮的深度链接平台,如(完全公开:我在分支团队中)。Branch确实支持包含您想要的任何数据的自定义链接参数,包括自定义URI路径。

Alex所说的是正确的。这是不可能的,但有一个简单的解决办法

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

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

当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;
}
也许这个答案对你来说有点晚了,但我今天遇到了这个问题。 不管怎样,我希望这能帮助其他人

干杯


亚历克斯所说的是正确的。这是不可能的,但有一个简单的解决办法

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

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

当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;
}
也许这个答案对你来说有点晚了,但我今天遇到了这个问题。 不管怎样,我希望这能帮助其他人

干杯

阿莱西奥