LotosLabo

プログラミング技術とか気になった情報を載せていきます

UnityでカスタムURLスキームを使用してアプリを起動する【iOS】【Android】

はじめに

今回投稿する内容については、他のサイト様でも紹介されている方法を参考にしてみて、
起動までの確認や方法のメモとなります。


独自のカスタマイズしたURLを使用して、アプリを起動してみました。
カスタムURLスキームとは例としてあげるとこのような形です。

myScheme://

この「myScheme」が独自のスキーム名となります。

今回はWebサイトを用意して、ブラウザ上のリンクをタッチしてカスタムURLスキームからアプリ起動、
またパラメーターを渡してアプリ側へ表示というのやってみたいと思います。


[用意した簡単なWebサイト]

f:id:lo25131:20170627023042p:plain:w500


Unity側からスキームやパラメーターを指定できる方がよかったかもしれない。


今回のスキーム起動までの流れ

[1] Unityから外部ブラウザですでに用意したサイトを開く(Unity)
[2] サイト上のリンクをタッチする
[3] アプリ側へ値を受け渡す(iOSAndroid)
[4] アプリ側で値を受け取る(Unity)



[1] Unityから外部ブラウザですでに用意したサイトを開く(Unity)


今回は受け取ったパラメーターを表示するため、Webサイトを表示後、
受け取ったデータをコールバックで呼び出して表示します。
ドメイン名は伏せています。

今回はテスト用に作ったページなので、HTTP通信ですが
確かiOSでは申請周りでHTTP通信だと注意かリジェクトされたかと思うのでご注意ください。


Application.OpenURLでサイトを開きます。
また、この後説明しますが、Unity側で値を受け取るため
サイトを開く前にオブジェクトを生成してあげています。



[2] サイト上のリンクをタッチする

リンクをタッチする
iOSであればアプリを開くかどうかの確認のダイアログが出るかと思います。
f:id:lo25131:20170627023042p:plain:w500



[3] アプリ側へ値を受け渡す(iOSAndroid)

iOS側>

スキームを起動の処理をがすでに用意されているので、
基本は起動できるスキームを設定してあげるだけになります。

ただ今回は起動したスキームのパラメーターもUnity側へ受け渡すことになるため、
スキーム起動の処理を行っているクラスを継承した上で、渡す処理を作成します。


【スキームの設定】
スキームの設定はUnityのEditor上で行なえます。
File->Build Settings->iOS->Player Settings->Supported URL schemes

今回はスキーム名を「schemeTest」としたので、一つだけ設定しました。

f:id:lo25131:20170627042302p:plain:w500


【スキーム起動してパラメータをUnity側へ渡す】
スキーム起動の処理を行っているクラスを継承して、
Unity側へスキームを渡す処理を作成します。
スキーム起動を行っている処理は"UnityAppController"なのでこれを継承します。


スキーム起動の処理には、openURLというAPIが使われているのですが、
このAPIiOSのバージョンによって書き方を変える必要があるので、今回はバージョンも分けて記述しています。

Unity側へ値を渡すために、UnitySendMessageというものを使用しています。
第一引数にオブジェクト名、第二引数にメソッド名、第三引数に渡すパラメーターとなっています。



また、この記事を書いている途中にopenURLがiOS10から変わったというのを見つけました。
ただ現状iOS10でもこちらで動いているので、いつか試す機会があったらこちらもバージョン分けして追加します。
dev.classmethod.jp


最後にこの作成したファイルをUnityのAssets/Plugins/iOSの中に入れます。


Android側>

Android側についても今回はUnity側にパラメーターを受け渡す必要があるので、
スキームの設定だけでなく、処理も作成していきます。

まずUnityでAndroidのPlugin読み込むためには.jarファイルとして、書き出されたものが
必要なのでこれを作っていきます。

作成するための環境としては、EclipseやAndroidStudioなどがあると思いますが、
今回はEclipseを使用して説明していきます。

インストールの手順からは説明しませんが、
プラグインの作成までの流れを簡単に説明します。


Eclipseインストー
② AndroidSDKやJDKをインストー
EclipseAndroid開発用のPluginをインストー
④ 新規プロジェクト作成からAndroidアプリケーションプロジェクトで作成(設定はDefaultでOK)
⑤ パッケージ内にスキーム起動用のJavaクラスを作成
⑥ 作成したクラスを.jarファイルとしてエクスポートする
⑦ .jarファイルをUnityに入れる
⑧ スキーム起動アクティビティの設定をAndroidManifestに追記する


