2018-09-27

2018-09-27  本文已影响15人  南调江南

1、需求说明

应用间跳转:通过一个AppA内的某一个操作打开另外一个一个AppB,AppB若下载则直接跳转过去,若未下载则跳到应用商店让用户下载;

网页跳转App:手机打开网页,通过网页上的某一个操作打开App,若已安装App则跳转App,若未安装App则跳到应用商店让用户下载;

2、使用方法

应用间跳转可以通过URL Scheme来实现,将参数配置在url scheme后面,唤醒app再进行页面跳转逻辑;

需要特别说明的微信和QQ分享内容url scheme和Universal Links方式统统被禁用了,除非你是腾讯系的加入他们的白名单;

网页跳转App可以通过meta 标签来实现;

下面我们对URL Scheme、meta 标签、Universal Links一一进行说明.

方法一: URL Scheme

URL Scheme是什么

由于苹果的app都是在沙盒中,相互是不能访问数据的。但是苹果还是给出了一个可以在app之间跳转的方法:URL Scheme。简单的说,URL Scheme就是一个可以让app相互之间可以跳转的协议。每个app的URL Scheme都是不一样的,如果存在一样的URL Scheme,那么系统就会响应先安装那个app的URL Scheme,因为后安装的app的URL Scheme被覆盖掉了,是不能被调用的。

URL Scheme有什么作用

那么app之间的跳转有什么作用呢?我们所使用的每一个app就相当于一个功能,app的跳转可以使得每个app就像一个功能组件一样,帮助我们完成需要做的事情,比如三方支付,搜索,导航,分享等等

URL Scheme怎么使用

要跳转到别人的app,就要知道别人的app的跳转协议是什么,需要传入什么参数,我们常见的跳转协议有下面这些:

1.打开email
[[UIApplicationsharedApplication] openURL:[NSURLURLWithString:@"mailto://info@icloud.com"]]
2.打开电话
[[UIApplicationsharedApplication] openURL:[NSURLURLWithString:@"tel://18688886666"]];
3.打开SMS
[[UIApplicationsharedApplication] openURL:[NSURLURLWithString:@"sms:18688886666"]];

所以,如果我们希望别人打开我们的app,只要在plist文件中配置一下你的跳转协议即可,如下图所示:


跳转协议配置.jpg

“emp601602://”就是我的跳转协议了,编译一下app,在safari中输入“emp601602:// ”就可以跳转到我的app中。

但是在Xcode 9 下,新建的工程,在plist文件中注册URL Schemes,是无法从safari启动app的。
需要在如下位置注册URL Schemes,


添加URL Schemes.jpg

“emp601602:// ”只能让用户跳转到我们的app,之后的处理是在appDelegate的代理中,代理方法如下:

- (BOOL)application:(UIApplication *)application
            openURL:(NSURL *)url
  sourceApplication:(NSString *)sourceApplication
         annotation:(id)annotation

在这个方法里,可以获取到触发这个方法的 URL,可以通过对这个 URL 进行判断,例如根据不同的 Host,不同的 Query String 来执行不同的动作。

- (BOOL)application:(UIApplication *)application
            openURL:(NSURL *)url
  sourceApplication:(NSString *)sourceApplication
         annotation:(id)annotation
{
    NSLog(@"%@", [url absoluteString]);
    
    // 在 host 等于 item.taobao.com 时,说明一个宝贝详情的 url,
    // 那么就使用本地的 TBItemDetailViewController 来显示
    if ([[url host] isEqualToString:@"item.taobao.com"]) {
        
        // 这里只是简单地假设 url 形式为 taobao://item.taobao.com/item.htm?id=12345678
        // 先获取要查看的宝贝详情的 itemId
        NSString *itemId = [[url query] substringFromIndex:[[url query] rangeOfString:@"id="].location+3];
        
        // 使用本地 ViewController 来显示淘宝商品详情
        TBItemDetailViewController *controller = [[TBItemDetailViewController alloc] initWithItemId:itemId];
        [self.navigationController pushViewController:controller animated:YES];
    }
}

在你的动作执行完成了之后,有可能时需要返回到原有app的,这样就需要你的app跳转协议的url里面应该能传入调用者app的跳转协议,这样用户跳转到你的app完成动作后就能跳转回去了。

方法二 :meta标签

现需要添加URL Scheme为 WideSchooliphoneApp,同时添加已上线的app-id以便于跳转AppStore

