从App Store更新后,应用程序失去了对本地通知的控制权

时间:2012-07-04 04:04:21

标签: ios uilocalnotification

我在App Store有一个带有本地通知的应用程序。

在我的应用程序的最后4个版本更新中,有些客户遇到了一些奇怪的事情 - 该应用程序失去了对之前通知的控制权,他们在更新之前不断收到所有通知,即使它们应该被{{取消1}}!

在与这些客户沟通时,我告诉他们关闭提醒功能[[UIApplication sharedApplication] cancelAllLocalNotifications],但他们声称会继续收到提醒。

此外,重新安装应用程序并没有摆脱旧的通知!就像iOS认为这是一个不同的应用程序一样。

我的大多数客户都没有这种情况,只有极少数客户 - 但是,每次更新都会发生这种情况!

怎么可能?

更新

3年后,它仍然在发生。

一些客户不断接收本地通知的每次更新,但应用程序无法看到这些,也无法控制它们。

任何人都可以解决此问题或证明它是iOS的错误吗?

4 个答案:

答案 0 :(得分:2)

您检查过How does UIApplication cancelAllLocalNotifications work between app updates? 它没有明确的答案,但可能会有用。

尝试找出体验这一点的客户有什么特别之处:

  • 是否始终是遇到此行为的客户?
  • 他们使用哪个iOS版本?
  • 他们如何以不同方式使用您的应用?是否安排了很多通知?
  • 他们如何进行更新? (无线,同步等)

答案 1 :(得分:1)

我有类似的通知问题。我实际删除的解决方案是设置一个特定的日期,只通知一次。 applicationIconBadgeNumber = 0行从通知列表中删除通知。徽章编号仅在用户输入应用程序时设置。对于用户没有看到该消息的情况,您只需在applicationWillEnterForeground中添加一个检查并显示一个与通知相同的消息的正确UIAlertView,您可以使用notificationArray以类似的方式获取最后一个通知。当您需要设置新通知时,#34; isNotified"需要setValue:@" 0"并同步。当我使用多个通知时,我保存了这样的状态:

[userDefaults setValue:@"1" forKey:[NSString stringWithFormat:@"notification-%@", @"12"]];
NSInteger number = [[userDefaults objectForKey:[NSString stringWithFormat:@"notification-%@", @"12"]] integerValue];

在MainViewController.m中

NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];
NSInteger alreadyNotified = [[userDefaults objectForKey:@"isNotified"] integerValue];

if (alreadyNotified == 0) {

    NSInteger seconds = 60;
    NSString *message = @"Just testing!";

    UILocalNotification *notification = [[UILocalNotification alloc] init];

    UIUserNotificationSettings *currentSettings = [[UIApplication sharedApplication] currentUserNotificationSettings];
    BOOL allowNotif = (currentSettings.types != UIUserNotificationTypeNone);
    BOOL allowsSound = (currentSettings.types & UIUserNotificationTypeSound) != 0;
    BOOL allowsBadge = (currentSettings.types & UIUserNotificationTypeBadge) != 0;
    BOOL allowsAlert = (currentSettings.types & UIUserNotificationTypeAlert) != 0;

    if (notification)
    {
        if (allowNotif)
        {
            NSDate *now = [NSDate date];
            if (seconds > 0) {
                now = [now dateByAddingTimeInterval:seconds];
            }
            notification.fireDate = now;
            notification.timeZone = [NSTimeZone timeZoneWithName:@"UTC"];
            notification.repeatInterval = 0;
            NSDictionary *userInfo = [NSDictionary dictionaryWithObjectsAndKeys:@"1", @"id", message, @"message", nil];
            notification.userInfo = userInfo;
        }
        if (allowsAlert)
        {
            notification.alertBody = message;
        }
        if (allowsBadge)
        {
            notification.applicationIconBadgeNumber = 1;
        }
        if (allowsSound)
        {
            notification.soundName = UILocalNotificationDefaultSoundName;
        }

        [[UIApplication sharedApplication] scheduleLocalNotification:notification];

        NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];
        [userDefaults setValue:@"1" forKey:@"isNotified"];
        [userDefaults synchronize];
    }

} else {

    UIApplication *app = [UIApplication sharedApplication];
    NSArray *notificationArray = [app scheduledLocalNotifications];
    for (int i=0; i<[notificationArray count]; i++)
    {
        UILocalNotification *notification = [notificationArray objectAtIndex:i];
        [app cancelLocalNotification:notification];
    }
}

在AppDelegate.m中

- (void)applicationWillEnterForeground:(UIApplication *)application {
   application.applicationIconBadgeNumber = 0;
}

答案 2 :(得分:0)

将以下代码添加到您的应用程序:didFinishLaunchingWithOptions:方法以清除所有通知。

 [[UIApplication sharedApplication] setApplicationIconBadgeNumber: 1];
 [[UIApplication sharedApplication] setApplicationIconBadgeNumber: 0];
 [[UIApplication sharedApplication] cancelAllLocalNotifications];

完成后,您可以添加新通知。

答案 3 :(得分:-1)

嘿,这也是我的应用程序也发生的事情。我的本地通知在以下场景中被解雇:
1.用户已删除该应用

  1. 在同一设备上使用相同的应用程序,但使用不同的用户名,他们会收到上次登录用户的提醒。
  2. - 实际上它的UILocalNotification行为,我们必须取消它们,否则IOS保留它们至少一段时间(不确定多久)何时删除应用程序并且应用程序在删除时安排它们并且不是取消。

    因此,请始终确保您的应用安装何时发生,请检查&amp;取消所有预定的通知。

    喜欢

    - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
    
        if(//its a fresh install){
    
         [[UIApplication sharedApplication] cancelAllLocalNotifications];
    
        }
    
    
        }
    

    cancelAllLocalNotifications将取消所有现有通知。

    希望它会有所帮助。