iOS9 - 自定义URL Scheme完成应用间的跳转
2015-10-23 17:24
519 查看
iPhone/iOS SDK 最酷的特性之一就是应用将其自身“绑定”到一个自定义URL Scheme上,该Scheme用于从浏览器或其他应用中启动本应用。
(在应用一中打开应用二)
应用二:
在应用二中注册自定义URL Scheme
URL Schemes 是一个数组,运行应用定义多个 URL Scheme。key Item0的value就是你自定义的url,此时你的自定义url为 may://。
在应用二中实现application:openURL:options:的代理
2015-10-23 16:54:05.235 Test2[1852:84734] myapp://11111111
2015-10-23 16:54:05.236 Test2[1852:84734] {
UIApplicationOpenURLOptionsOpenInPlaceKey = 0;
UIApplicationOpenURLOptionsSourceApplicationKey = "com.aini25.Test1";
}
- (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,是应用一的BundlerID,你可以用这个来确保只有你定义的应用可以与你的应用直接交互。
URL scheme:你自己的url
URL query: 从应用一传递过来的参数
有一点要特别注意,你不能阻止其他应用通过自定义 URL scheme 调用你的应用,然而你可以跳过后续的操作并返回 NO,就像上面的代码那样。也就是说,如果你想阻止其它应用调用你的应用,创建一个与众不同的
URL scheme。尽管这不能保证你的应用不会被调用,但至少大大降低了这种可能性。
应用一:
首先需要配置白名单,在iOS9中,如果使用URL Schemes,就必须在Info.plist中将你要在外部调用的URL Schemes列为白名单,否则不能使用。
设置白名单的key是LSApplicationQueriesSchemes。
然后在应用一中,在你需要跳转的地方实现下面的代码:
- (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");
}
}
注意:
1. 通过自定义URL Schemes向应用传递参数。因为NSURL作为一个从一个应用调用另一个的基础,遵循RFC 1808标准,基于网页内容的URL格式也可以在这里适用。
代码中就定义了token和registerd两个参数。
2.url中的 [url scheme]必须和应用二中自定义的url一样。
3.在跳转之前先用canOpenURL方法检查你的手机中是否安装了应用二,如果安装了再使用openURL跳转。
通过网页中的网址打开应用:
<a href="https://itunes.apple.com/cn/app/id955654588"
id="openApp">贴吧客户端</a>
<script
type="text/javascript">
document.getElementById('openApp').onclick =
function(e){
// 通过iframe的方式试图打开APP,如果能正常打开,会直接切换到APP,并自动阻止a标签的默认行为
//
否则打开a标签的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>
(在应用一中打开应用二)
应用二:
在应用二中注册自定义URL Scheme
URL Schemes 是一个数组,运行应用定义多个 URL Scheme。key Item0的value就是你自定义的url,此时你的自定义url为 may://。
在应用二中实现application:openURL:options:的代理
2015-10-23 16:54:05.235 Test2[1852:84734] myapp://11111111
2015-10-23 16:54:05.236 Test2[1852:84734] {
UIApplicationOpenURLOptionsOpenInPlaceKey = 0;
UIApplicationOpenURLOptionsSourceApplicationKey = "com.aini25.Test1";
}
- (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,是应用一的BundlerID,你可以用这个来确保只有你定义的应用可以与你的应用直接交互。
URL scheme:你自己的url
URL query: 从应用一传递过来的参数
有一点要特别注意,你不能阻止其他应用通过自定义 URL scheme 调用你的应用,然而你可以跳过后续的操作并返回 NO,就像上面的代码那样。也就是说,如果你想阻止其它应用调用你的应用,创建一个与众不同的
URL scheme。尽管这不能保证你的应用不会被调用,但至少大大降低了这种可能性。
应用一:
首先需要配置白名单,在iOS9中,如果使用URL Schemes,就必须在Info.plist中将你要在外部调用的URL Schemes列为白名单,否则不能使用。
设置白名单的key是LSApplicationQueriesSchemes。
然后在应用一中,在你需要跳转的地方实现下面的代码:
- (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");
}
}
注意:
1. 通过自定义URL Schemes向应用传递参数。因为NSURL作为一个从一个应用调用另一个的基础,遵循RFC 1808标准,基于网页内容的URL格式也可以在这里适用。
代码中就定义了token和registerd两个参数。
2.url中的 [url scheme]必须和应用二中自定义的url一样。
3.在跳转之前先用canOpenURL方法检查你的手机中是否安装了应用二,如果安装了再使用openURL跳转。
通过网页中的网址打开应用:
<a href="https://itunes.apple.com/cn/app/id955654588"
id="openApp">贴吧客户端</a>
<script
type="text/javascript">
document.getElementById('openApp').onclick =
function(e){
// 通过iframe的方式试图打开APP,如果能正常打开,会直接切换到APP,并自动阻止a标签的默认行为
//
否则打开a标签的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>
相关文章推荐
- 峰回路转,Firefox 浏览器即将重返 iOS 平台
- 峰回路转,Firefox 浏览器即将重返 iOS 平台
- 不可修补的 iOS 漏洞可能导致 iPhone 4s 到 iPhone X 永久越狱
- iOS 12.4 系统遭黑客破解,漏洞危及数百万用户
- 每日安全资讯:NSO,一家专业入侵 iPhone 的神秘公司
- [转][源代码]Comex公布JailbreakMe 3.0源代码
- 讲解iOS开发中基本的定位功能实现
- js判断客户端是iOS还是Android等移动终端的方法
- IOS开发环境windows化攻略
- 检测iOS设备是否越狱的方法
- .net平台推送ios消息的实现方法
- 探讨Android与iOS,我们将何去何从?
- Android、iOS和Windows Phone中的推送技术详解
- IOS 改变键盘颜色代码
- 举例详解iOS开发过程中的沙盒机制与文件
- Android和IOS的浏览器中检测是否安装某个客户端的方法
- javascript实现阻止iOS APP中的链接打开Safari浏览器
- IOS开发第三方语音-微信语音
- 解析iOS开发中的FirstResponder第一响应对象