使用 AssetLibrary 从 iPhone 获取最后 10 张照片,iOS 6.1.3 上的 Corelocation 弃用问题

Posted

技术标签:

【中文标题】使用 AssetLibrary 从 iPhone 获取最后 10 张照片,iOS 6.1.3 上的 Corelocation 弃用问题【英文标题】:Get last 10 photos from iPhone using AssetLibrary, Corelocation deprecation issue on ios 6.1.3 【发布时间】:2013-07-31 06:45:39 【问题描述】:

应用尝试访问手机库中的照片。在 ipod (5.1.something) iPhone5 (6.1.4) 上运行良好,所有模拟器,但在 iPhone 4S(6.1.3) 上崩溃。

所有检查(位置服务、照片库访问)都存在 w.r.t ios 版本。

控制台日志: : libMobileGestalt copySystemVersionDictionaryValue: 无法从系统版本字典中查找 ReleaseType

7 月 31 日 12:03:00 ABC's-iPhone awdd[296]:CoreLocation:CLClient 已弃用。很快就会过时。

BTW 下面的代码从照片库中获取最后 10 张照片。如果存在。在调用此方法之前,使用 [CLLocationManager authorizationStatus] 检查位置。

- (void) getRecentPhotos

    if(! oneTimeFetch) // to prevent location delegate from calling this method.
    
        oneTimeFetch = TRUE;

        NSLog(@"getRecentPhotos");

        recenPicScroll.userInteractionEnabled = FALSE;

        [self.recentPicsArr removeAllObjects];

        if ([[[UIDevice currentDevice] systemVersion] doubleValue] >= 6.0)
        
            NSLog(@"IOS version 6.0 and above, need to check for photo access");

            if ([ALAssetsLibrary authorizationStatus] == ALAuthorizationStatusAuthorized)
            
                NSLog(@"Photo ACCESS ALLOWED");
                // just execute the code after loop ends. Else return :).
            

            else
            
                recentPicView.hidden = TRUE;

                NSLog(@"PLEASE ALLLOW PHOTO ACCESS");

                return;
            
        

        recentPicView.hidden = FALSE;
        loadingAI.hidden = FALSE;


        ALAssetsLibrary *al = [[ALAssetsLibrary alloc] init];

        [al enumerateGroupsWithTypes:ALAssetsGroupSavedPhotos

                          usingBlock:^(ALAssetsGroup *group, BOOL *stop)
         
             [group setAssetsFilter:[ALAssetsFilter allPhotos]];

             [group enumerateAssetsUsingBlock:^(ALAsset *asset, NSUInteger index, BOOL *stop)
              
                  if([group numberOfAssets] == 0)
                  
                      recentPicView.hidden = TRUE;
                      return;
                  

                  int startIdx = [group numberOfAssets]- 10;  // Start from 10th last

                  if (asset)
                  
                      //NSLog(@"asset Index: %d",index);

                      ALAssetRepresentation *rep = [asset defaultRepresentation];

                      CGImageRef imgRef = [rep fullResolutionImage];

                      if(group.numberOfAssets > 10) // upto 10
                      
                          if(index >= startIdx)
                          
                              [self.recentPicsArr  addObject:[UIImage imageWithCGImage:imgRef]];

                              if(index == [group numberOfAssets] - 1)
                              
                                  [self addPicsToScrollV];
                              
                          
                      

                      else if (group.numberOfAssets <= 10) // get less than  10 photos
                      
                          [self.recentPicsArr  addObject:[UIImage imageWithCGImage:imgRef]];

                          if(index + 1 == group.numberOfAssets)
                          
                              [self addPicsToScrollV];
                          
                      

                      else
                      
                          recentPicView.hidden = TRUE;
                      
                  
              ];
         

        failureBlock:^(NSError *error)
         
             NSLog(@"You must allow the app to fetch your photos");
         

         ] ;
    

【问题讨论】:

jira.appcelerator.org/browse/… 我没有使用任何已弃用的方法。我必须在 plist 中插入一个键吗?链接中提到 【参考方案1】:

由于 AlAsset 库需要启用位置服务,我不能忽略位置检查。

而且由于 iOS 6.0 用户甚至可以阻止应用访问照片库,因此还需要 AssetLibrary 授权。

我的解决方案是在下面的委托中使用 [self.locMgr stopUpdatingLocation]:

- (void)locationManager:(CLLocationManager *)manager didChangeAuthorizationStatus:(CLAuthorizationStatus)status

    if(status == 1 || status == 2)
     
        NO_LOCATION_ALERT // User denied location. Don't start the activity for fetching photos
    

    else if (status == kCLAuthorizationStatusAuthorized)
    
       //Start fetching fotos
    

    else
    
        // This is for the first time, when user hasn't made any choice. So leave it blank.
    

    [self.locMgr stopUpdatingLocation];  // SOLUTION

【讨论】:

以上是关于使用 AssetLibrary 从 iPhone 获取最后 10 张照片,iOS 6.1.3 上的 Corelocation 弃用问题的主要内容,如果未能解决你的问题,请参考以下文章

从AssetLibrary获取视频流并保存到文件

AssetLibrary 不返回带有“ALAssetsGroupAll”的所有资产

从 ALAssetsLibrary 获取所有照片

IOS SwiftassetForURL错误

试图猜测 ALAssetPropertyLocation 是不是有效

我可以在测试目标中使用 ALAssetsLibrary 吗?