Windows 10, thế hệ hệ điều hành tiếp theo và cũng là cuối cùng của Microsoft được xây dựng dựa trên hàng triệu đóng góp ý kiến của người dùng và các nhà phát triển, với nhiều hứa hẹn cho người dùng “It’s familiar, It’s productive, It’s personal, It’s flexible”. Còn đối với các lập trình viên thì Windows 10 mang đến nhiều cơ hội cũng như thách thức lớn khi phát triển ứng dụng Windows, mà ta gọi chung là Windows Universal App (UAP).

Nhằm mục đích giới thiệu đến các bạn những điểm mới trong việc lập trình ứng dụng Windows 10 và làm nơi trao đổi kinh nghiệm trong việc phát triển ứng dụng, mình xin giới thiệu đến các bạn bài viết đầu tiên về Lập trình ứng dụng UAP.

Thời điểm hiện tại Microsoft đã cung cấp phiên bản hệ điều hành thử nghiệm Windows 10 Insider Preview và bộ công cụ phát triển ứng dụng cho lập trình viên. Tuy nhiên việc đầu tiên bạn phải tìm hiểu thế nào là Windows 10 và nền tảng Windows Universal.

Windows Core

Windows Core là cấu trúc hạ tầng được xây dựng phát triển từ khi Windows ra đời và tới nay trên tất cả các thiết bị từ thiết bị IOT, Desktop, Phone, tới Xbox, cả thiết bị lớn như Surface Hub và kính thực tế ảo HoloLens đều cài đặt một phiên bản Windows. Tính chung khoản 10 loại thiết bị cài đặt Windows Core, tuy nhiên với Windows Core thì chưa đủ để thực hiện các chứng năng của chúng, chưa nói đến việc tạo ‘thực tế ảo’. Nói cách khác Windows Core là nơi kết nối các thành phần phần cứng, phần mềm và tạo môi trường triển khai hiệu quả để có thể khai thác tất cả các tính năng của thiết bị.

Đối với nhà phát triển thì Windows Core mang đến một lợi ích rất lớn đó là tất cả các thiết bị điều chạy cùng một hệ điều hành nên việc phát triển, lập trình chúng là hoàn toàn giống nhau.

one-windowsCó đến 10 thiết bị khác nhau chạy cùng một Core Windows

Qua đó bạn thấy được sự kế thừa hạ tầng Windows trên hầu hết tất cả các thiết bị công nghệ, mỗi loại lại được xây dựng theo các nhóm tính năng riêng. Ví dụ khi nói về holographic thì Microsoft đã tạo tra một phiên bản Windows holographic và cài đặt lên Hololens, chứ không phải xây dựng một phiên bản Windows cho Hololens. Tuy bây giờ chỉ có mỗi Hololens chạy công nghệ này.

Nhưng nhìn từ hướng nhà phát triển thì khi xây dựng một ứng dụng Windows 10 thì chúng ta thường hướng tới một loại thiết bị cụ thể trong số chúng nhiều hơn. Đó là cách mà Windows tạo nên sự chuyên biệt hóa về trải nghiệm trong mỗi sản phẩm.

Nhưng chúng ta cũng có thể nhìn từ một hướng khác!!!

convergence_story

Nói về sự đồng nhất về hệ điều hành Windows ta có sơ đồ minh họa như trên, bạn biết đấy năm 2012 Microsoft cho ra đời Windows Phone 7, nó là một hệ điều hành hoàn hoàn khác và độc lập, cùng lúc đó chúng ta cũng có XBox 360 và nó lại chạy trên một hệ điều hành khác nữa. Nhưng rồi Windows 8, Xbox One, Windows Phone 8 ra đời thì chúng ta đã thấy bắt đầu có sự đồng nhất khi chúng đều sử dụng nhân Windows NT. Tiếp theo là Windows 8.1 ra đời hứa hẹn đầu tiên trong việc đồng nhất  app model, tạo một môi trường tương đồng (không giống nhau hoàn toàn) khi phát triển ứng dụng trên cả Phone và Windows. Và cuối cùng Windows 10 đột ngột xuất hiện mở ra sự đồng nhất hoàn toàn, không chỉ ở lớp hệ điều hành mà đồng nhất cả về nền tảng phát triển.

Bây giờ khi bạn xây dựng ứng dụng Windows 10, nghĩa là bạn có thể nhắm tới một hoặc nhiều loại thiết bị khác nhau!

Universal Windows Platform

Cách đây không lâu Microsoft khẳng định chiến lược phát triển của mình và cũng là của cả ngành công nghệ toàn cầu nói chung là “Cloud first, Mobile First”, nếu bạn nhìn lại những thiết bị bên trên bạn sẽ thấy rằng phần lớn trong số chúng đều là thiết bị di động “mobile”. Đến thời điểm hiện tại bạn có thể thấy khi xây dựng các ứng dụng và website người ta đều hướng tới những trải nghiệm người dùng (UI/UX) trên các thiết bị di động, ta có thể gọi là ‘trải nghiệm di động‘ (mobile experiences)

