Mac OS: доступ к содержимому прямо из каталога в Swift - PullRequest
0 голосов
/ 11 июня 2018

Я новичок в разработке для Mac OS, так что извините за любые основные вопросы, но, поверьте мне, я провел много исследований и все еще застрял.

Так что я пытаюсь получить доступ к содержимомурабочий стол текущего пользователя.

На игровой площадке это просто, просто используйте

let homeURL = FileManager.default.homeDirectoryForCurrentUser
let desktopURL = homeURL.appendingPathComponent("Desktop/")
let contents = try fileManager.contentsOfDirectory(atPath:desktopURL.path)

Он показывает все содержимое на рабочем столе.Но когда я запускаю подобный код в проекте.

let homeURL = FileManager.default.homeDirectoryForCurrentUser

возвращает мне контейнер моего приложения.

file: /// Users / myUserName / Библиотека / Containers / AppIdentifier / Data /

и let contents = try fileManager.contentsOfDirectory(atPath: desktopURL.path) не возвращает ни одного контента.

Ну, тогда я использую

deletingLastPathComponent

при получении домашнего пути, чтобы получить мойURL до моего имени пользователя

let homeURL = FileManager.default.homeDirectoryForCurrentUser.deletingLastPathComponent().deletingLastPathComponent().deletingLastPathComponent().deletingLastPathComponent()

и когда я отлаживаю его, он возвращает

файл: /// Users / myUserName

, как я хотел,Но когда я запускаю код, переменная содержимого по-прежнему равна нулю.

Следующая попытка:

Я искал в Интернете, чтобы проверить альтернативный способ получения пути к каталогу.Поэтому я наткнулся на

NSOpenPanel

Я получаю URL-адрес папки из Panel и использую этот URL-адрес для проверки содержимого в ней. Работает нормально

вот код для этого

func buttonClicked(_ sender : Any){
guard let window = view.window else {return}

        let panel = NSOpenPanel()
        panel.canChooseFiles = false
        panel.canChooseDirectories = true
        panel.allowsMultipleSelection = false

        panel.beginSheetModal(for: window) { (result) in
            if result.rawValue == 1{
                let folderURL = panel.urls[0]
                print(folderURL)

                let contents = self.contentsOf(folder: folderURL)
                contents.forEach{
                    print($0.absoluteString)
                }
            }
        }
        }
 
     func contentsOf(folder: URL) -> [URL] {
        
        print("folder path = \(folder.path)")
        let fileManager = FileManager.default
        do {
            let contents = try fileManager.contentsOfDirectory(atPath: folder.path)
            let urls = contents
                .filter { return $0.first != "." }
                .map { return folder.appendingPathComponent($0) }
            return urls
        } catch {
            return []
        }
    }

но я не понимаю, почему я не могу получить доступ к содержимому напрямую.Я пробовал кучу раз.В проекте я не могу enter code here получить содержимое напрямую с (вроде) жестко закодированного URL.

Дайте мне знать, нужна ли какая-либо другая информация.

1 Ответ

0 голосов
/ 11 июня 2018

Очевидно, что приложение находится в изолированной программной среде, которая включена по умолчанию.

Если включено App Sandbox, вы можете получить программный доступ только к каталогам в контейнере приложения.Это намеренное ограничение.Единственный способ получить доступ к одному из стандартных каталогов в обычной домашней папке - это разрешение com.apple.security.files.user-selected.read-write и NSOpen-/SavePanel.

. Пожалуйста, прочитайте Руководство по разработке изолированной программной среды приложения

Если вы не планируете публиковать приложение в App Store и вам не нужна песочница, отключите его.

...