0

私は、1 日に 5 回の祈りの時間を提供するイスラム教の PrayerTimes アプリに取り組んでいます。したがって、今の目標は、特定の祈りの時間に毎日 5 回の通知をユーザーに配信することです。次に、祈りごとに 5 つの通知を作成し、通知ごとに 5 つの発火日を割り当て、通知を配信することができます。

ただし、私の問題は、アプリを実行するか、アプリを再起動するたびに、通知センターに通知が表示されることです。コンソール領域では、古い通知もすべて配信されていることがわかります (application:didReceiveLocalNotification: メソッドを上書きしました)。

率直に言って、私は経験豊富な開発者ではありません。本当にこれを理解できませんでした。コードが非常に長いと思いました。それで、誰かが私を助けて、どうすればこれを行うことができるか教えてもらえますか? :) (私の英語はそれほど上手ではありません。寛容になってください)。お知らせするために他の歌を逃した場合は、教えてください。

これが私のコードです。

編集:viewDidLoadからこのメソッドを呼び出します。

アレイブローで5回取得しました:

 NSSArray *timeArray = @[time0,time1,time2,time3,time4];

次のように 5 つの UILocalNotification をスケジュールしました。

   if (localNotification0 != nil) {
    [[UIApplication sharedApplication] cancelLocalNotification:localNotification0];
}
NSDate *date0 = [_timeArray objectAtIndex:0];
NSLog(@"date %@",date0);
localNotification0 = [[UILocalNotification alloc] init];
localNotification0.fireDate = date0;
localNotification0.timeZone =[NSTimeZone defaultTimeZone];
NSLog(@"firedate %@",localNotification0.timeZone);
localNotification0.alertBody = @"Se";
localNotification0.soundName = _adhanName;
[[UIApplication sharedApplication] scheduleLocalNotification:localNotification0];


if (localNotification1 != nil) {
    [[UIApplication sharedApplication] cancelLocalNotification:localNotification1];
}
NSDate *date1 = [_timeArray objectAtIndex:1];
localNotification1 = [[UILocalNotification alloc] init];
localNotification1.fireDate = date1;
NSLog(@"firedate %@",localNotification1.fireDate);
localNotification1.timeZone =[NSTimeZone defaultTimeZone];
localNotification1.alertBody = @"Se";
localNotification1.soundName = _adhanName;
[[UIApplication sharedApplication] scheduleLocalNotification:localNotification1];
[localNotification1 release];

if (localNotification2 != nil) {
    [[UIApplication sharedApplication] cancelLocalNotification:localNotification2];
}
NSDate *date2 = [_timeArray objectAtIndex:2];
localNotification2 = [[UILocalNotification alloc] init];
localNotification2.fireDate = date2;
localNotification2.timeZone =[NSTimeZone defaultTimeZone];
NSLog(@"firedate %@",localNotification2.fireDate);

localNotification2.alertBody = @"Se";
localNotification2.soundName = _adhanName;
[[UIApplication sharedApplication] scheduleLocalNotification:localNotification2];
[localNotification2 release];


if (localNotification3 != nil) {
    [[UIApplication sharedApplication] cancelLocalNotification:localNotification3];
}
NSDate *date3 = [_timeArray objectAtIndex:3];
localNotification3 = [[UILocalNotification alloc] init];
localNotification3.fireDate = date3;
localNotification3.timeZone =[NSTimeZone defaultTimeZone];
NSLog(@"firedate %@",localNotification3.fireDate);

localNotification3.alertBody = @"Se";
localNotification3.soundName = _adhanName;
[[UIApplication sharedApplication] scheduleLocalNotification:localNotification3];
[localNotification3 release];

if (localNotification4 != nil) {
    [[UIApplication sharedApplication] cancelLocalNotification:localNotification4];
}
NSDate *date4 = [_timeArray objectAtIndex:4];
localNotification4 = [[UILocalNotification alloc] init];
localNotification4.fireDate = date4;
localNotification4.timeZone =[NSTimeZone defaultTimeZone];
NSLog(@"firedate %@",localNotification4.fireDate);

localNotification4.alertBody = @"Se";
localNotification4.soundName = _adhanName;
[[UIApplication sharedApplication] scheduleLocalNotification:localNotification4];
[localNotification4 release];

これを行うための他のより簡単な方法はありますか? 私を助けてください!

4

1 に答える 1

0

まず、次のようなループを使用してコードを短縮できるようです。

for (NSDate *time in times) {
    if (localNotification3 != nil) {
        [[UIApplication sharedApplication] cancelLocalNotification:localNotification3];
    }
    UILocalNotification *note = [[UILocalNotification alloc] init];
    note.fireDate = time;
    note.timeZone =[NSTimeZone defaultTimeZone];
    note.alertBody = @"Se";
    note.soundName = _adhanName;
    [[UIApplication sharedApplication] scheduleLocalNotification:note];
    [note release]; // no need to release note if you use ARC
}

このループは、配列内のエントリごとに 1 回実行されるため、times必要なコード量が 5 分の 1 に削減されます (この場合、または[times count]一般的に)。

アプリを実行するか、アプリを再起動するたびに、通知センターに通知が表示されます

ここで何が問題なのか完全に理解しているかどうかはわかりませんが、通知があまりにも早く表示される場合は、スケジュールされている時間を確認する必要があるようです. アプリが起動するたびに新しい通知をスケジュールし続け、通知が多すぎるという問題がある場合は、少なくとも 2 つのオプションがあります。

  • -cancelAllLocalNotifications新しい通知をスケジュールする前に使用します

  • 通知がすでにスケジュールされている時間を記録し (NSUserDefaults はそのようなことには適しています)、それらの時間に新しい通知をスケジュールしないようにします。

于 2013-07-09T23:29:22.940 に答える