在SDK中打开其他接入应用的解决方案

摘要:
最近,我想在iOS中实现启动另一个应用程序的功能。在搜索了一些资料后,我可以使用UIApplication的openURL:方法。现在我将组织并与您分享!这是在信息中完成的。项目文件夹的plist文件。

最近要在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协议名 (例如“appb://” 应写做“appb”)。如果有必要,你可以在这里加入多个协议

操作截图如下:

在SDK中打开其他接入应用的解决方案第1张

访问自定义URL

在主应用程序中通过访问自定义URL启动另外一个应用:

思路:先检查本地有没有跳转的应用,没有再检查appstore有没有

 //无参数的传递
    NSString *appIdStr = @"appb:";
    
    //带参数的传递
//    NSString *appIdStr = @"appb://com.fcplayer.testHello";
//    NSString *appIdStr = @"appb://config=1&abar=2";
    
    NSURL *appIdUrl = [NSURL URLWithString:appIdStr];
    if ([[UIApplication sharedApplication] canOpenURL:appIdUrl]) {//检查本地应用
        
        NSLog(@"canOpenURL");
        [[UIApplication sharedApplication] openURL:appIdUrl];
    }else{//本地没有下载链接到appstore下载
        
        NSString *webStr = @"https://appsto.re/cn/00uGY.i";
        NSURL *weuURL = [NSURL URLWithString:webStr];
        
        if ([[UIApplication sharedApplication] canOpenURL:weuURL]) {//检查appStore应用

        [[UIApplication sharedApplication] openURL:weuURL];
        }
    }

自定义处理URL

 有些时候我们除了启动还需向另外一个应用发送参数,这是也可以通过自定义的URL来实现,如:

//无参数的传递
    NSString *appIdStr = @"appb:";
//带参数的传递 NSString *appIdStr = @"appb://com.fcplayer.testHello"; NSString *appIdStr = @"appb://config=1&abar=2";

这时我们在被启动应用中就必须进行自定义处理,在delegate中实现该消息(Cocos2d加在AppDelegate中),例如:

- (BOOL)application:(UIApplication *)application handleOpenURL:(NSURL*)url {   // Do something withthe url here }

注意:打开应用B的过程中,B有两种状态。

第一种状态:B并没有启动,那么会启动B。并调用下面的方法。

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    NSLog(@"didFinishLaunchingWithOptions----B");
    
    return YES;
}

第二种状态:此时B已经启动了,但是在后台运行,这个时候不会调用该方法。

通常,我们会从参数中解析出URL以便在视图中显示或者存储到UserPreference。下面的例子把URL存储为User Preference的url变量中或者打印出来:

-(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;  
}  

其他

 基本上至此我们就已经实现一个应用程序中启动另外一个应用的功能,但是为了是我们的代码更加强壮,我在网上又找了一段访问代码,如下:(具体不是很明白,没有深入研究)

该代码参考来源:http://blog.csdn.net/arthurchenjs/article/details/6920631 

// 检查用户是否配置了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];  
    }  
}  

二、调用IOS自带的应用:

上面讲述的是调用自身的应用,讲解了如何在自己应用之间调用问题,今天介绍一下如果调用IOS自带的app的方法

一、调用app store界面方法

在实际开发中,往往要推荐自己其他应用和推荐自己的收费软件,那么我们就需要在程序中直接连接到app store的相应页面。

实际上的做法很简单,使用的还是UIApplication类的OpenURL方法: 

[[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"程序的相应连接"]];

二、调用其它应用的方法

1)调用 自带mail


[[UIApplicationsharedApplication] openURL:[NSURLURLWithString:@"mailto://admin@hzlzh.com"]];

2)调用 电话phone


[[UIApplication sharedApplication] openURL:[NSURLURLWithString:@"tel://8008808888"]];


3)调用 SMS


[[UIApplicationsharedApplication] openURL:[NSURL URLWithString:@"sms://800888"]];


4)调用自带 浏览器 safari


[[UIApplicationsharedApplication] openURL:[NSURLURLWithString:@"http://www.hzlzh.com"]];

5)调用 Remote


[[UIApplicationsharedApplication] openURL:[NSURL URLWithString:@"remote://fff"]];

上面是最基本的语句,没什么处理过程。

如:调用phone可以传递号码,调用SMS只能设定号码,不能初始化SMS内容。

-(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"]];  
}  

二、  ios开发,两个app之间相互调用

1、新建两个项目:AppOne,AppTwo;

2、分别在其属性列表中添加如下:

项目A:

 在SDK中打开其他接入应用的解决方案第2张

项目B:

在SDK中打开其他接入应用的解决方案第3张

项目A实现代码:

//无参数的传递
    NSString *appIdStr = @"appb:";
    
    //带参数的传递
