代码之家  ›  专栏  ›  技术社区  ›  user3069232

尝试与活动视图控制器共享文件中的json字符串

  •  -2
  • user3069232  · 技术社区  · 6 年前

    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)
                }
            }
        }
    

    我收到错误消息:

    文件:///var/mobile/containers/data/application/fd6e9f52-405f-4e66-927f-dcb7edb0bf25/documents/blah.json

    确认URL可读时出现附件错误

    很确定文件在那里?这可能是某种种族危险吗?如果我用jsonstring替换url,它就会工作!所以我得到的jsonstring基本上是这样的。

    [{{“ImageURL”:“http://”,“纬度”:46.819999494949499090176,“姓名”:“姓名”:“线索1”,“经度”:8.25811711711711031034376599,“提示”:“提示”},{“ImageURL”:“http://”,“纬度”:47.433033703706767679716,“姓名”:“姓名”:“线索2”,“经度”:8.8540648624492492492929292929242424245371,“提示”:“提示”:“提示”},{“纬度”:46.785125219219219219219263776,“姓名”:“姓名”:“线索”,“经经度”:9.653434343434346734341997494949494949757575755998,“经度”:8.252581171171171103103“}]

    2 回复  |  直到 6 年前
        1
  •  0
  •   Will Jones    6 年前

    是否需要将此另存为文件?

    当然,最简单的方法是将json字符串作为变量传递吗?

    例子:

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

    编辑

    我刚刚注意到你已经试过了,而且很有效。道歉。

    确保 JSONEncoder 不是抛出异常,而是在尝试将URL传递到 UIActivityViewController

    您也可以尝试使用 UIActivityItemProvider 按记录分类 here

        2
  •  0
  •   user3069232    6 年前

    好吧,找到答案当然是显而易见的!文件没有被创建!

    我做了两个修改,第一个是在主线程下运行整个代码块,第二个是修改了写入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)
                    }
    
            }
        }
    }