UIWebView 내에서 Javascript를 디버깅하는 몇 가지 방법은 무엇입니까?


136

왜 Javascript가있는 것이 UIWebView 내에서 작동하지 않는지 알아 내려고합니다. 내 지식으로는 js 파일에 대한 XCode 내부에 중단 점을 설정할 수있는 방법이 없습니다. 문제 없습니다. 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 실제 장치에서는 UIWebView를 디버깅 할 수 있지만 Appstore의 것은 아니지만 장치에서 XCode로 직접 입력 한 UIWebView 만 디버깅 할 수 있습니다.
alecail

1
매우 명백하지만 이것은 도움이 될 수 있습니다. OSX 10.9 Mavericks 및 Safari 7을 실행하는 iOS7 시뮬레이터 에서이 기능을 테스트했습니다. 고마워
Moe

1
트윗 담아 가기 개발 임시 프로파일을 사용하면 실제 장치와 함께 작동합니다.
umang2203

11
시뮬레이터에 대해서는 확실하지 않지만 장치에서 작동하게하려면 설정에서 활성화해야하는 옵션이 있습니다. Settings> Safari> Advanced> Web Inspector<-이 가능
호드 슨

31

이 쿼리는 Google을 최우선으로하여 iOS5에 숨겨진 remoteInspector에 연결 하는 것이 좋습니다. 지금까지 UIWebViews를 디버깅하는 가장 좋은 방법은 Apple에 보내기 전에 조건부 컴파일입니다.


3
여전히 작동하지만 다음과 같이 사용하십시오. [NSClassFromString(@"WebView") performSelector:@selector(_enableRemoteInspector)];릴리스를 빌드 할 때 호출을 제거하십시오!
12

1
훌륭한 기술입니다. 그러나 디버거는 사파리에서만 작동하는 것으로 보입니다. 다른 브라우저 (예 : 크롬)에서 시도했지만 아무것도 표시되지 않았습니다.
Sagi Mann

3
나는 이것을 전에 사용 했었지만 Mountain Lion이 나타 났으므로 지금은 작동하지 않습니다 (여기서 가능한 해결 방법) : iwebinspector.com/help.html#ml
Omer

9

alert () 확실히 나를 위해 작동합니다.

그러나 레이어에 팝업되는 DHTML 경고를 직접 만드는 등 다른 많은 작업을 수행 할 수도 있습니다. 앱을 중지하지 않고 단일 div에 여러 번 경고 할 수 있기 때문에 좋습니다. 또한 스택 추적을 작성할 수 있어야합니다 (스택 추적은 예외 개체에 있으며 언제든지 자신의 예외를 throw 할 수 있음).

또는 시뮬레이터에서 실행중인 경우 사용자 정의 "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에 무거운 앱이 있으며 Chrome에서 대부분의 javascript 개발자를 수행하는 경향이 있습니다 (iPhone 환경에서 필요한 것을 시뮬레이션).


"alert ()"가 확실히 작동한다는 것은 무엇을 의미합니까? Objective-C에 전화를 거는 것은 독창적이며, 이미 약간의 노력을 기울인 이후로 생각하지 않았습니다. 감사. :)
bpapa

예, alert ()은 정상적으로 작동합니다. 이전 버전이 아닐 수도 있습니다. 그러나 방금 시도해 보았고 objC 측의 UIAlertView와 거의 동일한 팝업이 나타납니다.
rob

8

UIWebView 또는 SFSafariViewController 를 디버깅하는 가장 좋은 방법을 얻습니다 .

도움이 되길 바랍니다.

1 단계 : 
 Mac에서 Safari VC 열기 (hahaha 얼굴을 만들지 마십시오. Macbook에서 말하면이 단계를 따르십시오)



2 단계 : Safari 환경 설정으로 이동하여 고급을 클릭하십시오. MacBook 화면에서이 설정을 가져옵니다.

여기에 이미지 설명을 입력하십시오

이제 메뉴 표시 줄에서 Show to develop 메뉴를 활성화하십시오. 이제 모든 작업이 완료되었습니다. 내가 농담하고 있다고 생각하니 : P : P no man ... 



3 단계 : 장치 또는 시뮬레이터에서 응용 프로그램을 실행하십시오. (실행하지 마십시오) Webview 또는 SFSafariViewController를 여는 응용 프로그램으로 이동하십시오. 지금까지 당신은 내가 아는 것을 이해하지 못했습니다. 차갑게 내 다음 단계를 참조하십시오.

4 단계 : MacBook에서 Safari 열기 및 메뉴 막대에서 개발 옵션을 클릭하십시오. MacBook, iPad / iPhone이 올바르게 표시하고 있습니까 ?????

여기에 이미지 설명을 입력하십시오



5 단계 : 완료 장치를 클릭하고 URL을 클릭하십시오. 새로운 팝업이 다음과 같이 나옵니다. 여기에 이미지 설명을 입력하십시오




6 단계 : 지금 여기 모든 단계를보고있는 것이 무엇입니까?

이제이 콘솔에서 웹 페이지를 디버깅하십시오. 차나 커피를 마시면서 코딩을하면서 행복하고 즐거운 하루를 보내십시오.

IMP : 아래 이미지 참조를 활성화하는 것을 잊지 마십시오 여기에 이미지 설명을 입력하십시오 









6

나는 아직 이것을 시도하지는 않았지만 이것을 보아라.

매우 유망 해 보인다.


weinre는 멋지지만 단계적인 JS 디버거와 함께 제공되지 않습니다. "웹 관리자"일뿐입니다. (내 아이폰에 설치하는 데 많은 어려움을 겪을 때까지 나는 이것을 알지 못했습니다.)
Dan Fabulich

Weinre는 Lion 이후로 일을 중단 한 것으로 보입니다. 더 이상 연결을 얻을 수 없으며 샌드 박스 문제 일 수 있습니다.
12

Adobe는 현재 Weinre와 거래하고 있으며이를 구현하는 Adobe Shadow라는 앱을 제공하는 것 같습니다. 꽤 잘 작동합니다.
Adrian Harris Crowne

npm (node.js 패키지 관리자)을 통해 weinre를 설치했으며 Mountain Lion에서 나를 위해 일하고 있습니다. npm install -g weinre
wprl

2
링크 전용 답변이 주석으로 더 적합합니다.
Joris Meys

4

이것은 오래된 질문입니다. 그러나 나는 여전히 내 2 센트를 공유하고 싶습니다.

원격 디버깅을 위해 jsconsole.com 을 사용하고 있습니다. 그것은 간단합니다. 스크립트 태그를 포함하고 콘솔 로그를 사용하여 인쇄하여 디버그하십시오. 실제 장치에서 디버깅하는 데에도 사용할 수 있습니다.


3

오래된 질문이지만 최선의 해결책을 찾았습니다. 제 경우에는 uiwebview를 디버깅해야하지만 IOS 앱과 HTML 내용에만 액세스 할 수 없으며 JS 로그를보아야합니다. 다음 코드를 추가했습니다. light 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 용으로 기술적으로 문서화되어 있지 않지만 대부분 WebScriptObject를 포함하여 데스크탑 WebKit 헤더에 지정된 것과 동일합니다. 나는 이것을 디버깅에 사용하지만 Apple에 제출하기 전에이 코드를 제거해야합니다.

UIWebView에서 WebView를 가져 오려면 UIWebView -(void) webView:(id)inWebView didFinishLoadForFrame:(id)inWebFrame의 서브 클래스에서 와 같은 대리자 메소드를 구현하십시오 . 당신이 그것을 사용하는 경우 슈퍼를 호출합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.