IOS開發系列——APP間相互調用專題【整理,部分原創】

APP間相互調用專題

1    OpenUrl原理

如果一個應用程序支持一些已知類型的URL,您就可以通過對應的URL模式和該程序進行通訊。然而,在大多數情況下,URL只是用於簡單地啓動一個應用程序並顯示一些和調用方有關的信息。舉例來說,對於一個用於管理地址信息的應用程序,您就可以在發送給它的URL中包含一個Maps程序可以處理的地址,以便顯示相應的位置。這個級別的通訊爲用戶創造一個集成度高得多的環境,減少應用程序重新實現設備上其它程序已經實現的功能的必要性。

蘋果內置支持httpmailtotel、和sms這些URL模式,還支持基於http的、指向Maps、YouTube、和iPod程序的URL。應用程序也可以自己註冊定製的URL模式。您的應用程序可以和其它應用程序通訊,具體方法是用正確格式的內容創建一個NSURL對象,然後將它傳給共享UIApplication對象openURL:方法。openURL:方法會啓動註冊接收該URL類型的應用程序,並將URL傳給它。當用戶最終退出該應用程序時,系統通常會重新啓動您的應用程序,但並不總是這樣。系統會考慮用戶在URL處理程序中的動作及在用戶看來返回您的應用程序是否合理,然後做出決定。

 

重要提示:如果您的URL類型包含的模式和蘋果定義的一樣,則啓動的是蘋果提供的程序,而不是您的程序。如果有多個第三方的應用程序註冊處理同樣的URL模式,則該類型的URL由哪個程序處理是沒有定義的。

 

如果您的應用程序定義了自己的URL模式,則應該實現對該模式進行處理的方法,具體信息在實現定製的URL模式部分中進行描述。有關係統支持的URL處理,包括如何處理URL的格式,請參見蘋果的URL模式參考

 

2    OpenUrl實現APP間調用

2.1    註冊OpenURL協議

IOS中,實現一個應用啓動另外一個應用,使用UIApplicationopenURL:方法就可實現,這裏以test跳到test02爲例。(需要先創建這兩個工程)

首先被啓動的應用需要向iPhone註冊一個自定義URL協議。這是在info.plist文件進行的。

1. 右鍵,選擇“Add Row”

2. Key值選擇“URL types”

3. 打開“Item 0,然後爲該key增加一個URL identifier。可以是任何值,但建議用反域名”(例如 “com.fcplayer.test”)

4. “Item 0”下再加一行。

5. 選擇“URLSchemes” 作爲Key

