25

このコードは iOS 7 では問題なく動作しましたが、iOS 8.1 では、「マイ フォト ストリーム」アルバムにあるすべてのアセットが結果ブロック内から nil になります。(failureBlock は呼び出されません。) 通常のアルバムと共有アルバムは正常に機能します。

私は受け入れられた答えを試しました:AssetForURL:resultBlock内から__block ALAssetを割り当てようとしてエラーが発生しました:

つまり、ALAssetsLibrary オブジェクトへの参照を保持し、ALAssetsLibraryChangedNotificationイベントをリッスンしています (これは発生しませんが、まあまあです)。アプリに写真へのアクセス許可があることを確認しました。Wi-Fi を使用しています。 tableView で写真のサムネイルが問題なく表示されます。それらをロードしようとするとassetForURL:、常にnilになります。

// example URL: assets-library://asset/asset.JPG?id=1ECB69B9-DC7A-45A7-B135-F43317D3412C&ext=JPG
[self.library assetForURL:[NSURL URLWithString:url] resultBlock:^(ALAsset *asset) {
    NSLog(@"Asset: %@", asset); // nil :(
} failureBlock:^(NSError *error) {
    NSLog(@"Failure, wahhh!");
}];

他の誰かがこの問題を見ていますか?

4

5 に答える 5

30

私も同じ問題を抱えていました。現時点では、Photos フレームワークに切り替えることはできませんが、幸いなことに回避策を見つけました。Photo Stream に大量の写真が含まれていると動作が遅くなる可能性がありますが、何もないよりはましです。

アイデアは、フォト ストリーム アセット グループ内のすべてのアイテムを列挙し、必要な URL を各アイテムの URL と比較することです。幸いなことに、それはまだ機能します。

私はこのようなメソッドを持っています (ライブラリは同じクラスの ALAssetsLibrary プロパティです。このコード内で初期化する必要があるかもしれません):

- (void)loadItem:(NSURL *)url withSuccessBlock:(void (^)(void))successBlock andFailureBlock:(void (^)(void))failureBlock {

[library assetForURL:url
        resultBlock:^(ALAsset *asset)
        {
            if (asset){
                //////////////////////////////////////////////////////
                // SUCCESS POINT #1 - asset is what we are looking for 
                //////////////////////////////////////////////////////
                successBlock();
            }
            else {
                // On iOS 8.1 [library assetForUrl] Photo Streams always returns nil. Try to obtain it in an alternative way

                [library enumerateGroupsWithTypes:ALAssetsGroupPhotoStream
                                       usingBlock:^(ALAssetsGroup *group, BOOL *stop)
                 {
                     [group enumerateAssetsWithOptions:NSEnumerationReverse usingBlock:^(ALAsset *result, NSUInteger index, BOOL *stop) {
                         if([result.defaultRepresentation.url isEqual:url])
                         {
                             ///////////////////////////////////////////////////////
                             // SUCCESS POINT #2 - result is what we are looking for
                             ///////////////////////////////////////////////////////
                             successBlock();
                             *stop = YES;
                         }
                     }];
                 }

                                     failureBlock:^(NSError *error)
                 {
                     NSLog(@"Error: Cannot load asset from photo stream - %@", [error localizedDescription]);
                     failureBlock();

                 }];
            }

        }
        failureBlock:^(NSError *error)
        {
            NSLog(@"Error: Cannot load asset - %@", [error localizedDescription]);
            failureBlock();
        }
  ];
}

お役に立てれば。

于 2014-10-23T10:31:47.083 に答える
2

iOS 8.0 以降では、Apple は Assets Library フレームワークの代わりに Photos フレームワークを使用することを提案しています。

ここに画像の説明を入力

于 2014-10-21T06:56:20.013 に答える
1

iOS 8.1 の iPad mini でテスト済み。これは、新しいPhotos Frameworkで行うべき方法です。

NSURL *url = /* your asset url from the old ALAsset library prior to iOS 8 */
PHFetchResult<PHAsset *> *assets = [PHAsset fetchAssetsWithALAssetURLs:@[url]
                                                               options:nil];
assert(assets.count == 1);
PHAsset *asset = assets.firstObject;

[[PHImageManager defaultManager] requestImageForAsset:asset
                   targetSize:CGSizeMake(800, 800) // TODO: your target size
                  contentMode:PHImageContentModeDefault
                      options:nil
                resultHandler:^(UIImage * _Nullable result, NSDictionary * _Nullable info)
 {
     // Do whatever you want to the result
 }];
于 2016-02-18T16:16:56.380 に答える