如果将应用程序从iOS 9升级到iOS 10,iOS NSUserDefaults将不工作

如果将应用程序从iOS 9升级到iOS 10,iOS NSUserDefaults将不工作,ios,xcode,nsuserdefaults,code-signing-entitlements,Ios,Xcode,Nsuserdefaults,Code Signing Entitlements,我有一个应用程序在iOS 9上运行,我用Xcode 8 beta 4为iOS 10创建了一个新版本,现在在这个场景中,当我将应用程序从以前的版本(iOS 9)升级到新版本(iOS 10)时 在iPhone(ios 9或ios 10)上安装带有Xcode 7的早期版本,然后关闭应用程序,并在将升级视为新安装的同一设备上安装带有Xcode 8 beta 4的新版本,以便所有NSUserDefaults保存的值返回零 我测试了一个示例应用程序,并按照场景进行操作。在本例中,当我使用[NSUserDef

我有一个应用程序在iOS 9上运行,我用Xcode 8 beta 4为iOS 10创建了一个新版本,现在在这个场景中,当我将应用程序从以前的版本(iOS 9)升级到新版本(iOS 10)时

在iPhone(ios 9或ios 10)上安装带有Xcode 7的早期版本,然后关闭应用程序,并在将升级视为新安装的同一设备上安装带有Xcode 8 beta 4的新版本,以便所有NSUserDefaults保存的值返回零

我测试了一个示例应用程序,并按照场景进行操作。在本例中,当我使用
[NSUserDefaults standardUserDefaults]
保存和检索值时,
NSUserDefaults
没有问题,但在以下使用共享容器保存数据时出现问题的实现中,我相信“授权组”问题的根源

SDK 10可能无法识别SDK 9以前创建的共享容器!有什么想法吗?问题是,我无法通过替换
[NSUserDefaults standardUserDefaults]
而不是使用AuthenticationGroup来修复代码,因为用户当前使用的是应用程序的早期版本,而对新版本的任何更改都无法修复此问题,因为它需要在两个版本中修复

以下是代码的主要部分(由以前的开发人员编写):


我注意到sdk 10不会导致任何NSUserDefaults问题

这是项目中唯一的订购问题,在
AppDelegate
中,我正在调用
[[TrackingManager sharedTrackingManager]setIsBackground:NO]在这一行之前
[自我设置ForForForeGroundLaunch:应用程序选项:launchOptions]


虽然我通常已在
setupforforforeforgroundlaunch
函数和
TrackingManager
类的singleton中初始化了授权组,但授权组也以nil值启动,这导致了问题,我只更改了这两行的顺序,现在一切正常

如果权利文件的更改会导致此类问题。请参考以下链接


您有新的带有Xcode 8的模拟iOS 10设备,因此当您在这些设备上运行时,就好像刚刚安装了应用程序一样。是的,但实际设备也有同样的问题。如果我的手机上已经安装了ios 8或9的旧版本应用程序,然后如果我升级到使用xcode 8开发的新版本应用程序,则所有保存的NSUserDefaults值返回零。我测试它的方式是:我用xcode 7安装旧版本的应用程序,然后杀掉应用程序,在iPhone上用xcode 8安装新版本。一些以前保存的用户设置消失,并将应用程序视为新安装!它发生在所有ios 8-10设备上。我刚刚创建了一个简单的测试项目,如果NSUserDefaults值为零,则设置该值;如果存在,则打印该值。我在iOS 9.3.4设备上的Xcode 7.3下运行了它,它创建了默认值。第二次运行按预期打印默认值。然后,我在Xcode 8b3下运行了该项目,它按预期打印了默认值。感谢您的努力,因此在本例中,我认为我需要在项目中的某个地方找到导致此问题的原因。首先要检查的是捆绑Id没有更改
@implementation AppDelegate

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

    if ([[UIApplication sharedApplication] applicationState] == UIApplicationStateBackground) { 

    // background launch

} else {

    //foreground launch 

    [self setupForForegroundLaunch:application option:launchOptions];

    [[TrackingManager sharedTrackingManager] setIsBackground:NO];

}

}

@end