我們都知道盗痒,iOS系統(tǒng)為了數(shù)據(jù)的安全性,對每個應(yīng)用存儲的數(shù)據(jù)進(jìn)行安全處理,即沙盒存儲機制俯邓。使得應(yīng)用的存儲空間是彼此分離的骡楼。這樣就保證了數(shù)據(jù)的安全性。但是應(yīng)用之前彼此分離也阻礙了相互的通信稽鞭。因此蘋果給出了應(yīng)用之間傳遞信息的方法URL Schemes鸟整。像我們平時所看到的分享、支付等都是通過URL Schemes的方式進(jìn)行應(yīng)用間的跳轉(zhuǎn)傳遞信息的朦蕴。
1.使用URL Scheme跳轉(zhuǎn)到其他應(yīng)用
如果我們想要跳轉(zhuǎn)到別的應(yīng)用篮条,首先你要知道其他App的Scheme是什么?以下是一些常見的應(yīng)用的Scheme
QQ mqq://
微信是 weixin://
網(wǎng)易新聞 newsapp://
淘寶 taobao://
點評 dianping://
微博 sinaweibo://
支付寶 alipay://
豆瓣fm: doubanradio://
微盤 sinavdisk://
網(wǎng)易公開課 ntesopen://
美團 imeituan://
人人 renren://
我查查 wcc://
1號店 wccbyihaodian://
有道詞典 yddictproapp://
知乎 zhihu://
優(yōu)酷 youku://
ZAKER zakeripad://
mdict mdict://
京東hd openApp.jdiPad://
易迅 icson://吩抓;yixunipad://
wunderlist wunderlist://
支付寶 alipay://
比如我們想要跳轉(zhuǎn)去微信涉茧,首先我們把微信的schemes加入到應(yīng)用的白名單。在當(dāng)前app的info.plist文件中增加LSApplicationQueriesSchemes字段為Array疹娶,然后把需要跳轉(zhuǎn)的應(yīng)用加入伴栓。如下圖
然后在觸發(fā)事件加入下面的代碼
let string = "weixin://data=xxx"
//data=xxx為傳遞參數(shù)
let url = URL.init(string: string)
if UIApplication.shared.canOpenURL(url!) {
let dict = [:] as [String:Any]
//iOS10 之后 open方法增加了 參數(shù)options可以傳遞一個字典 攜帶一些信息給被跳轉(zhuǎn)的app處理, 還有一個閉包雨饺,來傳遞是否跳轉(zhuǎn)成功钳垮?
if #available(iOS 10.0, *) {
UIApplication.shared.open(url!, options: dict, completionHandler: { (res) in
print("跳轉(zhuǎn)是否成功?\(res)")
})
} else {
// Fallback on earlier versions
UIApplication.shared.openURL(url!)
}
}
schemes可以傳遞信息,這里的weixin://之后的內(nèi)容 data=XXX就是傳遞的參數(shù)额港。iOS10 之后 open方法增加了 參數(shù)options可以傳遞一個字典 攜帶一些信息給被跳轉(zhuǎn)的app處理饺窿, 還有一個閉包,來傳遞是否跳轉(zhuǎn)成功移斩?
這里注意一下要對url scheme 進(jìn)行encoding 編碼肚医,否則漢字 空格 會崩潰
2.創(chuàng)建Schemes讓其他app來跳轉(zhuǎn)到我們的app
(1.)在App內(nèi)的info->URL Ttpes->增加一個URL Schemes如下圖(2.)處理其他app跳轉(zhuǎn)過來的攜帶的信息
在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 為跳轉(zhuǎn)過來app的bundle id
func application(_ application: UIApplication, open url: URL, sourceApplication: String?, annotation: Any) -> Bool {
return true
}
以上三個方法實現(xiàn)一個即可,可依據(jù)自己兼容的最低iOS版本而定叹哭。
3.系統(tǒng)的一些Schemes
系統(tǒng)內(nèi)置
telprompt:10010 tel:10010
//撥打電話
facetime://user@example.com
//facetime 通話
facetime-audio://user@example.com
// facetime 語音
sms:86-130-9999-9999&body=你好
//body 為信息內(nèi)容 可省略 body
mailto:foo@example.com?cc=bar@example.com&subject=Greetings%20from%20Cupertino!&body=Wish%20you%20were%20here!
//第一個為發(fā)送給誰 參數(shù)cc為抄送給誰 subject 為郵件的主題 body為內(nèi)容 后面的參數(shù)都可以省略
itms-apps:itms-apps://itunes.apple.com/cn/app/idXXXXXX?mt=8&action=write-review
//跳轉(zhuǎn)appstore去評價 注意把id后面的XXXXX換成自己應(yīng)用的號碼忍宋。
//直接跳轉(zhuǎn)到系統(tǒng)對應(yīng)的設(shè)置頁面,但是試驗發(fā)現(xiàn)iOS10 可以執(zhí)行痕貌,iOS11無效
電池電量 App-Prefs:root=BATTERY_USAGE
通用設(shè)置 App-Prefs:root=General
存儲空間 App-Prefs:root=General&path=STORAGE_ICLOUD_USAGE/DEVICE_STORAGE
蜂窩數(shù)據(jù) App-Prefs:root=MOBILE_DATA_SETTINGS_ID
Wi-Fi 設(shè)置 App-Prefs:root=WIFI
藍(lán)牙設(shè)置 App-Prefs:root=Bluetooth
定位設(shè)置 App-Prefs:root=Privacy&path=LOCATION
輔助功能 App-Prefs:root=General&path=ACCESSIBILITY
關(guān)于手機 App-Prefs:root=General&path=About
鍵盤設(shè)置 App-Prefs:root=General&path=Keyboard
顯示設(shè)置 App-Prefs:root=DISPLAY
聲音設(shè)置 App-Prefs:root=Sounds
App Store 設(shè)置 App-Prefs:root=STORE
墻紙設(shè)置 App-Prefs:root=Wallpaper