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

カッパでも分かるiOSアプリゲーム開発

カッパがひたすらゲーム制作に関することを書くブログです。Railsに関するTipsもたまにまとめてます。

【悲報】かっぱサーガが3度めのリジェクトを受ける【なんてこった】

かっぱサーガ iOSアプリ申請
スポンサードリンク

f:id:InvokeTwoA:20151104025527j:plain

f:id:InvokeTwoA:20151009145746p:plain「カッパさん! またしてもリジェクトです!」
f:id:InvokeTwoA:20151023183618p:plain「そ、そんなぁぁぁ!」

リジェクト理由

1.0.0 バイナリでの却下 November 4, 2015
2.1 Details During review, your app crashed on iPad Air 2 running iOS 9.1 iPhone 6 running iOS 9.1 when we: 1. Tap Start 2. Tap Adventure

これはつまり、
iPad Air2 (iOS9.1)と iphone 6 (iOS9.1)で下記の動作をした時にクラッシュしたという事か

1. スタートをタップ
2. 冒険をタップ

これだけで全てを物語ってるけど、一応リジェクト内容の詳細も確認してみる。

件名

2.1 - Apps that crash will be rejected

本文

During review, your app crashed on iPad Air 2 running iOS 9.1 iPhone 6 running iOS 9.1 when we:

1. Tap Start
2. Tap Adventure
3. Tap any of the game
4. Tap easy
5. Start playing game
6. The app crashes

This occurred when your app was used: 
- On Wi-Fi
- On cellular network

We have attached detailed crash logs to help troubleshoot this issue.

Next Steps

Please revise your app and test it on a device to ensure that it runs as expected.

Resources
For information on how to symbolicate and read a crash log, please see Tech Note TN2151 Understanding and Analyzing iPhone OS Application Crash Reports.

If you have difficulty reproducing this issue, please try testing the workflow described in Testing Workflow with Xcode's Archive feature.

If you have code-level questions after utilizing the above resources, you may wish to consult with Apple Developer Technical Support. When the DTS engineer follows up with you, please be ready to provide:
- complete details of your rejection issue(s)
- screenshots
- steps to reproduce the issue(s)
- symbolicated crash logs - if your issue results in a crash log

あとはクラッシュログを例のごとく3つ添付してくれている。

ふぅ クラッシュかぁ。
とりあえず言われた機種とiOSで再現するかを試してみよう

再現するかテスト

とりあえずXcode のシミュレーターを用い、iPad Air 2 でプレイ。
初めて数分
f:id:InvokeTwoA:20151023183618p:plain「普通に遊べているぞ……」
f:id:InvokeTwoA:20151009145746p:plain「このままだと1面をクリアしてしまいます。……むむっ!」

クラッシュだー!

flappyKappa was compiled with optimization - stepping may behave oddly; variables may not be available.

下記のコードの3行めでエラーが起きた模様。

                makeSpark(firstBody.node?.position)
                let damage = secondBody.node?.userData?.valueForKey("str") as! Int
                damaged(damage, point: firstBody.node!.position, color: UIColor.redColor())

ふうむ。 firstBody が取得できなかったのかな。なんでだろう。

この処理は何度も通るはずなので、特定条件と重なった時にエラーが起きるのかな。
厄介そう。

確かに報告の通り、iPad Air 2 と iPhone 6 で再現した。(ついでに言えば iPhone 6s でも起きた)
全てを試したわけじゃないけれど iPhone 4s や iPhone 5 などではクラッシュしない。

他にも下記のエラーログが出ているが、パッと見た感じさっぱり分からん

2015-11-04 03:31:22.156 flappyKappa[5342:378576] _BSMachError: (os/kern) invalid capability (20)
2015-11-04 03:31:22.157 flappyKappa[5342:378576] _BSMachError: (os/kern) invalid name (15)

日本語でググってもでないねぇ。
一方で外人さんは何人も同じエラーに遭遇していた。
原因はほんと様々。

  • xcode7, swift2 で起きたという報告が多数
  • custom keybord 使って起きたという報告もけっこう多かった

しかし解決方法もフワッとしたのばかりでどうもシックリ来ない。
そのうち、こんな情報を見つける。

[Project Name] was compiled with optimization - stepping may behave oddly; variables may not be available.

この前半部分。これは optimization ありでコンパイルされている……というメッセージだ。

  • 通常、debug状態では optimization は none に設定されている。
  • 通常、release 状態では optimization は Fastest に設定されている。

