2016-02-02 3 views
0

Я пытаюсь отправить уведомление от моего iPhone к устройству Watch, используя CFNotificationCenterAddObserver на часы и CFNotificationCenterPostNotification. (Я НЕ тестирование на Xcode тренажере).WatchKit Уведомление Дарвин не получил на часы

Это мой код в приложение IOS:

#include <CoreFoundation/CoreFoundation.h> 
... 
- (void)sendLogOutNotificationToWatch{ 
    dispatch_async(dispatch_get_main_queue(), ^{ 
     CFNotificationCenterPostNotification(CFNotificationCenterGetDarwinNotifyCenter(), CFSTR("NOTIFICATION_TO_WATCH"), (__bridge const void *)(self), nil, TRUE); 
    }); 
} 

И это, как я использую его на приложение яблоко расширения часы:

@implementation InterfaceController 
..... 
- (void)awakeWithContext:(id)context { 

    [super awakeWithContext:context]; 
    .... 
    [self registerToNotification]; 
} 

- (void)registerToNotification 
{ 
    [[NSNotificationCenter defaultCenter] removeObserver:self name:@com.test.app" object:nil]; 
    CFNotificationCenterRemoveObserver(CFNotificationCenterGetDarwinNotifyCenter(), (__bridge const void *)(self), CFSTR("NOTIFICATION_TO_WATCH"), NULL); 

    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(userLoggedOut) name:@"com.test.app" object:nil]; 
    CFNotificationCenterAddObserver(CFNotificationCenterGetDarwinNotifyCenter(), (__bridge const void *)(self), didReceivedDarwinNotification, CFSTR("NOTIFICATION_TO_WATCH"), NULL, CFNotificationSuspensionBehaviorDrop); 

} 

void didReceivedDarwinNotification() 
{ 
    [[NSNotificationCenter defaultCenter] postNotificationName:@"com.test.app" object:nil]; 
} 


- (void)didDeactivate { 
    [super didDeactivate]; 

    [[NSNotificationCenter defaultCenter] removeObserver:self name:@"com.test.app" object:nil]; 
    CFNotificationCenterRemoveObserver(CFNotificationCenterGetDarwinNotifyCenter(), (__bridge const void *)(self), CFSTR("NOTIFICATION_TO_WATCH"), NULL); 
    [[NSNotificationCenter defaultCenter] removeObserver:self]; 

} 
- (void)userLoggedOut{ 
    [self showAlertViewwithTitle:@"Notice" andMessage:@"User logged out on iPhone device!"]; 
} 
+1

Вы не можете использовать центр уведомлений darwin для отправки сообщений в watchos2, используя фреймворк 'WatchConnectivity' – dan

+0

, который уже использует его для отправки сообщений с часов на iPhone, но как я могу использовать его наоборот? –

ответ

1

Вы должны использовать WatchConnectivity, чтобы отправить сообщение от iPhone для Apple Watch.

API практически идентичны как на Watch, так и на iPhone. Если ваше приложение просмотра не работает или экран выключен, вы должны использовать transferUserInfo. Если ваше приложение часов запущено и экран включен, вы можете использовать sendMessage. Я обычно обернуть эти вызовы, пытаясь использовать SendMessage первый, и если она не использовать transferUserInfo:

// On the iPhone 
func trySendMessage(message: [String : AnyObject]) { 
    if self.session != nil && self.session.paired && self.session.watchAppInstalled { 
     self.session.sendMessage(message, replyHandler: nil) { (error) -> Void in 
      // If the message failed to send, queue it up for future transfer 
      self.session.transferUserInfo(message) 
     } 
    } 
} 

На часах вам необходимо будет осуществить как сеанс: DidReceiveMessage и сессии: didReceiveUserInfo. Обратите внимание, что я не потрудился проверить, достижимо ли часы, потому что, если это не так (или если он начнет достигать цели и выходит за пределы диапазона после проверки, но до завершения передачи), данные будут по-прежнему отправляться, когда это обратно в диапазоне от transferUserInfo.

1

Это на watchOS 2? Как и другие, вам необходимо использовать WatchConnectivity. Уведомление Дарвина не будет работать, так как процесс watchOS 2 больше не сидит на телефоне, как это было в watchOS 1. Кроме того, WatchConnectivity намного удобнее.

Смежные вопросы