从 WatchKit 触发 UILocalNotification

Trigger UILocalNotification from WatchKit

我在 Swift 中有一个 Xcode 项目,目标如下:

在common项目中我有如下代码:

public class func scheduleNotification(seconds: Int) {
  var notification = UILocalNotification()
  notification.fireDate = NSDate().dateByAddingTimeInterval(NSTimeInterval(seconds))

  notification.alertBody = "item"
  notification.alertAction = "open"
  notification.soundName = UILocalNotificationDefaultSoundName
  notification.userInfo = ["UUID": "XX", ]
  notification.category = "CATEGORY"
  UIApplication.sharedApplication().scheduleLocalNotification(notification)
}

我可以调用此方法并从 iOS 应用程序发出通知:

@IBAction func XXX(sender: AnyObject) {
  NotificationHelper.scheduleNotification(100)
}

但是从 WatchKit Extension 执行的相同代码不会触发任何通知。该方法已调用,但 iPhone 或 Apple Watch 上没有任何反应,没有触发任何通知。

有人可以帮助我吗?

如何安排来自 WatchKit 扩展逻辑的通知?

不允许应用程序扩展访问sharedApplication。我猜 sharedApplication 在你的情况下返回 nil,这可以解释为什么没有安排通知。

我建议使用 openParentApplication:reply: 之类的东西在后台打开主机 iOS 应用程序并从那里安排通知。

我想你还没有真正的设备,但正在使用模拟器?那么您可能根本无法向 Watch 发送通知。这是因为 Apple 尚未(尚未)将此功能添加到 XCode。

要在手表模拟器上查看和测试您的通知界面,请使用此处所述的负载文件(第 "Specifying a Notification Payload for Testing" 段): https://developer.apple.com/library/ios/documentation/General/Conceptual/WatchKitProgrammingGuide/ConfiguringYourXcodeProject.html

并且对即将到来的变化没有太大信心soon/anymore。正如 Watch 文档中某处所描述的那样,无论如何,iOS 将自行决定将通知发送到何处(当您最终发布硬件版本时...)

首先 运行 iOS 应用来自 WatchKit 应用:

NSDictionary *userInfo = @{@"text":@"Hello world!",
                           @"delay":@10.0};
[WKInterfaceController openParentApplication:userInfo reply:^(NSDictionary *replyInfo, NSError *error) {
    // Completion
}];

然后在 iOS 设备上处理:

- (void)application:(UIApplication *)application handleWatchKitExtensionRequest:(NSDictionary *)userInfo reply:(void (^)(NSDictionary *))reply
{
    UIBackgroundTaskIdentifier tid = [application beginBackgroundTaskWithExpirationHandler:nil];

    UILocalNotification *note = [[UILocalNotification alloc] init];
    note.alertBody = userInfo[@"text"];
    note.fireDate = [NSDate dateWithTimeIntervalSinceNow:[userInfo[@"delay"] doubleValue]];
    note.timeZone = [NSTimeZone systemTimeZone];
    note.userInfo = userInfo;
    [application scheduleLocalNotification:note];

    reply(nil); // Completion callback
    [application endBackgroundTask:tid];
}

当然不要忘记注册 iOS 通知应用程序:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    [application registerUserNotificationSettings:[UIUserNotificationSettings settingsForTypes:(UIUserNotificationTypeAlert) categories:nil]];
    return YES;
}