iOS
AIR
codesign

AIR 3.8でもiOS7アイコンに対応する方法

More than 3 years have passed since last update.

ここで紹介する内容はAdobeやAppleが推奨する手順では無いと思われます。
一応、この方法で審査を通してアプリが公開しされた実績はありますが、必ず成功するかどうかは分かりませんので、あくまで自己責任でお願いします。


今回はiPhone向けに新しく追加された 120×120px のアイコンのみを追加する手順を紹介しますが、
iPad向けのアイコンも同様の手順でいけるかと思います。(未確認)

また、この内容はFlashDevelopAIR Mobile AS3 App プロジェクトを使用した場合の手順になります。
他の開発環境でも基本的な考え方は同じかと思いますので、適宜手順を変えて試してもらえればと思います。

参考サイト

・Support for new icon sizes in iOS 7 - Adobe Community
http://forums.adobe.com/message/5654846
Adobeのコミュニティのスレッド。
→ AIR 3.8はiOS7用のアイコンサイズに対応してないので、アプリケーション記述ファイル(application.xml)でiOS7用のアイコンを指定してもコンパイルに失敗する。
→  AppStoreに申請する時にiOS7用のアイコンが入ってないとバイナリアップロードの後に警告メール来て審査前に弾かれる。
→ AIR 3.9 ベータ(3.9.0.790以降)ならiOS7用のアイコンを含めてコンパイルできるようになってる。
といったような流れ。

・Resigning an iOS provisioning profile - Stack Overflow
http://stackoverflow.com/questions/15634188/resigning-an-ios-provisioning-profile
プロビジョニングプロファイルを差し替える手順についての説明の様ですが、
アプリの中身を差し替えてコード署名を再度行うという意味では共通の内容になるかと思います。

・object file format unrecognized, invalid, or unsuitable - myr's blog
http://nariya-takemura.blogspot.jp/2012/08/object-file-format-unrecognized-invalid.html
コード署名時にエラーが出た場合の対処方法について。

0. 事前準備

iOS7用のiPhone向けアイコンをPNGファイルとして事前に用意します。
/[プロジェクトフォルダ]/icons/ios/icons/ フォルダに icon_120.png というファイル名でアイコンを追加しておきます。
FlashDevelopのテンプレートを使用していれば、このフォルダに入っているファイルは自動的に.ipaファイルの中に単なるデータとして組み込まれます。
後でこのファイルを元にアイコンとして認識されるようにアプリに追加する事にします。

準備ができたら通常通り.ipaファイルを生成します。

以下、 Macでの作業 となります。
対象アプリの.ipaファイルを xxx.ipa とし、中の.appパッケージを xxx.app として説明します。
カレントディレクトリは.ipaのあるディクレトリとします。

1. .ipaファイルを解凍。

unzip xxx.ipa

xxx.ipa と同じディレクトリに Payload ディレクトリが作られ、その中に xxx.app パッケージが入っています。

2. .ipaファイルをリネームしてバックアップ。

mv xxx.ipa xxx_.ipa 

後で.ipaファイルを再作成する事になるので念のためバックアップしておきます。

3. コード署名のエンタイトルメントを表示

codesign -d --entitlements - Payload/xxx.app

Executable=[カレントディレクトリ]/Payload/xxx.app/xxx
??qq<?xml version="1.0" encoding="UTF-8" standalone="no"?> 
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> 
<plist version="1.0"> 
    <dict> 
        <key>application-identifier</key> 
        <string>[アプリID]</string> 
        <key>get-task-allow</key> 
        <false/> 
    </dict> 
</plist>

XMLを含んだ文字列が表示されるので、XML部分だけをコピペして entitlements.plist などの名前で.ipaファイルと同じディレクトリに保存しておきます。

内容は固定なので、あらかじめ用意しておいても良いと思います。

4. コード署名を削除

rm -r "Payload/xxx.app/_CodeSignature" "Payload/xxx.app/CodeResources" 2> /dev/null | true


5. iOS7用アイコンを配置

cp Payload/xxx.app/icons/icon_120.png Payload/xxx.app/Icon-Iphone-120.png

FlashDevelop のプロジェクトで /[プロジェクトフォルダ]/icons/ios/icons/ に入れておいたファイルは Payload/xxx.app/icons/ に入っていますので、その中のアイコンファイルをコピーして xxx.app パッケージの直下にコピーします。

ファイル名は何でも良いかもしれませんが(未確認)、 AIR 3.9ベータ で確認したら Icon-Iphone-120.png になっていたので一応合わせています。

6. info.plist にアイコンを追加。

xxx.app を右クリックして「パッケージの内容を表示」を選択。
その中の info.plistXcode で開きます。

Information Property List -> Icon files の配列の先頭に Icon-Iphone-120.png を追加します。
追加する場所を先頭にしたのも AIR 3.9ベータ に合わせています。

テキストエディタなどで開く場合は、 <key>CFBundleIconFiles</key> の後に続く <array> 内の先頭に <string>Icon-Iphone-120.png</string> を追加すれば良いとかと思います。

7. コード署名を再追加

codesign -f -v -s "iPhone Distribution: [キーチェーンアクセスに追加してあるiOS 配布用証明書の名前]" --resource-rules Payload/xxx.app/ResourceRules.plist --entitlements entitlements.plist Payload/xxx.app

iOS 配布用証明書の名前は キーチェーンアクセス から該当の証明書を表示し、 通称 の項目をコピーしておきます。
entitlements.plist は手順3でコード署名を削除する前に取得したXMLファイルを使用します。

環境によっては、 object file format unrecognized, invalid, or unsuitable のエラーが出る場合があったのですが、その場合は以下のコマンドで環境変数を追加しておくとエラーが回避できました。

export CODESIGN_ALLOCATE="/Applications/Xcode.app/Contents/Developer/usr/bin/codesign_allocate"


8. コード署名のエンタイトルメントを確認

codesign -d --entitlements - Payload/xxx.app

念のため、コード署名を削除する前と同じ様にXMLが表示されるか確認します。
正しく表示されない場合は、手順7でエラーが起きてる可能性が高いです。

9. .ipaファイルを再圧縮

zip -qr xxx.ipa Payload

カレントディレクトリにコード署名済みの.ipaファイルができます。

以上で手順完了です。

コード署名に失敗していると、 XcodeのApplication Loader でアプリをアップロードする際に最初のファイルチェックで弾かれます。
アップロード完了後にしばらく経ってもAppleから警告メールが来なければ、iOS7用アイコンの追加に成功していると思われます。