ApplicationDidEnterBackground и UIWebview - PullRequest
0 голосов
/ 17 июня 2011

У меня проблема с приложением. Я создаю приложение, которое является своего рода webApp. Итак, приложение работает на сервере, и я взаимодействую с ним через UIWebview.

Итак, позвольте мне объяснить, чего я пытаюсь достичь здесь. На веб-странице у меня есть несколько функций Javascript, я взаимодействую с этими функциями через строкуByEvaluatingJavaScriptFromString пример: Код:

[webView stringByEvaluatingJavaScriptFromString:@"tagMe()"];

и сервер выполняет эту команду и делает следующее

он устанавливает URLPrefix на ServerReply: // (), и я ловлю это с помощью

- (BOOL)webViewUIWebView *)webView shouldStartLoadWithRequestNSURLRequest *)request navigationTypeUIWebViewNavigationType)navigation Type

, поэтому, если URL имеет префикс ServerReply: // он запускает функцию в моем приложении.

Пока все хорошо, все работает просто отлично, НО, когда пользователь нажимает кнопку HOME или он получает телефонный звонок. метод ApplicationDidEnterBackground будет вызван, и я хочу вызвать другую функцию JS

Код:

[webView stringByEvaluatingJavaScriptFromString:@"gettingClosed()"];

и затем сервер должен дать мне URL с префиксом SaveClientData: // (somestring)

Итак, приложение закрывается, и оно не работает .... мой код примерно такой

Код:

//AppDelegate.m

  - (void)applicationDidEnterBackground:(UIApplication *)application {
    [webViewController killTrigger];
 }

//webViewController. m

-(void)killTrigger{

[webView stringByEvaluatingJavaScriptFromString:@"gettingClosed()"];

}

и это не сработает, но если я это сделаю Код:

  - (void)applicationDidEnterBackground:(UIApplication *)application {
    [webViewController killTrigger];
 }

//webViewController. m

-(void)killTrigger{

NSLog(@"killTrigger got called");

}

я получаю сообщение журнала, когда я покидаю приложение ...

возможно ли это сделать [webView stringByEvaluatingJavaScriptFromString: @ "gettingCl osed ()"]; если мое приложение переместится в фоновый режим? или есть другой подход, чтобы получить тот же результат ...?

tnx заранее,

Барт

Ответы [ 2 ]

1 голос
/ 27 июня 2014

Я знаю, что этот вопрос старый, но я все еще хотел опубликовать решение.У меня была похожая проблема: я хотел закрыть веб-сокет, когда мое приложение входит в фоновый режим, но казалось, что iOS приостановила поток, прежде чем это могло пройти.Решением этой проблемы была регистрация фоновой задачи:

- (void)applicationDidEnterBackground
{
    self.cleanupBackgroundTaskIdentifier = [[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler:^{
        [[UIApplication sharedApplication] endBackgroundTask:self.cleanupBackgroundTaskIdentifier];
        self.cleanupBackgroundTaskIdentifier = UIBackgroundTaskInvalid;
    }];

    [self.remoteWebView stringByEvaluatingJavaScriptFromString:@"websocket.close();"];
    [self performSelector:@selector(cleanupBackgroundTaskTimeout) withObject:nil afterDelay:10.0];
}

- (void)cleanupBackgroundTaskTimeout
{
    [[UIApplication sharedApplication] endBackgroundTask:self.cleanupBackgroundTaskIdentifier];
}

Это говорит iOS о том, что мы хотим продолжить работу в фоновом режиме, а затем закрывает веб-сокет.Затем мы даем веб-сокету достаточно времени для закрытия (в данном случае 10 секунд) и после этого завершаем фоновое задание.

Обратите внимание, что блок, который вы передаете beginBackgroundTaskWithExpirationHandler:, равен , а не .код, который выполняется в фоновом режиме, вызов этого метода просто говорит iOS, что ваше приложение не должно быть немедленно приостановлено.

Кроме того, помните, что нет никаких гарантий, что вы получите дополнительное время для фоновой работы и чтоВы ДОЛЖНЫ позвонить endBackgroundTask: вовремя (обычно 10 минут), иначе iOS убьет ваше приложение.

0 голосов
/ 05 января 2012

У меня похожий сценарий и странное поведение.Я еще не решил проблему, но у меня есть некоторые выводы.Я поделюсь с вами, так что, возможно, вы сможете развить это и найти решения.

Я заметил, что в целом выполняется код JS, вызываемый applicationDidEnterBackground (а также код, вызываемый applicationWillResignActive).

Чтобы проверить это, я установил глобальный счетчик для всего своего JS-кода, увеличиваю его перед переходом в BG и проверяю его состояние в фоновом режиме (чтобы проверить это, я использовал грязный обходной путь, где я в основном создаю новыйфайл называется cntr _ # {значение счетчика}), поэтому я предполагаю, что вызывается функция JS (поскольку счетчик увеличивается).

Однако, прежде чем увеличивать счетчик, моя функция JS также отправляет сообщение XMPP.Когда я анализирую сетевой трафик, я вижу, что сообщение XMPP отправляется сразу после возобновления работы приложения.Теперь есть две возможности: либо при переходе на BG нет возможности создания XMPP-соединения (что я считаю неправдоподобным), либо функция XMPP происходит асинхронно и ее выполнение откладывается.

Обновление.

Я обнаружил, что библиотека JS, которую я использовал для XMPP, на самом деле асинхронна, и что вызов flush поверх ее очереди решил проблему отсутствующих сообщений XMPP.Надеюсь, что это может помочь вам тоже.

...