2011-11-02 46 views
10

Tôi đã tạo một ứng dụng web có thể được lưu vào "Màn hình chính" trên iPhone. Ứng dụng sử dụng canvas và khá tương tác với trạng thái thay đổi.iPhone WebApp trên Màn hình chính Persistence

Bất cứ khi nào ứng dụng được thu nhỏ và mở lại, ứng dụng sẽ đặt lại trạng thái ban đầu. Điều tương tự (như mong đợi) xảy ra khi đóng ứng dụng và tải lại nó.

  1. Làm cách nào để ngăn tải lại ứng dụng khi nó chỉ bị thu nhỏ?

  2. Cách tốt nhất để duy trì dữ liệu trạng thái sao cho khi ứng dụng là đóng và mở lại tiếp tục liền mạch?

  3. Tôi cần phải sử dụng những sự kiện nào để đảm bảo rằng dữ liệu trạng thái không bị mất?

Nếu có thể là một giải pháp đa nền tảng sẽ được ưa thích iPhone + Android ...

Trả lời

8

TL; DR Bạn sẽ cần phải thiết kế ứng dụng của mình để sử dụng bộ nhớ cục bộ hoặc cookie hoặc một số cơ chế khác mà bạn có thể bảo toàn trạng thái. Nó sẽ cần phải xem xét lưu trữ cục bộ này và xây dựng lại giao diện của nó mỗi khi nó được khởi chạy. Sử dụng bộ nhớ cục bộ hoặc webdb (bị khấu hao nhưng được hỗ trợ), bạn sẽ cần phải lưu mọi thay đổi trạng thái và đảm bảo bạn tải lại chúng khi trang của bạn tải trong trình duyệt.

  1. Xác định giảm thiểu? Đang chạy trong nền?

    Ứng dụng web của bạn, bất kể trạng thái trên màn hình chính, chỉ là một trang khác được tải vào trình duyệt. Do a) thiếu bộ nhớ trên thiết bị và b) cách hoạt động đa nhiệm, các ứng dụng có thể được hệ điều hành yêu cầu để giải phóng bộ nhớ hoặc thậm chí tự chấm dứt bất cứ lúc nào.

    Đây là lý do tại sao khi bạn đang xây dựng một ứng dụng iOS bạn có:

    - (void)applicationWillTerminate:(UIApplication *)application

    Phương pháp này cho phép bạn, như các nhà phát triển, để xác định một hành vi sử dụng (chẳng hạn như tiết kiệm dữ liệu người dùng) trước ứng dụng của bạn chấm dứt khi nó nhận được tín hiệu chấm dứt từ hệ điều hành. Đây cũng là lý do tại sao hướng dẫn dành cho nhà phát triển iOS yêu cầu bạn giữ lại trạng thái và luôn đảm bảo rằng trạng thái của bạn được khôi phục khi ứng dụng được đưa vào nền trước. (Người dùng có thể không biết ứng dụng đã bị chấm dứt vì nó vẫn sẽ xuất hiện trong danh sách "ứng dụng đang chạy" khi bạn nhấp đúp vào nhà).

    Bây giờ tôi hiểu bạn đang nói về một ứng dụng web, nhưng điều này là quan trọng.Các trang web, và tôi cũng chắc chắn là của bạn, chiếm một số bộ nhớ trong điện thoại - bạn đã có DOM, tất cả các tài nguyên, thông tin về trạng thái là nơi trang và vật dụng nào được đặt thành gì. Bạn nói ứng dụng của bạn khá tương tác bằng cách sử dụng canvas và nội dung - tôi chắc chắn rằng nó chiếm nhiều bộ nhớ.

    Vì vậy, khi bạn đặt Safari ở chế độ nền, Safari rất có khả năng truy cập bộ nhớ cache trong bộ nhớ của bạn.

  2. Safari có quyền truy cập vào cả bộ nhớ cục bộ và dữ liệu cookie. iOS5 cũng có quyền truy cập vào WebSQL (nhưng không có IndexedDB mà là buồn vì WebSQL được khấu hao). Chọn chất độc của bạn.

  3. Bạn cần phải luôn luôn lưu trạng thái. Vì bạn không có quyền truy cập vào các phương thức UIApplicationDelegate thông qua JS, mỗi lần người dùng thực hiện điều gì đó, bạn sẽ cần phải lưu thay đổi trạng thái đó. Và mỗi lần trang của bạn được tải lại, nó cần phải kiểm tra trạng thái ổn định và tải lại từ tùy chọn lưu trữ mà bạn đã chọn.

