2012-07-04 61 views
18

我在App Store中有本地通知的应用程序。从App Store更新后,应用程序失去对本地通知的控制

在我的应用程序的最近4个版本更新中,有些客户遇到了一些奇怪的事情 - 应用程序失去了对以前通知的控制权,他们不断收到更新前的所有通知,即使它们应该被[[UIApplication sharedApplication] cancelAllLocalNotifications]

在与这些客户进行沟通时,我告诉他们关闭提醒,执行cancelAllLocalNotifications,但他们声称会不断收到提醒。

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

这不会发生在我的大部分客户身上,只有极少数人 - 但仍然会发生每一次更新!

这怎么可能?

更新

在3年后,它仍然发生。

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

任何人都可以解决这个问题或证明它是一个iOS的bug?

+0

他们不能只是删除并重新安装应用程序?显然有些奇怪的事情已经发生。所以最好再次开始。也许它是苹果公司7月4日更新错误的一部分? –

+0

“重新安装应用程序不会摆脱旧的通知”,其中一些尝试。这与4月7日无关,因为它也发生在前两次更新中。 – Kof

+0

顺便说一句 - 我已经打开了一张苹果票,他们无法找到原因。 – Kof

回答

2

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

尝试找出有什么特殊之处,遇到这种顾客:

  • 是否总是谁遇到这种情况同客户?
  • 他们使用哪个iOS版本?
  • 他们如何以不同的方式使用您的应用程序?预定了很多通知?
  • 他们如何进行更新? (空中下载,同步等)
+0

1.不一样的客户,每次都不一样。我会与他们核对。 3.所有客户都有相同数量的预定通知。我会检查。 – Kof

+0

不是答案,也没有解决我的问题,但我必须给予某人赏金奖励。 – Kof

0

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

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

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

+0

这已经发生,并没有帮助。 – Kof

1

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

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

在MainViewController中。米

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; 
} 
+0

这种方法在读取它们后直接删除所有通知,因此在应用程序更新后它不应触发旧通知。至少它不会在我的应用程序中这样做。我刚刚尝试重新安装,只显示了新的(先前未显示的)计划通知。 –

-1

嘿,这是什么也与我的应用程序发生为好。我的本地通知解雇下面scenerios:
1.用户已删除该应用程序

  • 在同一台设备,但不同的用户名使用相同的应用程序,他们得到警报上次登录在用户中。
  • -Actually其UILocalNotification的行为,我们不得不取消他们别的IOS留住他们至少一段时间(不知过了多久),当应用程序被删除,他们通过在删除时间的应用程序安排,并没有取消。

    因此,一定要确保您的应用程序安装发生时,保持检查&取消所有计划的通知。

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

    cancelAllLocalNotifications将取消现有的所有通知。

    希望它会有所帮助。

    +0

    不正常,如前所述,'cancelAllLocalNotifications'已被多次调用,并没有停止旧的通知。 – Kof

    相关问题