通过注册的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/

通过注册的URL Scheme向目标APP传递参数的更多相关文章

  1. Android通过DeepLink方式跳转其他App传递参数

    网上对于安卓DeepLink方式跳转传递参数的例子较少,说的也不客观,实践之后发现还是有一些坑.其实为什么要用DeepLink方式跳转,有些是因为引流的原因,他们希望通过网页就能直接跳转到App的界面 ...

  2. 【HOW】如何通过URL给Reporting Services报表传递参数

    [本地模式Reporting Services] 参见官方文档:http://msdn.microsoft.com/en-us/library/ms154042.aspx 示例:http://serv ...

  3. Xcode6.4注册URL Scheme步骤详解

    URL Scheme的作用 我们都知道苹果手机中的APP都有一个沙盒,APP就是一个信息孤岛,相互是不可以进行通信的.但是iOS的APP可以注册自己的URL Scheme,URL Scheme是为方便 ...

  4. 通过自定义的URL Scheme启动你的App

    iPhone SDK可以把你的App和一个自定义的URL Scheme绑定.该URL Scheme可用来从浏览器或别的App启动你的App. 如何响应从别的App里发给你的URL Scheme申请,由 ...

  5. 利用URL Scheme打开APP并传递数据

    https://blog.csdn.net/u013517637/article/details/55251421 利用外部链接打开APP并传递一些附带信息是现在很多APP都有的功能,我在这把这部分的 ...

  6. iOS 唤起APP之URL Scheme

    什么是URL Scheme 简单的说,由于苹果选择使用沙盒机制来保障用户的隐私和安全,APP只能访问自己沙盒数据,但同时也阻碍了应用间合理的信息共享.因此苹果提供了一个可以在APP之间跳转的方法:UR ...

  7. Android业务组件化之URL Scheme使用

    前言: 最近公司业务发展迅速,单一的项目工程不再适合公司发展需要,所以开始推进公司APP业务组件化,很荣幸自己能够牵头做这件事,经过研究实现组件化的通信方案通过URL Scheme,所以想着现在还是在 ...

  8. 自定义 URL Scheme 完全指南

    本文由 Migrant 翻译自 The Complete Tutorial on iOS/iPhone Custom URL Schemes,转载请注明出处. 注意: 自从自定义 URL 的引入,本文 ...

  9. 自定义 URL Scheme 完全指南(转载)

    iPhone / iOS SDK 最酷的特性之一就是应用将其自身”绑定”到一个自定义 URL scheme 上,该 scheme 用于从浏览器或其他应用中启动本应用. 注册自定义 URL Scheme ...

随机推荐

  1. WP8 SqlCE和SqlLite数据存储性能比较

    在平时的开发中一定会用到本地数据存储,除了独立存储外我们还可以选择SqlCE和SqlLite:于是在选择上我们就必须权衡他们两者的性能择优选择. 测试代码:(这个例子是在msdn sqllite例子上 ...

  2. maven -- 问题解决(一)解决eclipse中maven项目出现的问题

    配置项目时出现的错误: error: Cannot change version of project facet Dynamic Web Module to 2.5. error: One or m ...

  3. Angular开发Tips

    1.在使用$routeProvider的时候,需要让模块依赖ngRoute,否则会提示找不到服务,示例: angular.module('module1', ['ngRoute']) .config( ...

  4. overflow:hidden的另一层含义

    overflow:hidden这个CSS样式是大家常用到的CSS样式,但是大多数人对这个样式的理解仅仅局限于隐藏溢出,而对于清除浮动这个含义不是 很了解.一提到清除浮动,我们就会想到另外一个CSS样式 ...

  5. 剑指架构师系列-Struts2构造函数的循环依赖注入

    Struts2可以完成构造函数的循环依赖注入,来看看Struts2的大师们是怎么做到的吧! 首先定义IBlood与BloodImpl类: public interface IBlood { } pub ...

  6. 将查询字符串解析转换为泛型List的名值集合.

    ///<summary> ///将查询字符串解析转换为泛型List的名值集合. ///</summary> ///<param name="queryStrin ...

  7. Python单元测试框架之pytest -- fixtures

    fixtures不太好翻译,可看作是夹心饼干最外层的两片饼干.通常用setup/teardown来表示.它主要用来包裹测试用例,为什么需要这样的饼干呢?我们以web自动化测试为例,例如,要测试的某系统 ...

  8. Android学习笔记之HttpClient实现Http请求....

    PS:最近光忙着考试了....破组成原理都看吐了....搞的什么也不想干...写篇博客爽爽吧....貌似明天就考试了...sad... 学习笔记: 1.如何实现Http请求来实现通信.... 2.解决 ...

  9. 【原创随笔】Sql2008 R2 做CQRS小结

    1.做数据同步,订阅服务器只要把数据库建好就可以了,至于表和存储过程以及其它的都不管,订阅的时候会自动创建这些信息. 2.选择事务发布(如果同步表,表至少要带主键,不然不能选择) 3.在发布的时候,用 ...

  10. 老外还是喜欢Ubuntu的

    有图为证? 开效果应该是Ubuntu的界面了,当然,不知是不是backtrack. 这里面的Hacker用的电脑都不是水果.是没有给钱么.