株式会社8bitでは「ノミトモ」「Grmo」などのWebサービスを運営していますが、近年はスマホアプリへの対応も行っています。
その際、Webからアプリを起動させたい時があると思います。
具体的には「メールアドレスの有効性チェックを行い、URLを叩くとWebページにアクセスして
アプリを起動」など・・・
AndroidやiOS両方とも比較的低コストで導入できるので、特にWebサービスと連動するアプリの場合は導入していきたいですね。
Androidの場合
Androidでは「カスタムURLスキーム」と呼ばれる方法で呼び出すことが可能です。アプリ側の設定
1 2 3 4 5 6 7 8 9 10 11 |
<activity android:name=".Web2AppActivity"> <intent-filter> <action android:name="android.intent.action.VIEW" /> <category android:name="android.intent.category.DEFAULT" /> <category android:name="android.intent.category.BROWSABLE" /> <data android:host="host" android:scheme="hogehoge-scheme" /> </intent-filter> </activity> |
[android:name=”Web2AppActivity”]ですが、この名前はなんでもいいです。
わかりやすい名前にしてください。
[android:scheme=”hogehoge-scheme”]とありますが、”hogehoge-scheme”が
アプリを認識させるカスタムURLスキームとなります。
基本的になんでも良いですが、わかりやすく簡潔かつ他のアプリと被らないようにしてください。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 |
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); //WebViewからの処理をここで出し分ける Intent intent = getIntent(); String action = intent.getAction(); if (Intent.ACTION_VIEW.equals(action)){ android.net.Uri uri = intent.getData(); // mainの場合はMain.Activityへ遷移 if(uri != null){ switch (uri.toString()){ case "hogehoge-scheme://host/main": // MainActivityを呼び出す Intent intentMain = new Intent(getApplication(), MainActivity.class); startActivity(intentMain); finish(); break; case "hogehoge-scheme://host/sub: // SubActivityを呼び出す Intent intentSub = new Intent(getApplication(), SubActivity.class); startActivity(intentSub); finish(); break; default : // LoginActivityを呼び出す Intent intentLogin = new Intent(getApplication(), LoginActivity.class); startActivity(intentLogin); finish(); break; } } } } |
AndroidStudioからActivityを新規作成して、onCreateの中にこの記述を入れてください。
詳しくはHTML記述部分で説明しますがURLになる部分の出し分けで、受け取ったアプリの処理を
変えるようにしています。
HTML側の設定(呼び出す側)
通常のURLリンクと同じように記述します。
1 |
<a href="hogehoge-scheme://host/main">アプリを起動する</a> |
違うのは「http://~」ではなく先ほどアプリ側で設定したカスタムURLスキームから始まります。
後ろの[host/main]ですがこちらはアプリ側で処理を分けるための引数代わりに使っていますので
用途によって色々と変更してください。
なお、JavaScript上でもアプリを呼び出すことは可能ですが、PCから呼び出した場合は
存在しないプロトコルとなり、アプリを呼び出すことは不可能ですのでご注意ください。
iOSの場合
iOSの場合もカスタムURLスキームを使いますが、少し記述方法が異なります。アプリ側の設定
Xcodeを起動し、info.plistに[URL Types]をArrayで追加しその中に[URL identifire]と[URL Schemes]を追加します。
- URL identifire ・・・ アプリ識別のための文字列(ユニーク)
- URL Schemes ・・・ スキーマの文字列(例:hogehoge-scheme)
受け取った後の処理はAppDelegate.swiftに記述しておきます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
func application(_ application: UIApplication, open url: URL, sourceApplication: String?, annotation: Any) -> Bool { //リクエストされたURLの中からhostの値を取得して変数に代入 let urlQuery: String = url.query as String? ?? "login" //遷移させたいViewControllerが格納されているStoryBoardファイルを指定 let mainStoryboard: UIStoryboard = UIStoryboard(name: "Main", bundle: nil) //urlHostにnextが入っていた場合はmainstoryboard内のnextViewControllerのviewを表示する if(urlQuery == "login"){ let resultVC: SplashViewController = mainStoryboard.instantiateViewController(withIdentifier: "SplashViewController") as! SplashViewController self.window?.rootViewController = resultVC }else if urlQuery == "main" { let resultVC: ViewController = mainStoryboard.instantiateViewController(withIdentifier: "Main") as! MainViewController self.window?.rootViewController = resultVC } self.window?.makeKeyAndVisible() return true } |
Androidと同じようにURLの引数によって処理を分けるようにしています。
HTML側の設定(呼び出す側)
Androidとほぼ同じように記述します。
1 |
<a href="hogehoge-scheme://host/?main">アプリを起動する</a> |
Androidとは違うのは[host/main]ではなく[host/?main]となっているところです。
多分Androidと同じ記述でもできるのでしょうが・・・
まぁ単純にアプリを呼び出すだけだと同じURLでも良いと思います。
最後に・・・
今回は制作したアプリを起動する方法として記述しましたが、カスタムURLスキームの値を知っていれば、他のアプリを起動することも可能です。ただ、Webサービス利用者からすると突然アプリが起動することに驚くかもしれないので
アプリを起動するときはそのあたりをしっかりと明示する必要があるかなと思います。