1

アプリが電話ライブラリから写真にアクセスしようとしています。iPod (5.1.something)、iPhone5 (6.1.4)、すべてのシミュレーターではうまく動作しますが、iPhone 4S(6.1.3) ではクラッシュします。

すべてのチェック (位置情報サービス、写真ライブラリへのアクセス) は、ios バージョンに関するものです。

コンソール ログ:: libMobileGestalt copySystemVersionDictionaryValue: システム バージョン ディクショナリから ReleaseType を検索できませんでした

Jul 31 12:03:00 ABC's-iPhone awdd[296]: CoreLocation: CLClient は非推奨です。すぐに廃止されます。

ところで、以下のコードは、フォト ライブラリから最後の 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");
         }

         ] ;
    }
}
4

1 に答える 1

0

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
}
于 2013-08-02T05:51:06.617 に答える