У меня такое же желание. Я хочу иметь возможность сохранять скриншоты с нескольких экранов в моем приложении без всякой ручной работы. Я еще не там, но я начал.
Идея состоит в том, чтобы привязать /var/log/system.log, куда идут выходные данные операторов NSLog. Я передаю вывод в программу Python. Программа python читает все строки из stdin, и когда строка соответствует определенному шаблону, она вызывает screencapture.
NSLog(@"screenshot mainmenu.png");
Это приведет к тому, что при каждом вызове будет создаваться снимок экрана с именем «XX. Mainmenu YY.png». XX - это номер скриншота с момента запуска программы. YY - номер скриншота mainmenu.
Я даже добавил некоторые ненужные функции:
NSLog(@"screenshot -once mainmenu.png");
Это сохранит "XX. Mainmenu.png" только один раз.
NSLog(@"screenshot -T 4 mainmenu.png");
Это сделает снимок экрана с задержкой в 4 секунды.
После запуска приложения с правильной регистрацией могли быть созданы снимки экрана со следующими именами:
00. SplashScreen.png
01. MainMenu 01.png
03. StartLevel 01.png
04. GameOver 01.png
05. MainMenu 02.png
Дайте ему попытку:
Добавьте несколько операторов NSLog в ваш код
$ tail -f -n0 /var/log/system.log | ./grab.py
Запустите приложение iPhone в симуляторе
Поиграйте с вашим приложением
Посмотрите на скриншоты, показывающие, где вы запустили программу grab.py
grab.py:
#!/usr/bin/python
import re
import os
from collections import defaultdict
def screenshot(filename, select_window=False, delay_s=0):
flags = []
if select_window:
flags.append('-w')
if delay_s:
flags.append('-T %d' % delay_s)
command_line = 'screencapture %s "%s"' % (' '.join(flags), filename)
#print command_line
os.system(command_line)
def handle_line(line, count=defaultdict(int)):
params = parse_line(line)
if params:
filebase, fileextension, once, delay_s = params
if once and count[filebase] == 1:
print 'Skipping taking %s screenshot, already done once' % filebase
else:
count[filebase] += 1
number = count[filebase]
count[None] += 1
global_count = count[None]
file_count_string = (' %02d' % number) if not once else ''
filename = '%02d. %s%s.%s' % (global_count, filebase, file_count_string, fileextension)
print 'Taking screenshot: %s%s' % (filename, '' if delay_s == 0 else (' in %d seconds' % delay_s))
screenshot(filename, select_window=False, delay_s=delay_s)
def parse_line(line):
expression = r'.*screenshot\s*(?P<once>-once)?\s*(-delay\s*(?P<delay_s>\d+))?\s*(?P<filebase>\w+)?.?(?P<fileextension>\w+)?'
m = re.match(expression, line)
if m:
params = m.groupdict()
#print params
filebase = params['filebase'] or 'screenshot'
fileextension = params['fileextension'] or 'png'
once = params['once'] is not None
delay_s = int(params['delay_s'] or 0)
return filebase, fileextension, once, delay_s
else:
#print 'Ignore: %s' % line
return None
def main():
try:
while True:
handle_line(raw_input())
except (EOFError, KeyboardInterrupt):
pass
if __name__ == '__main__':
main()
Проблемы с этой версией:
Если вы хотите сделать снимок экрана только из окна iPhone Simulator, вы должны щелкнуть окно iPhone Simulator для каждого снимка экрана. screencapture отказывается захватывать отдельные окна, если вы не хотите с ним взаимодействовать, странное решение для инструмента командной строки.
Обновление: Теперь обрезатель симулятора iPhone (на http://www.curioustimes.de/iphonesimulatorcropper/index.html) работает из командной строки. Поэтому вместо использования встроенного снимка экрана загрузите его и используйте вместо него. Так что теперь процесс полностью автоматический .