需要明白的名詞
- URL: 全球統(tǒng)一資源定位符
- 協(xié)議頭: http:// https:// file:// ftp://
- 地址: www.baidu.com www.itcast.cn/iOS.index
- URL Scheme: 自定義協(xié)議頭 --> 給當前程序起個名字
只要添加了URL Scheme的程序運行了. 那么URL Scheme就會被系統(tǒng)記錄.(只要運行一次, 無論之后是否在運行, 都可以打開 -->類似于 windos的快捷方式)
此時, 如果A程序運行了. 并調(diào)用openURL方法, 優(yōu)先在系統(tǒng)內(nèi)部進行查找. 如果找到了就會發(fā)生跳轉(zhuǎn)行為.
A應用跳轉(zhuǎn)B應用
- 首先在B應用info.plist配置一下信息

WechatIMG1.jpeg
- 在A應用中添加跳轉(zhuǎn)代碼
//如果可以跳轉(zhuǎn)這個程序, 就跳轉(zhuǎn)
if ([[UIApplication sharedApplication] canOpenURL:[NSURL URLWithString:@"weixin://"]]) {
[[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"weixin://"]];
//應用間通訊,講需要傳遞的信息 拼接在URl后面
[[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"weixin://timeline"]];
}
注意:iOS9的變化
1. 在iOS9之前, 是沒有彈窗的. 彈窗只會出現(xiàn)在首次的URLScheme跳轉(zhuǎn)
2. 對canOpenURL進行了白名單限制
之前為了邏輯嚴謹, 以及判斷某個程序是否在手機中存在. 會調(diào)用一個canOpenURL方法.
如果使用了canOPenURL方法, 那么還需要在plist中. 添加一個信任白名單. LSApplicationQueriesSchemes. 只有添加在這里的Scheme, 才能發(fā)生跳轉(zhuǎn). 白名單最多50個.
注意: 只是使用openURL方法, 不會受到任何影響.

WechatIMG2.jpeg
- B應用的代碼實現(xiàn)
有兩種實現(xiàn)思路可以在appDelegate中直接處理
也可以在appDelegate添加一個NSURL屬性,在控制器里進行處理
// iOS9新版API
-(BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary<NSString*, id> *)options
{
self.url = url;
return YES;
}
// 建議使用這個來適配iOS9以下系統(tǒng)
-(BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(nullable NSString *)sourceApplication annotation:(id)annotation
{
}
在根控制器里的實現(xiàn)
-(void)viewDidLoad {
[super viewDidLoad];
NSURL * url = ((AppDelegate *)[UIApplication sharedApplication].delegate).url;
;
if(url){
//顯示一下從A獲取的url,url = weixin://timelineage,host = timeline
self.label.text = [NSString stringWithFormat:@"url = %@,host = %@",[url absoluteString],[url host]];
//根據(jù)傳過來的url的host進行一些操作
if ([[url host]isEqualToString:@"timeline"]) {
//跳轉(zhuǎn)到第二個界面.或者根據(jù)其他操作
[self performSegueWithIdentifier:@"second" sender:nil];
}
}
}
注意
- iOS9 需要配置白名單
- h5打開app,一般需要在Safari里打開。(京東,淘寶好像可以在其他瀏覽器打開不知道為什么)