Вопрос по ios, background, multitasking, iphone, sockets – Как обрабатывать события сокет-соединения, когда приложение находится в фоновом режиме?

4

Я хочу использовать следующую функцию, даже если приложение находится в фоновом режиме?

- (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. Я внес все изменения, указанные в яблочном документе, для запуска приложения в фоновом режиме - voip. Что я должен написать в методе AppDelegate?

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

Как получить поток: handleEvent вызывается в фоновом режиме?

Еще одна вещь: даже если вы используете режим VoIP, вы должны проверить на устройстве. Это не будет работать на симуляторе. Rok Jarc
Привет @rokjarc, это сокет соединение между сервером и клиентом. Я хочу показать локальное уведомление пользователю, когда сервер отправляет сообщение клиенту, т.е. я хочу использовать поток - (void): (NSStream *) theStream handleEvent: (NSStreamEvent) streamEvent in background - (void) applicationDidEnterBackground: (UIApplication *) В приложении я внес все необходимые изменения в соответствии с яблочным документом. Пожалуйста, дайте мне знать, если у вас есть ансер HDdeveloper
@rokjarc, спасибо за помощь. Я не использую устройство, которое может быть причиной, потому что оно не показывает контроль над делегатами NSStream. В ожидании одобрения Apple, чтобы проверить его на устройстве. еще раз спасибо. HDdeveloper
Это не похоже на приложение VOIP. Q1: это так? Q2: это приложение для магазина приложений или для личного пользования? Rok Jarc
Ну, я думаю, что это не тот ответ, на который вы надеялись, но я не вижу никакой другой возможности. Надеюсь, кто-то еще поможет. Rok Jarc

Ваш Ответ

1   ответ
7

х вещей, которые нужно иметь в виду:

background "voip" functionality only works on device - don't use simulator to test it you will probably (tested) got rejected if your app registers as a voip app and isn't really voip app

Так что, если это не приложение VoIP, вы можете использовать удаленные уведомления для непосредственного оповещения пользователя, а не показывать локальное уведомление. Я полагаю, что это единственный способ для вашего приложения пройти проверку App Store.

В любом случае, две ссылки здесь на SO помогли вам найти полезную:

Как приложение iOS может поддерживать TCP-соединение на неопределенное время в фоновом режиме?

Я закончил тем, что использовал voip (как и вы) и воспроизводил беззвучный аудио цикл, как было предложено здесь - это работало Не уверен если этот тихий аудио цикл все еще необходим.

Что происходит с соединениями TCP и UDP (с многоадресной рассылкой), когда приложение iOS действительно входит в фоновый режим

Убедитесь, что вы читаетеСоветы по разработке приложения VoIP а такжеТехническое примечание TN2277: работа в сети и многозадачность

Привет @rokjarc, спасибо за помощь. Работает нормально на устройстве. HDdeveloper
Будет ли отклонено яблоко, если приложение теперь использует VoIP и воспроизводит тихий звук в фоновом режиме?
Обычно это достигается путем отправки push-уведомления APNS на устройство.
Эй, рад слышать, что ты разобрался с этим :)
@rokjarc, как отобразить предупреждение, чтобы использовать приложение в фоновом режиме и получать события .....

Похожие вопросы