2014-11-20 1 views
0

AppleWatch 앱에서 버튼을 눌렀을 때 내 iPhone 앱에서보기를 쉽게 업데이트 할 수 없습니다. 나는이 코드를 사용하여 버튼으로 IBAction를을 추가 한 Watchkit 확장 InterfaceController에서사과 시계를 통해 앱 콘텐츠를 쉽게 업데이트 할 수 있습니다.

// Create and share access to an NSUserDefaults object. 
mySharedDefaults = NSUserDefaults(suiteName: "group.sharedTest") 

//Add Observer  
NSUserDefaults.standardUserDefaults().addObserver(self, forKeyPath: "test", options: NSKeyValueObservingOptions.New, context: nil) 

:

아이폰 응용 프로그램의 ViewController (viewDidLoad에 내부()) :

는이 같은 NSUserDefaults 옵저버로 그것을 시도 :

mySharedDefaults!.setObject("testValue", forKey: "test") 
mySharedDefaults!.synchronize() 

하지만 버튼을 누르면 아무 일도 일어나지 않습니다. 내 iPhone ViewController 내부에서 객체를 설정하면 작동하지만 앱을 통해 업데이트되는 경우 작동하지 않습니다! 누군가 나를 도울 수 있습니까?

답변

2

질문을 올렸을 때 iOS SDK에 API가 없었기 때문에 운이 좋지 않았습니다. 3 일 전인 2014 년 12 월 10 일에 Apple은 iOS 8.2 베타 2 SDK와 함께이 작업에 중요한 두 가지 SDK를 출시했습니다.

WatchKit 프레임 워크에서

,이 방법 아이폰 OS는 백그라운드에서 응용 프로그램을 실행하고 응용 프로그램의 AppDelegate에이 두 번째 방법은 추가됩니다이 메시지

- (void)application:(UIApplication *)application handleWatchKitExtensionRequest:(NSDictionary *)userInfo reply:(void(^)(NSDictionary *replyInfo))reply. 

를 받게됩니다를 호출하여 WKInterfaceController 클래스

// Obj-C 
+ (BOOL)openParentApplication:(NSDictionary *)userInfo 
         reply:(void (^)(NSDictionary *replyInfo, 
             NSError *error))reply 

iOS SDK Beta 2 (이 질문의 측면에서) UIKit Framework, UIApplicationDelegate 클래스.

NSDictionary 및 응답 블록을 사용하여 Watch 앱 및 iOS 앱과 통신 할 수 있습니다.

당신의 WKInterfaceController 서브 클래스에서 iOS AppDelegate에 클래스 다음

- (IBAction)callPhoneAppButtonTapped 
{ 
    NSDictionary *dictionary = [[NSDictionary alloc] initWithObjectsAndKeys:@"text to display", @"key", nil]; 

    [InterfaceController openParentApplication:dictionary reply:^(NSDictionary *replyInfo, NSError *error) { 
     NSLog(@"Reply received by Watch app: %@", replyInfo); 
    }]; 
} 

과에서

- (void)application:(UIApplication *)application handleWatchKitExtensionRequest:(NSDictionary *)userInfo reply:(void (^)(NSDictionary *))reply 
{ 
    NSLog(@"Request received by iOS app"); 
    NSDictionary *dictionary = [[NSDictionary alloc] initWithObjectsAndKeys:@"your value to return to Apple Watch", @"key", nil]; 

    reply(dictionary); 
} 

당신은 애플 시계 버튼을 탭하면 iOS 시뮬레이터에서 iOS 앱 시뮬레이터 그러면 NSLog를 적절한 위치에서 볼 수 있습니다.

이 솔루션은 시계 및 iOS 응용 프로그램 사이의 물체를 운반 작동합니다. 그러나 더 많은 데이터를 전송하거나 이미지, 파일 등에 액세스하려면 Shared app group을 사용해야합니다. Xcode 프로젝트 파일의 기능에서 공유 응용 프로그램 그룹을 설정합니다. containerURLForSecurityApplicationGroupIdentifier (NSFileManager 클래스)을 사용하면 공유 그룹의 파일에 URL을 가져올 수 있습니다.

NSUserDefaults에서 선호도 initWithSuiteName을 공유하고 싶다면 무엇을 찾고 계십니까?

+0

매우 흥미로운 업데이트 정보에 감사드립니다 !! 나는 이것을 최대한 빨리 시도 할 것이다! 유감스럽게도 나는 아직 답변을 포기하지 못한 채 충분한 평판을 얻지 못했습니다! 죄송 해요! – iVentis

+0

쿨, 문제 없음 :) 그것은 당신을 위해 일 했나요? – lvp

+1

아직 테스트 할 시간이 없었습니다! 내가 시간을 알면 곧 알려줄거야;) – iVentis

0

WatchKit 확장 응용 프로그램과 iPhone 응용 프로그램이 서로 다른 응용 프로그램 인스턴스로 실행되고 있다고 가정합니다. 알림은 동일한 인스턴스 내에 있습니다.

다른 방법으로는 iPhone 응용 프로그램의 특정 스레드에 새로운 작업을 추가하여 특정 키의 변경 사항을 정기적으로 확인하고 변경 사항을 감지 한 경우 알림을 생성 할 수 있습니다.

+0

작업을 수행 할 필요가 없다고 생각합니다. 확장 프로그램에서 현지 알림을 게시하지 않는 이유는 무엇입니까? iPhone 앱은 알림을 수신하고 작업을 계속할 수 있습니다. 알림 센터에서 알림을 제거한 후 알림 센터에서 제거해야합니다. 그렇지 않으면 사용자가 알림 센터에서 알림을 볼 수 있습니다. – sahara108

+0

iPhone 앱과 확장 프로그램 사이에 알림이있는 경우 더 쉬울 것입니다. 공통 기본 알림이 앱 전반에서 작동하지 않았기 때문에 일반적으로 알림이 작동하지 않기 때문에 나는 생각했습니다. 그러나 그들이하는 경우, 귀하의 제안은 확실히 쉽습니다. – saward

+1

@ sahara108 확장 및 호스트 응용 프로그램이 두 개의 서로 다른 프로세스이므로이 둘의 메모리 풀이 다르기 때문에 NSNotificationCenter defaultCenter가 다릅니다. – lvp

관련 문제