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