【IOS開發(fā)高級系列】App間跳轉(zhuǎn)專題

1 OpenUrl原理

????????如果一個應(yīng)用程序支持一些已知類型的URL,您就可以通過對應(yīng)的URL模式和該程序進行通訊。然而,在大多數(shù)情況下,URL只是用于簡單地啟動一個應(yīng)用程序并顯示一些和調(diào)用方有關(guān)的信息。舉例來說,對于一個用于管理地址信息的應(yīng)用程序,您就可以在發(fā)送給它的URL中包含一個Maps程序可以處理的地址,以便顯示相應(yīng)的位置。這個級別的通訊為用戶創(chuàng)造一個集成度高得多的環(huán)境,減少應(yīng)用程序重新實現(xiàn)設(shè)備上其它程序已經(jīng)實現(xiàn)的功能的必要性。

????????蘋果內(nèi)置支持http、mailto、tel、和sms這些URL模式,還支持基于http的、指向Maps、YouTube、和iPod程序的URL。應(yīng)用程序也可以自己注冊定制的URL模式。您的應(yīng)用程序可以和其它應(yīng)用程序通訊,具體方法是用正確格式的內(nèi)容創(chuàng)建一個NSURL對象,然后將它傳給共享UIApplication對象openURL:方法。openURL:方法會啟動注冊接收該URL類型的應(yīng)用程序,并將URL傳給它。當(dāng)用戶最終退出該應(yīng)用程序時,系統(tǒng)通常會重新啟動您的應(yīng)用程序,但并不總是這樣。系統(tǒng)會考慮用戶在URL處理程序中的動作及在用戶看來返回您的應(yīng)用程序是否合理,然后做出決定。

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

????????如果您的應(yīng)用程序定義了自己的URL模式,則應(yīng)該實現(xiàn)對該模式進行處理的方法,具體信息在“實現(xiàn)定制的URL模式”部分中進行描述。有關(guān)系統(tǒng)支持的URL處理,包括如何處理URL的格式,請參見蘋果的URL模式參考

2 OpenUrl實現(xiàn)APP間調(diào)用

2.1 注冊O(shè)penURL協(xié)議

????????在IOS中,實現(xiàn)一個應(yīng)用啟動另外一個應(yīng)用,使用UIApplication的openURL:方法就可實現(xiàn),這里以test跳到test02為例。(需要先創(chuàng)建這兩個工程)

????????首先被啟動的應(yīng)用需要向iPhone注冊一個自定義URL協(xié)議。這是在info.plist文件進行的。

????1. 右鍵,選擇“Add Row”

????2. Key值選擇“URL types”

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

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

????5. 選擇“URL Schemes” 作為Key。

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

????操作截圖如下:


CFBundleURLTypes屬性的鍵和值:

CFBundleURLName

? ? ? ? 這是個字符串,表示URL類型的抽象名。為了確保其唯一性,建議您使用反向DNS風(fēng)格的標(biāo)識,比如com.acme.myscheme。這里提供的URL類型名是一個指向本地化字符串的鍵,該字符串位于本地化語言包子目錄中的InfoPlist.strings文件中。本地化字符串是人類可識別的URL類型名稱,用相應(yīng)的語言來表示。

CFBundleURLSchemes

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


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

????1、連編、安裝、和運行您的應(yīng)用程序。

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

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

? ? 4、確認(rèn)您的應(yīng)用程序是否啟動,以及應(yīng)用程序委托是否收到application:handleOpenURL:消息。


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

????????應(yīng)用程序委托在application:handleOpenURL:方法中處理傳遞給應(yīng)用程序的URL請求。如果您已經(jīng)為自己的應(yīng)用程序注冊了定制的URL模式,則務(wù)必在委托中實現(xiàn)這個方法。

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

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

????在主應(yīng)用程序中通過訪問自定義URL啟動另外一個應(yīng)用:(test已經(jīng)安裝,這段代碼要寫在另一個應(yīng)用里面,比如test02)

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

????有些時候我們除了啟動還需向另外一個應(yīng)用發(fā)送參數(shù),這是也可以通過自定義的URL來實現(xiàn),如:

test://

test://com.company.test

test://config=1&abar=2

????這時我們在被啟動應(yīng)用中就必須進行自定義處理,在AppDelegate中實現(xiàn)該消息(Cocos2d加在AppDelegate中),例如:

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

