Подтвердить что ты не робот

IOS 7 UIWebView не отображает

Я переношу свое приложение в iOS 7, и у меня проблема с UIWebView в iOS 7. Я загружаю в него локальную строку html с помощью этого кода:

NSURL *baseURL = [NSURL fileURLWithPath: DOCUMENTS_DIRECTORY];
[self.descWebView loadHTMLString:html baseURL:baseURL];

Он отлично работает на iOS 6 и ранее, но на iOS 7 он не выполняет рендеринг, а UIWebView по-прежнему остается белым. И это сообщение появляется в консоли:

void SendDelegateMessage(NSInvocation *): delegate
(webView:decidePolicyForNavigationAction:request:frame:decisionListener:)
failed to return after waiting 10 seconds. main run loop mode: kCFRunLoopDefaultMode

Спасибо за ваши ответы.

4b9b3361

Ответ 1

Как уже упоминалось @zaplitny, мне пришлось обновить Crittercism до последней версии (4.1.0), чтобы эта проблема исчезла.

Ответ 2

Возникла проблема со старой версией библиотеки Crittercism, которая вызвала это. Как отмечали другие в комментариях, эта ошибка была исправлена ​​в версии 4.3.1 Crittercism SDK.

https://app.crittercism.com/downloads/release_notes/ios/4.3.1:

Исправление: Обходное решение для приложений, испытывающих UIWebViews, не загружая данные при первом запуске при работе на iOS 7. Это происходит только в приложениях, которые подкласса UIWebView и Crittercism подала отчет об ошибке с Apple. Примечание. Имейте в виду, что, хотя ваше приложение не может напрямую подклассы UIWebView, это делается во многих распространенных сторонних библиотеках, таких как SDK Google AdMob и Millenial Media.

Ответ 3

Для тех из нас, кто обновил Crittercism до версии 4.1.2, надеясь, что это решит проблему, но это не так. Я могу предложить довольно уродливое, но простое решение: создать и инициализировать UIWebView перед вызовом [Crittercism enableWithAppID:@"***...***"];

- (BOOL)application:(UIApplication*)application didFinishLaunchingWithOptions:(NSDictionary*)launchOptions {
    ...
    UIWebView* fakeWebView = [[[UIWebView alloc] initWithFrame:CGRectMake(-1, -1, 1, 1)] autorelease];
    [fakeWebView loadHTMLString:@"<!DOCTYPE HTML><html><body>I need Crittercism</body></html>" baseURL:nil];
    [mainViewController.view addSubview:fakeWebView];

    [Crittercism enableWithAppID:@"***...***"];
    ...
}

Этот трюк позволил мне не только избавиться от описанной проблемы, но и немного ускорить первую инициализацию реального UIWebView.

Ответ 4

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

Чтобы исправить это, я отключил инструментальное тестирование критерия, это может быть не вариант для всех.

[Crittercism enableWithAppID:@"your_app_id" andDelegate:nil andURLFilters:nil disableInstrumentation:YES];

Если вы не просто создаете веб-представление (вам не нужно добавлять его в качестве подзаголовка), как это было предложено другими, это работает и для меня.

[[UIWebView alloc] initWithFrame:CGRectMake(-1, -1, 1, 1)]
[Crittercism enableWithAppID:@"your_app_id"];

Ответ 5

Попробуйте product --> clean. Это не может повредить. Когда вы запускаете приложение, оно будет только replace/compile измененными файлами. Несколько раз ошибки xCode появляются и не скомпилируют измененный файл. Продукт clean удаляет старые версии скомпилированного кода, поэтому в следующий раз, когда вы его построите, все они будут связаны с последней компиляцией. Опять вам нечего терять, делая это.

Ответ 6

Я вижу ту же проблему, что и вы. Я пробовал:

  • перемещение запроса загрузки из viewDidLoad в viewWillAppear и viewDidAppear, это ничего не помогло
  • попытался перезагрузить веб-просмотр после того, как был сделан запрос на загрузку. еще ничего
  • попытался изменить создание URL из URLWithString в файлURLWithPath и все еще ничего

Что еще более странно, так это то, что ни один из методов делегата не срабатывает, когда страница не загружается. это почти так, как будто веб-просмотр даже не пытается загрузить страницу. Однако, как вы сказали, если вы закрываете приложение из многозадачного представления и открываете его снова, все работает нормально.

могли ли вы найти способ обойти это или найти решение?

Ответ 7

У меня были аналогичные проблемы с моим приложением PhoneGap на IOS7, мне пришлось перерисовать пользовательский интерфейс на странице "viewDidAppear" или "Pageshow", используя приведенный ниже код, и это сработало для меня.

 $(".cls_div_page_content").redraw();
 jQuery.fn.redraw = function() {
   return this.hide(0, function(){$(this).show()});
 };

Ответ 8

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

NSString * test = @ "test this";

[test containsString: @ "test" ];

использование containsString в iOS 7.1 даст вам такую ​​же ошибку, но будет отлично работать в iOS 8.0,

void SendDelegateMessage (NSInvocation *): delegate (webView: solvePolicyForNavigationAction: request: frame: decisionListener:) не удалось вернуться после ожидания 10 секунд. режим основного запуска: kCFRunLoopDefaultMode

Ответ 9

Я тоже столкнулся с этой проблемой. Похоже, проблема возникает, когда некоторые сторонние библиотеки связаны, но я даже не уверен, какой именно ответ был в моем случае. У меня не было Crittercism в моем приложении.

Для меня было установлено, что я нашел здесь, на форуме Apple Dev, чтобы создать UIWebView раньше.

- (BOOL)application:(UIApplication *)application willFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    // In a severe case of WTF: some 3rd party libs (exact culprit unknown) can cause webviews to stop
    // showing anything on iOS 7, and instead have console warnings every 10 seconds that look like:
    // void SendDelegateMessage(NSInvocation *): delegate (webView:decidePolicyForNavigationAction:request:frame:decisionListener:) failed to return after waiting 10 seconds. main run loop mode: kCFRunLoopDefaultMode
    // Just instantiating an UIWebView before any of the 3rd party libs kick in is enough to fix it.
    // Don't know why, but it works.
    if (SYSTEM_VERSION_LESS_THAN(@"8.0")) {
        UIWebView *webView = [[UIWebView alloc] initWithFrame:CGRectMake(0, 0, 320, 320)];
        webView.delegate = nil; // Do something with webView to silence warning
    }
    return YES;
}

Ответ 10

Для тех, кто использует Parse SDK с версией 1.6.x в iOS7/iOS8 и подклассе UIWebView, такая же проблема возникает, если вы используете метод PFInstallation saveInBackground.

Решение заключается в задержке вызова saveInBackground, например:

dispatch_after(dispatch_time(DISPATCH_TIME_NOW, 3.f * NSEC_PER_SEC), dispatch_get_main_queue(), ^{
    [currentInstallation saveInBackground];
});