Landmarks/ModelData.swift:45: Неустранимая ошибка: Не удалось t напишите в /private/var/containers/Bundle/Application/.../Landmarks.app/landmarkData.json:
Error Domain=NSCocoaErrorDomain Code=513 «У вас нет разрешения на сохранение файла «landmarkData» .json» в папке «Ориентиры».
Однако это происходит только во время тестирования приложения на моем iPhone 11, а при запуске приложения на симуляторе оно работает как положено.< /p>
Я использую эту функцию сохранения:
Код: Выделить всё
func save(_ landmarks: [Landmark]) {
let encoder = JSONEncoder()
do {
let data = try encoder.encode(landmarks)
let documentsDirectory = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first!
let fileURL = documentsDirectory.appendingPathComponent("landmarkData.json")
guard let file = Bundle.main.url(forResource: "landmarkData.json", withExtension: nil)
else {
fatalError("Couldn't find landmarkData.json in main bundle.")
}
do {
try data.write(to: file)
} catch {
fatalError("Couldn't write to \(file.path):\n\(error)")
}
} catch {
fatalError("Couldn't encode landmarks as JSON:\n\(error)")
}
}
Я попробовал это:
Код: Выделить всё
import Foundation
@Observable
class ModelData {
init() {
copyFileFromBundleToDocumentsFolder(sourceFile: "landmarkData.json")
landmarks = load("landmarkData.json")
}
var landmarks: [Landmark] = []
}
func load(_ filename: String) -> T {
let data: Data
let documentsURL = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first!
let fileURL = documentsURL.appendingPathComponent(filename)
do {
data = try Data(contentsOf: fileURL)
} catch {
fatalError("Couldn't find \(filename) in Documents directory:\n\(error)")
}
do {
let decoder = JSONDecoder()
return try decoder.decode(T.self, from: data)
} catch {
fatalError("Couldn't parse \(filename) as \(T.self):\n\(error)")
}
}
func save(_ landmarks: [Landmark]) {
let encoder = JSONEncoder()
do {
let data = try encoder.encode(landmarks)
let documentsURL = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first!
let fileURL = documentsURL.appendingPathComponent("landmarkData.json")
do {
try data.write(to: fileURL)
print("Successfully wrote data to \(fileURL.path)")
} catch {
fatalError("Couldn't write to \(fileURL.path):\n\(error)")
}
} catch {
fatalError("Couldn't encode landmarks as JSON:\n\(error)")
}
}
func copyFileFromBundleToDocumentsFolder(sourceFile: String) {
let fileManager = FileManager.default
let documentsURL = fileManager.urls(for: .documentDirectory, in: .userDomainMask).first!
let destinationURL = documentsURL.appendingPathComponent(sourceFile)
if !fileManager.fileExists(atPath: destinationURL.path) {
if let sourceURL = Bundle.main.url(forResource: sourceFile, withExtension: nil) {
do {
try fileManager.copyItem(at: sourceURL, to: destinationURL)
print("\(sourceFile) copied to Documents directory.")
} catch {
print("Error copying file: \(error)")
}
} else {
print("Source file not found in bundle.")
}
}
}
Заранее спасибо!
Подробнее здесь: https://stackoverflow.com/questions/790 ... testing-on