如何在iOS的背景中运行一个React Native应用程序中的socket.io?

我在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

相关文章

当我们远离最新的 iOS 16 更新版本时,我们听到了困扰 Apple...
欧版/美版 特别说一下,美版选错了 可能会永久丧失4G,不过只...
一般在接外包的时候, 通常第三方需要安装你的app进行测...
前言为了让更多的人永远记住12月13日,各大厂都在这一天将应...