可行的方案大概有三种:
一、直接使用URL Scheme。(优点:十分简单,在plist文件中配置一个scheme,点击短信中的scheme或者将scheme输入到浏览器中就可以直接跳到App中。 缺点:当手机上没有安装App时,短信中点击scheme会没有反应,浏览器中会访问失败。而且在微信和QQ中这种方式是被禁用的)。
二、使用iOS9之后的新特性,通用链接(Universal Links)。
三、让后台人员写一个可以访问的网页,点击短信中的链接,跳转到网页,在网页中判断是iOS端还是安卓端,然后自动跳转对应的scheme,如果手机上安装了App,则直接跳到App,如果没有安装App,则停留在当前网页,在网页上有一个去下载的按钮,点击按钮可以去下载App。
接下来就细说一下三种方案的实现过程:
方案一、直接使用URL Scheme。
如果想解析对应的内容跳转到对应的界面只需要在Appdelegate的-(BOOL)application: openURL: options:的方法里判断传入进来的url链接后面的参数,进行不同的操作即可,如下
-(BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionaryid> *)options{
NSString *urlStr = url.absoluteString;
if ([urlStr hasPrefix:@"prefx"]) {
//获取参数
NSArray *paramerArray = [urlStr componentsSeparatedByString:@"/"];
NSLog(@"paramerArray- %@",paramerArray);
}
return YES;
}
方案二、iOS9之后的新特性,通用链接(Universal Links)
什么是通用链接(Universal Link)?
为了更好的用户体验,苹果针对iOS9或者以上系统,推出通用链接(Universal Link):一种能够方便的通过传统 HTTP 链接启动应用程序, 使用相同的网址打开网站和App。通过一个通用的链接便可实现,当移动设备里面已经有了某个应用,在点击了这个链接后便可实现深度链接而直接进入应用内的某个特定页面;如果手机内并没有该应用,可打开设定的网址(例如应用的落地下载页面)。具体可以查看官方的说明文档。
1.先决条件:你必须有一个域名,且这个域名需要支持https。
2.需要在开发者中心做配置:找到对应的App ID,在Application Services列表里有Associated Domains一条,把它变为Enabled就可以了。
3.打开工程配置中的Associated Domains,在其中的Domains中填入你想支持的域名,必须以applinks:为前缀。
4.创建一个内容为json格式的文件,苹果将会在合适的时候,从我们在项目中填入的域名请求这个文件。这个文件名必须为apple-app-site-association,没有后缀名,文件内容大概是这样子:
{
"applinks": {
"apps": [],
"details": [
{
"appID": "9JA89QQLNQ.com.apple.wwdc",
"paths": [ "/wwdc/news/", "/videos/wwdc/2015/*"]
},
{
"appID": "ABCD1234.com.apple.wwdc",
"paths": [ "*" ]
}
]
}
}
说明:
appID:组成方式是 teamId.yourapp’s bundle identifier。如上面的 9JA89QQLNQ就是teamId。登陆开发者中心,在Account - Membership里面可以找到Team ID。
paths:设定你的app支持的路径列表,只有这些指定的路径的链接,才能被app所处理。星号的写法代表了可识别域名下所有链接。
5.上传该文件到你的域名所对应的根目录或者.well-known目录下,这是为了苹果能获取到你上传的文件。上传完后,自己先访问一下,看看是否能够获取到,当你在浏览器中输入这个文件链接后,应该是直接下载apple-app-site-association文件。
验证
在iOS设备的短信中点击链接,就会直接跳转到你的app了。
或是你将要测试的链接在Safari中打开,在出现的网页上方下滑,可以看到有在”XX”应用中打开:
在微信的网页浏览器中也是可以的,虽然微信屏蔽了所有的scheme方式跳转到其它app,但是Universal Links是由系统直接处理的,微信屏蔽不了,这也就实现了从微信跳转到我们的app。
苹果为了方便开发者,提供了一个网页来验证我们编写的这个apple-app-site-association是否合法有效,进入验证网址进行验证:
进入app后的处理
现在用户点击某个链接,直接可以进我们的app了,但是我们的目的是要能够获取到用户进来的链接,根据链接来展示给用户相应的内容。
我们需要在工程里的 AppDelegate 里实现方法
- (BOOL)application:(UIApplication *)application continueUserActivity:(NSUserActivity *)userActivity restorationHandler:(void (^)(NSArray * _Nullable))restorationHandler
{
if ([userActivity.activityType isEqualToString:NSUserActivityTypeBrowsingWeb])
{
NSURL *url = userActivity.webpageURL;
if (url是我们希望处理的)
{
//进行我们的处理
}
else
{
[[UIApplication sharedApplication] openURL:url];
}
}
return YES;
}
方案三、让后台人员写一个可以访问的网页,点击短信中的链接,跳转到该网页,在网页中判断是iOS端还是安卓端,然后自动跳转对应的scheme,如果手机上安装了App,则直接跳到App,如果没有安装App,则停留在当前网页,在网页上有一个去下载的按钮,点击按钮可以去AppStore中下载App。
如果需要跳到指定页面,需要在发送短信时让后台人员将参数拼接在链接后边,之后拼接到scheme后面带到App中,然后我们在AppDelegate的-(BOOL)application: openURL和-(BOOL)application: openURL: options:的方法里接收传入进来的url链接后面的参数,之后进行指定页面的跳转就可以了。