2012-01-14 76 views
0

我正在使用一个使用AssetsLibrary中的照片和视频的应用程序,并且我只是试图一劳永逸地确定是否有任何方法要求用户访问位置数据以获取这些资产的权限。我知道EXIF数据包含GPS信息,这对我来说意义重大。AssetsLibrary:位置服务提示。 Instagram如何避免它?

注意:我已经通过StackOverflow进行了搜索,并且发现了类似的问题,并且我没有将这篇文章简单地添加到列表中。我正在具体询问一个(明显的)反例。

第一次使用Instagram时,我可以浏览我的相册,选择照片,编辑它们并共享它们,而不会提示有关位置服务。当我选择点击标记为“启用地理标记”的按钮时,系统会提示我。检查设置标签,看起来好像我没有点击那个按钮,Instagram甚至不会出现在我的设置的位置服务部分。

我的问题是,Instagram如何摆脱这种情况?有人有主意吗?我想弄清楚我是否可以以某种方式模仿他们的实现,以便我们的用户在他们拒绝提示时拒绝他们的相机资产。

回答

5

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

亨德里克

0

正如holtmann提到,阅读UIImagePickerControllerReferenceURL触发位置服务提示。如果你只需要图像数据,而不是元数据,你可以从UIImagePickerControllerOriginalImage和UIImagePickerControllerEditedImage键取而代之(我先检查EditedImage,然后在EditedImage为null的情况下检查OriginalImage)。这不需要使用资产库,也不需要位置访问。

这里是我如何在我的应用程序使用此,包括保存图像的本地副本进行进一步编辑:

- (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]; 
    } 
}