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

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

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

また、この内容は[FlashDevelop](http://www.flashdevelop.org/ "FlashDevelop.org") で `AIR Mobile AS3 App` プロジェクトを使用した場合の手順になります。
他の開発環境でも基本的な考え方は同じかと思いますので、適宜手順を変えて試してもらえればと思います。
<br />


### 参考サイト
・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
コード署名時にエラーが出た場合の対処方法について。
<br />


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

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

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


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

```shell-session:
unzip xxx.ipa
```
`xxx.ipa` と同じディレクトリに `Payload` ディレクトリが作られ、その中に `xxx.app` パッケージが入っています。
<br />

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

```shell-session:
mv xxx.ipa xxx_.ipa 
```
後で.ipaファイルを再作成する事になるので念のためバックアップしておきます。
<br />

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

```shell-session:
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ファイルと同じディレクトリに保存しておきます。

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

### 4. コード署名を削除

```shell-session:
rm -r "Payload/xxx.app/_CodeSignature" "Payload/xxx.app/CodeResources" 2> /dev/null | true
```
<br />

### 5. iOS7用アイコンを配置

```shell-session:
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` になっていたので一応合わせています。
<br />

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

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

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

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

### 7. コード署名を再追加

```shell-session:
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ファイルを使用します。
<br />

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

```shell-session:
export CODESIGN_ALLOCATE="/Applications/Xcode.app/Contents/Developer/usr/bin/codesign_allocate"
```
<br />


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

```shell-session:
codesign -d --entitlements - Payload/xxx.app
```
念のため、コード署名を削除する前と同じ様にXMLが表示されるか確認します。
正しく表示されない場合は、手順7でエラーが起きてる可能性が高いです。
<br />

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

```shell-session:
zip -qr xxx.ipa Payload
```
カレントディレクトリにコード署名済みの.ipaファイルができます。
<br />

以上で手順完了です。

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