2014-10-01 22 views
7

Nếu trang được tải vào số UIWebView có chứa lời gọi Javascript setInterval(), hành vi của bộ hẹn giờ đó khi điện thoại chuyển sang chế độ ngủ là gì?iOS UIWebView Javascript Timers

Có bất kỳ điểm nào trong thời gian khi tất cả các bộ hẹn giờ được dừng không?

Bộ hẹn giờ có được khởi động lại khi điện thoại được đánh thức không? Nếu vậy, bộ hẹn giờ có bắt đầu ở nơi nó bị tạm dừng hay bắt đầu từ 0 không?

Trả lời

9

Quản lý bộ đếm thời gian nội bộ WebKit hơi khác thường và đặc biệt trong iOS. Chúng được đăng ký ở chế độ NSDefaultRunLoopMode, ví dụ, khi cuộn trong giao diện người dùng, các sự kiện Javascript không kích hoạt, nhưng chúng không được tổng hợp, giống như với các bộ tính giờ thông thường (NSTimer).

Để trả lời câu hỏi của bạn, khi quá trình đăng ký bị tạm ngưng, bộ hẹn giờ cũng bị tạm ngưng, vì vậy chúng sẽ không kích hoạt trong khi quá trình này vẫn bị treo. Khi quá trình được tiếp tục vì bất kỳ lý do gì (người dùng đã mở ứng dụng, tìm nạp nền, v.v.), bộ hẹn giờ sẽ tiếp tục chạy, và sẽ tiếp tục đến điểm tương đối khi dấu tick cuối cùng được cho là.

Vì vậy, nếu bạn đặt hẹn giờ cứ sau 10 giây và đóng ứng dụng ở t + 1 giây, sau đó mở lại ứng dụng ở t + 35 giây, bộ hẹn giờ sẽ kích hoạt sau 5 giây; bạn sẽ không nghe thấy hồi âm t + 10, t + 20 và t + 30 giây.

Lưu ý: Đây là bộ quản lý hẹn giờ dựa trên mô hình quá trình UIWebView/WebKitLegacy /; Tôi không hoàn toàn có kinh nghiệm với cách WKWebView/WebKit2/xử lý chúng.

+1

Câu trả lời hay. Có bất kỳ điểm nào trong thời gian mà các bộ đếm thời gian và/hoặc JS sẽ được khai hoang/dừng lại hay không. Chúng tôi đang gặp phải sự cố sau một khoảng thời gian nhất định mà bộ hẹn giờ không còn kích hoạt ngay cả khi ứng dụng được đưa vào nền trước. Tôi nhận thấy sau một thời gian dài (nói 6-12 giờ) khi đưa ứng dụng vào nền trước, các tệp JS được tải xuống lại. Tôi hy vọng các bộ định thời sẽ tiếp tục, nhưng chúng không. – Steve

+0

@Steve Tôi không quen với vấn đề này. Có vẻ như WebKit cố gắng tải lại các tài nguyên được giải phóng khỏi bộ nhớ cache và thực hiện theo cách xấu. Tôi sẽ tài sản rằng khuôn khổ không tính đến các tình huống như vậy. Có lẽ nó có thể là một giải pháp tốt hơn để sử dụng NSTimers và kích hoạt mã JS bằng cách sử dụng 'stringByEvaluatingJavaScriptFromString:'. Điều này sẽ giới thiệu một hành vi có trật tự và có thể dự đoán được nhiều hơn. –

+0

Ok, đó là cơ bản những gì chúng tôi đã kết thúc và thực hiện JS để khởi động lại bộ hẹn giờ mỗi khi ứng dụng đến nền trước. Cảm ơn. – Steve

Các vấn đề liên quan