OGeek|极客世界-中国程序员成长平台

标题: ios - UILocationNotfication.fireDate 过去 - 错误? [打印本页]

作者: 菜鸟教程小白    时间: 2022-12-13 17:10
标题: ios - UILocationNotfication.fireDate 过去 - 错误?

根据Apple docs关于UILocationNotification.fireDate:

If the specified value is nil or is a date in the past, the notification is delivered immediately.

我在使用过去的日期时没有看到这种行为。是只有我,还是其他人也看到了?

这是我的代码:

NSMutableArray *notifications = [NSMutableArray array];
UILocalNotification* alarm = [[UILocalNotification alloc] init];
alarm.fireDate = [NSDate dateWithTimeIntervalSince1970:time(NULL)-5];
alarm.repeatInterval = 0;
alarm.soundName = @"alarm.caf";
alarm.alertBody = @"Test";
alarm.alertAction = @"Launch";
NSMutableDictionary *userInfo = [[NSMutableDictionary alloc] init];
[userInfo setValue:[NSNumber numberWithInt:10] forKey"sID"];
alarm.userInfo = userInfo;
notifications = [NSArray arrayWithObject:alarm];
UIApplication *app = [UIApplication sharedApplication];
app.scheduledLocalNotifications = notifications;

如果我将 time(NULL)-5 更改为 time(NULL)+5,我会在此代码运行 5 秒后收到通知。使用 -5 值,我永远不会收到通知。

我知道这里的好问题需要有一个可能的明确答案,这可能会受到很多“我也是”答案的影响——所以我正在寻找的是来自官方(引用/链接)的东西Apple 表示这是预期行为,或者上述代码的不同版本按文档所说的那样工作。

这对我的应用程序很重要,因为在某些情况下我需要通知用户警报,即使它发生在当天早些时候。我想我可以修改我的代码来检查当前时间并总是给出一个超出几秒的值——但我不确定“超出多少秒”是否真的安全,我希望它尽快发生——如果有更好的方法来获得“记录在案的行为”,也宁愿没有那个黑客。我的真实代码与上面类似,但我发布了几个通知,有些可能是过去的,有些可能是今天晚些时候,有些是明天或以后(这是用于日历应用程序)。



Best Answer-推荐答案


@eselk,

我看到了和你一样的行为:一个新创建的 UILocalNotification 过去有一个 fireDate 不会触发 如果它已安装通过在 UIApplication 对象上设置 scheduledLocalNotifications 属性

但是,如果使用 UIApplication 的 scheduleLocalNotification 方法安装相同的 UILocalNotification 对象,它立即触发。

在我看来这是一个基于 the documentation for scheduledLocalNotifications 的错误,其中非常清楚地表明:

...When you set [the scheduledLocalNotifications] property, UILocalNotification replaces all existing notifications by calling cancelLocalNotification: and then calling scheduleLocalNotification: for each new notification.

鉴于情况似乎并非如此,如果您的应用程序逻辑需要将过去安排的通知呈现给用户,则解决方法是调用 scheduleLocalNotification。

UILocalNotification *ln = [[UILocalNotification alloc]init];
[ln setFireDate:[NSDate dateWithTimeIntervalSinceNow:-2]]; // two seconds ago
// ...

// the following line works as expected - the notification fires immediately
[application scheduleLocalNotification:ln];  // Using this line works as expected

// using the following does NOT work as expected - the notification does not fire
//application.scheduledLocalNotifications = [NSArray arrayWithObject:ln];

(我在 iOS 6 模拟器上测试过)

关于ios - UILocationNotfication.fireDate 过去 - 错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12980584/






欢迎光临 OGeek|极客世界-中国程序员成长平台 (http://jike.in/) Powered by Discuz! X3.4