Một số phương pháp để gỡ lỗi Javascript bên trong UIWebView là gì?


136

Tôi đang cố gắng tìm hiểu tại sao một cái gì đó với Javascript không hoạt động bên trong UIWebView. Theo hiểu biết của tôi, không có cách nào để đặt điểm dừng bên trong XCode cho tệp js. Không có vấn đề gì, tôi sẽ quay trở lại năm 2004 và sử dụng cảnh báo - ồ, chờ đã, dường như chúng cũng không hoạt động bên trong UIWebView!

Điều duy nhất tôi có thể nghĩ đến là bằng cách xuất các tệp HTML và JS của mình sang máy tính để bàn và sau đó chỉ cần thực hiện gỡ lỗi bên trong Safari. Và nó hoạt động! Nhưng tất nhiên, lỗi tôi gặp phải trong UIWebView không xảy ra trong Safari.

Có cách nào khác để gỡ lỗi bên trong UIWebView hoặc bất kỳ thủ thuật nào tôi có thể sử dụng gần giống với phương pháp cảnh báo trường học cũ không?

Câu trả lời:


277

Nếu bạn đang sử dụng iOS> = 6 và bạn có sư tử núi (10.8) hoặc Safari> = 6, bạn có thể chỉ cần:

  1. Mở ứng dụng trong trình giả lập (hoặc thiết bị của bạn trong XCode> = 4.5.x).
  2. Mở Safari (đi đến Preferences -> Advancedvà đảm bảo "Hiển thị Menu phát triển trong Menubar" được bật.
  3. Từ thanh Menu (của Safari) chọn Develop -> iPhone Simulator -> [your webview page].

Đó là nó !


6
Điều này chỉ hoạt động nếu đang chạy ứng dụng trong một trình giả lập. Nếu bạn phải sử dụng thiết bị iOS để gỡ lỗi, hãy xem phương pháp này mobiarch.wordpress.com/2013/04/06/ trên
RajV

7
@RajV Bạn có thể gỡ lỗi UIWebViews trên thiết bị vật lý nhưng chỉ những cái bạn đặt trực tiếp với XCode trên thiết bị của bạn chứ không phải những cái từ Appstore.
alecail

1
Khá rõ ràng, nhưng điều này có thể hữu ích. Tôi đã thử nghiệm điều này trên iOS7 Simulator chạy OSX 10.9 Mavericks và Safari 7 - hoạt động rất tuyệt. Cảm ơn vì điều đó.
Moe

1
@refaelos Cảm ơn !! Nó hoạt động với thiết bị vật lý của tôi nếu tôi sử dụng hồ sơ tạm thời Phát triển.
umang2203

11
Không chắc chắn về trình giả lập nhưng để làm việc này trên thiết bị, có một tùy chọn bạn phải bật trong cài đặt. Settings> Safari> Advanced> Web Inspector<- cho phép này
Hodson

31

Truy vấn này đứng đầu google, vì vậy, đáng để liên kết đến remoteInspector ẩn trong iOS5 - cho đến nay, cách tốt nhất được tìm thấy để gỡ lỗi UIWebViews của bạn - chỉ cần biên dịch có điều kiện trước khi bạn gửi cho Apple.


3
Vẫn hoạt động, sử dụng nó như thế này: [NSClassFromString(@"WebView") performSelector:@selector(_enableRemoteInspector)];Hãy nhớ xóa cuộc gọi khi bạn xây dựng để phát hành!
rpits

1
Đó là một kỹ thuật tuyệt vời. Tuy nhiên, lưu ý rằng trình gỡ lỗi dường như chỉ hoạt động trong safari. Tôi đã thử nó từ các trình duyệt khác (ví dụ chrome) và nó không cho thấy gì.
Sagi Mann

3
Tôi đã từng sử dụng cái này trước đây, nhưng dường như nó không hoạt động kể từ khi Mountain Lion xuất hiện (cách giải quyết có thể có ở đây): iwebinspector.com/help.html#ml
Omer

9

alert () chắc chắn làm việc cho tôi.

Tuy nhiên, bạn cũng có thể thực hiện nhiều việc khác, như tạo cảnh báo DHTML của riêng bạn bật lên trong một lớp. Điều này có thể tốt vì bạn có thể thực hiện nhiều cảnh báo cho một div, mà không dừng ứng dụng của bạn. Bạn cũng có thể viết một dấu vết ngăn xếp cho nó (dấu vết ngăn xếp nằm trong đối tượng ngoại lệ và bạn luôn có thể ném ngoại lệ của riêng mình).

Ngoài ra, nếu chạy trên trình giả lập, "alert ()" tùy chỉnh của bạn có thể gọi vào mục tiêu C và hiển thị chuỗi trong cửa sổ bảng điều khiển của trình giả lập iPhone:

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

và về phía mục tiêu C:

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

Điều đó nói rằng, tôi có một ứng dụng nặng về các công cụ UiWebView / javascript và tôi có xu hướng thực hiện hầu hết các nhà phát triển javascript trong Chrome (mô phỏng những gì cần thiết từ môi trường iPhone)


ý bạn là "alert ()" chắc chắn có tác dụng với tôi? Thực hiện một cuộc gọi vào Objective-C thật sáng tạo, thật ngạc nhiên tôi đã không nghĩ về điều đó trước đây vì tôi đã làm một chút về nó rồi! Cảm ơn. :)
bpapa

