仅当通过 Testflight 安装时应用崩溃解析 JSON

App crashes parsing JSON only when installed via Testflight

所以我的应用首先 运行 解析 json 文件(包含在项目中)中的所有信息并将其保存到其核心数据模型中。

这 运行 通过使用 XCode 调试部署很好,但是当我通过 Testflight 安装应用程序时,它立即崩溃。

我已经确定它是 json 文件的解析问题,因为我创建了一个不执行此操作的构建,而是直接从 Web api 获取数据,唯一的问题是从网络 api 下载所有数据大约需要一个小时,从 json 文件下载大约需要一分钟。

我已尝试禁用 BITCODE 并确保将方案设置为 Release,这似乎涵盖了大部分通过 Testflight 启动的问题。都没有用。

我怀疑 json 文件在通过 Testflight 分发时没有正确地与应用程序打包在一起,但我不知道如何解决这个问题。有人有什么建议吗?

我在下面包含了我的导入函数,以防错误包含在其中而不是配置中。

json 文件大约为 26mb,与项目中的大多数其他文件相比非常大。

我的设备是 iPhone X 运行ning iOS 11.2.6 和 XCode 9.2, 该应用程序还在所有模拟器上成功 运行s。 我正在使用 Objective 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];
            } );
        }
    }
}

我决定 post 我的问题的解决方案,希望它能帮助像我一样挣扎的其他人。 因此,在导入 JSON 文件时,我正在更新一个进度条以指示需要多长时间,这是在一个 while 循环中,它与 CPU 一起达到了最大值 JSON import 将 CPU 发送到大约 200%,导致应用程序关闭。

解决方案似乎很明显,不要让 cpu 超过 100%

我现在计划只在值更改时更新进度条,而不是通过 while 循环不断更新。