EC2Mac
Macの実機を一切用意せずクラウド環境だけでiOSアプリリリースまでしたときのログ
環境
- 日時:2023/12/23
- 作業元PC: Windows11
- 作業先PC: macOS Venture 13.6.1
注意事項
- 2023/12/23 17:00(17:30~) 1h x 約¥200
- 最終的にEC2を2日半起動して、合計で$86、一日最大$34掛かった
- DedicaedHostsは最低利用時間が24時間
- EC2インスタンスの終了+DedicaedHostsのリリースに40分ほど掛かった
Ⅰ. OSセットアップ
Reference: https://qiita.com/kodai_ari/items/c7bfa235768f525bf8cd
専用ホスト作成
※Macインスタンスを起動するための専有ホストは一度割り当てを行うと24時間はリリースできない- Dedicated Host の設定
- Tag.Name:
dedicated-host
- インスタンスファミリー:
mac1
- インスタンスタイプ:
mac1.metal
- アベイラビリティーゾーン:
ap-northeast-1a
- ホストのメンテナンス.有効化:
false
(無効)
- Tag.Name:
- Dedicated Host.作成したインスタンスを選択.インスタンスをホストで起動
- 名前:
ec2-mac
- OS:
macOS
- AMI:
macOS Venture 13.6.1
- インスタンスタイプ:
mac1.metal
- セキュリティグループ作成
(※自動生成での命名になるのでCLIで指定できるならしたほうがいい)- Allow SSH traffic from 0.0.0.0/0
- インターネットからの HTTPS トラフィックを許可:
true
- インターネットからの HTTP トラフィックを許可:
true
- ストレージ設定:1x
200
GiB, gp3(GeneralPurporseSSD) - テナンシー:
専用ホスト
- 名前:
- Dedicated Host の設定
EC2インスタンス起動
SSH接続:
chmod 600 ./mac.pem && ssh -i ./mac.pem ec2-user@[xxxx.xxxx.xxxx.xxxx]
バージョン確認:
sw_vers
パスワード更新:
sudo dscl . -passwd /Users/ec2-user [mynewpassword]
VNC有効化:
sudo /System/Library/CoreServices/RemoteManagement/ARDAgent.app/Contents/Resources/kickstart -activate -configure -access -on -clientopts -setvnclegacy -vnclegacy yes -clientopts -setvncpw -vncpw [PASSWORD] -restart -agent -privs -all
AWSセキュリティーグループにVNCポート(TCP:5900)追加
VNCクライアントをインストール
VNCで
[EC2_INSTANCE_IP]:5900
へ接続Finder設定(隠しファイルの表示)
defaults write com.apple.finder AppleShowAllFiles true && killall Finder
brewのインストール: https://brew.sh/ja/
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)" (echo; echo 'eval "$(/usr/local/bin/brew shellenv)"') >> /Users/ec2-user/.zprofile
googlechromeのインストール
vscodeのインストール
Ⅱ. Flutter環境設定
Reference:
xcodeインストール
- iOSシュミレーター
- iPadシュミレーター
fvm/dart導入
brew tap leoafarias/fvm && brew install fvm echo 'export PATH="$PATH":"$HOME/.pub-cache/bin"' >> ~/.zshrc
flutter導入+設定
fvm install 3.7.7 && fvm global 3.7.7 echo 'export PATH="$PATH":"$HOME/fvm/default/bin"' >> ~/.zshrc
brew(dart)からfvm(dart)へ切り替え:
brew uninstal dart
Flutterの依存関係のインストール+確認:
flutter doctor
anyenv導入:
git clone https://github.com/anyenv/anyenv ~/.anyenv
#vim ~/.zshrc if [ -e "$HOME/.anyenv" ] then export ANYENV_ROOT="$HOME/.anyenv" export PATH="$ANYENV_ROOT/bin:$PATH" if command -v anyenv 1>/dev/null 2>&1 then eval "$(anyenv init -)" fi fi
anyenv install --init
ruby導入
anyenv install rbenv exec $SHELL -l rbenv install 3.1.4 //※3.2.X以降はlibyamlが必要になる rbenv global 3.1.4 source ~/.zshrc && ruby -v echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.zshrc echo 'eval "$(rbenv init -)"' >> ~/.zshrc
CocoaPodsのインストール:
gem install cocoapods && pod setup
初期動作確認:
flutter create [NAME] && cd [NAME] && flutter pub get
##シュミレーター起動 xcrun simctl boot "iPhone 15 Pro Max" #またはopen -a Simulator xcrun simctl boot "iPhone 12 Pro Max" #審査用スクリーンショット6.5インチ xcrun simctl boot "iPhone 8 Plus" #審査用スクリーンショット5.5インチ flutter devices flutter run -d "iPhone 15 Pro Max"`
Ⅲ. AppleDeveloper設定1
- apple developer登録
※登録処理時間が最大48時間 -> 10分で登録完了メールがきた - App ID(Bundle ID)の策定 Reference: https://note.com/build_service/n/n227b2420ef5e
- Identifierの登録
- identifier:com.xxxxx
- capabilities:None
※必要であればDeeplink:associate domains,Push通知:push notification等を付与
- 開発用デバイスの登録 Reference: https://www.micss.biz/2022/06/13/5335/
- AppleDeveloper.Devicesから作成
- デバイス登録(Register a New Device)を選択
- WindowsにiTunesをインストールし端末をUSB接続の後、端末情報を確認し登録
※更新した場合はAdHoc用のプロビジョニングプロファイルを再度入れ直す必要あり
- AppStoreConnect.アプリでプロジェクトを作成
- AppStoreConnect.ユーザとアクセス.キーでAPIキーを作成し下記を控えておく
- Issuer ID
- APIキー
- p8ファイル
Ⅳ. AppleDeveloper設定2
証明書署名要求(CSR)=> 公開鍵 + 開発者の情報
証明書(Certificate) => CSR + Appleの署名
Siging Identity(p12) => 公開鍵 + 秘密鍵
Provisioning Profile => AppID + Certificate + DeviceID List
Reference
- iOSアプリをApp Storeに公開する手順:https://qiita.com/Labi/items/3b71b8f5ef065904c1de
- FlutterアプリをApp Storeに公開する手順:https://cat-prog.com/799/
- iOSアプリ証明書概要:https://qiita.com/enjapan_common_user/items/7fb6ec3a4dd5fa7e7b82
- 証明書の有効期限切れまたは無効化:https://developer.apple.com/jp/support/certificates/#:~:text=確認ください。-,証明書の有効期限切れまたは無効化,-Apple Push Notification
Xcode でアプリを開く
sign&capabilityでAutomaticaly manage signing:trueに設定
bundle identifierをapp idで登録したものに変更
証明書CERファイル作成のため、証明書署名要求CSRファイルの準備
※CSRは一般的には対象となるアプリや組織に関する情報を含んでいますが、同じアプリに関連する開発と配布の段階では、その情報が大きく変わることは少ないため、開発用と配布用のCER作成に同じCSRを再利用することが一般的です。- キーチェーンアクセスを起動し、CertificateAssistantの"Request a Certificate From a Certificate Authority.."で認証局へ証明書を要求
- UserEmailAddress:
[APPLE_DEVELOPER_EMAIL_ADDRESS]
- CommonName:
[NAME]
※キーチェーンアクセスアプリ上ではこのKey名で作成される - Request it:
Saved to disk
- CA EmailAddress:
(None)
- Let me specify key pair information:
true
-> (RSA2048bits)
- UserEmailAddress:
- CertificateSigningRequest.certSigningRequestの保存
- キーチェーンアクセスを起動し、CertificateAssistantの"Request a Certificate From a Certificate Authority.."で認証局へ証明書を要求
証明書CERファイル(Certificate)作成 Reference: https://developer.apple.com/jp/help/account/reference/certificate-types/
- 開発用証明書(Apple Development Certificate)development.cerファイルを作成し、ダウンロード
AppleDeveloper.Certificaterから作成- Software:
Apple Development
- Services:
None
- Certificate:
[キーチェーンアクセスで作成したCertificateSigningRequest.certSigningRequest]
- Software:
- APPSTORE/ADHOC配布用証明書(Apple Distribution Certificate)distribution.cerファイルを作成しダウンロード
AppleDeveloper.Certificaterから作成- Software:
Apple Distribution
- Services:
None
- Certificate:
[キーチェーンアクセスで作成したCertificateSigningRequest.certSigningRequest]
- Software:
- 開発用証明書(Apple Development Certificate)development.cerファイルを作成し、ダウンロード
Siging Identity(p12)ファイルの作成
(※他PCでも作業が行えるよう各CER作成後に都度行う)- 作成した各証明書CERファイルをダブルクリックし、Macへインストール
- p12ファイルで出力
- キーチェーンアクセスを起動し、login.Keys(証明書)を選ぶことでCSR作成時の秘密鍵を選択
- 展開して、証明書が表示されるので右クリックでExportを行いCertificates.p12ファイルを生成
- ※パスワードは空でもOK
- ※同じCSRから作成したCERの場合は一つしか表示されないことがあるが表示されている証明書をp12にした後、削除することで他の証明書が表示される
プロビジョニングプロファイルの作成
- AppleDeveloper.Profilesから作成
- Development:
iOS App Development
- Distribution:
App Store
- App ID:
[Certificatesで作成したAppID]
- Provisioning Profile Name:
[NAME_TYPE_PROFILE]
- Development:
[NAME_TYPE_PROFILE].mobileprovision
をダウンロード
- AppleDeveloper.Profilesから作成
ipaファイルの作成
flutter clean flutter pub get flutter build ipa --release
ストアへアップロード
#!/bin/bash ## APIキー情報 API_KEY_ID="XXXXXXXXX" API_ISSUER_ID="xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx" API_KEY_PATH="/path/to/AuthKey_XXXXXXX.p8" IPA_FILE_PATH="/path/to/flutter/build/ios/ipa/XXXX.ipa" ## xcrun altoolコマンドの実行 xcrun altool --upload-app -f "$IPA_FILE_PATH" -t ios \ --apiKey "$API_KEY_ID" \ --apiIssuer "$API_ISSUER_ID" \ --verbose \ --file "$API_KEY_PATH"
アプリ申請
※下記の準備が必要- 必須端末用のスクリーンショット
- iPhone: 6.5インチディスプレイ
- iPhone: 5.5インチディスプレイ
- iPadPro(第2世代): 12.9インチディスプレイ
- iPadPro(第6世代): 12.9インチディスプレイ
- プライバシーポリシー: URL
- サポートURL: ※プライバシーポリシーと同じURLでも通った
- 必須端末用のスクリーンショット
申請承認
- 40時間掛かった
メモ
for AWS
動作未確認
RunInstances
{
"MaxCount": 1,
"MinCount": 1,
"ImageId": "ami-07dc760123309a8a7",
"InstanceType": "mac1.metal",
"KeyName": "mac",
"EbsOptimized": true,
"BlockDeviceMappings": [
{
"DeviceName": "/dev/sda1",
"Ebs": {
"Encrypted": false,
"DeleteOnTermination": true,
"Iops": 3000,
"SnapshotId": "snap-025181a9d028d0be4",
"VolumeSize": 200,
"VolumeType": "gp3",
"Throughput": 175
}
}
],
"NetworkInterfaces": [
{
"AssociatePublicIpAddress": true,
"DeviceIndex": 0,
"Groups": [
"sg-00c68a263b12ce4c6"
]
}
],
"TagSpecifications": [
{
"ResourceType": "instance",
"Tags": [
{
"Key": "Name",
"Value": "ec2-mac"
}
]
}
],
"Placement": {
"HostId": "h-07222ccff52f79f8a",
"Tenancy": "host"
},
"MetadataOptions": {
"HttpTokens": "required",
"HttpEndpoint": "enabled",
"HttpPutResponseHopLimit": 2
},
"PrivateDnsNameOptions": {
"HostnameType": "ip-name",
"EnableResourceNameDnsARecord": true,
"EnableResourceNameDnsAAAARecord": false
}
}
---
CreateSecurityGroup
{
"GroupName": "launch-wizard-3",
"Description": "launch-wizard-3 created 2023-12-23T08:13:01.366Z",
"VpcId": "vpc-d6c17bb2"
}
---
AuthorizeSecurityGroupIngress
{
"GroupId": "<groupId of the security group created above>",
"IpPermissions": [
{
"IpProtocol": "tcp",
"FromPort": 22,
"ToPort": 22,
"IpRanges": [
{
"CidrIp": "0.0.0.0/0"
}
]
},
{
"IpProtocol": "tcp",
"FromPort": 443,
"ToPort": 443,
"IpRanges": [
{
"CidrIp": "0.0.0.0/0"
}
]
},
{
"IpProtocol": "tcp",
"FromPort": 80,
"ToPort": 80,
"IpRanges": [
{
"CidrIp": "0.0.0.0/0"
}
]
}
]
}
for CLI
動作未確認
CLIでの証明書署名要求CSRファイル作成
- https://qiita.com/shtnkgm/items/2c9c5eb432c940d66e05
- https://qiita.com/terukazu/items/524b05c03ec1c5616552
openssl genrsa -out private.key 2048 openssl req -new -key private.key -out DevCertificateSigningRequest.certSigningRequest -subj "/emailAddress=[メールアドレス], CN=DevelopmentKey, C=JP"
CLIでのp12ファイル作成
openssl x509 -in ios_development.cer -inform DER -out ios_development.pem -outform PEM openssl pkcs12 -export -inkey private.key -in ios_development.pem -out ios_development.p12 $ Enter Export Password: (None) $ Verifying - Enter Export Password: (None)