UNNotificationAttachment无法附加图像

时间:2017-07-20 23:48:18

标签: ios swift usernotifications

因此,以下代码用于附加图像的本地存储URL中的图像。我检查Terminal以查看图像是否已存储,并且它确实存储了图像而没有任何问题。所以排除网址本身的任何问题。

do {
let attachment = try UNNotificationAttachment(identifier: imageTag, url: url, options: nil)
content.attachments = [attachment]
} catch {
print("The attachment was not loaded.")
}

与创建UserNotification一起使用的其他代码在正确的指定时间触发时工作正常。

代码总是进入catch块。任何人都可以指出我的错误,如果有任何实施。请帮忙。谢谢。

修改:print(error.localizedDescription)错误消息为Invalid attachment file URL

Edit2:print(error)错误消息为Error Domain=UNErrorDomain Code=100 "Invalid attachment file URL" UserInfo={NSLocalizedDescription=Invalid attachment file URL}

3 个答案:

答案 0 :(得分:5)

我发现了背后的真正问题。在Apple文档中写道,url应该是一个文件URL,因此您可能面临问题。

要解决此问题,我已将图像添加到临时目录,然后添加到UNNotificationAttachment

请找到以下代码。 [在我的情况下,我得到图像网址]

 extension UNNotificationAttachment {

/// Save the image to disk
static func create(imageFileIdentifier: String, data: NSData, options: [NSObject : AnyObject]?) -> UNNotificationAttachment? {
    let fileManager = FileManager.default
    let tmpSubFolderName = ProcessInfo.processInfo.globallyUniqueString
    let tmpSubFolderURL = NSURL(fileURLWithPath: NSTemporaryDirectory()).appendingPathComponent(tmpSubFolderName, isDirectory: true)

    do {
        try fileManager.createDirectory(at: tmpSubFolderURL!, withIntermediateDirectories: true, attributes: nil)
        let fileURL = tmpSubFolderURL?.appendingPathComponent(imageFileIdentifier)
        try data.write(to: fileURL!, options: [])
        let imageAttachment = try UNNotificationAttachment.init(identifier: imageFileIdentifier, url: fileURL!, options: options)
        return imageAttachment
    } catch let error {
        print("error \(error)")
    }
    return nil
}}

此函数参数中的数据是图像数据。以下是我如何称呼此方法。

let imageData = NSData(contentsOf: url)
guard let attachment = UNNotificationAttachment.create(imageFileIdentifier: "img.jpeg", data: imageData!, options: nil) else { return  }
        bestAttemptContent?.attachments = [attachment]

答案 1 :(得分:5)

我还发现了UNNotificationAttachment对象初始化的重要且很奇怪的行为。我正在发生错误:

"Invalid attachment file URL"

但并非总是如此。当我为某些通知使用相同的附件图像时,发生了这种情况。当我为每个附件制作映像的独立副本时,它从未发生过。然后我检查了应该复制图像的目录(因为我想清理它),但是我惊讶地发现没有图像。

似乎UNNotificationAttachment初始化过程正在删除给定URL上的文件。因此,当您尝试重用某些图像时,可以将其删除(可能是异步的,因为我正在检查该图像的存在,并且始终使我返回true-该文件存在)。但是UNNotificationAttachment最终出现错误,您可以在上面看到。在我看来,对此错误的唯一逻辑解释是,在UNNotificationAttachment初始化过程中,删除了给定URL的文件。

答案 2 :(得分:0)

Apple实际上在其文档(https://developer.apple.com/documentation/usernotifications/unnotificationattachment)中做了声明

UNNotificationAttachment 的Apple文档:

... 系统在显示关联的通知之前会验证附件。 ... 验证后,将附件文件移动到附件数据存储中,以便所有适当的文件都可以访问它们 流程。复制了应用程序捆绑包中的附件 而不是移动。

因此,以上答案是先将附件(图像)复制到临时位置,然后再添加为附件,这似乎是预期的解决方案。