|
|
小胡子的日光灯 · URL 重写模块配置参考 | ...· 2 周前 · |
|
|
宽容的企鹅 · datagrip连接sql ...· 9 月前 · |
|
|
小眼睛的皮带 · Impala查询卡顿分析案例_impala ...· 2 年前 · |
|
|
酒量大的钥匙 · sqlalchemy.exc.operati ...· 2 年前 · |
|
|
开心的炒饭 · BeagleBone ...· 2 年前 · |
您可以使用
undocumented
PHAsset.ALAssetURL
属性偷偷地使用†完成此操作,但我正在寻找有文档记录的内容。
在Objective-C中使用†,这将有所帮助
@interface PHAsset (Sneaky)
@property (nonatomic, readonly) NSURL *ALAssetURL;
@end
通过利用
PHAsset
的本地标识符来创建assetURL。示例:
PHAsset.localidentifier
返回
91B1C271-C617-49CE-A074-E391BA7F843F/L0/001
现在获取构建assetURL的前32个字符,如下所示:
assets-library://asset/asset.JPG?id=91B1C271-C617-49CE-A074-E391BA7F843F&ext=JPG
您可以根据资产的UTI更改扩展
JPG
(
requestImageDataForAsset
返回UTI),但在我的测试中,assetURL的扩展似乎被忽略了。
我也希望能够获得资产的URL。然而,我已经意识到可以将
localIdentifier
持久化,并使用它来恢复
PHAsset
。
PHAsset* asset = [PHAsset fetchAssetsWithLocalIdentifiers:@[localIdentifier] options:nil].firstObject;
旧的资源URL可以使用以下方式进行转换:
PHAsset* legacyAsset = [PHAsset fetchAssetsWithALAssetUrls:@[assetUrl] options:nil].firstObject;
NSString* convertedIdentifier = legacyAsset.localIdentifier;
(在这个方法被淘汰之前...)
(感谢
holtmann
-
localIdentifier
隐藏在
PHObject
中。)
以下是在iOS 11模拟器和设备上测试的工作代码
PHFetchResult *result = [PHAsset fetchAssetsWithMediaType:PHAssetMediaTypeImage options:nil];
[result enumerateObjectsUsingBlock:^(id _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
PHAsset *asset = (PHAsset *)obj;
[asset requestContentEditingInputWithOptions:nil completionHandler:^(PHContentEditingInput * _Nullable contentEditingInput, NSDictionary * _Nonnull info) {
NSLog(@"URL:%@", contentEditingInput.fullSizeImageURL.absoluteString);
NSString* path = [contentEditingInput.fullSizeImageURL.absoluteString substringFromIndex:7];//screw all the crap of file://
NSFileManager *fileManager = [NSFileManager defaultManager];
BOOL isExist = [fileManager fileExistsAtPath:path];
if (isExist)
NSLog(@"oh yeah");
else {
NSLog(@"damn");
}];
阅读底部!
PHImageManager.requestImage
的
resultHandler
返回两个对象:
result
和
info
。
您可以使用以下命令获取
PHAsset
的原始文件名(如
IMG_1043.JPG
)及其在文件系统上的完整路径:
let url = info?["PHImageFileURLKey"] as! URL
这应该是正确的,但由于某些原因,它不能工作。所以基本上,你必须将你的图像复制到一个文件中,然后访问它,然后删除它。
PHImageFileURLKey
可用于获取原始文件名,但您无法实际访问该文件。这可能与后台代码可以访问该文件,而其他应用程序可以删除该文件的事实有关。
这是一个用Swift编写的PHAsset扩展,它将检索网址。
extension PHAsset {
func getURL(completionHandler : @escaping ((_ responseURL : URL?) -> Void)){
if self.mediaType == .image {
let options: PHContentEditingInputRequestOptions = PHContentEditingInputRequestOptions()
options.canHandleAdjustmentData = {(adjustmeta: PHAdjustmentData) -> Bool in
return true
self.requestContentEditingInput(with: options, completionHandler: {(contentEditingInput: PHContentEditingInput?, info: [AnyHashable : Any]) -> Void in
completionHandler(contentEditingInput!.fullSizeImageURL as URL?)
} else if self.mediaType == .video {
let options: PHVideoRequestOptions = PHVideoRequestOptions()
options.version = .original
PHImageManager.default().requestAVAsset(forVideo: self, options: options, resultHandler: {(asset: AVAsset?, audioMix: AVAudioMix?, info: [AnyHashable : Any]?) -> Void in
if let urlAsset = asset as? AVURLAsset {
let localVideoUrl: URL = urlAsset.url as URL
completionHandler(localVideoUrl)
} else {