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

Eas*_*led 19 websocket ios socket.io reactjs react-native

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

我使用react-native-location在后台运行位置跟踪,但我无法开始socket.io工作.当我更改应用程序或关闭屏幕时,应用程序会一直跟踪我的位置,但我丢失了套接字连接.

有没有办法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>
    );
  }
});
Run Code Online (Sandbox Code Playgroud)

G. *_*ide 6

您无法以“正确的方式”做到这一点。

编辑

来自苹果官方文档

实现长时间运行的任务

对于需要更多执行时间来实现的任务,您必须请求特定权限才能在后台运行它们而不会被挂起。在 iOS 中,只允许特定类型的应用程序在后台运行:

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

在后台录制音频内容的应用

让用户随时了解其位置的应用程序,例如导航应用程序

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

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

从外部配件接收定期更新的应用程序

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

话虽如此,有一种工作技术可以让您的套接字保持打开状态:

播放静音并将背景模式设置为音频。查看这篇文章以获取有关此事的更多信息(它有点旧但仍然有效)。这将允许您假装音频应用程序保持套接字打开。您的 info.plist 应该更新以允许音频在后台运行。 UIBackgroundModes应该设置为audio(查看文档以获取更多信息)


fra*_*ank 2

iOS对应用程序后台运行时允许的进程类型有相当的限制。

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

如果将后台模式设置为 ,似乎有人可以使套接字连接保持活动状态audio。青年MMV

确保您在 Info.plist 文件的 UIBackgroundModes 部分中设置了正确的值。如何在 XCode 中执行此操作