手表上未收到 WatchKit 达尔文通知
WatchKit the Darwin Notification is not received on the watch
我正在尝试使用 iPhone 向 Watch 设备发送通知
CFNotificationCenterAddObserver
在手表上和 CFNotificationCenterPostNotification
。(我没有在 Xcode 模拟器上测试)。
这是我在 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);
});
}
这就是我在 Apple Watch 扩展应用程序上使用它的方式:
@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!"];
}
您应该使用 WatchConnectivity 将消息从 iPhone 发送到 Apple Watch。
Watch 和 iPhone 上的 API 几乎完全相同。如果您的手表应用不是 运行,或者屏幕关闭,您应该使用 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)
}
}
}
在手表上,您需要同时实现 session:DidReceiveMessage 和 session:didReceiveUserInfo。请注意,我不会费心检查手表是否可达,因为如果它不可达(或者如果它开始可达并在检查之后但在传输完成之前移出范围)那么数据仍然会在它被发送时发送回到 transferUserInfo 的范围内。
这是在 watchOS 2 上吗?正如其他人所建议的,您需要使用 WatchConnectivity。 Darwin 通知将不起作用,因为 watchOS 2 进程不再像 watchOS 1 中那样位于 phone 上。此外,WatchConnectivity 更加方便。
我正在尝试使用 iPhone 向 Watch 设备发送通知
CFNotificationCenterAddObserver
在手表上和 CFNotificationCenterPostNotification
。(我没有在 Xcode 模拟器上测试)。
这是我在 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);
});
}
这就是我在 Apple Watch 扩展应用程序上使用它的方式:
@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!"];
}
您应该使用 WatchConnectivity 将消息从 iPhone 发送到 Apple Watch。
Watch 和 iPhone 上的 API 几乎完全相同。如果您的手表应用不是 运行,或者屏幕关闭,您应该使用 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)
}
}
}
在手表上,您需要同时实现 session:DidReceiveMessage 和 session:didReceiveUserInfo。请注意,我不会费心检查手表是否可达,因为如果它不可达(或者如果它开始可达并在检查之后但在传输完成之前移出范围)那么数据仍然会在它被发送时发送回到 transferUserInfo 的范围内。
这是在 watchOS 2 上吗?正如其他人所建议的,您需要使用 WatchConnectivity。 Darwin 通知将不起作用,因为 watchOS 2 进程不再像 watchOS 1 中那样位于 phone 上。此外,WatchConnectivity 更加方便。