IOS Universal Links 微信分享

984 阅读8分钟

【版权声明】本文原发布于上海竖排网络科技有限公司官方知乎账号,由本人撰写发布,现摘抄复习,有什么问题可以直接来我掘金提问。

【摘要】去年说的今年废弃UIwebView,结果今年真的给废弃了,幸好我已经弄完,还有一个Universal Links,基本以前的东西都废了,让我头疼。我面向百度编程看了一下,没几个写的清楚的,这里我就要把这个写清楚一些,Universal Links苹果最新的政策,这公司我倒是见识到了,从来不开玩笑,说什么就是什么。

作者:X-teamer成员:清泓

参阅官方文档:

Support Universal Links​developer.apple.com/library/archive/documentation/General/Conceptual/AppSearch/UniversalLinks.html

第一部分 简介

当您支持通用链接时,iOS用户可以点击指向您网站的链接并无缝重定向到您已安装的应用程序,而无需通过Safari。如果未安装您的应用程序,请点击指向您网站的链接以在Safari中打开您的网站。

通用链接为您提供了一些自定义URL方案无法获得的关键优势。具体来说,通用链接为:

  • 独特。 与自定义URL方案不同,其他应用程序不能声明通用链接,因为它们使用指向您网站的标准HTTP或HTTPS链接。
  • 安全。 当用户安装您的应用程序时,iOS会检查您已上传到Web服务器的文件,以确保您的网站允许您的应用程序代表其打开URL。只有您可以创建和上传此文件,因此您的网站与应用程序的关联是安全的。
  • 灵活。 即使未安装您的应用程序,通用链接也可以使用。如果未安装您的应用程序,则按用户期望,点击指向您网站的链接可在Safari中打开内容。
  • 简单。 一个URL既适用于您的网站,也适用于您的应用程序。
  • 私有的。 其他应用可以与您的应用通信,而无需知道您的应用是否已安装。

通用链接可让用户在点击链接到您的网站WKWebView以及UIWebView视图和Safari页面中的链接时打开您的应用程序,此外还可以链接到openURL:,例如在Mail,Messages和其他应用程序中发生的链接。

当用户在Safari中浏览您的网站时,当他们点击指向当前网页所在域中URL的通用链接时,iOS会尊重用户的最可能意图并在Safari中打开该链接。如果用户点击指向其他域中URL的通用链接,iOS将在您的应用中打开该链接。

对于运行9.0之前的iOS版本的用户,点击指向您网站的通用链接可在Safari中打开该链接。

三大步骤

第一步骤:服务端相关处理。  在服务器目录里面创建.well-know文件夹。(注意,这里不能徒手创建,需要用到指令。可以使用你管理服务器的工具,例如,可以是xshell,也可以是其他工具。)

{
  "applinks": {
    "apps": [
      
    ],
    "details": [
      {
        "appID": "3D23RYAPGS.com.gtiis.dream",
        "paths": [
          “/test/“,
          "test/*”
        ]
      },
      {
        "appID": "3D23RYAPGS.com.gtiis.dream",
        "paths": [
          "*"
        ]
      }
    ]
  }
}

创建方式说明:

实际简洁步骤

第一步,直接把我的apple-app-site-association全部复制过去。

第二步:对里面的相关属性进行更改

1."appID": 后面的引号里面的部分,是我们应用的TeamID,加上我们应用的BundleID.

2.paths里面是我们项目的具体位置。比如我部署的Universal Links是:www.test.com,那么我们的paths就是我们部署在此服务地址里面的具体项目路径。第二个带*号意思是包含此文件目录里面的所有文件。

特别注意:我们的Universal Links必须是https安全链接。

第三步:这个文件编辑好之后,把文件后缀名给去掉,不带任何类型。

第四步:把该文件部署到服务器中的.well-know文件夹里面。(注意:这个文件夹前面的那个.是需要添加的。不是开玩笑的。最终的效果是需要在浏览器中打开顶级域名(Universal Links)直接就可以访问到该文件,而不是在Universal Links后面加了.well-know才能打开该文件,如果实在不知道怎么搞定,也可以把apple-app-site-association文件放在自己的项目根目录下面即可,只是稍微影响链接打开速度。)

详细介绍

您需要apple-app-site-association为每个域提供一个单独的文件,其中包含应用程序支持的唯一内容。例如,apple.com并且developer.apple.com需要单独的apple-app-site-association文件,因为这些域提供不同的内容。相比之下,apple.comwww.apple.com这两个域提供相同的内容,但是这两个域必须使文件可不需要单独的网站关联,因为文件- 。对于在iOS 9.3.1和更高版本中运行的应用apple-app-site-association,无论文件是否已签名,文件的未压缩大小都不得大于128 KB。

在您的apple-app-site-association文件中,指定网站中应被视为通用链接的路径以及不应被视为通用链接的路径。保持路径列表简短,并依靠通配符匹配来匹配较大的路径集。清单6-1显示了一个apple-app-site-association文件示例,该文件标识了应作为通用链接处理的三个路径。

