iOS 一个app启动另一个app

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


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

;

}

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,271评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,275评论 2 380
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,151评论 0 336
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,550评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,553评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,559评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,924评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,580评论 0 257
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,826评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,578评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,661评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,363评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,940评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,926评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,156评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,872评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,391评论 2 342

推荐阅读更多精彩内容