简述
通过对比网页链接来理解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:
info设置
- 说明:
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>
网友评论