我在iOS React Native(v0.20) app
中使用socket.io
。这个应用程序跟踪我的位置,当我的位置改变时,它会向服务器发送一条消息。如果套接字连接丢失,服务器会发送电子邮件通知我。
我用react-native-location在后台运行位置跟踪功能,但是我不能让socket.io
工作。当我更换应用程序或关闭屏幕时,应用程序会继续跟踪我的位置,但我失去了插座连接。
有没有像位置跟踪一样在后台运行socket.io
的方法?除此之外,有没有一些本机代码可以让我在后台维护client/server connection
?
我知道有一个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>
);
}
});
发布于 2016-02-24 16:47:35
你不可能以“正确的方式”做到这一点。
编辑
来自苹果的official documentation:
实现长时间运行的任务
对于执行时间较长的任务,您必须请求特定的权限才能在后台运行,而不会被挂起。在iOS中,只允许特定类型的应用程序在后台运行:
在后台向用户播放音频内容的应用程序,例如音乐播放器应用程序
在后台录制音频内容的应用程序
随时通知用户其位置的应用程序,如导航应用程序
支持互联网协议语音(VoIP)的应用程序
需要定期下载和处理新内容的应用
从外部附件接收定期更新的应用程序
实现这些服务的应用程序必须声明它们支持的服务,并使用系统框架来实现这些服务的相关方面。声明服务让系统知道您使用了哪些服务,但在某些情况下,实际上是系统框架阻止了您的应用程序被挂起。
这就是说,有一种有效的技术可以让你的套接字保持开放:
播放静音并将背景模式设置为音频。有关这个问题的更多信息,请查看this article (它有点旧了,但仍然有效)。这将允许你保持你的socket打开,伪造一个音频应用。您的info.plist应该更新为允许音频在后台运行。UIBackgroundModes
应设置为audio
(有关详细信息,请查看docs )
发布于 2016-02-22 08:16:08
iOS在允许when an app is backgrounded的进程类型上有相当多的限制。
在socket.io客户端issue tracker上似乎有一些关于这个问题的讨论。
似乎有人将后台模式设置为audio
时,套接字连接可以保持活动状态。YMMV
确保在Info.plist文件的UIBackgroundModes部分设置了正确的值。How to do this in XCode
发布于 2016-03-07 12:53:14
我知道有很多方法可以做到这一点(例如audio
黑客),但是iOS不允许在后台运行长时间的任务是有原因的--请重新考虑你的设计,以允许一个更好的产品。
使用日志运行任务将耗尽电池。如果你需要数据更新,注册使用Apple push服务来获取推送通知(如果你直接这样做,或者这是我上次处理类似问题的时候),它是免费的。
具体来说,位置跟踪是允许的后台系统服务,请考虑使用本机API。
至于将数据推送到服务器,您将无法(也可能不应该)与服务器保持持久的连接。
考虑每隔一段时间收集数据并将收集到的批次上传到服务器-最好是在应用程序重新打开时,这样就不会在后台浪费资源,也不会让人们对电池寿命和数据消耗感到不安。
https://stackoverflow.com/questions/35458549
复制相似问题