Mac OSX 화면 보호기를 Swift로 만들기

이 기사는 Cocoa Advent Calendar 2015의 둘째 날 기사입니다.

소개



스크린 세이버의 앱을 만든 사람은 거의 없다고 생각합니다만, 그 시작에 Swift로의 기동 방법까지 소개합니다.

또한 이번 프로젝트는 기주 b. 코 m / 카네 신 / 테 x ぁゔ ぇ r에 둡니다.

환경


  • OS X El Capitan 10.11.1 (15B42)
  • Xcode 7.1.1 (7B1005)

  • 준비



    ScreenSaverEngine.app 준비



    구현하는 Screen Saver를 실행하기 위해 ScreenSaver.framework의 ScreenSaverEngine.app를 Applications 디렉토리에 심볼릭 링크를 만듭니다.
    $ ln -sf /System/Library/Frameworks/ScreenSaver.framework/Versions/A/Resources/ScreenSaverEngine.app /Applications/ScreenSaverEngine.app
    



    구현



    Screen Saver 템플릿





    템플릿을 만들면 Objective-C 템플릿 밖에 없기 때문에 Swift 파일을 준비한다. 이때 가능한 한 같은 파일명으로 하는 것.



    작성한 후 Objective-C용 템플리 파일을 삭제하십시오.

    Swift 용 코드 템플릿



    작성한 Swift 파일에 그대로 아래를 붙여넣으십시오.
    import Foundation
    import ScreenSaver
    
    class TextSaverView: ScreenSaverView {
    
        required init?(coder: NSCoder) {
            super.init(coder: coder)
            self.animationTimeInterval = 1.0 / 30.0
        }
    
        override init?(frame: NSRect, isPreview: Bool) {
            super.init(frame: frame, isPreview: isPreview)
            self.animationTimeInterval = 1.0 / 30.0
        }
    
        override func startAnimation() {
            super.startAnimation()
        }
    
        override func stopAnimation() {
            super.stopAnimation()
        }
    
        override func drawRect(rect: NSRect) {
            super.drawRect(rect)
        }
    
        override func animateOneFrame() {
            return
        }
    
        override func hasConfigureSheet() -> Bool {
            return false
        }
    
        override func configureSheet() -> NSWindow? {
            return nil
        }
    
    }
    

    Target Settings



    Principal class 설정



    템플리 작성시의 Objective-C와는 다른 명명으로 Swift 파일을 작성했을 경우, Principal class 의 값을 변경할 필요가 있습니다.



    Embedded Content Contains Swift Code 설정



    Swift 파일을 실행하려면 아래와 같이 값을 Yes로 변경하십시오.



    시작



    Run에서 구현하는 화면 보호기를 ScreenSaverEngine.app에서 백그라운드로 시작할 수 있습니다.

    Scheme 설정



    Info에서 Execute에 ScreenSaverEngine.app 설정



    Arguments 설정



    Arguments의 Arguments Passed on Launch에 다음 값을 설정합니다.
  • -background
  • -module "$(EXECUTABLE_NAME)"



  • Run Script 설정



    구현하고 있는 스크린 세이버를 스크린 세이버용의 디렉토리에 카피하기 위해서 이하의 커멘드를 설정한다
  • open -W "${CODESIGNING_FOLDER_PATH}"

  • New Run Script Phase


    실행 스크립트


    Run - 실행



    Command + R로 실행하면 아래 그림과 같이 ScreenSaver 설치를 묻는 메시지가 표시되므로 그대로 Install


    설치하면 Desktop & Screen Saver 화면이 열리지만 그대로 닫으십시오.



    그러면 바탕 화면에서 화면 보호기가 움직이는 것을 확인할 수 있다고 생각합니다.

    시작하지 않으면



    시작시 디버그 메시지에
    Message from debugger: cannot attach to process due to System Integrity Protection
    

    라는 메시지가 나타나면 보호 기능이 활성화되어 있으므로 이를 비활성화합니다.

    How to Disable System Integrity Protection (rootless) in OS X El Capitan
  • 복구 모드로 부팅하고 터미널을 엽니 다
  • csrutil disable; reboot 유형

  • 결론



    iOS 개발 밖에 한 적이 없는 쪽이 다수라고 생각합니다만, OSX 개발은 iOS 개발과 같이 프레임워크가 두껍지 않다고, 구그라고 해도 기사가 나오지 않지만 상당히 즐겁습니다.

    스크린 세이버 작성의 초보중의 초보를 소개했으므로, 만일, 호평 그렇다면 추가의 실장 방법을 다른 기사로 소개하고 싶습니다.

    이번은 일단 여기까지입니다.

    좋은 웹페이지 즐겨찾기