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

最近要在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”)。如果有必要,你可以在这里加入多个协议

 

操作截图如下:

访问自定义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:

 

项目B:

 

项目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

posted on 2016-05-27 15:30  快乐加油站789  阅读(344)  评论(0编辑  收藏  举报

导航