数据不是通过3G从后台发送的

Whi*_*ind 5 objective-c nsurlrequest ios nsurlsession background-mode

我有一个应用程序,当应用程序在后台时,它将数据发送到服务器.以下是负责数据发送的代码:

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

所以这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];  
}
Run Code Online (Sandbox Code Playgroud)

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

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

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

附加信息:

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

Wai*_*ain 4

这似乎与电力使用有关。URL 会话提供的后台上传很方便,并且由操作系统自行决定 - 它提供发送数据的功能,但可以选择何时发送。

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

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

这种测试实际上应该只在设备上完成,而不是连接到 Xcode,因为它会影响测试。相反,使用 Charles 代理之类的东西来记录网络请求并使用设备,将其放置一段时间,也许打开并使用其他应用程序。您应该看到数据最终被发送,但您必须等待。