????//Do something withthe url here?

}

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

程序清單1-2??處理基于定制模式的URL請求

-?(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;

????}

????returnNO;

}?


3 跳轉(zhuǎn)IOS自帶的應(yīng)用

3.1 跳轉(zhuǎn)App Store方法

????????在實際開發(fā)中,往往要推薦自己其他應(yīng)用和推薦自己的收費軟件,那么我們就需要在程序中直接連接到app store的相應(yīng)頁面。實際上的做法很簡單,使用的還是UIApplication類的OpenURL方法:?

[[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"程序的相應(yīng)連接"]];

3.2 跳轉(zhuǎn)其它系統(tǒng)應(yīng)用的方法

1)調(diào)用 自帶mail

[[UIApplication sharedApplication] openURL:[NSURLURLWithString: @"mailto://admin@hzlzh.com"]];

2)調(diào)用 電話phone

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

3)調(diào)用 SMS

[[UIApplication sharedApplication] openURL: [NSURLURLWithString: @"sms://800888"]];

4)調(diào)用自帶 瀏覽器 safari

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

5)調(diào)用 Remote

[[UIApplication sharedApplication] openURL: [NSURLURLWithString: @"remote://fff"]];


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

如:調(diào)用phone可以傳遞號碼,調(diào)用SMS只能設(shè)定號碼,不能初始化SMS內(nèi)容。


4 基于Universal Links的App跳轉(zhuǎn)

如何從微信瀏覽器中跳轉(zhuǎn)到APP指定頁面?

http://www.lxweimin.com/p/738ac2b8865d

iOS 9學(xué)習(xí)系列:打通iOS 9的通用鏈接(UniversalLinks)

http://www.cocoachina.com/ios/20150902/13321.html

4.1 什么是Universal Links呢?

????????Universal Links就是一個通用鏈接,iOS9以上的用戶,可以通過點擊這個鏈接無縫的重定向到一個app應(yīng)用,而不需要通過safari打開跳轉(zhuǎn)。如果用戶沒有安裝這個app,則會在safari中打開這個鏈接指向的網(wǎng)頁。

4.2 配置Universal Links

????1.創(chuàng)建一個名字叫做apple-app-site-association,包含固定格式的json文件??

????2.將這個文件上傳到你的服務(wù)器,可以將這個文件放到服務(wù)器的根目錄下,也可以放到.well-known這個子目錄下。??

????3.配置app,然后在app里面添加代理方法.

4.2.1 配置流程

1.apple-app-site-association文件

{

? "applinks": {

???????"apps": [],

???????"details": [

???????????{

??????????????? "appID": "teamID.bundleId”,

??????????????? "paths": ["*"]

???????????}

???????]

??? }

}

????????創(chuàng)建一個包含上述格式的json文件,文件名字必須為apple-app-site-association,且不能帶后綴名

4.2.2 appID

????appID 的 格式為teamID.bundleId形式。如何獲取teamID呢?

????登錄開發(fā)者網(wǎng)站 ,找到Membership選項卡。

????appID具體顯示就是:xxxxxxxxxxx.com.shangxinpifa.app這種

4.2.3 paths

? ? paths配置,實際上就是限制哪些路徑可以喚醒app,哪些路徑不能喚醒app。格式如下:

"paths": [

????"/wwdc/news/",?

????"NOT /videos/wwdc/2010/*",

????"/videos/wwdc/201?/*"

]

????1.使用*配置,則整個網(wǎng)站都可以使用;

????2.使用特定的URL,例如/wwdc/news/來指定某一個特殊的鏈接;

????3.在特定URL后面添加,例如/videos/wwdc/2015/, 來指定網(wǎng)站的某一部分;

