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发送到服务器.
这似乎与电力使用有关。URL 会话提供的后台上传很方便,并且由操作系统自行决定 - 它提供发送数据的功能,但可以选择何时发送。
影响数据发送时间的因素包括设备是否连接到电源、数据连接的质量(发送数据需要多长时间和多少电量)、设备正在做什么(是否可以结合多次上传)...
因此,您无法猜测或依赖在后台任何特定时间执行的任何任务。
这种测试实际上应该只在设备上完成,而不是连接到 Xcode,因为它会影响测试。相反,使用 Charles 代理之类的东西来记录网络请求并使用设备,将其放置一段时间,也许打开并使用其他应用程序。您应该看到数据最终被发送,但您必须等待。
| 归档时间: |
|
| 查看次数: |
244 次 |
| 最近记录: |