Fastlaneを使って、自動でスクリーンショットが撮れるのは非常に便利なのですが、AdMobを使っていると、スクリーンショットの広告部分を修正したくなります。
この修正も自動でできると非常に手間が減るので、やってみることにしました。
目標は以下です。
- fastlaneの1つの処理として、自動で、生成されたスクリーンショット画像の一部に変更を加える(これがやりたいこと)
- 画像によって、変更すべき箇所が異なる(iPhoneの機種違いやiPadなので、対応必須)
- 画像変更は、ImageMagickを使う
- ある程度、プロジェクト固有の設定が発生するのはしょうがない(最初に一度調整したら、あとは、放置できると嬉しい)
fastlaneのaction
自分でactionを作ろうとするとRubyで書く必要があります。
ここに詳細があります。
といっても、数行ですが・・・・
調べてみると、shellを実行するアクションがあったので、自分の好きなPythonでactionを書くことに
action sh
いろいろなアクションがすでにありますが、Miscを読んでいくと、便利そうな”sh”というactionがあることがわかります。
すこし動作を調べてみました。
pwdはどこ?
Pwdコマンドを実行するアクションを作成して実行したところ、
1 2 3 4 5 6 7 |
[13:01:17]: ----------------- [13:01:17]: --- Step: pwd --- [13:01:17]: ----------------- [13:01:17]: $ pwd [13:01:17]: ▸ /........../ExecDir/fastlane |
となりました。特に指定しなければ、fastlaneディレクトリで実行されるようです。
python動く?
1 2 3 4 |
#!/usr/bin/python print("Hello world") |
1 2 3 4 5 6 7 8 |
[13:01:17]: ▸ /Users/tyagishi/dev/SDSProduct/WeightClip2/fastlane [13:01:17]: ----------------------------- [13:01:17]: --- Step: ./HelloWorld.py --- [13:01:17]: ----------------------------- [13:01:17]: $ ./HelloWorld.py [13:01:17]: ▸ Hello world |
ということで、普通に(?)、Pythonが動きそうなので、Pythonでscreenshotsディレクトリ中のファイルをimageMagickを使いアップデートしていくスクリプトを作ります。
画像変更スクリプト
HideAd.jpgという広告部分を隠すための画像を用意して、合成する位置を確認したものが、以下のスクリプト
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 |
#!/usr/bin/python import os import shutil TargetDevices = [ "iPhone 6s Plus", "iPhone Xs Max", "iPad Pro (12.9-inch) (2nd generation)", "iPad Pro (12.9-inch) (3rd generation)" ] TargetDirs = [ "screenshots/en-US", "screenshots/ja-JP" ] BackupDirName = "backup/" def checkDeviceTypeFromFileName(filename): for deviceName in TargetDevices: if filename.find(deviceName) != -1: return deviceName return "" # "" means no need to process def HideAd(): baseDir = "./" for targetDir in TargetDirs: # if targetDir has backup, remove it targetDirFullPath = baseDir + targetDir backupDirectory = targetDirFullPath + "/" + BackupDirName if os.path.exists(backupDirectory): shutil.rmtree(backupDirectory) os.makedirs(backupDirectory) for file in os.listdir(baseDir + targetDir) : deviceType = checkDeviceTypeFromFileName(file) if deviceType == "": print("Skipped : " + file) continue print("Hiding ads: "+ file) fullFilePath = targetDirFullPath + "/" + file os.system("mv \"" + fullFilePath + "\" "+ backupDirectory) backupedFile = backupDirectory + file resultFile = targetDirFullPath + "/" + file if deviceType == TargetDevices[0]: # iPhone6sPlus ExecImageMagicWithArg("-geometry +0+60", backupedFile, resultFile) if deviceType == TargetDevices[1]: # iPhoneXsMax ExecImageMagicWithArg("-geometry +0+130", backupedFile, resultFile) if deviceType == TargetDevices[2]: # iPadPro Gen2 ExecImageMagicWithArg("-geometry +0+40", backupedFile, resultFile) if deviceType == TargetDevices[3]: # iPadPro Gen3 ExecImageMagicWithArg("-geometry +0+40", backupedFile, resultFile) return def ExecImageMagicWithArg(position, origfile, targetfile): command = "composite -gravity north " + position + " -compose over HideAd.jpg \"" + origfile + "\" \"" + targetfile + "\"" os.system(command) #print(command) return if __name__ == '__main__': #print("executed from fastlane") HideAd() |
改善した方が良いかもしれない点:
現在は、オリジナルのファイルはbackupディレクトリにコピーしてますが、fastlaneでframeitを使っていると、backupないのファイルにもframeをつけてしまいます。
ファイル名を変えておくと、frame対象から外せるので、処理時間が減ります。
スクリーンショットは、iTunesConnectにD&DするだけでOKになりました。
最終確認してから登録したいので、iTunesConnectへのアップロードまでの自動化はやめてます。
Sponsor Link