xcode 将权利添加到预配配置文件

fruv7luv  于 2023-03-19  发布在  其他
关注(0)|答案(1)|浏览(198)

我正在构建一个iOS应用程序,该应用程序需要偶尔访问设备的“文档和下载”文件夹。为此,我使用“startAccessiningSecurityScopedResource()“方法。我必须在Xcode中启用”应用沙盒“权限才能工作。这样做之后,应用在iOS模拟器中运行完美,但它不能再安装到我的物理测试iPad上。我已经在开发者门户中创建了预配配置文件,但当我尝试将它们添加到设备和模拟器下时,它说无法安装一个或多个配置文件到设备。我可以通过关闭自动管理签名来强制它静止,但它要么告诉我找不到应用程序沙盒和文档读/写的权限(创建配置文件时不会显示这些内容)或者,它让我构建,但随后弹出一个窗口,提示无法安装,在调试中,它说没有找到这个可执行文件的有效配置文件。有人知道发生了什么吗?
我试过从开发者控制台和电脑/ iPad中删除所有预置配置文件,然后重新安装它们。
下面是我的UIDocumentPicker代码:

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)")
                }
            }
        } ````
6g8kf2rb

6g8kf2rb1#

在iOS上,您不需要沙盒权限,这仅适用于macOS应用。
您无需将startAccessingSecurityScopedResource用于应用自己的documents文件夹-它位于应用的沙盒中。
此外,您获取此文件夹URL的方式不适用于iOS。您应该使用类似

let paths = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)
let documentsDirectory = paths[0]

您确实需要使用startAccessingSecurityScopedResource作为传递给您的delegate方法的url-这些是用户选择的沙箱之外的文件的URL。

相关问题