如何在React Native应用程序中在iOS的后台运行socket.io?

我在iOS React Native(v0.20) app使用socket.io 。 该应用程序跟踪我的位置,当我的位置改变它发出一条消息到服务器。 如果套接字连接丢失,服务器发送一封电子邮件通知我。

我有位置跟踪与react-native-location在后台工作,但我不能让socket.io工作。 当我改变应用程序或closures屏幕,应用程序不断跟踪我的位置,但我失去了套接字连接。

有没有办法在像位置跟踪的背景下运行socket.io ? 有没有一些本地代码,将允许我在后台保持client/server connection

我知道有一个WebSocket的替代品,但我不能看到一种方式让它在后台运行。

更新:我检查了我的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中,只有特定的应用程序types才能在后台运行:

在后台播放可听内容的应用,例如音乐播放器应用

在后台录制audio内容的应用程序

随时向用户通知其位置的应用,例如导航应用

支持网际协议语音(VoIP)的应用

需要定期下载和处理新内容的应用程序

从外部附件获得定期更新的应用程序

实现这些服务的应用程序必须声明它们支持的服务,并使用系统框架来实现这些服务的相关方面。 声明这些服务可以让系统知道你使用了哪些服务,但是在某些情况下,系统框架确实会阻止你的应用程序被挂起。

这就是说,有一个工作技术来保持你的套接字打开:

播放无声的声音并将背景模式设置为audio。 检查这篇文章的更多信息(这是有点旧,但仍然有效)。 这将允许你保持你的套接字伪造一个audio应用程序。 你的info.plist应该被更新以允许audio在后台运行。 UIBackgroundModes应设置为audio (查看文档以获取更多信息)

iOS 对于应用程序后台运行时所允许的进程types是相当严格的。

在socket.io客户端问题跟踪器上似乎有一些讨论。

如果将背景模式设置为audio ,看起来有人将套接字连接保持为活动状态。 因人而异

确保你在Info.plist文件的UIBackgroundMode部分设置了正确的值。 如何在XCode中做到这一点

我知道有这样做的黑客(即audio黑客),但有一个原因的iOS不允许在后台长时间运行的任务 – 请重新考虑你的devise,让一个更好的产品。

使用日志运行任务将耗尽电池。 如果您需要更新数据,请注册使用Apple推送服务获取推送通知(如果您直接执行此操作,或者上次处理类似问题,则为免费提供)。

位置跟踪,特别是允许的后台系统服务,考虑使用本地API。

至于推送数据到服务器,你将无法(也可能不应该)与服务器保持长久的连接。

考虑收集数据并每隔一段时间向服务器上传收集到的批次,最好在应用程序重新打开时,这样不会浪费后台资源,让人们对电池寿命和数据消耗感到不满。

在Info.plist的图片中,它只允许以下三种背景模式 :

  1. 后台获取
  2. 位置更新
  3. 远程通知

    您应该允许“audio和AirPlay”模式,它看起来像“应用程序播放audio或使用Airplaystreamaudio/video”。