iOS URL Schemes唤醒App
1. 系统相关
| 应用名称 | URL Scheme |
|---|---|
| 短信 | sms:// |
| app store | itms-apps:// |
| 电话 | tel:// |
| 无线局域网 | App-Prefs:root=WIFI |
| 蓝牙 | App-Prefs:root=Bluetooth |
| 蜂窝移动网络 | App-Prefs:root=MOBILE_DATA_SETTINGS_ID |
| 个人热点 | App-Prefs:root=INTERNET_TETHERING |
| 运营商 | App-Prefs:root=Carrier |
| 通知 | App-Prefs:root=NOTIFICATIONS_ID |
| 通用 | App-Prefs:root=General |
| 通用-关于本机 | App-Prefs:root=General&path=About |
| 通用-键盘 | App-Prefs:root=General&path=Keyboard |
| 通用-辅助功能 | App-Prefs:root=General&path=ACCESSIBILITY |
| 通用-语言与地区 | App-Prefs:root=General&path=INTERNATIONAL |
| 通用-还原 | App-Prefs:root=Reset |
| 墙纸 | App-Prefs:root=Wallpaper |
| Siri | App-Prefs:root=SIRI |
| 隐私 | App-Prefs:root=Privacy |
| Safari | App-Prefs:root=SAFARI |
| 音乐 | App-Prefs:root=MUSIC |
| 音乐-均衡器 | App-Prefs:root=MUSIC&path=com.apple.Music:EQ |
| 照片与相机 | App-Prefs:root=Photos |
| FaceTime | App-Prefs:root=FACETIME |
2. 应用相关
| 应用名称 | URL Scheme |
|---|---|
| 微博 | weibo:// |
| mqq:// | |
| QQ群组 | mqqapi://card/show_pslcard?src_type=internal&version=1&card_type=group&uin={QQ群号} |
| QQ联系人 | mqqapi://card/show_pslcard?src_type=internal&version=1&uin={QQ号码} |
| 支付宝 | alipay:// |
| 微信 | weixin:// |
| 微信 | wechat:// |
| 微信-扫一扫 | weixin://dl/scan |
| 微信-反馈 | weixin://dl/feedback |
| 微信-朋友圈 | weixin://dl/moments |
| 微信-设置 | weixin://dl/settings |
| 微信-消息通知设置 | weixin://dl/notifications |
| 微信-聊天设置 | weixin://dl/chat |
| 微信-通用设置 | weixin://dl/general |
| 微信-公众号 | weixin://dl/officialaccounts |
| 微信-游戏 | weixin://dl/games |
| 微信-帮助 | weixin://dl/help |
| 微信-个人信息 | weixin://dl/profile |
| 微信-功能插件 | 微信-功能插件 |
| 虾米音乐 | xiami:// |
| chrome | googlechrome:// |
| 微博国际版 | weibointernational:// |
| 摩拜单车 | mobike:// |
| ofo | ofoapp:// |
| 有道云笔记 | youdaonote:// |
| 印象笔记 | evernote:// |
| 今日头条 | snssdk141:// |
| 网易新闻 | 网易新闻 |
| 网易云音乐 | orpheuswidget:// |
| QQ音乐 | qqmusic:// |
| QQ音乐最近播放 | qqmusic://today?mid=31&k1=2&k4=0 |
| 美团外卖 | meituanwaimai:// |
| 美团 | imeituan:// |
| Gmail | googlegmail:// |
| 网易邮箱 | neteasemail:// |
| QQ邮箱 | qqmail:// |
| 腾讯视频 | tenvideo:// |
| 爱奇艺 | iqiyi:// |
| 12306 | cn.12306:// |
| 有道词典 | yddict:// |
| 钉钉 | dingtalk:// |
3. URL Schemes
由于苹果采用的特殊的方式防护用户数据安全,就是我们常说的沙盒方式。一个程序只能访问其特定指定的内存空间,对于其他空间是无法访问。这就造成了一个问题就是,如果我们想要通过一个程序A,来唤醒程序B,并且与B交互的话就很困难。好在我们有一个方式 通过 URL Schemes.
对于URL Schemes,很像我们一个网页的URL.我们可以这么比方。对于一个浏览器Chrome来说,一个个网站:百度,谷歌,淘宝,京东等。类比手机可以说 Chrome 就是我们的手机。百度,谷歌,等就是我们手机上一个个的应用程序。现在我们需要在应用程序之间相互唤醒。那么我们就需要 URL Schemes 来操作。
例如 weixin://dl/moments中weixin就是微信的Scheme。完全可以按照一个URL的方式来理解Scheme。
注意
- 所有的网页都有
url,但不是所有的应用程序都有自己的scheme,更不是每个应用程序的功能都有scheme。 - 一个网址只对应一个网页,但并非每个
URL Scheme都只对应一款产品。因为苹果没有对URL Scheme不允许重复有硬性要求。 - 一般网页的
URL比较好预测。但是iOS上的URL Scheme是我们自己定义,没有统一标准,不好预测。
4. 注册自定义 URL Scheme
- 在项目中
Xcode Project Navigator中找到info.plist,点击添加URL Types. - 其中
URL Types是一个数组,点击打开Item 0,继续点击打开Item 0为一个字典,点击打开其中有URL identifier一般设置其值为我们项目Bundle ID - 在打开的
Item 0中点击继续添加,下拉选择URL Schemes,这里是一个数组,你可以定义多个。例如定义Lee。
这里定义
URL Schemes是不需要://,只需要字符串就行。
- 定义好之后我们可以直接拿浏览器进行验证,输入
Lee://
5. 测试自定义 URL Scheme
- 新建工程B,创建按钮。打开工程A
NSString *url = @"Lee://";
if ([[UIApplication sharedApplication] canOpenURL:[NSURL URLWithString:url]]) {
[[UIApplication sharedApplication] openURL:[NSURL URLWithString:url] options:@{} completionHandler:nil];
}else{
NSLog(@"打不开");
}
可能会打不开,因为我们么有在工程B中没有添加
query schemes
- 在工程B中添加
query schemes
- 在B中打开
info.plist - 点击使用
Open As Source Code方式打开 - 添加如下代码
<key>LSApplicationQueriesSchemes</key>
<array>
<string>zhunaer</string>
</array>
6. 通过 URL Scheme传值
B工程通过 URL Scheme 传值到A工程。可以通过类似于URL拼接参数一样的进行拼接。
例如:@"Lee://?name=xxx&age=22" 方式
B工程完整代码:
NSString *url = @"Lee://?name=xxx&age=22";
if ([[UIApplication sharedApplication] canOpenURL:[NSURL URLWithString:url]]) {
[[UIApplication sharedApplication] openURL:[NSURL URLWithString:url] options:@{} completionHandler:nil];
}else{
NSLog(@"打不开");
}
对于iOS新接口
[[UIApplication sharedApplication] openURL:URL options:@{} completionHandler:nil];
目前
options可传入参数Key在UIApplication头文件只有一个:UIApplicationOpenURLOptionUniversalLinksOnly,其对应的Value为布尔值,默认为False.如该Key对应的Value为True,那么打开所传入的Universal Link时,只允许通过这个Link所代表的iOS应用跳转的方式打开这个链接,否则就会返回success为false,也就是说只有安装了Link所对应的App的情况下才能打开这个Universal Link,而不是通过启动Safari方式打开这个Link的代表的网站.
A工程完成代码:
func application(_ app: UIApplication, open url: URL, options: [UIApplication.OpenURLOptionsKey : Any] = [:]) -> Bool {
NSLog("calling application bundle id: %@",options);
NSLog("url shceme:\(url.scheme!)");
NSLog("参数:\(url.query!)");
return true
}
/**
calling application bundle id: {
UIApplicationOpenURLOptionsOpenInPlaceKey = 0;
UIApplicationOpenURLOptionsSourceApplicationKey = "com.rookie.T";
}
url shceme:Lee
参数:name=xxx&age=22
*/