尝试与活动视图控制器共享文件中的 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,"n​​ame":"线索 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 字符串的主要内容,如果未能解决你的问题,请参考以下文章

为啥视图中的按钮与父视图控制器处于非活动状态?

共享元素转换:活动到嵌套在另一个活动中的片段

如何在 MVC 中创建共享视图

如何使用 UINavigationController 中的所有视图和导航控制器的导航控件检测用户活动?

如何在两个活动之间共享一个视图?

如何将 BLE 活动继续到下一个视图控制器