18

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

在我的应用程序的最后 4 个版本更新中,有些客户遇到了一些奇怪的事情 - 该应用程序失去了对以前通知的控制,他们一直在更新之前安排所有通知,即使他们应该被取消[[UIApplication sharedApplication] cancelAllLocalNotifications]

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

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

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

怎么会这样?

更新

3年后,它仍在发生。

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

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

4

4 回答 4

2

您是否检查了UIApplication cancelAllLocalNotifications 在应用程序更新之间如何工作? 它没有明确的答案,但也许它会很有用。

试着找出体验过这种情况的客户有什么特别之处:

  • 遇到这种行为的客户总是一样吗?
  • 他们使用哪个 iOS 版本?
  • 他们如何以不同的方式使用您的应用程序?有很多通知安排吗?
  • 他们如何进行更新?(无线、同步等)
于 2012-07-12T09:11:17.053 回答
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.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;
}
于 2015-10-18T11:02:57.697 回答
0

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

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

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

于 2015-10-15T08:35:18.663 回答
-1

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

  1. 在同一设备上使用相同的应用程序但使用不同的用户名,他们会收到上次登录用户的警报。

- 实际上它的UILocalNotification行为,我们必须取消它们,否则 IOS 在删除应用程序时将它们保留至少一段时间(不确定多长时间)并且它们是由应用程序在删除时安排的并且没有被取消。

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

喜欢

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions

    if(//its a fresh install){

     [[UIApplication sharedApplication] cancelAllLocalNotifications];

    }


    }

cancelAllLocalNotifications将取消所有现有通知。

希望它会有所帮助。

于 2016-10-14T17:27:25.780 回答