源码网商城,靠谱的源码在线交易网站 我的订单 购物车 帮助

源码网商城

iOS中使用URL Scheme进行App跳转的教程

  • 时间:2020-06-10 06:17 编辑: 来源: 阅读:
  • 扫一扫,手机访问
摘要:iOS中使用URL Scheme进行App跳转的教程
[b]URL Scheme的作用[/b] 我们都知道苹果手机中的APP都有一个沙盒,APP就是一个信息孤岛,相互是不可以进行通信的。但是iOS的APP可以注册自己的URL Scheme,URL Scheme是为方便app之间互相调用而设计的。我们可以通过系统的OpenURL来打开该app,并可以传递一些参数。 例如:你在Safari里输入www.alipay.com,就可以直接打开你的支付宝app,前提是你的手机装了支付宝。如果你没有装支付宝,应该显示的是支付宝下载界面,点击会跳到AppStore的支付宝下载界面。 URL Scheme必须能唯一标识一个APP,如果你设置的URL Scheme与别的APP的URL Scheme冲突时,你的APP不一定会被启动起来。因为当你的APP在安装的时候,系统里面已经注册了你的URL Scheme。 一般情况下,是会调用先安装的app。但是iOS的系统app的URL Scheme肯定是最高的。所以我们定义URL Scheme的时候,尽量避开系统app已经定义过的URL Scheme。 [b]注册URL Scheme[/b] 1.在info.plist里添加URL types 每一个项目里面都会有一个info.plist配置文件。找到info.plist,右键选择Add Row,然后选择URL types。如图所示: [img]http://files.jb51.net/file_images/article/201604/201642991122273.jpg?201632991139[/img] 2.添加URL Schemes 添加完URL types,点击展开。右键选择Add Row,添加URL Schemes: [img]http://files.jb51.net/file_images/article/201604/201642991159813.jpg?20163299127[/img] 3.设置URL Schemes 设置URL Schemes为iOSDevTip [img]http://files.jb51.net/file_images/article/201604/201642991223806.jpg?201632991232[/img] 4.设置URL Identifier URL Identifier是自定义的 URL scheme 的名字,一般采用反转域名的方法保证该名字的唯一性,比如 com.iOSStrongDemo.www [img]http://files.jb51.net/file_images/article/201604/201642991241207.jpg?201632991250[/img] [b]添加成功启动提示[/b] 为了方便测试,我们在AppDelegate里面添加一个UIAlertView,当app被成功打开时,会提出提示:
[u]复制代码[/u] 代码如下:
- (BOOL)application:(UIApplication *)application handleOpenURL:(NSURL*)url {     // 接受传过来的参数     NSString *text = [[url host] stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding];     UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"打开啦"                                            message:text                                           delegate:nil                                  cancelButtonTitle:@"OK"                                  otherButtonTitles:nil];     [alertView show];     return YES; }
[b]Safari启动自定义的URL Schemes APP[/b] 既然已经配置好URL Schemes,那么我们可以来款速测试一下,我们设置的URL Schemes是否有效。打开Safari,在地址栏里输入:iOSDevTip:// [img]http://files.jb51.net/file_images/article/201604/201642991258304.png?20163299139[/img] 果然成功打开: [img]http://files.jb51.net/file_images/article/201604/201642991318064.png?201632991326[/img] 也可以在地址栏中输入:iOSDevTip://com.iOSStrongDemo.www。也是可以打开注册了URL Schemes的APP的。 通过另一个APP启动注册了URL Schemes的APP
[u]复制代码[/u] 代码如下:
 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"); }
打开注册iOSDevTip的APP格式为: URL Scheme://URL identifier,直接调用URL Scheme也可打开程序, URL identifier是可选的。 [b]通过注册的URL Scheme向目标APP传递参数[/b] 通过URL Scheme启动APP很简单就可以做到,但有时候我们想在启动APP的时候传递一些参数,这个时候我们就可以通过URL Scheme自定义URL来传递参数了。 昨天我们在AppDelegate调用了UIApplicationDelegate的代理方法:
[u]复制代码[/u] 代码如下:
- (BOOL)application:(UIApplication *)application handleOpenURL:(NSURL*)url {     // 接受传过来的参数     NSString *text = [[url host] stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding];     UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"打开啦"                                            message:text                                           delegate:nil                                  cancelButtonTitle:@"OK"                                  otherButtonTitles:nil];     [alertView show];     return YES; }
我们来看看苹果给这个方法的注释:
[u]复制代码[/u] 代码如下:
- (BOOL)application:(UIApplication *)application handleOpenURL:(NSURL *)url;  // Will be deprecated at some point, please replace with application:openURL:sourceApplication:annotation:
这个方法在未来将被废弃,可以用application:openURL:sourceApplication:annotation:来代替。 [b]URL传参格式[/b] 昨天我们在iOSStrongDemo注册的URL Scheme还记得是什么吗?你应该还有印象的就是iOS开发的ID:iOSDevTip。 假设我们想要传递两个参数分别是名字name和手机号phone,格式如下:
iOSDevTip://?name=ligang&phone=13888888888
有没有似曾相识的感觉。我们用get方式请求一个接口是不是就是这样的。 被启动的APP处理传过来的参数
[u]复制代码[/u] 代码如下:
- (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]);     // 接受传过来的参数     UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"打开啦"                                                         message:[url query]                                                        delegate:nil                                               cancelButtonTitle:@"OK"                                               otherButtonTitles:nil];     [alertView show];     return YES; }
当APP被启动是,会调用代理方法application:openURL:sourceApplication:annotation:。参数URL就是启动APP的URL,参数sourceApplication就是来源APP的Bundle ID。 我们依然通过Safari来测试,在Safari的地址栏中输入:iOSDevTip://?name=ligang&phone=13888888888 [img]http://files.jb51.net/file_images/article/201604/201642991335677.png?201632991344[/img] 即可打开APP,看看参数是否传递过来: [img]http://files.jb51.net/file_images/article/201604/201642991500763.png?20163299157[/img] 最后我们看一下打印:
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打印出来是com.apple.mobilesafari,从这里可以看出来,是从Safari启动我们的APP的。 我们虽然自定义了URL Scheme,但是我们不能阻止别人通过自定义的URL Scheme来打开我们的应用。怎么解决呢? 我们可以指定相应的sourceApplication,也就是相应的Bundle ID,通过Bundle ID来决定是否可以打开我们的APP:
[u]复制代码[/u] 代码如下:
- (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"]){         // 接受传过来的参数         UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"打开啦"                                                             message:[url query]                                                            delegate:nil                                                   cancelButtonTitle:@"OK"                                                   otherButtonTitles:nil];         [alertView show];         return YES;     }else{         return NO;     } }
这样我们就可以通过Bundle ID来决定是否允许打开我们的APP。
  • 全部评论(0)
联系客服
客服电话:
400-000-3129
微信版

扫一扫进微信版
返回顶部