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

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

Он отлично работает на iPhone4 iOS 4.2.1, но тот же код и те же ресурсы НЕ РАБОТАЮТ на любых 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: +/- 0.00m (скорость -1.00 mps / курс -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 и более поздних версиях вы можете попробовать использовать что-то подобное для работы с ALAsset и получения данных о местоположении (и более) для актива фотографии, который извлекается путем перечисления или использования 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"];

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

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

Другие вопросы по тегам