Thứ Ba, 6 tháng 9, 2016

Cơ chế không phụ thuộc ngày của thiết bị

Cơ chế không phụ thuộc ngày của thiết bị

Tác giả: Trần Lê Nhân

Mục đích:  Đa số ứng dụng hiện nay cung cấp cho người dùng khả năng sử dụng ứng dụng ở chế độ online (kết nối internet qua wifi hay 3G) lẫn offline (thực thi mà không cần kết nối internet). Game phổ biến là Candy Crush với khả năng thực thi trên nhiều platform từ web application, iOS, Android, Windows, … là một ví dụ. Tuy nhiên, khi thực thi ở chế độ offline, người dùng dễ dàng cheating bằng cách chỉnh lại ngày giờ của thiết bị đang sử dụng. Từ vấn đề nêu trên, câu hỏi đặt ra là bằng cách nào để ứng dụng khi thực thi ở chế độ offline không bị lệ thuộc vào ngày giờ của thiết bị mà phải luôn thực thi theo giờ của server? Chúng tôi đưa ra giải pháp cho phép các ứng dụng khi thực thi offline sẽ không bị phụ thuộc vào ngày giờ thiết bị với mục đính ngăn chặn các hành vi làm thay đổi kết quả của ứng dụng theo hướng không tốt từ phía người dùng.

Tác giả: Trần Lê Nhân

Mục đích:  Đa số ứng dụng hiện nay cung cấp cho người dùng khả năng sử dụng ứng dụng ở chế độ online (kết nối internet qua wifi hay 3G) lẫn offline (thực thi mà không cần kết nối internet). Game phổ biến là Candy Crush với khả năng thực thi trên nhiều platform từ web application, iOS, Android, Windows, … là một ví dụ. Tuy nhiên, khi thực thi ở chế độ offline, người dùng dễ dàng cheating bằng cách chỉnh lại ngày giờ của thiết bị đang sử dụng. Từ vấn đề nêu trên, câu hỏi đặt ra là bằng cách nào để ứng dụng khi thực thi ở chế độ offline không bị lệ thuộc vào ngày giờ của thiết bị mà phải luôn thực thi theo giờ của server? Chúng tôi đưa ra giải pháp cho phép các ứng dụng khi thực thi offline sẽ không bị phụ thuộc vào ngày giờ thiết bị với mục đính ngăn chặn các hành vi làm thay đổi kết quả của ứng dụng theo hướng không tốt từ phía người dùng.

Đầu tiên, chúng tôi trình bày tổng quát ý tưởng thực hiện như sau:

·         Chúng tôi trình bày giải pháp của chúng tôi dựa trên hai nền tảng đó là web services được xây dựng bằng .NET và công nghệ thiết bị chúng tôi chọn lựa là Android

·         Ngày của server sẽ được lưu trữ vào shared preference của thiết bị. Do vậy, mọi tác  vụ liên quan với ngày giờ sẽ được tính toán dựa vào giá trị lưu trữ này (chúng tôi gọi giá trị này là ServerDate – đơn vị tính của nó là ngày).

·         Khi ứng dụng có thể kết nối tới server (online), thiết bị sẽ tiến hành cập nhật lại giá trị này từ server.

·         Chúng ta sẽ xây dựng một service trên thiết bị, theo chu kỳ 24 tiếng, nếu giá trị ServerDate chưa được cập nhật, thiết bị sẽ tiến hành tăng giá trị ServerDate lên 1 đơn vị.

Sau đây, chúng tôi thực hiện một ứng dụng đơn giản để thể hiện ý tưởng đã nêu trên.

·          Ứng dụng này khi thực thi sẽ yêu cầu người dùng login vào hệ thống. Khi login thành công, ứng dụng sẽ hiển thị ngày của server ngay khi ứng dụng đang thực thi ở chế độ offline.

·         Các yêu cầu

o   Tool sử dụng trong xây dựng ứng dụng

§  Android Studio 1.5.1

§  Visual Studio 2013

o   Các thư viện hỗ trợ

§  Retrofit 2.0

·         Các bước thực hiện

Bước 1. Sử dụng .NET để tạo một web service ở phía server để lấy ngày giờ hiện tại của server. Services này sẽ đưa ngày tháng ở server trả về dưới dạng JSON

Thực hiện test thử services này, chúng ta sẽ nhận được kết quả dưới dạng JSON do server trả về như hình bên dưới

Bước 2. Trên Android, chúng ta thực hiện cài đặt phương thức với mục đích yêu cầu web service sử dụng Retrofit 2.0  đã thực hiện ở bước 1. Dựa trên kết quả trả về, chúng ta sẽ tiến hành xử lý kết quả theo ý tưởng mô tả ở phần đầu bài viết

·         Đầu tiên, chúng ta tạo class RespondModel để lưu trữ dữ liệu do server trả về

 

·         Tiếp theo, chúng ta tạo thêm class Util với các hàm so sánh sự khác biệt của 02 ngày đem vào so sánh, và hàm cộng thêm số ngày được đưa vào hàm

·         Kế tiếp, chúng ta thực hiện tạo shared preference để lưu trữ ngày server cùng với 1 số thông tin về user.

 

 

