尝试与活动视图控制器共享文件中的 json 字符串
Posted
技术标签:
【中文标题】尝试与活动视图控制器共享文件中的 json 字符串【英文标题】:Trying to share a json string in a file with an activity view controller 【发布时间】:2018-06-05 15:07:04 【问题描述】:ios 11、斯威夫特 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)
我收到错误消息:
file:///var/mobile/Containers/Data/Application/FD6E9F52-405F-4E66-927F-DCB7EDB0BF25/Documents/blah.json
确认 URL 可读的附件错误
确定文件在那里?这可能是某种种族危险吗?如果我用 jsonString 替换 URL 就可以了!所以我得到一个 jsonString 基本上是这样的。
["imageURL":"http://","latitude":46.819945794990176,"name":"线索 1","longitude":8.2581710034376599,"hint":"Hint","imageURL" :"http://","纬度":47.433033706679716,"名称":"线索2","经度":8.8540648624925371,"hint":"Hint","imageURL":"http://", "纬度":46.785125219263776,"名称":"线索","经度":9.6534346734197598,"提示":"提示"]
【问题讨论】:
尝试用let documentsDirectoryURL = try! FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first!
替换let documentsDirectoryURL = try! FileManager().url(for: .documentDirectory, in: .userDomainMask, appropriateFor: nil, create: true)
【参考方案1】:
您需要将其保存为文件吗?
当然,最简单的方法是将 JSON 字符串作为变量传递?
例子:
let activityViewController = UIActivityViewController(activityItems: [jsonString], applicationActivities: nil)
编辑
我刚刚注意到您已经尝试过这个并且它有效。道歉。
在尝试将 url 传递给 UIActivityViewController
之前,确保 JSONEncoder
没有引发异常并且文件存在
您也可以尝试使用UIActivityItemProvider
记录的here 类
【讨论】:
是的,我可以。但是比消息是json字符串,另一端的新手更难处理。作为一个文件,我可以简单地空投并使用它,作为带有电子邮件的字符串,不是那么明显。 我刚刚编辑了我的答案。希望这会提供一些帮助【参考方案2】:好的,找到了当然是显而易见的答案!文件没有被创建!
我做了两处更改,首先我在主线程下运行整个代码块,其次我更改了写出在早期版本中我编码两次的 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)
【讨论】:
这条线的意义何在?让 _ = 尝试数据(contentsOf:file2ShareURL)以上是关于尝试与活动视图控制器共享文件中的 json 字符串的主要内容,如果未能解决你的问题,请参考以下文章