应用商店部署后的错误,无法在 Ad Hoc 部署中重现

Posted

技术标签:

【中文标题】应用商店部署后的错误,无法在 Ad Hoc 部署中重现【英文标题】:Bug after app store deployment, unable to repro in Ad Hoc deployment 【发布时间】:2012-08-30 15:38:23 【问题描述】:

我的应用程序涉及用户保存我使用 NSCoding/NSKeyedArchiver 存储的数据。我在应用程序的第一次运行时向用户提供示例数据对象。

预期的行为发生在常规测试期间以及临时部署期间。不幸的是,当通过应用商店下载应用时,会发生一个重大错误。

可能还有哪些其他环境因素可以让我在常规测试中重现(然后修复)该问题?

预期行为:

新用户可以添加/编辑除当前数据对象之外的数据对象。 (经典的 CRUD 场景)。

实际行为:

如果用户的第一个操作是保存一个新对象,则之前加载的所有示例对象都会消失(难以捉摸的错误)。 但是,如果用户的第一个操作是edit,那么所有对象都会按预期保留,并且用户可以毫无问题地添加其他对象。

感谢您的帮助。

编辑

在我最近的测试中,我将 构建配置 切换为在“运行”方案中发布。

http://i.imgur.com/XNyV6.png

App Delegate,正确初始化应用

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions     
    self.dataArray = nil;
    self.dataArray = [AppDelegate getArray];
    if (self.dataArray == nil) 
        self.dataArray = [[NSMutableArray alloc] init];
    

    //First run of the app
    if (dataArray.count == 0) 
        //Add sample data to array
        //Save array
        NSString *path = [AppDelegate getDocPath];
        [NSKeyedArchiver archiveRootObject:self.dataArray toFile:path];
    


+(NSString *) getDocPath 
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
    NSString *documentsPath = [paths objectAtIndex:0];
    NSString *tempDocPath = [documentsPath stringByAppendingPathComponent:@"FilePath.dat"];
    return tempDocPath; 


+(NSMutableArray *)getArray 
    return [[NSKeyedUnarchiver unarchiveObjectWithFile:[AppDelegate getDocPath]] mutableCopy];

对象创建,如果数据尚未编辑,则删除预加载的数据

-(void)viewDidLoad 
    tempArray = nil;
    tempArray = [NSKeyedUnarchiver unarchiveObjectWithFile:[AppDelegate getDocPath]];
    if (tempArray == nil) 
        tempArray = [[NSMutableArray alloc] init];  
       


-(void)saveObject 
    [tempArray addObject:createdData];
    [tempArray sortUsingSelector:@selector(compare:)];
    NSString *path = [AppDelegate getDocPath];
    [NSKeyedArchiver archiveRootObject:tempArray toFile:path];
    AppDelegate *dg = (AppDelegate *)[[UIApplication sharedApplication] delegate];
    dg.dataArray = tempArray;

【问题讨论】:

你能分享添加和编辑任务的代码吗?两者在与文件系统交互的方式上肯定有所不同。仅举一个例子,add 方法可能会创建一个与包含示例文件的目录同名的文件。 你有哪些环境设置?调试、发布、ifdef 的... 添加了一些方案设置的代码和截图。知道为什么他们会阻止该错误被复制吗? 是否有任何预处理器宏会在您的应用启动时改变流程(或目标服务器)? 【参考方案1】:

我不确定如何解决您当前的问题(不查看代码),但您可以在未来避免它:

确保您提交到应用商店的构建版本是您经过质量检查的临时构建版本,但使用应用商店配置文件签名。

两个优点: 1)您应该能够在 adhoc 和 appstore 构建中重现相同的错误 2)这两者的dSym是相同的。因此,您无需等待获取 AppStore 崩溃日志即可深入了解发生了什么。

【讨论】:

感谢 calvinBhai。是的,在组织者中,我 AdHoc 分发了我最初提交给应用商店的相同存档。遗憾的是,这并没有什么不同。【参考方案2】:

我猜在保存新对象时,您并没有将其附加到现有数据中。您可能正在覆盖先前创建的文件。您应该访问前一个文件并将新数据附加到前一个文件中。共享代码将有助于指出您哪里出错了。

编辑:替换下面的代码并检查它是否仍然显示相同的行为

-(void)viewDidLoad 
    tempArray = nil;
    tempArray = [NSKeyedUnarchiver unarchiveObjectWithFile:[AppDelegate getDocPath]mutableCopy];
    if (tempArray == nil) 
        NSLog(@"tempArray is nil"); //if tempArray doesn't get initialized by the file contents  
        tempArray = [[NSMutableArray alloc] init];

       

【讨论】:

以上是关于应用商店部署后的错误,无法在 Ad Hoc 部署中重现的主要内容,如果未能解决你的问题,请参考以下文章

iOS 应用的离线 Ad-Hoc 部署

应用商店 Ad Hoc 配置文件无 beta 权利

如何部署ad-hoc分发(ipa文件)或如何将iTunes与设备同步

记录:部署Ansible,Ansible ad-hoc应用(1

没有 iTunes 的 Ad Hoc Catalina 10.15.x 部署

通过 ad hoc (iOS) 下载错误