0

我正在开发一个使用 AssetsLibrary 中的照片和视频的应用程序,我只是想一劳永逸地确定是否有任何方法可以请求用户访问位置数据的权限以获取这些资产。我知道 EXIF 数据包括 GPS 信息,这对我来说很有意义。

注意:我在 StackOverflow 上进行了搜索,发现了类似的问题,我发这篇文章并不是为了在列表中再添加一个。我特别询问一个(明显的)反例。

第一次使用 Instagram 时,我可以浏览我的相册、选择照片、编辑它们并分享它们,而无需提示位置服务。只有当我选择单击标有“启用地理标记”的按钮时才会提示我。检查设置选项卡,看起来如果我不点击那个按钮,Instagram 甚至不会出现在我的设置的位置服务部分。

我的问题是,Instagram 是如何解决这个问题的?有人有想法么?我想知道我是否可以以某种方式模仿他们的实现,这样如果我的用户对这个提示说不,他们就不会被拒绝获取他们的相机资产。

4

2 回答 2

5

解释很简单。Instagram 使用 UIImagePickerController。UIImagePickerController 在没有启用位置服务的情况下工作,但您不会使用此方法获取 EXIF 数据。UIImagePickerController 只能通过 UIImagePickerControllerReferenceURL 检索元数据(包括 GPS)。UIImagePickerControllerReferenceURL 你必须通过 AssetsLibrary 方法,这需要再次启用位置服务。干杯,

亨德里克

于 2012-01-16T11:26:14.057 回答
0

正如 holtmann 提到的,读取 UIImagePickerControllerReferenceURL 会触发位置服务提示。如果您只需要图像数据,而不需要元数据,则可以从 UIImagePickerControllerOriginalImage 和 UIImagePickerControllerEditedImage 键获取它(我先检查 EditedImage,然后检查 OriginalImage 如果 EditedImage 为空)。这不需要使用资产库,也不需要位置访问。

这是我在我的应用程序中使用它的方式,包括保存图像的本地副本以供进一步编辑:

- (void)imagePickerController:(UIImagePickerController *)controller didFinishPickingMediaWithInfo:(NSDictionary *)info {
    // get the selected photo as a UIImage
    UIImage *photo = [info objectForKey:@"UIImagePickerControllerEditedImage"];
    if (!photo) {
        photo = [info objectForKey:@"UIImagePickerControllerOriginalImage"];
    }

    // save the photo to the app's Documents folder
    if (photo) {
        NSString *extension = @"jpg";
        NSString *filename = [NSString stringWithFormat:@"%@.%@", self.defaultTitle, extension]; // self.defaultTitle is defined elsewhere in my app
        NSString *path = [[NSHomeDirectory() stringByAppendingPathComponent:@"Documents"] stringByAppendingPathComponent:filename];
        [UIImageJPEGRepresentation(photo, 0.8) writeToFile:path atomically:YES];
    }
}
于 2012-05-30T17:56:56.707 回答