原文地址: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应用
- 定位类应用
- 新闻类应用
- 音乐类应用
-
- (BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary<NSString*, id> *)options
- {
- if ([sourceApplication isEqualToString: @"xxx.xxx.xxx"]) {
- //xx
- }
- return YES;
- }
此函数便是URL Call的处理函数了,每当其他应用通过URL打开此应用时,该函数都会被调用。
- NSURL* url = [NSURL URLWithString: @"lifengzhong://1,545166"];
- [[UIApplication sharedApplication] openURL: url];
这里的1,545166是我自定义的参数,你可以根据自己需要定义URL的格式。
iPhone SDK可以把你的App和一个自定义的URL Scheme绑定。该URL Scheme可用来从浏览器或别的App启动你的App。
如何响应从别的App里发给你的URL Scheme申请,由你决定:可以唤醒你的App;也可以传一些信息给你。
给自己的App注册一个URL Scheme非常简单,就是在info.plist文件里定义两个键值就OK。如下图所示:
- 添加一个叫URL types的键值。
- 给其下的Item 1添加一个URL identifier,格式为Reverse Domain Name:com.mycompany.myapp。
- 再加一个URL Scheme,然后给它定义一个值,任意字符串。比如:myapp。
定义结束,就可以使用下面的模式来发送一个URL:
myapp://
myapp://some/path/here
myapp://?foo=1&bar=2
myapp://some/path/here?foo=1&bar=2
然后,你的App的UIApplicationDelegate会收到一个消息。若你想自己处理该URL,可以重载下面这个方法:
-
- (BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary<NSString*, id> *)options
- {
- // Do something with the url here
- }
例如,把传过来的URL保存在本地:
-
- (BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary<NSString*, id> *)options
- {
- if (!url)
- {
- return NO;
- }
- NSString *URLString = [url absoluteString];
- [[NSUserDefaults standardUserDefaults] setObject:URLString forKey:@"url"];
- [[NSUserDefaults standardUserDefaults] synchronize];
- return YES;
- }