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游记

秋的潇洒在啥?在啥在啥?

上传的数据在云端的怎么查看,保存在啥位置?