Создание приложения для iOS. Не разрешено сохранять файл JSON с помощью Swift во время тестирования на реальном устройстIOS

Программируем под IOS
Ответить Пред. темаСлед. тема
Anonymous
 Создание приложения для iOS. Не разрешено сохранять файл JSON с помощью Swift во время тестирования на реальном устройст

Сообщение Anonymous »

Я пытаюсь создать приложение для iOS, и мне нужно сохранить файл JSON, но я получаю следующую ошибку:
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
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «IOS»