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
(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é)以及坑