[watch OS 1] WatchKit의 초기 화면을 동적으로 바꾸는 방법

7952 단어 XcodeSwiftWatchKitiOS

watch OS 1 전용


워치 OS 1을 위한 거라고 적혀있어요.watch OS 2의 경우 WKExtensionDelegate라는 레벨이 있어 거기서 처리할 수 있음(미검증)

AppleWatch에 AppDelegate가 없습니다.


워치키트로 화면을 만들면 이렇게 되는 느낌(Glance와 Notification은 옵션이 아닐 때도 있다).

사용자의 상태에 따라 WatchApp에 표시된 화면을 전환하려는 경우도 있다.사용자가 로그인한 경우 이력을 표시하고 로그인하지 않은 경우 로그인 페이지를 표시합니다.
아이폰이라면 앱 딜리게이트 등 교묘한 처리를 통해 디스플레이를 전환할 수 있지만, 애플워치에 앱 딜리게이트가 없어 아쉽게도 스토리보드에 설치is Initial ControllerWKInterfaceController가 최초 호칭이다.

디렉터의 역할을 동적으로 변경할 WKINterfaceController 준비


처음에는 이 문제를 어떻게 해결해야 할지 몰라서'정말 구제불능의 Framework구나'라고 생각했다.WKInterfaceController 만약에 내가 앱 Delegate와 비슷한 역할을 한다면 해결할 수 있을 것 같다.WKInterfaceController클래스 방법은 첫 번째 파라미터에서Storyboard를 통해 설정된 각 컨트롤러의identifier의 배열을 통해 두 번째 파라미터reloadRootControllersWithNames에서 각 컨트롤러의 데이터를 전달한다.

class func reloadRootControllersWithNames(_ names: [AnyObject],
                                 contexts contexts: [AnyObject]?)

이 방법을 이용하면 뿌리 컨트롤러에서 모두 교체되어 사용자의 상태에 따라 서로 다른 화면 구성을 제공할 수 있기 때문이다.

견본


다음은 contexts를 initial Controller, iOS 8로 설정합니다.아이폰 2개부터 미리 설치된 애플워치 앱에 추가 설정 항목(Settings Bundle을 아이폰 앱의 목표에 추가하고 설정 항목을 완료하면 OK)을 적용한다.
Settings Bundle의 설정은 이런 느낌입니다(맨 아래 칸은 공백입니다. App Groups의 설정1을 잊지 마세요.

아이폰 측의 애플워치 앱에는 이렇게 나와 있다.


아이폰의 애플워치 앱이 설정한 항목EntryPointInterfaceController에서 읽고 워치앱 화면을 전환하는 샘플 코드가 여기에 있다.
class EntryPointInterfaceController: WKInterfaceController {

    override func awakeWithContext(context: AnyObject?) {
        super.awakeWithContext(context)

        let defaults: NSUserDefaults = NSUserDefaults(suiteName: "/* AppGroupsのidentifierを入れてください */")!
        let typeString: NSString? = defaults.valueForKey("screen") as? NSString

        if let type = typeString {

            if type.isEqualToString("login-screen") {
                WKInterfaceController.reloadRootControllersWithNames(["login"], contexts: nil)
            } else {
                WKInterfaceController.reloadRootControllersWithNames(["userInfo"], contexts: nil)
            }

        } else {
                WKInterfaceController.reloadRootControllersWithNames(["login"], contexts: nil)
        }

    }

    override func willActivate() {
        // This method is called when watch view controller is about to be visible to user
        super.willActivate()
    }

    override func didDeactivate() {
        // This method is called when watch view controller is no longer visible
        super.didDeactivate()
    }
}
또한 이NSUserDefaultsEntryPointInterfaceController 방법에서 루트 컨트롤러를 전환하는 처리를 하기 때문에 화면에 나타나지 않는다.
뭘 보여주고 싶으면 awakeWithContext 방법 안에서 NSTimerwillActivate() 방법을 부르는 데 조금만 시간을 들이면 될 것 같아요.
이 밖에도 최선의 실천 방법과 애플이 제창한 방법을 총결해 애플워치를 개발 중인 사람을 만나보세요.
Apple Watch 개발의 모범 사례 요약 ~ Watchi Development Tips

총결산


아직 실기 테스트가 이뤄지지 않아 움직임이 뚜렷하지 않은 힘든 곳이지만 애플은 개발 과정에서 부족한 부분을 교묘하게 보완해 자연스러워 보일 방법을 강구할 필요가 있다.
배터리 문제가 여러분의 발목을 잡고 여러 가지 제약이 있을 것 같아서 앞으로 이런 고공을 들이지 않아도 될 것 같지만, 새로운 장비를 개발하는 앱의 즐거움은 바로 이런 곳에 있지 않을까 생각합니다. 즐겁게 개발하고 있습니다.
개발자마다 각양각색의 노력을 거치기 때문에 발매 전까지 얼마나 많은 앱에 대응할 수 있을지 기대된다.
WatchApp은 아이폰 애플리케이션의 Extension이므로 App Groups를 설정해야 합니다.물론 Settings BundlereloadRootControllersWithNames을 생성할 때도 App Groups 설정을 잊지 마십시오. 

좋은 웹페이지 즐겨찾기