Проблемы с CGImageDestinationCreateWithURL

Я использую CGImageDestinationCreateWithURL для сохранения изображения в формате gif, вот код, который у меня есть:

func gifFromImages(images: Array<UIImage>, animationTime: Double) -> String? {
        let date = Int(NSDate().timeIntervalSince1970)

        let path = Bundle.main.bundlePath + "/gifs/" + String(date) + ".gif"        

        let delay = animationTime / Double(totalFrames)

        let prep = [kCGImagePropertyGIFDictionary as String :
               [kCGImagePropertyGIFDelayTime as String : delay]] as CFDictionary

        let fileProperties = [ kCGImagePropertyGIFDictionary as String : 
                               [kCGImagePropertyGIFLoopCount as String : 0] ,
                               kCGImageMetadataShouldExcludeGPS as String: true]
                               as CFDictionary

        let url = URL(fileURLWithPath: path) as CFURL

        guard let destination = CGImageDestinationCreateWithURL(url, kUTTypeGIF, 
                                images.count, nil) else {
                return nil
        }

        CGImageDestinationSetProperties(destination, fileProperties)

        for image in images {
            if let cgImage = image.cgImage {
                CGImageDestinationAddImage(destination, cgImage, prep)
            }
        }

        if CGImageDestinationFinalize(destination) {
            return path
        }

        return nil
    }

Проблема, с которой я сталкиваюсь, заключается в том, что когда я пробую этот код на симуляторе, он работает нормально и создает нужный мне файл, но когда я запускаю его на устройстве, CGImageDestinationCreateWithURL возвращает nil. Моя первая мысль заключается в том, что путь к файлу неправильный, я посмотрел в Интернете и пытаюсь использовать следующие пути / URL-адреса:

let path = Bundle.main.bundlePath + "/gifs/" + String(date) + ".gif"

let path = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true).last!.appending("/gifs/\(String(date)).gif")

let path = NSString(string: "~/gifs/\(String(date)).gif").expandingTildeInPath

let url = try FileManager.default.url(for: .documentDirectory, in: .userDomainMask, appropriateFor: nil, create: true) as CFURL

И когда я попытался использовать URL-адрес (строка: путь) вместо URL-адреса (файлURLWithPath:), я получил следующую ошибку:

: CGDataConsumer(url_close): ошибка записи.

Любые идеи о том, что может происходить? Какой путь я должен использовать?


person Rodrigo Gonzalez    schedule 04.04.2017    source источник
comment
Пакет приложения доступен только для чтения на реальных устройствах.   -  person rmaddy    schedule 04.04.2017
comment
Вы знаете, где я могу хранить изображение, которое я создаю?   -  person Rodrigo Gonzalez    schedule 04.04.2017
comment
Если это временно, используйте папку Caches. Если это более постоянно, используйте папку «Документы».   -  person rmaddy    schedule 04.04.2017
comment
@RodrigoGonzalez developer.apple.com/library/ содержание/документация/   -  person Leo Dabus    schedule 04.04.2017


Ответы (1)


Я отвечу на этот вопрос на случай, если кто-то еще вступит в эту проблему. После некоторых исследований и использования информации в комментариях я нашел решение. В итоге я использовал:

let path = NSSearchPathForDirectoriesInDomains(.documentDirectory,
           .userDomainMask, true).last?.appending("/\(String(date)).gif")

Проблема с моим первым решением заключалась в том, что оно добавляло папку после каталога документов и имени файла.

person Rodrigo Gonzalez    schedule 04.04.2017