iOS 一個app啟動另一個app

因為項目的需要锻弓,我們公司的兩個項目要可以相互訪問,查找資料涧窒,經(jīng)過自己的總結(jié)寫下這篇文章心肪,希望可以幫助大家。


1.注冊自己的URL

新建一個工程MyAppOne纠吴,在info.plist 文件中添加字段硬鞍,注冊 MyAppOne的URL.

1.1在 Information Property List中,點擊“+” 添加 URL types,添加一個Item固该,再在Item中锅减,添加“URL Schemes”,再在URL Schemes的Item中伐坏,添加一個字符串“AppDemo1”(參考下圖)怔匣,該字符串 即為 當(dāng)前 工程 MyAppOne 自己 為自己注冊的 URL。注冊自己的URL完成桦沉。

1.2我們剛才注冊的自己的URL每瞒,就相當(dāng)于我們當(dāng)前的工程MyAppOne的一個身份標(biāo)識。其他app通過ios提供的接口(后面會介紹是ios 的哪個函數(shù))纯露,調(diào)用這個URL就能啟動我們這個MyAppOne應(yīng)用程序了剿骨。

2. 白名單LSApplicationQueriesSchemes

在ios9以后,需要在info.plist文件中添加LSApplicationQueriesSchemes(白名單)埠褪,才能合法啟動你想要啟動的那個app钳枕。白名單中添加的磅轻,是你想要啟動的app的 URL(這個URL就是上面講解的“注冊自己的URL”)顷啼。

2.1 添加 LSApplicationQueriesSchemes藕夫。(當(dāng)前的工程是xcode7.3.1,xcode沒有自動匹配 LSApplicationQueriesSchemes渴语,因此苹威,需要你手動輸入這個字段,并將它的屬性改為【Array】)遵班,在LSApplicationQueriesSchemes 中添加“AppDemo2”屠升。

我們假設(shè)已經(jīng)有一個MyAppTwo,它注冊的URL是 AppDemo2狭郑。我們想在MyAppOne工程去啟動的MyAppTwo這個app腹暖,就需要在白名單中添加MyAppTwo的URL。

3.MyAppOne 啟動 另一個App的關(guān)鍵代碼

3.1 字符串AppDemo2后面的 "://"是必須添加的翰萨,否則會 無法打開你指定的app的URL的脏答。

3.2 代碼介紹了 無參URL和有參URL。如果想傳遞參數(shù)亩鬼,在“://”后面附加這些參數(shù)即可殖告。

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.不帶參數(shù)的傳遞方式

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

8???? /// 2.帶參數(shù)的傳遞方式

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];// 已經(jīng)棄用

// iOS10.0之后

// 不傳參數(shù)

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

// 傳遞參數(shù)

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

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

23???? }

24 }

3.3至此,已經(jīng)介紹完如何從一個app1啟動另一個app2了雳锋。

步驟如下:

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

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

③app1中調(diào)用[UIApplication sharedApplication] openURL:urlLocal]; 方法黄绩,啟動 app2。(可以參考鏈接中的demo玷过,進行進一步的理解爽丹。)

如何獲取傳遞這種啟動方式筑煮,傳遞過來的參數(shù)呢?

4.獲取傳遞過來的參數(shù)

4.1在AppDelegate.m 中重寫 下面的這個application方法(如果文件中沒有這個函數(shù)粤蝎,就手動添加下面的函數(shù)真仲,這就是重寫)。傳遞過來的參數(shù)初澎,就在 url中秸应。(可以參考鏈接中的demo,進行進一步的理解碑宴。)

4.2盡信書不如無書软啼,本文也不是權(quán)威的講解。本文例子延柠,僅供大家入門學(xué)習(xí)ios的這個知識點焰宣。更深層次的原理和應(yīng)用,還需要大家慢慢琢磨了捕仔。當(dāng)前,能在自己的工程中盈罐,實現(xiàn)這個功能榜跌,你就成功了。提前祝賀你成功盅粪!

