ゲレの工房

ゲーム好きの中の人が、自分が作りたいアプリを作る記録です

機械学習を用いたアプリをSwiftとJavaでiOS版とAndroid版自作して気づいたことをまとめてみた

本ブログで開発状況を連載しています自作アプリ「言語を超える力」は、SwiftとJavaでそれぞれiOS版とAndroid版を作成しました。
アプリの公開まで一段落しましたので、その作成過程、経緯などを本記事で書こうかと思います。

アプリの紹介

言語を超える力

FinalFantasy 14に登場する特殊な文字を、アルファベットやひらがなの文字に変換するアプリです。
-
言語を超える力 iOS版

経緯

私はスマホアプリを作成したことがありませんでした。今回は自分の趣味と兼ね合わせて何か作りたいと思い、ひとまずアプリとして公開することを目標としました。

アプリを作り始める前に

いくつか考え事をしました。まず最初に検討したのは Monaca でのアプリ開発です。そこからが挫折との始まりでした・・・・

最低限何をしたいか:妥協

「言語を超える力」「ひんがしを超える力」は一種のカメラアプリ

私が作りたいアプリは基本形はカメラアプリでした。最終目標は、Google 翻訳アプリのようなものを目標としています。しかしいきなりGoogle 翻訳アプリのようなものを作り上げるのは目標が高すぎる。
そこで、最低限何をしたいのか考えました。

そこで決めたことは「文字1文字をカメラで撮影したら、対応するアルファベットやひらがなの候補を4つ出してくれるアプリ」というところまで、ある意味妥協しました。
妥協した内容は

  • FinalFantasy 14の文章を、英文・ひらがな文に変換する -> 1文字ずつの変換とする
  • 1文字変換するにしても精度が低すぎると役に立たないので、4文字ぐらい候補を出すようにし、候補をから人手で正解を選べるようにする。
  • 人手で選んだ正解情報を基に、機械学習のデータを収集することとする。
  • スタンドアローン機械学習アプリが動くことを諦め、クラウド上のサーバで計算させるようにする。

このように、何かしたアプリを作りたい場合は、作れる範囲内に作りたいものを妥協することが重要だと思います。

なお、サーバーで動かす機械学習部分は、すでにアプリ開発前に作っていました。以下の記事を参照していただけると嬉しいです。
blog.gelehrte.com

今思えば、サーバー版言語を超える力の公開って300日ほど前の話なのですね・・・・

妥協を図に起こす

詳しくは以前の記事を参照してください。
blog.gelehrte.com

図を再掲するとこのようになります。
f:id:gelehrtecrest:20180308160034p:plain

これが現在のアプリの形の原型になっていますね。

仕様決め

最低限やりたいこと・妥協が決まったら、完成品を作るためにどのような部品を作るか決める必要がありました。
今回は以下のようになりました。

  • UI
  • カメラ
  • サーバーへの通信機能
どうしてSwiftとJavaで別々に開発したか

最初は前述の通り、Monaca での開発を考えていました。MonacaではiOS版とAndroid版が同時に開発できると聞き、その方が良いかなと考えていました。
が、ここで問題が2つ

  • 開発費用
  • 開発のための手間

まず費用について、詳しくは以下の記事で考察しています。
blog.gelehrte.com
簡潔に言うと、iOS版のApple StoreAndroid版のGoogle Playで公開するための費用に追加して、Monacaの月額使用料を払うのは辛いなということです。

次に開発のための手間が問題になりました。
blog.gelehrte.com
簡潔に言うと、カメラ部分をCordova pluginに頼る必要があり、既存のプラグインだけでは使いにくいので独自に開発する必要がありました。
つまり、

  • Monacaの使い方の勉強
  • Cordova Pluginの使い方の勉強
  • Cordova Pluginの開発の勉強

が必要となります。

いずれMonacaないしCordovaでの開発も試みたいと思っているのですが、今回はあくまでアプリの公開が目的だったので、費用面でも開発コスト面でも楽になる、SwiftとJavaでのiOS版とAndroid版の開発を考えました。

SwiftとJavaでの開発コストが軽い理由

一番の理由は、Cordova Pluginの開発情報よりSwiftやJavaによるアプリ開発情報の方が情報量が多いのですよね。
なので今後の方針として

  • 既存のCordova Pluginの利用と簡単なCordova Pluginの開発で作成できるように要件定義できそうなアプリならCordovaでのアプリ開発
  • 複雑もしくは最新のスマホ機能を使う場合はSwiftやJavaでの開発。場合によってはiOS版のみ、Android版のみの開発だけを考える。

ということを考えました。
要するにやりたいことによって開発環境を決めるのが良さそうですね。

作成過程

では実際にSwiftとJavaを使って開発を行いました。私はSwiftは今回初めて触りました。Javaは久しぶりです。

SwiftとJavaの違い

Swiftは関数型言語としての側面もありますが、SwiftもJava手続き型言語として触ることができるので大きい差は感じられませんでした。言語としての差ですが。

XcodeAndroid Studioの違い

基本的にはXcodeAndroid StudioIDEとして優秀なので使いやすかったです。ここでの疑問点は敢えての内容です。

XcodeはCtrl+zによるUndoが使えない
使えないのは大変です・・・・やはりUndoは欲しいですね。Android StudioではUndoができるのでありがたいですね。

Xcodeの方がソース変更時・ビルド時に自動的にソースを書き換える分量が多い
何が問題かと言うと、Gitでのソースコードの管理が面倒ということです。Xcodeでは前の状態に戻すことが難しく、場合によっては新しいプロジェクトを1から作り直した方が楽な場合がありました。

