#reactjs #react-native #asynchronous #expo #use-effect
#reactjs #react-native #асинхронный #выставка #использование-эффект
Вопрос:
Я пытаюсь получить местоположение пользователя в expo в react native. enableNetworkproviderAsync()
Появляется всплывающее окно, которое позволяет указать местоположение. Я хочу повторно открыть всплывающее окно, когда пользователь отказывается делиться своим местоположением. В настоящее время, когда я перехожу на экран моей карты, всплывающее окно открывается только один раз, и когда я нажимаю «Не делиться своим местоположением», оно не открывается повторно.
const [locationReady, setLocationReady] = useState(false);
useEffect(() => {
(async () => {
if (!locationReady) {
try {
const enableLocation = await Location.enableNetworkProviderAsync();
setLocationReady(true);
} catch (e) {
setLocationReady(false);
console.log("locationReady erorr");
}
}
})();
}, [locationReady]);
Ответ №1:
Как только пользователь отклонит запрос разрешения, вы не сможете запросить его снова. Вам нужно будет попросить пользователя перейти в настройки и разрешить требуемое разрешение. Это можно сделать двумя способами,
- импортируйте {Linking} из ‘react-native’; а затем откройте настройки внутри вашего компонента с помощью Linking.openSettings().
- Или вы можете использовать библиотеку https://www.npmjs.com/package/react-native-permissions
Комментарии:
1. Спасибо, я попробую это. Если местоположение включено, и через некоторое время пользователь отключает общий доступ к местоположению, как я могу запросить оповещение о повторном включении местоположения?
2. Вы не можете запросить оповещение о повторном включении местоположения после того, как пользователь отклонил его. iOS simple этого не допускает. На Android то же самое происходит, когда пользователь проверяет «Никогда не спрашивать снова» при запросе разрешения. Поэтому, как только пользователь отклонил запрос или отключил его через настройки устройства, вы должны попросить пользователя включить его в настройках, вместо первоначального предупреждения для включения местоположения (это просто не будет отображаться).
3. Но если я повторно включу местоположение в настройках, ничего не произойдет. Как я могу проверить, была ли она включена? Я нашел этот метод в документах: hasServicesEnabledAsync() (возвращает true, когда местоположение включено). Вот pastebin: pastebin.com/G3Ta1KrK . Я описал проблему в pastebin.
Ответ №2:
Вам нужно проверить ответ от enableLocation. Вот документы.
Если пользователь отклоняет ответ, он должен scope
сообщить вам, что он выбрал.
Но вы устанавливаете для него значение true для каждого ответа, и ошибка никогда не достигается. Попробуйте это:
if (!locationReady) {
try {
const enableLocation = await Location.enableNetworkProviderAsync();
setLocationReady(enableLocation.scope !== "none");
} catch (e) {
setLocationReady(false);
console.log("locationReady erorr");
}
Комментарии:
1. Я пробовал это, но все равно не откроется после того, как я отклоню его. Я зарегистрировал ошибку. В нем говорится
[Error: Location request failed due to unsatisfied device settings.]
2. Установлен ли у вас сервис Google Play на вашем эмуляторе?
3. Я тестирую его на своем телефоне Android через USB и приложение expo.
4. Если вы также добавили разрешения в манифест Android, это должно сработать. Можете ли вы воспроизвести это для нас в изолированной среде?
5. Ну, я могу попробовать. Я заглянул в свой файл app.json, и под Android нет разрешения. Нужно ли это включать? Но если этого не было, как я получил разрешение на местоположение? Потому что, если я открою экран карты и при первом появлении всплывающего окна, после разрешения местоположения, это сработает.