+0

yep, thu nhỏ = chạy trong nền. Nếu tôi tạo một ứng dụng iPhone gốc, JavaScript có thể giao tiếp với ObjectiveC tự nhiên (và ngược lại) không? Ví dụ: nếu tôi sử dụng 'UIWebView'. Tôi nghĩ rằng nó được cho là dễ dàng để tạo ra các ứng dụng web cho iphone + android nhưng có vẻ là một số cạm bẫy khá lớn. –

+0

Nếu nó chạy trong một uiwebview nó không phải là một ứng dụng bản địa có nghĩa là bạn phải xử lý những thứ bên ngoài bối cảnh của khung ứng dụng gốc. Đó là "dễ dàng" nhưng đòi hỏi sự chú ý cụ thể đến cách điện thoại xử lý các lượt xem web trong các ứng dụng. – tkone

+0

Có lẽ 'stringByEvaluatingJavaScriptFromString' có thể được sử dụng để thực hiện các hàm từ bên trong ngữ cảnh của UIWebView? Vì vậy, nếu tôi đã gọi hàm đó sau một giây, nó có thể lấy ra một tên hành động/params như một chuỗi được mã hóa và sau đó trả lời người dùng khi cần thiết. Điều này sẽ cho phép JavaScript từ trong chế độ xem web thông báo mã ứng dụng gốc ... hoặc có cách tiếp cận tốt hơn. Tôi đánh giá cao sự hiểu biết của bạn –

1

Nếu bạn lưu trạng thái hiện bằng cách sử dụng API localStorage và khôi phục từ API này trên tải, bạn sẽ có thể tái tạo trạng thái ứng dụng.

Tôi khuyên bạn nên trang này cho một tổng quan về các API lưu trữ địa phương: http://diveintohtml5.info/storage.html

Tôi sợ bạn sẽ gặp khó khăn khi ngăn chặn ứng dụng/trang web trong bộ nhớ khi nó ở chế độ nền, nhưng liên tục lưu trữ nhà nước để localStorage và khôi phục trạng thái khi các trang được nạp (window.onload hoặc $ (document) .ready()) sẽ là một giải pháp.

0
  1. Tôi không nghĩ rằng bạn có thể
  2. WebKit hỗ trợ lưu trữ dữ liệu HTML5 Client-Side, mà bạn có thể sử dụng
  3. Tôi không biết về bất kỳ cách nào webapp của bạn sẽ nhận được thông báo về kết thúc, vì vậy bạn nên cố gắng lưu trạng thái hiện tại sau mỗi bước trong điều hướng của bạn, vv (Background behavior for iOS Web App (so app doesn't restart)).
0

Nếu ứng dụng của bạn chỉ được sử dụng vải cho render, sau đó bạn có thể ràng buộc một chức năng để các window.unload hoặc sự kiện pagehide rằng bất cứ khi nào trang được bốc dỡ các chức năng chụp dữ liệu pixel của vải sử dụng

ctx.getImageData() 
  • và lưu trữ trong localstorage, sau đó khi trang được tải lại, bạn có thể đẩy trực tiếp dữ liệu đó vào canvas để tải lại gần và đặt ontop spinner trong khi bạn tải ứng dụng thực đằng sau nó.
Các vấn đề liên quan