仅当通过 Testflight 安装时应用程序崩溃解析 JSON
Posted
技术标签:
【中文标题】仅当通过 Testflight 安装时应用程序崩溃解析 JSON【英文标题】:App crashes parsing JSON only when installed via Testflight 【发布时间】:2018-02-21 00:03:31 【问题描述】:所以我的应用程序在第一次运行时会解析 json 文件(包含在项目中)中的所有信息并将其保存到其核心数据模型中。
这通过使用 XCode 调试部署运行良好,但是当我通过 Testflight 安装应用程序时,它立即崩溃。
我已经确定它是 json 文件的解析问题,因为我创建了一个不执行此操作的构建,而是直接从 Web api 获取数据,唯一的问题是来自web api 下载所有数据大约需要一个小时,从json文件下载大约需要一分钟。
我已尝试禁用 BITCODE 并确保将方案设置为 Release,这似乎通过 Testflight 涵盖了大多数这些启动问题。两者都没有奏效。
我怀疑json文件在通过Testflight分发时没有与应用程序正确打包,但我不知道如何解决这个问题。有人有什么建议吗?
我在下面包含我的导入功能,以防错误包含在此而不是配置中。
json 文件大约 26mb,与项目中的大多数其他文件相比非常大。
我的设备是运行 ios 11.2.6 和 XCode 9.2 的 iPhone X, 该应用程序还成功地在所有模拟器上运行。 我正在使用目标 C
-(void)ImportInitialCards:(NSManagedObjectContext *) managedObjectContext
_privateManagedObjectContext = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSPrivateQueueConcurrencyType];
// Configure Managed Object Context
[_privateManagedObjectContext setParentContext:managedObjectContext];
NSString *filePath = [[NSBundle mainBundle] pathForResource:@"cardDatabase1" ofType:@"json"];
NSInputStream *inputStream = [[NSInputStream alloc] initWithFileAtPath:filePath];
[inputStream open];
NSArray *cards = [NSJSONSerialization JSONObjectWithStream:inputStream options:kNilOptions error:nil];
float percentage = 1.0 / (float) cards.count;
for (NSDictionary *card in cards)
NSString *cardParticularsJson = [card valueForKey:@"cardContent"];
NSData *cardParticularsData = [cardParticularsJson dataUsingEncoding:NSUTF8StringEncoding];
NSDictionary *cardParticulars = [NSJSONSerialization JSONObjectWithData:cardParticularsData options:NSJSONReadingMutableContainers error:nil];
NSString *cardName = [cardParticulars valueForKey:@"name"];
NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:@"Card"];
[request setPredicate:[NSPredicate predicateWithFormat:@"name == %@", cardName]];
NSError *error = nil;
NSUInteger count = [_privateManagedObjectContext countForFetchRequest:request error:&error];
if (count > 0)
NSLog(@"CardMatched: %@", cardName);
//card matched
_progress += percentage;
_currentProgressDescription = @"Scanning ...";
else
_currentProgressDescription = [NSString stringWithFormat:@"Importing: %@", cardName];
NSManagedObject *newCard = [NSEntityDescription insertNewObjectForEntityForName:@"Card" inManagedObjectContext:_privateManagedObjectContext];
[self SaveCardFrom:cardParticulars to:newCard saveThumb:NO inContext:_privateManagedObjectContext];
_progress += percentage;
dispatch_async(dispatch_get_main_queue(),^
NSError *error = nil;
[managedObjectContext save:&error];
);
【问题讨论】:
在第一次进行干净的构建并删除任何现有的应用程序安装后,在 Xcode 中测试您的应用程序。 并且您需要更新您的问题以指出导致错误的确切行并在您的问题中发布准确且完整的错误消息。 @rmaddy 抱歉,我应该提一下,它似乎没有生成崩溃报告。我正在通过设置 > 隐私 > 分析 > 分析数据进行检查。我的应用程序的唯一条目是几天前的 不是您问题的答案,但您是否考虑过发布预构建的核心数据快照? @HunaidHassan 是的,这是我最初的解决方案,但是我找不到任何关于如何做到这一点的信息! 【参考方案1】:我决定发布我的问题的解决方案,希望它可以帮助像我一样挣扎的其他人。 因此,在导入 JSON 文件时,我正在更新一个进度条以指示需要多长时间,这是在一个 while 循环中使 CPU 最大化,与 JSON 导入一起将 CPU 发送到大约 200%,这导致了应用程序关闭。
解决方案看起来真的很明显,不要让cpu超过100%
我现在计划仅在值更改时更新进度条,而不是通过 while 循环不断更新。
【讨论】:
以上是关于仅当通过 Testflight 安装时应用程序崩溃解析 JSON的主要内容,如果未能解决你的问题,请参考以下文章
Crashlytics 使 TestFlight 应用程序崩溃,但未找到任何崩溃日志