iOS系統是具備在設備上的兩個App之間進行相互跳轉功能的。
而且跳轉的需求我們也會經常見到,比如在豆瓣中分享一個影評,會在分享后,給與用戶選擇是直接跳轉到微博中還是留在豆瓣;這些都是這個功能很常見的使用。
而實現二者之間可以相互跳轉甚至可以說是通信的實現,是基于二者之間約定的協議來達成通訊,就如同互聯網最基本的TCP/IP協議,只要二者都遵循并實現這個協議,二者之間就可以實現跳轉通信。在iOS中使用的是URL Schemes作為二者的通信“協議”,跳轉的方法蘋果也幫助我封裝在了UIApplication中。
- (BOOL)openURL:(URL)url;
其中在iOS中我們一般的使用打開系統的應用程序也是使用的類似于這種“URL”方法
// 打開打電話應用程序
URL:tel
// 打開發短信應用程序
URL:sms
打開系統的設置界面,必須先在info.plist中配置URL Schemes
在URL Types中添加prefs
// 打開Wifi設置
URL:prefs:root=WIFI
// 打開定位服務
URL:prefs:root=LOCATION_SERVICES
// 打開藍牙服務
URL:prefs:root=Bluetooth
// 打開FaceTime
URL:prefs:root=FACETIME
// 打開音樂
URL:prefs:root=MUSIC
// 打開墻紙設置
URL:prefs:root=Wallpaper
結合網上的一些關于兩個App之間的跳轉,這里也是分為了3中情況實現。
-
- 單跳轉
應用
App_A
-->應用App_B
,只管跳轉過去,不管從應用App_B
在跳轉回App_A
。
a. 首先要在項目 App_B
當中設置URL Schemes。該key必須確保唯一,要提供給App_A
用。
如下截圖所示,我在這個測試App中設置URL Schemes
為APPB
(當然這里在避免特殊字符后可以隨機設置)
可按照如下路徑設置:
TARGETS -> Info -> URL Types(下拉展開) -> URL Scheme
(如果初始建立的工程中URL Types中沒有任何內容,可點擊底部加號創建即可)
或者 直接在 Info.plist 也可以添加
iOS應用間跳轉-1.png
b. 在另一個APP應用App_A
實現跳轉代碼
注意: iOS9中打開一個應用程序的URL必須配置 Info.plist
文件
添加 LSApplicationQueriesSchemes
的key
添加對應 URLSchemes
- (void)testMethod1{
// 此URL的格式是應用App_B設置的URL Scheme
NSString *urlStr = @"APPB://";
NSURL *url = [NSURL URLWithString:urlStr];
// 在這里可做處理判斷,如果沒有跳轉APPStore去下載
if ([[UIApplication sharedApplication]canOpenURL:url]) {
// 此方法可用于跳轉時傳值和跳轉后響應處理操作
NSDictionary *dicInfo = @{@"APPA_key":@"APPA_value"};
[[UIApplication sharedApplication]openURL:url options:dicInfo completionHandler:^(BOOL success) {
}];
// [[UIApplication sharedApplication]openURL:url];
}else{
UIAlertView *alert = [[UIAlertView alloc]initWithTitle:@"提示" message:@"跳轉的應用程序未安裝" delegate:self cancelButtonTitle:@"cancel" otherButtonTitles:@"Dowload", nil];
[alert show];
}
}
- 相互跳轉
相較于單跳轉,相互跳轉只不過是把上面單跳轉的步驟相同的在另一個需要跳轉和被跳轉的App應用中執行一次即可。可按照上述單跳轉步驟在執行一次即可,這里不作詳述
- 跳轉參數傳值
具體的一些實現跳轉操作可如下代碼:
在跳轉App_A中配置相應傳值參數
在上述單跳轉步驟中,- testMethod1 方法中,urlStr = @"APPB://";
---> urlStr = @"APPB://testInt = 10";
在被跳轉App_B中接收跳轉參數
在 AppDelegate.m 文件中 -- 實現此方法 (注此方法在后面版本iOS中已經deprecated)
-(BOOL)application:(UIApplication *)application handleOpenURL:(NSURL *)url
{
NSString *urlParameter = url.absoluteString;
UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"傳過來的參數是" message: urlParameter delegate:self cancelButtonTitle:@"取消" otherButtonTitles:nil, nil];
[alert show];
return YES;
}
在這里我自己其實有個疑問就是,我們一般在實現Facebook或者是國內的微博在我們自己的App中實現其登錄功能,在跳轉到相應的Facebook或者微博后,登錄成功授權后還會重新跳轉到我們自己的App中,此功能如何實現?
我自己給了如下猜測:
如果需要跳轉登錄并授權到Facebook或者微博肯定需要在其官網的開發者選項中加入我們的應用id;
而其在登錄成功授權后,會根據我們在官網注冊的id實現跳轉回到我們的應用中。(其中App_id肯定已經存儲在當前設備的Facebook或者微博對應的應用中)