AssetsLibrary: приглашение службы определения местоположения. Как Instagram избежал этого?
Я работаю в приложении, которое использует фотографии и видео в AssetsLibrary, и я просто пытаюсь раз и навсегда определить, есть ли способ спросить у пользователя разрешение на доступ к данным о местоположении для получения этих активов. Я понимаю, что данные EXIF включают информацию GPS, и это имеет для меня достаточно смысла.
Примечание: я искал через Stackru и нашел похожие вопросы, и я не пишу этот пост, просто чтобы добавить еще один в список. Я спрашиваю конкретно об одном (кажущемся) контрпримере.
При первом использовании Instagram я могу просматривать свой фотоальбом, выбирать фотографии, редактировать их и делиться ими, не обращая внимания на сервисы определения местоположения. Я получаю запрос только тогда, когда выберу кнопку "Включить геотеггинг". При проверке вкладки настроек, похоже, что если я никогда не нажму эту кнопку, Instagram даже не появится в разделе "Службы определения местоположения" в моих Настройках.
У меня вопрос, как Instagram это сходит с рук? У кого-нибудь есть идеи? Я хотел бы выяснить, смогу ли я каким-то образом имитировать их реализацию, чтобы мои пользователи не были лишены возможности получить свои ресурсы камеры, если они скажут "нет" этой подсказке.
2 ответа
Объяснение довольно простое. Instagram использует UIImagePickerController. UIImagePickerController работает без включенных служб определения местоположения, но вы не получаете данные EXIF, используя этот метод. UIImagePickerController может извлекать метаданные (включая GPS) только через UIImagePickerControllerReferenceURL. UIImagePickerControllerReferenceURL вы должны затем передать методы AssetsLibrary, которым снова нужны сервисы определения местоположения. Ура,
Хендрик
Как упомянул Холтманн, чтение 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];
}
}