티스토리 뷰

Programming/iOS

iOS 캡쳐 자동화 하기

신규하 2011.08.26 12:05
아이폰 시뮬레이터 캡쳐 받기 - iOS-Simulator Cropper 포스팅에서 마지막에 스크립트로 자동화 하기가 있었습니다.
사이트에서는 그냥.. 캡쳐만 대체해 주면 잘 된다고 했는데 -_-;
잘 되질 않더군요.
코드도 손 볼 부분도 좀 있고 해서..
나름대로 수정을 했습니다.


먼저 자동화 된 캡쳐를 받기 위해서는 소스코드에 NSLog를 등록 합니다.

형식은 3가지를 지원 합니다.
그냥.. 일반적인 캡쳐
NSLog(@"screenshot mainmenu.png");
앞 쪽과 뒤쪽은 숫자는 자동으로 증가 합니다.

NSLog(@"screenshot -once mainmenu.png");
-once를 넣어 주시면 딱 한번 만 캡쳐를 받아 줍니다.

NSLog(@"screenshot -delay 4.0 mainmenu.png");
-delay를 넣어 주시고 뒤에 숫자를 넣어 주시면, 숫자 만큼 초가 지난후에 캡쳐를 받아 줍니다.
위에서 받은 캡쳐는 4초 후에 캡쳐가 받아 지겠죠?


첨부파일 다운로드 :

우선 첨부 파일을 다운로드 받아서, 더블클릭해서 압축을 푸시거나,
쉘이 편하신 분은 터미널에서

$ tar -zxvf iOS-Simulator-Screenshot.tgz

이렇게 해서 압축을 푸시면 됩니다.
그리고 해당 경로로 이동 후

./iOSCapture.sh [캡쳐 할 경로]

이렇게 실행하시면 됩니다.


이미지에서는 바탕화면에 캡쳐 하도록 되어 있습니다.

그리고 시뮬레이터를 실행 시켜 주시면, 해당 타이밍에 착착~ 캡쳐를 받아 줄겁니다.
참 쉽죠?

아래는 코드를 적어 봅니다.
iOSCapture.sh
#!/bin/bash
# 아이폰 캡쳐 자동화
#
# 사용법
#
# $ iOSCapture.sh [저장 경로]
#
# 예) iOSCapture.sh ~/Desktop
#
#-------------------
# 어플리케이션 추가
#
# * 캡쳐 하기
#     NSLog(@"screenshot mainmenu.png");
# * 한번만 캡쳐 하기
#     NSLog(@"screenshot -once mainmenu.png");
# * 2초후에 캡쳐 하기
#     NSLog(@"screenshot -delay 2.0 mainmenu.png");
#
# 참고 :
#     http://stackoverflow.com/questions/1360552/automate-screenshots-on-iphone-simulator/1579182#1579182

# 사용법에 대한 함수.
function usage()
{
    echo "`basename $0` [-h] [targetPath]"
    echo "    -h : 도움말"
    echo "    targetPath : 저장 할 경로"
}

while getopts :hr: optname ;do
    case $optname in
        h)
            usage; exit 1;;
    esac
done

tail -f -n0 /var/log/system.log | ./iOSLogGrab.py $1



iOSLogGrab.py
#!/usr/bin/python
# -*- coding: utf-8 -*-

import sys
import string
import re
import os
import threading

from collections import defaultdict

captureApplication = "./iOS-Simulator\ Cropper.app/Contents/MacOS/iOS-Simulator\ Cropper"
defaultPath = "."

def screenshotRun(filename):
    command_line = captureApplication + " -p 1 -f " + filename
    print command_line
    os.system(command_line)

def screenshot(filename, select_window=False, delay_s=0):
    t = threading.Timer(delay_s, screenshotRun, [defaultPath+"/%s" % filename])
    t.start()

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*(\.?\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 = float(params['delay_s'] or 0)
        print str(delay_s)
        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__':
    if len(sys.argv) > 1:
        print "default path : " + sys.argv[1]
        defaultPath = sys.argv[1]
        print defaultPath
    main()


참고 :


댓글
  • 프로필사진 신규하 앗.. 현재는 iPhone용만 캡쳐가 되네요..
    iPad도 지원 할려면, 스크립트를 좀 업데이트 해야 겠네요.
    요청이 있으면 그 때 해 봐야 겠네요 ^^;
    2011.08.26 12:10 신고
댓글쓰기 폼