Русский
Русский
English
Статистика
Реклама

Recovery mode Наш Automator, управляем приложениями MacOS на AppleScript

В один замечательный вечер мы с коллегой публиковали небольшое приложение в AppStore. Публикация приложения довольно-таки долгий процесс и состоит из множества этапов. Один из этапов - подготовка картинок для магазина приложений. Задача, на первый взгляд простая - запустить приложение в симуляторе и сделать снимок экрана приложения, а нужны экраны на шести языка, в нескольких размерах, с демонстрацией пяти разных состояния приложения. За часик можно было управиться просто делая снимки руками, при этом попивая кофе и обсуждая общие темы. Но мы же программисты и руками делать не наш метод. Надо автоматизировать процесс. Хоть мы и никогда такого не делали у нас получилось. Мы узнали как легко программно управлять приложениями MacOS. И написали AppleScript который управляет приложениями XCode и Simulator.

Постановка

Нужно сделать снимки экранов для публикации. Приложение на 6 языках, для iPhone и iPad. В магазине приложений пять слотов для снимков экрана - нам необходимо показать в этих слотах пять состояний приложения. Для разных устройств снимки экрана разные, в зависимости от разрешения. Для iPhone нужно два скриншота только вертикальных, а для iPad один, но в двух ориентациях.

Инструмент

Краткий поиск навел нас на Automator.

Запускаем.

Нас интересует WorkFlow - создаем. Программа выдает окошко из двух частей. Слева Actions - различные действия над приложениями и системой. Справа сам WorkFlow. Перетаскиваем Действия в WorkFlow и можем запускать последовательность действий. Это графический построитель программы WorkFlow.

Программа дает много возможностей, но после того, как мы наигрались с возможностями графического построителя - мы поняли, что нам проще было бы просто писать код. Привычней. И Automator дает нам такую возможность. Очистим все из панели WorkFlow, и добавим одно действие - Run AppleScript.

Обратите внимание, в библиотеке действий, помимо Run AppleScript, есть еще очень интересные действия, такие как Run JavaScript или Run Shell Script. В одном WorkFlow может быть много действий, и можно запускать другие Workflow (Run WorkFlow).

Действие Run AppleScript можно запустить и само по себе, не включая выполнение всего потока. У такого действия есть своя кнопка запуска. Для нашей задачи мы и ограничимся одним таким действием. Всю магию будет делать AppleScript. Жмем на молоточек - и пишем код.

Реализация

Вооружившись документацией, но и не пренебрегая методом научного тыка, начнем.

Открываем наше проект приложения в XCode. Так как приложение многоязычное в проекте у нас несколько схем - по количеству языков. Также в Xcode есть возможность запустить приложение в симуляторе, причем в интерфейсе Xcode есть список устройств, эмулировать которые будет симулятор.

Создаем переменные и пишем руками какие устройства нам нужны в массив sizes.

set ipad to "iPad Pro (12.9-inch) (3rd generation)"set sizes to {"iPhone 8 Plus", "iPhone 11 Pro Max", ipad}А

А список схем в массив schemes

set schemes to {"TinyApp", "TinyApp-cn", "TinyApp-jp", "TinyApp-es", "TinyApp-de", "TinyApp-ru", "TinyApp-fr"}

И запускаем перебор по размерам и по языкам:

repeat with size in sizes    repeat with lang in schemes    -- .....repeat with size in sizesrepeat with lang in schemes 

Внутри цикла у нас есть доступ к переменой size, и lang.

Говорим приложению XCode выбрать схему и размер, согласно переменным цикла, и просим запустить Simulator:

        tell application "Xcode" to activate        tell application "System Events"            tell process "Xcode"                tell menu bar 1                    tell menu "Product"                        tell menu item "Scheme"                            tell menu "Scheme"                                click menu item lang                            end tell                        end tell                           tell menu item "Destination"                            tell menu "Destination"                                click menu item size                            end tell                        end tell                        click menu item "Run"                    end tell                end tell            end tell        end tell

И выводим диалог с кнопкой продолжить:

        tell application "System Events"            display dialog "Continue"        end tell

Нам необходимо подождать пока запустится симулятор, увидеть запущено приложение, и при первом запуске перевести его в нужное состояние руками (мышкой) и нажать в диалоге Continue. Так как наше приложение помнит состояние, то при последующих запусках состояние не меняется и мы просто жмем кнопку Continue.

Ну а дальше программа просит Симулятор сделать снимок экрана, который на десктопе.

        tell application "Automator" to activate        tell application "System Events"            tell process "Simulator"                tell menu bar 1                    tell menu "File"                        click menu item "Save Screen"                    end tell                end tell            end tell        end tell

Далее просим файловый менеджер переименовать файл как нам удобно:

        tell application "Finder"            set the source_folder to (path to desktop folder) as alias            sort (get files of source_folder) by creation date            set theFile to (item 1 of reverse of result) as alias            set newName to lang & "-" & size & " .png"            set name of theFile to newName        end tell

