当前位置: 首页 > 知识库问答 >
问题:

后台位置,并在获取消息推送后检查博览会应用程序

程吕恭
2023-03-14

我有一个博览会应用程序,我需要在后台运行地理Geofence,即使应用程序关闭。我得到的纬度和经度发送通过消息推送这样从C#应用程序。

PushBody=数据。说明“[

任务是,如果手机位于提供的坐标中,我需要显示推送通知

我的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',
  },
});

我已经取得了权限,我需要一个解决方案,在后台运行位置服务,并显示推送通知,如果手机是在纬度和经度之间,我收到推送通知

如果有人帮我,我会非常感激的。我被困了几天,我在网上搜索了我的案子。请帮帮忙

共有1个答案

公孙芷阳
2023-03-14

即使应用程序位于后台,也可以使用此库获取后台位置。当设备在坐标范围内时,使用此命令触发本地通知。

您必须存储从C#应用程序获得的坐标,并将其与从后台地理定位服务获得的设备当前位置进行交叉检查,如果该位置与您的本地通知匹配。

例如

     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();
         
        };
      }, []);
 类似资料:
  • 我正在使用iOS7,我正在尝试确定在以下情况下是否可以获得JSON有效载荷。 我已启用后台模式“远程通知” 当我启动的应用程序从图标本身后的通知已收到我没有得到推在启动选项从 当应用程序从图标手动启动时,以下方法也不会被调用

  • 我已经得到推送通知工作,并设法更新图标徽章计数时,应用程序被带到前台。 但我对此有点困惑。。。iPhone收到通知,弹出消息显示激活我的应用程序,徽章仅在我启动应用程序后更新。 就用户体验而言,这听起来并不正确。我的理解是,徽章计数应该通过递增计数通知用户需要采取的行动,但这要等到应用程序运行的后期才会发生。 那么,当应用程序在后台收到推送通知时,有没有办法告诉它更新徽章计数? 请注意,我的应用程

  • 是否可以在不打开应用程序的情况下发送whatsApp消息,在后台发送,就像使用以下方式发送短信: 如果是,怎么做?我尝试的代码打开了应用程序(意图): 或者是否可以打开应用程序,发送消息到给定的地址,然后关闭它? 谢谢!

  • 我已经在我的应用程序(Android和IOS)中实现了Appcelerator钛推送通知,用于接收消息: 当应用程序在后台和前台时,我在android中收到通知。我在android中使用下面的属性来显示应用程序在前台时的通知(CloudPush.showTrayNotificationsWhenFocus=true;) 问题:当应用程序位于前台时,我在IOS(9.1版iPhone 5)中收到通知时

  • 来自Firebase网站上的文档:https://firebase.google.com/docs/cloud-messaging/downstream 当您的应用处于后台时传递的通知。在这种情况下,通知会传递到设备的系统托盘。默认情况下,用户单击通知会打开应用启动器。 当我的应用程序收到云消息并且我的应用程序在后台时,如果我需要做些什么。 是否可以在自定义BroadcastReceiver或服务

  • 我正在努力实施这篇文章中给出的建议。 不幸的是,我不清楚步骤。我尝试实施这些建议,但后台时间剩余继续减少,即使我开始和停止位置服务。我是这样开发它的: InitTimer: 检查更新: 有人对我的代码中可能出现的错误有什么建议吗?正在调用initTimer和checkUpdates,但仅在后台执行时间(-10分钟)期间调用。我希望应用程序“永远”每隔n分钟更新一次位置。 我的应用程序的UIBack