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

为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.

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 04:17:50