[Appium] Ad-hoc用のipaファイルを開発者用の署名に差し替えてAppiumで使用できるようにする

Ad-hoc用に配布されたipaファイルを自分の開発者署名で再署名して、
Appiumで使用できるようにするためのメモ。
（Appiumは`Development`のプロビジョニング プロファイルでビルドされたアプリしか使用できないため）

# **用意するもの**

## ipaファイル
Ad-hoc用に配布された、署名を差し替える前のipaファイル

## embedded.mobileprovision
 * Development用の iOS Provisioning Profiles  
 * Apple Developer Member Center からダウンロードしてくる

## entitlements.plist
### 方法1. テキストエディタで作成する（UTF-8エンコード）

```xml:entitlements.plist
<?xml version="1.0" encoding="UTF-8"?>
<!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>PREFIX.ID</string>
    <key>com.apple.developer.team-identifier</key>
    <string>TEAM-IDENTIFIER</string>
    <key>get-task-allow</key>
    <true/>
    <key>keychain-access-groups</key>
    <array>
        <string>PREFIX.ID</string>
    </array>
</dict>
</plist>
```

※下記の箇所は自分の環境にあわせて書き換えること
**TEAM-IDENTIFIER**
　`embedded.mobileprovision` をテキストエディタで開き、 **com.apple.developer.team-identifier** で検索
**PREFIX.ID**
　Develper Member Center の Identifiers > App IDs. で Prefix と ID を調べる

　

### 方法2. 適当なipaファイルから抜き出す

* Xcodeで適当なプロジェクトを開く
* iOS実機端末に対して `Run` でデバックビルドを実行
* 下記ディレクトリにappファイルが作成されていることを確認

`~/Library/Developer/Xcode/DerivedData/<ランダムな文字列>/Build/Products/Debug-iphoneos`

* 下記コマンドを実行し、出力結果を`entitlements.plist`という名前で保存する（UTF-8エンコード）

```
cd ~/Library/Developer/Xcode/DerivedData/<ランダムな文字列>/Build/Products/Debug-iphoneos
codesign -d --entitlements - <アプリ名.app>
```
　

# **署名の差し替え手順**

## **方法1. 手動で差し替える**

### 1. ipaファイルをZIP解凍する

```
unzip -q <ipaファイルのパス>
```

### 2. embedded.mobileprovision を差し替える

上記で用意した `embedded.mobileprovision` で、app内の同名のファイルを上書きする

```
cp embedded.mobileprovision Payload/MyApplication.app/embedded.mobileprovision
```

### 3. appファイルを署名し直す

PCにインストール済みの証明書を調べる

```
security find-identity -p codesigning -v
```

署名を実行

```
codesign --force --sign 'iOS Development: your name (XXXXXXXXXX)' --resource-rules 'MyApplication.app/ResourceRules.plist' --entitlements entitlements.plist 'MyApplication.app'
```

　

## **方法2. シェルスクリプトを使用する**

必要なファイルをすべて同じフォルダに置いて、下記コマンドを実行
`sh resign.sh MyApplication.ipa`

* 署名差し替え前のipaファイル
* embedded.mobileprovision
* entitlements.plist
* resign.sh

```bash:resign.sh
#!/bin/bash

# ReSignするipaファイル
IPA_FILE=$1

# Provisioning Profile
PROV_FILE="embedded.mobileprovision"

# Entitlements
ENTITLEMENTS="entitlements.plist"

# iPhone Developer証明書
# 明示的に指定する場合
# SIGN="iPhone Developer: Your Name (1A2B3C4D5E)"
# 自動で取得する場合
SIGN=`security find-identity -p codesigning -v | grep "Developer"`
SIGN=`echo "${SIGN}" | awk 'match($0, /\".*\"/) {print substr($0, RSTART+1, RLENGTH-2)}'`
echo $SIGN


# ipaファイルをzip解凍
mkdir -p tmp
cp ${IPA_FILE} tmp
cd tmp
unzip -q ${IPA_FILE}
APP_FILE=Payload/`ls Payload`

# プロビジョニングファイルを新しいものに置き換え
cp ../${PROV_FILE} ${APP_FILE}/embedded.mobileprovision

# .appを署名し直す（entitlementsも書き換える）
codesign --force --sign "${SIGN}"\
  --resource-rules ${APP_FILE}'/ResourceRules.plist'\
  --entitlements ../${ENTITLEMENTS} ${APP_FILE}

# 署名が上手くいったか確認
codesign -d --entitlements - ${APP_FILE}

# zip圧縮で新しいipaファイル作成
DEST_FILE="${IPA_FILE%.*}_resign.ipa"
zip -qr ${DEST_FILE} Payload
cp -f ${DEST_FILE} ../
cd ../
rm -rf tmp
```

　

## **方法3. Re-signアプリを使用する**

https://github.com/maciekish/iReSign

　
# 参考
http://dev.mlsdigital.net/posts/how-to-resign-an-ios-app-from-external-developers/
http://qiita.com/fujisan3/items/d037e3c40a0acc46f618
http://qiita.com/seyself/items/8f62677547ef597cee67