1. 程式人生 > >IOS開發系列——APP間相互呼叫專題【整理,部分原創】

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。

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-應用之間呼叫

Apple URL Scheme Reference

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

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

相關推薦

IOS開發系列——APP相互呼叫專題整理部分原創

APP間相互呼叫專題 1    OpenUrl原理 如果一個應用程式支援一些已知型別的URL,您就可以通過對應的URL模式和該程式進行通訊。然而,在大多數情況下,URL只是用於簡單地啟動一個應用程式並顯示一些和呼叫方有關的資訊。舉例來說,對於一個用於管理地址資訊的應用程式,

iOS開發 之 應用相互跳轉

gpo 用戶隱私 spa container 下載 containe canopen itunes cep 1. 應用間相互跳轉簡介 在iOS開發的過程中,我們經常會遇到需要從一個應用程序A跳轉到另一個應用程序B的場景。這就需要我們掌握iOS應用程序之間的相互跳轉知識。

iOS開發oc與js相互呼叫的方式方法

文章主要是介紹oc如何呼叫js 以及js的程式碼呼叫oc的方法  先上程式碼後做解釋 //oc的.m 的程式碼 //ps接下來有js的程式碼一併解析,最後會附上demo //  ViewController.m //  JSAndOC // //  Create

iOS開發app相互跳轉以及appStore和系統設定

1.app間相互跳轉 (1)兩個專案,這裡我們暫且說專案A和專案B。 (2)專案A跳轉到專案B。 步驟1:開啟專案B工程 找到info 目錄下的URL Types,點選+號進行新增,然後設定URL schemes。 (3)將專案B的URL schemes 記錄下來,以便在專

iOS巔峰之兩個App之間相互呼叫並攜帶引數傳值

1、新建兩個專案:AppOne,AppTwo; 2、分別在其屬性列表中新增如下: AppOne:   AppTwo: AppOne的 viewController.m 中新增程式碼: - (void) touchesBegan:(NSSet *)

Java SpringCloud系列(四) —— Feign(偽RPC)模式實現服務相互呼叫

首先,整個課程系列需要同學們有一定的基礎技能,分別是java、springboot、github以及基礎的Linux的知識,其中springboot是各位同學一定要掌握的,如果沒有springbo

iOS開發系列九宮格布局

使用 objc with div self. orm i++ back hab /** * 這個盡管非常easy,算是一個小技巧,可是碰到了就記錄下來吧.積跬步,致千裏嘛. */ - (void)scratchableLatex { for (int i=

iOS開發系列NSObject方法介紹

ati ber oid ring cto rgb dst -s 推斷 NSObject是OC中的基類,全部類都繼承於此,這裏面也給我們提供了非常多與“類”和“方法”相關的方法,本文將解說幾個非常有用的方法。 正文: Per

iOS開發系列課程預告

理解 一點 super tin 使用 希望 應該 字符 one 近期在Mac和iOS上做開發,認為應該寫一點東西分享給感興趣的童鞋們。在此之前。以前有非常多同行們都在埋怨蘋果Objective-C的復雜和難以上手,為此也有非常多人對今年(2014年)剛推出的Swif

IOS開發-提升app性能的25條建議和技巧

contents oar profile 討論 遊戲開發 when plist 數據庫 formats 前言 這篇文章介紹了作者開發工作中總結的25個iOS開發ti

iOS開發系列-NSOperation

control AD exe 封裝 概述 art ati task 分別是 概述 NSOperation是基於GCD的封裝更加面向對象,在使用上也是有任務跟隊列的概念,分別對應兩個類NSOperation 、NSOperationQueue NSOperation和NSOp

iOS開發系列-NSOutputStream

第一個 目標 打開 nsdata ini nsinteger sin 都是 文件寫入 NSOutputStream 創建一個NSOutputStream實例 - (nullable instancetype)initToFileAtPath:(NSString *)path

iOS開發系列-NSURLSession

公司 項目 一個 lse 執行 圖片 conn http connect 概述 NSURLSession是從iOS7開始出現的。NSURLSession比NSURLConnection簡單很多並且避免了很多坑,因此目前公司項目大部分由NSURLConnection過度為NS

iOS開發系列-Charles

監控 charles bug img option 訪問 代理 在服務器 enc 概述 Charles相當於一個插在服務器和客戶端之間的“過濾器”。當客戶端向服務器發起請求的時候,先到charles進行過濾,然後charles在把最終的數據發送給服務器; 註意:此時char

iOS開發系列-Shell腳本編譯SDK

pack export hone tput zip %d 頭文件 輸出 target 靜態庫Shell腳本 #!/bin/bash #要build的target名 target_Name="HTKit" #編譯模式 Release、Debug bu

iOS開發系列-線程同步技術

%d syn rec 互斥鎖 body 排序 解決 nta 加鎖 概述 多線程的本質就是CPU輪流隨機分配給每條線程時間片資源執行任務,看起來多條線程同時執行任務。 多條線程同時訪問同一塊資源,比如操作同一個對象、統一變量、同一個文件,就會引發數據錯亂和數據安全的問題。

App相互跳轉及圖片分享

present select window named 應用 細節 item lis jump A-app: Info--URL Types--URL Schemes:A-app(一個標識,允許別的app調用本App) info.plist 添加白名單: LSApplica

iOS開發系列--並行開發(處理多個網路請求併發的情況)

概覽 大家都知道,在開發過程中應該儘可能減少使用者等待時間,讓程式儘可能快的完成運算。可是無論是哪種語言開發的程式最終往往轉換成組合語言進而解釋成機器碼來執行。但是機器碼是按順序執行的,一個複雜的多步操作只能一步步按順序逐個執行。改變這種狀況可以從兩個角度出發:對於單核處理

使用HBuilder開發移動APP:ajax呼叫介面資料

既然要做APP,與介面互動式少不了的,除非只是想做一個純靜態的APP。所以html5+的環境準備好後,我最先開始研究的就是如何與介面互動。 使用HBuilder新建示例教程後,裡面會有一個ajax(網路請求)的列子,檔案目錄是examples/ajax.html。看了下這個檔

iOS開發APP內部切換語言

前言 iOS開發中,隨著APP越來越完善,很多APP都做了國際化,也實現了APP內部切換語言。 原理 國際化都會走到NSBundle的- (NSString *)localizedStringForKey:(NSString *)key value:(nullable NSString *)value