ガンズターン 公式サイト

楽しいことに、まじめです。 ——ガンズターンアプリ研究所公式サイト

Unity備忘録 #7-1 Unityからリリースビルドするのに苦労した話(iOS編)

Pocket

0. ちょっと勉強会参加しすぎかもです

どうもこんにちわ。
最近、ちょっと勉強会に参加しすぎで、独習に当てる時間を減らしすぎなんじゃないかという気がしてきました。
ガンズターンのRyosukeです。

9月に行った勉強会をまとめてみますと、以下の通り。

9/9 acrovisionさん主催「Unity初心者向け基礎セミナー」池袋
9/10 さくらソフトさん主催「ゲームエフェクト勉強会」海浜幕張
9/19 portさん主催「フリースタイルもくもく会」新宿
9/24 dotsさん主催「UI/UX勉強会」渋谷
9/25 TechBuzz 「Unity勉強会#34」代々木
9/29 hiyotamaさん主催「Unityもくもく会9」大宮

……うん。ちょっと、節操なくなってきてる

都内に出るだけでも片道1時間かかるので、今後はもう少し自重して、自分の家で製作に充てる時間を増やそう
……そうは思いつつ、10月もすでに3つほど勉強会の予約をしてしまっているわたしでした。

しばらくブログから遠ざかっていたので(なんだかんだで時間泥棒な作業にかかりっきりでして)、なんだか文章を書くのがとても久しぶりのような気がしています。

今日は、本当は前回(ゲームエフェクト勉強会のまとめ(前編))の続きをまとめちゃいたかったのですが、なぜかわたしの環境でUnityのParticleSystemがうまく動いてくれないという状況に陥ってまして、そちらが解消するまで書けません。すみません。

というわけで、つなぎといってはなんですが、先日、初めてUnityで製作したアプリをiOS向け、Android向けそれぞれにリリースビルドした時に苦労した話などをしていきたいと思います。

またしても長くなりそうなので、ひとまず今回はiOS向けビルドで悩まされた点に絞って書きますね。

ひょっとしたら最新verのUnityでは改善されていることばかりかも知れませんが、ノウハウというよりも世間話の一つとしてお聞きいただければ幸いです。

では、参ります。

1. UnityAdsが原因でビルドに失敗する

たぶんこれ、Xcode7になった関係だと思いますが、UnityAdsが組み込まれているプロジェクトを、そのままXcodeでビルドしようとすると「_なんたらかんたら_does not contain bitcode. You must rebuild it with bitcode enabled (Xcode setting ENABLE_BITCODE),」的なエラーメッセージが出てきてそもそもビルドできません。

これ見た時、わたしは「ついに出たか」と思いました。

というのも、事前にこのエラーについてのブログ記事こちらで読んでいたので、エラーの存在と対処法を知っていたからです。

たぶんこれ、UnityAdsだけじゃなくて他の広告会社のライブラリが組み込まれてるプロジェクトでも同じ状況になると思います。

対処法はいたって簡単で「Build Settings」のなかにある「Enable Bitcode」という項目を「No」にするだけ。

bitcodeの設定の場所

Enable Bitcode を No にする

この「Bitcode」というのが具体的に何を意味してるのか、正直よくわからないんですが、こちらの記事によると「中間コード」のことらしいです。今後は、この「中間コード」を含んだ状態でAppleに提出することが望ましいらしいのですが、そのためにはプロジェクトに含まれるライブラリ全てがこの「bitcode」に対応している必要があるとのこと。
今後はわかりませんが、今の所サードパーティのライブラリはほとんどがこの「bitcode」に対応してないっぽいです。
なので、もしこのエラーが出たら「Enable Bitcode」を「No」にするという対応が今後は必要になってきそうです。(もちろん自己責任で設定してください)

2. iPhone4S以前の端末でメモリリークによるアプリ落ちが頻発

一番悩まされて時間を大きく奪われた挙句、最終的に根本的な解決には至らなかった事象です。

