ALAssetsLibrary assetForURL:对于iOS 8.1中"我的照片流"中的照片,总是返回nil

tab*_*ber 25 ios alasset alassetslibrary ios8.1

此代码在iOS 7中运行良好,但在iOS 8.1中,位于"我的照片流"专辑中的所有资源都不在结果块中.(未调用failureBlock.)常规专辑和共享专辑可以正常工作.

我尝试了接受的答案:尝试从assetForURL内部分配__block ALAsset时出错:resultBlock:

也就是说,我持有对ALAssetsLibrary对象的引用,监听ALAssetsLibraryChangedNotification事件(这不会发生顺便,但是很好.)我确保我的应用程序有权访问照片,我在wi-fi上,我在tableView中看到照片的缩略图很好.只是当我尝试加载它们时,assetForURL:它们总是为零.

// 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!");
}];
Run Code Online (Sandbox Code Playgroud)

还有其他人看到这个问题吗?

And*_*sev 30

我有同样的问题.此刻切换到Photos框架对我来说不是一个选项,但幸运的是我找到了一个解决方法.你可能会发现它很难看,我怀疑当Photo Stream包含大量照片时它可能会很慢,但它总比没有好.

我们的想法是枚举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();
        }
  ];
}
Run Code Online (Sandbox Code Playgroud)

希望这可以帮助.

  • 虽然不理想,但这确实可以解决问题,多亏了!不要过于挑剔,但看起来`item.url`应该只是'url`正确吗?我们可能需要调用在ALAsset中传递的成功块.再次感谢! (3认同)