macOS下使用Swift打开Mail App Extension偏好面板的API咨询
关于Mail App Extensions偏好设置跳转与状态查询的API说明
截至macOS 14 Sonoma正式版,苹果未针对Mail App Extensions提供与Safari App Extensions对等的官方公开API,暂不支持通过官方接口直接跳转到指定扩展的偏好设置面板、直接读取扩展启用状态。
现有可用方案
1. 官方支持的基础操作
你目前使用的通过NSWorkspace打开Mail应用的方案是完全合规的公开API实现,只是无法直达扩展设置页:
if let url = NSWorkspace.shared.urlForApplication(withBundleIdentifier: "com.apple.mail") { NSWorkspace.shared.open(url) }
2. 体验更优的变通跳转方案
可以通过系统偏好设置的URL Scheme,直接跳转到系统设置内的邮件扩展统一管理页,比单独打开Mail.app减少用户操作路径:
// 适配macOS 13及以上版本的系统设置路径 if let url = URL(string: "x-apple.systempreferences:com.apple.preference.extensions?Extensions_Mail") { NSWorkspace.shared.open(url) }
该方案不需要用到任何非公开API,仅调用系统允许的URL Scheme跳转,不存在App Store审核风险,缺点是无法直接定位到你自己的扩展项,需要用户在扩展列表里手动找到对应扩展操作。
3. 扩展启用状态判断方案
目前没有公开API可以直接读取扩展启用状态,你可以通过MailKit的非公开键值间接获取状态,代码示例如下:
import MailKit func isMailExtensionEnabled(extensionBundleID: String) -> Bool { guard let extensionList = MEEmailAddress.value(forKey: "allMailExtensions") as? [NSObject] else { return false } return extensionList.contains { ext in guard let bid = ext.value(forKey: "bundleIdentifier") as? String, let enabled = ext.value(forKey: "isEnabled") as? Bool else { return false } return bid == extensionBundleID && enabled } }
注意:该实现依赖MailKit未公开的属性键值,存在后续系统版本升级后失效的可能,提交App Store审核前请充分测试,评估审核风险。

内容的提问来源于stack exchange,提问作者Suboptimierer
相关产品推荐
相关产品推荐

