2016-09-20 14 views
0

Я провел не менее 2 часов, прежде чем публиковать этот довольно простой вопрос. Следующий код работает, когда json-файл находится внутри пакета приложений.Swift читает json из файла за пределами Application bundle

 if let file = Bundle.main.url(forResource: "data", withExtension: "json") {.... 

Я чтение файла JSON таким образом ...

let myData = try Data(contentsOf: file as URL) 

Я не могу получить доступ к идентичной копии файла с «/ Library/Application Support/AppFolder/data.json ».

Ниже не работает

let filepath = "/Library/Application Support/AppFolder/data.json" 
    if let file = NSURL(string: filepath) {... 

ответ

1

Помимо того, что URL-адрес в файловой системе всегда должен быть создан с NSURL(fileURLWithPath...) рекомендуется, чтобы получить конкретные системные папки с одним выделенными интерфейсами:

let applicationSupportFolderURL = try! NSFileManager.defaultManager().URLForDirectory(.ApplicationSupportDirectory, 
                   inDomain: .LocalDomainMask, 
                 appropriateForURL: nil, 
                   create: false) 
let jsonDataURL = applicationSupportFolderURL.URLByAppendingPathComponent("AppFolder/data.json") 

или в Swift 3 (что в значительной степени короче)

let applicationSupportFolderURL = try! FileManager.default.url(for: .applicationSupportDirectory, 
                   in: .localDomainMask, 
                appropriateFor: nil, 
                  create: false) 
let jsonDataURL = applicationSupportFolderURL.appendingPathComponent("AppFolder/data.json") 
+0

Мне пришлось обновить синтаксис, чтобы быть быстрым 3-х совместимым. Затем я получаю сообщение об ошибке «Значение URL-адреса типа не имеет члена URLbyAppendingPathComponent». – nyitguy

+0

Я обновил ответ, добавив версию Swift 3. – vadian

+0

Это работает отлично, но как я могу указать его в каталог «/Volumes/VolumeName/data.json»? – nyitguy

0

Try: NSURL.init(fileURLWithPath: "your_path")

string: производит NSURL, представляющий строку, как указано. Поэтому строка типа «http://www.google.com» и URL-адрес представляет http://www.google.com.

fileURLWithPath: берет путь, а не URL, и создает NSURL, который представляет путь, используя файл: // URL. Поэтому, если вы дадите /foo/bar/baz, URL будет представлять file:///foo/bar/baz.