2015-03-05 11 views
17

Bạn có thể làm điều đó một cách lén lút † bằng cách sử dụng thuộc tính undocumentedPHAsset.ALAssetURL, nhưng tôi đang tìm kiếm tài liệu nào đó.Cách nhận URL ALAsset từ PHAset?


† Trong Objective-C, điều này sẽ giúp

@interface PHAsset (Sneaky) 

@property (nonatomic, readonly) NSURL *ALAssetURL; 

@end 

Trả lời

36

Tạo assetURL bằng cách tận dụng các localidentifier của PHAsset. Ví dụ: PHAsset.localidentifier lợi nhuận 91B1C271-C617-49CE-A074-E391BA7F843F/L0/001

Bây giờ lấy 32 ký tự đầu tiên để xây dựng assetURL, như:

assets-library://asset/asset.JPG?id=91B1C271-C617-49CE-A074-E391BA7F843F&ext=JPG

Bạn có thể thay đổi phần mở rộng JPG tùy thuộc vào UTI của tài sản (requestImageDataForAsset trả về UTI), nhưng trong thử nghiệm của tôi, phần mở rộng của assetURL dường như bị bỏ qua dù sao đi nữa.

+0

Tốt nhất. Mối quan hệ này có được ghi chép không? Nếu không, ở đâu/làm thế nào bạn phát hiện ra điều này? Bạn có nhận thấy các chuỗi GUID giống nhau không? –

+1

Không tài liệu, tôi thấy rằng các chuỗi GUID là như nhau và nó có ý nghĩa như cả PhotoKit và AssetsLibrary làm việc với cùng một đối tượng CoreData dưới mui xe - vì vậy đây chỉ là UUID của đối tượng coredata. Tôi thích phương pháp này để sử dụng các cuộc gọi API riêng tư. – holtmann

+0

Vâng, đạo cụ. Tôi sẽ giữ một chút trên kiểm tra màu xanh lá cây cho một phản ứng tài liệu, vì đó là những gì tôi yêu cầu, nhưng điều này đã cho tôi nhiều nhẹ nhõm. Cảm ơn nhiều. –

8

Tôi cũng muốn có thể nhận URL cho nội dung. Tuy nhiên, tôi đã nhận ra rằng localIdentifier có thể được duy trì thay vào đó và được sử dụng để khôi phục PHAsset.

PHAsset* asset = [PHAsset fetchAssetsWithLocalIdentifiers:@[localIdentifier] options:nil].firstObject; 

URL tài sản Legacy có thể được chuyển đổi sử dụng:

PHAsset* legacyAsset = [PHAsset fetchAssetsWithALAssetUrls:@[assetUrl] options:nil].firstObject; 
NSString* convertedIdentifier = legacyAsset.localIdentifier; 

(trước khi phương pháp đó được lỗi thời ...)

-

(Cảm ơn holtmann localIdentifier được ẩn đi trong PHObject.)
+2

Những gì bạn đang nói _may_ là đúng, nhưng có vẻ như chỉ liên quan đến câu hỏi thực tế (tôi nghĩ, được nêu rõ). –

+0

@Xóa cầu Đúng. Tôi đoán tôi đã nhận ra rằng đã giúp tôi giải quyết vấn đề của mình và thêm câu trả lời mà không cần kiểm tra lại câu hỏi. Lấy làm tiếc. – Matt

+2

Tôi tìm thấy việc tạo ra một câu hỏi tự trả lời riêng biệt một định dạng tốt hơn cho bất kỳ việc thực hiện nào bạn thực hiện. Tôi đã thực hiện nó rất nhiều, và mặc dù những gì họ nói với bạn, vẫn chưa bị mù. :) Bạn thậm chí có thể liên kết đến câu hỏi này. –

-1

Theo thảo luận của holtmann & & Clay Bridges, tôi làm phụ thêm vào liên kết như thế này, Đây là câu trả lời trước nhưng đối với tiết kiệm thời gian tôi đăng lại

Upvote Đâylink

PHAsset *asset = self.allPhotos[indexPath.item]; 
    NSLog(@"this is local assets =%@",asset.localIdentifier); 
    NSString *localStr=asset.localIdentifier; 
    NSRange range = [localStr rangeOfString:@"/"]; 
    NSString *newString = [localStr substringToIndex:range.location]; 
    NSString *appendedString=[NSString stringWithFormat:@"%@%@%@",@"assets-library://asset/asset.JPG?id=",newString,@"&ext=JPG"]; 
    name=[NSURL URLWithString:appendedString]; 
+0

Điều này không hoạt động nói chung. Chỉ cho JPG –

+0

@PredragManojlovic lỗi nào bạn đang gặp phải? –

+0

Tác giả yêu cầu giải pháp phù hợp với mọi định dạng. Điều này giả định JPG là phần mở rộng. –

0

Dưới đây là mã làm việc thử nghiệm trên iOS 11 cả trình mô phỏng và thiết bị

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"); 
      } 
     }]; 
    }]; 
Các vấn đề liên quan