通过注册的URL Scheme向目标APP传递参数

通过URL Scheme启动APP很简单就可以做到,但有时候我们想在启动APP的时候传递一些参数,这个时候我们就可以通过URL Scheme自定义URL来传递参数了。

昨天我们在AppDelegate调用了UIApplicationDelegate的代理方法:

- (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;
}

我们来看看苹果给这个方法的注释:

- (BOOL)application:(UIApplication *)application handleOpenURL:(NSURL *)url;  // Will be deprecated at some point, please replace with application:openURL:sourceApplication:annotation:

这个方法在未来将被废弃,可以用application:openURL:sourceApplication:annotation:来代替。

URL传参格式

昨天我们在iOSStrongDemo注册的URL Scheme还记得是什么吗?你应该还有印象的就是iOS开发的ID:iOSDevTip

假设我们想要传递两个参数分别是名字name和手机号phone,格式如下:

iOSDevTip://?name=ligang&phone=13888888888

有没有似曾相识的感觉。我们用get方式请求一个接口是不是就是这样的。

被启动的APP处理传过来的参数

- (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

即可打开APP,看看参数是否传递过来:

最后我们看一下打印:

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:

- (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,demo下载地址:iOSStrongDemo

本文出处刚刚在线:http://www.superqq.com/blog/2015/07/15/tong-guo-url-schemechuan-di-can-shu/

最新文章

  1. Linux学习笔记(11)-kill函数
  2. 杭电ACM1002
  3. Matlab学习笔记 figure函数
  4. 利用scp传输文件小结
  5. 【树莓派】树莓派移动网络连接(配置4G网卡)
  6. Singleton 单例模板
  7. testlink的下载地址
  8. 多线程归并排序(摘自githhub)
  9. windows下svn+apache搭建svn服务器
  10. 使用ListView时遇到的问题
  11. IBM Intel 微软
  12. Httpwatch 工具介绍
  13. [置顶] 纯手工打造漂亮的瀑布流,五大插件一个都不少Bootstrap+jQuery+Masonry+imagesLoaded+Lightbox!
  14. Android 零散知识点整理
  15. beta冲刺2-咸鱼
  16. Python数据类型和数据操作
  17. js获取当前url
  18. JS基础-第1天
  19. AspNetCoreMvc使用MongoDB,快来get一下吧。
  20. windows下安装和配置redis

热门文章

  1. 谷歌浏览器如何查看或获取Cookie字符串
  2. spider_text
  3. tyvj[1089]smrtfun
  4. Volley获取网络图片使用总结
  5. pmcyg 1.0 发布,Cygwin 安装包创建工具
  6. getHibernateTemplate()的用法
  7. DCL,DDL,DML,DQL
  8. Tomcat就是个容器,一种软件
  9. Quartz管理类
  10. CSU 1120 病毒
  11. JavaScript之三:jQuery插件开发(一)
  12. LoonAndroid自动检测输入框 --- Author: rose && lvyerose@163.com
  13. iOS安全攻防之代码混淆
  14. 【chrome】 chrome 开发者工具
  15. NOPI读xls文件写到txt中(NPOI系列二)
  16. async & await 异步编程的一点巧方法
  17. Windows10 小闹钟
  18. transform子元素,绝对定位失效
  19. Python学习笔记第二十四周(JavaScript补充)
  20. Mysql 基本的增删改查