Saat ini saya menggunakan flutter untuk meneruskan String jalur file yang valid ke Swift untuk mendapatkan akses ke sumber daya dengan cakupan keamanan (ini bagian mungkin tidak relevan)

Jadi saya memiliki fungsi yang menerima String dan berjalan seperti ini:

public func requestAccessToFile(filePath: String) -> Bool {
  let fileUrl = URL(fileURLWithPath: filePath)
  return fileUrl.startAccessingSecurityScopedResource()
}

Saya tahu bahwa startAccessingSecurityScopedResource tidak selalu mengembalikan true tetapi dalam kasus ini, seharusnya, karena jika saya mencoba mengakses file tanpa mengembalikan true saya mendapatkan kesalahan izin.

Sedikit lebih banyak konteks: Jika saya mencoba memanggil startAccessingSecurityScopedResource itu segera setelah saya mendapatkan URL dari pemilih file, itu berhasil, tetapi jika saya melakukannya dengan fungsi itu gagal (perhatikan bahwa fungsi dipanggil dengan a String dan saya melewati jalur tanpa protokol file://. mis. "/private/var/mobile/Library/Mobile Documents/com~apple~CloudDocs/Documents/afile. pdf"

Jadi tebakan saya adalah bahwa URL yang dibuat oleh pemilih file entah bagaimana berbeda dengan yang saya buat dengan jalur string. Tapi tidak yakin.

Terima kasih atas bantuan Anda sebelumnya.

2
Frank 7 Mei 2021, 19:30

1 menjawab

Jawaban Terbaik

UIDocumentPickerViewController menyediakan URL dengan cakupan keamanan untuk mengakses sumber daya dan tidak mungkin membuat yang sama dari jalur string:

Jika Anda memerlukan jalur URL cakupan keamanan sebagai nilai string (seperti yang disediakan oleh metode jalur), seperti untuk menyediakan ke API yang memerlukan nilai string, dapatkan jalur dari URL sesuai kebutuhan. Namun, perhatikan bahwa jalur berbasis string yang diperoleh dari URL cakupan keamanan tidak memiliki cakupan keamanan dan Anda tidak dapat menggunakan string tersebut untuk mendapatkan akses ke sumber daya cakupan keamanan. https://developer.apple.com/documentation/foundation/nsurl

Jika Anda perlu menyimpan atau membagikan lokasi sumber daya aman dalam kode Anda, Anda harus menggunakan bookmark:

// Get bookmark data from the provided URL
let bookmarkData = try? pickedURL.bookmarkData()
if let data = bookmarkData {
    // Save data
    ...
}

...

// Access to an external document by the bookmark data
if let data = bookmarkData {
    var stale = false
    if let url = try? URL(resolvingBookmarkData: data, bookmarkDataIsStale: &stale),
       stale == false,
       url.startAccessingSecurityScopedResource()
    {
        var error: NSError?
        NSFileCoordinator().coordinate(readingItemAt: url, error: &error) { readURL in
            if let data = try? Data(contentsOf: readURL) {
                ...
            }
        }
        
        url.stopAccessingSecurityScopedResource()
    }
}
0
iUrii 11 Mei 2021, 18:49