Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/104.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
Iphone UILocalNotification每30秒一次_Iphone_Ios_Objective C_Ios7_Uilocalnotification - Fatal编程技术网

Iphone UILocalNotification每30秒一次

Iphone UILocalNotification每30秒一次,iphone,ios,objective-c,ios7,uilocalnotification,Iphone,Ios,Objective C,Ios7,Uilocalnotification,我试图使用以下逻辑将UILocalNotification设置为每30秒运行一次,但它似乎有问题。有两个问题: 当通知被触发时,似乎有很多通知同时被触发,而不是每30秒触发一次 应用程序图标徽章编号似乎没有增加。它只是停留在1 有人能帮我找出我做错了什么吗 // Create 'base' notification we can use UILocalNotification *baseNotification = [[UILocalNotification alloc] init]; base

我试图使用以下逻辑将
UILocalNotification
设置为每30秒运行一次,但它似乎有问题。有两个问题:

  • 当通知被触发时,似乎有很多通知同时被触发,而不是每30秒触发一次
  • 应用程序图标徽章编号似乎没有增加。它只是停留在1
  • 有人能帮我找出我做错了什么吗

    // Create 'base' notification we can use
    UILocalNotification *baseNotification = [[UILocalNotification alloc] init];
    baseNotification.timeZone = [NSTimeZone defaultTimeZone];
    baseNotification.repeatInterval = NSMinuteCalendarUnit;
    baseNotification.alertBody = @"My Message.";
    baseNotification.alertAction = @"My Alert Action";
    baseNotification.soundName = UILocalNotificationDefaultSoundName;
    
    UILocalNotification *alertOne = [baseNotification copy];
    alertOne.applicationIconBadgeNumber++;
    alertOne.fireDate = [[NSDate date] dateByAddingTimeInterval:30];
    [[UIApplication sharedApplication] scheduleLocalNotification:alertOne];
    
    UILocalNotification *alertTwo = [baseNotification copy];
    alertTwo.applicationIconBadgeNumber++;
    alertTwo.fireDate = [[NSDate date] dateByAddingTimeInterval:60];
    [[UIApplication sharedApplication] scheduleLocalNotification:alertTwo];
    

    关于第二点,您增加的是副本的徽章编号,而不是原始通知。由于原始版本的徽章编号为零,因此您将始终获得一份徽章编号为零的副本,并且增加它将使其始终为1

    解决方案是在制作副本之前增加原始通知的标识:

    ...
    baseNotification.applicationIconBadgeNumber++;
    UILocalNotification *alertOne = [baseNotification copy];
    alertOne.fireDate = [[NSDate date] dateByAddingTimeInterval:30];
    [[UIApplication sharedApplication] scheduleLocalNotification:alertOne];
    
    baseNotification.applicationIconBadgeNumber++;
    UILocalNotification *alertTwo = [baseNotification copy];
    alertTwo.fireDate = [[NSDate date] dateByAddingTimeInterval:60];
    [[UIApplication sharedApplication] scheduleLocalNotification:alertTwo];
    

    根据NSObject类引用:

    copy-返回copyWithZone返回的对象:

    copyWithZone返回一个浅拷贝。 因此,所有通知都具有相同的属性。 因此,徽章编号始终为“1”,所有通知的fireDate都相同。i、 e.你申请的最后一个。 因此,通知会同时被触发

    希望有帮助。

    试试这个

    UILocalNotification *baseNotification = [[UILocalNotification alloc] init];
    baseNotification.timeZone = [NSTimeZone defaultTimeZone];
    baseNotification.repeatInterval = NSMinuteCalendarUnit;
    baseNotification.alertBody = @"My Message.";
    baseNotification.alertAction = @"My Alert Action";
    baseNotification.soundName = UILocalNotificationDefaultSoundName;
    
    UILocalNotification *alertOne = [baseNotification copy];
    alertOne.fireDate = [[NSDate date] dateByAddingTimeInterval:30];
    alertOne.applicationIconBadgeNumber = [[UIApplication sharedApplication]applicationIconBadgeNumber]+1;
    
    UILocalNotification *alertTwo = [baseNotification copy];
    alertTwo.fireDate = [[NSDate date] dateByAddingTimeInterval:60];
    alertTwo.applicationIconBadgeNumber = [[UIApplication sharedApplication]applicationIconBadgeNumber]+1;
    

    目前没有办法实现自定义的间隔重复

    但是,通知系统最多可以将64个通知排队,因此您可以做的最接近的事情是手动设置所需数量的通知(每个通知都有不同的徽章编号和不同的fireDate),然后在通知数量不足时通过设置新通知来更新通知列表

    这将返回您在队列中的通知数量:

    [[[UIApplication sharedApplication] scheduledLocalNotifications] count]
    
    我还建议您阅读以下文章,以获得进一步帮助:


    祝你好运

    我想你每30秒收到很多通知是因为你没有取消以前的通知。在代码顶部添加这一行

    [[UIApplication sharedApplication] cancelAllLocalNotifications];
    

    你说的“通知被触发时”是什么意思?您是否同时看到许多通知警报,或者多次调用方法
    application:didReceiveLocalNotification:
    ?我的意思是一次可以看到许多通知警报。您是否通过调用
    cancelAllLocalNotifications来取消所有以前计划的警报
    ?谢谢-您知道是否有方法可以复制它们,以使值不完全相同相同?为什么不创建一个新实例?据我所知,要制作深度复制,必须实现该对象的copyWithZone:,这在UILocalNotification类中不是一个解决方案。