iOS CloudKit在-fetchUserRecordIDWithCompletionHandler的完成块上崩溃:

 涅槃重生武哥 发布于 2022-12-25 09:43

我正在为CloudKit编写初始化方法.我在获取用户ID /帐户状态时遇到的问题.

我在打电话[[CKContainer defaultContainer] fetchUserRecordIDWithCompletionHandler:].

它稍后崩溃,调试器将我指向"Queue:com.apple.cloudkit.operation.callback(serial)queue"线程.

此方法是唯一具有应该执行的回调的CloudKit相关方法.

这是方法本身:

[[CKContainer defaultContainer] fetchUserRecordIDWithCompletionHandler:^(CKRecordID *recordID, NSError *error) {
    NSLog(@"CLOUDKIT Fetching User Record ID");

    if (error) {
        NSLog(@"[%@] Error loading CloudKit user: %@", self.class, error);
    }

    if (recordID) {
        NSLog(@"CLOUDKIT Found User Record ID: %@", recordID.recordName);

        // If there is a record ID we check for account status
        [[CKContainer defaultContainer] accountStatusWithCompletionHandler:^(CKAccountStatus accountStatus, NSError *error) {
            NSLog(@"CLOUDKIT Finding Account Status");

            if (error) {
                NSLog(@"[%@] Error checking CloudKit availability: %@", self.class, error);
            }

            if (accountStatus == CKAccountStatusAvailable) {
                NSLog(@"CLOUDKIT Account Available, beginning initial sync");
                // We have an available account. If we have a new user do a complete sync
                NSString *userRecordID = [[NSUserDefaults standardUserDefaults] stringForKey:CLOUD_KIT_CURRENT_USER_ID_USER_DEFAULT];
                if (userRecordID == nil || ![recordID.recordName isEqualToString:userRecordID]){
                    [self syncAllData];
                } else {
                    // If there haven't been any updates, just sync as usual
                    [self syncChanges];
                }

                // Subscribe to zone updates
                [self subscribeToDefaultZoneUpdates];
            } else {
                NSLog(@"[%@] Cloudkit account is either unavailable or restricted", self.class);
            }
        }];
    } else {
        NSLog(@"[%@] CloudKit user Record ID not found", self.class);
    }
}];

在此之前和之后都有正在执行的NSLog,但最顶层的NSLog("CLOUDKIT获取用户记录ID")永远不会被执行.

当它崩溃时,日志不会给我任何信息.这是来自Xcode的线程队列:

在此输入图像描述

这是它在调试导航器中实际吐出的内容.

libsystem_kernel.dylib`__pthread_kill:
0x332f7df4:  mov    r12, #0x148
0x332f7df8:  svc    #0x80
0x332f7dfc:  blo    0x332f7e14                ; __pthread_kill + 32
0x332f7e00:  ldr    r12, [pc, #4]             ; __pthread_kill + 24
0x332f7e04:  ldr    r12, [pc, r12]
0x332f7e08:  b      0x332f7e10                ; __pthread_kill + 28
0x332f7e0c:  rsbeq  lr, r6, #0x80000001
0x332f7e10:  bx     r12
0x332f7e14:  bx     lr

具体而言,它正在突破 0x332f7dfc: blo 0x332f7e14 ; __pthread_kill + 32

撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有