iOS15.5中CarPlay应用展示CPActionSheetTemplate调用presentTemplate崩溃
问题原因
从崩溃日志的信息可以明确:在iOS 15.5系统中,CPInterfaceController的presentTemplate(_:animated:completion:)方法不支持传入CPActionSheetTemplate,允许的模板类型仅包括CPGridTemplate、CPListTemplate、CPNowPlayingTemplate、CPTabBarTemplate、CPAlertTemplate、CPVoiceControlTemplate。而CPActionSheetTemplate是在iOS 16及以上版本才被纳入presentTemplate的支持范围,这就是该功能在iOS17正常、iOS15.5崩溃的核心原因。
解决方案
针对不同iOS版本做适配处理,以下是两种可行方案:
方案1:版本判断适配展示方法
在iOS 15及以下系统中,使用CarPlay专门的showActionSheetTemplate(_:animated:completion:)方法展示CPActionSheetTemplate;iOS 16及以上版本则保留presentTemplate方法。修改后的代码如下:
func showRequestSheet(_ id: String) { appPrint("Category Clicked: ", id) let actDismiss = CPAlertAction(title: "Dismiss", style: .destructive, handler: { action in self.interfaceController?.dismissTemplate(animated: true, completion: nil) }) let actOk = CPAlertAction(title: "ok".translated, style: .default, handler: { action in if let category = CPHelper.shared.arrCategories.first(where: { $0.id == id }) { self.interfaceController?.dismissTemplate(animated: true, completion: nil) CPHelper.shared.requestAudioAPI(category.name) { (isSuccess, error) in if let err = error { let actDone = CPAlertAction(title: "e-mail_registration_password-strength-ok".translated, style: .default, handler: { action in self.interfaceController?.dismissTemplate(animated: true, completion: nil) }) let alert = CPAlertTemplate(titleVariants: [err.translated], actions: [actDone]) // 对AlertTemplate也做版本适配 if #available(iOS 16.0, *) { self.interfaceController?.presentTemplate(alert, animated: true, completion: { isSuccess, error in if let err = error { appPrint("Category Success presentTemplate error: ", err) } }) } else { self.interfaceController?.showAlertTemplate(alert, animated: true, completion: { isSuccess, error in if let err = error { appPrint("Category Success showAlertTemplate error: ", err) } }) } } } } }) let actionSheet = CPActionSheetTemplate(title: "auto_app_request-audio-carplay-title".translated, message: "auto_app_request-audio-carplay-text".translated, actions: [actOk, actDismiss]) if #available(iOS 16.0, *) { interfaceController?.presentTemplate(actionSheet, animated: true, completion: { isSuccess, error in if let err = error { appPrint("Category presentTemplate error: ", err) } }) } else { interfaceController?.showActionSheetTemplate(actionSheet, animated: true, completion: { isSuccess, error in if let err = error { appPrint("Category showActionSheetTemplate error: ", err) } }) } }
方案2:降级使用CPAlertTemplate替代
如果不需要严格保留ActionSheet样式,可以在iOS15及以下系统中用CPAlertTemplate替代CPActionSheetTemplate,该模板在所有目标版本中都能通过presentTemplate正常展示,代码示例:
func showRequestSheet(_ id: String) { appPrint("Category Clicked: ", id) let actDismiss = CPAlertAction(title: "Dismiss", style: .destructive, handler: { action in self.interfaceController?.dismissTemplate(animated: true, completion: nil) }) let actOk = CPAlertAction(title: "ok".translated, style: .default, handler: { action in if let category = CPHelper.shared.arrCategories.first(where: { $0.id == id }) { self.interfaceController?.dismissTemplate(animated: true, completion: nil) CPHelper.shared.requestAudioAPI(category.name) { (isSuccess, error) in if let err = error { let actDone = CPAlertAction(title: "e-mail_registration_password-strength-ok".translated, style: .default, handler: { action in self.interfaceController?.dismissTemplate(animated: true, completion: nil) }) let alert = CPAlertTemplate(titleVariants: [err.translated], actions: [actDone]) self.interfaceController?.presentTemplate(alert, animated: true, completion: { isSuccess, error in if let err = error { appPrint("Category Success presentTemplate error: ", err) } }) } } } }) // 用CPAlertTemplate替代CPActionSheetTemplate let alertTemplate = CPAlertTemplate( titleVariants: ["auto_app_request-audio-carplay-title".translated], messageVariants: ["auto_app_request-audio-carplay-text".translated], actions: [actOk, actDismiss] ) interfaceController?.presentTemplate(alertTemplate, animated: true, completion: { isSuccess, error in if let err = error { appPrint("Category presentTemplate error: ", err) } }) }
内容的提问来源于stack exchange,提问作者Sudhir Dadhania
相关产品推荐
相关产品推荐

