URL Scheme 应用示例-双向openURL实现

原创 2012年03月27日 23:11:35

这是一个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的做法。



iOS9 - 自定义URL Scheme完成应用间的跳转

iPhone/iOS SDK 最酷的特性之一就是应用将其自身“绑定”到一个自定义URL Scheme上,该Scheme用于从浏览器或其他应用中启动本应用。 (在应用一中打开应用二) 应用二: ...
  • qq_21649645
  • qq_21649645
  • 2015年10月23日 17:24
  • 3615

IOS开发 自定义 URL Scheme(及应用内的跳转)

iPhone / iOS SDK 最酷的特性之一就是应用将其自身”绑定”到一个自定义 URL scheme 上,该 scheme 用于从浏览器或其他应用中启动本应用。   注册自定义 UR...
  • ljc_563812704
  • ljc_563812704
  • 2016年10月09日 14:24
  • 1650

【iOS】通过URL Scheme启动app(收集了常用的app的URL Scheme)

URL Scheme不仅可以打开其他的app,当然你也能为自己的app设置URL Scheme 1、如何设置给app设置URL Scheme 添加URL types字段数组设置URL ident...
  • wm9028
  • wm9028
  • 2015年11月23日 15:57
  • 33113

url scheme完全指南与app之间的调用(调用与被调用)

http://www.cocoachina.com/ios/20140522/8514.html http://www.cocoachina.com/ios/20140522/8514.html ...
  • u012963325
  • u012963325
  • 2016年05月11日 11:51
  • 664

iOS 获取安装应用程序列表和所有 url scheme

由于苹果的限制,在未越狱的 iOS 设备中只能通过私有 api 来获取安装应用列表和所有的 url scheme,在 ios 中可以用获取到的 scheme 来打开对应 app ```objecti...
  • lsjustin
  • lsjustin
  • 2015年12月16日 18:51
  • 2376

网页唤醒app(自定义 URL Scheme 完全指南)

原文链接:http://iosdevelopertips.com/cocoa/launching-your-own-application-via-a-custom-url-scheme.html ...
  • treney
  • treney
  • 2015年12月03日 17:33
  • 2140

iOS 如何判断ios设备中是否安装了某款应用并用URL Scheme跳转

第1步:.想要检测是否安装的话,首先需要知道这款应用的URL Schemes,方法如下 获取一个 app 的 URL Scheme 的方法: 上这个网站  URL Schemes  查...
  • sunboygpz
  • sunboygpz
  • 2016年08月30日 16:43
  • 921

常用第三方APP 的url scheme

转载自http://bbs.feng.com/read-htm-tid-8941179.html 设置:prefs:root=SETTING 触宝拨号:dialer:// 蜂窝网络:prefs:...
  • swt466719249
  • swt466719249
  • 2015年09月16日 17:22
  • 6174

通过URL Scheme传递参数

热点总是一时的,借此炒作的人或许已达成目的。作为一名iOS开发程序员,我们只能继续写代码,改变世界。 上一篇文章讲到:Xcode6.4注册URLScheme步骤详解,这一篇继续来看看URLSchem...
  • zhangjitao_boke
  • zhangjitao_boke
  • 2016年03月08日 16:24
  • 3047

[Phonegap+Sencha Touch] 移动开发61 使用 URL Schemes实现一个App启动另一个App的功能

一个App可以启动同一设备上的其他App,可以方便和提高用户体验。URL Schemes是一种机制,提供了一个App启动或恢复另一个App的能力。但URL Schemes真正强大的是用它来传递数据到另...
  • lovelyelfpop
  • lovelyelfpop
  • 2015年09月11日 10:23
  • 1670
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:URL Scheme 应用示例-双向openURL实现
举报原因:
原因补充:

(最多只允许输入30个字)