URL Schemeを使用したAppジャンプのチュートリアル

7388 ワード

この記事では、iOSでURL Schemeを使用してAppジャンプを行うチュートリアルについて説明します.例えば、アプリケーション内で別のアプリケーションのインストールを促すときにurlでsafariを開いてapp storeを開くように、必要な友达は以下を参照してください.
URL Schemeの役割
アップルの携帯電話のアプリには砂箱があることはよく知られています.アプリは情報孤島で、互いに通信できません.しかしiOSのアプリは自分のURL Schemeを登録することができ、URL Schemeはapp間の相互呼び出しを容易にするために設計されています.システムのOpenURLでappを開くことができ、いくつかのパラメータを渡すことができます.
例えば、Safariにwww.alipayと入力します.comは、あなたの支付宝アプリを直接開くことができます.前提はあなたの携帯電話に支付宝が入っていることです.アリペイがインストールされていない場合は、アリペイのダウンロード画面が表示され、クリックするとAppStoreのアリペイのダウンロード画面にジャンプします.
URL Schemeはアプリを一意に識別する必要があります.もしあなたが設定したURL Schemeが他のアプリのURL Schemeと衝突した場合、あなたのアプリは必ずしも起動されるとは限りません.アプリがインストールされている間に、システムにURL Schemeが登録されているからです.
一般的には、先にインストールしたappが呼び出されます.しかしiOSのシステムアプリのURL Schemeは最高に違いない.URL Schemeを定義するときは、システムappで定義されているURL Schemeをできるだけ避けます.
URL Schemeの登録
1.info.plistにURL typesを追加
各プロジェクトにはinfoがあります.plistプロファイル.infoが見つかりました.plist、右クリックでAdd Rowを選択し、URL typesを選択します.図に示すように、
2.URL Schemesの追加
URL typesを追加し、展開をクリックします.右クリックでAdd Rowを選択し、URL Schemes:3を追加します.URL Schemesの設定
URL SchemesをiXSDevTipに設定
4.URL Identifierの設定
URL IdentifierはカスタムのURL schemeの名前で、一般的にドメイン名を反転する方法でその名前の一意性を保証します.例えばcom.iOSStrongDemo.www
正常起動プロンプトの追加
テストを容易にするために、AppDelegateにUIAlertViewを追加しました.appが正常に開かれると、ヒントが表示されます.
 
   
- (BOOL)application:(UIApplication *)application handleOpenURL:(NSURL*)url
{
    //
    NSString *text = [[url host] stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
    UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@" "
                                           message:text
                                          delegate:nil
                                 cancelButtonTitle:@"OK"
                                 otherButtonTitles:nil];
    [alertView show];
    return YES;
}

SafariがカスタムURL Schemesアプリを起動
URL Schemesが構成されている以上、私たちが設定したURL Schemesが有効かどうかを素早くテストすることができます.Safariを開き、アドレスバーにiXSDevTip://と入力します.
やはり開けました:
アドレスバーにiXSDevTip://comと入力することもできます.iOSStrongDemo.www.URL Schemesを登録したアプリを開くこともできます.
別のアプリでURL Schemesを登録したアプリを起動します
 
   
 NSString *url = @"iOSDevTip://";
//    NSString *url = @"iOSDevTip://com.iOSStrongDemo.www";
if ([[UIApplication sharedApplication]
     canOpenURL:[NSURL URLWithString:url]])
{
    [[UIApplication sharedApplication] openURL:[NSURL URLWithString:url]];
}
else
{
    NSLog(@"can not open URL scheme iOSDevTip");
}

