我想定期在后台实时向我们的后端服务发送用户的位置更新(即使应用程序未运行/终止)。
目前我们正在通过应用程序和后端之间的网络套接字发送位置更新。
问题是网络套接字在以下情况下断开连接(应用程序终止、电池优化或应用程序在后台且操作系统需要更多内存)。
如何保持网络套接字连接(也许每天 12 小时)?
在这种情况下使用网络套接字是一种不好的做法吗?
实时发送位置更新的好替代方案是什么? ( 请记住,后端使用网络套接字向应用程序发送数据(但不频繁,我们可以使用推送通知代替)。 )。
geolocator
包来获取用户的当前位置。以及 socket_io_client
包来连接到网络套接字。
我们的目标是Android 和IOS。
当前实施情况
// imports ...
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
home: MyHomePage(
socket: Geolocator.getPositionStream(),
positionStream: IO.io(kHost, <String, dynamic>{ 'transports': ['websocket'] }),
),
);
}
}
class MyHomePage extends StatefulWidget {
MyHomePage({this.socket, this.positionStream});
final Stream<Position> positionStream;
final IO.Socket socket;
@override
_MyHomePageState createState() => _MyHomePageState();
}
class _MyHomePageState extends State<MyHomePage> {
void listenToPosStream() {
widget.positionStream.listen((Position position) {
if (position != null)
updatePosition(latitude: position.latitude, longitude: position.longitude);
});
}
void updatePosition({@required latitude, @required longitude}) {
widget.socket.emit(
'setPosition',
{'latitude': latitude, 'longitude': longitude},
);
}
@override
void initState() {
listenToPosStream();
super.initState();
}
@override
Widget build(BuildContext context) {
// rest of code ...
}
}
我开发了用于在后台跟踪位置的代码,即使应用程序被杀死,它适用于 Android 平台。
您可以查看此媒体博客,即使在向应用程序请求权限后也可以运行代码。
在这里你可以找到我所做的代码的Github链接,你可以运行代码并告诉我它是否正常工作。目前仅适用于 Android。
对于 Web 套接字,您可以创建一个新的 api 并让您始终连接到服务器,这样您就不必从应用程序端管理它,因为您可以从应用程序端服务调用套接字的 api 并将数据发送到套接字.
谢谢...