具体的には、リリースビルドのつもりで吐き出したXcodeプロジェクトにおいて、以下のような症状に悩まされました。

  • iPhone4Sを使ってXcode上でデバッグ実行すると、シーン遷移時に高確率でアプリが落ちる。
  • シーン遷移を2回以上行うと、3回目で確実に落ちる。
  • メモリ消費量をにらんでいると、シーン遷移を行うたびに数十MBずつ増えている。
  • シーンとシーンの間に、なんにも存在しない空のシーンを挟むことで多少は緩和されたが、それでもデバッグ中、10回以上シーン遷移を繰り返すと落ちる。
  • まったく同じプロジェクトで、iPhone5Sで確認すると、メモリ消費量が不自然に増えるような状況は発生せず、何度シーン遷移をしてもアプリが落ちることはない。
  • Xcodeでデバッグを動かさず、普通にアプリを動かすだけなら4Sでも落ちない。

自分のスクリプトのどこかでメモリリークする原因を作っているのかも知れませんが、どこをどう直しても改善しませんでした。ただし、Xcodeのデバッグ機能を介さなければ落ちる事象が確認されないことがわかったので、ひとまず問題なしということにしました。

そもそもすでに6Sが出回っている現状4S以前の端末を使い続けている人かなり少なくなっていると思いますので、大きな問題にはならないかと思っています。

ちなみにこの現象が頻発していた時の当方の環境。

  • Xcode 7.0.0(確か)
  • Unity 5.1.2f1

3. UnityAdsのバージョンが低いとバイナリ提出時にエラーが出る

すみません。
エラー発生時のスクリーンショットを撮り忘れたうえに、どんなエラーメッセージだったかも忘れてしまいました。
ただし、メッセージの内容からすぐにUnityAdsのバージョンが低いせいだとわかり、対処が比較的早くできたので、あまり手こずらない問題でした。

発生した状況は以下の通り。

  • Xcode上で「Archive」を行い、リリース用のバイナリを作成する。
  • その後、作成されたバイナリに対して「Validate」を行い、問題ないことを確認。
  • 最後に「Upload to App Store」を押して、アップロード開始。
  • エラーメッセージが出て、アップロードに失敗する。(スクショ撮り忘れ)

メッセージの内容は、UnityAdsの最新バージョンをベンダーに確認してください的な簡単な英文でした。

エラーメッセージがあまりにも具体的だったのでちょっと驚きつつも、冷静にUnityAdsの最新版をUnity上のAssetStoreからダウンロードして、プロジェクトへ再インポート。
(このあたり、Unity5.2以降を使っている場合はAssetStoreを介さずとも最新版を手に入れられるそうなので、今後は発生しなくなる状況かと思います)
その後、改めてUnity上でビルドしてXcodeプロジェクト吐き出し(10分)→Xcode上でアーカイブ(10分)を行って、実機で簡単なテスト(10分)をしてから、再度アップロードに挑戦。
今度は問題なくアップロードできました。

4. アップロードが無事完了したと思ったらAppleから「Missing Push Notification Entitlement」メールがきた

これ。けっこう悩まされました。
Unityから吐き出されるXcodeプロジェクトは、デフォルトで「プッシュ通知が必要」な状態になってるみたいです。

Appleさん曰く「プッシュ通知が必要なプロジェクトなのに、Certificateにそれが含まれてないよ」ということのようです。

LumineCubes(次出すアプリ)では、まだプッシュ通知を実装してませんが、いずれ実装するかもと思ったので、そのこと自体は問題ありません。
普通にDeveloper Center上で新たにAPNSのCertificateを取得して、有効にしました。
……ので、もう問題ないかと思い、再度ビルドし直して(前述の通り1回30分以上かかる)アップロードしたのですが、またしても数分後に同じメールが届きました。

どうやら、Xcodeのプロジェクトの設定で「Capabilities」にある「Push Notifications」の項目を「ON」にしてやってからアーカイブしないといけなかったようです。

PushNotificationの設定の場所

Push Notifications を ON にする。場合によってはIn-App Purchase も ON にする必要あり。

これ、普通にUnityからiOSビルド吐き出すと誰もが出くわす事象かと思います。
プッシュ通知をまったく使う必要のないプロジェクトではどうするんだろう。

5. ATS対応(というか、非対応。笑)

iOS9から有効になったセキュリティ機能の一つに「ATS(App Transport Security)」というものがあります。
これ、なんと、基本的にはアプリのWeb通信全てHTTPSにしないと一切通信できない、というめちゃくちゃ強い割り切り方が強烈という意味で)セキュリティ機能です。

LumineCubesではサーバとの通信をさほど頻繁に行うわけではないのですが、それでもほんの少しだけはやります。
そのほんの少しのためだけに「HTTPS化」するのはけっこう大変なので、今回は「Info.plist」に「ATSの例外となるサイト」を追加する方法で対処することにしました。

