URL Scheme 应用示例(双向openURL实现,调用特定的其他应用程序)
2013-06-19 17:24
399 查看
这是一个URL Scheme应用实例,首先我假设你已经看过《用自定义协议调用自己的程序》一文。项目中有一个变态的需求,我们的项目中要集成另一个厂商开发的app,由于知识产权的问题,我们不能集成源代码(早期我们也试图源代码方式集成,但最后搞得大家都累)。这个app单独安装在iPhone上,但用户点击app图标不能启动它,而只能启动我们的程序,再通过我们的程序去启动这个app。想来想去,只能用一种双向的URLScheme解决这个问题。
一、注册自定义URL协议
打开Xcode4.2,新建Empty Application,命名为URLSchemeResponder。
修改AppDelegate,将程序窗口的背景色修改为某个颜色比如紫色,以便我们能识别是当前看到的是哪个应用程序:
self.window.backgroundColor = [UIColorpurpleColor];
编辑URLSchemeResponder-Info.plist文件。增加一行,选择Key的类型为URL Types。URL Types是数组类型,它展开后默认有一个item(即Item0),如下图所示:
为Item0是Dictionary类型。点击Item0右边的“+”号,我们可以为它新增一个键-值对,将Key设置为URLidentifier,Value则设置为com.yourcompany.yourapp样式,如下图所示:
再次点击Item 0右边的“+”号按钮,新建一个键值对,Key为URL Schemes。URL Schemes也是一个数组类型,展开后默认有一个item(即Item0)。我们将这个item的Value设置为自定义的URL协议名,比如:urlschemetest。注意,我们不需要在协议名后面加上“://”,例如“http://”写http就好,“urlschemetest://”写urlschemetest就好。
提示:你甚至可以加入多个协议名:item0、item1、item2⋯⋯只要你确实需要的话。
二、响应自定义URL协议
编辑文件AppDelegate.m,加入方法:
- (BOOL)application:(UIApplication *)applicationhandleOpenURL:(NSURL*)url {
if(!url) {
returnNO;
}else{
NSString* queryString=[url query];
NSLog(@"query string:%@",queryString);
if ([@"from=URLSchemeRequester"isEqualToString:queryString]) {
returnYES;
}else
returnNO;
}
}
注意,在这段代码中,我们判断了URL中的查询字串如果等于from=URLSchemeRequester,我们就会打开程序,否则不会处理。
三、在其他程序里打开自定义URL协议
新建Empty Application,命名为 URLSchemeRequester。
修改AppDelegate,将程序窗口的背景色修改为某个颜色比如红色,以便我们能识别是当前看到的是哪个应用程序:
self.window.backgroundColor = [UIColorredColor];
接着在窗口中加入一个Button:
UIButton* btn=[UIButtonbuttonWithType:UIButtonTypeRoundedRect];
[btn setTitle:@"打开URLSchemeResponder"forState:UIControlStateNormal];
[btn addTarget:selfaction:@selector(btnAction) forControlEvents:UIControlEventTouchUpInside];
[self.windowaddSubview:btn];
接着在btnAction方法中打开自定义协议urlschemetest,即调用外部程序URLSchemeResponder:
-(void)btnAction{
[[UIApplicationsharedApplication]openURL:
[NSURLURLWithString:@"urlschemetest://?from=URLSchemeRequester"]];
}
如果我们想让URLSchemeResponder不能直接启动,只能由URLSchemeRequester通过openURL方式启动,可以修改URLSchemeResponder的application: didFinishLaunchingWithOptions方法,对launchOptions进行判断:
id url=[launchOptions objectForKey:UIApplicationLaunchOptionsURLKey];
NSLog(@"url:%@",url);
if (url) {
self.window = [[[UIWindowalloc] initWithFrame:[[UIScreenmainScreen] bounds]] autorelease];
// Override point forcustomization after application launch.
self.window.backgroundColor = [UIColorpurpleColor];
UILabel* lb=[[UILabelalloc]initWithFrame:CGRectMake(120, 240, 180, 44)];
[lb setText:@"URL Scheme Responder"];
[self.windowaddSubview:lb];
[lbrelease];
[self.windowmakeKeyAndVisible];
returnYES;
}else{
exit(0);
abort();
}
参数launchOptions是一个字典,如果我们以 UIApplicationLaunchOptionsURLKeyw为Key去检索luanchOptions,能够得到一个NSURL对象。该对象的值跟应用程序启动方式有关。如果应用程序的启动方式为openURL,这个NSURL对象不应该为空。如果为nil,则表明应用程序不是用openURL方式启动的。
四、双向URL Scheme
很简单,app1能够openURL app2,app2也要能openURL app1。这样我们就还需要在URLSchemeRequester程序中再注册一个URLScheme,这个过程就不再复述了,你可以参考URLSchemeResponder的做法。
一、注册自定义URL协议
打开Xcode4.2,新建Empty Application,命名为URLSchemeResponder。
修改AppDelegate,将程序窗口的背景色修改为某个颜色比如紫色,以便我们能识别是当前看到的是哪个应用程序:
self.window.backgroundColor = [UIColorpurpleColor];
编辑URLSchemeResponder-Info.plist文件。增加一行,选择Key的类型为URL Types。URL Types是数组类型,它展开后默认有一个item(即Item0),如下图所示:
为Item0是Dictionary类型。点击Item0右边的“+”号,我们可以为它新增一个键-值对,将Key设置为URLidentifier,Value则设置为com.yourcompany.yourapp样式,如下图所示:
再次点击Item 0右边的“+”号按钮,新建一个键值对,Key为URL Schemes。URL Schemes也是一个数组类型,展开后默认有一个item(即Item0)。我们将这个item的Value设置为自定义的URL协议名,比如:urlschemetest。注意,我们不需要在协议名后面加上“://”,例如“http://”写http就好,“urlschemetest://”写urlschemetest就好。
提示:你甚至可以加入多个协议名:item0、item1、item2⋯⋯只要你确实需要的话。
二、响应自定义URL协议
编辑文件AppDelegate.m,加入方法:
- (BOOL)application:(UIApplication *)applicationhandleOpenURL:(NSURL*)url {
if(!url) {
returnNO;
}else{
NSString* queryString=[url query];
NSLog(@"query string:%@",queryString);
if ([@"from=URLSchemeRequester"isEqualToString:queryString]) {
returnYES;
}else
returnNO;
}
}
注意,在这段代码中,我们判断了URL中的查询字串如果等于from=URLSchemeRequester,我们就会打开程序,否则不会处理。
三、在其他程序里打开自定义URL协议
新建Empty Application,命名为 URLSchemeRequester。
修改AppDelegate,将程序窗口的背景色修改为某个颜色比如红色,以便我们能识别是当前看到的是哪个应用程序:
self.window.backgroundColor = [UIColorredColor];
接着在窗口中加入一个Button:
UIButton* btn=[UIButtonbuttonWithType:UIButtonTypeRoundedRect];
[btn setTitle:@"打开URLSchemeResponder"forState:UIControlStateNormal];
[btn addTarget:selfaction:@selector(btnAction) forControlEvents:UIControlEventTouchUpInside];
[self.windowaddSubview:btn];
接着在btnAction方法中打开自定义协议urlschemetest,即调用外部程序URLSchemeResponder:
-(void)btnAction{
[[UIApplicationsharedApplication]openURL:
[NSURLURLWithString:@"urlschemetest://?from=URLSchemeRequester"]];
}
如果我们想让URLSchemeResponder不能直接启动,只能由URLSchemeRequester通过openURL方式启动,可以修改URLSchemeResponder的application: didFinishLaunchingWithOptions方法,对launchOptions进行判断:
id url=[launchOptions objectForKey:UIApplicationLaunchOptionsURLKey];
NSLog(@"url:%@",url);
if (url) {
self.window = [[[UIWindowalloc] initWithFrame:[[UIScreenmainScreen] bounds]] autorelease];
// Override point forcustomization after application launch.
self.window.backgroundColor = [UIColorpurpleColor];
UILabel* lb=[[UILabelalloc]initWithFrame:CGRectMake(120, 240, 180, 44)];
[lb setText:@"URL Scheme Responder"];
[self.windowaddSubview:lb];
[lbrelease];
[self.windowmakeKeyAndVisible];
returnYES;
}else{
exit(0);
abort();
}
参数launchOptions是一个字典,如果我们以 UIApplicationLaunchOptionsURLKeyw为Key去检索luanchOptions,能够得到一个NSURL对象。该对象的值跟应用程序启动方式有关。如果应用程序的启动方式为openURL,这个NSURL对象不应该为空。如果为nil,则表明应用程序不是用openURL方式启动的。
四、双向URL Scheme
很简单,app1能够openURL app2,app2也要能openURL app1。这样我们就还需要在URLSchemeRequester程序中再注册一个URLScheme,这个过程就不再复述了,你可以参考URLSchemeResponder的做法。
相关文章推荐
- URL Scheme 应用示例(双向openURL实现,调用特定的其他应用程序)
- URL Scheme 应用示例-双向openURL实现
- 应用进程实现对其他应用程序的调用
- Intent调用其他应用setComponent启动其他应用程序
- WPF技术触屏上的应用系列(二): 嵌入百度地图、API调用及结合本地数据库在地图上进行自定义标点的实现
- 循序渐进实现仿QQ界面演示程序编译问题及MFC调用RingSDK图象库示例
- vc中调用其他应用程序的方法(函数) winexec,shellexecute ,createprocess
- dlib实现人脸landmark点检测以及一些其他的应用
- PHPCMS中GET标签概述、 get 标签语法、get 标签创建工具、get 调用本系统示例、get 调用其他系统示例
- 如何:在 DHTML 代码和客户端应用程序代码之间实现双向通信
- C# Winform应用程序调用Microsoft RDP client control实现远程连接(VS2013)
- 多层数据库应用基于Delphi DataSnap方法调用的实现(一)返回数据集
- jQuery实现html双向绑定功能示例
- Android调用系统邮件类应用的正确实现方法
- C#自身包含其他应用程序(或者文件)并在运行时调用
- Angular指令封装jQuery日期时间插件datetimepicker实现双向绑定示例
- iphone openURL 运行Maps,SMS,Browser,Phone甚至其他的应用程序
- 数据结构的应用——使用栈实现十进制到其他(2、8、16)进制的转换
- Silverlight DataGrid应用示例(自定义值转换器和双向绑定)