后台定位并在收到推送通知后查看 Expo 应用程序

Background location and check Expo app after getting push notification

我有一个 expo 应用程序,我需要在后台 运行 地理围栏,即使该应用程序已关闭。我正在通过推送通知发送纬度和经度,就像从 C# 应用程序发送的那样。

PushBody = data.DESCRIPTION + "[<$>]" + data.LAT + "[<$>]" + data.LON +"[<$>]" + data.MAXRADIUS

任务是如果 phone 在提供的坐标中,我需要显示推送通知

我的 App.js 文件如下所示

import React, { useEffect } from 'react';
import { Platform, StatusBar, StyleSheet, View } from 'react-native';
import { AppLoading,
  Notifications
} from 'expo';

import { Asset } from 'expo-asset';

import * as Font from 'expo-font';
import * as Icon from '@expo/vector-icons';

import * as Location from 'expo-location';
import * as TaskManager from 'expo-task-manager';
import * as Permissions from 'expo-permissions';

const LOCATION_TRACKING = 'location-tracking';

import Navigator from './navigation';

import Dimensions_provider from './components/providers/dimension';
import {Permission_provider} from './components/providers/permission';
import {Signal_provider} from './components/providers/signal';
import {User_provider} from './components/providers/user';

import Notification from './components/notification';


export default class App extends React.Component {
  constructor() {
    super(...arguments);
    this.reset_notification = this.reset_notification.bind(this);
  }
  state = {
    isLoadingComplete: false,
    notification : {}
  };
  componentDidMount() {
    console.log('App mounted');
    this._notificationSubscription = Notifications.addListener(this._handleNotification)
  }
  reset_notification = () => {
    this.setState({notification : {}});
  }
  _handleNotification = (notification) => {
    console.log(`


      `)
    console.log(`[NOTIFICATION] HANDLE`);
    console.log(notification);
    console.log(`


      `)
    this.setState({notification});
  }

  render() {
    if (!this.state.isLoadingComplete && !this.props.skipLoadingScreen) {
      return (
        <AppLoading
          startAsync={this._loadResourcesAsync}
          onError={this._handleLoadingError}
          onFinish={this._handleFinishLoading}
        />
      );
    } else {
      return (
        <Permission_provider>
          <Dimensions_provider>
            <User_provider>
              <Signal_provider>
                <View style={styles.container}>
                  {Platform.OS === 'ios' && <StatusBar barStyle="default" />}
                  <Navigator {...this.props}/>

                  {this.state.notification.remote &&
                    <Notification notification={this.state.notification} reset={this.reset_notification}/>
                  }
                </View>
              </Signal_provider>
            </User_provider>
          </Dimensions_provider>
        </Permission_provider>
      );
    }
  }

  _loadResourcesAsync = async () => {
    return Promise.all([
      Asset.loadAsync([
        require('./assets/images/icon-hot-news.png'),
        require('./assets/images/icon-info.png'),
        require('./assets/images/icon-inquiry.png'),
        require('./assets/images/icon-map.png'),
        require('./assets/images/icon-buletin.png'),
        require('./assets/images/icon-signal.png'),
        require('./assets/images/novini.png'),
        require('./assets/images/query.png'),
      ]),
      Font.loadAsync({
        ...Icon.Ionicons.font,
        'space-mono': require('./assets/fonts/SpaceMono-Regular.ttf'),
      }),
    ]);
  };

  _handleLoadingError = error => {
    console.warn(error);
  };

  _handleFinishLoading = () => {
    this.setState({ isLoadingComplete: true });
  };
}

const styles = StyleSheet.create({
  container: {
    flex: 1,
    backgroundColor: '#fff',
  },
});

我已经获得权限,我需要一个 运行 后台定位服务的解决方案,如果 phone 在我收到的纬度和经度之间,则显示推送通知在推送通知中

如果有人能帮助我,我将不胜感激。我被困了几天,我在网上搜索了我的案子。请帮助

使用 this 库获取后台位置,即使应用程序在后台也是如此。 并使用 this 在设备位于坐标内时触发本地通知。

您必须存储从您的 C# 应用程序获得的坐标,并且 cross-check 它与您将从后台地理定位服务获得的设备当前位置一起存储,如果它符合您的条件触发本地通知。

例如

     useEffect(() => {
          BackgroundGeolocation.configure({
            locationProvider: BackgroundGeolocation.DISTANCE_FILTER_PROVIDER,
            desiredAccuracy: BackgroundGeolocation.HIGH_ACCURACY,
            stationaryRadius: 10,
            distanceFilter: 1,
            debug: false,
            stopOnTerminate: true,
            stopOnStillActivity: false,
          });
          BackgroundGeolocation.on('location', location => {
            BackgroundGeolocation.startTask(taskKey => {
              BackgroundGeolocation.endTask(taskKey);
            });
            //you will get lat lon here, compare them with the one you get from c# application notification. If matched fire local notification.
           //How to fire local notification is explain better in its documentation just follow the procedure there.

          });
          BackgroundGeolocation.on('authorization', status => {
            console.log(
              '[INFO] BackgroundGeolocation authorization status: ' + status,
            );
            if (status !== BackgroundGeolocation.AUTHORIZED) {
              // we need to set delay or otherwise alert may not be shown
              setTimeout(
                () =>
                  Alert.alert(
                    'App requires location tracking permission',
                    'Would you like to open app settings?',
                    [
                      {
                        text: 'Yes',
                        onPress: () => BackgroundGeolocation.showAppSettings(),
                      },
                      {
                        text: 'No',
                        onPress: () => console.log('No Pressed'),
                        style: 'cancel',
                      },
                    ],
                  ),
                1000,
              );
            }
          });
          BackgroundGeolocation.on('background', () => {
            console.log('[INFO] App is in background');
          });
          BackgroundGeolocation.start();
    
        return function cleanup() {
          BackgroundGeolocation.removeAllListeners();
         
        };
      }, []);