从 WatchKit 触发 UILocalNotification
Trigger UILocalNotification from WatchKit
我在 Swift 中有一个 Xcode 项目,目标如下:
- iOS 应用
- WatchKit 扩展/WatchKit 应用程序
- "Common" 项目,由 "main" 项目和扩展
使用
在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;
}
我在 Swift 中有一个 Xcode 项目,目标如下:
- iOS 应用
- WatchKit 扩展/WatchKit 应用程序
- "Common" 项目,由 "main" 项目和扩展 使用
在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;
}