Expo Location.startLocationUpdatesAsyn c Фоновая служба не работает на реальном устройстве (оба ios, android) - PullRequest
0 голосов
/ 07 апреля 2020

Я использую среду expo для разработки собственного мобильного приложения. Одно из требований этого приложения - отправка местоположения пользователя (lat, lng) в нашу серверную службу с помощью запроса Axio API, когда местоположение пользователя выходит за границы. Это означает, что нам необходимо постоянно отслеживать местоположение текущего пользователя и рассчитывать расстояние от исходного местоположения пользователя до текущего местоположения пользователя. Поэтому я реализовал Location.startLocationUpdatesAsyn c для получения обновлений местоположения, которые также могут поступать, когда приложение находится в фоновом режиме. Однако метод Expo Location.startLocationUpdatesAsyn c работает только на симуляторе и не работает, когда мы используем реальное устройство для его тестирования. Мне было интересно, если в моем проекте отсутствует какая-либо конфигурация, чтобы этот метод не мог быть обработан с использованием реального устройства (ios и android)

componentDidMount = async () => {
    const { status } = await Location.requestPermissionsAsync();

    if (status === 'granted') {
        await Location.startLocationUpdatesAsync(LOCATION_TASK_NAME, {
            accuracy: Location.Accuracy.Balanced,
            showsBackgroundLocationIndicator: true
            // deferredUpdatesInterval : 10000

        });
    }
};......................
const calculateBoundary = (lat1, lon1, lat2, lon2, unit) => {
if ((lat1 == lat2) && (lon1 == lon2)) {
    return 0;
}
else {
    var radlat1 = Math.PI * lat1 / 180;
    var radlat2 = Math.PI * lat2 / 180;
    var theta = lon1 - lon2;
    var radtheta = Math.PI * theta / 180;
    var dist = Math.sin(radlat1) * Math.sin(radlat2) + Math.cos(radlat1) * Math.cos(radlat2) * Math.cos(radtheta);
    if (dist > 1) {
        dist = 1;
    }
    dist = Math.acos(dist);
    dist = dist * 180 / Math.PI;
    dist = dist * 60 * 1.1515;
    if (unit == "K") { dist = dist * 1.609344 }
    if (unit == "N") { dist = dist * 0.8684 }
    return dist;
}

}

TaskManager.defineTask(LOCATION_TASK_NAME, async({ data, error }) => {
if (error) {
    // Error occurred - check `error.message` for more details.
    return;
}
if (data) {
    const { locations } = data;
    const timeStamp = (new Date().getTime()/1000).toString().split(".")[0];

    try {
        const value = await AsyncStorage.getItem('user');
        if (value !== null) {
            //console.log(value);
            // We have data!!
            const email = '';
            const phone = JSON.parse(value).phone_number;
            const name = JSON.parse(value).given_name

            const urlList = "https://coxj3a2v77.execute-api.ap-southeast-2.amazonaws.com/production/profile/list";
            const urlSns ="https://coxj3a2v77.execute-api.ap-southeast-2.amazonaws.com/production/sns";
            const urlEvent ="https://coxj3a2v77.execute-api.ap-southeast-2.amazonaws.com/production/event";

            axios.get(urlList)
                .then(function (response) {
                    // handle success
                    //console.log("!!!" + JSON.stringify(response.data));
                    const initLocation = { lat: response.data.lat, lng: response.data.lng };
                    const initLat = initLocation.lat;
                    const initLng = initLocation.lng;
                    //let count=0;
                    const K = calculateBoundary(initLat, initLng, locations[0].coords.latitude, locations[0].coords.longitude, "K");
                    if(K>0.25){
                        console.log("Warning!!"+K)
                        const SnsPayload ={
                            name: name, 
                            email: email, 
                            phone_number: phone, 
                            lat: locations[0].coords.latitude, 
                            lng: locations[0].coords.longitude
                        }
                        const EventPayload={
                            email: email, 
                            lat: locations[0].coords.latitude, 
                            lng: locations[0].coords.longitude, 
                            time_stamp: timeStamp
                        }
                        console.log(SnsPayload);
                        axios.post(urlSns, SnsPayload)
                            .then(function (response) {
                                console.log("SNS:"+response);
                                //self.setState({ dialogVisible: true })
                            })
                            .catch(function (error) {
                                console.log(error);
                            }); 
...