Criação de UIDocument no iOS 11: o leitor não tem permissão para acessar a URL
Desde o iOS 11, encontrei o seguinte errotoda vez que estou criando um novo documento usandoUIDocument
API:
[ERRO] Não foi possível obter os valores do atributo para o item/var/mobile/Containers/Data/Application/XXXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXX/Documents/myDoc-XXXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXX.myFile (n).
Erro: Domínio do Erro = Código NSFileProviderInternalErrorDomain = 1
"O leitor não tem permissão para acessar a URL."
UserInfo = {NSLocalizedDescription = O leitor não tem permissão para acessar a URL.}
Diferentemente de perguntas semelhantes (1, 2, 3) em SO sobre isso, eu não estou usandoUIDocumentBrowserViewController
. Estou simplesmente criando um UIDocument e chamandosave()
aoDocuments
próprio diretório. opergunta mais próxima Eu encontrei usosUIManagedDocument
. No entanto, no meu caso,o arquivo ainda é criado e gravado com êxito, apesar da mensagem de erro.
Aqui está a essência da minha rotina de salvamento:
@IBAction func createDoc(_ sender: Any) {
let uuid = UUID().uuidString
let doc = Document(baseName: "myDoc-\(uuid)")
doc.save(to: doc.fileURL, for: .forCreating) { (completed) in
if (completed) {
doc.close(completionHandler: nil)
self.verifyNumberOfFiles()
}
}
}
MinhasUIDocument
subclasse também está quase em branco para simplificar esta pergunta:
class Document: UIDocument {
let fileExtension = "myFile"
override init(fileURL url: URL) {
super.init(fileURL: url)
}
/// Convenience method for `init(fileURL:)`
convenience init(baseName: String) {
self.init(fileURL: documentsDirectory.appendingPathComponent(baseName).appendingPathExtension(Document.fileExtension))
}
override func contents(forType typeName: String) throws -> Any {
return NSData()
}
override func load(fromContents contents: Any, ofType typeName: String?) throws {
}
}
Estou sempre escrevendo paraDocuments
pasta e minha rotina de pesquisa pode verificar se meus arquivos foram criados com êxito:
public var documentsDirectory: URL {
return FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).last!
}
func loadFileURLs(from dirURL: URL) -> [URL]? {
return try? FileManager().contentsOfDirectory(at: dirURL, includingPropertiesForKeys: nil)
}
O que eu descobri até agora:
O erro aparece mesmo quando eu já configurei minha UTI. Vejoesta eesta.Posso verificar se minha UTI funciona quando envio um "myFile" para o meu dispositivo pelo AirDrop e aciona corretamente o meu aplicativo para abrir.O erro aparece apenas no iOS 11. O mesmo código não reproduz o erro no iOS 10, como ema pergunta acima.Eu tentei adicionarUISupportsDocumentBrowser
chave, embora eu não esteja usando o navegador, mas não dissolva o erro.O que está acontecendo? Esta é apenas uma mensagem de erro "ruído" no iOS 11?
Aqui estámeu código do GitHub on-line se alguém estiver interessado.