ios app真正的相互!!調用


1.需求:A應用打開B。B回跳到A
 
2.問題:
看到網絡上的文檔講的大多數都是app單向跳轉的例子,而我們在跳轉到第二個app的時候往往需要返回到原來的app,雖然支付寶微信等第三方等應用會有回調的函數,但是如果打開的應用是自己的app,那么如何實現從第二個應用返回原來的應用呢,作為一個新人真的有點搞不清楚了,但是經過一上午的摸索,也大概弄明白了。
 
3.基礎
例子:A1,A2,A3,A4..... 為幾個應用,B是需要被打開的應用,我們都知道要想在應用內打開其他B應用就需要讓B規定一個協議,A遵循這個協議,這個協議就是下面圖片的內容:
 
而A要是想打開B必須遵循這個協議,也就是下圖:
注:我們這里先理解為 :LSApplicationQueriesSchemes是一個白名單,就是A中想打開的應用必須在白名單當中
至少我在網上看到的都是這么理解的。
 
完成后我們就可以在A內打開B了,打開不是重點,稍后再細說如何代碼打開以及回調接收的事。
 
4.迷霧
 
現在要談論的是怎么從B回到A,其實從B回到A就是在B中打開A應用,那么我們也同樣需要A規定一個協議,其他遵循這個協議的APP(也就是B)可以打開A。
不知道你繞暈了沒有,簡單來說就是要想打開一個app,這個app要規定一個協議,同時其他app要遵循這個協議並且添加這個白名單才能夠打開這個app。
 
那么要想從B跳轉到A只需要在A中添加一個協議(這個好解決),同時B遵循這個協議設置白名單就可以了。
 
重點是設置白名單,有那么多的A,怎么在B內設置白名單,而且如果有用戶注冊了新的A,那么怎么在plist文件下添加白名單。
 
我開始的思路是,獲取到info.plist 文件,跳轉到其他app時用代碼動態寫入白名單,但是上網查詢發現,系統的info.plist 文件
 
readonly,沒辦法,這個方法行不通。。。。。。
 
 
 
 
5.撥雲見日
 
然后我繼續在網上找資料發現,其實網上大多數文章根本沒有理解LSApplicationQueriesSchemes 的真正含義,它是白名單,
但是他只有在判斷是否手機安裝了B應用的時候才有用,也就是說,如果不需要判斷你根本沒必要設置這個白名單。
 
現在重新梳理一下我們的需要:
A跳轉到B,然后回跳到A。
A跳到B:需要判斷是否安裝了B,安裝了就跳轉,沒有安裝執行其他操作(加載網絡端或者安裝應用)
B回跳A:需要判斷是否安裝了A嗎????需要嗎???答案是不需要,不要要判斷,那么B中的白名單也就不需要添加了。
 
6.總結:重點是對LSApplicationQueriesSchemes的理解,被網上的一些copy的文章弄暈了,只有需要判斷本地是否安裝了應用的時候才需要添加白名單
 
7.最后的Demo:
 
———————————————————A打開B—————————————————
 
A應用:
 
1.URL types 規定了一個協議,B打開A的時候需要用到back 
2.LSApplicationQueriesSchemes 添加B中協議為白名單,打開B時判斷是否安裝了B時需要
 
 
3.在A中需要打開B的位置添加如下代碼,其中ssss是參數(隨便寫的,B中的host就是參數信息)
 
NSURL *url=[NSURL URLWithString:@"pay://ssss"];
if ([[UIApplication sharedApplication] canOpenURL:url]) {
        NSDictionary *options=@{};
        [[UIApplication sharedApplication] openURL:url options:options completionHandler:^(BOOL success) {
            NSLog(@"sucA");
        }];
    }

 
B應用:
 
      1. URL types 規定了一個協議,A打開B的時候需要用到,
 
     2.在delegate中添加如下代碼,下面的代碼會在A打開B的時候調用:
////iOS 4-9.0
-(BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation{
    NSLog(@"回調處理 be calledbefore 9.0  host:%@",url.host);
    if ([url.host isEqualToString:@"sucpay"]) {
        // 處理結果    
    }
   
    return YES;
}
//iOS 9.0 later
-(BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary<UIApplicationOpenURLOptionsKey,id> *)options{
    NSLog(@"回調處理be called after 9.0 host:%@",url.host);
    if ([url.host isEqualToString:@“sucpay"]) {
        // 處理支付結果   
    }
    return YES;
}

 
注:A調B,走的是B中的openURL方法()
 
———————————————————B打開A—————————————————
B打開A不需要判斷是否安裝了A,因為肯定安裝了,所以不用添加白名單。
 
B應用:下面代碼回到A(一定不要判斷,因為沒有白名單)
NSURL *url=[NSURL URLWithString:@"back://bbbb"];

        NSDictionary *options=@{};
        [[UIApplication sharedApplication] openURL:url options:options completionHandler:^(BOOL success) {
            NSLog(@"sucB");
        }];
A應用:
////iOS 4-9.0
-(BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation{
    NSLog(@"回調處理 backbefore 9.0  host:%@",url.host);
    if ([url.host isEqualToString:@"sucpay"]) {
        // 處理結果    
    }
   
    return YES;
}
//iOS 9.0 later
-(BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary<UIApplicationOpenURLOptionsKey,id> *)options{
    NSLog(@"回調處理   back after 9.0 host:%@",url.host);
    if ([url.host isEqualToString:@“sucpay"]) {
        // 處理支付結果   
    }
    return YES;
}

 
注:B調A,走的是A中的openURL方法()
 
無論是A應用還是B應用中,openURL方法只在需要的時候寫,不需要就沒必要寫了


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM