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

137

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

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

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

bpapa
источник

Ответы:

280

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

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

Это оно !

Refaelos
источник
6
Это работает, только если приложение запущено в симуляторе. Если вам необходимо использовать устройство iOS для отладки, см. Этот подход mobiarch.wordpress.com/2013/04/06/…
RajV
7
@RajV Вы можете отлаживать UIWebViews на физическом устройстве, но только те, которые вы помещаете непосредственно с XCode на свое устройство, а не те, которые находятся в магазине приложений.
alecail 09
1
Довольно очевидно, но это может быть полезно. Я тестировал это на iOS7 Simulator под управлением OSX 10.9 Mavericks и Safari 7 - работает прекрасно. Спасибо за это.
Moe
1
@refaelos Спасибо !! Он работает с моим физическим устройством, если я использую предварительный профиль разработки.
umang2203 02
11
Не уверен в симуляторе, но чтобы заставить это работать на устройстве, есть опция, которую вы должны включить в настройках. Settings> Safari> Advanced> Web Inspector<- включить это
Ходсон
31

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

Дэн Беннетт
источник
3
Все еще работает, используйте это так: Не [NSClassFromString(@"WebView") performSelector:@selector(_enableRemoteInspector)];забудьте удалить вызов при сборке для выпуска!
rpitting
1
Это отличная техника. Однако обратите внимание, что отладчик, похоже, работает только в сафари. Я пробовал использовать его в других браузерах (например, Chrome), но ничего не показал.
Sagi Mann
3
Раньше я использовал это, но, видимо, теперь он не работает, так как появился Mountain Lion (возможный обходной путь здесь): iwebinspector.com/help.html#ml
Омер,
9

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)

грабить
источник
что вы имеете в виду, что "alert ()" определенно работает для меня? Обращение к Objective-C - это творческий подход, и я удивлен, что не подумал об этом раньше, так как уже немного этим занимаюсь! Спасибо. :)
bpapa
Да, alert () отлично работает. Может, на более старой версии этого не было? Но я просто попробовал и получил всплывающее окно, которое выглядит почти идентично тому, которое сделано с помощью UIAlertView на стороне objC.
ограбить
8

У меня есть отличный способ отладки UIWebView или SFSafariViewController .

Надеюсь, это поможет.

Шаг 1. 
 Откройте Safari VC на вашем Mac (хахаха, не корчите лицо, если я говорю в вашем Macbook, просто следуйте этим моим шагам)



Шаг 2: перейдите в настройки Safari и нажмите «Вперед». Вы получите эту настройку на экране вашего MacBook.

введите описание изображения здесь

Теперь включите Показать для разработки меню в строке меню. Теперь вся ваша работа сделана. Вы думаете, что я шучу: P: P нет ... 



Шаг 3. Запустите приложение на устройстве или в симуляторе. (Не думайте, просто запустите) И войдите в свое приложение, в котором вы открываете свой Webview или SFSafariViewController. До сих пор вы не понимали, я знаю. Успокойся и посмотри на мой следующий шаг.

Шаг 4: Откройте Safari на своем MacBook и нажмите «Разработка» в строке меню. У вас есть что-то, что ваш MacBook, iPad / iPhone отображает правильно ?????

введите описание изображения здесь



Шаг 5: Готово. щелкните свое устройство и щелкните URL-адрес. Появится новое всплывающее окно. введите описание изображения здесь




Шаг 6: что вы смотрите сейчас, все шаги здесь.

Теперь выполните отладку своей веб-страницы на этой консоли. Будьте счастливы и наслаждайтесь своим днем, занимаясь кодированием с чашкой чая или кофе.

IMP: не забудьте включить см. Изображение ниже введите описание изображения здесь 








Ануп Гупта
источник
6

Я еще не пробовал, но взгляните на эту Вейнре

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

Адриан Харрис Краун
источник
weinre - это круто, но будьте осторожны: в нем нет пошагового отладчика JS; это просто «веб-инспектор». (Я не замечал этого до тех пор, пока у меня не возникли большие проблемы с настройкой его на моем iPhone.)
Дэн Фабулич
Похоже, что Weinre перестал работать с тех пор, как Lion: я больше не могу подключаться, возможно, проблема с песочницей.
rpitting
Похоже, что Adobe заключила сделку с Вейнре и предлагает приложение под названием Adobe Shadow, которое реализует его. Работает неплохо.
Адриан Харрис Краун
Я установил weinre через npm (менеджер пакетов node.js), и он у меня работает в Mountain Lion. npm install -g weinre
wprl
2
Ответы, содержащие только ссылки, лучше подходят в качестве комментария.
Джорис Мейс
4

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

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

Казекаге Гаара
источник
3

Старый вопрос, но я думаю, что нашел лучшее решение, в моем случае вам нужно отладить 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>
Талсибония
источник
-1

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

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

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

втянутый
источник