Попытка поделиться строкой json в файле с контроллером представления активности - PullRequest
0 голосов
/ 05 июня 2018

iOS 11, Swift 4 Попытка использовать контроллер представления активности для предоставления только что созданной строки json, и я думаю, что я почти на месте, но пытаюсь прикрепить файл к контроллеру.Я получил этот код.

    let encoder = JSONEncoder()
    if let jsonData = try? encoder.encode(w2GA) {
        if let jsonString = String(data: jsonData, encoding: .utf8) {
            let documentsDirectoryURL = try! FileManager().url(for: .documentDirectory, in: .userDomainMask, appropriateFor: nil, create: true)
            let file2ShareURL = documentsDirectoryURL.appendingPathComponent("blah.json")
            print(jsonString)
            do {
                let encodedData = try? JSONEncoder().encode(jsonString)
                try encodedData?.write(to: file2ShareURL)
                    let activityViewController = UIActivityViewController(activityItems: [file2ShareURL], applicationActivities: nil)
                    activityViewController.popoverPresentationController?.sourceView = self.view
                    self.present(activityViewController, animated: true, completion: nil)

            } catch {
                print(error)
            }
        }
    }

Я получаю сообщение об ошибке:

файл: /// var / mobile / Containers / Data / Application / FD6E9F52-405F-4E66-927F-DCB7EDB0BF25 / Documents / blah.json

Вложения Ошибка подтверждения того, что URL доступен для чтения

Вы уверены, что файл существует?возможно, это какая-то расовая опасность?Если я заменим URL-адрес на jsonString, он будет работать!Таким образом, я получаю jsonString, который выглядит примерно так:

[{"imageURL": "http://","latitude":46.819945794990176,"name":"Clue 1", "longitude": 8.2581710034376599, "hint": "Hint"}, {"imageURL":" http://","latitude":47.433033706679716,"name":"Clue 2 "," долгота ": 8.8540648624925371," подсказка ":" подсказка "}, {" imageURL ":" http://","latitude":46.785125219263776,"name":"Clue","longitude":9.6534346734197598,"hint":"Hint"}]

Ответы [ 2 ]

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

Хорошо, нашел ответ, который, конечно, очевиден!Файл не был создан!

Я сделал два изменения, во-первых, я запускаю весь блок кода в основном потоке, во-вторых, я изменил строки, записывая строку json, которую в более ранней версии я кодировал дважды!

     DispatchQueue.main.async {
        let encoder = JSONEncoder()
        if let jsonData = try? encoder.encode(w2GA) {
            if let jsonString = String(data: jsonData, encoding: .utf8) {
                var documentsDirectoryURL = try! FileManager().url(for: .documentDirectory, in: .userDomainMask, appropriateFor: nil, create: true)
                let file2ShareURL = documentsDirectoryURL.appendingPathComponent("blah.json")
                do {
                    try jsonString.write(to: file2ShareURL, atomically: false, encoding: .utf8)
                } catch {
                    print(error)
                }

                do {
                    let _ = try Data(contentsOf: file2ShareURL)
                    let activityViewController = UIActivityViewController(activityItems: [file2ShareURL], applicationActivities: nil)
                    activityViewController.popoverPresentationController?.sourceView = self.view
                    self.present(activityViewController, animated: true, completion: nil)
                } catch {
                    print(error)
                }

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

Вам нужно сохранить это как файл?

Конечно, самый простой подход - передать строку JSON как переменную?

Пример:

let activityViewController = UIActivityViewController(activityItems: [jsonString], applicationActivities: nil)

РЕДАКТИРОВАТЬ

Я только что заметил, что вы уже попробовали это, и это работает.Извинения.

Убедитесь, что JSONEncoder не вызывает исключение и что файл существует, прежде чем пытаться передать URL-адрес UIActivityViewController

. Вы также можете попробовать использовать UIActivityItemProvider класс как задокументировано здесь

...