NSError error.code对照表

本文列举了NSURL在加载过程中可能出现的各种错误代码及其含义,包括未知错误、取消操作、URL格式错误等具体错误类型,帮助开发者了解和排查网络请求中遇到的问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

URL Loading System Error Codes

These values are returned as the error code property of an NSError object with the domain “NSURLErrorDomain”.

typedef enum
{
NSURLErrorUnknown = -1,
NSURLErrorCancelled = -999,
NSURLErrorBadURL = -1000,
NSURLErrorTimedOut = -1001,
NSURLErrorUnsupportedURL = -1002,
NSURLErrorCannotFindHost = -1003,
NSURLErrorCannotConnectToHost = -1004,
NSURLErrorDataLengthExceedsMaximum = -1103,
NSURLErrorNetworkConnectionLost = -1005,
NSURLErrorDNSLookupFailed = -1006,
NSURLErrorHTTPTooManyRedirects = -1007,
NSURLErrorResourceUnavailable = -1008,
NSURLErrorNotConnectedToInternet = -1009,
NSURLErrorRedirectToNonExistentLocation = -1010,
NSURLErrorBadServerResponse = -1011,
NSURLErrorUserCancelledAuthentication = -1012,
NSURLErrorUserAuthenticationRequired = -1013,
NSURLErrorZeroByteResource = -1014,
NSURLErrorCannotDecodeRawData = -1015,
NSURLErrorCannotDecodeContentData = -1016,
NSURLErrorCannotParseResponse = -1017,
NSURLErrorFileDoesNotExist = -1100,
NSURLErrorFileIsDirectory = -1101,
NSURLErrorNoPermissionsToReadFile = -1102,
NSURLErrorSecureConnectionFailed = -1200,
NSURLErrorServerCertificateHasBadDate = -1201,
NSURLErrorServerCertificateUntrusted = -1202,
NSURLErrorServerCertificateHasUnknownRoot = -1203,
NSURLErrorServerCertificateNotYetValid = -1204,
NSURLErrorClientCertificateRejected = -1205,
NSURLErrorClientCertificateRequired = -1206,
NSURLErrorCannotLoadFromNetwork = -2000,
NSURLErrorCannotCreateFile = -3000,
NSURLErrorCannotOpenFile = -3001,
NSURLErrorCannotCloseFile = -3002,
NSURLErrorCannotWriteToFile = -3003,
NSURLErrorCannotRemoveFile = -3004,
NSURLErrorCannotMoveFile = -3005,
NSURLErrorDownloadDecodingFailedMidStream = -3006,
NSURLErrorDownloadDecodingFailedToComplete = -3007
}

