从 xcassets 中的图像创建 URL 总是返回 nil

Posted

技术标签:

【中文标题】从 xcassets 中的图像创建 URL 总是返回 nil【英文标题】:Creating URL from an image in xcassets always returns nil 【发布时间】:2019-04-10 01:54:04 【问题描述】:

我正在尝试在一段时间后(例如 10 秒)发送本地通知。我想在 xcassets 的通知中添加一张图片,但 imageURL 始终是 nil

我尝试创建一个路径,然后从该路径创建一个 URL。我还尝试使用 forResource 参数 = nil 创建一个 url,以便它找到以 "png" 作为扩展名的任何图像,并且仍然 - nil

    let content = UNMutableNotificationContent()
    content.title = "Notification title"
    content.subtitle = "notification subtitle"
    content.body = "notification body"
    let imageName = "delete"
    guard let imageURL = Bundle.main.url(forResource: imageName, withExtension: "png") else return
    let attachment = try! UNNotificationAttachment(identifier: imageName, url: imageURL, options: .none)
    content.attachments = [attachment]
    let trigger = UNTimeIntervalNotificationTrigger(timeInterval: 10, repeats: false)
    let request = UNNotificationRequest(identifier: "notification.id.01", content: content, trigger: trigger)
    UNUserNotificationCenter.current().add(request, withCompletionHandler: nil)

我已添加 print 语句以查看会发生什么,并且我已确认我的方法在 guard 语句处返回。

【问题讨论】:

查看已构建应用的 .app 内部。顶层有delete.png吗?如果不是,那么这就是为什么你会得到 nilimageURL 您可能会发现这很有用:Is There A Better Way To Use An Image From Assets.xcassets In A Notification Attachment Than This? 【参考方案1】:

图像可以位于以下两个位置之一:资产目录或捆绑包。

当你说

guard let imageURL = Bundle.main.url(forResource: imageName, withExtension: "png") else return

您正在寻找捆绑包中的图像。

但是你自己告诉我们,那不是图像所在的地方!它在资产目录中。

这就是为什么在捆绑包中查找它失败的原因。它不存在。

【讨论】:

如何使用 xcassets 中的图像创建 URL? 你不会的。如果您需要传递 URL,请将图像保存在包中。或者,您可以将其从资产目录中拉出并将其保存在磁盘上并传递该 URL。【参考方案2】:

添加到马特的答案顶部,不能直接从 xcassets 中获取 UNNotification 的图像附件。如果要添加任何附件,必须先将其转换为文件 URL。

更多详情请看这篇帖子:UNNotificationAttachment with UIImage or Remote URL

【讨论】:

以上是关于从 xcassets 中的图像创建 URL 总是返回 nil的主要内容,如果未能解决你的问题,请参考以下文章

无法从 CocoaPods 中的 .xcasset 加载图像

xcassets 中的所有图像,然后如何加载从我的包中的 nib 引用的图像

从 Xcode Swift 中 Assets.xcassets 中的文件夹访问图像

通过代码从 xcassets 更改图像的内容

从 Assets.xcassets 加载图像时 iOS 应用程序崩溃

从Images.xcassets加载图像