文件中 的appsapple-app-site-association必须存在,其值必须为空数组,如清单6-1所示。details关键字的值是一个字典数组,您的网站支持的每个应用程序一个字典。数组中字典的顺序决定了系统在寻找匹配项时所遵循的顺序,因此您可以指定一个应用来处理网站的特定部分。

每个特定于应用程序的词典都包含一个appID键和一个paths键。appID密钥的值是团队ID或应用程序ID前缀,后跟捆绑软件ID。(该appID值与构建后与应用程序权利中的“ application-identifier”键相关联的值相同。)该paths键的值是一个字符串数组,用于指定应用程序支持的网站部分以及您不想与该应用程序关联的网站部分。要指定不应作为通用链接处理的区域,请在路径字符串的开头添加“ NOT ”(包括之后的空格T)。例如,清单6-1中apple-app-site-association所示的文件可以防止/videos/wwdc/2010/*通过更新paths数组,将网站区域视为通用链接,如下所示:

  1. "paths": [ "/wwdc/news/", "NOT /videos/wwdc/2010/*", "/videos/wwdc/201?/*"]

因为系统paths按照指定的顺序评估数组中的每个路径,并在找到正负匹配时停止评估,所以您应在低优先级路径之前指定高优先级路径。请注意,仅将URL的路径部分用于比较。其他组件(例如查询字符串或片段标识符)将被忽略。

有多种方法可以在apple-app-site-association文件中指定网站路径。例如,您可以:

  • 使用*指定整个网站
  • 包含特定的网址(例如/wwdc/news/)以指定特定的链接
  • 附加*到特定网址(例如/videos/wwdc/2015/*)以指定网站的一部分
    除了用于*匹配任何子字符串之外,您还可以?用于匹配任何单个字符。您可以将两个通配符合并在一个路径中,例如/foo/*/bar/201?/mypage

注意
用于在paths数组中指定网站路径的字符串区分大小写。

第二步骤

打开我们的项目,

项目配置里找到capability,在Application Services列表里有Associated Domains一条,点击添加。

这个链接,是自己之前设置的Universal Links。前面必须加上:applinks:前缀。

例如:applinks:www.test.com

设置完Universal Links之后,我们再集成微信分享。

第三步骤

在你的工程文件中选择 Build Setting,在"Other Linker Flags"中加入"-ObjC -all_load",在 Search Paths 中添加 libWeChatSDK.a ,WXApi.h,WXApiObject.h,文件所在位置(如下图所示)。

关于openSDK1.8.6的更新说明 | 微信开放文档​developers.weixin.qq.com/doc/oplatform/Mobile_App/Access_Guide/iOS.html

在 Xcode 中,选择你的工程设置项,选中“TARGETS”一栏,在“info”标签栏的“URL type“添加“URL scheme”为你所注册的应用程序 id(如下图所示)。

最新的政策之后,info.plist文件里,微信的公有API还需要加入一项。

在Xcode中,选择你的工程设置项,选中“TARGETS”一栏,在 “info”标签栏的“LSApplicationQueriesSchemes“添加weixin 和weixinULAPI(如下图所示)。

我发现绝大部分错误,恰恰是这些不起眼的细节出问题了。

所以特别标注出来。实际到了编码部分,确实没什么是非常难的,只要记得别忘记少写方法了。

如果有不清楚的问题,请私信我,乐意解答。

其他细节:

在每个项目中,回调方法内的判断会有所不同,这里只是示例。

可以根据业务不同,回调 链接方法里面可以用以下方式进行区分处理。

设置Universal Links系统回调

//设置Universal Links系统回调
- (BOOL)application:(UIApplication *)application continueUserActivity:(NSUserActivity *)userActivity restorationHandler:(void (^)(NSArray<id<UIUserActivityRestoring>> * _Nullable))restorationHandler{

 if ([userActivity.activityType isEqualToString:NSUserActivityTypeBrowsingWeb]) {
 NSURL *webpageURL = userActivity.webpageURL;
 if ([webpageURL.absoluteString hasPrefix:[NSString stringWithFormat:APP_LINKS, WX_KEY]]){ // 微信
 if([WXApi handleOpenUniversalLink:userActivity delegate:self]){
 return [WXApi handleOpenUniversalLink:userActivity delegate:self];
 }else{
 [WXApi handleOpenURL:webpageURL delegate:self];
 }
 return YES;
 }
 }
 return YES;
}

微信授权登录,分享回调

#pragma mark 微信授权登录,分享回调
- (void)onResp:(BaseResp *)resp{
 // 1.分享后回调类
 if ([resp isKindOfClass:[SendMessageToWXResp class]]) {
 NSLog(@"分享ok");
 }
 if([resp isKindOfClass:[SendAuthResp class]]){
 SendAuthResp *resp2 = (SendAuthResp *)resp;
 [[NSNotificationCenter defaultCenter] postNotificationName:@"WxLogin" object:resp2];
 NSLog(@"授权成功!");
 NSString *code = resp2.code;
 NSLog(@"拿到的code:%@",code);
 [[NSNotificationCenter defaultCenter] postNotificationName:@"wxLogin" object:code];
 }else{
 NSLog(@"授权失败!");
 }
}