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

iOS下基于ScreenTime API,如何从ShieldAction扩展打开父应用?

可行方案:在ScreenTime ShieldAction扩展中打开父应用

当然可以实现,核心思路是利用自定义URL Scheme结合扩展上下文唤起父应用,具体步骤和代码修改如下:

1. 给父应用配置URL Scheme

先在父应用的Info.plist中添加自定义URL Scheme:

  • 右键点击Info.plist → 选择"Add Row"
  • 键名填CFBundleURLTypes(数组类型)
  • 展开数组,添加一个字典项,再添加两个子键:
    • CFBundleURLSchemes:数组类型,填入你的自定义Scheme(比如myparentapp)
    • CFBundleURLName:字符串类型,填入唯一标识(建议用应用的Bundle ID)

2. 修改ShieldActionExtension代码

在primaryButtonPressed分支里,通过NSExtensionContext打开父应用的URL Scheme:

class ShieldActionExtension: ShieldActionDelegate {
    override func handle(action: ShieldAction, for application: ApplicationToken, completionHandler: @escaping (ShieldActionResponse) -> Void) {
        let store = ManagedSettingsStore()
        
        switch action {
        case .primaryButtonPressed:
            // 构造父应用的URL
            guard let parentAppURL = URL(string: "myparentapp://") else {
                completionHandler(.defer)
                return
            }
            // 通过扩展上下文打开URL
            self.extensionContext?.open(parentAppURL) { success in
                if !success {
                    // 可选:处理打开失败的情况
                    print("打开父应用失败")
                }
            }
            completionHandler(.defer)
        case .secondaryButtonPressed:
            // 解除目标应用屏蔽
            store.shield.applications?.remove(application)
            completionHandler(.defer)
        @unknown default:
            fatalError()
        }
    }
}

注意事项

  • 自定义URL Scheme要保证唯一性,建议用应用Bundle ID作为Scheme一部分(比如com.yourcompany.yourapp://),避免和其他应用冲突
  • 保持屏蔽状态只需维持completionHandler(.defer),无需修改ManagedSettingsStore的屏蔽配置
  • 测试时确保父应用已安装在设备上,否则URL唤起会失败

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 12:05:21