6. 輸入你的URL協議名 (例如“test://” 應寫做“test”)。如果有必要,你可以在這裏加入多個協議。

操作截圖如下:

表1-6  CFBundleURLTypes屬性的鍵和值

CFBundleURLName

這是個字符串,表示URL類型的抽象名。爲了確保其唯一性,建議您使用反向DNS風格的標識,比如com.acme.myscheme

這裏提供的URL類型名是一個指向本地化字符串的鍵,該字符串位於本地化語言包子目錄中的InfoPlist.strings文件中。本地化字符串是人類可識別的URL類型名稱,用相應的語言來表示。

CFBundleURLSchemes

這是個URL模式的數組,表示歸屬於這個URL類型的URL。每個模式都是一個字符串。屬於指定URL類型的URL都帶有它們的模式組件。

 

您在對CFBundleURLTypes屬性進行定義,從而註冊帶有定製模式的URL類型之後,可以通過下面的方式來進行測試:

1  連編、安裝、和運行您的應用程序。

2  回到Home屏幕,啓動Safari(在iPhone仿真器上,在菜單上選擇Hardware > Home命令就可以回到Home屏幕)。

3  在Safari的地址欄中,鍵入使用定製模式的URL。

確認您的應用程序是否啓動,以及應用程序委託是否收到application:handleOpenURL:消息。

 

2.2    訪問自定義URL(在test02中)

應用程序委託在application:handleOpenURL:方法中處理傳遞給應用程序的URL請求。如果您已經爲自己的應用程序註冊了定製的URL模式,則務必在委託中實現這個方法。

基於定製模式的URL採用的協議是請求服務的應用程序能夠理解的。URL中包含一些註冊模式的應用程序期望得到的信息,這些信息是該程序在處理或響應URL請求時需要的。傳遞給application:handleOpenURL:方法的NSURL對象表示的是Cocoa Touch框架中的URL。NSURL遵循RFC 1808規範,該類中包含一些方法,用於返回RFC 1808定義的各個URL要素,包括用戶名、密碼、請求、片斷、和參數字符串。與您註冊的定製模式相對應的“協議”可以使用這些URL要素來傳遞各種信息。

在程序清單1-2顯示的application:handleOpenURL:方法實現中,傳入的URL對象在其請求和片斷部分帶有具體應用程序的信息。應用程序委託抽出這些信息—在這個例子中,是指一個to-do任務的名稱和到期日—並根據這些信息創建應用程序的模型對象。

 

在主應用程序中通過訪問自定義URL啓動另外一個應用:(test已經安裝,這段代碼要寫在另一個應用裏面,比如test02

 

2.3    自定義處理URL(在test中)

有些時候我們除了啓動還需向另外一個應用發送參數,這是也可以通過自定義的URL來實現,如:

test://

test://com.company.test

test://config=1&abar=2

這時我們在被啓動應用中就必須進行自定義處理,在AppDelegate中實現該消息(Cocos2d加在AppDelegate),例如:

-(BOOL)application:(UIApplication *)application handleOpenURL:(NSURL*)url { //Do something withthe url here }

 

在程序清單1-2顯示的application:handleOpenURL:方法實現中,傳入的URL對象在其請求和片斷部分帶有具體應用程序的信息。應用程序委託抽出這些信息—在這個例子中,是指一個to-do任務的名稱和到期日—並根據這些信息創建應用程序的模型對象。

程序清單1-2  處理基於定製模式的URL請求

[cpp]view plaincopyprint?

 

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

  

    if ([[url scheme] isEqualToString:@"todolist"]) {  

  

        ToDoItem *item = [[ToDoItem alloc] init];  

  

        NSString *taskName = [url query];  

  

        if (!taskName || ![self isValidTaskString:taskName]) { // must have a task name  

  

            [item release];  

  

            return NO;  

  

        }  

  

        taskName = [taskName stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding];  

  

   

  

        item.toDoTask = taskName;  

  

        NSString *dateString = [url fragment];  

  

        if (!dateString || [dateString isEqualToString:@"today"]) {  

  

            item.dateDue = [NSDate date];  

  

        } else {  

  

            if (![self isValidDateString:dateString]) {  

  

                [item release];  

  

                return NO;  

  

            }  

  

            // format: yyyymmddhhmm (24-hour clock)  

  

            NSString *curStr = [dateString substringWithRange:NSMakeRange(0, 4)];  

  

            NSInteger yeardigit = [curStr integerValue];  

  

            curStr = [dateString substringWithRange:NSMakeRange(4, 2)];  

  

            NSInteger monthdigit = [curStr integerValue];  

  

            curStr = [dateString substringWithRange:NSMakeRange(6, 2)];  

  

            NSInteger daydigit = [curStr integerValue];  

  

            curStr = [dateString substringWithRange:NSMakeRange(8, 2)];  

  

            NSInteger hourdigit = [curStr integerValue];  

  

            curStr = [dateString substringWithRange:NSMakeRange(10, 2)];  

  

            NSInteger minutedigit = [curStr integerValue];  

  

            NSDateComponents *dateComps = [[NSDateComponents alloc] init];  

  

            [dateComps setYear:yeardigit];  

  

            [dateComps setMonth:monthdigit];  

  

            [dateComps setDay:daydigit];  

  

            [dateComps setHour:hourdigit];  

  

            [dateComps setMinute:minutedigit];  

  

            NSCalendar *calendar = [NSCalendar currentCalendar];  

  

            NSDate *itemDate = [calendar dateFromComponents:dateComps];  

  

            if (!itemDate) {  

  

                [dateComps release];  

  

                [item release];  

  

                return NO;  

  

            }  

  

            item.dateDue = itemDate;  

  

            [dateComps release];  

  

        }  

  

        [(NSMutableArray *)self.list addObject:item];  

  

        [item release];  

  

        return YES;  

  

    }  

  

    return NO;  

 

3    調用IOS自帶的應用

3.1    調用App Store方法

在實際開發中,往往要推薦自己其他應用和推薦自己的收費軟件,那麼我們就需要在程序中直接連接到app store的相應頁面。

實際上的做法很簡單,使用的還是UIApplication類的OpenURL方法: 

[[UIApplication sharedApplication] openURL:[NSURLURLWithString:@"程序的相應連接"]];

3.2    調用其它系統應用的方法

1)調用 自帶mail


[[UIApplicationsharedApplication] openURL:[NSURLURLWithString:@"mailto://[email protected]"]];

2)調用 電話phone


[[UIApplication sharedApplication]openURL:[NSURLURLWithString:@"tel://8008808888"]];


3)調用 SMS


[[UIApplicationsharedApplication] openURL:[NSURLURLWithString:@"sms://800888"]];


4)調用自帶 瀏覽器 safari


[[UIApplicationsharedApplication]openURL:[NSURLURLWithString:@"http://www.hzlzh.com"]];

5)調用 Remote


[[UIApplicationsharedApplication] openURL:[NSURLURLWithString:@"remote://fff"]];

 

上面是最基本的語句,沒什麼處理過程。

如:調用phone可以傳遞號碼,調用SMS只能設定號碼,不能初始化SMS內容。

 

4    參考鏈接

IOS-應用之間調用

http://blog.csdn.net/likendsl/article/details/7553605

 

Apple URL Scheme Reference

https://developer.apple.com/library/ios/featuredarticles/iPhoneURLScheme_Reference/Introduction/Introduction.html

 

(Good)自定義URL Scheme 完全指南

http://www.cocoachina.com/industry/20140522/8514.html

 

(Good)iOS App 自定義 URL Scheme 設計

http://www.cocoachina.com/ios/20120529/4302.html

  

發佈了44 篇原創文章 · 獲贊 5 · 訪問量 7萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章