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

