我們經(jīng)常會(huì)碰到一個(gè)情況,就是需要一個(gè)呼起另外一個(gè)App,比如我們想要呼起微信,去分享一些東西,同時(shí)在微信分享完成之后,又希望微信能夠給我們一些反饋信息,告訴我們是否成功。在iOS9之前,能夠來(lái)呼起一個(gè)App的只有通過(guò)URL Schemes。從一個(gè)很不專(zhuān)業(yè)的角度講,scheme其實(shí)就可以代表一個(gè)app的稱(chēng)呼,同時(shí)又是一個(gè)url的頭部。
1.什么是URL
通常port只會(huì)在直接用IP地址訪問(wèn)時(shí)才會(huì)用到:
例:http://search.jd.com/Search?keyword=哈利波特8&enc=utf-8
在這個(gè)例子中http是scheme,search.jd.com是host,Search是path,enc是queryparam
在iOS中(其實(shí)不僅iOS,Android,甚至Mac中也是這樣),一個(gè)scheme是由一個(gè)app開(kāi)發(fā)者自己確定,比如微信的scheme有wechat和weixin兩種。
可以打開(kāi)Xcode,在Info -> URL Types 中,點(diǎn)擊+ ,即可為自己的App添加一個(gè)自己的Scheme

添加完了后,你可以在safari中輸入 Mescheme://做一下測(cè)試,你會(huì)發(fā)現(xiàn)會(huì)提示你是否需要呼起 your app。
在這里有幾點(diǎn)需要注意:
1.由于scheme完全是用戶(hù)自添加行為,蘋(píng)果不參與干涉,所以可能出現(xiàn)多個(gè)app設(shè)置相同的scheme,之前看到的蘋(píng)果稱(chēng)這種情況是未知的,我這邊測(cè)試完之后,感覺(jué)這個(gè)跟bundle id相關(guān)。
2.在判斷 和 呼起 另外一個(gè)app時(shí),蘋(píng)果對(duì)scheme的大小寫(xiě)是不敏感的。!但是!在被呼起的App內(nèi)部獲取scheme的時(shí)候,會(huì)獲得原始的scheme拼寫(xiě)值,這個(gè)時(shí)候就不能保證這個(gè)app在處理的時(shí)候是否對(duì)大小寫(xiě)敏感了。
2.如何通過(guò)URL呼起
1.手動(dòng)測(cè)試,在safari中輸入,但是這種情況如果url中存在反斜杠,可能出現(xiàn)一種能呼起,但是不能在呼起的app中做預(yù)期的操作
2.使用UIWebView來(lái)Load,注意只能用UIWebView,WKWebView不行。
[糾正],在iOS10以下時(shí),Scheme URL可以當(dāng)做HTTP URL一樣來(lái)通過(guò)UIWebview load,并呼起對(duì)應(yīng)Scheme的App,但是iOS 10上測(cè)試發(fā)現(xiàn)已經(jīng)不行。
3.推薦使用的是調(diào)用原生的Code:
NSURL *url = [NSURL URLWithString:@"weixin://"]; [[UIApplication sharedApplication] openURL:url];
openURL這個(gè)方法會(huì)返回一個(gè)BOOL來(lái)通知是否正常呼起,而在iOS 10中,已經(jīng)不建議使用該方法了,推薦使用
- (void)openURL:(NSURL*)url options:(NSDictionary*)options completionHandler:(void (^ __nullable)(BOOL success))completion NS_AVAILABLE_IOS(10_0) NS_EXTENSION_UNAVAILABLE_IOS("");
新的方法將會(huì)使用異步的方式執(zhí)行,同時(shí)會(huì)在主線程進(jìn)行completion操作。
options其實(shí)內(nèi)容與接收端的openUrl方法是對(duì)應(yīng),我還沒(méi)有用到過(guò),因?yàn)槠渲杏袃蓚€(gè)參數(shù)其實(shí)跟我們現(xiàn)在講的這種case關(guān)系不大,而對(duì)于空的options,執(zhí)行相當(dāng)于老方法。
3.如何處理URL
在接收端也有多個(gè)方法,但是推薦使用下面這個(gè)方法
- (BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary*)options NS_AVAILABLE_IOS(9_0);
其中URL與2中的呼起的URL是一致的。
當(dāng)你嵌入了多個(gè)SDK的時(shí)候,可以先通過(guò)url的scheme來(lái)判斷是哪個(gè)SDK的App回呼的時(shí)候傳來(lái)的URL,因?yàn)椴皇敲總€(gè)SDK都會(huì)對(duì)于不是自己可操作的URL返回一個(gè)NO。
另外options種有一個(gè)Key UIApplicationOpenURLOptionsSourceApplicationKey可以得知對(duì)方的bundle id。