我的要求是从已生成的动态链接URI
中获取URL
方案。即使在firebase
示例应用中,也会返回返回的深层链接网址,而不是URI方案。
例如:
当我点击来自电子邮件/备注(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)。在这个块中,我得到了深层链接网址,这是这个 - > my-web-url(这是我上面提到的长动态链接中链接参数的一部分)。
我的实际要求是获取与URL关联的URI方案myappscheme:// some-tag / some-tag-id。我如何得到这个?
我甚至尝试了下面的内容 -
FIRDynamicLink *dynamicLink = [[FIRDynamicLinks dynamicLinks] dynamicLinkFromCustomSchemeURL:url];
在任何一种情况下,我都没有获得URI方案。
请帮忙。
答案 0 :(得分:1)
目前,使用动态链接的iOS无法实现您的目标。您将URI scheme (myappscheme://
)与URI 混淆路径(myappscheme://some-tag/some-tag-id
)。
据我所知,iOS上的动态链接仅支持该方案(通过ius
param)。这很令人困惑,因为Android确实支持URI路径(通过al
param)。对于iOS,您需要根据深层链接网址进行路由。
或者,您可以调查一个更强大的深层链接平台,例如Branch.io(完全披露:我在分支团队中)。 Branch确实支持包含您希望的任何数据的自定义链接参数,包括自定义URI路径。
答案 1 :(得分:1)
Alex说的是对的。这是不可能的,但有一个简单的解决方法。
我将所需的自定义网址深层链接作为查询参数附加到我提供的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的