Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ms-access/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 从WatchKit触发UILocalNotification_Ios_Swift_Uilocalnotification_Watchkit_Apple Watch - Fatal编程技术网

Ios 从WatchKit触发UILocalNotification

Ios 从WatchKit触发UILocalNotification,ios,swift,uilocalnotification,watchkit,apple-watch,Ios,Swift,Uilocalnotification,Watchkit,Apple Watch,我在Swift中有一个Xcode项目,目标如下: iOS应用程序 WatchKit扩展/WatchKit应用程序 “通用”项目,由“主”项目和扩展使用 在公共项目中,我有以下代码: public class func scheduleNotification(seconds: Int) { var notification = UILocalNotification() notification.fireDate = NSDate().dateByAddingTimeInterval

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

  • iOS应用程序
  • WatchKit扩展/WatchKit应用程序
  • “通用”项目,由“主”项目和扩展使用
在公共项目中,我有以下代码:

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扩展执行的相同代码不会触发任何通知。调用了该方法,但iPhone或Apple Watch上没有发生任何事情,也没有触发任何通知

有人能帮我吗


如何从WatchKit扩展逻辑安排通知?

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


我建议您使用类似于openParentApplication:reply:的方法在后台打开主机iOS应用程序,并从那里安排通知时间。

我想您还没有真正的设备,但正在使用模拟器?那么您可能根本无法向手表发送通知。这是因为苹果还没有将这项功能添加到XCode中

要在watch simulator上查看和测试通知界面,请使用此处所述的有效负载文件(“指定测试的通知有效负载”):


对即将发生的变化/不再有太多信心。正如Watch文档中所述,iOS将自行决定将您的通知发送到何处(当您最终发送到硬件版本时…

首先从
WatchKit运行
iOS
应用程序:

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;
}

谢谢你的快速回答!我拥有真正的设备,并且我能够通过使用openParentApplication:reply:按照@bgilhamOh的建议安排通知。好的,这很有趣!我似乎有点过时了,因为我还在等手表。。但是你也能显式地向手表发出通知吗?我引用苹果手表应用程序的话:当你戴着苹果手表并且它被解锁时,通知警报会出现在苹果手表上。如果你正在积极使用iPhone,你的Apple Watch上也不会出现警报。所以基本上你可以安排一个通知,然后,根据你是否使用手机,它会出现在手机或手表上。好吧,这就是我的想法。我知道我一开始有点误解了你的问题,我以为你是想在手表上安排通知,而不是在手表上。抱歉,仅供参考…要在手表硬件上测试通知,请在Apple Watch Companion应用程序的常规设置中关闭腕部检测。谢谢,超级快速回答!;)但是,你如何获得本地通知显示在手表上,因为我希望它显示在手机不在附近的情况下。那么,我需要对Guido的代码做哪些修改才能使它以这种方式工作呢?提前谢谢!