LoginSignup
3
1

Fastlane Snapshotを使ってスクショ撮影を自動化する

Last updated at Posted at 2023-08-18

※fastlaneの初期化は済んでいる想定です
↓この方の記事がとても分かりやすいので先にご覧ください!
FastlaneとGitlabRunnerでCI/CDパイプラインを構築する

 はじめに

iosアプリをApp Storeに配信するとなると
アプリのビルドやその他諸々の情報だけでなく
アプリケーションのスクリーンショットを撮影して
併せてAppStoreにアップロードしなければなりません

fastlane Snapshot
App Storeのために異なるデバイスタイプと言語用にローカライズされた
iOS、tvOS、およびwatchOSのスクリーンショットを生成し
fastlane Deliverを使用してAppStoreConnectにアップロードすることができます

アップデートの度にいちいち手動でスクショなんか撮ってられないですよね
Snapshotはその悩みを解決してくれます

その手順を説明していきます

 Snapshotを初期化する

◯ プロジェクトのルートディレクトリで下記コマンドを実行する

$ fastlane snapshot init

Root/fastlane/ 直下に下記が生成されます

  • Snapfile :snapshotの設定ファイル
  • SnapshotHelper.swift :UITestでsnapshotを生成するためのヘルパー関数群

Root/ 直下に下記が生成されます

  • /screenshots :snapshotが保存されるディレクトリ

image.png

◯ SnapshotHelper.swiftを移動・ターゲットに追加

initでこのファイルを生成しただけではUITestで読み込めないので
ディレクトリを移動しつつ、UITestのターゲットに追加します
(移動せずそのままターゲットに追加でも大丈夫です)

最終的に TERGETS > AppUITests > Build Phases > Compile Sources
SnapshotHelper.swift があればOKです
image.png

 UITestを書く

スクリーンショットを自動で撮影するために、UITestをひと工夫します

◯ 全体像

AppUITest.swift
import XCTest

final class CounterUITests: XCTestCase {
    override func setUp() {
        super.setUp()

        continueAfterFailure = false
        let app = XCUIApplication()
        setupSnapshot(app)
        app.launch()
    }
    
    func test_sxample() {
        snapshot("LaunchScreen")
    }
}

◯ 詳細

setUpメソッドの中でsnapshotを取るための設定をします

continueAffterFailure はTestが失敗した時に実行を継続するかどうかを設定します
デフォルトはtrue です
Errorやテスト失敗時にそのまま動いてしまうのでfalse に設定して
スクショを想定通りに撮れなかった時にDeliverをストップできるようにします

AppUITest.swift
continueAfterFailure = false

アプリケーションを初期化し

AppUITest.swift
let app = XCUIApplication()

SnapshotHelper.swiftsetupSnapshotメソッドを使ってSnapshotをセットアップし

setupSnapshot(app)

appを起動します

AppUITest.swift
app.launch()

各テストではsnapshot メソッドを使ってスクショを撮影します

AppUITest.swift
snapshot("LaunchScreen")

 Snapfileを編集する

下記のように編集します

fastlane/Snapfile
# A list of devices you want to take the screenshots from
devices([
    "iPhone 8 Plus",
    "iPhone 13 Pro Max",
])

languages([
    "en-US",
    "ja",
])

# Automatically erase previously generated screenshots before taking a snapshot
clear_previous_screenshots(true)

# The name of the scheme which contains the UI Tests
scheme("Counter")

# Where should the resulting screenshots be stored?
output_directory("./fastlane/screenshots")

この後のステップでfastlane snapshot run を実行しますが
output_directory("パス")で指定した場所にscreenshots/が生成されますが
後々 fastlane Deliver を使ってAppStoreにデリバーする際に
Sapshotで生成したスクショを読み込もうとするパスが
./fastlane/screenshots なので
パスをここに指定しておくとあとあと楽です

 Snapshotを単体実行する

$ fastlane snapshot run

指定した言語ごとにディレクトリが生成され
デバイスごとにスクリーンショットが保存されたらOKです!

htmlも生成してくれるのでそちらでも確認できます
image.png
image.png

Fastfileを編集してレーンを作る

下記レーンを追加します

fastlane/Fastfile
desc "Take screenshots"
lane :screenshot do
    snapshot
end

下記コマンドでも実行できるようになります

$ fastlane screenshot

 おわりに

これを使わずしてiOS開発は無理ですね!

他のfastlaneの機能も記事にしていこうと思います!

3
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
1