Có, alert () hoạt động tốt. Có lẽ nó không có trên một phiên bản cũ hơn? Nhưng tôi đã thử nó và nhận được một cửa sổ bật lên trông gần giống với một cửa sổ được thực hiện với UIAlertView ở phía objC.
cướp

8

Tôi nhận được cách tuyệt vời để gỡ lỗi UIWebView Hoặc SFSafariViewControll .

Tôi mong nó sẽ có ích.

Bước 1: 
 Mở Safari VC trong máy Mac của bạn (hahaha Đừng làm mặt bạn, Nếu tôi đang nói trong Macbook của bạn, hãy làm theo các bước này của tôi)



Bước2: Truy cập tùy chọn Safari và nhấp vào Advance. Bạn sẽ nhận được cài đặt này trên Màn hình MacBook của bạn.

nhập mô tả hình ảnh ở đây

Bây giờ kích hoạt menu Show để phát triển trong thanh menu. Bây giờ tất cả công việc của bạn đã xong. Bạn có nghĩ tôi đang đùa không: P: P không có đàn ông ... 



Bước 3: Chạy ứng dụng của bạn trong Thiết bị hoặc Trình mô phỏng. (Đừng nghĩ chỉ cần chạy) Và đi vào ứng dụng của bạn nơi bạn đang mở Webview hoặc SFSafariViewCont kiểm của bạn. Cho đến bây giờ bạn không hiểu tôi biết. Hãy mát mẻ và xem bước tiếp theo của tôi.

Bước 4: Mở Safari Trong MacBook của bạn và Nhấp vào Tùy chọn phát triển từ thanh Menu. Bạn đã nhận được một cái gì đó MacBook, iPad / iPhone của bạn đang hiển thị phải không ?????

nhập mô tả hình ảnh ở đây



Bước 5: Xong rồi. nhấp vào thiết bị của bạn và nhấp vào URL Cửa sổ bật lên mới sẽ xuất hiện như thế này. nhập mô tả hình ảnh ở đây




Bước 6: bạn đang tìm kiếm gì ở đây trên tất cả các bước.

Bây giờ gỡ lỗi trang web của bạn trên bảng điều khiển này. Hãy hạnh phúc và tận hưởng ngày của bạn trong khi thực hiện mã hóa Với một tách trà hoặc Cà phê.

IMP: Đừng quên bật Xem hình ảnh bên dưới nhập mô tả hình ảnh ở đây 









6

Tôi chưa thử cái này bao giờ, nhưng hãy xem cái này Weinre

Trông rất hứa hẹn.


weinre rất tuyệt, nhưng hãy cẩn thận rằng nó không đi kèm với trình gỡ lỗi JS từng bước; nó chỉ là một "thanh tra web." (Tôi đã không nhận thấy điều này cho đến khi tôi gặp rất nhiều rắc rối khi thiết lập nó trên iPhone của mình.)
Dan Fabulich

Weinre dường như đã ngừng hoạt động kể từ Lion: Tôi không thể có được kết nối nữa, có thể là vấn đề với hộp cát.
rpits

Có vẻ như Adobe đã thỏa thuận với Weinre và cung cấp một ứng dụng có tên Adobe Shadow thực hiện nó. Hoạt động khá tốt.
Adrian Harris Crowne

Tôi đã cài đặt weinre thông qua npm (trình quản lý gói node.js) và nó đang hoạt động với tôi trong Mountain Lion. cài đặt
npm

2
Câu trả lời chỉ liên kết là phù hợp hơn như là một nhận xét.
Joris Meys 17/12/13

4

Đây là một câu hỏi cũ. Nhưng tôi vẫn muốn chia sẻ hai xu của mình.

Tôi đã sử dụng jsconsole.com để gỡ lỗi từ xa. Dễ thôi. Chỉ cần bao gồm một thẻ script và sử dụng nhật ký giao diện điều khiển để gỡ lỗi bằng cách in. Điều này cũng có thể được sử dụng để gỡ lỗi trên một thiết bị thực.


3

Câu hỏi cũ, nhưng tôi nghĩ rằng tôi đã tìm thấy giải pháp tốt nhất, trong trường hợp của tôi, bạn cần gỡ lỗi uiwebview, nhưng tôi không có quyền truy cập vào ứng dụng IOS và chỉ vào nội dung html và tôi phải xem một số nhật ký JS, tôi đã thêm đoạn mã sau để tải JS ánh sáng rực lửa và hiển thị nó tự động:

gọi nó từ JS

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

hoặc tải nó từ html

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

-1

Bạn có thể thiết lập một hệ thống giống như được sử dụng trong PhoneGap để gửi tin nhắn từ JavaScript đến Objective-C và đăng nhập từ đó. Tóm lại, họ đang thiết lập document.location bằng một lược đồ tùy chỉnh và chặn lược đồ đó trong cuộc gọi lại ủy nhiệm.

Bạn có thể tận dụng thực tế là UIWebView là hầu hết các đại biểu cho một WebView. WebKit về mặt kỹ thuật không có giấy tờ cho iPhone, nhưng chủ yếu giống như được chỉ định trong các tiêu đề WebKit trên máy tính để bàn, có thể bao gồm cả WebScriptObject. Tôi sử dụng điều này để gỡ lỗi, nhưng hãy chắc chắn loại bỏ mã này trước khi gửi cho Apple.

Để có được WebView từ UIWebView, hãy triển khai một phương thức ủy nhiệm như -(void) webView:(id)inWebView didFinishLoadForFrame:(id)inWebFrametrong một lớp con của UIWebView. Gọi siêu nếu bạn sử dụng một.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.