①〜④については割愛します。


⑤ パッケージ内にスキーム起動用のJavaクラスを作成

新規でクラスを作成します。

SchemeIntentActivityというクラス名で作成しました。
ここではUnityActivityを継承して、アクティビティの遷移や
スキームパラメーターの受け取りを行っています。

Unity側へスキームのパラメーターを送る際にはiOSと同じように
UnitySendMessageを使用しています。


また、Unityのクラスを使うのでUnityからclasses.jarというファイルを持ってきます。

Unityをインストールしたファイルのこの中にあります。
※Unityのバージョンによっては場所が異なるかもしれません。
/Applications/Unity/PlaybackEngines/AndroidPlayer/Variations/mono/Release/Classes/classes.jar


このファイルをEclipseのプロジェクトに追加していきます。
プロジェクトを右クリックして、ビルド・パス→ビルド・パスの構成→
ライブラリタブ→外部JARの追加を選択から対象のファイルを選択します。

追加後は一度、メニュのプロジェクトタブからクリーンをしてあげてください。


⑥ 作成したクラスを.jarファイルとしてエクスポートする

作成したクラスを右クリックして、エクスポートを選択してください。
ダイアログが出てくるので、Java→JARファイルを選択。

エクスポート対象のファイルが選択されていることを確認して、
エクスポート先を指定して、完了を押してください。


⑦..jarファイルをUnityに入れる

Assets/Plugins/Androidの中に作成された.jarファイルを入れてください。


⑧ スキーム起動アクティビティの設定をAndroidManifestに追記する

AndroidManifestに追記していきます。
UnityProjectのAndroidManifestは一度Android向けにBuildを行うと、
Projectファイル内のTemp/StaginArea/AndroidManifest.xmlとして作られます。


こちらをPlugins/Androidの中に入れて追記をしていきます。


少し長いですが、13行目〜20行目ちょうど追記部分となります。
スキーム名はアプリごとに決めたものに変更してください。



[4] アプリ側で値を受け取る(Unity)

最後に[1]で生成したクラスでスキーム起動で渡されたパラメータを受け取ります。
受け取った後、[1]のSchemeController.csのUrlReceiveに渡してあげて、
パラメータをクエリごとに分解してあげます。


うまく受け取って表示されれば成功です。

うまく受け取れなかった場合

ネイティブプラグイン作成中によくあったこと


iOSの場合)

・スキームは起動するけどUnity側へ値が渡されていない。
UnitySendMessageで指定しているオブジェクト名やメソッド名が、
Unityで指定している名前と異なってるかもしれませんので確認してください。

またはObjective-cの場合他のところで継承しているともう一方の場合のほうが
優先的に呼び出される場合があるかもしれません。
今回だとUnityAppControllerが他のところで継承されていたり。。

この場合は他のところで呼ばれているところに今回のスキーム処理をいれるなど
してください。
もしかしたら他の方法もあるかも…


Androidの場合)

・スキーム起動しようとしたら落ちた、アプリが立ち上がらない

UnityのActivityが取得できていない、もしくはAndroidManifestに記述したパッケージ名が
異なっている可能性が考えられます。
Activityが取得できない場合はUnityPlayerActivity.classではなく、
UnityProjectで使用しているMainActivityを取得する方法でうまくいくかもしれません。


また、同じスキームが指定されているアプリが複数、端末内に存在した場合は
正常に起動しない可能性があるので気をつけてください。

まとめ・感想

OSごとにネイティブ用の処理を書かないといけなかったり、特に
Androidの場合は環境から用意したりと、一から調べていかないと分からなかったので結構大変でした。
ただ、一度やり方さえ覚えれば他のプロジェクトで流用できるものなのでプラグインの処理を作成する
勉強にもなりました。


また、前回紹介させていただいたSFSafariView上でも今回のスキーム起動はできるので是非合わせて使ってみてください。
ちなみにWebViewでは動きませんでした。

環境

Unity5.6.1f1
Ecliipse Neon 4.6.3
Xcode 8.3.3

試した端末OS
Android OS 7.0
Android OS 6.0
iOS 10
iOS 9
iOS 7