Каковы некоторые методы для отладки Javascript внутри UIWebView?

Я пытаюсь понять, почему что-то с Javascript не работает внутри UIWebView. Насколько я знаю, нет способа установить точку останова внутри XCode для js файла. Нет проблем, я просто вернусь к 2004 году и использую предупреждающие статуты - о, если они не работают внутри UIWebView!

Единственное, о чем я мог думать, это экспортировать мои файлы HTML и JS на рабочий стол, а затем просто выполнить мою отладку внутри Safari. И это работает! Но, конечно, ошибка, с которой я сражаюсь в UIWebView, не встречается в Safari.

Есть ли другие способы отладки внутри UIWebView или любые трюки, которые я могу использовать с помощью метода предупреждения о старой школе?

Ответ 1

Если вы используете iOS >= 6, и у вас есть горный лев (10.8) или Safari >= 6, вы можете просто:

  • Откройте приложение в симуляторе (или ваше устройство в XCode >= 4.5.x).
  • Откройте Safari (перейдите к Preferences -> Advanced и убедитесь, что в меню "Показать меню разработки в меню" включено.
  • На панели меню (Safari) выберите Develop -> iPhone Simulator -> [your webview page].

Что это!

Ответ 2

Этот запрос подходит для Google, поэтому стоит привязать к remoteInspector, спрятанному в iOS5 - безусловно, лучший способ найти отладочную версию UIWebViews - просто условная компиляция перед отправкой в ​​Apple.

Ответ 3

alert(), безусловно, работает для меня.

Однако вы также можете делать много других вещей, например, создавать собственное оповещение DHTML, которое появляется в слое. Это может быть приятно, потому что вы можете делать несколько предупреждений в одном div без остановки вашего приложения. Вы также должны иметь возможность записывать трассировку стека (трассировка стека находится в объекте исключения, и вы всегда можете отказаться от своих собственных исключений).

В качестве альтернативы, если вы работаете на симуляторе, пользовательский "alert()" может вызывать в объекте C и отображать строку в окне консоли симулятора iPhone:

document.location.href = "http://debugger/" + 
   encodeURIComponent(outputString);   

и на стороне цели C:

//--------------------------------------------------------------------
- (BOOL)webView:(UIWebView*)webView 
       shouldStartLoadWithRequest: (NSURLRequest*)req 
       navigationType:(UIWebViewNavigationType)navigationType {
    if ([[[req URL] host] isEqualToString:@"debugger"]){
        // do stuff with [[req URL] path] 
       }
}

Тем не менее, у меня есть приложение, которое тяжело работает с файлами UiWebView/javascript, и я стараюсь использовать большинство javascript-разработчиков в Chrome (имитируя то, что необходимо в среде iPhone).

Ответ 4

Я еще не пробовал этого, но посмотрите на это Weinre

Выглядит очень многообещающе.

Ответ 5

Это старый вопрос. Но я по-прежнему хочу поделиться своими двумя центами.

Я использовал jsconsole.com для удаленной отладки. Это легко. Просто добавьте тег script и используйте консольные журналы для отладки путем печати. Это также можно использовать для отладки на реальном устройстве.

Ответ 6

Старый вопрос, но я думаю, что нашел лучшее решение, в моем случае вам нужно отлаживать uiwebview, но у меня не было доступа к приложению IOS и только к содержимому html, и мне пришлось просматривать некоторые журналы JS, я добавил следующий код для загрузки легкого firebug JS и его автоматического отображения:

, вызывающий его из JS

var script = document.createElement('script');
script.type = 'text/javascript';
script.src = 'https://getfirebug.com/firebug-lite-debug.js';
document.head.appendChild(script);

или загрузить его из html

<script type="text/javascript" src="https://getfirebug.com/firebug-lite-debug.js"></script>

Ответ 7

Вы можете настроить систему, используемую в PhoneGap, чтобы отправлять сообщения с JavaScript на Objective-C и регистрироваться оттуда. В двух словах они устанавливают document.location с помощью специальной схемы и блокируют эту схему в обратном вызове делегата.

Вы можете воспользоваться тем фактом, что UIWebView является большинством делегатов для WebView. WebKit технически недокументирован для iPhone, но в основном такой же, как указано в заголовках WebKit на рабочем столе, возможно, включая WebScriptObject. Я использую это для отладки, но обязательно удалите этот код перед отправкой в ​​Apple.

Чтобы получить WebView из UIWebView, реализуйте метод делегата типа -(void) webView:(id)inWebView didFinishLoadForFrame:(id)inWebFrame в подклассе UIWebView. Позвоните супер, если вы используете этот.