如何从CKError中提取可向用户展示的有效提示字符串?
提取CKError中用户友好的展示文本
我之前在处理CloudKit错误弹窗的时候,也碰到过localizedDescription返回一堆技术细节、完全不适合给用户看的情况,结合你给出的错误示例,给你几个实用的提取方法:
优先提取CKError自带的友好描述
CKError的userInfo字典里有个CKErrorDescriptionKey,对应的值就是你示例里的"Network Unavailable"这类简洁易懂的提示,直接提取这个就很合适:func extractUserFriendlyMessage(from error: CKError) -> String { if let errorMsg = error.userInfo[CKErrorDescriptionKey] as? String { return errorMsg } // 兜底逻辑后面补充 return "操作失败,请稍后再试" }结合底层错误补充细节
很多CKError是由底层网络错误引发的(比如你示例里的NSURLErrorDomain:-1009),可以提取底层错误的本地化描述,给用户更精准的提示:func extractUserFriendlyMessage(from error: CKError) -> String { // 先取CKError自带的描述 if let errorMsg = error.userInfo[CKErrorDescriptionKey] as? String { // 如果有底层网络错误,补充细节 if let underlyingError = error.userInfo[NSUnderlyingErrorKey] as? NSError { return "\(errorMsg):\(underlyingError.localizedDescription)" } return errorMsg } // 兜底 return "操作失败,请稍后再试" }针对特定错误码自定义提示
如果自带的描述还是不够贴合你的APP场景,可以针对常见的CKError码做自定义映射,让提示更接地气:func extractUserFriendlyMessage(from error: CKError) -> String { // 先检查自定义映射 switch error.code { case .networkUnavailable: return "网络开小差啦,请检查你的网络连接后重试" case .quotaExceeded: return "存储空间不足,无法完成当前操作" case .serverRejectedRequest: return "服务器暂时无法响应,请稍后再试" case .itemNotFound: return "找不到你要操作的内容" // 可以继续补充其他常见错误码 default: // 没有自定义映射就用自带描述+底层错误 if let errorMsg = error.userInfo[CKErrorDescriptionKey] as? String { if let underlyingError = error.userInfo[NSUnderlyingErrorKey] as? NSError { return "\(errorMsg):\(underlyingError.localizedDescription)" } return errorMsg } return "操作失败,请稍后再试" } }
这样处理后,你就能拿到适合弹窗展示给用户的、有意义的提示文本,避免把一堆技术术语抛给用户。
内容的提问来源于stack exchange,提问作者user1046037
相关产品推荐
相关产品推荐

