ALAssetPropertyLocation 在 3gs iPhone 上无法在任何 iOS 4.0+ 上运行,但在 iPhone4 上完美运行
Posted
技术标签:
【中文标题】ALAssetPropertyLocation 在 3gs iPhone 上无法在任何 iOS 4.0+ 上运行,但在 iPhone4 上完美运行【英文标题】:ALAssetPropertyLocation not working on any iOS 4.0+ on 3gs iPhones but working perfectly on iPhone4 【发布时间】:2011-06-30 08:05:11 【问题描述】:我有一个启用了位置服务的应用程序(通过设置等),我正在使用 ALAssetsLibrary 从我的设备读取所有照片。
它在 iPhone4 ios 4.2.1 上完美运行,但相同的代码和相同的资产不能在任何 3gs 任何 iOS(从 4.0 到 4.2.1)上运行。
问题是它总是在 3gs 上检索一个无效的 CLLocation。
即使在同一张图片上(在两个设备上复制)在 iPhone4 上返回一个有效的 CLLocation,在 3gs 上它返回无效! 图片图像本身在两个设备上都有效,只有 CLLocation 无效。我没有任何崩溃,代码也没有进入任何无效块,除了无效的 CLLocation 数据之外,它都可以正常工作。
相同资产和相同代码以及相同iOS版本(4.2.1)的输出:
iPhone4: +/- 0.00m(速度 -1.00 mps / 路线 -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;
在我的视图控制器 DidLoad 中调用的 ALAssetsLibrary 代码如下所示(完全标准):
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)问题,通常它永远不会......
【问题讨论】:
你解决过这个问题吗?如果是,请发布带有正确信息的答案,因为我遇到了同样的问题。谢谢! 我什至没有在 iPhone 4 或 iPad 3rd gen 上看到 ALAssetPropertyLocation 元数据,这也是启用了定位服务(在相关应用程序和相机应用程序中)。我拍了照片,查看了元数据,EXIF 在那里,但其他的不多。 尝试将简化示例发布到 bugreport.apple.com。在这种情况下,它们通常很有帮助。 【参考方案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(或元数据)并查看要使用的密钥。
请记住,数据并不总是存在(在飞行模式下拍摄的照片),因此请务必检查值。
【讨论】:
这似乎在 iOS 7 中现在不起作用,即使我的相机启用了定位服务。从资产库导入的照片在其元数据字典中似乎不包含“GPS”条目。有人知道为什么会这样吗?以上是关于ALAssetPropertyLocation 在 3gs iPhone 上无法在任何 iOS 4.0+ 上运行,但在 iPhone4 上完美运行的主要内容,如果未能解决你的问题,请参考以下文章
ALAsset valueForProperty:ALAssetPropertyLocation 返回 null
ALAssetPropertyLocation 在 3gs iPhone 上无法在任何 iOS 4.0+ 上运行,但在 iPhone4 上完美运行
NOIP 2015 & SDOI 2016 Round1 & CTSC 2016 & SDOI2016 Round2游记