从 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
吗?如果不是,那么这就是为什么你会得到 nil
为 imageURL
。
您可能会发现这很有用: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 中的文件夹访问图像