基礎(chǔ)篇-應(yīng)用之間的跳轉(zhuǎn)

前言

iOS開發(fā)過程中,遇到的應(yīng)用間跳轉(zhuǎn)的情景大體是下面的情況

  • 使用第三方用戶登錄,跳轉(zhuǎn)到需授權(quán)的App或跳轉(zhuǎn)到分享app的對應(yīng)頁面
    需要用戶授權(quán),還需要"返回到調(diào)用的程序,同時(shí)返回授權(quán)的用戶名、密碼";
  • 應(yīng)用程序推廣,跳轉(zhuǎn)到另一個(gè)應(yīng)用程序(本機(jī)已經(jīng)安裝);
  • 跳轉(zhuǎn)到iTunes并顯示應(yīng)用程序下載頁面(本機(jī)沒有安裝);
  • 第三方支付,跳轉(zhuǎn)到第三方支付App,如支付寶支付,微信支付;
  • 使用系統(tǒng)內(nèi)置程序,如跳轉(zhuǎn)到打電話、發(fā)短信、發(fā)郵件、Safari等

那么應(yīng)用之間的跳轉(zhuǎn)到底有哪些值得注意的地方呢,本文做一個(gè)簡單的歸納。

原理

在應(yīng)用A跳轉(zhuǎn)到應(yīng)用B,則給A、B自身自定義URL Schemes(自定義的協(xié)議頭)后,通過在A中處理B的URL Schemes,就可以在A中啟動B了。

不過值得注意的是:iOS9之后,應(yīng)用間跳轉(zhuǎn)需要在Info.plsit中設(shè)置白名單。以 ‘LSApplicationQueriesSchemes’為Key值,對應(yīng)數(shù)組value中添加白名單應(yīng)用的URL Schemes即可。若未設(shè)置白名單,會報(bào)錯。

Xcode error

-canOpenURL: failed for URL: "應(yīng)用B的URL Schemes://" - error: "This app is not allowed to query for scheme 應(yīng)用B"

在info.plist中這樣設(shè)置即可.

<key>LSApplicationQueriesSchemes</key>
<array>
    <string>nihao</string>
</array>

栗子一:應(yīng)用A跳轉(zhuǎn)到應(yīng)用B

需要在B應(yīng)用中如此設(shè)置

A中如此跳轉(zhuǎn)設(shè)置

 if ( [[UIApplication sharedApplication]canOpenURL:[NSURL URLWithString:@"nihao://"]]) {
        [[UIApplication sharedApplication]openURL:[NSURL URLWithString:@"nihao://"]];
  }else{
      NSLog(@"未安裝");
 }

栗子二:應(yīng)用A跳轉(zhuǎn)到應(yīng)用B指定界面

A中如此跳轉(zhuǎn)設(shè)置

 if ( [[UIApplication sharedApplication]canOpenURL:[NSURL URLWithString:@"nihao://one"]]) {
      [[UIApplication sharedApplication]openURL:[NSURL URLWithString:@"nihao://one"]];
}else{
    NSLog(@"未安裝");
}

B中如此的設(shè)置

- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation
{
    UINavigationController *nav = [UIApplication sharedApplication].keyWindow.rootViewController;
    if ([url.absoluteString containsString:@"one"]) {
        ONEVC  *subV = [[ONEVC alloc]init];
        [nav pushViewController:subV animated:YES];
    }
    return YES;
}

此處的nihao://one 中的 one 只是一種標(biāo)示。

栗子三:應(yīng)用B反跳轉(zhuǎn)回應(yīng)用A

步驟分析:從A跳到B再跳轉(zhuǎn)回A,那么在A跳轉(zhuǎn)到B的時(shí)候,還應(yīng)將應(yīng)用A的URL Schemes傳遞過來。這樣我們才能指定返回哪個(gè)應(yīng)用程序(iOS9之后,該應(yīng)用一定要添加到白名單內(nèi))

指定一個(gè)傳遞URL的規(guī)則:協(xié)議頭://應(yīng)用B的URL Schemes?應(yīng)用A的URL Schemes。即:AppB://One?AppA。

說明

AppB是跳轉(zhuǎn)過來的應(yīng)用App-B的URL Schemes;
One是用來區(qū)別跳轉(zhuǎn)頁面的標(biāo)識;
 ? 是分割符;
AppA是跳轉(zhuǎn)回的應(yīng)用App-A的URL Schemes

2、我們根據(jù)傳遞來的數(shù)據(jù),進(jìn)行反跳回去。跳轉(zhuǎn)頁面設(shè)置一個(gè)屬性保存?zhèn)鬟f的字符串

- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation
{
   UINavigationController *nav = [UIApplication sharedApplication].keyWindow.rootViewController;
    if ([url.absoluteString containsString:@"one"]) {
    ONEVC  *subV = [[ONEVC alloc]init];
    subV.urlStr =  url.absoluteString;   //保存 傳過來的跳轉(zhuǎn)信息
    [nav pushViewController:subV animated:YES];
  }
  return YES;
}

在B應(yīng)用的ONEVC的需要反跳轉(zhuǎn)的地方

  NSString *oneUrlScheme = [[[self.urlStr componentsSeparatedByString:@"?"] lastObject] stringByAppendingString:@"://"];
    
 if ( [[UIApplication sharedApplication]canOpenURL:[NSURL URLWithString:oneUrlScheme]])  {
        [[UIApplication sharedApplication]openURL:[NSURL URLWithString:oneUrlScheme]];
 }else{
      NSLog(@"無法跳轉(zhuǎn)");
 }

調(diào)用的iPhone本機(jī)上的應(yīng)用

  • 調(diào)用自帶郵件

    [[UIApplicationsharedApplication] openURL :[NSURLURLWithString:@“mailto://admin@hzlzh.com” ]];

  • 調(diào)用電話

    [[UIApplication sharedApplication ] openURL :[NSURLURLWithString:@“tel:// 8008808888” ]];

  • 調(diào)用短信

    [[UIApplicationsharedApplication]  openURL :[NSURL  URLWithString :@“sms:// 800888” ]];  
    
  • 調(diào)用自帶瀏覽器safari

    [[UIApplicationsharedApplication]  openURL :[NSURLURLWithString:@“http://www.hzlzh.com” ]];  
    
  • 調(diào)用遠(yuǎn)程

    [[UIApplicationsharedApplication]  openURL :[NSURL  URLWithString :@“remote:// fff” ]];  
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容