iPhone/iOS SDK 最酷的特性之一就是應(yīng)用將其自身“綁定”到一個(gè)自定義URL Scheme上,該Scheme用于從瀏覽器或其他應(yīng)用中啟動(dòng)本應(yīng)用。
(實(shí)現(xiàn)功能:在應(yīng)用一中打開應(yīng)用二)
應(yīng)用二需要實(shí)現(xiàn):
在應(yīng)用二中注冊(cè)自定義URL Scheme
URL Schemes 是一個(gè)數(shù)組懈费,運(yùn)行應(yīng)用定義多個(gè) URL Scheme。key Item0的value就是你自定義的url博脑,此時(shí)你的自定義url為 myapp://憎乙。
在應(yīng)用二中實(shí)現(xiàn)application:openURL:options:的代理
- (BOOL)application:(UIApplication *)application openURL:(nonnullNSURL *)url options:(nonnullNSDictionary<NSString *,id> *)options {
NSLog(@"Calling Application Bundle ID: %@", options[UIApplicationOpenURLOptionsSourceApplicationKey]);
NSLog(@"URL scheme: %@", [urlscheme]);
NSLog(@"URL query: %@", [urlquery]);
return YES;
}
Calling Application Bundle ID,是應(yīng)用一的BundlerID,你可以用這個(gè)來確保只有你定義的應(yīng)用可以與你的應(yīng)用直接交互叉趣。
URL scheme:你自己的url
URL query: 從應(yīng)用一傳遞過來的參數(shù)
有一點(diǎn)要特別注意泞边,你不能阻止其他應(yīng)用通過自定義 URL scheme 調(diào)用你的應(yīng)用,然而你可以跳過后續(xù)的操作并返回 NO疗杉,就像上面的代碼那樣阵谚。也就是說,如果你想阻止其它應(yīng)用調(diào)用你的應(yīng)用烟具,創(chuàng)建一個(gè)與眾不同的 URL scheme梢什。盡管這不能保證你的應(yīng)用不會(huì)被調(diào)用,但至少大大降低了這種可能性净赴。
應(yīng)用一需要實(shí)現(xiàn):
首先需要配置白名單绳矩,在iOS9中,如果使用URL Schemes玖翅,就必須在Info.plist中將你要在外部調(diào)用的URL Schemes列為白名單翼馆,否則不能使用。
設(shè)置白名單的key是LSApplicationQueriesSchemes金度。
然后在應(yīng)用一中应媚,在你需要跳轉(zhuǎn)的地方實(shí)現(xiàn)下面的代碼:
- (void)btnClick:(UIButton *)btn {
NSString *customURL =@"myapp://?token=123abct®istered=1";
NSURL *url = [NSURLURLWithString:customURL];
if ([[UIApplicationsharedApplication] canOpenURL:url]) {
NSLog(@"can go to test");
[[UIApplicationsharedApplication] openURL:url];
} else {
NSLog(@"can not go to test");
}
}
注意:
- 通過自定義URL Schemes向應(yīng)用傳遞參數(shù)。因?yàn)镹SURL作為一個(gè)從一個(gè)應(yīng)用調(diào)用另一個(gè)的基礎(chǔ)猜极,遵循RFC 1808標(biāo)準(zhǔn)中姜,基于網(wǎng)頁內(nèi)容的URL格式也可以在這里適用。
代碼中就定義了token和registerd兩個(gè)參數(shù)跟伏。
2.url中的 [url scheme]必須和應(yīng)用二中自定義的url一樣丢胚。
3.在跳轉(zhuǎn)之前先用canOpenURL方法檢查你的手機(jī)中是否安裝了應(yīng)用二,如果安裝了再使用openURL跳轉(zhuǎn)受扳。
通過網(wǎng)頁中的網(wǎng)址打開應(yīng)用:
<a href="" id="openApp">打開應(yīng)用二</a>
<script type="text">
document.getElementById('openApp').onclick = function(e){
// 通過iframe的方式試圖打開APP携龟,如果能正常打開,會(huì)直接切換到APP勘高,并自動(dòng)阻止a標(biāo)簽的默認(rèn)行為
// 否則打開a標(biāo)簽的href鏈接
var ifr = document.createElement('iframe');
ifr.src = 'myapp://com.martin.app';
ifr.style.display = 'none';
document.body.appendChild(ifr);
window.setTimeout(function(){
document.body.removeChild(ifr);
},3000)
};
</script>