如何利用openUrl打開另外一個app

本文轉載自:http://www.jianshu.com/p/0811ccd6a65d

目標

平常我們做iOS開發,會經常遇到打開其他的APP的功能。本篇文章講的就是打開別人的APP的一些知識。我們的目標是:

打開別人的APP 讓別人打開我們的APP iOS9的適配問題 使用URL Schemes傳遞數據

準備工作

建立一個名爲OpenApp的工作空間,用來存放我們的兩個工程 建立這個工作空間主要是爲了讓我們後面建立的兩個工程能在一個Xcode頁面上管理,方便講解和管理。挺簡單的,不清楚的可以看我之前的文章【iOS開發】在一個Xcode頁面建立多個工程
建立一個workspace來存放我們的工程

建立一個名爲MyApp的iOS工程。這個MyApp是“我的app”,用來打開另一個APP的。 添加工程到我們剛纔創建的OpenApp.xcworkspace。並且在工程的Main.storyboard添加一個button,待會兒我們會用來寫方法。

MyApp工程

建立一個名爲WXApp的iOS工程。這個工程是我們模擬的“微信APP”,是被人打開的那個APP。 爲了區分兩個應用,我們在Main.storyboard上加一個label,“我是微信App”。

在workspace建立WXApp工程
WXApp

好了,準備工作就這麼簡單。

打開別人的APP與讓別人打開我們的APP

想要打開別人的APP或者讓別人打開我們的APP,那就需要通過URL Schemes了。

什麼是URL Schemes?

URL Schemes是蘋果給出的用來跳轉到系統應用或者跳轉到別人的應用的一種機制。同時還可以在應用之間傳數據。

通過對比網頁鏈接來理解 iOS 上的 URL Schemes,應該就容易多了。 URL Schemes 有兩個單詞:

URL,我們都很清楚,http://www.apple.com 就是個 URL,我們也叫它鏈接或網址; Schemes,表示的是一個 URL 中的一個位置——最初始的位置,即 :// 之前的那段字符。比如 http://www.apple.com 這個網址的 Schemes是 http。 根據我們上面對 URL Schemes 的使用,我們可以很輕易地理解,在以本地應用爲主的 iOS 上,我們可以像定位一個網頁一樣,用一種特殊的 URL 來定位一個應用甚至應用裏某個具體的功能。而定位這個應用的,就應該是這個應用的 URL 的 Schemes 部分,也就是開頭兒那部分。

在WXApp上設置一個URL Schemes

爲了能讓別的App(包括我們剛纔創建的MyApp)能夠打開WXApp,我們需要爲WXApp添加一個URL Schemes。 步驟:選中WXApp工程->Info->URL Types->點擊“+”->在URL Schemes欄填上 weixin

添加一個URL Schemes

備註:一個應用是可以有多個URL Schemes的。你可以再次點擊“+”來添加一個URL Schemes

我們看看info.plist文件裏面是怎樣的。

info.plist文件裏面的URL Schemes

然後我們run一下WXApp。(注意一下你run的target是哪個)

在模擬器run一下WXApp

這樣,WXApp就向系統“註冊”了一個URL Schemes,其他的應用可以通過openurl:方法來打開WXApp了。

MyApp打開WXApp

現在我們在MyApp裏面打開WXApp。方法非常簡單。 在ViewController裏面添加一個方法

- (IBAction)openWXApp:(UIButton *)sender {
    [self demo1];
}
- (void)demo1 {
    //創建一個url,這個url就是WXApp的url,記得加上://
    NSURL *url = [NSURL URLWithString:@"weixin://"];

    //打開url
    [[UIApplication sharedApplication] openURL:url];
}

然後run一下MyApp


run MyApp

運行了之後點擊“打開微信”button,會彈出“MyApp”想要打開“WXApp”提示框,點確認之後就可以跳轉到WXApp了。


點擊“打開微信”button

打開了WXApp


iOS9之後,在一個應用跳轉到了另一個應用之後,左上角會有個返回到上一個應用的按鈕。這樣,我們在MyApp裏面點擊“打開微信”按鈕,跳轉到WXApp之後,再點擊“Back to MyApp”,又回到MyApp了。閒着無聊就可以反覆點擊這兩個按鈕來兩個應用間跳轉了,哈哈。

值得一說的是,這個URL Schemes並不是唯一的。也就是說,多個應用之間設置的URL Schemes是可以相同的。
那麼問題來了,假如兩個應用的URL Schemes相同的話,使用openURL:方法會打開哪個應用呢?
樓主親自用手機試了一下。
步驟是:

  • 將MyApp安裝到手機上,點擊“打開微信”button,微信打開了。
  • 然後將WXApp也安裝到手機上。再次點擊MyApp的“打開微信”button,結果打開的是WXApp。
    結論:如果兩個應用有URL Schemes是相同的,後安裝的應用的URL Schemes會把早安裝的應用的URL Schems覆蓋掉。

在safari打開WXApp

沒錯,註冊了URL Schemes的應用,用safari瀏覽器也是可以打開的。我就經常用這個來驗證應用是否設置了我想要的URL Schemes
在safari打開WXApp,直接在safari的地址欄輸入weixin://,enter就可以打開了


用safari打開WXApp

用safari打開WXApp

iOS9中的適配

  • 配置URL Schemes白名單
    其實在打開WXApp的時候,正常情況下,我們應該是先用canOpenURL:方法先判斷能否打開這個url,然後再用openURL方法打開該URL的。這樣可以帶來更好的用戶體驗。因爲用戶不一定安裝了WXApp。假如用戶沒有安裝的話點擊“打開微信”button是沒有任何反應的。這時候我們應該先判斷是否能夠打開這個url(也就是判斷用戶有沒有安裝WXApp),沒有安裝的話就給個溫馨提示,比如:“U四不四灑,沒安裝WXApp,怎麼打開啊!”。
    更重要的是,假如點擊之後沒效果,很有可能被蘋果拒絕哦。
- (IBAction)openWXApp:(UIButton *)sender {
//    [self demo1];
    [self demo2];
}
//先判斷再打開WXApp
- (void)demo2 {
    //創建一個url,這個url就是WXApp的url,記得加上://
    NSURL *url = [NSURL URLWithString:@"weixin://"];

    //先判斷是否能打開該url
    if ([[UIApplication sharedApplication] canOpenURL:url]) {
        //打開url
        [[UIApplication sharedApplication] openURL:url];
    }else {
        //給個提示或者做點別的事情
        NSLog(@"U四不四灑,沒安裝WXApp,怎麼打開啊!");
}

但是我們發現用了canOpenURL:方法之後,並沒有如我們想像中打開了WXApp。一看,Xcode控制檯提示:


Xcode控制檯錯誤提示

爲什麼會這樣呢?
因爲iOS9的時候蘋果加強了權限,只有在info.plist文件中加入了URL Schemes白名單才能使用canOpenURL:方法來判斷是否能打開該url。該白名單的上限是50個。也就是說,你最多隻能使用canOpenURL:方法判斷50個URL Schemes。當然,平常我們都用不了那麼多,就算是集成分享功能,50個肯定夠了。

備註:只是對canOpenURL:方法有限制,openURL:方法是沒有限制的。

言歸正傳,我們需要在MyApp的info.plist裏面將weixin設置爲白名單。
步驟:點擊info.plist->右鍵->Open As->Source Code->添加下面的代碼

    <key>LSApplicationQueriesSchemes</key>
    <array>
        <string>weixin</string>
    </array>

這樣就可以了。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章