【发布时间】:2016-11-08 13:07:45
【问题描述】:
我有一个应用程序在后台运行时向服务器发送数据。下面是负责数据发送的代码:
-(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 发送到服务器。
【问题讨论】:
-
在您的设备中获得蓝牙数据多长时间后??
-
@CodeChanger 应用每五分钟或更短时间从蓝牙获取数据。我确定收到了来自蓝牙的数据,因为我将其存储在本地 sqlite 数据库中。
-
好的,据我所知,在 3.0 分钟应用程序暂停后,您必须处理该模式并使用
bgTask调用您的服务。
标签: ios objective-c nsurlsession nsurlrequest background-mode