无法从应用程序组ios中的共享包含中读取

时间:2017-03-06 16:49:58

标签: ios iphone swift ios-app-group ios10-today-widget

我创建了一个应用程序组group.com.example.FoodTracker-qg,在应用程序的主视图控制器中我正在下载图像并存储在共享容器内但我无法在图像视图中使用相同的图像。我收到以下错误

  

致命错误:'试试!'表达式意外引发错误:错误Domain = NSCocoaErrorDomain Code = 256“无法打开文件”EC700C58-E9C9-480D-8EE2-B88A570A5728image.jpg“。 UserInfo = {NSURL = / private / var / mobile / Containers / Shared / AppGroup / EC700C58-E9C9-480D-8EE2-B88A570A5728image.jpg}:file /Library/Caches/com.apple.xbs/Sources/swiftlang/swiftlang-800.0 .63 / src / swift / stdlib / public / core / ErrorType.swift,第178行

以下是我在共享容器中撰写和阅读的代码

//  ViewController.swift


import UIKit

class ViewController: UIViewController {

    @IBOutlet weak var mealName: UILabel!
    @IBOutlet weak var imageView: UIImageView!

    override func viewDidLoad() {
        super.viewDidLoad()
        let urlString = "https://static.pexels.com/photos/3247/nature-forest-industry-rails.jpg"
        try? Data(contentsOf: URL(string: urlString)!).write(to: getSharedFileUrl("image.jpg"))
        imageView.image = UIImage(data: try! Data(contentsOf: getSharedFileUrl("image.jpg")))                  
    }

    func getSharedFileUrl(_ fileName: String) -> URL {
        let fileManager = FileManager.default
        let url = fileManager.containerURL(forSecurityApplicationGroupIdentifier: "group.com.example.FoodTracker-qg")
        return URL(string: url!.path.appending(fileName))!
    } 
}

4 个答案:

答案 0 :(得分:4)

代码似乎是正确的,您的问题可能是由于文件名本身.... 检查错误的网址

/私有的/ var /移动/容器/共享/ AppGroup / EC700C58-E9C9-480D-8EE2-B88A570A5的 728image .JPG

没有" /" ......它应该看起来像728 / image.jpg

答案 1 :(得分:1)

getSharedFileUrl(_ fileName: String) -> URL中为什么要从url解构新检索的containerURL(..只是为了创建一个新的?{/ p>

你可以这样做:

return url!.appending(fileName)

这可以解决您丢失/的问题。

我不确定我同意这些强制换行,甚至可能用Data(contentsOf: ..)来阻止主线程!

答案 2 :(得分:1)

append文件名。因此,您正在错过路径组件之间的斜杠/,因为JJAAXX44已正确精确定位。

改为使用appendingPathComponent

func getSharedFileUrl(_ fileName: String) -> URL {
    let fileManager = FileManager.default
    guard let url = fileManager.containerURL(forSecurityApplicationGroupIdentifier: "group.com.example.FoodTracker-qg")
        else {
            fatalError() // handle error appropriate to your needs instead
    }

    return url.appendingPathComponent(fileName)
}

答案 3 :(得分:0)

您的写入操作不正确。因此,您无法从共享容器中读取图像。

让appGroupIdentifier =“group.mark3”

extension Data {

    func writeToGroupContainer(filePath: String, completeHandle: @escaping (Bool, String) -> Void) {

        let url = Data.appGroupContainerURL(filePath: filePath)

        let result = FileManager.default.createFile(atPath: url.path, contents: self, attributes: nil)
        completeHandle(result, url.path)
    }

    static func appGroupContainerURL(filePath: String) -> URL {

        let fileManager = FileManager.default
        let groupURL = fileManager.containerURL(forSecurityApplicationGroupIdentifier: appGroupIdentifier)
        let url = groupURL!.appendingPathComponent(filePath)
        try? FileManager.default.createDirectory(atPath: url.deletingLastPathComponent().path, withIntermediateDirectories: true, attributes: nil)
        return url
    }

}

我们将此数据扩展到您的磁盘正确。

override func viewDidLoad() {
    super.viewDidLoad()

    let filePath = "images/group/mark3/avatar.png"
    let data: Data = UIImagePNGRepresentation(UIImage(named: "image.png")!)!
    data.writeToGroupContainer(filePath: filePath) { (done, file) in
        print(filePath, done)
    }

}