應(yīng)用間跳轉(zhuǎn)、通信

應(yīng)用間跳轉(zhuǎn)

?app應(yīng)用的跳轉(zhuǎn)的原理

?如何實現(xiàn)兩個app應(yīng)用之間的跳轉(zhuǎn)

?如何實現(xiàn)兩個app之間跳轉(zhuǎn)到指定的頁面

一:應(yīng)用的跳轉(zhuǎn)原理

從一個應(yīng)用跳轉(zhuǎn)到另一個應(yīng)用并不陌生,常見于第三方登錄,分享,支付等。集成起來也很簡單,跟著第三方sdk集成文檔,通常sdk集成都需要在工程中配置一堆東西,需要配置的URL Schemes:

1、概念補充

?協(xié)議:雙方互相遵守的一種規(guī)范,只有遵守共同的協(xié)議規(guī)范才能進行彼此的通信。比如最熟悉的網(wǎng)絡(luò)協(xié)議--NSURL

?URL:資源的路徑或地址。在IOS中有一個專門用于包裝資源路徑的類--NSURL

?一個完整URL的組成

例如:http://123.0.0.1/path?page=100

“http://”:協(xié)議類型

“123.0.0.1”:服務(wù)器ip地址

“/path”:資源存放的是路徑

“page=100”:請求的參數(shù)

?NSURL包裝一個完整地址

NSURL *url = [NSURL URLWithString:@"http://123.0.0.1/path?page=100"];

NSLog(@"scheme(協(xié)議):%@",url.scheme);

NSLog(@"host(域名):%@",url.host);

NSLog(@"path(路徑):%@",url.path);

NSLog(@"query(參數(shù)):%@",url.query);

打印結(jié)果如下:

2016-12-0214:50:38.442 TestDemo[5632:406869] scheme(協(xié)議):http2016-12-0214:50:38.442 TestDemo[5632:406869] host(域名):123.0.0.12016-12-0214:50:38.442 TestDemo[5632:406869] path(路徑):/path2016-12-0214:50:38.442 TestDemo[5632:406869] query(參數(shù)):page=100

2:跳轉(zhuǎn)的原理

在iOS中,從一個app打開另一個app,必然牽扯到兩個app之間的通信和交互,像這種涉及到整個應(yīng)用程序?qū)用娴氖虑椋O果有一個專門的類來管理--UIApplication。在ios中UIApplication其實代表的應(yīng)用程序。我們要打開另一個應(yīng)用程序,如何實現(xiàn)呢?

/** 通過應(yīng)用程序打開一個資源路徑@param url 資源路徑的地址@return 返回成功失敗的信息 */

- (BOOL)openURL:(NSURL*)url;

它的一些我們非常熟悉的用法:

//撥打系統(tǒng)電話

NSURL *url = [NSURL URLWithString:@"tel://10086"];?

[[UIApplication sharedApplication] openURL:url];

//發(fā)送系統(tǒng)短信

NSURL *url = [NSURL URLWithString:@"sms://1383838438"];

?[[UIApplication sharedApplication] openURL:url];

只要執(zhí)行以上兩個方法就會從你當(dāng)前的應(yīng)用跳轉(zhuǎn)到系統(tǒng)的撥打電話界面、發(fā)送短信界面,這就是應(yīng)用間的跳轉(zhuǎn)??梢赃@樣理解:撥打電話、發(fā)送短信他兩就是手機自帶的兩個app頁面。

我們仔細分析下傳給它們的NSURL參數(shù),就會發(fā)現(xiàn)NSURL的scheme(協(xié)議)不一樣,打電話時"tel://"協(xié)議,發(fā)短信時"sms://"協(xié)議

一個總結(jié):一個應(yīng)用可以打開另一個應(yīng)用的必然條件是,另一個應(yīng)用必須配置scheme(協(xié)議),這樣應(yīng)用程序才能根據(jù)協(xié)議找到需要打開的應(yīng)用。

二、實現(xiàn)兩個app間的跳轉(zhuǎn)

創(chuàng)建兩個示例demo,TestDemo和Test2Demo,現(xiàn)在需要實現(xiàn)從Test2Demo跳轉(zhuǎn)到TestDemo中
1、在被跳轉(zhuǎn)的TestDemo中配置一個協(xié)議scheme,這里命名為test(名字可以隨意配置,最好是英文并且和項目相關(guān))

