[AS3/AIR] iTunes Connectで審査用にデータをアップできないので、ビルド番号を変更するシェルスクリプトを作った

2014/09/27

こんにちは。きんくまです。

話すと長くなってしまうのですが、この1週間、お仕事でクライアントのAIRアプリをAppleに申請を出すのに苦労しています。

いくつかあったものをリンクすると、

これはOSの最小バージョンの設定ですね。
>> Adobe Air iOS Invalid Bundle The bundle does not support the minimum version os specified in info.plist

つぎにこれ。どうしてなのかわかならないのだけど、ld64ていうのにシンボリックリンクを貼るもの。
>> No longer able to submit app to iTunes.

最後に残ったのがこれです。
>> ERROR ITMS-9000: “Redundant Binary Upload. There already exists a binary upload with build version ‘1.0’ for train ‘1.0’”

Redundant Binary Uploadって?

例えば、一度iTunesConnectにバイナリをアップします。
そのあと、そのバイナリがリジェクトされたり、エラーがあることがわかったとします。
そしたら修正版のバイナリを再アップします。

すると、これまでは通ってくれていたのですが、最近のiTunesConnectの仕様変更により、はじかれるようになりました!!! やったね!

で、これを回避するためには、バージョン番号は変えずに、ビルド番号を変える必要があります。

バージョン番号は、ユーザーにも見えるところによくある1.0.0とかです。ビルド番号はバージョン番号と一緒にしてしまっている場合もありますが(私です!)、本来は文字通りビルドするたびに値を1つずつ増やすなりして、かえていくものだそうです。
>> 参考

例えば、私のいまのmac OSのものだと

OS X 10.9.5(13F34)

となっているので、 10.9.5がバージョン番号、13F34がビルド番号となります。

ちなみにこれは、AIRアプリだけというのではなくて、全てのiOSアプリの申請にいえるようです。
Xcodeを使った普通のアプリでは、リンクにもある通り、テキストボックスにビルド番号を書いてあげることによって、修正がすぐにできます。

ところがAIRではこの設定がとても難しいのです。
まずAIRではバージョン番号の設定はapplication.xmlファイルで行います。

<versionNumber>1.0.0</versionNumber>

これを設定すると、ipaにパッケージ化した後に、その中身に書き出されるInfo.plistのCFBundleShortVersionStringとCFBundleVersionに同じ値が設定されます。

ここで、Info.plistの各値は

CFBundleShortVersionString -> バージョン番号
CFBundleVersion -> ビルド番号

となります。

つまり、versionNumberを設定すると、AIRではバージョン番号もビルド番号も同じ値が自動で設定されてしまいます。そうなんです、ビルド番号は残念ながら個別には設定できません!やったね!

application.xmlには、他にも関係がありそうな値があります。versionLabelは、アプリの内部的で使われるだけみたいでInfo.plistには関係ありません。versionというのもありますが、これはAIR2.5以下で使ってたものみたいで、いまは使えません。

さらに悪いことに、CFBundleVersionはapplication.xmlでは予約語になっていて、InfoAdditionsセクションでは設定することはできません。
>> これ

さて困りました。
なので、Adobeのフォーラムに投稿してみたのですが、誰もみていないのか回答がされませんでした、、。
>> How do I set CFBundleVersion in AIR

結局、様々な試行錯誤と調査の末、どうやれば手動でビルド番号を変更することができるかがわかりました。
でも、これを毎回手動でやるのは大変なので、シェルスクリプトを書きました。
githubにアップしました。

>> KinkumaDesign/SetCFBundleVersionInAdobeAIR

MITライセンスなので、自己責任でお願いします。

興味ある人むけシェルスクリプトの中身

大きくわけてこんな感じです。

1. .ipaファイルを.zipファイルにファイル名変更
2. zipを解凍
3. 中身のInfo.plistファイルのビルド番号を変更
4. コードサイニング(なんかこれやらないと単にzipに戻しただけだとエラーでました)
5. シンボリックリンクを貼る(よくわかんないけどStackoverflowに書いてあったので)
6. zipで圧縮してファイル名を.ipaにする
7. できあがり! やったー

これ手動でやると大変そうなのでつくりました。

苦労したポイント!

■そもそもどうやったらビルド番号を変更したものが審査に提出できるのかがわからなかったところ。
-> zipを解凍したものを再度圧縮するだけだと、いろいろと足りない情報があったみたいでそこで詰まりました。

■Info.plistのバージョン番号をどうやってコマンドラインで変更するか
-> これ、クライアントプログラムだと、いっぺんxmlをプログラム内に読み込んで、xmlツリーを作って、そこからパスをめぐって、、とかしたくなるんだけど、残念ながらできなかったので困りました。
なので、perlを使って正規表現を使ってやることまでいきついたのですが、複数行にまたがるものをどうやって置換するのかにまた詰まって、、、。という感じです。
最初は無理そうだったので、zipを解凍する前半と、そこから戻す後半に分けて、Info.plistは手動で書き換える運用でもいいかなとあきらめかけたのですが、なんとかできたので良かった。

もし、このバージョン番号の置換でうまく行かない場合は、いまは必ず
x.x.x (1.2.3とか)
という形式で設定しているので、それにするか
x.x (1.2とか)
という形式の場合は正規表現の

[\d]+\.[\d]+\.[\d]+

[\d]+\.[\d]+

に変更すればうまくいくと思います。

またまた小ネタなんですが、調べているときに見つけた仕様でAIRだと各数値は2桁までしか設定できないようです。
1.0.95 はOK
1.0.102 はNG
とか。

LINEで送る
Pocket

自作iPhoneアプリ 好評発売中!
フォルメモ - シンプルなフォルダつきメモ帳
ジッピー電卓 - 消費税や割引もサクサク計算!

ページトップへ戻る