Android Studioの方が原因不明のエラーに引っかかることが多い
エラーメッセージはXcodeの方が親切だったと思います。これはiOSというかiPhoneの機種が限定されている分、サポートしやすいという理由が大きいのでしょうね。

他にもありますが、それは後述。具体的には審査のあたりで。

書いたソースコードの量の比較

ほぼ同じぐらいだったかと思います。確かに生成されたソースコードとしてはJavaの方が文字数多い気がしますが、自動生成された文字も多かったですね。

SDKの話

iOSの場合、Swift3を使うかSwift2を使うか、それともObject-Cを使うかの問題になるのですが、最近はSwift3の情報が増えているのでSwift3で十分情報が揃いました。今後開発する人も、Swiftの最新版を使うといいかもです。

Androidの場合、SDKのバージョンが大きく関係します。これは審査が通った後に苦労した話にも繋がりますが、最新のSDKを使うと対応機種が減ります。執筆時では、世の中にはAndroid5.0以降を利用している人が多い状態だと思われます。SDKでいうとAPI 21ですね。今回作成した「言語を超える力」アプリはAndroid6.0以降で動くSDKAPI 23で動くようになっています。多くの人に使ってもらうためにはAndroid5.0対応が必要だったのですが、どうしても必要な機能としてAPI 23が必要だったためにAndroid6.0以降の利用者にしか提供できない状態になりました。
本来なら、SDKについては仕様決めのときに考えるべきでしたね。

参考記事
moduleapps.com


公開までの苦労

iOS版の公開とAndroid版の公開の違い

公開のための下準備は以下のサイトで行えます。

https://itunesconnect.apple.com/login

https://play.google.com/apps/publish

提出しなければいけないもの

アプリの説明
しっかり書く必要があります。特にiOS版の審査は厳しく、この文章が短いだけでも審査が落ちます。
私はiOS版の提出のためにしっかり書いた文書があったので、Android版はそのまま文章を利用しました。

スクリーンショット
iOS版もAndroid版もスクリーンショットの提出が求められるのですが、スクリーンショットをそのまま提出しろと言う意味ではなさそうです。 説明となる画像を提出しろという意味でしょうね。ただし、Android版は審査がゆるいのですが(Android機種によってスクリーンサイズが違うという意味もあるのでしょうけど)、iOS版はスクリーンショットのサイズをしっかり合わせないと怒られます。

私はLaunchKitを使いました。スクリーンショットを加工し、説明文を入れ、審査用のサイズに整形してくれるサービスです。
現在はオープンソース化されているサービスなので、自分のmacに入れて動かしました。
以下のサイトが参考になると思います。

qiita.com


アイコンなど
アプリのアイコンの作成が必要だったのですが、私は非デザイナーなので、他力本願としました。具体的にはAdobe Stockを使いました。初回1ヶ月は無料で使えるサービスなので、使いたい画像をあらかじめ選定しておいて一気にダウンロードし、1ヶ月で解約するといいかもですねー。

blog.gelehrte.com

審査を通すための苦労

Android版は審査を通すのはすんなりでした。というか本当に審査をしているのかどうか怪しいぐらいです。
唯一、「ファミリー向けプログラムにオプトイン」を選択した場合に審査を1回落ちました。
レーティングが低い場合でも、子供向けでなければファミリー向けプログラムにオプトインするのは避けた方がいいかも。

問題はiOS版です。しっかりとした審査が行われます。実際に作ったアプリを審査員がインストールして、クラッシュが起きないかとか試してくれます。また、クラッシュレポートやスクリーンショットなどを送ってくれるので親切ではあります。
唯一問題なのは、クラッシュレポートの見方です。審査員が使う端末はiOSのバージョンが最新になっています。こちらの実機テストする場合もiOSのバージョンを最新にしておきましょう。そうしないとクラッシュレポートが読めない場合があります。
クラッシュレポートの読み方については以下を参考にしてください。
qiita.com

上記の記事にも書いてあるのですが、XCodeのdevice supportは、接続した実機テスト端末のiOSバージョンごとに作られます。そして、クラッシュレポートは、XCodeで作られたdevice supportが無いと解析できません。つまり、審査員が使う端末と実機端末のiOSのバージョンが同じである必要があります。 (正しくは、審査員が使う端末のiOSバージョンと同じバージョンの実機端末で、一度でもXCodeでビルドしていればいい)
審査は数日かかることがあります。私が審査を出していた時期は、iOSにバグがあったのか、iOSの更新が頻繁に行われていた時期でした。そのため、審査員が使っていた端末と私の実機テスト端末のiOSバージョンにズレがでてクラッシュレポートが読めなかったことが度々ありました。(審査員のiOSバージョン11.1で実機テストのiOSバージョンでビルド作業したのは11.0, 11.2, ・・・とか)

審査が通った後の苦労

iOS版は審査がしっかりしているので問題なかったのですが、Android版は対応端末(インストールできる端末)が0台になるという問題が起きました。過去の記事を参考にしてください。簡潔に言うと、Javaで作ったアプリの中身をみて、Googleが自動的に対応端末を選別しているのですが、その自動選別のログが見れないため、推測する必要があるという問題が・・・

blog.gelehrte.com
blog.gelehrte.com

みなさんからの評判など

まだまだ、あまりインストールしてもらえていません。どうしてもアプリの精度が低いためしょうがないですね。まだ完成版とも言い切れていないので、もっと精度上げていきたいと思います。

またFinal Fantasy14プレイヤー対象というニッチなアプリというのも理由ですかね・・・

終わりに

今回はiOS版とAndroid版のアプリを作成したときに感じたことをまとめてみました。
とりあえずアプリの改善を引き続き行うとして、また新たなアプリを作るときの参考にしたいと思います。


広告