我在iOS React Native(v0.20)应用程序中使用socket.io.该应用程序跟踪我的位置,当我的位置更改时,会向服务器发送一条消息.如果套接字连接丢失,服务器发送电子邮件通知我.
我的位置跟踪工作在后台与react-native-location,但我不能让socket.io工作.当我更改应用程序或关闭屏幕时,应用程序会继续跟踪我的位置,但是我丢失了套接字连接.
有没有办法在后台运行socket.io,如位置跟踪?那么那里有一些本机代码,将允许我在后台维护客户端/服务器连接?
我知道有一个WebSocket alternative,但我看不到一种方法让它在后台运行.
更新:
我加倍检查了我的Info.plist,它已经为react-native-location设置了必要的背景值.我不知道它是否重要,但套接字的工作和位置跟踪是在同一个组件中完成的.
LocationComponent.js
window.navigator.userAgent = 'react-native'; const io = require('socket.io-client/socket.io'); const socket = io(url,{jsonp: false}); import React,{ Text,View,DeviceEventEmitter } from 'react-native'; import { RNLocation } from 'NativeModules'; export default GeolocationExample = React.createClass({ componentDidMount: function() { RNLocation.requestAlwaysAuthorization(); RNLocation.startUpdatingLocation(); RNLocation.setDistanceFilter(3.0); DeviceEventEmitter.addListener('locationUpdated',locationObject => { this.props.newPosition({ longitude: locationObject.coords.longitude,latitude: locationObject.coords.latitude }); }); },render: function() { const { lastPosition,distance } = this.props; socket.emit('newPos',{ longitude: lastPosition.longitude,latitude: lastPosition.latitude,distance,time: Date() }); return ( <View> <Text> {distance} </Text> </View> ); } });
解决方法
iOS对它允许的进程种类有相当的限制.
在socket.io客户端issue tracker上似乎有一些讨论.
如果将背景模式设置为音频,似乎有人将插座连接保持活动状态.因人而异
确保在Info.plist文件的UIBackgroundModes部分中设置正确的值. How to do this in XCode