新聞中心
平常我們做iOS開發(fā),會(huì)經(jīng)常遇到打開其他的APP的功能。本篇文章講的就是打開別人的APP的一些知識(shí)。我們的目標(biāo)是:
建立這個(gè)工作空間主要是為了讓我們后面建立的兩個(gè)工程能在一個(gè)Xcode頁面上管理,方便講解和管理。挺簡單的,不清楚的可以看我之前的文章【iOS開發(fā)】在一個(gè)Xcode頁面建立多個(gè)工程
建立一個(gè)workspace來存放我們的工程
建立一個(gè)名為MyApp的iOS工程。這個(gè)MyApp是“我的app”,用來打開另一個(gè)APP的。
添加工程到我們剛才創(chuàng)建的OpenApp.xcworkspace。并且在工程的Main.storyboard添加一個(gè)button,待會(huì)兒我們會(huì)用來寫方法。
MyApp工程
建立一個(gè)名為WXApp的iOS工程。這個(gè)工程是我們模擬的“微信APP”,是被人打開的那個(gè)APP。
為了區(qū)分兩個(gè)應(yīng)用,我們?cè)贛ain.storyboard上加一個(gè)label,“我是微信App”。
在workspace建立WXApp工程
WXApp
好了,準(zhǔn)備工作就這么簡單。
打開別人的APP與讓別人打開我們的APP想要打開別人的APP或者讓別人打開我們的APP,那就需要通過URL Schemes了。
什么是URL Schemes?URL Schemes是蘋果給出的用來跳轉(zhuǎn)到系統(tǒng)應(yīng)用或者跳轉(zhuǎn)到別人的應(yīng)用的一種機(jī)制。同時(shí)還可以在應(yīng)用之間傳數(shù)據(jù)。
通過對(duì)比網(wǎng)頁鏈接來理解 iOS 上的 URL Schemes,應(yīng)該就容易多了。
URL Schemes 有兩個(gè)單詞:
就是個(gè) URL,我們也叫它鏈接或網(wǎng)址; Schemes,表示的是一個(gè) URL 中的一個(gè)位置——最初始的位置,即 ://
之前的那段字符。比如 http://www.apple.com
這個(gè)網(wǎng)址的 Schemes是 http。
根據(jù)我們上面對(duì) URL Schemes 的使用,我們可以很輕易地理解,在以本地應(yīng)用為主的 iOS 上,我們可以像定位一個(gè)網(wǎng)頁一樣,用一種特殊的 URL 來定位一個(gè)應(yīng)用甚至應(yīng)用里某個(gè)具體的功能。而定位這個(gè)應(yīng)用的,就應(yīng)該是這個(gè)應(yīng)用的 URL 的 Schemes 部分,也就是開頭兒那部分。 在WXApp上設(shè)置一個(gè)URL Schemes
為了能讓別的App(包括我們剛才創(chuàng)建的MyApp)能夠打開WXApp,我們需要為WXApp添加一個(gè)URL Schemes。
步驟:選中WXApp工程->Info->URL Types->點(diǎn)擊“+”->在URL Schemes欄填上 weixin
添加一個(gè)URL Schemes
備注:一個(gè)應(yīng)用是可以有多個(gè)URL Schemes的。你可以再次點(diǎn)擊“+”來添加一個(gè)URL Schemes
我們看看info.plist文件里面是怎樣的。
info.plist文件里面的URL Schemes
然后我們r(jià)un一下WXApp。(注意一下你run的target是哪個(gè))
在模擬器run一下WXApp
這樣,WXApp就向系統(tǒng)“注冊(cè)”了一個(gè)URL Schemes,其他的應(yīng)用可以通過openurl:方法來打開WXApp了。
MyApp打開WXApp現(xiàn)在我們?cè)贛yApp里面打開WXApp。方法非常簡單。
在ViewController里面添加一個(gè)方法
- (IBAction)openWXApp:(UIButton *)sender { [self demo1]; } - (void)demo1 { //創(chuàng)建一個(gè)url,這個(gè)url就是WXApp的url,記得加上:// NSURL *url = [NSURL URLWithString:@"weixin://"]; //打開url [[UIApplication sharedApplication] openURL:url]; }
然后run一下MyApp
run MyApp
運(yùn)行了之后點(diǎn)擊“打開微信”button,會(huì)彈出“MyApp”想要打開“WXApp”提示框,點(diǎn)確認(rèn)之后就可以跳轉(zhuǎn)到WXApp了。
點(diǎn)擊“打開微信”button
打開了WXApp
iOS9之后,在一個(gè)應(yīng)用跳轉(zhuǎn)到了另一個(gè)應(yīng)用之后,左上角會(huì)有個(gè)返回到上一個(gè)應(yīng)用的按鈕。這樣,我們?cè)贛yApp里面點(diǎn)擊“打開微信”按鈕,跳轉(zhuǎn)到WXApp之后,再點(diǎn)擊“Back to MyApp”,又回到MyApp了。閑著無聊就可以反復(fù)點(diǎn)擊這兩個(gè)按鈕來兩個(gè)應(yīng)用間跳轉(zhuǎn)了,哈哈。
值得一說的是,這個(gè)URL Schemes并不是唯一的。也就是說,多個(gè)應(yīng)用之間設(shè)置的URL Schemes是可以相同的。
那么問題來了,假如兩個(gè)應(yīng)用的URL Schemes相同的話,使用openURL:方法會(huì)打開哪個(gè)應(yīng)用呢?
樓主親自用手機(jī)試了一下。
步驟是:
結(jié)論:如果兩個(gè)應(yīng)用有URL Schemes是相同的,后安裝的應(yīng)用的URL Schemes會(huì)把早安裝的應(yīng)用的URL Schems覆蓋掉。 在safari打開WXApp
沒錯(cuò),注冊(cè)了URL Schemes的應(yīng)用,用safari瀏覽器也是可以打開的。我就經(jīng)常用這個(gè)來驗(yàn)證應(yīng)用是否設(shè)置了我想要的URL Schemes
在safari打開WXApp,直接在safari的地址欄輸入weixin://,enter就可以打開了
用safari打開WXApp
用safari打開WXApp
iOS9中的適配 配置URL Schemes白名單其實(shí)在打開WXApp的時(shí)候,正常情況下,我們應(yīng)該是先用canOpenURL:方法先判斷能否打開這個(gè)url,然后再用openURL方法打開該URL的。這樣可以帶來更好的用戶體驗(yàn)。因?yàn)橛脩舨灰欢ò惭b了WXApp。假如用戶沒有安裝的話點(diǎn)擊“打開微信”button是沒有任何反應(yīng)的。這時(shí)候我們應(yīng)該先判斷是否能夠打開這個(gè)url(也就是判斷用戶有沒有安裝WXApp),沒有安裝的話就給個(gè)溫馨提示,比如:“U四不四灑,沒安裝WXApp,怎么打開啊!”。
更重要的是,假如點(diǎn)擊之后沒效果,很有可能被蘋果拒絕哦。
- (IBAction)openWXApp:(UIButton *)sender { // [self demo1]; [self demo2]; } //先判斷再打開WXApp - (void)demo2 { //創(chuàng)建一個(gè)url,這個(gè)url就是WXApp的url,記得加上:// NSURL *url = [NSURL URLWithString:@"weixin://"]; //先判斷是否能打開該url if ([[UIApplication sharedApplication] canOpenURL:url]) { //打開url [[UIApplication sharedApplication] openURL:url]; }else { //給個(gè)提示或者做點(diǎn)別的事情 NSLog(@"U四不四灑,沒安裝WXApp,怎么打開啊!"); }
但是我們發(fā)現(xiàn)用了canOpenURL:方法之后,并沒有如我們想像中打開了WXApp。一看,Xcode控制臺(tái)提示:
Xcode控制臺(tái)錯(cuò)誤提示
為什么會(huì)這樣呢?
因?yàn)閕OS9的時(shí)候蘋果加強(qiáng)了權(quán)限,只有在info.plist文件中加入了URL Schemes白名單才能使用canOpenURL:方法來判斷是否能打開該url。該白名單的上限是50個(gè)。也就是說,你最多只能使用canOpenURL:方法判斷50個(gè)URL Schemes。當(dāng)然,平常我們都用不了那么多,就算是集成分享功能,50個(gè)肯定夠了。
備注:只是對(duì)canOpenURL:方法有限制,openURL:方法是沒有限制的。
言歸正傳,我們需要在MyApp的info.plist里面將weixin設(shè)置為白名單。
步驟:點(diǎn)擊info.plist->右鍵->Open As->Source Code->添加下面的代碼
這樣就可以了。
使用URL Schems傳遞數(shù)據(jù)URL Schemes除了可以用來打開APP之外,還可以用來在兩個(gè)App之間傳遞少量的數(shù)據(jù)。
在百度上搜索“ios”,會(huì)生成一個(gè)url,下面來以這個(gè)url來大概介紹url的組成。
url為:https://www.baidu.com/s?ie=UTF-8&wd=ios
https就是協(xié)議,也就是scheme www.baidu.com 是域名 /s是路徑 ?后面的是query,也就是查詢參數(shù)。這個(gè)url有兩個(gè)參數(shù),分別是ie=UTF-8和wd=ios我們iOS的URL Schemes中也是差不多的。
而且,在openURL的時(shí)候,如果url中帶有參數(shù),只要URL Schemes是正確的,那同樣可以打開App,而且,后面的參數(shù)也會(huì)帶到我們打開的App那里。
咱們做個(gè)Demo就一目了然了。
在MyApp中,寫個(gè)demo3方法,url為weixin://www.shixueqian.com/abc?title=hello&content=helloworld
- (IBAction)openWXApp:(UIButton *)sender { // [self demo1]; // [self demo2]; [self demo3]; } //使用URL Schemes傳遞數(shù)據(jù) - (void)demo3 { //創(chuàng)建一個(gè)url,這個(gè)url就是WXApp的url,記得加上:// NSURL *url = [NSURL URLWithString:@"weixin://www.shixueqian.com/abc?title=hello&content=helloworld"]; //打開url [[UIApplication sharedApplication] openURL:url]; }
在WXApp的AppDelegate.m中,實(shí)現(xiàn)application: openURL:(NSURL *)url sourceApplication: annotation:回調(diào)
- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation { NSLog(@"url=====%@ n sourceApplication=======%@ n annotation======%@", url, sourceApplication, annotation); return YES; }
run了之后,我們發(fā)現(xiàn),我們依舊可以通過點(diǎn)擊openURL:方法打開WXApp。而且在WXApp被打開的時(shí)候,會(huì)執(zhí)行application: openURL:(NSURL *)url sourceApplication: annotation:回調(diào)方法。在這個(gè)回調(diào)方法中,我們可以得到MyApp傳過來的url等信息。
控制臺(tái)打印如下:
log結(jié)果
完整的url信息都傳過來了,我們就可以利用這個(gè)url里面的路徑和參數(shù)等信息了,想干嘛就干嘛。這就實(shí)現(xiàn)了從MyApp向WXApp傳遞數(shù)據(jù)了。
備注:
蘋果一共給了3個(gè)openURL的回調(diào)。
分別是:
- (BOOL)application:(UIApplication *)application handleOpenURL:(NSURL *)url NS_DEPRECATED_IOS(2_0, 9_0, "Please use application:openURL:options:") __TVOS_PROHIBITED; - (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(nullable NSString *)sourceApplication annotation:(id)annotation NS_DEPRECATED_IOS(4_2, 9_0, "Please use application:openURL:options:") __TVOS_PROHIBITED; - (BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary
為什么會(huì)有3個(gè)呢?這3個(gè)回調(diào)又有什么區(qū)別?(為方面講解,分別設(shè)置ABC3個(gè)回調(diào))
3個(gè)回調(diào)的功能基本一樣,都是在別人通過URL Schemes打開應(yīng)用的時(shí)候會(huì)執(zhí)行的。不同之處: A回調(diào)是在iOS2.0的時(shí)候推出的,參數(shù)只有url。 B回到是在iOS4.2的時(shí)候推出的,參數(shù)有url sourceApplication annotation. C回調(diào)是iOS9.0的時(shí)候推出的,參數(shù)有url options。options有下面幾個(gè)key
// Keys for application:openURL:options: UIKIT_EXTERN NSString *const UIApplicationOpenURLOptionsSourceApplicationKey NS_AVAILABLE_IOS(9_0); // value is an NSString containing the bundle ID of the originating application UIKIT_EXTERN NSString *const UIApplicationOpenURLOptionsAnnotationKey NS_AVAILABLE_IOS(9_0); // value is a property-list typed object corresponding to what the originating application passed in UIDocumentInteractionController\'s annotation property UIKIT_EXTERN NSString *const UIApplicationOpenURLOptionsOpenInPlaceKey NS_AVAILABLE_IOS(9_0); // value is a bool NSNumber, set to YES if the file needs to be copied before use 這幾個(gè)回調(diào)是有優(yōu)先級(jí)的。C>B>A。也就是說,如果你3個(gè)回調(diào)都實(shí)現(xiàn)了,那么程序只會(huì)執(zhí)行C回調(diào)。其他回調(diào)是不會(huì)執(zhí)行的。(當(dāng)然,iOS9以下只會(huì)執(zhí)行B回調(diào))。
本文名稱:【iOS開發(fā)】打開另一個(gè)APP(URLScheme與openURL)
URL分享:http://www.ef60e0e.cn/article/cgeddj.html