21

PHAsset を使用して元のファイル名を取得する方法はありますか?

次のコードを使用して、ファイル情報を抽出します。

   [[PHImageManager defaultManager] requestImageDataForAsset:asset options:requestOption resultHandler:^(NSData *imageData, NSString *dataUTI, UIImageOrientation orientation, NSDictionary *info) {
    entity.fileUrl =  [info objectForKey:@"PHImageFileURLKey"];
    entity.filename = [[NSFileManager defaultManager] displayNameAtPath:[ entity.fileUrl path]];
   }];

ただし、元の名前は返されませんが、「img_123」という形式の名前が返されます。公式のアップルドキュメントを確認したところです。iOS 9 以降で使用できる新しいクラスPHAssetResource とプロパティが導入されました。問題は、Photos フレームワークに基づくoriginalFilename画像ピッカー ライブラリCTAssetsPickerControllerを使用していることです。PHAsset選択した画像をオブジェクトとして返します。PS。iOS 8と互換性のあるソリューションを探しています:)。ありがとうございました!

4

4 に答える 4

44

iOS 8では、あなたのソリューションはファイル名を取得するための正しい(そして唯一のアプローチ)です。

iOS 9 では次のように動作します。

NSArray *resources = [PHAssetResource assetResourcesForAsset:asset];
NSString *orgFilename = ((PHAssetResource*)resources[0]).originalFilename;
于 2015-09-21T23:43:14.960 に答える
7

意味のない名前が返されるようになったため、コードを変更する必要がありました。私の解決策は、アセットの mediaType とリソースのタイプに基づいてリソースを選択することでしたが、もっと簡単な方法があるかもしれません:

extension PHAsset {
    var primaryResource: PHAssetResource? {
        let types: Set<PHAssetResourceType>

        switch mediaType {
        case .video:
            types = [.video, .fullSizeVideo]
        case .image:
            types = [.photo, .fullSizePhoto]
        case .audio:
            types = [.audio]
        case .unknown:
            types = []
        @unknown default:
            types = []
        }

        let resources = PHAssetResource.assetResources(for: self)
        let resource = resources.first { types.contains($0.type)}

        return resource ?? resources.first
    }

    var originalFilename: String {
        guard let result = primaryResource else {
            return "file"
        }

        return result.originalFilename
    }
}
于 2019-12-02T11:32:56.667 に答える
3

メソッドを使用できるかもしれませんが、iOS8 以上で動作します。

 [asset requestContentEditingInputWithOptions:options completionHandler:^(PHContentEditingInput *contentEditingInput, NSDictionary *info) {

    CIImage *fullImage = [CIImage imageWithContentsOfURL:contentEditingInput.fullSizeImageURL];
    NSLog(@"%@",contentEditingInput.fullSizeImageURL);//get url
    NSLog(@"%@", fullImage.properties.description);//get {TIFF}, {Exif}
}];
于 2016-03-08T15:00:25.733 に答える