在iOS 8上打破的AssetsLibrary框架

Ada*_*man 19 objective-c alassetslibrary ios7 ios8 photosframework

我在iOS 8上遇到了一个问题,资产库框架似乎是iOS 8中的一个错误.如果我创建一个名为"MyMedia"的专辑然后将其删除,那么当我再次尝试创建专辑时,这个大块下面的代码返回'nil'表示专辑'MyMedia'存在,即使它没有,因为我使用'Photos'应用删除了它.

__block ALAssetsGroup *myGroup = nil;
__block BOOL addAssetDone = false;
NSString *albumName = @"MyMedia";
[assetsLib addAssetsGroupAlbumWithName:albumName
                           resultBlock:^(ALAssetsGroup *group) {
                               myGroup = group;
                               addAssetDone = true;
                           } failureBlock:^(NSError *error) {
                               NSLog( @"failed to create album: %@", albumName);
                               addAssetDone = true;
                           }];

while (!addAssetDone) {
    [[NSRunLoop currentRunLoop] runUntilDate:[NSDate dateWithTimeIntervalSinceNow:0.05f]];
}
return myGroup; // returns nil if group has previously been created and then deleted
Run Code Online (Sandbox Code Playgroud)

创建全新专辑"MyMedia2"时,此方法也适用.有没有其他人遇到此问题,并知道解决方法或解决方案?是唯一能够转移到新"照片"框架的解决方案,还是我在这里做错了什么?请注意,此代码始终适用于iOS7.X

实际上,重现此问题的步骤如下 - > 1.卸载拍摄照片的应用程序并将其保存到自定义相册2.在iOS照片下删除已保存照片的自定义相册3.安装应用程序4.如果您使用不创建它们的应用程序拍摄照片或录制视频或存储它们.如果您在iOS相册下查看,则自定义相册不存在,并且不存在使用该应用拍摄的所有照片/视频.

Ada*_*man 11

我之前的回答是不正确的.我还没有真正测试过它.我终于弄明白了要做什么,这很困难,但我得到了它的工作.这是我必须要做的就是让我的应用程序在iOS 7.xX和iOS 8.Xx上运行并创建一个以前被应用程序删除的自定义相册 - >

  1. 我编写了两个代码块:一个使用iOS 8.xx上的Photos框架,另一个使用iOS 7.xx上的AssetsLibrary框架.

  2. Sp应用程序可以在两个iOS版本上运行,我将应用程序链接到Photos框架,但随后将其从必需更改为可选,因此它不会在iOS 7.xx上加载

  3. 因为在iOS 7.xx上无法在运行时直接调用Photos框架代码,所以我必须更改它,以便在运行时动态加载类,函数(和块!)

这是在iPhone上运行时工作的代码块.这也应该在模拟器中工作 - >

// PHPhotoLibrary_class will only be non-nil on iOS 8.x.x
Class PHPhotoLibrary_class = NSClassFromString(@"PHPhotoLibrary");

if (PHPhotoLibrary_class) {

   /**
    *
    iOS 8..x. . code that has to be called dynamically at runtime and will not link on iOS 7.x.x ...

    [[PHPhotoLibrary sharedPhotoLibrary] performChanges:^{
        [PHAssetCollectionChangeRequest creationRequestForAssetCollectionWithTitle:title];
    } completionHandler:^(BOOL success, NSError *error) {
        if (!success) {
            NSLog(@"Error creating album: %@", error);
        }
    }];
    */

    // dynamic runtime code for code chunk listed above            
    id sharedPhotoLibrary = [PHPhotoLibrary_class performSelector:NSSelectorFromString(@"sharedPhotoLibrary")];

    SEL performChanges = NSSelectorFromString(@"performChanges:completionHandler:");

    NSMethodSignature *methodSig = [sharedPhotoLibrary methodSignatureForSelector:performChanges];

    NSInvocation* inv = [NSInvocation invocationWithMethodSignature:methodSig];
    [inv setTarget:sharedPhotoLibrary];
    [inv setSelector:performChanges];

    void(^firstBlock)() = ^void() {
        Class PHAssetCollectionChangeRequest_class = NSClassFromString(@"PHAssetCollectionChangeRequest");
        SEL creationRequestForAssetCollectionWithTitle = NSSelectorFromString(@"creationRequestForAssetCollectionWithTitle:");
        [PHAssetCollectionChangeRequest_class performSelector:creationRequestForAssetCollectionWithTitle withObject:albumName];

    };

    void (^secondBlock)(BOOL success, NSError *error) = ^void(BOOL success, NSError *error) {
       if (success) {
           [assetsLib enumerateGroupsWithTypes:ALAssetsGroupAlbum usingBlock:^(ALAssetsGroup *group, BOOL *stop) {
               if (group) {
                   NSString *name = [group valueForProperty:ALAssetsGroupPropertyName];
                   if ([albumName isEqualToString:name]) {
                       groupFound = true;
                       handler(group, nil);
                   }
               }
           } failureBlock:^(NSError *error) {
               handler(nil, error);
           }];
       }

       if (error) {
           NSLog(@"Error creating album: %@", error);
           handler(nil, error);
       }
   };

   // Set the success and failure blocks.
   [inv setArgument:&firstBlock atIndex:2];
   [inv setArgument:&secondBlock atIndex:3];

   [inv invoke];

}
else {   
   // code that always creates an album on iOS 7.x.x but fails
   // in certain situations such as if album has been deleted
   // previously on iOS 8...x. .              
   [assetsLib addAssetsGroupAlbumWithName:albumName
       resultBlock:^(ALAssetsGroup *group) {
       handler(group, nil);
   } failureBlock:^(NSError *error) {
       NSLog( @"Failed to create album: %@", albumName);
       handler(nil, error);
   }];
}
Run Code Online (Sandbox Code Playgroud)

  • @ChiragPipaliya也许你可以试试lib:https://github.com/Kjuly/ALAssetsLibrary-CustomPhotoAlbum.Adam已经为iOS 8合并了这个修复程序.:) (2认同)

Ada*_*man 1

只是想更新大家,我应该早点更新,但我有点忙于工作。此问题是/曾经是 iOS 8 的问题,但已在 iOS 8.0.2 中修复,因此您只需将 iOS 更新到 iOS 8.0.2 即可修复此问题