我正在使用一个使用AssetsLibrary中的照片和视频的应用程序,我只是试图一劳永逸地确定是否有任何方法要求用户获取访问位置数据的权限以获取这些资产。我知道EXIF数据包含GPS信息,这对我来说足够了。
注意:我已经通过StackOverflow进行了搜索,我发现了类似的问题,我并不是简单地将这个帖子添加到列表中。我特别询问一个(明显的)反例。
第一次使用Instagram时,我可以浏览我的相册,选择照片,编辑它们并分享它们,而不会被提示有关位置服务的信息。当我选择单击标记为“启用地理标记”的按钮时,系统仅提示我。检查设置选项卡,看起来如果我没有点击该按钮,Instagram甚至没有出现在我的设置的位置服务部分。
我的问题是,Instagram是如何逃脱这一点的?有人有主意吗?我想知道我是否能够以某种方式模仿他们的实现,以便我的用户不会因为他们拒绝这个提示而拒绝获取他们的相机资产。
答案 0 :(得分:5)
解释很简单。 Instagram使用UIImagePickerController。 UIImagePickerController在没有启用位置服务的情况下工作,但是您没有使用此方法获取EXIF数据。 UIImagePickerController只能通过UIImagePickerControllerReferenceURL检索元数据(包括GPS)。 UIImagePickerControllerReferenceURL您必须传递AssetsLibrary方法,这需要再次启用位置服务。 欢呼声,
亨德里克
答案 1 :(得分:0)
正如holtmann所提到的,读取UIImagePickerControllerReferenceURL会触发位置服务提示。如果你只需要图像数据而不是元数据,你可以从UIImagePickerControllerOriginalImage和UIImagePickerControllerEditedImage键获得它(我先检查EditedImage,然后检查OriginalImage,如果EditedImage为null)。这不需要使用资产库,也不需要位置访问。
以下是我在我的应用中使用此功能的方法,包括保存图像的本地副本以供进一步编辑:
- (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];
}
}