Cordovaでのハイブリッドアプリ開発でつまずいたこと

こんばんわ!cowboyです☆

「接客英語アプリ」のiPhone版もアンドロイド版も更新し、iPad版もリリースしたので一段落です。

僕はCordovaを使ったハイブリッドアプリ開発(1つのコードでiOS・Androidの両方のアプリを開発する)の手法を取っているのですが、まあちょこちょこうまくいかず(特にiOS版)に詰まりましたよ(^_^;)

今回は(特にiOS版で)大きく詰まったところTop3を紹介したいと思います。

①Cordovaのサードパーティー製Admobプラグインはトラフィックを2%抜かれる。

CordovaでAdmob広告を載せるためにプラグインを導入するんですが、公式がないのでサードパーティー製を使うわけです。
ネットで検索すると日本語のサイトではcordova-admob-proがよく(というかほぼ)紹介されているんですね。
じゃあ使おうかと思って作者のGitHubのREADMEを読むと以下のように書いてます。

"You can use this plugin for free during trial purpose. If it earns less than $1000 for you, you can continue to use for free.

If use in commercial project, please get a license, or, you have monetized more than $1000 using this plugin, you are also required to: either get a commercial license ($20), or, no need pay but share 2% Ad traffic, read the License Agreement for details. As a commercial customer, you will be supported with high priority, via private email or even Skype chat."


みんな、よく英語読まないと。やられてますよ(笑)
20ドル払ってライセンスを買わないと、トラフィックの2%抜かれます。
まあ収益が1000ドルを超えないと抜かないって書いてますが、微妙ですね。

じゃあ違う人が作ったプラグインを使おうと探しましたが、他の方も「2%のトラフィックを寄付としてもらうよ!払いたくなかったら自分でコードとハックしてね!バルセロナから愛をこめて☆」みたいな感じで同じでした。

それならばプラグイン無しで自力でadmob SDKをcordovaに組み込むぜ!!と2日かけて取り組みました!!

挫折orz

というわけで現状はadmob-proをハックした人のプラグインを信じて使わせていただいています。
まじでグーグルさん、公式でプラグイン出してくれませんかね。安心して広告載せれません(^_^;)
とりあえずは解決(としよう)!

②iOSでfirebaseプラグインを実装するとエラーが生じる
Firebaseの解析を利用するためにfirebaseプラグインを組み込んだのですが、Androidでは何のエラーも吐かなかったのですが、iOSだと何故か実機でアプリをどうさせることが出来ません(エミュレーターなら起動する)。
以下のようなエラーが出て、SigningのTeamを正しいものに選択しても何故か認証が通りません。

Check dependencies
Automatic signing is unable to resolve an issue with the "○○○(アプリ名)" target's entitlements files.Remove the entitlements or switch to manual signing and resolve the issue by downloading a provisioning profile from the developer website.
Provisioning profile "iOS Team Provisioning Profile: ○○○◯(アプリのプロジェクト名)" doesn't include the aps-environment entitlement.
Code signing is required for product type 'Application' in SDK 'iOS 10.2'


めちゃめちゃ困った。調べまくっても何も情報がない。Stack Overflow(海外の技術者の掲示板みたいなもの)で調べてもわからない。同じようなエラーの対処法をしても全く治らないし、そもそも原因が違う。

Xcodeで色々いじってたらTARGET→Capabilities→Push NotificationsをONにしたら治りました。
Firebaseは通知を出したりできるので、ここがONになっていないとエラーがでるようですね。
Swiftでコーディングするときはpodを使うので、そのへんは自動でやってくれているようなので全然気づかなかった。
とりあえず解決!!

③iOSで読み上げ機能(tts)を利用する際に、実機でのみ正常に動作しない
さあ実際にコードが書き終わってエミュレーターでの検証も完了したので、実機テストということで、僕が唯一持ってるiOS製品、iPad Airで実行しました。
あれ?なんか、挙動が違う!!
エミュレーターでは読み上げ中に違う文章を読み上げさせようとすると、読み上げ途中の音声を停止して新たに読み上げ音声が再生されます。しかし実機では読み上げ途中に違う文章を読み上げさせようとすると、停止せずにそのまま読み切った後しばらく新しい読み上げ音声を生成しようとしません。
おかしい。
というわけでログを見るとエラーが出てますね。はい。

AVAudioSession.mm:1053:-[AVAudioSession setActive:withOptions:error:]: Deactivation an audio session that has running I/O. All I/O should be stopped or paused prior to deactivating the audio session.

これに関してはStack Overflowでもちょくちょくと話題になっていて、safari(つまりiOSのWebView)では音声再生中に別の音声命令(例えば停止や別の文章を読み上げさせる)を行うとエラーが起きて正しく動作しないとのこと。
その対処法の結論が「iOSのWebViewのバグだから諦めろ」でした(^_^;)
なんだと?WebViewのバグだと?じゃあUIWebViewじゃなくてWKWebView(こっちのほうがクラッシュとかが少ないらしい)に変えてみる!!

結果ダメでした。

なんてこった。エミュレーター上では予定通りの挙動をするのに実機でダメだなんで。。。

というわけで全部詰まったんですが、③だけが解決策を見つけることができませんでした。
なのでiOS版はhtml5・CSS3・JavaScriptによるハイブリッド開発を断念して、普通にSwiftで更新しました。
う〜ん、AndroidとiOSのアプリ同時開発ができると思ったんですが、うまくいかないですね(^_^;)
一応オーディオを扱わなければ問題なさそうなので、そういうアプリを開発するときはCordovaだけで開発したいと思います。

以上cowboyでした!!うぇいうぇいうぇい☆


記事が良かったなら↓をクリックして応援願いますm(_ _)m