ipaファイルのProvisioning Profileの更新をしてみた(Xcodeなし)

#はじめに
テスト業界が長い人なら一度は体験したことがあると思う。

###<font color="Red">テスト端末にipaのインストールが出来ねぇ…:cold_sweat:</font> 

そうです。
Provisioning Profileに新しく購入した端末の「UDID」が登録されておらず、
アプリのインストールが蹴られてしまう恐怖の「アレ」です(´・ω・`)
　※Provisioning ProfileへのUDID登録漏れというのもありますね...

開発に再ビルド依頼してもスグに対応してくれないし、
どうにかならないものか…と考えている人のために！

自力で新しいProvisioning Profileをipaへ再署名してインストールできるようにする！
というのを「Xcode無し・再ビルド無し」で実行する手順を書いてみたいと思います。



#準備するもの
* Mac ※1
* ipa　※2
* 新しい端末(UDID)が含まれているProvisioning Profile　※3
* Provisioning Profileに紐づく証明書(p12)　※4

※1　mac os10.12 以降
※2　ipaファイル名を「sample001.ipa」とします。
※3　新しく作成したProvisioning Profileを「new.mobileprovision」とします。
※4　証明書(p12)がキーチェーンに登録されていること。
 　　証明書(p12)の名称を「Sample Co., Ltd.」とします。
<br>
#実行環境
#####macOS 10.15 Catalina

私は上記の環境にて実行しましたが、「macOS 10.12 Sierra」以降なら恐らく動作すると思います。

では、実際の手順を書いていきます！
<br>
#手順
####１． ipaファイルとProvisioning Profileを同一フォルダに格納する
<br>
####２． ターミナルを起動して手順1のフォルダをカレントディレクトリにする


ココまでは手順を書くまでも無いですね。
なんとなく誰でも出来ると思います。



<br><br>
では、次の手順から実際にターミナル上でコマンドを入力して再署名していきましょう。
<br>
####３． ipaファイル(sample001.ipa)を展開する

```bash
unzip sample001.ipa
```
ここではipaファイルを解凍・展開しているとでも思ってください。

これからやることは、ipaを解凍して新しいProvisioning Profileに差し替える！
ということをターミナルを使ってやっていきますので、まず最初にipaを解凍しております。

では、次の手順にいきましょう。

<br>

####４．「codesign」から署名時に必要な資格情報ファイルを作成する。

```bash
codesign --display --entitlements :- Payload/Sample001.app > entitlements.plist
```
急にややこしくなった雰囲気がしますが、簡単に説明するとここでは再署名時に必要となる、
「Entitlementsファイル」というものを作成しています。

このEntitlementsはiPA(アプリ)が出来るまでの工程でも、基本中の基本になります。

もっと詳しく知りたい！という方は、Apple公式の[Entitlementsページ](https://developer.apple.com/documentation/bundleresources/entitlements)を見てみましょう。
上記のページを見れば、どんなものがEntitlementsに設定できるのか理解できると思います。

<br>

####５． Provisioning Profileを更新する

```bash
cp -p new.mobileprovision Payload/Sample001.app/embedded.mobileprovision
```
「cp」コマンドを利用してProvisioning Profileを上書きしています。
「cp」コマンドは見たまんま「コピー」です(´・ω・`)

凄く簡単に書くと、「new.mobileprovision」を「Sample001.app」へ上書き(コピー)して！
というコマンドになっております。

これでipaに新しいProvisioning Profileが上書きされました:laughing:
<br>

####６． 再署名を実施

```bash
codesign --force --sign 'iPhone Distribution: Sample Co., Ltd.' --entitlements entitlements.plist 'Payload/Sample001.app'
```

このコマンドを実行するとMacOSへのログインパスワードを求められます。
　※これは再署名するために「キーチェーン」にアクセスしようとしているため入力を求められます

コマンドを実行し、MacOSへのログインパスワードを入力すると、
成功時は「replacing existing signature」という祝福の文字が表示されます。

表示されない場合は、残念ながら失敗しています(´・ω・`)
失敗してしまう！という方は下記の点をご確認ください。
<br>
■証明書(Sample Co., Ltd)がキーチェーンに登録されていない
→この手順で失敗した場合は、「'iPhone Distribution: Sample Co., Ltd.'」が
　キーチェーンに登録されていない可能性が高いです。
　　※キーチェーンってなんですか？という方は、Google先生に聞くか誰かに聞いてください
<br>
ここまで来たらあと一歩！
<br><br>

####７． 新しいipaを作成する

```bash
zip -ry New.ipa Payload'
```

これが最後の手順です。

これまでの行った「Provisioning Profileの更新、再署名」したipaをZipで固めます。

このコマンドを実行したら、最初に古いipaと新しいProvisioning Profileを格納したフォルダに
「new.ipa」という新しいipaが新規に作られてると思います。

そのipaをインストールできなかった端末にインストールしてみてください。
きっと…インストール出来るようになってるはずです。

これで手順終了となります:grinning:
<br>


#さいごに
・証明書(p12ファイル)
・Provisioning Profile
・キーチェーン
・Entitlements

本記事で記載した上記の4つについては、勝手に設定変更したり削除したりすると
アプリがインストール出来なくなるだけじゃなく、会社(もしくは個人)で所持している
証明書やProvisioning Profileが全て機能しなくなる可能性もあります。

そうなると、１から作り直し…なんてこともありますので、Provisioning Profileの更新は、
慣れるまで管理者の方と実行することをオススメします。
<br>
# We are recruiting !
 株式会社GENZではソフトウェアのテストサービス業務を行っています。
 キャリア採用も行っておりますので、ご興味がある方は以下をご確認ください！
 [株式会社GENZ - スマホアプリ検証]
 (https://www.genz.jp/test-service-menu/mobile-testing/?qi=20210218)
 [株式会社GENZ - 採用情報]
 (https://www.genz.jp/recruit/?qirecruit=20210218)