5

我有一个应用程序在后台运行时将数据发送到服务器。下面是负责数据发送的代码:

-(bool) sendStats: (MCStatsSender*) val{

    if(![self checkInternet]){ //Using Reachability here

        return false;
    }

    NSDictionary *inputData = [NSDictionary dictionaryWithObjectsAndKeys:
                               self.propertyA.value, "key1",
                               val.data, "key2",
                               nil];


    [myNetworkManager doRequest:[myRequestManager createWithStringAndDictionary:MY_URL Data:inputData handler:myHandler user:val]];
    return true;
}

所以这inputData是一个带有字符串的简单字典。

一个方法doRequest基于一个 NSURLSession 并且基本上看起来像这样:

-(void) doRequest: (MCRequest*) request{

    [tasks addObject:request];

    if(m_session == nil){
        NSURLSessionConfiguration* config = [NSURLSessionConfiguration backgroundSessionConfigurationWithIdentifier:[NSString stringWithFormat:@"key-%lu",reqid]];
        m_session = [NSURLSession sessionWithConfiguration:config delegate:self delegateQueue:nil];
    }

    NSURLSessionDataTask* task = [m_session dataTaskWithRequest:request.generatedRequest];
    request.reqId = task.taskIdentifier;
    [task resume];  
}

正如我所说,一切都通过 Wi-Fi 运行,应用程序进入后台,几分钟后,自定义蓝牙设备发送一些数据并将应用程序从暂停模式中唤醒。iOS 应用程序接收到数据后,如果设备通过 3G 连接,则无法将其发送到服务器。我很肯定收到通过蓝牙发送的数据,因为它存储在本地数据库中。

还有一个重要的事实。如果应用程序通过 Xcode 运行,即使设备通过 3G 连接,应用程序也会从后台发送数据。为此,我运行一个应用程序,然后点击主页按钮将其置于后台。

不知道有什么区别,为什么当通过电缆连接到 Mac 时应用程序的行为会有所不同,以及为什么不通过 3G(甚至 2G)发送数据?

附加信息:

我不是要上传文件,而是只是将 JSON 发送到服务器。

4

1 回答 1

4

这似乎与电源使用有关。URL 会话提供的后台上传很方便,它是根据操作系统的决定提供给您的 - 它提供发送数据,但它可以选择何时发送。

影响数据何时发送的因素包括设备是否连接到电源、数据连接的质量(发送数据需要多长时间和多少电量)、设备正在做什么(它可以结合多次上传)...

因此,您无法猜测或依赖在任何特定时间在后台执行的任何任务。

这种测试应该只在设备上进行,而不是连接到 Xcode,因为它会影响测试。取而代之的是,使用诸如 Charles 代理之类的东西来记录网络请求并使用该设备,将其放置一段时间,并可能打开并使用其他一些应用程序。您应该会看到最终发送的数据,但您将不得不等待。

于 2016-11-13T10:19:39.713 回答