<think>好的,我现在需要解决用户在Objective-C中使用LAContext时遇到的崩溃问题。用户提到在无指纹功能的设备上运行这段代码会导致应用崩溃,尤其是在调用canEvaluatePolicy:error:方法时。首先,我需要回忆一下LAContext和相关生物认证API的使用方法。 首先,用户代码中使用了LAPolicyDeviceOwnerAuthenticationWithBiometrics这个策略。这个策略要求设备支持生物识别,比如Touch ID或Face ID。如果设备本身没有这些硬件,比如旧款iPhone或iPad,那么调用canEvaluatePolicy:error:可能会返回NO,并且可能设置错误信息。但为什么会崩溃呢? 可能的原因之一是,虽然用户检查了设备是否支持生物认证,但在处理错误时没有正确判断错误类型。比如,当设备不支持生物识别时,error参数会被填充具体的错误码,如LAErrorBiometryNotAvailable。如果应用没有正确处理这个错误,可能在后续代码中错误地尝试执行某些操作,导致崩溃。 另外,需要确认是否正确处理了error对象。在调用canEvaluatePolicy:error:时,必须检查返回的布尔值以及error是否存在。即使返回NO,error也可能为nil,比如当用户直接拒绝授权时。所以不能仅依赖error是否为nil来判断。 还有,可能用户在使用LAContext时没有在主线程执行。根据苹果文档,LAContext的相关方法必须在主线程调用,否则可能导致不可预知的行为,包括崩溃。 另一个可能性是设备虽然不支持生物识别,但可能支持其他形式的认证,比如设备密码。但用户使用的策略是LAPolicyDeviceOwnerAuthenticationWithBiometrics,这只会检查生物识别。如果用户想要允许设备密码作为回退,应该使用LAPolicyDeviceOwnerAuthentication策略,这时候即使没有生物识别,也会使用设备密码。但用户的问题中可能没有处理这种情况。 检查崩溃日志或异常信息会很有帮助,但用户没有提供具体的错误信息。常见的错误码包括LAErrorBiometryNotAvailable(生物识别不可用)或LAErrorPasscodeNotSet(未设置密码)等。如果应用在接收到这些错误码后,没有正确处理,比如强制解包某些对象或执行其他不安全的操作,可能导致崩溃。 接下来,我应该建议用户检查以下几点: 1. 确保在主线程调用LAContext的方法。 2. 正确处理canEvaluatePolicy返回的布尔值和error对象,不仅要检查返回值,还要查看具体的错误码。 3. 在设备不支持生物识别的情况下,避免执行后续的生物认证操作,比如调用evaluatePolicy:方法。 4. 使用正确的策略,如果需要回退到设备密码,应使用LAPolicyDeviceOwnerAuthentication。 5. 检查是否有其他代码在error对象未被正确初始化时被访问,比如在error为nil的情况下访问其属性。 例如,在调用canEvaluatePolicy时,正确的做法是先检查返回的BOOL值,然后根据需要处理error。如果返回NO,且error不为nil,可以根据error.code来判断具体原因,并采取相应措施,而不是继续执行生物认证流程。 另外,使用@try@catch块来捕获可能的异常,虽然大多数LAContext的错误通过NSError返回,但某些情况下可能存在异常,尤其是在多线程问题或内存错误时。 最后,建议用户在实际设备而非模拟器上测试,并确保设备系统版本符合要求。LAContext在iOS 8及以上可用,但不同策略可能有不同的版本要求。</think>在 Objective-C 中,当使用 `LAContext` 检测生物认证功能时,若设备**物理上不支持指纹/面容识别**(例如旧款 iPhone 5s 之前的设备),直接调用 `canEvaluatePolicy:LAPolicyDeviceOwnerAuthenticationWithBiometrics` 可能导致崩溃。以下是逐步分析和解决方案: --- ### **崩溃原因分析** 1. **策略兼容性问题** `LAPolicyDeviceOwnerAuthenticationWithBiometrics` 严格依赖生物识别硬件。当硬件不存在时,系统可能返回不可预料的错误状态。 2. **未正确处理 Error** 即使 `canEvaluatePolicy:error:` 返回 `NO`,若未检查 `error.code` 而直接执行后续逻辑(如调用 `evaluatePolicy:`),可能触发非法操作。 3. **线程安全问题** `LAContext` 的方法需在主线程调用,否则可能引发异常。 --- ### **解决方案** #### 1. 添加生物识别硬件检查 在调用 `canEvaluatePolicy` 前,先判断设备是否支持生物识别硬件: ```objective-c LAContext *context = [[LAContext alloc] init]; NSError *error = nil; // 先检查生物识别硬件是否存在 if (@available(iOS 11.0, *)) { if (context.biometryType == LABiometryNone) { NSLog(@"设备无生物识别硬件"); return; } } else { // iOS 11 之前通过错误码间接判断 if (![context canEvaluatePolicy:LAPolicyDeviceOwnerAuthenticationWithBiometrics error:&error]) { if (error.code == LAErrorBiometryNotAvailable) { NSLog(@"设备无生物识别硬件"); return; } } } ``` #### 2. 安全调用策略检测 使用 `LAPolicyDeviceOwnerAuthentication` 作为替代策略,允许回退到设备密码: ```objective-c if ([context canEvaluatePolicy:LAPolicyDeviceOwnerAuthentication error:&error]) { // 支持生物识别或设备密码 [context evaluatePolicy:LAPolicyDeviceOwnerAuthentication localizedReason:@"验证身份" reply:^(BOOL success, NSError *_Nullable error) { // 处理结果 }]; } else { NSLog(@"不支持认证: %@", error.localizedDescription); } ``` #### 3. 主线程保证 确保所有 `LAContext` 操作在主线程执行: ```objective-c dispatch_async(dispatch_get_main_queue(), ^{ LAContext *context = [[LAContext alloc] init]; // ...后续代码 }); ``` #### 4. 错误码处理 根据 `error.code` 细化错误处理: ```objective-c if (![context canEvaluatePolicy:LAPolicyDeviceOwnerAuthenticationWithBiometrics error:&error]) { switch (error.code) { case LAErrorBiometryNotAvailable: NSLog(@"生物识别不可用"); break; case LAErrorBiometryNotEnrolled: NSLog(@"未录入生物信息"); break; case LAErrorPasscodeNotSet: NSLog(@"未设置设备密码"); break; default: NSLog(@"其他错误: %@", error.localizedDescription); } return; } ``` --- ### **总结** - **硬件检查优先**:通过 `biometryType` 或错误码明确判断硬件支持。 - **策略选择灵活**:使用 `LAPolicyDeviceOwnerAuthentication` 兼容无生物识别的设备。 - **主线程安全**:避免多线程导致的意外崩溃。 - **错误处理完备**:覆盖所有可能的 `LAError` 错误码。 通过以上步骤,可有效避免在不支持生物识别的设备上因 `LAContext` 调用导致的崩溃问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值