//    NSString *appIdStr = @"appb://com.fcplayer.testHello";
//    NSString *appIdStr = @"appb://config=1&abar=2";
    
    NSURL *appIdUrl = [NSURL URLWithString:appIdStr];
    if ([[UIApplication sharedApplication] canOpenURL:appIdUrl]) {//检查本地应用
        
        NSLog(@"canOpenURL");
        [[UIApplication sharedApplication] openURL:appIdUrl];
    }else{//本地没有下载链接到appstore下载
        
        NSString *webStr = @"https://appsto.re/cn/00uGY.i";
        NSURL *weuURL = [NSURL URLWithString:webStr];
        
        if ([[UIApplication sharedApplication] canOpenURL:weuURL]) {//检查appStore应用

        [[UIApplication sharedApplication] openURL:weuURL];
        }
    }

项目B实现代码:

.m 文件中
//无参数的传递 NSString *appIdStr = @"appa:"; NSURL *appIdUrl = [NSURL URLWithString:appIdStr]; if ([[UIApplication sharedApplication] canOpenURL:appIdUrl]) {//检查本地应用 NSLog(@"canOpenURL"); [[UIApplication sharedApplication] openURL:appIdUrl]; }else{//本地没有下载链接到appstore下载 NSString *webStr = @"https://appsto.re/cn/00uGY.i"; NSURL *weuURL = [NSURL URLWithString:webStr]; if ([[UIApplication sharedApplication] canOpenURL:weuURL]) {//检查本地应用 [[UIApplication sharedApplication] openURL:weuURL]; } }
delegate文件中:

-(BOOL)application:(UIApplication *)application handleOpenURL:(NSURL *)url

{

    if (!url) {  return NO; }

    NSString *URLString = [url absoluteString];

    NSLog(@"%@",URLString);

  [[NSUserDefaults standardUserDefaults] setObject:URLString forKey:@"url"];
   return YES;

}
 

4、分别运行下两个项目,然后无论把其中一个项目进程杀掉,或者使其进入休眠,都可以通过另一个项目来打开另一个项目。

 本文主要参考:http://blog.csdn.net/xiaoxuan415315/article/details/17009679

免责声明:文章转载自《在SDK中打开其他接入应用的解决方案》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇滴滴开源 Vue 组件库— cube-ui装系统 ------ 使用微PE 做系统盘下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

WiFi密码破解详细图文教程

随着智能移动设备的普及,大家对于WiFi已经不可脱离,每家每户更是必备无线路由。而网络上也出现了形形色色的教程教大家如何破解wifi密码,也就是所谓的“蹭网”,本篇文章将详解一下某些人蹭网(破解WiFi密码)是如何蹭的。 (注:蹭网是不道德的行为,本文仅做技术学习参考,请别做不道德的事情喔!) 在开始破解前需要准备 1、 一个有可破解无线信号的环境。 2、...

电脑网络诊断显示Win10无法与设备或资源(DNS)通信解决办法

最近是做多错多还是人有点儿衰神附体,软件,电脑系统,各种问题层出不穷,今天早上打开电脑发现不少软件都无法联网,神马百度商桥,腾讯浏览器,百度云。。。昨天百度商桥打不开还以为是软件出了问题,因为火狐浏览器可以上网,qq可以上网、微信可以上网,这种部分软件无法联网的事情还是第一次发生。今天把软件卸载重装,电脑重启,重复了n遍之后终于意识到不是软件的问题了,于是就...

使用wps跨ubuntu和windows编辑“.doc”文档。报错“编辑受限”,乱码,软件卡死,强制关闭

背景介绍: 本人使用wps跨ubuntu和windows编辑“.doc”文档。文档一直存放在移动硬盘上,切换系统没有插拔移动硬盘。切换系统好几次,一切正常。 某日早晨,在ubuntu下编辑文档,保存,转入windows下打算继续编辑。windows下打开文档时,报错“编辑受限”,乱码,软件卡死,只能强制关闭。 尝试以下方法: 1)把文档从移动硬盘拷贝到wi...

一些常用软件的静默安装参数(nsis,msi,InstallShield,Inno)

打包的时候,经常需要安装一些其它的环境库,而又不想让用户繁锁的去选择,这时就需要静默安装,而不同的文件所加的参数了不一致,比如VS的环境库vcredist_x86.exe(这是32位的环境库)后面加/q即可完成静默安装,而NSIS打包的文件使用/q是不行的,查了相关的资料得使用/S(这里要大写),其它格式的文件参考下面的转载内容: ------------...

rpm包管理工具

介绍: RPM [1]  是Red-Hat Package Manager(RPM软件包管理器)的缩写,这一文件格式名称虽然打上了RedHat的标志,但是其原始设计理念是开放式的,现在包括OpenLinux、S.u.S.E.以及Turbo Linux等Linux的分发版本都有采用,可以算是公认的行业标准了。 1、rpm命令常用参数介绍: -i ,--ins...

快速打造 react 后台管理系统

前言 相信很多小伙伴都有可能碰到开发后台管理系统这样的需求,那么我们该如何快速的完成这个需求呢 本文将以 react 为切入点,记录打造一个基础管理系统模板的过程,以此加深对 react 技术栈以及项目实战的理解,希望对大家开发一个这样的项目有所帮助 如果文章中有出现纰漏、错误之处,还请看到的小伙伴多多指教,先行谢过 项目简介 react-admin 是由...