我们都知道,iOS系统为了数据的安全性,对每个应用存储的数据进行安全处理,即沙盒存储机制。使得应用的存储空间是彼此分离的。这样就保证了数据的安全性。但是应用之前彼此分离也阻碍了相互的通信。因此苹果给出了应用之间传递信息的方法URL Schemes。像我们平时所看到的分享、支付等都是通过URL Schemes的方式进行应用间的跳转传递信息的。
1.使用URL Scheme跳转到其他应用
如果我们想要跳转到别的应用,首先你要知道其他App的Scheme是什么?以下是一些常见的应用的Scheme
QQ mqq://
微信是 weixin://
网易新闻 newsapp://
淘宝 taobao://
点评 dianping://
微博 sinaweibo://
支付宝 alipay://
豆瓣fm: doubanradio://
微盘 sinavdisk://
网易公开课 ntesopen://
美团 imeituan://
人人 renren://
我查查 wcc://
1号店 wccbyihaodian://
有道词典 yddictproapp://
知乎 zhihu://
优酷 youku://
ZAKER zakeripad://
mdict mdict://
京东hd openApp.jdiPad://
易迅 icson://;yixunipad://
wunderlist wunderlist://
支付宝 alipay://
比如我们想要跳转去微信,首先我们把微信的schemes加入到应用的白名单。在当前app的info.plist文件中增加LSApplicationQueriesSchemes字段为Array,然后把需要跳转的应用加入。如下图
然后在触发事件加入下面的代码
let string = "weixin://data=xxx"
//data=xxx为传递参数
let url = URL.init(string: string)
if UIApplication.shared.canOpenURL(url!) {
let dict = [:] as [String:Any]
//iOS10 之后 open方法增加了 参数options可以传递一个字典 携带一些信息给被跳转的app处理, 还有一个闭包,来传递是否跳转成功?
if #available(iOS 10.0, *) {
UIApplication.shared.open(url!, options: dict, completionHandler: { (res) in
print("跳转是否成功?\(res)")
})
} else {
// Fallback on earlier versions
UIApplication.shared.openURL(url!)
}
}
schemes可以传递信息,这里的weixin://之后的内容 data=XXX就是传递的参数。iOS10 之后 open方法增加了 参数options可以传递一个字典 携带一些信息给被跳转的app处理, 还有一个闭包,来传递是否跳转成功?
这里注意一下要对url scheme 进行encoding 编码,否则汉字 空格 会崩溃
2.创建Schemes让其他app来跳转到我们的app
(1.)在App内的info->URL Ttpes->增加一个URL Schemes如下图(2.)处理其他app跳转过来的携带的信息
在Appdelegate里面添加下面方法
//此方法从iOS9开始启用
func application(_ app: UIApplication, open url: URL, options: [UIApplicationOpenURLOptionsKey : Any] = [:]) -> Bool {
print(url,options)
return true
}
//此方法iOS9之后被废弃
func application(_ application: UIApplication, handleOpen url: URL) -> Bool {
return true
}
//此方法iOS9之后被废弃 url 为scheme url sourceApplication 为跳转过来app的bundle id
func application(_ application: UIApplication, open url: URL, sourceApplication: String?, annotation: Any) -> Bool {
return true
}
以上三个方法实现一个即可,可依据自己兼容的最低iOS版本而定。
3.系统的一些Schemes
系统内置
telprompt:10010 tel:10010
//拨打电话
facetime://user@example.com
//facetime 通话
facetime-audio://user@example.com
// facetime 语音
sms:86-130-9999-9999&body=你好
//body 为信息内容 可省略 body
mailto:foo@example.com?cc=bar@example.com&subject=Greetings%20from%20Cupertino!&body=Wish%20you%20were%20here!
//第一个为发送给谁 参数cc为抄送给谁 subject 为邮件的主题 body为内容 后面的参数都可以省略
itms-apps:itms-apps://itunes.apple.com/cn/app/idXXXXXX?mt=8&action=write-review
//跳转appstore去评价 注意把id后面的XXXXX换成自己应用的号码。
//直接跳转到系统对应的设置页面,但是试验发现iOS10 可以执行,iOS11无效
电池电量 App-Prefs:root=BATTERY_USAGE
通用设置 App-Prefs:root=General
存储空间 App-Prefs:root=General&path=STORAGE_ICLOUD_USAGE/DEVICE_STORAGE
蜂窝数据 App-Prefs:root=MOBILE_DATA_SETTINGS_ID
Wi-Fi 设置 App-Prefs:root=WIFI
蓝牙设置 App-Prefs:root=Bluetooth
定位设置 App-Prefs:root=Privacy&path=LOCATION
辅助功能 App-Prefs:root=General&path=ACCESSIBILITY
关于手机 App-Prefs:root=General&path=About
键盘设置 App-Prefs:root=General&path=Keyboard
显示设置 App-Prefs:root=DISPLAY
声音设置 App-Prefs:root=Sounds
App Store 设置 App-Prefs:root=STORE
墙纸设置 App-Prefs:root=Wallpaper