CNContactViewController.highlightProperty不高亮及PPT报错问题排查
解决CNContactViewController高亮失效及[PPT] CFMessagePort报错问题
问题场景
调用CNContactViewController.highlightProperty(withKey:identifier:)后,联系人属性高亮效果未生效,同时调试控制台抛出错误:[PPT] Error creating the CFMessagePort needed to communicate with PPT。环境为Xcode 14.3、iPhone 8(iOS 16.4.1 (a))。
相关代码
print("self.contact.emailAddresses.first!.identifier):\n\t\(String(describing: self.contact.emailAddresses.first!.identifier))") self.contactViewController.highlightProperty(withKey: CNContactEmailAddressesKey, identifier: self.contact.emailAddresses.first!.identifier)
调试日志
self.contact.emailAddresses.first!.identifier): ED15C6E7-0E63-4E0F-A868-6E450D6E7FDF 2023-05-29 11:46:45.742750-0500 TrialCNContactViewContollerInits[4726:216791] [Graphics] UIColor created with component values far outside the expected range. Set a breakpoint on UIColorBreakForOutOfRangeColorComponents to debug. This message will only be logged once. 2023-05-29 11:46:46.305697-0500 TrialCNContactViewContollerInits[4726:216791] [PPT] Error creating the CFMessagePort needed to communicate with PPT.
报错原因
- [PPT]错误本质:该错误是iOS 16.x系统
PresentationFramework(PPT)的内部通信问题,属于系统层面日志,和你的高亮逻辑无直接关联,不会导致高亮失效。 - 高亮失效的核心原因:
- 调用
highlightProperty的时机错误:必须在CNContactViewController被push到导航栈或present模态展示完成后调用,否则高亮逻辑无法绑定到已加载的视图组件。 - 若初始化
CNContactViewController时,未传入包含目标邮箱属性的完整联系人实例,或获取联系人时未请求CNContactEmailAddressesKey权限,也会导致高亮失败。
- 调用
解决方法
1. 调整高亮方法的调用时机
将高亮代码移到视图控制器展示完成后执行:
- 若使用push导航:
navigationController?.pushViewController(contactViewController, animated: true) // 延迟到主线程执行,确保视图已加载 DispatchQueue.main.async { self.contactViewController.highlightProperty(withKey: CNContactEmailAddressesKey, identifier: self.contact.emailAddresses.first!.identifier) }
- 若使用模态present:
present(contactViewController, animated: true) { // 模态展示完成后触发高亮 self.contactViewController.highlightProperty(withKey: CNContactEmailAddressesKey, identifier: self.contact.emailAddresses.first!.identifier) }
2. 验证联系人属性与权限完整性
获取联系人时必须请求必要的属性键:
// 定义需要获取的联系人属性 let requiredKeys: [CNKeyDescriptor] = [ CNContactIdentifierKey, CNContactEmailAddressesKey, CNContactGivenNameKey, CNContactFamilyNameKey ] // 用上述keysToFetch获取联系人实例,确保邮箱属性已加载
3. 处理系统日志
[PPT]日志为iOS 16的系统内部警告,不影响功能,可直接忽略。若需屏蔽,可在Xcode的Scheme设置中添加日志过滤规则,过滤[PPT]关键词。
内容的提问来源于stack exchange,提问作者daniel
相关产品推荐
相关产品推荐

