现在的生活中大家经常用到智能手机,其中很大部分用的是苹果的手机。在生活中经常会有这样的场景,在一个应用内会有分享或者需要支付的需求,通常会通过当前APP调用第三方的支付或者分享,例如微信支付、微信分享、微博分享等。那么这些功能到底如何在iOS设备上做到的呢,那就是通过开发通过URL Scheme的定义实现的,APP通过外部调用从而调用相应的功能实现。
URL Scheme是什么呢?
我个人理解它算作自定义的一种用户协议地址,其他APP或者浏览器可以通过特定的地址调用并且唤起你的APP。
– URL 是我们大家日常生活中很常见的,例如:https://www.liuandy.cn 这个就是一个完整URL
– Schemes 表示的就是URL中的那个协议,例如刚才提到的 htts://www.liuandy.cn 其中https就是Schemes的定义
根据上边对URL Schemes的分离拆分说明,相信大家应该有个初始的认识了。通过http或者https可以定位到一个网页;然后我们可以在自己的APP中定义特定URL Schemes来实现在外部唤起自己的APP的需求,从而实现调用APP特定功能。例如需要调用短信就可以写成 sms:这样。微信大家应该很熟悉,比如说一个APP需要唤起微信那么就可以写成 weixin://这样直接调用就可以唤起微信来。
以下就是我用浏览器调用微信的截图,使用weixin://调用,如图
说了这么多我们来看看在APP中是怎么实现这样的功能的。
URL Schemes中是通过Schemes来定位到一个应用的。
URL Schemes是在工程中的plist中来定义的,如图:
如上图,在URL types这个分组里边可以添加多组URL Schemes的定义,也就是如果你的APP定义了多组URL Schemes那么其他地方就可以通过多种方式来调用唤起APP。
定义好了URL Schemes,那么唤起APP后如何处理调用的功能呢?就通过下边的代理方法实现,这个代理方法在AppDelegate文件实现,代码如下:
func application(app: UIApplication, openURL url: NSURL, options: [String : AnyObject]) -> Bool {
//这里判断调用的URL Schemes类型然后区分进行后续操作
let scheme = url.scheme
//不分大小写比较
if scheme.caseInsensitiveCompare("TestOpen") == .OrderedSame{
//获取参数
//执行跳转,跳转到你想要的页面
return true
}
return true
}
以上所有的配置和代码都是针对于被唤起应用来说的,下面我们来看一下唤起应用如何配置和调用被唤起的应用。
- 先看看调用的代码如下
if UIApplication.shared.canOpenURL(URL(string: "TestOpen://")!) {
UIApplication.shared.open(URL(string: "TestOpen://")!, options: [:], completionHandler: nil)
}
调用唤起之前,需要先通过canOpenURL方法去看本机上有没有对应的URLScheme定义的APP,不然调用会出问题。
- 需要注意的是iOS9以后,唤起端需要配置白名单
>在iOS9之后苹果提高了app的安全性,需要配置白名单,在白名单里才能打开app,不但会报错** -canOpenURL: failed for URL: “TestOpen://” – error: “This app is not allowed to query for scheme TestOpen”**
配置方法如下图,在Info.plist文件内配置: