註冊URL Scheme

咱們都知道蘋果手機中的APP都有一個沙盒,APP就是一個信息孤島,相互是不能夠進行通訊的。可是iOS的APP能夠註冊本身的URL Scheme,URL Scheme是爲方便app之間互相調用而設計的。咱們能夠經過系統的OpenURL來打開該app,並能夠傳遞一些參數。ios

例如:你在Safari裏輸入www.alipay.com,就能夠直接打開你的支付寶app,前提是你的手機裝了支付寶。若是你沒有裝支付寶,應該顯示的是支付寶下載界面,點擊會跳到AppStore的支付寶下載界面。app

URL Scheme必須能惟一標識一個APP,若是你設置的URL Scheme與別的APP的URL Scheme衝突時,你的APP不必定會被啓動起來。由於當你的APP在安裝的時候,系統裏面已經註冊了你的URL Scheme。ide

通常狀況下,是會調用先安裝的app。可是iOS的系統app的URL Scheme確定是最高的。因此咱們定義URL Scheme的時候,儘可能避開系統app已經定義過的URL Scheme。測試

註冊URL Schemeurl

1.在info.plist裏添加URL typesspa

每個項目裏面都會有一個info.plist配置文件。找到info.plist,右鍵選擇Add Row,而後選擇URL types。如圖所示:設計

 

 

 

2.添加URL Schemes代理

添加完URL types,點擊展開。右鍵選擇Add Row,添加URL Schemes:接口

 

 

 

 

3.設置URL Schemesip

設置URL Schemes爲iOSDevTip

 

4.設置URL Identifier

URL Identifier是自定義的 URL scheme 的名字,通常採用反轉域名的方法保證該名字的惟一性,好比 com.iOSStrongDemo.www

 

添加成功啓動提示

爲了方便測試,咱們在AppDelegate裏面添加一個UIAlertView,當app被成功打開時,會提出提示:

 

複製代碼

代碼以下:

 

- (BOOL)application:(UIApplication *)application handleOpenURL:(NSURL*)url

{

    // 接受傳過來的參數

    NSString *text = [[url host] stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding];

    UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"打開啦"

                                           message:text

                                          delegate:nil

                                 cancelButtonTitle:@"OK"

                                 otherButtonTitles:nil];

    [alertView show];

    return YES;

}

 

Safari啓動自定義的URL Schemes APP

既然已經配置好URL Schemes,那麼咱們能夠來款速測試一下,咱們設置的URL Schemes是否有效。打開Safari,在地址欄裏輸入:iOSDevTip://

 

 

 

果真成功打開:

 

 

 

也能夠在地址欄中輸入:iOSDevTip://com.iOSStrongDemo.www。也是能夠打開註冊了URL Schemes的APP的。

經過另外一個APP啓動註冊了URL Schemes的APP

複製代碼

代碼以下:

 

 NSString *url = @"iOSDevTip://";

//    NSString *url = @"iOSDevTip://com.iOSStrongDemo.www";

if ([[UIApplication sharedApplication]

     canOpenURL:[NSURL URLWithString:url]])

{

    [[UIApplication sharedApplication] openURL:[NSURL URLWithString:url]];

}

else

{

    NSLog(@"can not open URL scheme iOSDevTip");

}

 

打開註冊iOSDevTip的APP格式爲: URL Scheme://URL identifier,直接調用URL Scheme也可打開程序, URL identifier是可選的。

 

經過註冊的URL Scheme向目標APP傳遞參數

經過URL Scheme啓動APP很簡單就能夠作到,但有時候咱們想在啓動APP的時候傳遞一些參數,這個時候咱們就能夠經過URL Scheme自定義URL來傳遞參數了。

昨天咱們在AppDelegate調用了UIApplicationDelegate的代理方法:

複製代碼

代碼以下:

 

- (BOOL)application:(UIApplication *)application handleOpenURL:(NSURL*)url

{

    // 接受傳過來的參數

    NSString *text = [[url host] stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding];

    UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"打開啦"

                                           message:text

                                          delegate:nil

                                 cancelButtonTitle:@"OK"

                                 otherButtonTitles:nil];

    [alertView show];

    return YES;

}

 

咱們來看看蘋果給這個方法的註釋:

複製代碼

代碼以下:

 

- (BOOL)application:(UIApplication *)application handleOpenURL:(NSURL *)url;  // Will be deprecated at some point, please replace with application:openURL:sourceApplication:annotation:

 

這個方法在將來將被廢棄,能夠用application:openURL:sourceApplication:annotation:來代替。

 

URL傳參格式

昨天咱們在iOSStrongDemo註冊的URL Scheme還記得是什麼嗎?你應該還有印象的就是iOS開發的ID:iOSDevTip。

假設咱們想要傳遞兩個參數分別是名字name和手機號phone,格式以下:

?

1

iOSDevTip://?name=ligang&phone=13888888888

有沒有似曾相識的感受。咱們用get方式請求一個接口是否是就是這樣的。

被啓動的APP處理傳過來的參數

複製代碼

代碼以下:

 

- (BOOL)application:(UIApplication *)application

        openURL:(NSURL *)url

  sourceApplication:(NSString *)sourceApplication

         annotation:(id)annotation

{

    NSLog(@"sourceApplication: %@", sourceApplication);

    NSLog(@"URL scheme:%@", [url scheme]);

    NSLog(@"URL query: %@", [url query]);

 

    // 接受傳過來的參數

    UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"打開啦"

                                                        message:[url query]

                                                       delegate:nil

                                              cancelButtonTitle:@"OK"

                                              otherButtonTitles:nil];

    [alertView show];

    return YES;

}

 

當APP被啓動是,會調用代理方法application:openURL:sourceApplication:annotation:。參數URL就是啓動APP的URL,參數sourceApplication就是來源APP的Bundle ID。

 

咱們依然經過Safari來測試,在Safari的地址欄中輸入:iOSDevTip://?name=ligang&phone=13888888888

 

便可打開APP,看看參數是否傳遞過來:

 

最後咱們看一下打印:

?

1

2

3

2015-07-15 22:38:25.655 iOSStrongDemo[9983:2894855] sourceApplication: com.apple.mobilesafari

2015-07-15 22:38:28.664 iOSStrongDemo[9983:2894855] URL scheme:iosdevtip

2015-07-15 22:38:28.665 iOSStrongDemo[9983:2894855] URL query: name=ligang&phone=13888888888

sourceApplication打印出來是com.apple.mobilesafari,從這裏能夠看出來,是從Safari啓動咱們的APP的。

咱們雖然自定義了URL Scheme,可是咱們不能阻止別人經過自定義的URL Scheme來打開咱們的應用。怎麼解決呢?

咱們能夠指定相應的sourceApplication,也就是相應的Bundle ID,經過Bundle ID來決定是否能夠打開咱們的APP:

複製代碼

代碼以下:

 

- (BOOL)application:(UIApplication *)application

        openURL:(NSURL *)url

  sourceApplication:(NSString *)sourceApplication

         annotation:(id)annotation

{

    NSLog(@"sourceApplication: %@", sourceApplication);

    NSLog(@"URL scheme:%@", [url scheme]);

    NSLog(@"URL query: %@", [url query]);

 

    if ([sourceApplication isEqualToString:@"com.3Sixty.CallCustomURL"]){

        // 接受傳過來的參數

        UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"打開啦"

                                                            message:[url query]

                                                           delegate:nil

                                                  cancelButtonTitle:@"OK"

                                                  otherButtonTitles:nil];

        [alertView show];

        return YES;

    }else{

        return NO;

    }

}

 

這樣咱們就能夠經過Bundle ID來決定是否容許打開咱們的APP。

相關文章
相關標籤/搜索