<!DOCTYPE html>  
<html>  
<head>  
    <title>IOS 通过浏览器打开App(小阔学堂)</title>  
    <meta charset="UTF-8" name="apple-itunes-app" content="app-id=xxxxxxx, affiliate-data=myAffiliateData, app-argument=WideSchooliphoneApp://">     
</head>  
<body>  
    <div class="back">  
    <p>  
        <font size="20px">  
        实时互动<br>  
        直播课堂<br>  
        <a href="WideSchooliphoneApp://courseId=1234" >打开小阔学堂PP</a><br>  
        大数据分析<br>  
        </font>  
    </p>  
    </div>  
</body>  
</html>

点击页面上的打开小阔学堂


网页显示.png

方法三 : Universal Links

什么是Universal Links

Universal Links就是一个通用链接,iOS9以上的用户,可以通过点击这个链接无缝的重定向到一个app应用,而不需要通过safari打开跳转。
如果用户没有安装这个app,则会在safari中打开这个链接指向的网页。

如何支持Universal Links

按照苹果官方文档来说,支持通用链接非常简单哟,只需要三步:
1.创建一个名字叫做apple-app-site-association,包含固定格式的json文件
2.将这个文件上传到你的服务器,可以将这个文件放到服务器的根目录下,也可以放到.well-known这个子目录下。
3.配置app,然后在app里面添加代理方法
如果已经配置过Universal Links,那么在用户第一次安装app时,苹果会发送一个请求,请求你服务器上的apple-app-site-association文件。

请求apple-app-site-association文件成功之后,用户就可以使用Universal Links唤醒app了。

详细的配置流程如下

(1) 关于apple-app-site-association文件的配置
"applinks": {
        "apps": [],
        "details": [
            {
                "appID": "C9ANJ7EAW8.com.codyy.iWideSchooliphone",
                "paths": ["/h5/course.html*"]
            }
        ]
    }
}

创建一个包含上述格式的json文件,文件名字必须为apple-app-site-association,不能带后缀名,有的电脑设置的隐藏后缀名,这点需要注意。

appID

appID 的 格式为 teamID.bundleId形式。

如何获取teamID

登录开发者网站 ,找到Membership选项卡。

1159656-469273e6ee19a927.png
譬如说我的teamID是xxxxxxxxxxx,bundleId是com.mytest.app
那么我的appID就是:xxxxxxxxxxx.com.mytest.app
path路径

paths配置,实际上就是限制哪些路径可以唤醒app,哪些路径不能唤醒app。格式如下:

"paths": [ "/wwdc/news/", "NOT /videos/wwdc/2010/", "/videos/wwdc/201?/"]
使用*配置,则整个网站都可以使用

使用特定的URL,例如/wwdc/news/来指定某一个特殊的链接

在特定URL后面添加,例如 /videos/wwdc/2015/, 来指定网站的某一部分

除了使用来匹配任意字符,你也可以使用 ?来匹配单个字符,你可以在路径当中结合这两个字符使用,例如 /foo//bar/201?/mypage

需要注意的是:配置的paths路径,是区分大小写的

验证apple-app-site-association文件
文件配置完成之后,将其上传到你的服务器根目录或者`.well-known`这个子目录下。
WX20180927-133604.png
(2) 建立web网页和app应用之间的关联 -> app IDs 配置 和 项目配置
app IDs 配置

进入开发者网站,找到你自己的bundleId,可以点击edit按钮,开启associate domains,如下图:

associated domains.png
项目配置:

在项目的Capablities中开启Associated domains,如下图:


appLinks.png

注意domains可以添加多个,前缀必须为applinks:,applinks:后为你的服务器的域名。

代码接收Universal Links唤醒

在appdelegate中实现上面这个方法,当使用Universal Links唤醒app时就执行这个方法。

-(BOOL)application:(UIApplication *)application continueUserActivity:(NSUserActivity *)userActivity restorationHandler:(void (^)(NSArray * _Nullable))restorationHandler{

    NSLog(@"userActivity : %@",userActivity.webpageURL.description);
    return YES;
}
(3)验证以上配置
快捷验证,在备忘录中输入https://yourdomain.com/apple-app-site-association,长按这个链接,出现下图提示则配置成功
IMG_0100.png

目前知晓的就是以上三种方法,其中的坑还需要一个个踩踩.
参考文章:
iOS9 Universal Links踩坑之旅,移动应用之deeplink唤醒app

上一篇下一篇

猜你喜欢

热点阅读