我可以从XCAssets包中获取NSURL吗?

我正处于从邮件中列出附件的情况。 每个附件都有一个与之关联的NSURL,表示附件数据的path。 在非图像附件的情况下,我想加载预先生成的图标缩略图的地方预览(即Excel文档,PDF,单词等)。

我目前有这些图像在我的项目,在一个XCAssets包。 我可以得到他们使用[UIImage imageNamed:@"someName"] 。 我似乎无法通过NSBundle的各种资源查找方法得到他们。 XCAssets软件包是否以某种方式更改了我正在查找的图标图像的文件名?

这是我目前正在使用的代码。 path每次都是零。 在这种情况下,我是否需要不使用XCAssets?

 + (NSURL *)mediaURLWithMessage:(SRMediaMessage*)message { NSURL *url = message.mediaURL; // if this is an image URL or non-existant, there is no work left to do, return it. if (!url || (message.secureFile.secureFileMimeType & SRSecureFileMimeTypeImage)) return url; NSString *filename = @"unknown"; switch (message.secureFile.secureFileMimeType) { case SRSecureFileMimeTypeDOC: filename = @"doc"; break; case SRSecureFileMimeTypePPT: filename = @"ppt"; break; case SRSecureFileMimeTypePDF: filename = @"pdf"; break; case SRSecureFileMimeTypeXLS: filename = @"exl"; break; case SRSecureFileMimeTypeCSV: filename = @"csv"; break; case SRSecureFileMimeTypeTXT: filename = @"txt"; break; case SRSecureFileMimeTypeRTX: filename = @"rtf"; break; default: case SRSecureFileMimeTypeMP4: // unknown icon for now. break; // unused but available: // @"ilife" } NSString *path = [[NSBundle mainBundle] pathForResource:filename ofType:nil]; if (path) url = [NSURL fileURLWithPath:path]; return url; } 

如果您的目标是iOS 7+,则Xcode 5现在将这些资产转换为新的文件格式。 1文件的所有资产。 这意味着你不能直接访问文件。

如果您需要直接访问该文件,则可以将其作为资产目录之外的普通图像进行包含。

我想访问一些vector资源来创buildUNNotificationAttachment与本地资源,所以我想出了这个助手类。 它基本上只是从资产获取图像,将其数据保存到磁盘并返回文件的URL。 我希望能帮助别人。

 import UIKit class AssetExtractor { static func createLocalUrl(forImageNamed name: String) -> URL? { let fileManager = FileManager.default let cacheDirectory = fileManager.urls(for: .cachesDirectory, in: .userDomainMask)[0] let url = cacheDirectory.appendingPathComponent("\(name).png") guard fileManager.fileExists(atPath: url.path) else { guard let image = UIImage(named: name), let data = UIImagePNGRepresentation(image) else { return nil } fileManager.createFile(atPath: url.path, contents: data, attributes: nil) return url } return url } } 

@tadija的 Swift 3Swift 2.3版本的答案 :

Swift 3

 import UIKit class AssetExtractor { static func createLocalUrl(forImageNamed name: String) -> URL? { let fileManager = FileManager.default let cacheDirectory = fileManager.urls(for: .cachesDirectory, in: .userDomainMask)[0] let url = cacheDirectory.appendingPathComponent("\(name).png") let path = url.path guard fileManager.fileExists(atPath: path) else { guard let image = UIImage(named: name), let data = UIImagePNGRepresentation(image) else { return nil } fileManager.createFile(atPath: path, contents: data, attributes: nil) return url } return url } } 

Swift 2.3

 import UIKit class AssetExtractor { static func createLocalUrl(forImageNamed name: String) -> NSURL? { let fileManager = NSFileManager.defaultManager() let cacheDirectory = fileManager.URLsForDirectory(.CachesDirectory, inDomains: .UserDomainMask)[0] guard let url = cacheDirectory.URLByAppendingPathComponent("\(name).png"), let path = url.path else { return nil } guard fileManager.fileExistsAtPath(path) else { guard let image = UIImage(named: name), let data = UIImagePNGRepresentation(image) else { return nil } fileManager.createFileAtPath(path, contents: data, attributes: nil) return url } return url } } 

Swift 3.x

 static func createLocalUrl(forImageNamed name: String) -> URL? { let fileManager = FileManager.default let cacheDirectory = fileManager.urls(for: .cachesDirectory, in: .userDomainMask)[0] let url = cacheDirectory.appendingPathComponent("\(name).png") let path = url.path guard fileManager.fileExists(atPath: path) else { guard let image = UIImage(named: name), let data = UIImagePNGRepresentation(image) else { return nil } fileManager.createFile(atPath: path, contents: data, attributes: nil) return url } return url }