引言:
項(xiàng)目需求不同應(yīng)用之間的相互調(diào)用崎苗,類似分享到微信狐粱、QQ、新浪微博應(yīng)用之間的調(diào)用等益缠,廢話不多說脑奠,記錄一下,心得體驗(yàn)幅慌!
一宋欺、 Url Scheme
在iOS中應(yīng)用之間的調(diào)用需要設(shè)置 Url Scheme,例如:如果“應(yīng)用One”調(diào)用“應(yīng)用Two”胰伍,那么應(yīng)用Two需要設(shè)置自己的 Url Scheme齿诞,并且“應(yīng)用One”需要知道“應(yīng)用Two”的 Url Scheme才可以調(diào)用應(yīng)用Two。
1.自定義 Url Scheme
- info.plist
利用info.plist自定義骂租,如圖所示:
Url Scheme可以隨意自定義祷杈,也就是你喜歡怎樣就怎樣,O(∩_∩)O~渗饮,太嘚瑟了但汞,不過呢,利用bundle identifier是可以的互站,親測(cè)OK私蕾。(PS:此處有個(gè)取巧的地方,后面會(huì)介紹)胡桃。
- 簡(jiǎn)便自定義
其實(shí)也是在info.plist中踩叭,Xcode為廣大開發(fā)者提供了簡(jiǎn)便工程配置,如圖紅色框中所示:
其實(shí)是相同的設(shè)置翠胰,只不過Xcode提供了更加直觀的方式容贝。
- XML 自定義
將info.plist顯示為XML格式,進(jìn)行更改之景,對(duì)于熟悉XML格式的同學(xué)斤富,比較適合。
如何圖紅框內(nèi)的數(shù)據(jù)結(jié)構(gòu)闺兢,其實(shí)就是前兩種方法的數(shù)據(jù)結(jié)構(gòu)茂缚。
二戏罢、應(yīng)用之間調(diào)用的實(shí)現(xiàn)
上面自定義的Url Scheme 都是在應(yīng)用Two內(nèi)設(shè)置的屋谭,下面應(yīng)用One需要其Url Scheme 并調(diào)起應(yīng)用Two脚囊。應(yīng)用One內(nèi)的代碼非常簡(jiǎn)單,此處說明一下桐磁,調(diào)用其他應(yīng)用就是打開某個(gè)Url悔耘,格式為:
@"自定義Url Scheme://"
協(xié)議頭為你需要調(diào)用的應(yīng)用的自定義的Url Scheme,協(xié)議內(nèi)容可以為空我擂。
在應(yīng)用One控制器內(nèi)實(shí)現(xiàn)了簡(jiǎn)單的按鈕的點(diǎn)擊跳轉(zhuǎn)效果衬以,代碼如下:
- (IBAction)jumpApplication {
NSURL *url = [NSURL URLWithString:[NSString stringWithFormat:@"%@://",
[[[[NSBundle mainBundle] infoDictionary] objectForKey:@"LSApplicationQueriesSchemes"] lastObject]]];
if ([[UIApplication sharedApplication] canOpenURL:url]) {
[[UIApplication sharedApplication] openURL:url];
}
}
上述代碼中,@“LSApplicationQueriesSchemes” 是在iOS9中才需要的校摩,iOS9開始應(yīng)用之間的調(diào)用看峻,需要設(shè)置白名單,也就是將應(yīng)用Two自定義的Url Scheme 添加到應(yīng)用One中的白名單中衙吩,@“LSApplicationQueriesSchemes”所對(duì)應(yīng)的數(shù)組內(nèi)互妓。添加方法類似添加分享到微信、QQ等的白名單坤塞,這里就不贅述了冯勉。iOS9在首次調(diào)用的時(shí)候會(huì)提示用戶是否打開XX應(yīng)用。
點(diǎn)擊Open就可以調(diào)轉(zhuǎn)到應(yīng)用Two了
當(dāng)然這還設(shè)置到一個(gè)返回前個(gè)應(yīng)用的操作摹芙,iOS9提供了箭頭所指的返回方式灼狰,Coder也可以自定義!
三浮禾、反跳轉(zhuǎn)
反跳轉(zhuǎn)原理同跳轉(zhuǎn)交胚!
首先,在應(yīng)用One跳轉(zhuǎn)到應(yīng)用Two時(shí)盈电,不管應(yīng)用Two是否正在運(yùn)行蝴簇,都會(huì)調(diào)用應(yīng)用Two的代理方法。
注意上面的紅框內(nèi)的方法在iOS9開始已經(jīng)廢棄了挣轨,統(tǒng)一使用下面紅框內(nèi)的代理方法军熏。
這里解釋一下之前為什么使用bundle Identifier作為自定義的Url Scheme:
- 下面的代理方法中的options參數(shù)是個(gè)字典,字典中利用@"UIApplicationOpenURLOptionsSourceApplicationKey"
鍵可以取到應(yīng)用One的bundle identifier卷扮,利用相同的原理在跳回前個(gè)應(yīng)用荡澎。 - Url Scheme需有唯一性,否則應(yīng)用在跳轉(zhuǎn)的時(shí)候不知到底要跳轉(zhuǎn)哪個(gè)應(yīng)用晤锹,而bundle identifier具有此性質(zhì)摩幔。
- 下面的代理方法中的url也可以拿到前個(gè)應(yīng)用的Url Scheme
例如:
在應(yīng)用One中openUrl時(shí)添加協(xié)議體,將應(yīng)用One的Url Scheme傳遞過來鞭铆,如:@“com.neunn.ApplicationTwo://com.neunn.ApplicationOne”
但是這的需要截取字符串拿到應(yīng)用One的Url Scheme或衡,比較麻煩焦影,所以取巧使用了bundle Identifier。
- (BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary<NSString*, id> *)options{
NSUserDefaults *userDefault = [NSUserDefaults standardUserDefaults];
[userDefault setObject:[options objectForKey:@"UIApplicationOpenURLOptionsSourceApplicationKey"] forKey:@"key"];
[userDefault synchronize];
return YES;
}
這樣在應(yīng)用Two的控制器內(nèi)實(shí)現(xiàn)的反跳轉(zhuǎn)代碼封断,如下:
- (IBAction)jumpBack {
NSURL *url = [NSURL URLWithString:[NSString stringWithFormat:@"%@://",[[NSUserDefaults standardUserDefaults] objectForKey:@"key"]]];
// if ([[UIApplication sharedApplication] canOpenURL:url]) {
[[UIApplication sharedApplication] openURL:url];
// }
}
取出在代理方法內(nèi)存儲(chǔ)的Url Scheme拼接為符合格式的Url斯辰,Done!
但是這里需要注意的是:
iOS9中如果使用上述代碼中注釋的
[UIApplication sharedApplication] canOpenURL:url]
判斷是否可以打開的話坡疼,還是會(huì)提示設(shè)置應(yīng)用Two的白名單彬呻,才可以打開應(yīng)用One,這里沒必要判斷柄瑰,直接打開就可以了闸氮。
當(dāng)然你也可以判斷失敗后,代碼修改info.plist文件已達(dá)到設(shè)置白名單教沾,可以跳轉(zhuǎn)的目的蒲跨。
注:iOS9之后在沒有添加白名單的情況下,并不影響[UIApplication sharedApplication] openURL:url]
的使用授翻。