美文网首页
iOS 一个app启动另一个app

iOS 一个app启动另一个app

作者: UNforgetta_ab44 | 来源:发表于2017-06-19 15:38 被阅读0次

    因为项目的需要,我们公司的两个项目要可以相互访问,查找资料,经过自己的总结写下这篇文章,希望可以帮助大家。

    1.注册自己的URL

    新建一个工程MyAppOne,在info.plist 文件中添加字段,注册 MyAppOne的URL.

    1.1在 Information Property List中,点击“+” 添加 URL types,添加一个Item,再在Item中,添加“URL Schemes”,再在URL Schemes的Item中,添加一个字符串“AppDemo1”(参考下图),该字符串 即为 当前 工程 MyAppOne 自己 为自己注册的 URL。注册自己的URL完成。

    1.2我们刚才注册的自己的URL,就相当于我们当前的工程MyAppOne的一个身份标识。其他app通过ios提供的接口(后面会介绍是ios 的哪个函数),调用这个URL就能启动我们这个MyAppOne应用程序了。

    2. 白名单LSApplicationQueriesSchemes

    在ios9以后,需要在info.plist文件中添加LSApplicationQueriesSchemes(白名单),才能合法启动你想要启动的那个app。白名单中添加的,是你想要启动的app的 URL(这个URL就是上面讲解的“注册自己的URL”)。

    2.1 添加 LSApplicationQueriesSchemes。(当前的工程是xcode7.3.1,xcode没有自动匹配 LSApplicationQueriesSchemes,因此,需要你手动输入这个字段,并将它的属性改为【Array】),在LSApplicationQueriesSchemes 中添加“AppDemo2”。

    我们假设已经有一个MyAppTwo,它注册的URL是 AppDemo2。我们想在MyAppOne工程去启动的MyAppTwo这个app,就需要在白名单中添加MyAppTwo的URL。

    3.MyAppOne 启动 另一个App的关键代码

    3.1 字符串AppDemo2后面的 "://"是必须添加的,否则会 无法打开你指定的app的URL的。

    3.2 代码介绍了 无参URL和有参URL。如果想传递参数,在“://”后面附加这些参数即可。

    1 //// 用户 按下 按钮********* 请参考 ViewController.m 文件中的代码

    2 - (IBAction)Btn1Click:(id)sender {

    3     NSLog(@"MyAppOne: You click the button1111.");

    4     char szbuff[50] = {0};

    5     sprintf(szbuff, "%s", "AppDemo2://userName=heliang&pwd=20160812");

    6     /// 1.不带参数的传递方式

    7     //    NSURL* urlLocal = [NSURL URLWithString:@"AppDemo2://"];

    8     /// 2.带参数的传递方式

    9     NSURL* urlLocal = [NSURL URLWithString:[NSString stringWithUTF8String:szbuff]];

    10

    11     // 判断是否可以启动该 url

    12     if([[UIApplication sharedApplication] canOpenURL:urlLocal])

    13     {

    14         [[UIApplication sharedApplication] openURL:urlLocal];

    15         NSLog(@"launch AppDemo2 success!");

    16     }

    17     else

    18     {

    19         NSLog(@"No such url.");

    20         /// 跳到 appStore 某个 app

    21         NSURL* urlAppStore = [NSURL URLWithString:@"https://itunes.apple.com/cn/app/tie-lu12306/id564818797?mt=8"];

    22         [[UIApplication sharedApplication] openURL: urlAppStore];// 已经弃用

    // iOS10.0之后

    // 不传参数

    //[application openURL:URL options:@{} completionHandler:nil];

    // 传递参数

    //NSDictionary *options = @{UIApplicationOpenURLOptionUniversalLinksOnly: @YES};

    //[application openURL:URL options:options completionHandler:nil];

    23     }

    24 }

    3.3至此,已经介绍完如何从一个app1启动另一个app2了。

    步骤如下:

    ①app2在info.plist的URL Schemes中 注册自己的URL

    ②app1在info.plist的【白名单】中添加 app2注册的 URL

    ③app1中调用[UIApplication sharedApplication] openURL:urlLocal]; 方法,启动 app2。(可以参考链接中的demo,进行进一步的理解。)

    如何获取传递这种启动方式,传递过来的参数呢?

    4.获取传递过来的参数

    4.1在AppDelegate.m 中重写 下面的这个application方法(如果文件中没有这个函数,就手动添加下面的函数,这就是重写)。传递过来的参数,就在 url中。(可以参考链接中的demo,进行进一步的理解。)

    4.2尽信书不如无书,本文也不是权威的讲解。本文例子,仅供大家入门学习ios的这个知识点。更深层次的原理和应用,还需要大家慢慢琢磨了。当前,能在自己的工程中,实现这个功能,你就成功了。提前祝贺你成功!

    1 ///////// 重写的 application 方法******** 请参考 AppDelegate.m 文件中的代码

    2 -(bool)application:(UIApplication*)application openURL:(nonnull NSURL *)url options:(nonnull NSDictionary *)options

    3 {

    4     //// 打印 我们收到的参数、以及应用程序的 applicationkey

    5     NSLog(@"AppDemo1被启动,下面是 AppDemo2传递过来的 启动参数:");

    6     NSString* strUrl = [[NSString alloc] init];

    7     strUrl = url.absoluteString;

    8     NSLog(@"strURL:%@", strUrl);

    9

    10     NSString* sourceApplication = options[UIApplicationOpenURLOptionsSourceApplicationKey];

    11     NSLog(@"sourceApplication:%@", sourceApplication);

    12     return YES;

    13 }

    代码:

    MyApp1

    #import"ViewController.h"

    @interfaceViewController()@property(nonatomic,strong)UILabel*labelOne;@property(nonatomic,strong)UIButton*APPOneBut;// app1按钮

    @end

    @implementation

    ViewController

    - (

    void

    )viewDidLoad {

    [

    superviewDidLoad

    ];

    // Do any additional setup after loading the view, typically from a nib.

    self.view.backgroundColor= [UIColororangeColor

    ];

    [

    self.viewaddSubview:self.labelOne

    ];

    [

    self.viewaddSubview:self.APPOneBut

    ];

    }

    //懒加载

    - (

    UILabel

    *)labelOne {

    if(!_labelOne

    ) {

    _labelOne= [[UILabelalloc]initWithFrame:CGRectMake(0,20,self.view.bounds.size.width,40

    )];

    _labelOne.textColor= [UIColorblackColor

    ];

    _labelOne.backgroundColor= [UIColorcyanColor

    ];

    _labelOne.textAlignment=NSTextAlignmentCenter

    ;

    _labelOne.text=@"MyAPP1"

    ;

    }

    return_labelOne

    ;

    }

    - (

    UIButton

    *)APPOneBut {

    if(!_APPOneBut

    ) {

    _APPOneBut= [UIButtonbuttonWithType:UIButtonTypeCustom

    ];

    _APPOneBut.frame=CGRectMake(0,0,100,100

    );

    _APPOneBut.backgroundColor= [UIColoryellowColor

    ];

    [

    _APPOneButsetTitle:@"按钮1"forState:UIControlStateNormal

    ];

    [

    _APPOneButsetTitleColor:[UIColorblackColor]forState:UIControlStateNormal

    ];

    _APPOneBut.center=self.view.center

    ;

    [

    _APPOneButaddTarget:selfaction:@selector(buttonAction:)forControlEvents:UIControlEventTouchUpInside

    ];

    }

    return_APPOneBut

    ;

    }

    - (

    void)buttonAction:(UIButton

    *)appBut {

    NSLog(@"MyAppOne"

    );

    //字符串AppDemo2后面的"://"是必须添加的,否则会无法打开你指定的app的URL的。

    //代码介绍了无参URL和有参URL。如果想传递参数,在“://”后面附加这些参数即可。

    //带参数的传递方式

    NSURL*urlLocal = [NSURLURLWithString:@"AppDemo2://1234"

    ];

    //不带参数的传递方式(此刻在APP1中,传递APP2所注册的URL)

    //NSURL *urlLocal = [NSURL URLWithString:@"AppDemo2://"];

    //判断是否可以启动该url

    if([[UIApplicationsharedApplication]canOpenURL

    :urlLocal]) {

    [[

    UIApplicationsharedApplication]openURL

    :urlLocal];

    NSLog(@"启动APP2程序"

    );

    }

    }

    - (

    void

    )didReceiveMemoryWarning {

    [

    superdidReceiveMemoryWarning

    ];

    // Dispose of any resources that can be recreated.

    }

    @end

    MyApp2

    AppDelegate

    // *****重写appdelegate方法-用来接收工程App1传过来的参数*****

    - (

    bool)application:(UIApplication*)app openURL:(NSURL*)url options:(NSDictionary

    > *)options {

    NSLog(@"MyApp2启动,接收来自MyApp1传递的参数"

    );

    NSString*strUrl = [[NSStringalloc]init

    ];

    strUrl = url.

    absoluteString

    ;

    NSLog(@"strUrl:%@"

    , strUrl);

    NSString*sourceApplication = options[UIApplicationOpenURLOptionsSourceApplicationKey

    ];

    NSLog(@"sourceApplication:%@"

    , sourceApplication);

    returnYES

    ;

    }

    相关文章

      网友评论

          本文标题:iOS 一个app启动另一个app

          本文链接:https://www.haomeiwen.com/subject/eongqxtx.html