Значение SwiftySandboxFileAccess UserDefaults

SwiftySandboxFileAccess работает, когда пользователь в первый раз подтверждает выбор NSOpenPanel, но при следующем открытии приложения безопасность закладка не имеет доступа, даже если SwiftySandboxFileAccess считает, что у нее есть доступ только потому, что значение сохранено в UserDefaults я думаю?

Вот что SwiftySandboxFileAccess сохраняет в UserDefaults

"bd_file:///Volumes/": <626f6f6b fc010000 00000410 30000000 75703e99 3136c5a3 905214f4 1d55afdf
 f9680acc 65a5c354 86b39a29 ee2e1683 1c010000 04000000 03030000 00080028 07000000 01010000
 566f6c75 6d657300 04000000 01060000 10000000 08000000 04030000 93d14501 00000000 04000000 
01060000 2c000000 08000000 00040000 41c188f9 52800000 18000000 01020000 02000000 00000000 
0f000000 00000000 00000000 00000000 08000000 01090000 66696c65 3a2f2f2f 0c000000 01010000 
4d616369 6e746f73 68204844 08000000 04030000 0050065e 3a000000 08000000 00040000 41c1ab00 
f8865976 24000000 01010000 35384630 35383433 2d414237 332d3442 34342d42 3344372d 34374434 
39373543 46434536 18000000 01020000 81000000 01000000 ef130000 01000000 00000000 00000000 
01000000 01010000 2f000000 00000000 01050000 a8000000 feffffff 01000000 00000000 0d000000 
04100000 20000000 00000000 05100000 3c000000 00000000 10100000 58000000 00000000 40100000 
48000000 00000000 02200000 08010000 00000000 05200000 78000000 00000000 10200000 88000000 
00000000 11200000 bc000000 00000000 12200000 9c000000 00000000 13200000 ac000000 00000000 
20200000 e8000000 00000000 30200000 14010000 00000000 10d00000 04000000 00000000>
  1. Что за bd_ он добавил в начале пути file://?
  2. Что это за 8-битные штуки?

Больше контекста:

Вот как я пытаюсь использовать закладку безопасности:

  func accessRunFileVacuum(args: VacuumCli) {
    let access = SandboxFileAccess()
    let success = access.access(

      fileURL: URL(fileURLWithPath: "/Volumes"),
      askIfNecessary: true,
      persistPermission: true, with: {
      
      print("access the URL here")
      self.runFileVacuumCLI(args)

    })

    print("???? pickFile success: \(success)")
  }

"access the URL here" ..., URL... кхм... ????

из: https://github.com/ConfusedVorlon/SwiftySandboxFileAccess/blob/master/SwiftySandboxFileAccessDemo/SwiftySandboxDemo/Manager.swift#L42

Я читал соответствующий билет закладок безопасности, и в нем упоминалось, что закладку безопасности необходимо сохранить как URL-адрес, а затем передать в подпроцесс, который хочет ее использовать: https://stackoverflow.com/a/27321020/1762493

блок with: {} заключен в startAccessingSecurityScopedResource/stopAccessingSecurityScopedResource уже через SwiftySandboxFileAccess, как видно здесь: https://github.com/ConfusedVorlon/SwiftySandboxFileAccess/blob/master/SwiftySandboxFileAccess/Classes/SandboxFileAccess.swift#L87

runFileVacuumCLI() выполняется как операция очереди:

  func runFileVacuumCLI(_ args: VacuumCli) {
    checkVolumesAccess()

    if queue.operationCount < 1 {

      fvOperation = FileVacuumOperation(vacuumCli: args)
      queue.addOperations([fvOperation], waitUntilFinished: false)
      
    }
  }

person Mikeumus    schedule 09.09.2020    source источник


Ответы (1)


SandboxFileAccess().requestPermissions() разрешено управление при вызове startAccessingSecurityScopedResource. Оказывается, каким-то образом вызов securityScopedFileURL?.startAccessingSecurityScopedResource() == true один раз перед попыткой доступа к файлу сделал свое дело.

Чтобы было ясно, SandboxFileAccess().access() также вызывает startAccessingSecurityScopedResource(), затем выполняет переданный block{}, затем вызывает stopAccessingSecurityScopedResource(). Поскольку моя функция асинхронная, вызывалась stop, и мой доступ к этому файлу был закрыт.

let success = access.requestPermissions(
    forFileURL: URL(fileURLWithPath: bodyString),
    askIfNecessary: true,
    persistPermission: true, with: { securityScopedFileURL, bookmarkData in

      if (securityScopedFileURL?.startAccessingSecurityScopedResource() == true) {
        self.testLog("???? gainAccess inside startAccessingSecurityScopedResource() == true")
      }
})

self.testLog("???? pickFile success: \(success)")

Я считаю, что это связано с балансировкой startAccessingSecurityScopedResource, упомянутой в этом другом ответе: https://stackoverflow.com/a/24301326/1762493< /а>

person Mikeumus    schedule 16.09.2020