You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何修复Screen Time API错误:Button无familyActivityPicker成员

iOS 18.1中Screen Time API报错原因及修复

报错核心原因

WWDC 21教程里的familyActivityPicker是iOS 15及更早版本的Screen Time API用法,iOS 16之后苹果彻底重构了这部分API,该Button修饰符被移除,所以在iOS 18.1项目中会触发“Value of type 'Button' has no member 'familyActivityPicker'”错误。

你尝试两种方式未解决的可能原因

  1. 自定义绑定选择器的问题:你沿用了旧API的绑定逻辑,但新API的FamilyActivityPicker不再通过Button修饰符关联,旧的绑定方式完全不兼容新系统。
  2. 直接使用FamilyActivityPicker的问题:可能存在两个疏漏:
    • 没有用sheet/fullScreenCover这类容器视图来展示Picker,直接放置会导致Picker无法正常触发;
    • 缺少权限配置或权限请求,未获取Screen Time授权的情况下Picker无法工作。

修复方案

1. 改用新API的Picker展示方式

替换旧的Button修饰符写法,用弹窗形式调用FamilyActivityPicker:

import SwiftUI
import ScreenTime

struct ContentView: View {
    @State private var showActivityPicker = false
    @State private var activitySelection: FamilyActivitySelection?

    var body: some View {
        Button("选择应用/活动") {
            showActivityPicker = true
        }
        .sheet(isPresented: $showActivityPicker) {
            FamilyActivityPicker(selection: $activitySelection) {
                // 选择完成后的回调,比如关闭弹窗
                showActivityPicker = false
            }
        }
    }
}

2. 配置权限并请求授权

  • 在Info.plist中添加权限描述:
<key>NSFamilyActivityUsageDescription</key>
<string>需要访问Screen Time数据以管理应用使用时长</string>
  • 在App启动时请求Screen Time授权:
func requestScreenTimeAuth() {
    AuthorizationCenter.shared.requestAuthorization { status in
        switch status {
        case .authorized:
            // 授权成功,可正常使用Picker
            break
        case .denied, .restricted:
            // 授权失败,需提示用户开启权限
            break
        @unknown default:
            break
        }
    }
}

内容的提问来源于stack exchange,提问作者Ameen Izhac

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.14 14:16:01