LotosLabo

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

UnityからSafariViewを表示させる

Appleさんから外部ブラウザへ飛ばさないように。
WebViewかSafariViewで表示してくれ!
と来ていたので、試してみました。

◆ SafariViewってなに?

iOS9から使用できるWebViewの機能を持った、アプリ内からWeb画面を表示できるもの。
Safariブラウザとの見た目の違いは、完了ボタンがついたり、Urlが変更できないことぐらい?


◆試してみる

まず今回やることとしては、iOS9未満ではSafariViewが使用できないので、外部ブラウザで表示します。
iOS9以上はSafariViewを表示するものとしていきます。

また、Unity上でApplication.OpenURL(ブラウザで指定したURLを開く処理)を呼んだ際に、
iOSのネイティブ側でフックする処理があれば、iOS9のときは自動でSafariViewに飛ばすよという処理を書けたのですが、
見つからなかったので、Unityとネイティブでごにょごにょ書いていきました。


今回やったことのまとめです。

1.iOSネイティブ側でSafariViewを表示する処理を記述
2.iOSネイティブ側でSafariViewをUnity側から呼び出す処理を記述
3.Unity側でiOS9以上のときはネイティブからSafariViewを表示する処理を呼び出す、それ以外は通常のOpenURLを呼ぶ


以下、サンプルコードです。



【Unity側】


ボタン押したときに指定したURL(Googleさん)を開くようにしています。
iOSのバージョンですがUnityのAPIからでは、バージョン入りの端末名のみしか取れず、
確かiOSのバージョンによって名前が異なっていたような気がしたので、
ネイティブからiOSのバージョンを取得する処理を書いて呼び出しています。

f:id:lo25131:20170621035313p:plain:w300



iOS側】


※SafariViewを表示するにあたり、フレームワークも必要となるので
Unity上でSafariViewClass.mmを選択して、Framework dependenciesから
Rarely used frameworksのSafariServicesにチェックを入れてください。


見た目こんな感じ(iPad
f:id:lo25131:20170621040422p:plain:w600



◆まとめ

アプリ内から外部ブラウザへ誘導させるような挙動はAppleさんからNGとされているので、
WebViewで表示するか、iOS9以降であればSafariViewでの表示が推奨とされているようです。
今回 Unity Safariviewとかで検索しても出てこなかったので、記事を書かせていただきましたが、
少しでも参考になってもらえるとありがたいです。

また、今回iOSのネイティブ処理を書くのが初めてだったので、
ここはこうした方がいいとかあればご教示いただけると幸いです。