在IOS应用中打开另外一个应用的解决方案
最近要在IOS中实现一个应用启动另外一个应用的功能,搜了一些资料,使用UIApplication的openURL:的方法就能实现,现在整理和大家分享一下!
注册自定义URL协议
首先被启动的应用需要向iPhone注册一个自定义URL协议。这是在你的项目文件夹的info.plist文件进行的(就是你改变应用程序图标的同一个文件)。Step1. 右键,选择“Add Row”Step2. Key值选择“URL types”Step3. 打开“Item 0″,然后为该key增加一个URL identifier。可以是任何值,但建议用“反域名”(例如 “com.fcplayer.testHello”)。Step4. 在“Item 0”下再加一行。Step5. 选择“URL Schemes” 作为Key。Step6. 输入你的URL协议名 (例如“testHello://” 应写做“testHello”)。如果有必要,你可以在这里加入多个协议。操作截图如下:
访问自定义URL
在主应用程序中通过访问自定义URL启动另外一个应用:
[csharp] view plain
copy
- NSURL * myURL_APP_A = [NSURL URLWithString:@"testHello://"];
- if
([[UIApplication sharedApplication] canOpenURL:myURL_APP_A]) {
- NSLog(@"canOpenURL"
);
- [[UIApplication sharedApplication] openURL:myURL_APP_A];
- }
自定义处理URL
有些时候我们除了启动还需向另外一个应用发送参数,这是也可以通过自定义的URL来实现,如:
testHello://testHello://com.fcplayer.testHellotestHello://config=1&abar=2
这时我们在被启动应用中就必须进行自定义处理,在delegate中实现该消息(Cocos2d加在AppDelegate中),例如:- (BOOL)application:(UIApplication *)applicationhandleOpenURL:(NSURL*)url { // Do something withthe url here }
通常,我们会从参数中解析出URL以便在视图中显示或者存储到UserPreference。下面的例子把URL存储为User Preference的url变量中或者打印出来:
[csharp]
view plaincopy
- -(BOOL)application:(UIApplication *)application handleOpenURL:(NSURL *)url
- {
- if
(!url) {
return
NO; }
- NSString *URLString = [url absoluteString];
- NSLog(@"%@"
,URLString);
- //[[NSUserDefaults standardUserDefaults] setObject:URLString forKey:@"url"];
- //[[NSUserDefaults standardUserDefaults] synchronize];
- return
YES;
- }
其他
基本上至此我们就已经实现一个应用程序中启动另外一个应用的功能,但是为了是我们的代码更加强壮,我在网上又找了一段访问代码,如下:
[csharp]
view plaincopy
- // 检查用户是否配置了AppId
- // 有没有准确配置Info的CFBundleURLSchemes字段
- // 是不是可以正确打开
- if
(!kAppId) {
- UIAlertView *alertView = [[UIAlertView alloc]
- initWithTitle:@"Setup Error"
- message:@"Missing app ID. You cannot run the app until you provide this in the code."
- delegate
:self
- cancelButtonTitle:@"OK"
- otherButtonTitles:nil,
- nil];
- [alertView show];
- [alertView release];
- } else
{
- // Now check that the URL scheme fb[app_id]://authorize is in the .plist and can
- // be opened, doing a simple check without local app id factored in here
- NSString *url = [NSString stringWithFormat:@"fb%@://authorize"
,kAppId];
- BOOL bSchemeInPlist = NO; // find out if the sceme is in the plist file.
- NSArray* aBundleURLTypes = [[NSBundle mainBundle] objectForInfoDictionaryKey:@"CFBundleURLTypes"
];
- if
([aBundleURLTypes isKindOfClass:[NSArray
class
]] &&
- ([aBundleURLTypes count] > 0)) {
- NSDictionary* aBundleURLTypes0 = [aBundleURLTypes objectAtIndex:0];
- if
([aBundleURLTypes0 isKindOfClass:[NSDictionary
class
]]) {
- NSArray* aBundleURLSchemes = [aBundleURLTypes0 objectForKey:@"CFBundleURLSchemes"
];
- if
([aBundleURLSchemes isKindOfClass:[NSArray
class
]] &&
- ([aBundleURLSchemes count] > 0)) {
- NSString *scheme = [aBundleURLSchemes objectAtIndex:0];
- if
([scheme isKindOfClass:[NSString
class
]] &&
- [url hasPrefix:scheme]) {
- bSchemeInPlist = YES;
- }
- }
- }
- }
- // Check if the authorization callback will work
- BOOL bCanOpenUrl = [[UIApplication sharedApplication] canOpenURL:[NSURL URLWithString: url]];
- if
(!bSchemeInPlist || !bCanOpenUrl) {
- UIAlertView *alertView = [[UIAlertView alloc]
- initWithTitle:@"Setup Error"
- message:@"Invalid or missing URL scheme. You cannot run the app until you set up a valid URL scheme in your .plist."
- delegate
:self
- cancelButtonTitle:@"OK"
- otherButtonTitles:nil,
- nil];
- [alertView show];
- [alertView release];
- }
- }
另外还有一段启动其他应用的代码:
[csharp]
view plaincopy
- -(IBAction)openMaps {
//打开地图
- // Where is Apple on the map anyway?
- NSString* addressText = @”1 Infinite Loop, Cupertino, CA 95014″;
- // URL encode the spaces
- addressText = [addressText stringByAddingPercentEscapesUsingEncoding: NSASCIIStringEncoding];
- NSString* urlText = [NSString stringWithFormat:@"http://maps.google.com/maps?q=%@"
, addressText];
- // lets throw this text on the log so we can view the url in the event we have an issue
- NSLog(urlText);
- [[UIApplication sharedApplication] openURL:[NSURL URLWithString:urlText]];
- }
- -(IBAction)openEmail {//打开mail
- // Fire off an email to apple support
- [[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"mailto://devprograms@apple.com"
]];
- }
- -(IBAction)openPhone {//拨打电话
- // Call Google 411
- [[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"tel://8004664411"
]];
- }
- -(IBAction)openSms {//打开短信
- // Text to Google SMS
- [[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"sms://466453"
]];
- }
- -(IBAction)openBrowser {//打开浏览器
- // Lanuch any iPhone developers fav site
- [[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"http://itunesconnect.apple.com"
]];
- }
附参考链接:http://blog.csdn.net/arthurchenjs/article/details/6920631
IOS开发~两个App互相调用
分类: IOS
2013-07-01 20:27
273人阅读 评论(1) 收藏 举报
1、新建两个项目:AppOne,AppTwo;
2、分别在其属性列表中添加如下:
AppOwn:
AppTwo:
3、分别实现代码:
AppOwn的 viewController.m 中添加代码:
- (void
) touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
NSURL *url = [NSURLURLWithString:@"AppTwo:"];
if
([[
UIApplicationsharedApplication] canOpenURL:url])
{
NSLog
(
@"canOpenURL");
[[
UIApplication sharedApplication] openURL:url];
} else
{
NSLog
(
@"can not OpenURL");
}
}
AppTwn的 viewController.m 中添加代码:
- (void
) touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
NSLog
(
@"touchesBegan");
NSURL *url = [NSURLURLWithString:@"AppOne:"];
if
([[
UIApplicationsharedApplication] canOpenURL:url])
{
NSLog
(
@"canOpenURL");
[[
UIApplication sharedApplication] openURL:url];
} else
{
NSLog
(
@"can not OpenURL");
}
}
4、分别运行下两个项目,然后无论把其中一个项目进程杀掉,或者使其进入休眠,都可以通过另一个项目来打开另一个项目。
在IOS应用中打开另外一个应用的解决方案的更多相关文章
- 利用openURL,在IOS应用中打开另外一个应用
在IOS中,实现一个应用启动另外一个应用,使用UIApplication的openURL:方法就可实现,这里以test跳到test02为例.(需要先创建这两个工程) 注册自定义URL协议(在test中 ...
- 【IOS】在SDK中打开其他接入应用的解决方案
在SDK中打开其他接入应用的解决方案 一直以来,在iOS的开发中,在程序中打开另外一个应用是不允许.后来有正义之士用class-dump在私有API中找到了这样的功能.那就是使用UIApplica ...
- XamarinSQLite教程Xamarin.iOS项目中打开数据库文件
XamarinSQLite教程Xamarin.iOS项目中打开数据库文件 以下是打开MyDocuments.db数据库的具体操作步骤: (1)将Mac电脑上的MyDocuments.db数据库移动到W ...
- Winforn中怎样在窗体中打开另一个窗体
场景 在Winform的窗体A中打开另一个窗体B. 实现 //打开新的窗体 CurveCompare cc = new CurveCompare(); cc.Show(); 效果 以上代码的实现参照: ...
- iOS开发中遇到的一些问题及解决方案【转载】
iOS开发中遇到的一些问题及解决方案[转载] 2015-12-29 [385][scrollView不接受点击事件,是因为事件传递失败] // // MyScrollView.m // Creat ...
- iOS 应用中打开其他应用 (转)
我们来讨论一下,在iOS开发中,如何实现从app1打开app2. 基本的思路就是,可以为app2定义一个URL,在app1中通过打开这个URL来打开app2,在此过程中,可以传送一些参数.下面来讨论一 ...
- 【转】【iOS开发】打开另一个APP(URL Scheme与openURL)
目标 平常我们做iOS开发,会经常遇到打开其他的APP的功能.本篇文章讲的就是打开别人的APP的一些知识.我们的目标是: 打开别人的APP 让别人打开我们的APP iOS9的适配问题 使用URL Sc ...
- 【Android开发-8】生命周期,Activity中打开另外一个Activity
前言:生命中有很多人陪伴自己走过一生中的某段旅程,仅仅是有些人仅仅是某阶段出现,有些人却陪伴自己非常久.就像小学.中学.高中.大学,那些以前以为会长久拥有的,当经历过天涯各地地忙碌于生活,或如意.或失 ...
- 在android程序中打开另一个应用程序
Android 开发有时需要在一个应用中启动另一个应用,比如Launcher加载所有的已安装的程序的列表,当点击图标时可以启动另一个应用. 一般我们知道了另一个应用的包名和MainActivity的名 ...
随机推荐
- C# 多线程參数传递
1.通过实体类来传递(能够传递多个參数与获取返回值),demo例如以下: 须要在线程中调用的函数: namespace ThreadParameterDemo { public class Funct ...
- gdb调试常用实用命令和core dump文件的生成(转)
1.生成core dump文件的方法: $ ulimit -c //查看是否为0 如果为0 $ ulimit -c unlimited 这样在程序崩溃以后会在当前目录生成一个core.xxxx的 ...
- .NET 同步与异步 之 Mutex (十二)
本随笔续接:.NET 同步与异步 之 线程安全的集合 (十一) 本随笔 及 接下来的两篇随笔,将介绍 .NET 同步与异步系列 的最后一个大块知识点:WaitHandle家族. 抽象基类:WaitHa ...
- pilicat-dfs 霹雳猫-分布式文件系统
pilicat-dfs 霹雳猫-分布式文件系统 一种可以将网站图片或上传的文件,进行分布式存放的服务,可自动复制到多台物理机器,可满足高可用和负载均衡 已编译好的程序包 http://git.osch ...
- Diffuse贴图+Lightmap+Ambient
shader里面光照计算毕竟还是比较复杂的,于是想到下面的性能相对好一些的方案. 美术提供一张Diffuse贴图,一张lightmap贴图,然后在应用一个自定义的全局的环境光效果,来模拟静态的光照. ...
- springMVC 返回时间格式转换
<mvc:annotation-driven> <mvc:message-converters> <bean class="org.springframewor ...
- oracle sql语句实现累加、累减、累乘、累除
在oracle开发过程中经常会遇到累加.减.乘.除的问题.下面对这个做个小的总结 ---创建测试表 CREATE TABLE TEST( PARENT_ID NUMBER, PART_ID NUMBE ...
- Android 8 蓝牙打开过程
packages\apps\Settings\src\com\android\settings\bluetooth\BluetoothEnabler.java @Override public boo ...
- JAVA中有一个特殊的类: Object。它是JAVA体系中所有类的父类(直接父类或者间接父类)。
接口往往被我们定义成一类XX的东西. 接口实际上是定义一个规范.标准. ① 通过接口可以实现不同层次.不同体系对象的共同属性: 通过接口实现write once as anywhere. 以JA ...
- Mybatis面试题整理(超详细)
1.什么是Mybatis? (1)Mybatis是一个半ORM(对象关系映射)框架,它内部封装了JDBC,开发时只需要关注SQL语句本身,不需要花费精力去处理加载驱动.创建连接.创建statement ...