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
相关产品推荐
相关产品推荐