iSDevTipを登録するアプリを開く形式は:URL Scheme://URL identifier、直接URL Schemeを呼び出してプログラムを開くこともできます.URL identifierはオプションです.
登録されたURL SchemeからターゲットAPPへパラメータを渡す
URL Schemeでアプリを起動するのは簡単ですが、アプリを起動するときにパラメータを渡したい場合があります.このとき、URL SchemeでURLをカスタマイズしてパラメータを渡すことができます.
昨日AppDelegateでUIApplicationDelegateのエージェントメソッドを呼び出しました.
 
   
- (BOOL)application:(UIApplication *)application handleOpenURL:(NSURL*)url
{
    //
    NSString *text = [[url host] stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
    UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@" "
                                           message:text
                                          delegate:nil
                                 cancelButtonTitle:@"OK"
                                 otherButtonTitles:nil];
    [alertView show];
    return YES;
}

りんごがこの方法に与えた注釈を見てみましょう.
 
   
- (BOOL)application:(UIApplication *)application handleOpenURL:(NSURL *)url;  // Will be deprecated at some point, please replace with application:openURL:sourceApplication:annotation:

この方法は将来廃棄され,アプリケーション:openURL:sourceApplication:annotation:で代用できる.
URL参照形式
昨日iSStrongDemoに登録したURL Schemeは何か覚えていますか?iOSが開発したID:iSDevTipが印象に残っているはずです.
2つのパラメータが名前nameと携帯電話番号phoneであることを伝えたいとします.フォーマットは以下の通りです.
?
1 iOSDevTip://?name=ligang&phone=13888888888
見覚えのある感じはありませんか.私たちはget方式でインタフェースを要求するのはそうではないでしょうか.
起動されたAPP処理から渡されたパラメータ
 
   
- (BOOL)application:(UIApplication *)application
        openURL:(NSURL *)url
  sourceApplication:(NSString *)sourceApplication
         annotation:(id)annotation
{
    NSLog(@"sourceApplication: %@", sourceApplication);
    NSLog(@"URL scheme:%@", [url scheme]);
    NSLog(@"URL query: %@", [url query]);

    //
    UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@" "
                                                        message:[url query]
                                                       delegate:nil
                                              cancelButtonTitle:@"OK"
                                              otherButtonTitles:nil];
    [alertView show];

    return YES;
}


APPが起動されると、プロキシメソッドアプリケーション:openURL:sourceApplication:annotation:.パラメータURLはアプリを起動するURLであり、パラメータsourceApplicationはソースアプリのBundle IDである.
Safariでテストし、SafariのアドレスバーにiXSDevTip://と入力します.name=ligang&phone=13888888888
アプリを開き、パラメータが渡されたかどうかを確認します.
最後に印刷を見てみましょう.
?
1
2
3 2015-07-15 22:38:25.655 iOSStrongDemo[9983:2894855] sourceApplication: com.apple.mobilesafari 2015-07-15 22:38:28.664 iOSStrongDemo[9983:2894855] URL scheme:iosdevtip 2015-07-15 22:38:28.665 iOSStrongDemo[9983:2894855] URL query: name=ligang&phone=13888888888
sourceApplication印刷はcomです.apple.Mobilesafariは、Safariから私たちのアプリを起動したことがわかります.
URL Schemeをカスタマイズしましたが、カスタマイズしたURL Schemeを通じてアプリケーションを開くのを止めることはできません.どうやって解決しますか?
対応するsourceApplication、すなわち対応するBundle IDを指定し、Bundle IDによって私たちのアプリを開くことができるかどうかを決定することができます.
 
   
- (BOOL)application:(UIApplication *)application
        openURL:(NSURL *)url
  sourceApplication:(NSString *)sourceApplication
         annotation:(id)annotation
{
    NSLog(@"sourceApplication: %@", sourceApplication);
    NSLog(@"URL scheme:%@", [url scheme]);
    NSLog(@"URL query: %@", [url query]);

    if ([sourceApplication isEqualToString:@"com.3Sixty.CallCustomURL"]){
        //
        UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@" "
                                                            message:[url query]
                                                           delegate:nil
                                                  cancelButtonTitle:@"OK"
                                                  otherButtonTitles:nil];
        [alertView show];

        return YES;
    }else{
        return NO;
    }

}


これにより、Bundle IDで私たちのアプリを開くことができるかどうかを決定することができます.