删除应用程序并再次安装后,徽章计数会保留

时间:2014-04-29 12:43:21

标签: ios objective-c cocoa-touch

我的应用程序中有一个通知部分,通知的总和以徽标计数的形式显示在应用程序图标上。当用户访问通知时,徽章计数减少。 假设用户现在卸载构建并重新安装它,即使用户没有打开应用程序,徽章计数也会直接显示在应用程序图标上。显示的徽章计数与卸载应用程序时的徽章计数相同。一旦用户打开应用程序并访问通知部分,就应该显示徽章计数。

4 个答案:

答案 0 :(得分:9)

几天前,当我从testFlight测试应用程序时,我遇到了同样的问题。

通常,当您删除应用(当它显示一些徽章编号)并再次重新安装时,可能会出现此问题。但很难说实际问题在哪里。

阅读Apple's official documentation is saying.

  

重置iOS上的推送通知权限警报第一个   时间推送启用的应用程序注册推送通知,iOS询问   用户是否希望收到该应用的通知。一旦用户   已响应此警报,除非是,否则不再显示   设备已恢复或应用程序已卸载至少一天。

     

如果您想模拟首次运行的应用,可以离开   该应用程序已卸载一天。没有你可以实现后者   实际上等一天通过设置系统时钟一天或   更多,完全关闭设备,然后关闭设备   上。

根据我的经验,有一些建议:

  • 关闭您的通知表设置
  • 在服务器端设置徽章0,然后从您的设备中删除并重新安装您的应用。 - 安装完成后再运行app
  • 运行app agin后,从设备中删除您的应用,然后在服务器1重置徽章并开启您的通知表设置

不确定,但可能会对你有用。 :)

答案 1 :(得分:8)

徽章计数由操作系统维护,与应用程序无关。卸载(删除)应用程序时,操作系统会保留一些值,包括徽章计数。卸载应用程序时,不会调用任何开发人员方法或脚本。您要么必须接受此限制,要么更改应用程序的设计以重新思考并克服此问题。

答案 2 :(得分:4)

在didFinishLaunchingWithOptions

中执行以下代码
if (![[NSUserDefaults standardUserDefaults] objectForKey:@"is_first_time"]) 
{        
 [application cancelAllLocalNotifications]; 
 // Restart the Local Notifications list
 application.applicationIconBadgeNumber = 0;
 [[NSUserDefaults standardUserDefaults] setObject:[NSNumber numberWithBool:YES] forKey:@"is_first_time"];  }

答案 3 :(得分:0)

在didFinishLaunchingWithOptions部分中运行freshInstallationCheck函数。

    func freshInstallationCheck() {
        let defaults = UserDefaults.standard
        guard let currentAppVersion = Bundle.main.object(forInfoDictionaryKey: "CFBundleShortVersionString") as? String else { return }
        guard let previousVersion = defaults.string(forKey: "appVersion") else {
            // Key does not exist in UserDefaults, must be a fresh install
            print("fresh install")
            //  Writing version to UserDefaults for the first time
            defaults.set(currentAppVersion, forKey: "appVersion")
            // reinstall application, force to set icon to zero
            UIApplication.shared.applicationIconBadgeNumber = 0
            return
        }

        let comparisonResult = currentAppVersion.compare(previousVersion, options: .numeric, range: nil, locale: nil)
        switch comparisonResult {
        case .orderedSame:
            // nothing to do
            break
        case .orderedAscending, .orderedDescending:
            // new version update or downgrade

            break
        }

        // Updating new version to UserDefaults
        defaults.set(currentAppVersion, forKey: "appVersion")
    }