iOS如何向React Native正确返回CallKit扩展的启用状态
问题原因及解决方案
你遇到的问题不是异步逻辑的问题,而是直接返回了iOS原生的CXCallDirectoryManager.EnabledStatus枚举类型,React Native无法直接识别这种原生枚举,所以接收到的结果为null。
解决步骤如下:
- 将
CXCallDirectoryManager.EnabledStatus枚举转换为React Native可以解析的类型,比如字符串或者整数 - 完善错误处理,在出现错误时调用
reject方法,避免RN端出现未处理的Promise
修改后的代码:
import Foundation import CallKit @objc(CommonFunction) class CommonFunction : NSObject { @objc static func requiresMainQueueSetup() -> Bool { return true } @objc func checkExtensionStatus(_ resolve: @escaping RCTPromiseResolveBlock, reject: @escaping RCTPromiseRejectBlock) -> Void { CXCallDirectoryManager.sharedInstance.getEnabledStatusForExtension(withIdentifier: "com.***.*****.Extension") { status, error in if let error = error { // 调用reject返回错误信息 reject("EXTENSION_STATUS_ERROR", "获取扩展状态失败: \(error.localizedDescription)", error) return } // 将枚举转换为字符串返回,RN可以直接接收 let statusString: String switch status { case .enabled: statusString = "enabled" case .disabled: statusString = "disabled" case .unknown: statusString = "unknown" @unknown default: statusString = "unknown" } resolve(statusString) } } }
补充说明
- 如果偏好使用整数类型,也可以把枚举映射为0(unknown)、1(enabled)、2(disabled),RN端根据数值判断状态
- 确保你的扩展标识符
com.***.*****.Extension完全正确,和项目中CallKit扩展的bundle ID一致 - React Native端调用该方法时,要使用Promise语法处理返回结果,示例:
import { NativeModules } from 'react-native'; const { CommonFunction } = NativeModules; async function getExtensionStatus() { try { const status = await CommonFunction.checkExtensionStatus(); console.log('扩展状态:', status); // 根据status做后续处理 } catch (error) { console.error('获取扩展状态失败:', error); } }
内容的提问来源于stack exchange,提问作者a programer
相关产品推荐
相关产品推荐

