首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何在React Native应用程序的iOS上后台运行socket.io?

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

Stack Overflow用户
提问于 2016-02-17 21:50:45
回答 4查看 12.9K关注 0票数 22

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

代码语言:javascript
复制
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>
    );
  }
});
EN

回答 4

Stack Overflow用户

发布于 2016-02-24 16:47:35

你不可能以“正确的方式”做到这一点。

编辑

来自苹果的official documentation

实现长时间运行的任务

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

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

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

随时通知用户其位置的应用程序,如导航应用程序

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

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

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

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

这就是说,有一种有效的技术可以让你的套接字保持开放:

播放静音并将背景模式设置为音频。有关这个问题的更多信息,请查看this article (它有点旧了,但仍然有效)。这将允许你保持你的socket打开,伪造一个音频应用。您的info.plist应该更新为允许音频在后台运行。UIBackgroundModes应设置为audio (有关详细信息,请查看docs )

票数 6
EN

Stack Overflow用户

发布于 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

票数 2
EN

Stack Overflow用户

发布于 2016-03-07 12:53:14

我知道有很多方法可以做到这一点(例如audio黑客),但是iOS不允许在后台运行长时间的任务是有原因的--请重新考虑你的设计,以允许一个更好的产品。

使用日志运行任务将耗尽电池。如果你需要数据更新,注册使用Apple push服务来获取推送通知(如果你直接这样做,或者这是我上次处理类似问题的时候),它是免费的。

具体来说,位置跟踪是允许的后台系统服务,请考虑使用本机API。

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

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35458549

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档