Если это снимок экрана для iPad то мы меняем ориентацию экрана и делаем еще снимок:

        if size as string is equal to ipad then            tell application "Automator" to activate            tell application "System Events"                tell process "Simulator"                    tell menu bar 1                                                tell menu "Hardware"                            tell menu item "Orientation"                                tell menu "Orientation"                                    click menu item "Landscape Right"                                end tell                            end tell                        end tell                                                delay 2                        tell menu "File"                            click menu item "New Screen Shot"                        end tell                                                tell application "Finder"                            set the source_folder to (path to desktop folder) as alias                            sort (get files of source_folder) by creation date                            set theFile to (item 1 of reverse of result) as alias                            set newName to lang & "-" & size & "-landscape" & " .png"                            set name of theFile to newName                        end tell                                                                        tell menu "Hardware"                            tell menu item "Orientation"                                tell menu "Orientation"                                    click menu item "Portrait"                                end tell                            end tell                        end tell                                            end tell                end tell            end tell        end if

Таким образом к концу выполнения программы у нас на десктопе создаются файлы снимков экрана для всех языков и для всех нужных устройств. В одном состоянии, которое мы выбрали при первом диалоге. Копируем руками файлы, можно начать делать второе состояние. Напомню - состояния это пять разных картинок в AppStore.

Мы конечно могли еще автоматизировать и копирование файлов, но мы на этом остановились.

Итог

Вместо того, чтобы руками сделать все 120 картинок руками примерно за час, мы научились пользоваться Automator, потратив на освоение программы и языка AppleScript часа три, и наш скрипт позволил генерировать 120 картинок за минуту с минимумом операций. Несмотря на большие затраты времени, мы были довольны. Надеюсь наш опыт может оказаться полезным и для других людей, и для других задач.

А вот и Код полностью:

on run {input, parameters}    set ipad to "iPad Pro (12.9-inch) (3rd generation)"    set sizes to {"iPhone 8 Plus", "iPhone 11 Pro Max", ipad}    set schemes to {"TinyApp", "TinyApp-cn", "TinyApp-jp", "TinyApp-es", "TinyApp-de", "TinyApp-ru", "TinyApp-fr"}    repeat with size in sizes        repeat with lang in schemes            tell application "Xcode" to activate            tell application "System Events"                tell process "Xcode"                    tell menu bar 1                        tell menu "Product"                                                        tell menu item "Scheme"                                tell menu "Scheme"                                    click menu item lang                                end tell                            end tell                                                        tell menu item "Destination"                                tell menu "Destination"                                    click menu item size                                end tell                            end tell                            click menu item "Run"                        end tell                    end tell                end tell            end tell                        tell application "System Events"                display dialog "Continue"            end tell                        tell application "Automator" to activate            tell application "System Events"                tell process "Simulator"                    tell menu bar 1                        tell menu "File"                            click menu item "Save Screen"                        end tell                    end tell                end tell            end tell                        tell application "Finder"                set the source_folder to (path to desktop folder) as alias                sort (get files of source_folder) by creation date                set theFile to (item 1 of reverse of result) as alias                set newName to lang & "-" & size & " .png"                set name of theFile to newName            end tell                                    --iPad            if size as string is equal to ipad then                                                tell application "Automator" to activate                tell application "System Events"                    tell process "Simulator"                        tell menu bar 1                                                        tell menu "Hardware"                                tell menu item "Orientation"                                    tell menu "Orientation"                                        click menu item "Landscape Right"                                    end tell                                end tell                            end tell                            delay 2                            tell menu "File"                                click menu item "New Screen Shot"                            end tell                                                        tell application "Finder"                                set the source_folder to (path to desktop folder) as alias                                sort (get files of source_folder) by creation date                                set theFile to (item 1 of reverse of result) as alias                                set newName to lang & "-" & size & "-landscape" & " .png"                                set name of theFile to newName                            end tell                                                                          tell menu "Hardware"                                tell menu item "Orientation"                                    tell menu "Orientation"                                        click menu item "Portrait"                                    end tell                                end tell                            end tell                                                    end tell                    end tell                end tell            end if                                end repeat    end repeat            return inputend run
Источник: habr.com
К списку статей
Опубликовано: 19.03.2021 22:15:52
0

Сейчас читают

Комментариев (0)
Имя
Электронная почта

Xcode

Разработка под macos

Automator

Applescript

Macos

Категории

Последние комментарии

  • Имя: Макс
    24.08.2022 | 11:28
    Я разраб в IT компании, работаю на арбитражную команду. Мы работаем с приламы и сайтами, при работе замечаются постоянные баны и лаги. Пацаны посоветовали сервис по анализу исходного кода,https://app Подробнее..
  • Имя: 9055410337
    20.08.2022 | 17:41
    поможем пишите в телеграм Подробнее..
  • Имя: sabbat
    17.08.2022 | 20:42
    Охренеть.. это просто шикарная статья, феноменально круто. Большое спасибо за разбор! Надеюсь как-нибудь с тобой связаться для обсуждений чего-либо) Подробнее..
  • Имя: Мария
    09.08.2022 | 14:44
    Добрый день. Если обладаете такой информацией, то подскажите, пожалуйста, где можно найти много-много материала по Yggdrasil и его уязвимостях для написания диплома? Благодарю. Подробнее..
© 2006-2024, personeltest.ru