URL Schemeを使用したAppジャンプのチュートリアル
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で私たちのアプリを開くことができるかどうかを決定することができます.