簡述
通過對比網頁鏈接來理解iOS上的URL Schemes,應該就容易多了
URL Schemes 有兩個單詞:
- URL:我們都很清楚,http://www.apple.com 就是個URL,我們也叫他鏈接或網址
- Schemes:表示的是一個URL中的一個位置——最初始的位置,即://之前的那段字符。比如http://www.apple.com 這個網址的Schemes是http。
根據我們上面對URL Schemes的使用,我們可以很輕易地理解,在以本地應用為主的iOS上,我們可以像定位一個網頁一樣,用一種特殊的URL來定位一個應用甚至應用里某個具體的功能。而定位這個應用的,就應該這個應用的URL的Schemes部分,也就是開頭兒那部分。比如短信,就是 sms:
你可以完全按照理解一個網頁的 URL ——也就是它的網址——的方式來理解一個 iOS 應用的 URL,拿蘋果的網站和 iOS 上的微信來做個簡單對比:
通過對比網頁鏈接來理解 iOS 上的 URL Schemes,應該就容易多了。
網頁(蘋果) | iOS 應用(微信) | |
---|---|---|
網站首頁/打開應用 | http://www.apple.com | weixin:// |
子頁面/具體功能 | http://www.apple.com/mac/(Mac頁面) | weixin://dl/moments(朋友圈) |
實例:
-
首先創建A,B兩個app,通過A的點擊事件跳轉到B
項目中URL Schemes配置(被跳轉端B)
URL Schemes配置 - 說明:
- URL Type:表示可以被這些帶前綴URL打開,而不是可以打開這些帶前綴URL的app。
- identifier:表示一個標識符,自己隨便寫(我通常寫公司的反轉域名)
- URL Schemes:用來定位一個應用
prefs:實現跳轉至蘋果內置程序的url scheme,不可改變
appA:標識該應用程序的url scheme,盡量保持它的唯一性,可以被appA打開
或者直接在info.plist中設置Information Property List:
- 說明:
URL Schemes:是一個數組,可以定義多個應用的URL Schemes
- 在應用A的跳轉按鈕中設置跳轉代碼:
- (void)jumpB:(id)sender
{
//無參數
NSURL *url1 = [NSURL URLWithString:@"appB:"];
[UIApplication shareApplication] openURL:url1];
//有參數
NSString *paramStr =[NSString stringWithFormat:@"appB://username=%@&password=%@", @"小劉", @"123"];
NSURL *url2 = [NSURL URLWithString:[paramStr stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]];
[UIApplication shareApplication] openURL:url2];
}
點擊之后就可以實現跳轉應用B - 在打開應用B的過程中,此時應用B有兩種狀態:
- 第一個狀態: 應用B還沒有啟動,打開過程中就會去啟動,觸發下面的方法
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
NSLog(@"didFinishLaunchingWithOptions---B");
return YES;
} - 第二個狀態: 應用B已經啟動了,但是在后臺運行或者掛起,這個時候不會調用該方法。
- 第一個狀態: 應用B還沒有啟動,打開過程中就會去啟動,觸發下面的方法
- 如果一個應用被另外一個應用打開, 在代理方法
- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation
中判斷喚起的來源source app,根據Url所攜帶的參數進行不同的操作。比如跳轉到制定的頁面,相關的邏輯處理等等.
//當一個應用程序被其他程序打開的時候會調用這個方法,在該方法中可以實現兩個應用程序間的數據局傳遞
//當一個應用程序被其他程序打開的時候會調用這個方法,在該方法中可以實現兩個應用程序間的數據局傳遞
- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation
{
NSString *urlStr = [url absoluteString];
if ([urlStr hasPrefix:@"appB://"]) {
NSLog(@"appA request params: %@", urlStr);
urlStr = [urlStr stringByReplacingOccurrencesOfString:@"appB://" withString:@""];
NSArray *paramArray = [urlStr componentsSeparatedByString:@"&"];
NSLog(@"paramArray: %@", paramArray);
NSMutableDictionary *paramsDic = [[NSMutableDictionary alloc] initWithCapacity:0];
for (int i = 0; i < paramArray.count; i++) {
NSString *str = paramArray[i];
NSArray *keyArray = [str componentsSeparatedByString:@"="];
NSString *key = keyArray[0];
NSString *value = keyArray[1];
[paramsDic setObject:value forKey:key];
NSLog(@"key:%@ ==== value:%@", key, value);
}
}
return NO;
}
注意:在iOS9之后,還需要在info.plist中添加
LSApplicationQueriesSchemes
設置為Array,以此來提高app的安全性,需要設置URL Schemes白名單,在白名單里面的才能打開app
白名單
附:
常見的調用系統應用url
// 關于本機
About — prefs:root=General&path=About
// 輔助功能
Accessibility — prefs:root=General&path=ACCESSIBILITY
// 飛行模式
Airplane Mode On — prefs:root=AIRPLANE_MODE
// 自動鎖屏
Auto-Lock — prefs:root=General&path=AUTOLOCKB
// 調節設備背景亮度
rightness — prefs:root=Brightness
// 藍牙
Bluetooth — prefs:root=General&path=Bluetooth
// 時間與日期
Date & Time — prefs:root=General&path=DATE_AND_TIME
// FaceTime
FaceTime — prefs:root=FACETIME
// 通用
General — prefs:root=General
// 鍵盤
Keyboard — prefs:root=General&path=Keyboard
// iCloud
iCloud — prefs:root=CASTLE
// iCloud存儲空間
iCloud Storage & Backup — prefs:root=CASTLE&path=STORAGE_AND_BACKUP
// 語言與區域
International — prefs:root=General&path=INTERNATIONAL
// 定位服務
Location Services — prefs:root=LOCATION_SERVICES
// 音樂
Music — prefs:root=MUSICMusic
Equalizer — prefs:root=MUSIC&path=EQ
Music Volume Limit — prefs:root=MUSIC&path=VolumeLimit
// 網絡
Network — prefs:root=General&path=Network
Nike + iPod — prefs:root=NIKE_PLUS_IPOD
// 備忘錄
Notes — prefs:root=NOTES
// 通知
Notification — prefs:root=NOTIFICATIONS_ID
// 電話
Phone — prefs:root=Phone
// 照片
Photos — prefs:root=Photos
// 描述文件
Profile — prefs:root=General&path=ManagedConfigurationList
// 還原
Reset — prefs:root=General&path=Reset
// Safari
Safari — prefs:root=SafariSiri — prefs:root=General&path=Assistant
// 聲音
Sounds — prefs:root=Sounds
// 軟件更新
Software Update — prefs:root=General&path=SOFTWARE_UPDATE_LINK
// iTunes Store 與 APP Store
Store — prefs:root=STORE
// Twitter
Twitter — prefs:root=TWITTER
// Usage
Usage — prefs:root=General&path=USAGE
// VPN
VPN — prefs:root=General&path=Network/VPN
// 墻紙
Wallpaper — prefs:root=Wallpaper
// WIFI
Wi-Fi — prefs:root=WIFI
、、、-
當你的應用在iOS 9中需要使用 QQ/QQ空間/支付寶/微信SDK 的相關能力(分享、收藏、支付、登錄等)時,需要在“Info.plist”里增加如下代碼:
<key>LSApplicationQueriesSchemes</key>
<array>
<string>wechat</string>
<string>weixin</string><!-- 新浪微博 URL Scheme 白名單--> <string>sinaweibohd</string> <string>sinaweibo</string> <string>sinaweibosso</string> <string>weibosdk</string> <string>weibosdk2.5</string> <!-- QQ、Qzone URL Scheme 白名單--> <string>mqqapi</string> <string>mqq</string> <string>mqqOpensdkSSoLogin</string> <string>mqqconnect</string> <string>mqqopensdkdataline</string> <string>mqqopensdkgrouptribeshare</string> <string>mqqopensdkfriend</string> <string>mqqopensdkapi</string> <string>mqqopensdkapiV2</string> <string>mqqopensdkapiV3</string> <string>mqzoneopensdk</string> <string>wtloginmqq</string> <string>wtloginmqq2</string> <string>mqqwpa</string> <string>mqzone</string> <string>mqzonev2</string> <string>mqzoneshare</string> <string>wtloginqzone</string> <string>mqzonewx</string> <string>mqzoneopensdkapiV2</string> <string>mqzoneopensdkapi19</string> <string>mqzoneopensdkapi</string> <string>mqzoneopensdk</string> <!-- 支付寶 URL Scheme 白名單--> <string>alipay</string> <string>alipayshare</string> </array>