后台定位并在收到推送通知后查看 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();
};
}, []);
我有一个 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();
};
}, []);