ALAssetPropertyLocation не работает ни на одном iOS 4.0+ на iPhone 3gs, но отлично работает на iPhone4

У меня есть приложение с услугами определения местоположения ENABLED (из настроек и т.д.), и я читаю все фотографии с моего устройства с помощью ALAssetsLibrary.

Он отлично работает на iPhone4 iOS 4.2.1, но тот же код и те же активы DONT WORK на любых 3gs iOS (от 4.0 до 4.2.1).

Проблема заключается в том, что он всегда получает недопустимое CLLocation на 3gs.

Даже на одном и том же снимке (скопированном на обоих устройствах) на iPhone4 возвращается допустимое CLLocation, на 3gs оно возвращается недействительным! Картинное изображение само по себе действует на обоих устройствах, только CLLocation недействителен. У меня нет сбоев, и код не входит в какие-либо недопустимые блоки, все работает отлично, кроме недопустимых данных CLLocation.

Вывод одного и того же актива и того же кода и той же версии iOS (4.2.1):

iPhone4: < +51,23816667, -0,57700000 > +/- 0,00 м (скорость -1,00 м/с/курс -1,00) @19/02/2011 01:59:28 Среднее время по Гринвичу

3gs: < nan, nan > +/- 0.00m (скорость -1.00 mps/course -1.00) @2011-02-19 01:20:35 +0000

(Обратите внимание, что дата недействительного местоположения - текущее время)

Я получаю CLLocation следующим образом:

 CLLocation* location = [asset valueForProperty:ALAssetPropertyLocation];
 CLLocationCoordinate2D coord = [location coordinate];
 if ( !CLLocationCoordinate2DIsValid(coord) ) return;

Код ALAssetsLibrary, вызываемый в моем диспетчере представлений DidLoad, выглядит так (полностью стандартно):

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

 void (^assetEnumerator)(struct ALAsset *, NSUInteger, BOOL *) = ^(ALAsset *result, NSUInteger index, BOOL *stop) {
      if(result != NULL) 
      {
                [self myFunction:result withIndex:index];

      }
 };

 void (^assetGroupEnumerator)(struct ALAssetsGroup *, BOOL *) =  ^(ALAssetsGroup *group, BOOL *stop) {
      if(group != nil) 
      {
           numberOfAssets = [group numberOfAssets];
           [group enumerateAssetsUsingBlock:assetEnumerator];
      }
 };     

 [library enumerateGroupsWithTypes:ALAssetsGroupAll
                             usingBlock:assetGroupEnumerator
                           failureBlock: ^(NSError *error) {
                                NSLog(@"Oh no!"); 
                           }];     

Последнее, что в приложении для родных фотографий картинки отображаются в правильном месте на 3gs, поэтому они должны иметь эти данные где-то, это просто не читает это как-то!

Я не совсем уверен, что это проблема с устройством (3gs), обычно это никогда не...

Ответы

Ответ 1

В iOS 4.0 и выше вы можете попробовать использовать что-то вроде этого для работы с ALAset и получить данные местоположения (и многое другое) для фотоактивного ресурса, который извлекается либо путем перечисления, либо с помощью assetForURL:

ALAssetRepresentation *representation = [asset defaultRepresentation];
NSDictionary *metadata = [representation metadata];
NSDictionary *gpsDict = [metadata objectForKey:@"{GPS}"];

NSNumber *latitudeNumber = [gpsDict objectForKey:@"Latitude"];
NSString *latitudeRef = [gpsDict objectForKey:@"LatitudeRef"];

NSNumber *longitudeNumber = [gpsDict objectForKey:@"Longitude"];
NSString *longitudeRef = [gpsDict objectForKey:@"LongitudeRef"];

Широта и долгота Refs - это направления, которые вам нужно перевести в положительные (N, E) и отрицательные (S, W). Затем вы можете использовать всю эту информацию для создания простой CLLocation. Если вам нужно больше, войдите в систему или используйте отладчик, чтобы посмотреть на gpsDict (или метаданные) и посмотреть, какие ключи использовать.

Имейте в виду, что данные не всегда есть (фотографии, сделанные в режиме самолета), поэтому обязательно проверьте значения.