·         Để có thể gọi web service, chúng ta thực hiện import thư viện Retrofit 2.0 vào project, cụ thể là tập tin build.gradle

·         Tiếp theo, chúng ta xây dựng Interface và rest service (quí vị có thể tham khảo chi tiết phần gọi Service của Retrofit tại http://square.github.io/retrofit/ )

o   Tạo interface

 

o   Tạo Rest Service (địa chỉ gọi web service quí vị phải thay đổi tủy theo địa chỉ service quí vị đã host trên domain nào của server. Trong thực tế xây dựng ứng dụng, quí vị phải xây dựng tập tin properties để chứa địa chỉ server và đọc giá trị nó vào trong code nhằm hướng tới sự thuận lợi cho việc nâng cấp và bảo trì ứng dụng)

 

o   Cập nhật tập tin Manifests

·         Cuối cùng, chúng ta sẽ implement hàm Sync để xử lý kết quả do server trả về

o   Khi server trả về ngày hiện tại, chúng ta sẽ đem so sánh ngày từ server với ngày của thiết bị sử dụng hàm so sánh hai ngày đã nêu ở trên

o   Nếu giá trị của hàm này bằng 0, chương trình sẽ không làm gì cả

o   Nếu giá trị của hàm này bằng 1 (ngày trên server luôn được cập nhật lúc 0h, vì vậy trong khoảng thời gian từ 0h tới thời điểm ServerDate được cập nhật offline, ngày của server sẽ lớn hơn ngày được lưu trữ dưới thiết bị 01 đơn vị): chương trình cập nhật lại giá trị ServerDate, và gán giá trị của biến isCount bằng true để không cập nhật trùng.

o   Ngược lại,  (thiết bị tắt máy lâu ngày dẫn tới bộ đếm hoạt động ko chính xác): chương trình sẽ cập nhật giá trị ServerDate, gán giá trị cho biến isCount bằng false và khởi động lại tác vụ autoCount.

Bước 3. Chúng ta thực hiện tạo tác vụ chạy ngầm AutoCount.

·         Với chu kỳ 24 giờ, AutoCount sẽ kiểm tra, nếu giá trị của biến IsCount là false, chương trình sẽ tăng giá trị ServerDate lên 1 đơn vị.

·         Ngược lại, (trường hợp này là do ServerDate đã được cập nhật bởi hàm Sync), chương trình sẽ chỉnh lại cờ IsCount = false.

·         Chúng ta cần cập nhật tập tin manifest để thực hiện đăng ký service AutoCount

·         Chúng ta vừa hoàn thành các phần xử lý tác vụ chạy nền cho điện thoại  

 

Bước 4: Chúng ta xây UI cho ứng dụng để sử dụng các chức năng đã nêu trong bước trước

·         Chúng ta xây dựng giao diện login của ứng dụng (blank activity)

o   Chúng ta tạo layout có tên activity_login.xml :

 

o   Chúng ta tạo Activity tên LoginActivity để xử lý.

§  Nguyên lý xử lý của chức năng này của chúng tôi không hướng tới nhập username và password mà chủ yếu là thể hiện rằng, hệ thống ứng dụng ở thiết bị phải kết nối được đến server ít nhất một lần để lấy giờ server ở hệ thống đưa về phía thiết bị lưu trữ.

§  Định nghĩa đã được nêu ra trong mục trên được gọi là login in thành công. Ngược lại, hành động login là không thành công theo nghĩa là không kết nối được tới server

§  Trong thực tế, để áp dụng nội dung này quí vị ngoài việc kiểm tra username và password thành công sẽ áp dụng thêm định nghĩa đã nêu trên thì mới chuyển đến màn hình chính của ứng dụng

§  Đây là ví dụ để thể hiện khái niệm việc ngăn cản cheating nên chúng tôi làm đơn giản nhất như có thể để hướng quí vị tới mục đích đã đề ra trong bài này.

·         Chúng ta tiếp tục xây dựng giao diện chính hiển thị ngày của server:

o   Chúng ta tạo layout có tên Activity_main.xml

o   Chúng ta tạo Activity tên MainActivity để xử lý

Chúng ta đã hoàn tất xong phần tạo giao diện và kết nối xử lý cho ứng dụng.

Thực hiện kiểm tra bằng cách thực thi thử ứng. Lưu ý: service phải đang được host và sẳn sàng đón nhận yêu cầu

Thực hiện login (Yêu cầu kết nối tới server)

Sau khi nhấn nút login, chúng ta sẽ thấy màn hình thể hiện thời gian của hệ thống

Khi chúng ta nhấn “Refresh”, hệ thống sẽ hiển thị đúng ngày của server dù ứng dụng đang chạy ở chế độ online hay offline.

Quí vị có thể kiểm tra trường hợp như sau

·         Sau khi login thành công, quí vị thức hiện tắt cả 3G và wifi

·         Nhấn nút refresh và xem kết quả

Chúc mừng quí vị đã được hoàn thành được ứng dụng với khả năng chạy offline mà không bị sai lệch giờ với server. Rất mong sự đóng góp của quí vị. Hẹn gặp quí vị ở một chủ đề khác.

Không có nhận xét nào:

Đăng nhận xét