Які існують методи налагодження Javascript всередині UIWebView?


136

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

Єдине, про що я міг придумати - це експорт моїх файлів HTML та JS на робочий стіл, а потім просто налагодження всередині Safari. І це працює! Але, звичайно, помилка, з якою я борюся в UIWebView, не зустрічається в Safari.

Чи є якісь інші способи налагодження всередині UIWebView або будь-які хитрощі, які я можу використати як для використання методу попередження у школі?

Відповіді:


277

Якщо ви використовуєте iOS> = 6 і у вас є гірський лев (10.8) або Safari> = 6, ви можете просто:

  1. Відкрийте програму в тренажері (або пристрої в XCode> = 4.5.x).
  2. Відкрийте Safari (перейдіть на сторінку Preferences -> Advancedта переконайтесь, що "Показати меню" Розвивати меню в меню ").
  3. На панелі меню (на Safari) виберіть Develop -> iPhone Simulator -> [your webview page].

Це воно !


6
Це працює лише в тому випадку, якщо програма запущена в тренажері. Якщо вам потрібно використовувати пристрій iOS для налагодження, дивіться такий підхід mobiarch.wordpress.com/2013/04/06/…
RajV

7
@RajV Ви можете налагоджувати налагодження UIWebViews на фізичному пристрої, але лише ті, які ви поставили безпосередньо з XCode на своєму пристрої, а не ті, які ви користуєтесь Appstore.
alecail

1
Досить очевидно, але це може бути корисно. Я перевірив це на iOS7 Simulator під керуванням OSX 10.9 Mavericks і Safari 7 - прекрасно працює. Дякую за це
Moe

1
@refaelos Дякую !! Її робота працює з моїм фізичним пристроєм, якщо я використовую попередній профіль розробки.
umang2203

11
Не впевнений у симуляторі, але для того, щоб це працювало на пристрої, у налаштуваннях потрібно включити параметр. Settings> Safari> Advanced> Web Inspector<- включити це
Ходсон

31

Цей запит перевершує Google, тому варто звернутися до віддаленого інспектора, прихованого в iOS5 - безумовно найкращим способом, знайденим поки що для налагодження ваших UIWebViews, - лише умовною компіляцією, перш ніж відправляти в Apple.


3
Все ще працює, використовуйте його так: Не [NSClassFromString(@"WebView") performSelector:@selector(_enableRemoteInspector)];забудьте видалити виклик, коли ви збираєтеся до випуску!
rpitting

1
Це чудова техніка. Однак зауважте, що налагоджувач, здається, працює лише в сафарі. Я спробував це з інших браузерів (хромував, наприклад), і він нічого не показав.
Сагі Манн

3
Раніше я використовував це раніше, але , мабуть , це не працює зараз , так як Mountain Lion з'явився (можливий обхідний шлях тут): iwebinspector.com/help.html#ml
Omer

9

alert () безумовно працює для мене.

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

Крім того, якщо працює на тренажері, ваш власний "alert ()" може зателефонувати в об'єктив C і відобразити рядок у вікні консолі симулятора iPhone:

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

і з об'єктивної сторони С:

//--------------------------------------------------------------------
- (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

Так, попередження () працює чудово. Можливо, це не було в старій версії? Але я просто спробував це і отримав спливаюче вікно, яке виглядає майже ідентично тому, яке було зроблено з UIAlertView на стороні objC.
пограбувати

8

Я отримую дивовижний спосіб налагодити UIWebView або SFSafariViewController .

Я сподіваюся, що це допоможе.

Крок 1. 
 Відкрийте Safari VC на своєму Mac (ха-ха-ха, не робіть обличчя; якщо я кажу у вашому Macbook, просто виконайте ці мої кроки)



Крок 2: Перейдіть за налаштуваннями Safari і натисніть на заздалегідь. Ви отримаєте це налаштування на екрані MacBook.

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

Тепер увімкніть меню "Показати для розробки" на панелі меню. Тепер ваша робота виконана. Ти думаєш, що я жартую: P: P ніхто не ... 



Крок 3. Запустіть додаток у пристрої чи симуляторі. (Не думайте, просто запустіть) І перейдіть у свою програму, де ви відкриваєте веб-перегляд або SFSafariViewController. Дотепер ти не зрозумів, що я знаю. Будь крутий і подивись наступний мій крок.

Крок 4: Відкрийте Safari у вашому MacBook і натисніть кнопку Розробити параметр на панелі меню. Ви отримали щось, що ваш MacBook, iPad / iPhone відображає правильно ?????

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



Крок 5: Зроблено. натисніть свій пристрій і натисніть на URL. Спливаюче вікно з'явиться таким чином. введіть тут опис зображення




Крок 6: що ви дивитесь, тут все кроки.

Тепер налагоджуйте свою веб-сторінку на цій консолі. Будьте щасливі і насолоджуйтесь своїм днем, роблячи кодування за чашкою чаю або кави.

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









6

Я ще цього не пробував, але погляньте на цей Вайнре

Виглядає дуже перспективно.


weinre крутий, але будьте обережні, що він не поставляється з поетапним налагоджувачем JS; це просто "веб-інспектор". (Я цього не помічав, поки не
зіткнувся з великими

Здається, Вайнре припинив роботу з Лева: я більше не можу отримати з'єднання, можливо, проблема з пісочницею.
rpitting

Здається, що Adobe зараз має угоду з Weinre і пропонує програму під назвою Adobe Shadow, яка реалізує її. Працює досить добре.
Адріан Харріс Кроун,

Я встановив weinre через npm (node.js менеджер пакунків), і він працює для мене в Mountain Lion. npm install -g weinre
wprl

2
Відповіді лише на посилання краще підходять як коментар.
Joris Meys

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. Телефонуйте супер, якщо ви користуєтесь цим.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.