targets -> info -> URL Types ->URL Scheme ->填寫協(xié)議


配置協(xié)議

注意:不需要填寫成"test://"

2、在Test2Demo執(zhí)行跳轉(zhuǎn)的方法中實現(xiàn)下面的方法

-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{

? ? ? ? ? ?NSURL *url = [NSURL URLWithString:@"test://"];

? ? ? ? ? ?if ([[UIApplication sharedApplication] canOpenURL:url]) { ? ?

? ? ? ? ? ? ? ? ? ?[[UIApplication sharedApplication] openURL:url];??

? ? ? ? ? ?}else{

? ? ? ? ? ? ? ? ? ?NSLog(@"沒有安裝應(yīng)用");

? ? ? ? ? }

}

如果是iOS9.0以下,已經(jīng)大功告成了。但是,如果是iOS9.0以后,請看下一步。

3、配置協(xié)議的白名單

在Test2Demo的info.plist文件中增加一個LSApplicationQueriesSchemes字段,把它設(shè)置為數(shù)組類型,并配置需要跳轉(zhuǎn)的協(xié)議名單


配置協(xié)議的白名單

到此,兩個應(yīng)用間的跳轉(zhuǎn)已經(jīng)完全實現(xiàn),總結(jié)其實只有三步。很多情況下,我們需要跳轉(zhuǎn)到另一個應(yīng)用的指定頁面,如何處理請往下看。

三、跳轉(zhuǎn)到指定的界面

想要跳轉(zhuǎn)到指定的界面,必然是上一個app告訴下一個app(被跳轉(zhuǎn)的app)需要跳轉(zhuǎn)到哪個界面,如何告訴它便涉及到兩個app間的通信。從上面可以知道,兩個app之間的跳轉(zhuǎn)只需要配置一個scheme,然后通過UIApplication調(diào)用它的對象方法openURL:即可實現(xiàn),除此之外再也沒有任何代碼了。而這之間是如何通信的呢?

1、在"test://"協(xié)議后面的域名加上一些字段用來標記需要跳轉(zhuǎn)的界面

//進入更多界面

- (IBAction)intoMore:(id)sender {

NSURL *url = [NSURL URLWithString:@"test://more"];

if ([[UIApplication sharedApplication] canOpenURL:url]) {??

? ? ? [[UIApplication sharedApplication] openURL:url];? ?

?}else{

? ? ? NSLog(@"沒有安裝應(yīng)用");

}

}

//進入設(shè)置界面

- (IBAction)intoSet:(id)sender {

NSURL *url = [NSURL URLWithString:@"test://set"];

??if ([[UIApplication sharedApplication] canOpenURL:url]) { ? ? ?

? ? ? ? ?[[UIApplication sharedApplication] openURL:url];? ? }

else{

? ? ? ? ?NSLog(@"沒有安裝應(yīng)用");

}

}

2、來到被跳轉(zhuǎn)的應(yīng)用TestDemo的AppDelegate類的.m文件中,監(jiān)聽其代理方法application:handleOpenURL:

//當(dāng)應(yīng)用程序?qū)⒁黄渌绦虼蜷_時,會先執(zhí)行此方法,并傳遞url過來//注:下面這個方法9.0后就過期了,請注意適配,9.0后用這個方法:application:openURL:options:

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

NSLog(@"url:%@",url.absoluteString);

NSLog(@"host:%@",url.host);

if ([url.host isEqualToString:@"more"]) {

? ? ? NSLog(@"進入更多界面");//到此做界面的跳轉(zhuǎn)?

?? }

if ([url.host isEqualToString:@"set"]) {

? ? ?NSLog(@"進入設(shè)置界面");//到此做界面的跳轉(zhuǎn)? ??

}

returnYES;

}

當(dāng)Test2Demo點擊進入更多界面打印如下:

2016-12-0217:11:17.680 TestDemo[6507:495044] url:test://more2016-12-0217:11:17.681 TestDemo[6507:495044] host:more2016-12-0217:11:17.681 TestDemo[6507:495044] 進入更多界面

當(dāng)Test2Demo點擊進入設(shè)置界面打印如下:

2016-12-0217:10:38.745 TestDemo[6507:495044] url:test://set2016-12-0217:10:38.745 TestDemo[6507:495044] host:set2016-12-0217:10:38.745 TestDemo[6507:495044] 進入設(shè)置界面

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容