当然、開発中は debug 状態でテストする。
それで問題ないから release 状態にしてビルドしてアップルに提出したけれど……考えてみれば今まで release 状態のビルドで詳細なテストはしてなかった。
debug状態とrelease状態ではとうぜんソースコードは一緒だし、些細な設定が違うだけだと思ってたのだ。
実際には optimizationの設定が違っていて、これがけっこうクリティカルになるらしい。

試しに debug に戻して再びテストしてみたら、クラッシュは起きなかった。
やべえ、これ optimization が原因ぽい。

ググったらすぐに次の記事がでてきた。qiita.com

Swift のOptimization のバグのせいで、Releaseバージョンのみアプリがクラッシュする現象がおきて、
無事にApple審査Rejectされました。。

やべえええ まさにこれ、ピンポイントで今の状況に当てはまる。

さっそく設定を変えてテスト。

f:id:InvokeTwoA:20151023183618p:plain「うおおお、動く。こいつ、動くぞぉ」
f:id:InvokeTwoA:20151009145746p:plain「やったー! ばんざーい! ばんざーい!」

しかしじっくりプレイすること3分後。

またクラッシュした \(^o^)/

f:id:InvokeTwoA:20151102033407j:plain

optimisation を none にしてもダメだ。

このクラッシュ、どういう時に明確に起こるのか分からないから辛い。
しかも数分間再現しないこともあるからパッと見で解決したような気になっちゃうもんな。
初めの検証で iphone4s とかだと再現せず っていうのもなんか疑わしく思えてきた。

試行錯誤の果てに

まず原因がなんなのか、落ち着いて調べてみることにした

  • 機種依存の問題なのか?
  • debug か release かで再現性の違いはでるのか?

release 状態では明確なエラーが出力されない。
とりあえず debug 状態にして iphone 6s のシミュレーターでひたすらテスト。
(やっぱり iphone 4s のシミュレーターだとクラッシュしない模様。同様に自分の実機 iphone 5cで動かしてもクラッシュしない)

debug でクラッシュが起きた時は下記のエラー文言が出力されていた

fatal error: unexpectedly found nil while unwrapping an Optional value

optional に設定してないのに、nil の値が検出されたというエラーか。
しかも超様々な場所で起きる……

なんで iphone 6 とか特定機種だとこのようなことが起きるのかは謎いけど、
optional 関係のコードを最適化すればこの問題は解決しそうだ。

そして修正完了

f:id:InvokeTwoA:20151023183618p:plain「やったぞー! これで、iPad Air2 や iPhone6 でもクラッシュしない!」
f:id:InvokeTwoA:20151009145746p:plain「さっそくアップロードしましょう」

思ったら例のごとくビルドが処理中のままアップロードから進まなかった。
また30分くらい待つか……。
(30分待ったけど処理中だった→45分経ってから確認してたら処理完了してたのでアップロード)


ふぅ 長かった。
毎度とんでもなく時間がかかってしまうねぇ。

リジェクトされたおかげでこんなにもパワーアップした

  • twitter 対応した
  • ステージが4 -> 12 になった
  • アイテム数が 8 -> 12 になった
  • オープニング追加
  • ヒロイン(笑)追加
  • モンスター1種追加
  • 中ボス追加
  • バランス調整


今度こそ承認されてやるぅ、と言いたいけれどもはや承認される気がしねえ。

カッパの申請履歴

日付 ステータス 備考
2015/09/05 2:59 提出準備中 登録だけは早めにしといた
2015/10/22 19:21 審査待ち
2015/10/23 10:30 審査中
2015/10/26 2:28 却下済み スタートボタンを押せないという致命的すぎるバグ
2015/10/26 4:29 提出準備中
2015/10/26 4:31 審査待ち
2015/10/29 11:12 審査中
2015/10/30 5:35 却下済み 広告関係の設定をミスっていた
2015/10/30 6:56 提出準備中
2015/10/30 6:57 審査待ち
2015/11/04 2:02 審査中
2015/11/04 2:52 却下済み アプリがクラッシュする
2015/11/04 7:55 提出準備中
2015/11/04 8:38 審査待ち

※審査待ち= Waiting for Review
※審査中 = In Review

審査中になってから却下までが光の速さすぎるぜ。
ちなみにこのエラー。前回の申請時点でも明らかに同じことが起きてたよね。

関連記事

kappa7.hateblo.jp