2010/10/01

iOSで独自カスタムURLスキームを設定する方法について

前回の記事「iOSでカスタムURLスキームを利用してアプリケーションを起動する方法について」では、カスタムURLスキームを利用して他のアプリケーションを起動する方法について紹介しました。今回は自分のアプリケーションに独自のカスタムURLスキームを設定して、他のアプリケーションから利用可能にする方法について紹介します。

Info.plistへのエントリ作成

今回はカスタムURLスキームmySampleApp:を受け入れるサンプルアプリケーションとして、新規プロジェクトを作成します。プロジェクト名をCostomURLSchemeSampleとしてテンプレートはView-Based Applicationにします。

独自のカスタムURLスキームを設定するために、アプリケーションのplistに次のエントリを作成します。どこかの列をクリックして、右端の「+」をクリックして、メニューから「URL types」を選択します。

作成されたツリーを展開すると「URL identifier」が表示される「URL identifier」にはアプリケーションごとに一意な文字列を指定する必要があります。慣習として逆DNS名を指定するようになっており、この例では「com.yourcompany.CostomURLSchemeSample」とします。

「URL identifier」の列を選択して右端の「+」をクリックして、メニューから「URL Schemes」を選択します。

その後、作成されたツリーを展開すると表示される「Item 0」にこのアプリケーションで受け入れたい独自スキーム名を入力します。

この例では「mySampleApp」とし、最後のこのplistファイルを保存します。

これでとりあえず、アプリケーションがカスタムURLを受け入れることができるようになりました。iPhoneシミュレータ上でSafariのアドレスバーに「mySampleApp:」と入力してみましょう。サンプルアプリケーションが起動するはずです。

URLリクエストの受け入れ

2014.09.19 追記 application:handleOpenURL:はdeprecatedになっています。かわりにapplication:openURL:sourceApplication:annotation:を利用してください。

この時点ではただ単に起動することができるようになっただけであり、文字列や数値などの情報を得られるようにするためには、UIApplicationDelegateの次のどちらかのメソッドで実装する必要があります。

  • application:handleOpenURL:
  • application:didFinishLaunchingWithOptions:

これらのメソッドがどのように呼び出されるかは次のようになっています。そのため、application:handleOpenURL:を利用したほうが実装の手間が省けてよいでしょう。

  • アプリケーションが既に起動しておりバックグラウンドにある場合には、application:handleOpenURL:だけが呼ばれます
  • 起動していない場合はまずapplication:didFinishLaunchingWithOptions:が呼ばれて、このメソッドの戻り値がYESならapplication:handleOpenURL:が呼ばれます (NOなら呼ばれません)

メソッドが呼び出されるタイミングについては「iOS 4のマルチタスク処理における状態遷移について」も参照してください。

CustomURLSchemeSampleAppDelegate.mに次のコードを追加します。

- (BOOL)application:(UIApplication *)application handleOpenURL:(NSURL*)url {
    if ([url.scheme isEqualToString:@"mySampleApp"]) {
        NSLog(@"%@ [%@|%@|%@|%@]", url, url.scheme, url.host, url.path, url.query);
        return YES;
    }
    return NO;
}

これで、カスタムURLスキームmySampleAppxに対応できました。なお、実際の使用にあたっては書式はRFC 1808に準拠しましょう (とは言え、AppleのURLスキーム自体が従っていなかったりしますが)。なお、もしクエリ文字列が「キー = 値」の形式なら次のサイトにあるメソッドparseQueryString:が便利です。このメソッドはNSStringのクエリをNSDictionaryに格納します。

iPhone Development 101: Objective-C: Custom URL Schemes

セキュリティ

カスタムURLスキームはSafariのJavaScriptからも呼び出すことが可能なため、アプリケーション側で安易な設計を行うと危険です。

  • カスタムURLスキームの指定で直接、別アプリ起動、秘密の情報を送信、設定変更などを行えるようにすると危険
  • ディレクトリトラバーサルの危険性を考慮して、絶対パスのみ許可する
  • アプリケーション側でHTML内に挿入するときはコードインジェクションに注意 myapp://cmd/adduser='>"><script>javascript to run goes here</script>
  • ソーシャルエンジニアリングに注意する。例えば、自分のアプリケーションでカンマ区切りにより複数ファイルを削除するdeleteコマンド (削除前にダイアログで1回確認) を実装したときに、次のような場合に、重要ファイルが画面外で確認できない
    myapp://cmd/delete?file=cached data that is slowing down your system.,important.txt

詳細については、Appleの「Secure Coding Guide: Validating Input」の「URL Commands」の項を参照してください

まとめ

自分のアプリケーションに独自のカスタムURLスキームを設定して、他のアプリケーションから利用可能にする方法とその注意点について解説しました。

関連項目

0 件のコメント:

コメントを投稿

注: コメントを投稿できるのは、このブログのメンバーだけです。