Wi-Fi参考#iOS#HeminWon

iOS Universal Links & URL S

2016-10-21  本文已影响4584人  天空中的球

最近我们有一个 DeepLink 的需求 用的是 Branch, 在这个过程中自然会涉及到 Universal Links 和 Custom URL Schem,在此进行笔记下,也把在用 Branch 中遇到的问题分享下。

// Respond to URI scheme links
- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation {
   // 我们需要的判断跳转
   return YES;
}

// Respond to Universal Links
- (BOOL)application:(UIApplication *)application continueUserActivity:(NSUserActivity *)userActivity restorationHandler:(void (^)(NSArray *restorableObjects))restorationHandler { 
  // 我们需要的判断跳转
   return YES;
}

然后从下面四个点来了解下这块:

一、基本了解

二、用法

两者代码里面其实没什么区别,主要是配置的去呗

2-1、URL Scheme
   - (BOOL)application:(UIApplication *)application handleOpenURL:(NSURL*)url {
    // 接受传过来的参数
    NSLog(@"url Scheme === %@\n url Host === %@",url.scheme,url.host);
    // url Scheme === testyang  url Host === testContent
    return YES;
}
   <key>LSApplicationQueriesSchemes</key>
    <array>
        <!-- 设置我们设定的,如我们需要的URL Scheme 白名单-->
        <string>testYang</string>
    </array>

在另一个 APP 中 添加打开的 代码

    NSString *url = @"testYang://testContent";
//    NSString *url = @"testYang://com.testYang.www&testContent";
    if ([[UIApplication sharedApplication]
         canOpenURL:[NSURL URLWithString:url]]) {
        // iOS 10 以上用这个方法,iOS 10 以下直接用 openURL 就 OK 了
        [[UIApplication sharedApplication] openURL:[NSURL URLWithString:url] options:@{UIApplicationOpenURLOptionUniversalLinksOnly : @NO}  completionHandler:^(BOOL success) {
            NSLog(@"success");
        }];
    }

注意:APP URL格式为: URL Scheme://URL identifier,直接调用URL Scheme也可打开程序, URL identifier是可选的。

2-2、Universal Links
{
    "applinks": {
        "apps": [],
        "details": [
            {
                "appID": "9JA89QQLNQ.com.apple.wwdc",
                "paths": [ "/wwdc/news/", "/videos/wwdc/2015/*"]
            },
            {
                "appID": "ABCD1234.com.apple.wwdc",
                "paths": [ "*" ]
            }
        ]
    }
}
  *  “appID”组成部分:TeamID + BundleId TeamID
  *  BundleId 一定要和 APP 的 BundleId 一致。
  * apple-app-site-association 文件不能带后缀
  * apple-app-site-association 文件需要上传到网站根目录
  *  每一个代表着应用的 字典,必须包含一个 appID 和 paths, appID 是teamID 和 bundleID,paths 是一个字符串的数组 **明确着应用支持的通用链接和应用程序不支持的通用连接内容**

Note: Don’t append .json to the apple-app-site-association
filename. (文件不要接 .json)

      - (BOOL)application:(UIApplication *)application continueUserActivity:(NSUserActivity *)userActivity restorationHandler:(void (^)(NSArray *restorableObjects))restorationHandler { 
        // 我们需要的判断跳转
         return YES;
}

三、注意点

总的说来,URL Scheme慢慢会退出舞台,然后是Universal Links 登上台面的时候。PS: 苹果验证Universal Links URL 是否正确的网址

四、Branch DeepLink 使用中遇到的问题

作为国外常用的 Branch,国内目前基本应该不太用的,整体说来其文档相对来说,还是很清晰的,只是之前一直有两点困扰我的:

  • 如何自定义类型做判断跳转
  - (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation {
     [[Branch getInstance] handleDeepLink:url];
      return YES;
}
  - (BOOL)application:(UIApplication *)application continueUserActivity:(NSUserActivity *)userActivity restorationHandler:(void (^)(NSArray *restorableObjects))restorationHandler {
     BOOL handledByBranch = [[Branch getInstance] continueUserActivity:userActivity]; 
     return handledByBranch;
}

但这是第一层,以前我们判断就是拿到这个 url 就是直接去判断,然后跳转到我们想走的跳转路线,但是此处呢?

 [branch initSessionWithLaunchOptions:launchOptions andRegisterDeepLinkHandler:^(NSDictionary *params, NSError *error) {
    if (!error && params) {
        NSLog(@"params: %@", params.description);
        if ([params[@"+clicked_branch_link"] boolValue]) { // 此处代表是 branch_link 点击进入的情况
             [DeepLinkManager branchDeepLinkWithParams:params];
           }
       }
 }];

所以说,此时的问题又回归到 Universal Links 没设置对的原因,没能正确上传好app site association,但是此处使用的是 Branch, 这个设置 Universal Links 就是按 Branch 流程 上面走的,这样就略显尴尬啦,一下子原因找不到,卡了好久。

解决步骤1:https://domian.com/apple-app-site-association 看是否正确,当然用 Branch 的话是https://domian.app.link/apple-app-site-association, 结果发现这是存在的,但是内容有点不一样 path

"paths": [
                    "NOT /e/*",
                    "*",
                    "/"
                ]

然后我对比了下经典的例子收集 list-of-universal-link,继续寻找中...

解决步骤2: 直接向 branch 邮箱求助,那边的工作人员会给出很详细的解答步骤,第一次没有解决,现在等待第二次邮件回复...

解决步骤3: 硬是不行,再重新弄一个账号尝试,对比过程是否有遗漏的东东...

PS: 最终解决:
通过邮件得知,苹果那边的那个验证没有通过其实也是OK的, 所以那里可以忽略。
只是之前设置的时候,设置错误了..
注意 branch_key 直接设置,注意 test 和 live 的区别,但是其实可以直接 不用 dictionary, 而用 string, 因为我暂时设置成 Debug 状态下有时是无效的,所以直接用string ,到时替换就好了。

Dictionary String

另外出现这个问题也可以看看 Stack Overflow 的回答:iOS9: Universal Links does not work

话说起来这也是一个自己熟悉陌生英文文档的过程,可以多来几次,这一两天全是英文文档感觉英语都提高了,😆,只是希望下次效率可以更高一些。说白了,所有问题都是文档没弄清晰的原因。

PS : 再次补充:

有些情况下,在 FaceBook、 QQ、微博 用的是本身的浏览器,都有其限制的,此时我们直接用 DeepView , 方能解决,否则会一直跳转到 AppStore 去的。

五、总结

其实总的来说,想了解更详细的直接看苹果官方文档就OK 了。

往往出错是在看文档的时候忽略一些细节!明显是在就是翻译文档,😌,但还翻译错了,或者说理解错了......

备注:

URL Scheme步骤详解
Using URL Schemes to Communicate with Apps
Support Universal Links
ios-branch-deep-linking
iOS 9 by Tutorials 笔记(三)
Deferred Deep Linking in iOS
iOS Universal Links(通用链接)

上一篇 下一篇

猜你喜欢

热点阅读