1 ///////// 重寫的 application 方法******** 請參考 AppDelegate.m 文件中的代碼

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

3 {

4???? //// 打印 我們收到的參數(shù)钓葫、以及應(yīng)用程序的 applicationkey

5???? NSLog(@"AppDemo1被啟動,下面是 AppDemo2傳遞過來的 啟動參數(shù):");

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。如果想傳遞參數(shù)奠骄,在“://”后面附加這些參數(shù)即可豆同。

//帶參數(shù)的傳遞方式

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

];

//不帶參數(shù)的傳遞方式(此刻在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傳過來的參數(shù)*****

- (

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

> *)options {

NSLog(@"MyApp2啟動含鳞,接收來自MyApp1傳遞的參數(shù)"

);

NSString*strUrl = [[NSStringalloc]init

];

strUrl = url.

absoluteString

;

NSLog(@"strUrl:%@"

, strUrl);

NSString*sourceApplication = options[UIApplicationOpenURLOptionsSourceApplicationKey

];

NSLog(@"sourceApplication:%@"

, sourceApplication);

returnYES

;

}

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末影锈,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子蝉绷,更是在濱河造成了極大的恐慌鸭廷,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,194評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件熔吗,死亡現(xiàn)場離奇詭異辆床,居然都是意外死亡,警方通過查閱死者的電腦和手機桅狠,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,058評論 2 385
  • 文/潘曉璐 我一進店門讼载,熙熙樓的掌柜王于貴愁眉苦臉地迎上來轿秧,“玉大人,你說我怎么就攤上這事维雇∮偃校” “怎么了?”我有些...
    開封第一講書人閱讀 156,780評論 0 346
  • 文/不壞的土叔 我叫張陵吱型,是天一觀的道長逸贾。 經(jīng)常有香客問我,道長津滞,這世上最難降的妖魔是什么铝侵? 我笑而不...
    開封第一講書人閱讀 56,388評論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮触徐,結(jié)果婚禮上咪鲜,老公的妹妹穿的比我還像新娘。我一直安慰自己撞鹉,他們只是感情好疟丙,可當(dāng)我...
    茶點故事閱讀 65,430評論 5 384
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著鸟雏,像睡著了一般享郊。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上孝鹊,一...
    開封第一講書人閱讀 49,764評論 1 290
  • 那天炊琉,我揣著相機與錄音,去河邊找鬼又活。 笑死苔咪,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的柳骄。 我是一名探鬼主播团赏,決...
    沈念sama閱讀 38,907評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼夹界!你這毒婦竟也來了馆里?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,679評論 0 266
  • 序言:老撾萬榮一對情侶失蹤可柿,失蹤者是張志新(化名)和其女友劉穎鸠踪,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體复斥,經(jīng)...
    沈念sama閱讀 44,122評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡营密,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,459評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了目锭。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片评汰。...
    茶點故事閱讀 38,605評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡纷捞,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出被去,到底是詐尸還是另有隱情主儡,我是刑警寧澤,帶...
    沈念sama閱讀 34,270評論 4 329
  • 正文 年R本政府宣布惨缆,位于F島的核電站糜值,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏坯墨。R本人自食惡果不足惜寂汇,卻給世界環(huán)境...
    茶點故事閱讀 39,867評論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望捣染。 院中可真熱鬧骄瓣,春花似錦、人聲如沸耍攘。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,734評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽蕾各。三九已至臼膏,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間示损,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,961評論 1 265
  • 我被黑心中介騙來泰國打工嚷硫, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留检访,地道東北人。 一個月前我還...
    沈念sama閱讀 46,297評論 2 360
  • 正文 我出身青樓仔掸,卻偏偏與公主長得像脆贵,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子起暮,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,472評論 2 348

推薦閱讀更多精彩內(nèi)容