????4.除了使用*來匹配任意字符,你也可以使用?來匹配單個字符,你可以在路徑當(dāng)中結(jié)合這兩個字符使用,例如 /foo/*/bar/201?/mypage;

4.2.4 配置apple-app-site-association.JSON文件

????因為主要是為了支持從微信文章中調(diào)回App,目前規(guī)劃將此JSON文件配置在微信站點根目錄下,為了支持后續(xù)擴展,也可以考慮采用請求攔截的方式來實現(xiàn),代碼如下:

4.2.5 驗證apple-app-site-association文件

https://wxtest1.cmfchina.com/apple-app-site-association

????文件配置完成之后,將其上傳到你的服務(wù)器根目錄或者.well-known這個子目錄下。

????1.確保使用https://域名.com/apple-app-site-association這個鏈接可以訪問到。

????2.也可以使用蘋果的驗證網(wǎng)站,驗證文件是否能被蘋果請求到。如果是未上線的應(yīng)用,使用驗證網(wǎng)站時可能出現(xiàn)如下提示:

????出現(xiàn)該提示為apple-app-site-association文件配置正確。

????出現(xiàn)404錯誤碼提示,則為apple-app-site-association文件未上傳成功,或者使用 https://域名.com/apple-app-site-association路徑無法訪問。


4.2.6 appIDs配置

????進入開發(fā)者網(wǎng)站,找到你自己的bundleId,可以點擊edit按鈕,開啟associate domains,并創(chuàng)建相應(yīng)的provisioning Profiles,如下圖:

????注意:配置完成之后,證書最好重新下載安裝一遍


4.2.7 項目配置

????在項目的Capablities中開啟Associated domains,如下圖:

????注意domains可以添加多個,前綴必須為applinks:,applinks:后為你的服務(wù)器的域名。


4.2.8 代碼接收UniversalLinks喚醒

????在appdelegate中實現(xiàn)上面這個方法,當(dāng)使用Universal Links喚醒app時就執(zhí)行這個方法。


4.2.9 驗證配置

????快捷驗證,在備忘錄中輸入https://yourdomain.com/goods/129893,長按這個鏈接,出現(xiàn)下圖提示則配置成功。


4.2.10 證書申請

????阿里云提供了免費的ssl證書申請

????購買之后到控制臺補全信息:

?補全信息后點擊進度查看下一步的配置工作:

????按照步驟完成配置后,10分鐘左右就會通過審核,服務(wù)器配置按照阿里云提供的文檔繼續(xù)操作即可。


4.4 常見問題

4.4.1 配置注意事項

(Good)UniversalLinks通用鏈接應(yīng)用跳轉(zhuǎn)總結(jié)以及坑

http://www.lxweimin.com/p/16374288c976


一些前人踏過的坑:

·? ? ?Universal Links will notwork if you paste the link into the browser URL field.

·? ? ?Universal Links work with a user driven element click across domains. Example: if there is a Universal * Link on?google.compointing to bnc.lt, it will open the app.

·? ? ? Universal Links will not work with a user driven? element click on the same domain. Example: if there is a Universal Link on google.com?pointing to a different Universal Link on?google.com, it will not open the app.

·? ? ? Universal Links cannot be triggered via Javascript (in window.onload or via a .click() call on an?element), unless it is part of a user action.

????總的說來,就是自從9.3.X改版之后,通用鏈接不支持域內(nèi)跳轉(zhuǎn)了,跳轉(zhuǎn)前后的兩個domain必須是不同的,否則只會safari打開。


5? 參考鏈接

IOS-應(yīng)用之間調(diào)用

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設(shè)計

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

如何從微信瀏覽器中跳轉(zhuǎn)到APP指定頁面?

http://www.lxweimin.com/p/738ac2b8865d

iOS 9學(xué)習(xí)系列:打通iOS 9的通用鏈接(UniversalLinks)

http://www.cocoachina.com/ios/20150902/13321.html

iOS 10 Universal Links(通用連接),從微信網(wǎng)頁連接跳轉(zhuǎn)到公司APP之實現(xiàn)流程詳解--2016最新版

http://blog.csdn.net/kuangdacaikuang/article/details/52958052?locationNum=12&fps=1

(Good)UniversalLinks通用鏈接應(yīng)用跳轉(zhuǎn)總結(jié)以及坑

http://www.lxweimin.com/p/16374288c976

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 227,882評論 6 531
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 98,208評論 3 414
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 175,746評論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,666評論 1 309
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 71,477評論 6 407
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 54,960評論 1 321
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,047評論 3 440
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 42,200評論 0 288
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 48,726評論 1 333
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 40,617評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,807評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,327評論 5 358
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 44,049評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,425評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,674評論 1 281
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,432評論 3 390
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 47,769評論 2 372

推薦閱讀更多精彩內(nèi)容