読者です 読者をやめる 読者になる 読者になる

cocos2d-x-3.x系で使えるWebView作った

Cocos2d-x

TL;DR

gin0606/cocos2dx-WebView · GitHubをcloneしてREADMEに従えば使えるようになるはず。

cocos2d::ui::Widgetを継承してるから便利。

何故作ったか

Cocos2d-xでWebViewを使おうとすると、公式では用意しておらず自前で実装するか、他所から持ってくるかという事になる。

で、他所から持ってくる場合に有名なのがGreeが作ったwebview_pluginだと思う。

GreePlatformSDKCocos2dx/webview_plugin/webview_plugin at master · gree/GreePlatformSDKCocos2dx

僕が今、会社でやっているプロジェクトでも、これを使っていたんだけど、cocos2d-x3.x系で動かなかったり、バグが有ったり、cocos2d::Nodeと同じように使えなかったり、ヘッダーファイルでusing namespace stdしてたり!!!!!!!!!!!!!!!!!と、それはもう様々な問題があった。

一番問題だったのが、cocos2d::Nodeと同じように使えないことで、最初はwebview_pluginを弄ってcocos2d::ui::Widgetを継承する形に変更しようとしたんだけど、元の作りがそれを想定せずに作られていたので結構な時間がかかりそうだった。そこで、上記のような問題があるものをそこまでの労力かけて変更するかどうかを考えた結果、一から作りなおしてしまったほうが良いという事になって、作った。

設計とか

cocos2dxを使っていて、各OSのnativeViewを表示したい事は多いと思うんだけど、今だとcocos2dxにVideoPlayerが入っていて、おおまかな設計はこれを参考にすれば良い。

gin0606/cocos2dx-WebViewも大枠はそれに従った。

VideoPlayerの場合は、各OSに依存したコード持ったクラスを参照するためにvoid*でオブジェクトを持って、各OSのコードでcastしてメソッド呼び出しとかしているんだけど、gin0606/cocos2dx-WebViewはPImplイディオムを参考にして作った。

commonの中に入ってるファイルを見ても、各OSの具体的な実装が全く分からなくなっている。

この実装がPImplイディオムに則しているかというと自信がないけど、便利なイディオムだと思った。共通のInterfaceさえ守っていれば、各OSのファイルで他OSのことを考えること無くやりたい放題出来る。

問題とか

まだ最低限の機能しか実装していなかったり、AndroidiOSのWebViewの機能の違いからjsの扱いが微妙な感じになってたりする。

特にAndroidのWebViewはセキュリティ的に問題があるらしく、それを回避するために、推奨APIが11以上になってる。それ以下のAPIで動かしたい場合は、Errorが出る行を削除すれば一応動くはず。

AndroidのWebViewの脆弱性についての私的なまとめ - 金利0無利息キャッシング – キャッシングできます - subtech


作ったものの、これを使っているプロジェクトは開発初期なので、デバッグとかが凄く甘くなっている。

また、Android/iOS両方で実現できるはずの機能も実装していない。

あと途中で飽きて実装適当なところとかもあると思う。

これからCocos2d-xでWebViewを表示する必要がある人は、実際に使ったりして、足りない機能やバグを見つけたらPR/issue登録してくれると嬉しい。ある程度まともになったら本家にPR出したい。

あとgin0606/cocos2dx-WebViewのほとんどは現在所属している会社の業務時間内に書かれたので、C++やcocos2d-xに自信のある人は声をかけて欲しいみたいな事を書いておく。

Pluginの作り方はこれ。 Cocos2d-xのPluginを作る - 銀の人のメモ帳