1. 程式人生 > >從一個App跳轉到另一APP

從一個App跳轉到另一APP

 應用場景:

       百度地圖等

       第三方支付

       第三方分享登陸

下面先說幾個概念性東西:

     1 URL :統一資源定位符(可以沒有路徑但是必須要有協議頭)

     2 scheme: 協議頭,用來決定查詢資源的方式

     3 path:路徑

預設情況下應用程式沒有URL,並且在iOS中開啟一個應用程式只要能拿到這個應用程式協議頭即可

iOS 從一個APP跳轉到另一個APP,並帶引數跳到指定頁面.  https://blog.csdn.net/wangqinglei0307/article/details/78685058

開始實現:

  1 新建兩個工程 AppTurnOne 和 AppTurnTwo   並在一中建立一個button 新增點選事件

  2 我們做的是從 one 跳到 two  需要在two中設定下scheme 如下圖:(設定URL scheme) weichat qq weibo 都是統一的;

當另一個app需要設定跳轉到本app需要獲取本app的協議頭如截圖一

     //app AppTurnTwo另一個需要跳轉的App需要這個scheme

:

3 回到Appone 在點選事件中:

//跳轉到另一個App (不加判斷直接跳轉)

//[[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"AppTurnTwo://"]];

4 先執行 two 再執行one 讓這兩個程式都安裝到模擬機上 點選button就會跳轉到另一個頁面

5 判斷手機中是否安裝了需要跳轉的APP 如果有跳轉 沒有就跳轉到網頁版 或者返回.

/1 獲取對應程式的URL

//NSURL *url= [NSURL URLWithString:@"AppTurnTwo://"];

NSURL *url = [NSURLURLWithString:[NSStringstringWithFormat:@"AppTurnTwo://"]];

//2 判斷手機中是否安裝了對應的應用程式

//1 獲取對應程式的URL

//NSURL *url= [NSURL URLWithString:@"AppTurnTwo://"];

NSURL *url = [NSURLURLWithString:[NSStringstringWithFormat:@"AppTurnTwo://"]];

//2 判斷手機中是否安裝了對應的應用程式

if ([[UIApplicationsharedApplication] canOpenURL:url]) {

//3 開啟應用程式

      [[UIApplicationsharedApplication] openURL:url];

    }else{

//調轉到網頁版這兒以百度為例

        [[UIApplicationsharedApplication] openURL:[NSURLURLWithString:@"http://www.baidu.com"]];

   }

這時執行會報以下錯誤:

This app is not allowed to query for scheme AppTurnTwo

這個程式是不允許AppTurnTwo查詢方案

原因:

iOS 9系統策略更新,限制了http協議的訪問,此外應用需要在“Info.plist”中將要使用的URL Schemes列為白名單,才可正常檢查其他應用是否安裝。

受此影響,當你的應用在iOS 9中需要使用微信SDK的相關能力(分享、收藏、支付、登入等)時,需要在“Info.plist”裡配置


配置: LSApplicationQueriesSchemes 

再執行就可以跳轉了:

如果你的輸出資訊是-canOpenURL: failed for URL: "kindle://home" - error: "This app is not allowed to query for scheme kindle"

去你的 target 裡面的 Build Settings 下的 Enable Bitcode,把它設定成 NO,這不一定會阻擋你的控制檯繼續輸出這條資訊,但是可以保證你的 App 正常執行

關於其他通過 WebView 訪問 http 網址引發的控制檯報錯資訊 什麼info.plist 

這個錯誤是沒有開啟網路

<code class="xml">NSAppTransportSecurity</code>
<code class="xml"></code><pre class="hljs xml" name="code" style="white-space: pre-wrap; word-wrap: break-word; padding: 0.5em; font-size: 14px; line-height: 26px; background: rgb(255, 255, 255);"><code class="xml">NSAllowsArbitraryLoads</code>
OK!iOS 從一個APP跳轉到另一個APP,並帶引數跳到指定頁面

功能實現:A跳到B並開啟B中指定頁面

步驟:

1.首先建立兩個專案(專案A,專案B),在專案B中的info.plist檔案中新增URL Types,如下圖所示:這裡寫圖片描述其中URL idenifier是專案B的bundle id ,URL Schemes 中新增一個命令字首,我這裡使用“projectB”,這個名字可以自己取,執行一下專案B。

2.在專案A中新增跳轉程式碼

[[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"projectB://"]];
  • 1

這裡的URL的命令字首必須和之前自己定義的一致,我把這行程式碼加到了一個button的點選方法裡,現在點選button就可以跳到專案B了。 
這裡寫圖片描述這裡寫圖片描述

3.現在說下app之間跳轉的通訊,其實跟傳值差不多。專案A中第二個button的點選方法新增程式碼

[[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"projectB://openBSecondPage"]];
  • 1

4 . 專案B中在appDelegate中新增一個NSURL的屬性,實現一個代理方法接收從專案A傳過來的URL

-(BOOL)application:(UIApplication *)application handleOpenURL:(NSURL *)url
{
    self.url = url;
    return YES;
}
  • 1
  • 2
  • 3
  • 4
  • 5

然後在B中第一個介面加上程式碼

- (void)viewDidLoad {
    [super viewDidLoad];
    NSURL * url = ((AppDelegate *)[UIApplication sharedApplication].delegate).url;
   ;
    if(url){
        //顯示一下從A獲取的url,url = projectB://openBSecondPage,host = openBSecondPage
        self.label.text = [NSString stringWithFormat:@"url = %@,host = %@",[url absoluteString],[url host]];
        //根據傳過來的url的host進行一些操作
        if ([[url host]isEqualToString:@"openBSecondPage"]) {
            //跳轉到第二個介面
            [self performSegueWithIdentifier:@"second" sender:nil];
        }
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

這裡寫圖片描述 
這裡寫圖片描述 
簡而言之,就是根據從A中傳過來的URL開啟專案B後進行一些自定義操作