Custom URL Schemeでアプリを開く

はじめに

androidのintentの様にiosでもCustom URL Schemeで共有したURLを開くことでアプリ間の遷移が可能になります。

もともとShare Extensionでアプリの起動を行いたいと思い調べたCustom URL Schemeでしたが、Share Extensionからはアプリの起動はできませんでした。

せっかく調べたのでCustom URL Schemeについてまとめようと思います。

Custom URL Schemeの作成

info.plistにURL Schemesを追加します。

画像の赤枠で囲んである部分を新規に追加します。同じ様に設定してください。

info.plistをソースコードで見ると追加部分はこんな感じです。

	<key>CFBundleURLTypes</key>
	<array>
		<dict>
			<key>CFBundleURLName</key>
			<string></string>
			<key>CFBundleURLSchemes</key>
			<array>
				<string>sample</string>
			</array>
		</dict>
	</array>

URL Schemeにsampleと値を設定したので開くときはsample://で開きます。URL Schemeは複数指定可能です。

URLでの画面遷移

以下のコードでにURLを開くとAppDelegateのメソッドが呼ばれます。

        let urlscheme = "sample://"
        if let url = URL(string: urlscheme) {
            if UIApplication.shared.canOpenURL(url) {
                UIApplication.shared.open(url)
            }
        }

application(_ app: UIApplication, open url: URL, options: [UIApplication.OpenURLOptionsKey : Any] = [:]) -> Boolメソッドに処理が飛んできます。

その中でrootViewControllerを設定してあげれば遷移させることが可能です。

    func application(_ app: UIApplication, open url: URL, options: [UIApplication.OpenURLOptionsKey : Any] = [:]) -> Bool {
        print("呼ばれたよ")
        self.window?.rootViewController = HogeViewController()
        return true
    }

Share Extensionで遷移

初めに書きましたが本当にやりたかったのはShare Extensionでの画面遷移です。ファイルがPostされた時にdidSelectPost()の中でCustom URL Schemeを使い遷移しようとしましたがダメでした。

URLを開く3つの方法(ダメでした)

Custom URL Schemeを使用するにはURLをどうにかして開く必要があります。

UIApplication

上記でまとめた様にURLを開くのはUIApplicationを使って行うのが一般的です。しかしShare ExtensionではUIApplicationを使用することができません

NSExtensionContext

SLComposeServiceViewControllerにはNSEctensionContextという型のextensionContextというURLを開くためのプロパティが用意されていますが、extensionContextでURL開くことができるのはToday Extensionの時だけの様です。

WKWebView

こちらの記事にWebViewでOpenURLができると書いてあったので試してみたのですがなぜか開かずでした。

調べてみると同じ問題にぶち当たっている記事がありました。WebViewを使ってい開いていた記事もiOS8をもとに書かれており、iOS9からはセキュリティの関係上load開くことができない様に修正が入ったみたいです。

参考文献

[Swift] カスタムURLスキームによるアプリ間連携

Share ExtensionでOpen URLするとかなんとか

Today Extensionについて

Share Extensionの実装でハマったところ

iOS9 Share ExtensionからOpen URLを実行する方法