Невозможно читать из общего контейнера в группе приложений ios

Я создал группу приложений group.com.example.FoodTracker-qg. В главном контроллере представления приложения я загружаю изображение и сохраняю его в общем контейнере, но я не могу использовать то же изображение в представлении изображения. Я получаю следующую ошибку

фатальная ошибка: "попробуйте!" выражение неожиданно вызвало ошибку: Error 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))!
    } 
}

person rahulk9    schedule 06.03.2017    source источник


Ответы (4)


Код кажется правильным, ваша проблема может быть связана с самим именем файла .... проверьте URL-адрес по ошибке

/private/var/mobile/Containers/Shared/AppGroup/EC700C58-E9C9-480D-8EE2-B88A570A5<▪728image

нет "/"... это должно выглядеть как 728 / image.jpg

person Abhishek    schedule 06.03.2017
comment
Хорошо подмечено! +1 - person shallowThought; 06.03.2017

В getSharedFileUrl(_ fileName: String) -> URL зачем разбирать только что извлеченный url из containerURL(.. только для того, чтобы создать новый?

Вместо этого вы можете сделать что-то вроде этого:

return url!.appending(fileName)

Это должно решить вашу проблему с отсутствующим /.

Я не уверен, что согласен с этими принудительными переносами или даже с возможной блокировкой основного потока с помощью Data(contentsOf: ..)!

person Edgar    schedule 06.03.2017

Вы append имя файла. В результате вам не хватает косой черты / между компонентами пути, поскольку JJAAXX44 правильно определил.

Используйте appendingPathComponentinstead:

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)
}
person shallowThought    schedule 06.03.2017

Ваше действие записи неверно, поэтому вы не можете прочитать свое изображение из вашего общего контейнера.

пусть 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)
    }

}
person J. Sue    schedule 06.03.2017