5

即使应用程序在后台,我也想使用以下功能?

- (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;
        }

上面的代码是在前台完成的。我已经对苹果文档中给出的所有更改进行了更改,以在后台模式下运行应用程序 - voip。我应该在 AppDelegate 方法中写什么?

- (void)applicationDidEnterBackground:(UIApplication *)application
{
}

如何获取流:后台调用的handleEvent?

4

2 回答 2

9

不久前我正在处理类似的问题。一些重要的事情要记住:

  • 后台“voip”功能仅适用于设备 - 不要使用模拟器对其进行测试
  • 如果您的应用程序注册为 voip 应用程序并且不是真正的 voip 应用程序,您可能会(经过测试)被拒绝

因此,如果这不是 voip 应用程序,您实际上可能希望使用远程通知来直接提醒用户,而不是显示本地通知。我想这是您的应用程序通过 App Store 验证的唯一方法。

无论如何,SO 上的两个链接可能对您有所帮助:

iOS 应用程序如何在后台无限期地保持 TCP 连接处于活动状态?

我最终使用了 voip(就像你一样)并按照这里的建议播放无声音频循环 - 它有效。不确定这个静音音频循环是否仍然是必要的。

当 iOS 应用程序确实进入后台时,TCP 和 UDP(使用多播)连接会发生什么情况

请务必阅读开发 VoIP 应用程序的技巧技术说明 TN2277:网络和多任务处理

于 2012-06-14T13:17:47.563 回答
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()

}

我希望你能通过这个帮助获得成功

于 2019-12-23T12:08:07.503 回答