標籤:
做各大平台分享的時候由於帳號混亂,導致分享回調的時候啟動了另一個app,這個時候我在猜想這些SDK是怎麼喚醒沒有啟動的其他app的,不難想象,肯定跟AppDelegate處理回調openUrl有關,於是搜了一下才發現,一個應用程式可以喚醒另一個應用程式,只怪我菜,好啦,現在告訴不知道的朋友怎麼來實現一個app怎麼喚醒另一個app,以及讓兩個app之間互相通訊。。。
測試工程操作如下
1.建立一個app1,在Info.plist檔案的資訊屬性列表裡建立一組,類型是URL types 設定如下
這裡最關鍵的部分在於URL Schemes數組裡的Item 0,後面的填寫的字串就是你用來通訊的命令首碼“achao”,URL identifier只是一個標示符,隨意填寫然後再AppDelegate裡處理重載下面的回調方法
-(BOOL)application:(UIApplication *)application handleOpenURL:(NSURL *)url
{
if ([[url scheme] isEqualToString:@"achao"])
{
NSLog(@"%@",url);
}
return YES;
}
可以看見[url scheme]這個命令是為了拿到url的scheme,就是命令首碼“achao” 2.建立app2,這個app什麼都不用操作,只需要去喚醒app1即可,於是我們在viewDidLoad裡寫上這一句
[[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"achao://hello"]];
"achao"就是app1裡的url scheme,我叫它命令首碼(我懷疑apple的應用程式裝上過後有個像通知中樞一樣的應用程式來統一管理,而每個應用程式的url scheme都會在那裡被記錄,以供其他app來調用該app,至於url scheme屬於哪個應用程式,當然是和app的Bundle identifier相關的),格式採用“首碼://..." 3.我們關閉app1,app2,然後再啟動app2,發現app2啟動過後喚醒了app1,並且成功跳轉;我們再關閉app1,app2,然後我們開啟app1進行監測,發現app1被啟動後,進入了
這就實現了兩個app之間的喚醒和通訊 4.當然這時候你可能才想到,那不是很多應用程式都會被其他垃圾程式調用了,尋找資料過後,原來還有後續我們重載這個方法
-(BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation
{
if ([sourceApplication isEqualToString:@"AC.achao.com"])
{
NSLog(@"%@", sourceApplication); //來源於哪個app(Bundle identifier)
NSLog(@"scheme:%@", [url scheme]); //url scheme
NSLog(@"query: %@", [url query]); //查詢串 用“?...”格式訪問
return YES;
}
else
return NO;
}
這就滿足我們的需求了,我們可以通過sourceApplication來判斷來自哪個app以決定要不要喚醒自己的app,也可以通過[url query]來獲得查詢串,這個時候我們需要更改app2的訪問方式才能獲得這個參數
[[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"achao://hello?name=achao-AC"]];
我們也可以直接在safari離輸入"achao://hello?name=achao-AC"來訪問我們的app1,這個時候sourceApplication就是@"com.apple.mobilesafari"
總結:類似下面的方法
[[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"http://www.baidu.com"]];
[[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"sms://158********"]];
[[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"tel://158********"]];
[[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"mailto://362****@qq.com"]];
我們用過很多,估計也是程式內部設定了類似的url scheme來供其他應用程式操作的
也許我理解的有錯誤,歡迎大家一起交流分享,不甚感激!
iosAPP之間的跳轉