iOS中使用URL Scheme進(jìn)行App跳轉(zhuǎn)的教程
URL Scheme的作用
我們都知道蘋(píng)果手機(jī)中的APP都有一個(gè)沙盒,APP就是一個(gè)信息孤島,相互是不可以進(jìn)行通信的。但是iOS的APP可以注冊(cè)自己的URL Scheme,URL Scheme是為方便app之間互相調(diào)用而設(shè)計(jì)的。我們可以通過(guò)系統(tǒng)的OpenURL來(lái)打開(kāi)該app,并可以傳遞一些參數(shù)。
例如:你在Safari里輸入www.alipay.com,就可以直接打開(kāi)你的支付寶app,前提是你的手機(jī)裝了支付寶。如果你沒(méi)有裝支付寶,應(yīng)該顯示的是支付寶下載界面,點(diǎn)擊會(huì)跳到AppStore的支付寶下載界面。
URL Scheme必須能唯一標(biāo)識(shí)一個(gè)APP,如果你設(shè)置的URL Scheme與別的APP的URL Scheme沖突時(shí),你的APP不一定會(huì)被啟動(dòng)起來(lái)。因?yàn)楫?dāng)你的APP在安裝的時(shí)候,系統(tǒng)里面已經(jīng)注冊(cè)了你的URL Scheme。
一般情況下,是會(huì)調(diào)用先安裝的app。但是iOS的系統(tǒng)app的URL Scheme肯定是最高的。所以我們定義URL Scheme的時(shí)候,盡量避開(kāi)系統(tǒng)app已經(jīng)定義過(guò)的URL Scheme。
注冊(cè)URL Scheme
1.在info.plist里添加URL types
每一個(gè)項(xiàng)目里面都會(huì)有一個(gè)info.plist配置文件。找到info.plist,右鍵選擇Add Row,然后選擇URL types。如圖所示:
2.添加URL Schemes
添加完URL types,點(diǎn)擊展開(kāi)。右鍵選擇Add Row,添加URL Schemes:
3.設(shè)置URL Schemes
設(shè)置URL Schemes為iOSDevTip
4.設(shè)置URL Identifier
URL Identifier是自定義的 URL scheme 的名字,一般采用反轉(zhuǎn)域名的方法保證該名字的唯一性,比如 com.iOSStrongDemo.www
添加成功啟動(dòng)提示
為了方便測(cè)試,我們?cè)贏ppDelegate里面添加一個(gè)UIAlertView,當(dāng)app被成功打開(kāi)時(shí),會(huì)提出提示:
- (BOOL)application:(UIApplication *)application handleOpenURL:(NSURL*)url
{
// 接受傳過(guò)來(lái)的參數(shù)
NSString *text = [[url host] stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"打開(kāi)啦"
message:text
delegate:nil
cancelButtonTitle:@"OK"
otherButtonTitles:nil];
[alertView show];
return YES;
}
Safari啟動(dòng)自定義的URL Schemes APP
既然已經(jīng)配置好URL Schemes,那么我們可以來(lái)款速測(cè)試一下,我們?cè)O(shè)置的URL Schemes是否有效。打開(kāi)Safari,在地址欄里輸入:iOSDevTip://
果然成功打開(kāi):
也可以在地址欄中輸入:iOSDevTip://com.iOSStrongDemo.www。也是可以打開(kāi)注冊(cè)了URL Schemes的APP的。
通過(guò)另一個(gè)APP啟動(dòng)注冊(cè)了URL Schemes的APP
NSString *url = @"iOSDevTip://";
// NSString *url = @"iOSDevTip://com.iOSStrongDemo.www";
if ([[UIApplication sharedApplication]
canOpenURL:[NSURL URLWithString:url]])
{
[[UIApplication sharedApplication] openURL:[NSURL URLWithString:url]];
}
else
{
NSLog(@"can not open URL scheme iOSDevTip");
}
打開(kāi)注冊(cè)iOSDevTip的APP格式為: URL Scheme://URL identifier,直接調(diào)用URL Scheme也可打開(kāi)程序, URL identifier是可選的。
通過(guò)注冊(cè)的URL Scheme向目標(biāo)APP傳遞參數(shù)
通過(guò)URL Scheme啟動(dòng)APP很簡(jiǎn)單就可以做到,但有時(shí)候我們想在啟動(dòng)APP的時(shí)候傳遞一些參數(shù),這個(gè)時(shí)候我們就可以通過(guò)URL Scheme自定義URL來(lái)傳遞參數(shù)了。
昨天我們?cè)贏ppDelegate調(diào)用了UIApplicationDelegate的代理方法:
- (BOOL)application:(UIApplication *)application handleOpenURL:(NSURL*)url
{
// 接受傳過(guò)來(lái)的參數(shù)
NSString *text = [[url host] stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"打開(kāi)啦"
message:text
delegate:nil
cancelButtonTitle:@"OK"
otherButtonTitles:nil];
[alertView show];
return YES;
}
我們來(lái)看看蘋(píng)果給這個(gè)方法的注釋:
- (BOOL)application:(UIApplication *)application handleOpenURL:(NSURL *)url; // Will be deprecated at some point, please replace with application:openURL:sourceApplication:annotation:
這個(gè)方法在未來(lái)將被廢棄,可以用application:openURL:sourceApplication:annotation:來(lái)代替。
URL傳參格式
昨天我們?cè)趇OSStrongDemo注冊(cè)的URL Scheme還記得是什么嗎?你應(yīng)該還有印象的就是iOS開(kāi)發(fā)的ID:iOSDevTip。
假設(shè)我們想要傳遞兩個(gè)參數(shù)分別是名字name和手機(jī)號(hào)phone,格式如下:
iOSDevTip://?name=ligang&phone=13888888888
有沒(méi)有似曾相識(shí)的感覺(jué)。我們用get方式請(qǐng)求一個(gè)接口是不是就是這樣的。
被啟動(dòng)的APP處理傳過(guò)來(lái)的參數(shù)
- (BOOL)application:(UIApplication *)application
openURL:(NSURL *)url
sourceApplication:(NSString *)sourceApplication
annotation:(id)annotation
{
NSLog(@"sourceApplication: %@", sourceApplication);
NSLog(@"URL scheme:%@", [url scheme]);
NSLog(@"URL query: %@", [url query]);
// 接受傳過(guò)來(lái)的參數(shù)
UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"打開(kāi)啦"
message:[url query]
delegate:nil
cancelButtonTitle:@"OK"
otherButtonTitles:nil];
[alertView show];
return YES;
}
當(dāng)APP被啟動(dòng)是,會(huì)調(diào)用代理方法application:openURL:sourceApplication:annotation:。參數(shù)URL就是啟動(dòng)APP的URL,參數(shù)sourceApplication就是來(lái)源APP的Bundle ID。
我們依然通過(guò)Safari來(lái)測(cè)試,在Safari的地址欄中輸入:iOSDevTip://?name=ligang&phone=13888888888
即可打開(kāi)APP,看看參數(shù)是否傳遞過(guò)來(lái):
最后我們看一下打?。?/p>
2015-07-15 22:38:25.655 iOSStrongDemo[9983:2894855] sourceApplication: com.apple.mobilesafari 2015-07-15 22:38:28.664 iOSStrongDemo[9983:2894855] URL scheme:iosdevtip 2015-07-15 22:38:28.665 iOSStrongDemo[9983:2894855] URL query: name=ligang&phone=13888888888
sourceApplication打印出來(lái)是com.apple.mobilesafari,從這里可以看出來(lái),是從Safari啟動(dòng)我們的APP的。
我們雖然自定義了URL Scheme,但是我們不能阻止別人通過(guò)自定義的URL Scheme來(lái)打開(kāi)我們的應(yīng)用。怎么解決呢?
我們可以指定相應(yīng)的sourceApplication,也就是相應(yīng)的Bundle ID,通過(guò)Bundle ID來(lái)決定是否可以打開(kāi)我們的APP:
- (BOOL)application:(UIApplication *)application
openURL:(NSURL *)url
sourceApplication:(NSString *)sourceApplication
annotation:(id)annotation
{
NSLog(@"sourceApplication: %@", sourceApplication);
NSLog(@"URL scheme:%@", [url scheme]);
NSLog(@"URL query: %@", [url query]);
if ([sourceApplication isEqualToString:@"com.3Sixty.CallCustomURL"]){
// 接受傳過(guò)來(lái)的參數(shù)
UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"打開(kāi)啦"
message:[url query]
delegate:nil
cancelButtonTitle:@"OK"
otherButtonTitles:nil];
[alertView show];
return YES;
}else{
return NO;
}
}
這樣我們就可以通過(guò)Bundle ID來(lái)決定是否允許打開(kāi)我們的APP。
相關(guān)文章
簡(jiǎn)單講解iOS應(yīng)用開(kāi)發(fā)中的MD5加密的相關(guān)使用
這篇文章主要介紹了iOS應(yīng)用開(kāi)發(fā)中的MD5加密的相關(guān)使用,示例代碼基于傳統(tǒng)的Objective-C,需要的朋友可以參考下2015-12-12iOS開(kāi)發(fā)教程之常見(jiàn)的性能優(yōu)化技巧
這篇文章主要給大家介紹了關(guān)于iOS開(kāi)發(fā)教程之常見(jiàn)的性能優(yōu)化技巧,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用iOS具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-03-03iOS實(shí)現(xiàn)手動(dòng)和自動(dòng)屏幕旋轉(zhuǎn)
這篇文章主要為大家詳細(xì)介紹了iOS實(shí)現(xiàn)手動(dòng)和自動(dòng)屏幕旋轉(zhuǎn),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-07-07iOS中使用NSURLConnection處理HTTP同步與異步請(qǐng)求
NSURLConnection的作用現(xiàn)在已經(jīng)基本被NSURLSession所取代,所以我們簡(jiǎn)單了解下iOS中使用NSURLConnection處理HTTP同步與異步請(qǐng)求的方法即可:2016-07-07iOS如何為導(dǎo)航欄添加播放動(dòng)畫(huà)
這篇文章主要為大家詳細(xì)介紹了iOS如何為導(dǎo)航欄添加播放動(dòng)畫(huà)的方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-10-10