iOS開發(fā) - APP間通訊

常用的APP間通訊場景是支付和分享。接入支付寶等支付場景時需要跳轉到支付寶APP,完成支付后再將支付結果返回原來的APP,這樣就涉及APP間傳值。

新建App1和App2兩個應用,如果我想從App1調起App2,那么我需要添加App2的URL Scheme,不同于其他手機APPs的值,用來在App1發(fā)起openUrl方法時找到手機里的App2應用。

設置App2的URL Scheme為AppTwoScheme


App1想要調起App2時只需要通過如下方法即可

NSURL *url = [NSURL URLWithString: [NSString stringWithFormat: @"AppTwoScheme://com.zy.app1/subpath?para=%i&from=%@", 1, @"app1"]];
if ([[UIApplication sharedApplication] canOpenURL: url]) {
    NSLog(@"canOpenUrl");
    if (@available(iOS 10, *)) {
        NSDictionary *options = @{UIApplicationOpenURLOptionsSourceApplicationKey : @YES};
        [[UIApplication sharedApplication] openURL: url options: options completionHandler: nil];
    }else{
        [[UIApplication sharedApplication] openURL: url];
    }
}

從iOS 10開始,還需要在App1中添加白名單LSApplicationQueriesSchemes數組


如果只需要從App1到App2,不需要返回,這要就可以了。

在App2的AppDelegate代理方法中接收傳入的值,如果使用SceneDelegate類,則在-(void)scene:(UIScene *)scene openURLContexts:(NSSet<UIOpenURLContext *> *)URLContexts代理方法中接收。

-(BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary<UIApplicationOpenURLOptionsKey,id> *)options
{
    UIAlertController *alertVC = [UIAlertController alertControllerWithTitle: @"提示" message: @"收到一條從APP1傳來的簡訊" preferredStyle: UIAlertControllerStyleAlert];
    [self.window.rootViewController presentViewController: alertVC animated: YES completion: nil];
    NSLog(@"absoulteString: %@", url.absoluteString);
    NSLog(@"scheme: %@", url.scheme);
    NSLog(@"host: %@", url.host);
    NSLog(@"path: %@", url.path);
    NSLog(@"query: %@", url.query);
    NSLog(@"Url參數: %@", [self getURLParameters: url.absoluteString]);
    if ([url.host isEqualToString: @"com.zy.app1"]) {
        //從app1跳轉過來
    }
    return YES;
}

scheme、host和query等結果如下:



若需要將App2中的處理結果返回給App1,同樣的操作:設置App1的URL Scheme為AppOneScheme,添加App2的白名單為AppOneScheme,給App2一個觸發(fā)事件調用

UIAlertController *alertVC = [UIAlertController alertControllerWithTitle: @"提示" message: @"收到一條從APP1傳來的簡訊" preferredStyle: UIAlertControllerStyleAlert];
[alertVC addAction: [UIAlertAction actionWithTitle: @"確定" style: UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) {
        NSURL *oneUrl = [NSURL URLWithString: [NSString stringWithFormat: @"AppOneScheme://com.zy.app2?result=1"]];
        if (@available(iOS 10, *)) {
            [[UIApplication sharedApplication] openURL: oneUrl options: @{} completionHandler: nil];
        }else{
            [[UIApplication sharedApplication] openURL: oneUrl];
        }
 }]];
 [self.window.rootViewController presentViewController: alertVC animated: YES completion: nil];

App1接收到的返回值為

-(void)scene:(UIScene *)scene openURLContexts:(NSSet<UIOpenURLContext *> *)URLContexts
{
    if (URLContexts.count > 0) {
        NSEnumerator *enumerator = [URLContexts objectEnumerator];
        UIOpenURLContext *urlContext = [enumerator nextObject];
        NSURL *url = urlContext.URL;
        NSLog(@"absoulteString: %@", url.absoluteString);
        NSLog(@"scheme: %@", url.scheme);
        NSLog(@"host: %@", url.host);
        NSLog(@"path: %@", url.path);
        NSLog(@"query: %@", url.query);
        NSLog(@"Url參數: %@", [self getURLParameters: url.absoluteString]);
        if ([url.host isEqualToString: @"com.zy.app2"]) {
            //從app2返回的數據
        }
    }
}

如此,即完成了一組App間的傳值。

但要注意,如果從左上角的返回按鈕回到App1則無法將結果返回,因為沒有調用openURL吧。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

  • 背景:目前公司維護2個App,一個電商類項目,一個金融類項目;類似淘寶和支付寶,很多時候需要在App之間進行通信,...
    minyue閱讀 675評論 1 1
  • iOS系統是相對封閉的系統,App各自在各自的沙盒(sandbox)中運行。每個App都只能讀取iPhone上iO...
    SkyMing一C閱讀 1,584評論 0 4
  • 什么是URL Scheme 簡單的說,由于蘋果選擇使用沙盒機制來保障用戶的隱私和安全,APP只能訪問自己沙盒數據,...
    哦尼醬呢閱讀 2,596評論 0 0
  • 1 OpenUrl原理 如果一個應用程序支持一些已知類型的URL,您就可以通過對應的URL模式和該程序進行通訊。然...
    Kevin_Junbaozi閱讀 1,734評論 0 7
  • 什么是URL Scheme 簡單的說,由于蘋果選擇使用沙盒機制來保障用戶的隱私和安全,APP只能訪問自己沙盒數據,...
    CodeRookie閱讀 12,439評論 1 7

友情鏈接更多精彩內容