Xcode编译PWABuilder生成iOS应用报UNAuthorizationStatus无ephemeral成员
报错原因
UNAuthorizationStatus的ephemeral成员是iOS 14.0才新增的API,你当前Xcode项目设置的最低系统部署版本(iOS Deployment Target)低于14.0时,对应低版本iOS SDK里没有这个枚举值的定义,编译器就会抛出找不到成员的错误。
PWABuilder自动生成的iOS工程默认会把最低部署版本设为iOS 12或13,没有做新API的版本适配,就会触发这个编译问题。
解决方法
根据你是否需要兼容iOS 14以下的系统,二选一即可:
- 方案一:不需要兼容iOS14以下版本时,直接修改项目部署版本
打开Xcode左侧文件树选中项目根节点,切到General选项卡,在Deployment Info分类下把iOS Deployment Target修改为14.0或更高版本,清空编译缓存后重新构建即可消除报错。 - 方案二:需要兼容低版本系统时,添加API可用性标注
不要直接删除ephemeral相关逻辑,否则iOS14+系统下临时通知权限、App Clip场景的权限判断会出错。给对应case加上iOS版本可用性标注即可,修改后的完整代码如下:
func handlePushPermission() { UNUserNotificationCenter.current().getNotificationSettings () { settings in switch settings.authorizationStatus { case .notDetermined: let authOptions: UNAuthorizationOptions = [.alert, .badge, .sound] UNUserNotificationCenter.current().requestAuthorization( options: authOptions, completionHandler: { (success, error) in if error == nil { if success == true { returnPermissionResult(isGranted: true) DispatchQueue.main.async { UIApplication.shared.registerForRemoteNotifications() } } else { returnPermissionResult(isGranted: false) } } else { returnPermissionResult(isGranted: false) } } ) case .denied: returnPermissionResult(isGranted: false) case .authorized, .provisional: returnPermissionResult(isGranted: true) @available(iOS 14.0, *) case .ephemeral: returnPermissionResult(isGranted: true) @unknown default: return; } } } func handlePushState() { UNUserNotificationCenter.current().getNotificationSettings () { settings in switch settings.authorizationStatus { case .notDetermined: returnPermissionState(state: "notDetermined") case .denied: returnPermissionState(state: "denied") case .authorized: returnPermissionState(state: "authorized") case .provisional: returnPermissionState(state: "provisional") @available(iOS 14.0, *) case .ephemeral: returnPermissionState(state: "ephemeral") @unknown default: returnPermissionState(state: "unknown") return; } } }
补充说明:加了
@available(iOS 14.0, *)标注后,编译器只会在iOS14及以上的SDK上下文中识别ephemeral这个case,低版本下会自动忽略该分支,不会再报编译错误,同时不影响高版本系统下的逻辑正确性。
内容的提问来源于stack exchange,提问作者Alvartetex
相关产品推荐
相关产品推荐