Khi xây dựng ứng dụng thỏa mãn những yêu cầu về mobile experiences nghĩa là không chỉ ứng dụng hỗ trợ nhiều loại kích thước màn hình khác nhau mà còn phải hỗ trợ tương tác hạ tầng một cách dễ dàng, ví dụ chuột, bàn phím, cảm ứng, viết,… vì người dùng có thể chuyển đổi các cách tương tác qua lại với nhau, họ thường dùng màn hình cảm ứng cho các tác vụ giải trí (nghe nhạc, xem phim, đọc báo,…) và sử dụng chuột bàn phím cho các công việc yêu cậu hiệu năng cao, chưa kể hiện có rất nhiều các thiết bị 2 in 1 có thể chuyển đổi nhanh chống cách thức tương tác (Surface pro 3).

Windows 10 đã mở ra một giai đoạn mới cho mobile experiences, phá vỡ giới hạn và đem đến cho người dùng những trải nghiệm tốt nhất trên bất kỳ thiết bị nào trong cuộc sống của họ. Với Windows thì mobile experiences được tạo nên từ một Windows Core và Universal Windows Platform.

UAP Ta thấy Windows platform cho ta khả năng xây dựng ứng dụng chạy trên gần như tất cả các thiết bị. Nhưng thế có phải là quá nhiều, khi trước đây bạn chỉ nghĩ đến một hoặc nhiều hơn các thiết bị chứ không phải tất cả, ví dụ nếu bạn muốn ứng dụng chạy được trên Surface Hub thì bạn có khá nhiều việc để làm, nhưng ứng dụng của bạn cũng không nhất thiết phải chạy trên Surface hub, đó là một mục tiêu nhỏ, có thể phát triển thêm.

Như vậy khi ta có Universal app platform, ta cũng có rất nhiều dịch vụ (service) và tiện ích (capability) được thống nhất giữa các nhóm thiết bị, ví dụ API về Inking (input từ bút – pen), ta có thể sự dụng nó ở bất kỳ đâu, đó không phải API dành riêng cho mobile hay Hololens, và nó cũng là một thành phần trong gói SDK. Với một gói SDK duy nhất ta có được tập hợp đầy đủ các API để xây dựng ứng dụng Windows đa nền tảng.

API surface

Khi nói đến UAP SDK, chúng ta thường đề có thể mô tả nó qua một phiên bản API surface (xem hình trên), đó là những API đã được tín nhiệm và được đảm bảo trên bất kỳ thiết bị nào mà ứng dụng hướng đến.

UAPĐây là một khái niệm hoàn toàn mới khi lập trình Windows, trở lại cách đây không lâu, khi lập trình một ứng dụng di động ta phải chú ý đến các Namespace vì đôi khi chúng khác nhau giữa Silverlight và Runtime, nhưng từ nay bạn không cần làm việc đó, bạn xây dựng ứng dụng dựa trên một tập hợp các API được thống nhất và đảm bảo. Và khi đóng gói được một API mới chúng sẽ được đánh số version tương ứng với platform mà nó hỗ trợ ví dụ ở đây là 10069.

Trước đây khi viết ứng dụng bạn phải target nó vào hệ điều hành ví dụ Windows 8, hoặc Windows 8.1, khi đã target vào Windows 8.1 thì ứng dụng đó không chạy được trên Windows 8 và cứ thế ta tiếp tục target chúng vào đúng hệ điều hành mà ứng dụng sẽ chạy. Nhưng từ nay ứng dụng của bạn sẽ không target vào Windows 10 nữa mà ta target và từng phiên bản của Windows universal platform. Một lần nữa ta quay về với số version của platform (ở trên là 10069), đó là thứ ta cần, ta phải target ứng dụng đến version nào đó của Windows platform, và tất nhiên nó không chỉ có một version. Thời gian trước, cứ vài năm ta lại có một hệ điều hành Windows mới (một bản update khổng lồ) và tương ứng ta có bộ thư viện .Net mới kèm theo và nhiều thứ khác được thêm vào một lần duy nhất. Nhưng với khái niệm mới này chung ta có thể dễ dàng hơn trong việc update các API mới, chúng được nâng cấp và được phát triển theo thời gian để khai thác tối đa các tính năng trên Windows.

Đây là ví dụ khi target vào phiên bản của platform, chúng ta không target vào một version mà target vào nhiều version trong một khoản nào đó:

App target

Min version nghĩa là ứng dụng bạn có thể chạy được trên phiên bản đó, nhưng không thể chạy được trên phiên bản cũ hơn, còn với max version tested, cũng tương tự cho biết phiên bản tối đa mà ứng dụng có thể chạy tốt nhất, với phiên bản mới hơn nữa thì ứng dụng vẫn có thể hoạt động bình thường.

Bạn có thể xây dựng một ứng dụng chạy trên nhiều thiết bị khác nhau hoặc có thể xây dựng một package riêng dành cho một loại thiết bị nào đó ví dụ Hololens

Device-specific API

Tuy các thiết bị có rất nhiều điểm tương đồng và có thể cùng sử dụng một thư viện UAP để phát triển, nhưng ta biết mỗi nhóm thiết bị lại có những đặc trưng riêng, ví dụ API avatar là riêng của trên Xbox, chúng không cần thiết cho Hololens. Vì thế ta có các bộ công cụ mở rộng (extension) dành riêng cho các nhóm thiết bị như Desktop, Phone và Xbox,… Chú ý là khi sử dụng extension của một thiết bị không có nghĩa là sau khi đóng gói (package) thì ứng dụng bạn chỉ có thể chạy trên loại thiết bị đó, chúng vẫn có thể hoạt động tốt trên các thiết bị khác với điều kiện bạn phải lược bỏ các chức năng đặc trưng ấy.

Adaptive Code