2

AppleのドキュメントによるとUILocationNotification.fireDate

指定された値が nil または過去の日付である場合、通知はすぐに配信されます。

過去の日付を使用している場合、この動作は見られません。それは私だけですか、それとも他の人もこれを見ていますか?

これが私のコードです:

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:@"PsID"];
alarm.userInfo = userInfo;
notifications = [NSArray arrayWithObject:alarm];
UIApplication *app = [UIApplication sharedApplication];
app.scheduledLocalNotifications = notifications;

time(NULL)-5 を time(NULL)+5 に変更すると、このコードが実行されてから 5 秒後に通知が届きます。-5 の値を指定すると、通知が届きません。

ここでの良い質問には、可能な明確な答えが必要であり、これは多くの「私も」の回答の対象になる可能性があることを知っています. 、またはドキュメントが言うように機能する上記のコードの別のバージョン。

これは私のアプリケーションにとって重要です。なぜなら、アラームがその日の早い時間に発生した場合でも、アラームをユーザーに通知する必要がある場合があるからです。コードを変更して現在の時刻を確認し、常にそれより数秒後の値を与えることができると思いますが、「何秒後か」が本当に安全かどうかはわかりません。できるだけ早くそれを実現したいと思います-また、「文書化された動作」を取得するためのより良い方法がある場合は、そのハックを使用しないでください。私の実際のコードは上記と似ていますが、いくつかの通知を投稿しています。一部は過去、一部は今日、一部は明日以降の可能性があります (これはカレンダー アプリケーション用です)。

4

1 に答える 1

3

@eselk、

あなたと同じ動作が見られます。UIApplication オブジェクトのプロパティを設定してインストールした場合、過去にfireDateUILocalNotificationを持つ新しく作成されたものは起動しません。scheduledLocalNotifications

ただし、UILocalNotificationUIApplication のscheduleLocalNotificationメソッドを使用して同じオブジェクトをインストールすると、すぐに起動します。

scheduleLocalNotifications のドキュメントに基づくバグのように思えます。かなり明確に次のように述べています。

...[scheduleLocalNotifications] プロパティを設定すると、UILocalNotification は、cancelLocalNotification: を呼び出してから、新しい通知ごとに scheduleLocalNotification: を呼び出して、既存のすべての通知を置き換えます。

これが当てはまらないように思われる場合、アプリケーション ロジックで過去にスケジュールされた通知をユーザーに表示する必要がある場合は、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 シミュレーターでこれをテストしました)

于 2012-11-06T01:51:34.487 に答える