【问题标题】:setImageData fails in iOS 8.3setImageData 在 iOS 8.3 中失败
【发布时间】:2015-04-15 10:43:47
【问题描述】:

我正在使用 setImageData 通过以下方式删除照片:

[asset setImageData:nil metadata:nil completionBlock:^(NSURL *assetURL, NSError *error)
{
    // Do something
}];

此代码在 iOS 8.2 及更早版本中运行良好。

但是,在 8.3 中它给出了错误:

@"Error Domain=ALAssetsLibraryErrorDomain Code=-3311 \"User denied access\" UserInfo=0x175061ac0 {NSLocalizedFailureReason=用户拒绝应用程序访问他们的媒体。, NSLocalizedDescription=用户拒绝访问, NSUnderlyingError=0x17025d700 \"The操作无法完成。 (ALAssetsLibraryErrorDomain 错误 -3311。)\”}”

我尝试用一​​些有效的图像数据而不是“nil”替换图像数据和元数据字段。还是一样的错误!!

这是 iOS 8.3 中的一些错误吗?有什么解决办法吗?

感谢期待。

另一个重要信息:

[PHPhotoLibrary 授权状态] 返回“PHAuthorizationStatusAuthorized”。 [ALAssetsLibrary authorizationStatus] 还返回“ALAuthorizationStatusAuthorized”。

【问题讨论】:

    标签: ios


    【解决方案1】:

    据我所知,setImageData 方法从未打算用作删除资产的方法。有可能在 iOS 8.3 Apple 上进行了修补,所以这不再有效。

    我建议您考虑使用包含用于删除资产的专用方法的照片框架。 这是一个例子:

    -(void)deleteAssetWithURL:(NSString*)assetURLString
    {
        NSURL *assetURL = [NSURL URLWithString:assetURLString];
        if (assetURL == nil)
        {
            return;
        }
    
        PHFetchResult *result = [PHAsset fetchAssetsWithALAssetURLs:@[assetURL] options:nil];
        if (result.count > 0)
        {
            PHAsset *phAsset = result.firstObject;
            if ((phAsset != nil) && ([phAsset canPerformEditOperation:PHAssetEditOperationDelete]))
            {
                [[PHPhotoLibrary sharedPhotoLibrary] performChanges:^
                {
                    [PHAssetChangeRequest deleteAssets:@[phAsset]];
                }
                                                  completionHandler:^(BOOL success, NSError *error)
                 {
                     if ((!success) && (error != nil))
                     {
                         NSLog(@"Error deleting asset: %@", [error description]);
                     }
                 }];
            }
        }
    }
    

    使用 Photos 框架时,不要忘记在目标中链接 Photos.framework 并在源文件中导入标头:#import <Photos/Photos.h>

    【讨论】:

    • 很棒的答案。还应该提到你需要#import
    【解决方案2】:

    我有类似的问题,但也无法解决。我认为这是 AssetsLibrary 8.3 中的一个错误,建议您像我一样向 Apple 提交错误报告:

    Can't edit photo metadata using AssetsLibrary in iOS 8.3 (worked in 8.2)

    【讨论】:

      【解决方案3】:

      用户拒绝应用程序访问他们的媒体

      这解释了您出现错误的原因。就系统而言,您无权访问照片库。

      您需要查看授权状态并在需要时请求,如Apple Doc's中所示

      你需要这样的东西:

      if([PHPhotoLibrary authorizationStatus] != PHAuthorizationStatus.PHAuthorizationStatusAuthorized){  
         [PHPhotoLibrary requestAuthorization:^(PHAuthorizationStatus status)
         {
            if (status != PHAuthorizationStatus.PHAuthorizationStatusAuthorized)
            {
              //Fail
            }
            else
            {
              //SetImageData
            }
         }
      }
      

      【讨论】:

      • 我在我的代码中检查了 [PHPhotoLibrary authorizationStatus]。它给出:“PHAuthorizationStatusAuthorized”。 [ALAssetsLibrary authorizationStatus] 也给出“ALAuthorizationStatusAuthorized”。请注意,相同的代码,没有任何更改,在 8.2 中运行得非常好!!所以,这与从 8.2 到 8.3 的变化有关!!!
      • 授权查看相同的设置属性。您是否检查过该资产是否“可编辑”虽然我看不出为什么这不适用于 8.3 但适用于 8.2。应该指出的是,AssetLibrary 很可能会在未来的版本中被弃用,而不是 PhotoKit 框架
      • 是的。在尝试删除资产之前,我已检查“可编辑”属性。
      猜你喜欢
      • 1970-01-01
      • 2015-06-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-06-14
      • 2015-11-19
      • 1970-01-01
      • 2019-03-06
      相关资源
      最近更新 更多