进程间通讯,通过自定义的URL Scheme启动你的App

原文地址:http://iphonedevelopertips.com/cocoa/launching-your-own-application-via-a-custom-url-scheme.html


受限与iOS系统的运行机制,绝大多数情况下一个应用在进入后台后会马上进入suspend或terminate状态,也就是说不能执行代码,iOS中也没有类似WIndows中Service的概念,但存在某些例外:

1:有某些重要的任务,例如保存用户数据,网络下载等,可以申请一段时间的background运行时间,但时间段内能进行的操作比较有限,且有时间限制,长度为600秒左右。

2:某些特定类型的应用,具体包括:

  •     VoIP应用
  •     定位类应用
  •     新闻类应用
  •     音乐类应用
这些类型的应用可以获得没有时间限制的background运行。但并不是你随便声明一下应用类型就可以了,如果挂羊头卖狗肉,是无法通过App Store审核的。


既然大多数情况下系统中只有一个活动的应用在运行,加上iOS内不同应用由于沙箱运行导致的高度隔离,我们熟悉的那些IPC方法,例如管道、邮槽、共享内存、Socket等,往往会显得比较无力了,针对此种情况,苹果也提供了对应的解决方案,也就是我们今天将要介绍的:URL Schema


简单来说,URL Schema就是iOS内的应用调用协议,应用A可以声明自定义的调用协议,就如http/https那样,当另一个应用B打算在应用内打开应用A时,可以打开使用A自定义的协议开头的URL来打开A,除了协议头,URL中还可以附加其他参数,具体过程参见下图:

这个就是Safari与Alocola之间的交互过程。

接下来介绍一下自定义URL Schema的过程。

1:创建Xcode项目

2:打开项目,在其中的info.plist中添加如下图所示字段:


其中的"lifengzhong"便是我为此应用注册的自定义协议名称,其他应用如果想调用我的应用,只要打开形似:“lifengzhong://XXX”的URL便可以了。

3:在项目AppDelegate中添加函数:
[cpp]  view plain  copy
  1. - (BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary<NSString*, id> *)options

  2. {  
  3.     if ([sourceApplication isEqualToString: @"xxx.xxx.xxx"]) {  
  4.         //xx  
  5.     }  
  6.     return YES;  
  7. }  

此函数便是URL Call的处理函数了,每当其他应用通过URL打开此应用时,该函数都会被调用。
参数url是传进的url,sourceApplication是呼叫应用的bundle identifier,通过此参数,应用可以对呼叫的应用进行过滤。annotation是呼叫过程中可以附加的额外参数,这里没有用到。

4:当另一个应用想调用我的应用时,只需拼接好URL,,然后打开URL即可,十分方便:

[cpp]  view plain  copy
  1. NSURL* url = [NSURL URLWithString: @"lifengzhong://1,545166"];  
  2. [[UIApplication sharedApplication] openURL: url];  

这里的1,545166是我自定义的参数,你可以根据自己需要定义URL的格式。




通过上面介绍的URL Schema方法,算是实现了某种程度的进程间通信,但这种方式的一个缺点是,同一时刻还是只能有一个进程在前台,主动呼叫的应用在调用成功后必须进入后台,所以能传递的只有URL中所带的参数或annotation中所带的参数。调用的过程中会出现应用之间的切换,用户体验不好。但聊胜于无,苹果好歹还是留了这么一个口子,感恩吧。


iPhone SDK可以把你的App和一个自定义的URL Scheme绑定。该URL Scheme可用来从浏览器或别的App启动你的App。

如何响应从别的App里发给你的URL Scheme申请,由你决定:可以唤醒你的App;也可以传一些信息给你。

给自己的App注册一个URL Scheme非常简单,就是在info.plist文件里定义两个键值就OK。如下图所示:

url scheme

  1. 添加一个叫URL types的键值。
  2. 给其下的Item 1添加一个URL identifier,格式为Reverse Domain Name:com.mycompany.myapp。
  3. 再加一个URL Scheme,然后给它定义一个值,任意字符串。比如:myapp。

定义结束,就可以使用下面的模式来发送一个URL:

myapp://
myapp://some/path/here
myapp://?foo=1&amp;bar=2
myapp://some/path/here?foo=1&amp;bar=2

然后,你的App的UIApplicationDelegate会收到一个消息。若你想自己处理该URL,可以重载下面这个方法:

[plain]  view plain  copy
  1. - (BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary<NSString*, id> *)options

  2. {  
  3.     // Do something with the url here  
  4. }  

例如,把传过来的URL保存在本地:

[plain]  view plain  copy
  1. - (BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary<NSString*, id> *)options 

  2. {  
  3.     if (!url)  
  4.     {  
  5.         return NO;  
  6.     }  
  7.   
  8.     NSString *URLString = [url absoluteString];  
  9.     [[NSUserDefaults standardUserDefaults] setObject:URLString forKey:@"url"];  
  10.     [[NSUserDefaults standardUserDefaults] synchronize];  
  11.     return YES;  
  12. }  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值