以下が、「Info.plist」に「ATSの例外サイト」を追加する手順です。

  1. Unityから吐き出されたXcodeプロジェクトをXcodeで開く。
  2. 「Info.plist」右クリックして「Open As」->「Source Code」を選択。
Info.plistの開き方

個人的にSourceCodeを直接いじるほうが簡単だと思うので。

  1. エディタ上にプロパティリストのxmlが表示されるので、以下のテキストを適切な位置(例えば最下行から2行目にある「</dict>」の上の行あたり)にペーストする。(その際、テキスト中の「hogehoge.com」を例外としたいサイトのドメインに変更してください)
<key>NSAppTransportSecurity</key>
<dict>
  <key>NSAllowsArbitraryLoads</key>
  <true />
  <key>NSExceptionDomains</key>
  <dict>
    <key>hogehoge.com</key>
    <dict>
      <key>NSIncludesSubdomains</key>
      <true />
      <key>NSTemporaryExceptionAllowsInsecureHTTPLoads</key>
      <true />
      <key>NSTemporaryExceptionMinimumTLSVersion</key>
      <string>TLSv1.1</string>
    </dict>
  </dict>
</dict>

とりあえずこの処置で、HTTP通信でも問題なく通信できるようになります。
ただし今後、Web通信に関するセキュリティ関係のルールはもっと厳しくなっていくと思われます。この方法がいつまで通用するかはわかりません。
わたしも、今後新たに作成するアプリWeb通信に関する部分極力HTTPS化(SSL化)していくつもりです。

ただ、SSL化する際にいつも悩まされるのが「オレオレ証明書」でも問題ないのかという点ですが……。一応「ぱずもぐ」はオレオレ証明書でも今の所問題なく動いてるので、今後もしばらくはオレオレ証明書でがんばります。

6.iPadのマルチタスク対応(というか非対応。笑)

恐らくこれも最近になって初めて必要となってきた対応と思います。
なんでもiOS9以降は、iPadでは二つのアプリを同時起動できるようになったらしく、その機能に対応するためにはアプリ自体を「全てのDeviceOrientation」に対応した作りにしないといけないようです。

全てのDeviceOrientationに対応してないアプリは、Xcodeでのアーカイブ時「iPad Multitasking support requires these orientations: 〜〜うんぬんかんぬん〜〜という感じのエラーで怒られてしまいます。

しかし当然、ゲームアプリで全てのOrientationに対応するのはかなり困難な話であるため、わたしは迷わずこちらの記事にある通りの「サボる方法」を選択しました。

はい。
プロジェクト設定の「General」「Requires full screen」にチェックを入れるだけですね。

Requires full screen の設定の場所

ここにチェックを入れるだけの簡単なお仕事です。

ここにチェックを入れてあげれば、問題なくアーカイブできるようになります。
いずれは、マルチタスク対応のアプリも作ってみたいですが、ひとまずはこれで凌いでいこうかと思います。

7. 思い出せる範囲で以上です

本当は、記事に書けないような細々としたトラブルがこの10倍は発生してたんですが、いずれも汎用的な内容じゃないので全カットします。

さらにこうしてトラブルにあってビルドしなおすたびに、「どうせビルドするならあの機能もくっつけちゃうか」という思いつきで作業がどんどん増えて、けっきょく最初にリリースビルドにトライしてから最終的な1.0版をAppleに提出するまでに1週間も時間をかけてしまいました。

もしチームで作業してたら、ぶん殴られても文句を言えないぐだぐだっぷりです。

ただ、こういう風に思いつきでどんどん機能追加したり、あるいは適当なさじ加減力を抜いて作ったりできるのは、個人開発の醍醐味の一つかと思います。

LumineCubesは作り始めてから最初のリリースビルド申請まで2ヶ月近くかかってしまいましたが、次のアプリはなんとしても10月中に申請したいと思います。

ちなみにLumineCubesですが、Android版はとうの昔に「あと1クリックでリリース」できる状態になっています。

あとはiPhone版の審査完了待ち。

何事もなければ(リジェクトされなければ)遅くとも来週末までにはリリースできると思います。
その時はまたブログなりTwitterなりで告知させて頂きますので、何卒よろしくお願い申しあげます。

Pocket

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

トラックバックURL: http://www.gunsturn.com/2015/10/04/studying_unity_007_1_firstbuild_ios/trackback/