为Provisioning Profile添加权限后iOS真机安装失败求助
问题描述
开发iOS应用时,需访问设备的Documents和Downloads文件夹,使用了startAccessingSecurityScopedResource()方法,并在Xcode中开启了App Sandbox权限。应用在iOS模拟器运行正常,但无法安装到测试iPad真机上,遇到以下问题:
- 在「设备与模拟器」中添加Provisioning Profiles时,提示“无法将一个或多个配置文件安装到设备”
- 关闭自动签名后,要么创建Provisioning Profile时找不到App Sandbox和文档读写权限,要么构建完成但安装失败,调试信息显示“未找到此可执行文件的有效Provisioning Profile”
- 已尝试删除开发者控制台、电脑及iPad上的所有Provisioning Profiles并重新安装,问题依旧
附使用的UIDocumentPicker代码片段:
func documentPicker(_ controller: UIDocumentPickerViewController, didPickDocumentsAt urls: [URL]) { let fileManager = FileManager.default let songsFolderURL = fileManager.documentDirectory().appendingPathComponent("Songs", isDirectory: true) // Start accessing secured resources guard songsFolderURL.startAccessingSecurityScopedResource() else { print("Song Folder Access Issue") return } // If Songs folder doesn't exist in the app's documents, try to create it if !fileManager.fileExists(atPath: songsFolderURL.path) { do { try fileManager.createDirectory(at: songsFolderURL, withIntermediateDirectories: true, attributes: nil) } catch { print("Error creating song folder: \(error)") } } // Stop accessing secured resources defer { songsFolderURL.stopAccessingSecurityScopedResource() } // For each selected song... for song in urls { do { // Access secured resource guard song.startAccessingSecurityScopedResource() else { print("Song Access Issue") return } // Copy song from source location to app's documents/songs folder try fileManager.copyItem(at: song, to: songsFolderURL.appendingPathComponent(song.lastPathComponent)) // Create CoreData song object to be saved to core data let _song = Songs(context: PersistenceController.shared.container.viewContext) _song.name = song.lastPathComponent // Stop accessed secured resources defer { song.stopAccessingSecurityScopedResource() } // Save song data to coredata PersistenceController.shared.save() } catch { print("Error copying file: \(error)") } } }
解决方案
1. 匹配Provisioning Profile与Sandbox权限
- 确认Xcode项目
Signing & Capabilities中,App Sandbox的File Access已勾选Downloads Folder和Documents Folder,且App Sandbox开关处于开启状态。 - 登录开发者门户,找到对应App ID,确保
App Sandbox选项已启用,且权限配置与Xcode完全一致。 - 删除旧的Provisioning Profile,基于更新后的App ID重新生成,下载后双击安装到Xcode,再通过「设备与模拟器」同步到iPad。
2. 正确配置自动签名
- 保持Xcode的
Automatically manage signing开启状态,选择对应开发者团队,让Xcode自动匹配配置文件,避免手动配置导致的权限不匹配。 - 检查开发者账号权限(如是否为团队管理员),以及iPad是否已添加到开发者门户的设备列表中。
3. 修正Security Scoped Resource使用逻辑
- 应用自身的Documents目录属于沙箱内路径,无需调用
startAccessingSecurityScopedResource(),移除代码中关于songsFolderURL的安全范围资源访问代码:// 移除以下冗余代码 guard songsFolderURL.startAccessingSecurityScopedResource() else { print("Song Folder Access Issue") return } defer { songsFolderURL.stopAccessingSecurityScopedResource() } - 循环中单个文件访问失败时,将
return改为continue,避免终止整个文件处理流程:guard song.startAccessingSecurityScopedResource() else { print("Song Access Issue: \(song.lastPathComponent)") continue }
4. 清理与重置操作
- 执行
Product > Clean Build Folder清理项目,删除Derived Data(路径:Xcode > Settings > Locations中点击Derived Data旁箭头删除文件夹)。 - 在iPad的
设置 > 通用 > VPN与设备管理中,删除已有的开发者信任记录,重新安装应用后再次信任。 - 重启Xcode、电脑和iPad,确保所有配置变更生效。
内容的提问来源于stack exchange,提问作者Ray S.
相关产品推荐
相关产品推荐

