即使app在后台,我也想使用以下功能?
- (void)stream:(NSStream *)theStream handleEvent:(NSStreamEvent)streamEvent
{
case NSStreamEventHasBytesAvailable:
{ NSLog(@"Event:NSStreamEventHasBytesAvailable");
if (theStream == _inputStream) {
NSLog(@"NSStreamEventHasBytesAvailable: on Input Stream");
uint8_t buffer[1024];
int len;
while ([_inputStream hasBytesAvailable]) {
len = [_inputStream read:buffer maxLength:sizeof(buffer)];
if (len > 0) {
NSString *output = [[NSString alloc] initWithBytes:buffer length:len encoding:NSASCIIStringEncoding];
if (nil != output) {
NSLog(@"server said: %@", output);
// to get local notification I am calling below method.
[self scheduleNotification];
}
}
}
}
break;
}
以上代码在foreGround中完成。我已经在apple文档中给出了所有更改,以在后台模式中运行应用程序 - voip。 我应该在AppDelegate方法中写什么?
- (void)applicationDidEnterBackground:(UIApplication *)application
{
}
如何获取流:在后台调用handleEvent?
答案 0 :(得分:7)
前一段时间我正在处理类似的问题。要记住几件重要的事情:
因此,如果这不是voip应用程序,您可能实际上想要使用远程通知直接提醒用户而不是显示本地通知。我想这是您的应用程序通过App Store验证的唯一方式。
无论如何,SO上的两个链接可以帮助您找到帮助:
How can an iOS app keep a TCP connection alive indefinitely while in the background?
我最终使用了voip(正如你所做的那样)并按照这里的建议播放静音音频循环 - 它有效。不知道 这个无声的音频循环仍然是必要的。
What happens to TCP and UDP (with multicast) connection when an iOS Application did enter background
请务必阅读Tips for Developing a VoIP App和Technical Note TN2277:Networking and Multitasking
答案 1 :(得分:0)
使用此代码可使您的应用在ios中保持活动状态
var backgroundUpdateTask: UIBackgroundTaskIdentifier = UIBackgroundTaskIdentifier(rawValue: 0)
func endBackgroundUpdateTask() {
UIApplication.shared.endBackgroundTask(self.backgroundUpdateTask)
self.backgroundUpdateTask = UIBackgroundTaskIdentifier.invalid
}
func applicationWillResignActive(_ application: UIApplication) {
self.backgroundUpdateTask = UIApplication.shared.beginBackgroundTask(expirationHandler: {
self.endBackgroundUpdateTask()
})
}
func applicationDidBecomeActive(_ application: UIApplication) {
self.endBackgroundUpdateTask()
}
我希望您能通过此帮助获得成功