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

macOS应用中能否通过NSOpenPanel访问已连接的iPad?

在macOS应用中导航至已连接iOS设备的实现方法

核心结论

可以实现,但需要针对系统权限和NSOpenPanel配置做调整——iOS设备在macOS中被识别为可移动卷,受沙盒限制默认不会在NSOpenPanel中显示,内部应用可通过权限豁免或配置参数来解锁访问。

具体步骤

1. 配置应用权限

  • 沙盒应用:在Xcode的「Signing & Capabilities」面板中,添加「File Access」权限并勾选「User Selected File」,同时在Info.plist中添加NSRemovableVolumesUsageDescription键,填写权限申请说明(例如"需要访问已连接的iOS设备来选择文件夹")。
  • 完全信任的内部应用:可直接启用「Full Disk Access」权限(需用户在系统偏好设置 > 安全性与隐私 > 隐私 > 完全磁盘访问中手动添加应用),这种方式无需沙盒配置,但仅适合内部使用。

2. 调整NSOpenPanel参数

默认NSOpenPanel不会包含可移动卷,需要手动指定包含该域,并开启安全作用域访问(沙盒应用必填):

openPanel.includesDirectoriesInDomains([.removableVolume], url: nil)
openPanel.canAccessSecurityScopedResource = true

3. 修改后的完整代码示例

@IBAction func selectLisaIngestPreviewFolder(_ sender: Any) {
    let openPanel = NSOpenPanel()
    openPanel.canChooseFiles = false
    openPanel.canChooseDirectories = true
    openPanel.message = "Select Lisa Preview folder"
    // 允许访问可移动卷(iOS设备归属此类)
    openPanel.includesDirectoriesInDomains([.removableVolume], url: nil)
    // 沙盒应用启用安全作用域资源访问
    openPanel.canAccessSecurityScopedResource = true
    
    let response = openPanel.runModal()
    switch response {
    case .OK:
        guard let selectedURL = openPanel.url else { return }
        print("Selected folder path: \(selectedURL.path)")
        
        // 沙盒应用需手动管理安全作用域访问
        if selectedURL.startAccessingSecurityScopedResource() {
            defer { selectedURL.stopAccessingSecurityScopedResource() }
            // 在这里执行文件夹相关操作
        }
    case .cancel:
        print("Folder selection canceled")
    default:
        return
    }
}

额外注意事项

  • iOS设备必须保持与Mac的「信任」状态,且Finder中能正常访问设备内容,否则NSOpenPanel无法识别。
  • 如果不需要上架App Store,内部应用可以直接关闭沙盒(Xcode中关闭「App Sandbox」开关),这样无需额外配置即可在NSOpenPanel中看到iOS设备,但这种方式不适合公开分发。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 19:42:20