これまでは、手作業で、バイナリをアップロードして、スクリーションショットを作って、・・・とやっていたのですが、そろそろ自動化しようかと考えまして、やってみます。(うまくいかなければ、また、手作業に戻ります)
環境
- 開発Macintosh: MacMini2028, MacOS 10.15.4 Catalina
- Xcode: XCode11.4.1
- 登録するアプリ:iPhone向けアプリ、日本語、英語の2言語対応
参考にするドキュメント
fastlaneインストール
ドキュメントに従って、Xcode command line toolのインストールから。
% xcode-select --install xcode-select: error: command line tools are already installed, use "Software Update" to install updates
すでにインストールされてました。
次に、fastlaneのインストール
% sudo gem install fastlane -NV
-NVの意味は知らないけど、準備みたいなもの?
途中、パスワードを聞かれて、インストールはすんなり終了。”5 gems installed”だそうです。
% brew install fastlane
“Error: The `brew link` step did not complete successfully”なるエラー発生。
メッセージの通り、以下のコマンドを実行しました。
% rm '/usr/local/bin/fastlane' % brew link --overwrite fastlane
以前に、インストールだけしたことがあって、その影響かもしれませんが、詳細不明のまま進めます。
プロジェクトの設定
プロジェクトのディレクトリに行って、以下のコマンドを実行。Swiftはわかるけど、Rubyはわからないので、Betaかもしれないけど、Swift版を使用することに。
% fastlane init swift
コマンド実行途中で、何したい?と聞いてきます。コマンドから表示されるテキストでも、1つのタスクから初めて、徐々に増やしなさいと書いてあります。
ということで、まずは、”Automate screenshots”を自動化することにしました。
途中、セットアップに必要な2つのHelperファイルを作りますと表示されました。詳細は、ここを読みなさいとの事でした。
作られたファイルは、以下のファイルっぽい
- ./fastlane/SnapshotHelper.swift
- ./fastlane/Snapfile.swift
以下のことをしなさいと表示されたのでその通りに。
- UI Test targetをプロジェクトに追加
- ./fastlane/SnapshotHelper.swiftを、UI Test targetに追加(ファイルの位置は動かしても良い)
- setupSnapshot(app)をアプリ起動時の箇所に追加
let app = XCUIApplication() setupSnapshot(app) app.launch()
- snapshot(“0Launch”)をスクリーンショット を取り合い箇所に追加
- Xcode schemeを新しく作られたUITest target向けに追加
- 新しく作ったschemeの”Shared”オプションをチェックする
- もっと知りたければ、ここだそうです(未読)
すでに追加されていたプロジェクトを使っていたので、自動で検知されて、「これで良い?」と聞かれたので、「それ☺️」と答えて次へ。
「生成したスクリーンショット をAppStoreに自動でUploadする?するなら、AppStoreのcredentialとか必要」と聞かれるので、まずは、ローカルに作ってもらうことに。
バージョンの自動インクリメントするなら、こことここを読みなさいとの事でした。(当面読みません・・・)
Fastlane configurationとして、./fastlane/Fastfile.swiftと./fastlane/Appfile.swiftが生成されました。GemfileとGemfile.lockはGemfileパスにあるとのこと。
それぞれをGitに追加することをお勧めされました。(GemfileとGemfile.lockはプロジェクトディレクトリ 直下にできてました。Gemfileパスとは??)
セットアップの途中で、いろいろと説明されて、どうやらlaneというのがfastlaneで実行するタスクの単位らしいことと、おそらく実行するものをactionと呼んでいるようで、actionの詳細は、ここを参照との事。
最後に、fastlaneをアップデートしたければ、”sudo gem install fastlane”してねとのことでした。セットアップ途中に上がったのかな???
エラーなく、セットアップできたっぽい。
いろいろとカスタマイズする前に、お勧め通りに、以下をgitへ登録しました。
- ./fastlane/Fastfile.swift
- ./fastlane/Appfile.swift
- ./fastlane/Snapfile.swift
- ./fastlane/SnapshotHelper.swift
- Gemfile
- Gemfile.lock
./fastlane/swiftフォルダ配下にいろいろとswiftファイルがありましたが、おそらく定型だと思うので、とりあえず、登録しませんでした。
生成されたfastlaneファイルのチェック
生成されたファイルを見てみました。
- Appfile.swift
- appIdentifierとappleIDを設定するファイルっぽい。AppStoreへの登録を自動化するなら設定しないといけない気がする
- Fastfile.swift
- スクリーンショットを撮るlaneの定義?よくわかりません。
- Snapfile.swift
- おそらく、どのデバイスのスクリーンショット撮る?/どの言語?等の設定をするファイルっぽい
- SnapshotHelper.swift
- 本当にHelperFunctionのファイルだと思います
スクリーンショット自動化のための手順
セットアップの最後に、以下のURLを教えてくれます。まずは、スクリーンショット をみていきます。
とりあえず、複数デバイスではなく1つのデバイス向けに作成して、AppStoreが展開してくれることを想定して設定することをお勧めしてくれます。
UI Testを使って、スクリーンショット撮っていくみたいです。
- XcodeプロジェクトにUI Testをターゲットして追加(fastlaneSnapshotと命名しました)
- SnapshotHelper.swiftをターゲットに追加
- fastlaneSnapshot向けにSchemeを作成(fastlaneSnapshotSchemeと命名)
- fastlaneSnapshotSchemeを以下のように変更
- Buildの中のRunカラムをチェック
- Sharedをチェック(すでについてました)
- UITestのファイルを開いて、左下の録画ボタンを押して、操作を記録
録画を開始するには、アプリケーションのschemeを選択している必要があります。また、操作をコードとして記録してくれるのですが、テスト用の関数の外側にカーソルがあると、録画ボタンがEnableになりません。 - スクリーンショット を撮りたい所に、snapshot(“01LoginScreen”)のようなコードを追加します。
- テスト実行コードの”let app = XCUIApplication”と”app.launch()”の間に、”setupSnapshot(app)”を追加します
なお、Xcode上でテストを実行してもスナップショットは撮ってくれないみたいです - スナップショットを撮りたいローカライゼーションの指定/Snapfile.swiftの編集
en-USとja-JPとしました - ターミナルで実行します。
% fastlane snapshot
スナップショット撮れたんですが、どうやらXcodeが認識しているsimulator全部で撮ろうとするみたいです。16個もあってかつ、エラーが発生したので、途中でCtrl-Cで止めました・・・
ということで、対象デバイスとschemeを設定して実行するように、Snapfile.swiftを編集してみました。
が、うまく動かず、Snapfileという名前に変更して、Rubyフォーマット(?)で記述することとした所、うまく動きました。
# A list of devices you want to take the screenshots from devices([ "[SCREENSHOT]Xs MAX", "[SCREENSHOT]6s Plus" # "iPad (7th generation)", # "iPad Air (3rd generation)", # "iPad Pro (11-inch)", # "iPad Pro (12.9-inch) (3rd generation)", # "iPad Pro (9.7-inch)", # "iPhone 11", # "iPhone 11 Pro", # "iPhone 11 Pro Max", # "iPhone 8", # "iPhone 8 Plus" ]) languages([ "en-US", "ja-JP" ]) # The name of the scheme which contains the UI Tests # scheme "SchemeName" # Where should the resulting screenshots be stored? # output_directory "./screenshots" # clear_previous_screenshots true # remove the '#' to clear all previously generated screenshots before creating new ones # Choose which project/workspace to use # project "./Project.xcodeproj" # workspace "./Project.xcworkspace" # For more information about all available options run # fastlane action snapshot
自分の管理用に、ScreenShotが必須なSimulatorは、[SCREENSHOT]という接頭辞をつけて管理しているのですが、それが関係してか、生成されたスクリーンショットをまとめてみることができるhtmlは、うまく表示することができませんでした。
fastlane自動化
うまく動作するまでに、若干の手間がかかりますが、2回、3回とAppStoreにアップデートを申請することを考えれば、超便利!
スクリーンショットって、作るのが若干の手間なので、アップデートをサボりがちなんですよね・・・
一度、動く環境を作ってしまえば、なんてことはなくなるので、今度申請するアプリから使います。
Sponsor Link