因為項目的需要锻弓,我們公司的兩個項目要可以相互訪問,查找資料涧窒,經(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
;
}