ALAssetPropertyLocation не работает на любой iOS 4.0+ на iPhone 3gs, но отлично работает на iPhone4 - PullRequest
14 голосов
/ 19 февраля 2011

У меня есть приложение с включенными службами определения местоположения (из настроек и т. Д.), И я читаю все фотографии с моего устройства, используя 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, вызываемый в моем viewcontroller 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 Ответ

1 голос
/ 10 ноября 2012

В 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 (или метаданные) и посмотреть, какие ключи использовать.

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

...