Współdzielenie kodu aplikacji Windows Phone i Windows 8

55
Współdzielenie kodu aplikacji Windows Phone i Windows 8 ...czyli dwie pieczenie na jednym ogniu Bartłomiej Zass Technical Evangelist | Microsoft co najmniej dwie

description

Przegląd technik współdzielenia kodu aplikacji między Windows Phone i Windows 8 (WinRT). Omawiane jest zarówno podejście opierające się o HTML i Javascript jak i aplikacje natywne (wzorzec MVVM, portable class libraries, wybrane praktyki architektoniczne i sztuczki w IDE).

Transcript of Współdzielenie kodu aplikacji Windows Phone i Windows 8

Page 1: Współdzielenie kodu aplikacji Windows Phone i Windows 8

Współdzielenie kodu aplikacji Windows Phone i Windows 8

...czyli dwie pieczenie na jednym ogniu

Bartłomiej ZassTechnical Evangelist | Microsoft

co najmniej

dwie

Page 2: Współdzielenie kodu aplikacji Windows Phone i Windows 8

Poznasz różne strategie pisania przenośnego kodu dla smartfonów i tabletów (nie tylko Microsoft i nie tylko w C#!)

Zrozumiesz podobieństwa i różnice między platformami Windows Phone 8 i Windows 8

Poznasz podstawy wzorca Model-View-ViewModel

Zastosujesz Portable Class Libraries do wyodrębnienia wspólnej logikiaplikacji Windows Phone i Windows 8

Cel sesji

Page 3: Współdzielenie kodu aplikacji Windows Phone i Windows 8

Różne strategie pisania kodu przenośnego HTML i JavaScript – jQuery Mobile, PhoneGap C#

Windows Phone 8, Windows 8 – podobieństwa i różnice

Architektura aplikacji - MVVM i Portable Class Libraries

Plan prezentacji

Page 4: Współdzielenie kodu aplikacji Windows Phone i Windows 8

Źródło: Gartner

Page 6: Współdzielenie kodu aplikacji Windows Phone i Windows 8

Dlaczego HTML i Javascript? Jedyny wspólny mianownik między platformami

Przeglądarki internetowe w urządzeniach mobilnych Osadzone kontrolki przeglądarki w natywnych aplikacjach

A może C++? Windows Phone 8 obsługuje C++ Objective-C to NIE C++

“79% of mobile developers report that they will integrate some HTML5 in their apps in 2012”

Appcelerator/IDC – Q1-2012 – Mobile Developer Report

Page 7: Współdzielenie kodu aplikacji Windows Phone i Windows 8

Javascript dzisiaj Natywne aplikacje dla Windows 8 Gry – np. Cut The Rope, Angry Birds Office 2013, Sharepoint Node.js Cała masa bibliotek – nie tylko jQuery!

„Model-View-Whatever” w Javascript np. Knockout, Angular, Backbone, Mustache

Ciekawostki http://jscriptlinq.codeplex.com/ - LINQ w JS

http://bellard.org/jslinux/ - implementacja Linux w JS

Page 8: Współdzielenie kodu aplikacji Windows Phone i Windows 8

Nowy język autorstwa Andersa Hejlsberga (twórca C#) Nadzbiór Javascript

Nie trzeba uczyć się nowej składni Silnie typowany Javascript

Klasy, interfejsy, dziedziczenie, modyfikatory dostępu, ... Częściowa zgodność z propozycją ECMAScript 6 Refactoring, wsparcie Visual Studio

Kompilowany do Javascript!

TypeScript

Page 9: Współdzielenie kodu aplikacji Windows Phone i Windows 8

Demo

TypeScript

Page 10: Współdzielenie kodu aplikacji Windows Phone i Windows 8

Strategie - HTML 5 i aplikacje mobilne

OS platform

Przeglądarka obsługująca HTML 5

Mobilna strona

Natywna platforma aplikacyjna

Rozwiązania hybrydoweCross-kompilacja

Titanium (Appcelerator)…

Frameworki Javascript

Apache Cordova (PhoneGap)AppMobi…

JQueryMobileSenchaTouchJoPropulsion…

Page 11: Współdzielenie kodu aplikacji Windows Phone i Windows 8

Demo

jQuery Mobile

Page 12: Współdzielenie kodu aplikacji Windows Phone i Windows 8

Dostęp do natywnych funkcji z poziomu JavaScript Inaczej niż w Windows 8 – opakowana kontrolka przeglądarki

PhoneGap – popularna dystrybucja Apache Cordova Obecnie własnością Adobe PhoneGap Build Service

Aplikacje mogą być zgłaszane do sklepów Windows Phone, Android, iOS, Symbian, BlackBerry, ...

Windows 8 póki co nie – może nie mieć sensu Windows Phone 8 – nadal ma zastosowanie, pełne wsparcie

Apache Cordova

Page 13: Współdzielenie kodu aplikacji Windows Phone i Windows 8

PhoneGap i Windows Phone

Page 14: Współdzielenie kodu aplikacji Windows Phone i Windows 8

Demo

PhoneGap i Windows Phone

Page 15: Współdzielenie kodu aplikacji Windows Phone i Windows 8

Mimo wszystko większe możliwości Lepsza integracja z urządzeniem Większa wydajność niż PhoneGap Wygodniejsze pisanie (subiektywne) i debugowanie

Decyzja na podstawie celu, budżetu, projektu, wiedzy zespołu

Natywne aplikacje

Page 16: Współdzielenie kodu aplikacji Windows Phone i Windows 8

Wspólne jądro systemu – Windows NT Te same komponenty systemowe

Sieć, kernel, grafika, system plików, multimedia Wspólny model sterowników Obsługa wielu rdzeni w Windows Phone Solidna, nowoczesna platforma do przyszłej rozbudowy

Ten sam CLR Nie oznacza to dokładnie tego samego API

Obecnie - wiele podobieństw W przyszłości - na pewno bardzo dużo wspólnego kodu

Windows Phone 8 i Windows 8

Page 17: Współdzielenie kodu aplikacji Windows Phone i Windows 8

Windows Phone 8 API

• Aplikacje managed wykorzystujące WP 7.1, WP 8.0 .NET oraz WinPRT API

• Natywne aplikacje wykorzystujące WinPRT i Win32

• Gry wykorzystujące WP 7.1 XNA Framework

• Gry wykorzystujące Direct3D lub DirectX

.NET API for Windows

Phone

Windows Phone

Runtime

Win32 & COM

Managed Managed & Native

Native

WP7.1 XAML & C#/VB

WP8.0 XAML & C#/VB

WP8.0 XAML & C++

WP8.0 Games DirectX/Direct 3D & C++

WP7.1 XNA & C#/VB

WP8.0 XAML & C#/VB with Direct3D Graphics

Page 18: Współdzielenie kodu aplikacji Windows Phone i Windows 8

Kod natywny (C++) Współdzielenie większości kodu Wspólny kod gier wykorzystujących DirectX / Direct3D

HTML 5 np. PhoneGap, własne rozwiązanie hybrydowe lub strony mobilne Ten sam silnik Internet Explorer 10!

C# / VB.NET Dla programistów WP 8 – wiele klas współdzielonych z WinRT Drobne różnice w podstawowym API (zwłaszcza widoki)

Windows Phone 8 i Windows 8 – c.d.

Page 19: Współdzielenie kodu aplikacji Windows Phone i Windows 8

Zarządzany kod Wszystkie API z Windows Phone 7.1

Przestrzenie nazw System oraz Microsoft.Phone Wiele nowych klas dodanych w WP 8, np.:

Microsoft.Phone.Wallet Microsoft.Phone.Tasks.ShareMediaTask Microsoft.Phone.Tasks.MapsTask Microsoft.Phone.Storage.ExternalStorage Microsoft.Phone.Networking.Voip …

.NET API for Windows Phone

Page 20: Współdzielenie kodu aplikacji Windows Phone i Windows 8

Podzbiór pełnego WinRT + dodatki specyficzne dla telefonu

Windows (Phone) Runtime zaimplementowane w C++Projekcje do C#, VB.NET, C++Obecnie brak projekcji do HTML5/JavaScript

Windows Phone Runtime API

Pełny WinRT (ok. 11,000 obiektów)

Podzbiór przeniesiony do Windows Phone

Runtime (ok. 2,800 obiektów)

Nowe dla Windows Phone

Runtime (ok. 600

obiektów)

Specyficzne dla Windows Phone (wybrane):

• Synteza i rozpoznawanie mowy• VOIP• Windows.Phone.PersonalInformati

on• LockScreen,LockScreenManager• Wszystkie i dodatki

Page 21: Współdzielenie kodu aplikacji Windows Phone i Windows 8

Wspólne API dla WinRT i WinPRT

Wybrane wspólne przestrzenie nazw i klasy

• Windows.ApplicationModel.Package• Windows.ApplicationModel.Activation• Windows.ApplicationModel.DataTransfer• Windows.ApplicationModel.DataTransfer.DataTransfer

Manager• Windows.ApplicationModel.Store• Windows.Devices.Geolocation• Windows.Devices.Sensors.Accelerometer• Windows.Devices.Sensors.Compass• Windows.Devices.Sensors.Gyrometer• Windows.Devices.Sensors.Inclinometer

• Windows.Foundation.IAsyncAction• Windows.Foundation.IAsyncOperation(TRes

ult)• Windows.Graphics.Display• Windows.Networking.Connectivity• Windows.Networking.Proximity• Windows.Networking.Sockets• Windows.Storage• Windows.Storage.Pickers• Windows.System.Launcher• Windows.System.Threading.Threadpool• …

• Wszystkie

Page 22: Współdzielenie kodu aplikacji Windows Phone i Windows 8

W kilku przypadkach, WinPRT API oferują podobne funkcjonalności do .NET API z WP 7.5, np.:

Możemy skorzystać z dowolnego APIDeweloperzy adresujący WP 7.1 oraz WP 8 będą preferowali .NET APIDeweloperzy myślący o współdzieleniu kodu pomiędzy Windows Phone 8 i Windows 8 będą skłaniali się do WinPRT API

Przypadki duplikacji w API

.NET API Windows Phone Runtime API

System.IO.IsolatedStorage Windows.Storage

System.NET.Sockets Windows.Networking.Sockets

System.Threading.ThreadPool Windows.System.Threading.ThreadPool

Microsoft.Devices.Sensors Windows.Devices.Sensors

Page 23: Współdzielenie kodu aplikacji Windows Phone i Windows 8

Oprócz .NET i WinPRT API, dostęp do niektórych Win32 API, np.:

Winsock do niskopoziomowego oprogramowania połączeńCamera APIs dla aplikacji natywnychCOM APIs takie jak CoInitializeEx, CoTaskMemAlloc, CoTaskMemFree, CreateFile2, ReadFile, WriteFile, HeapAlloc, CreateMutexExW, WaitForSingleObjectW, …

Głównie dla programistów piszących w kodzie natywnym

Możliwość dodania referencji w projekcie managed (rzadko potrzebne)

Win32 i COM API

Page 24: Współdzielenie kodu aplikacji Windows Phone i Windows 8

Demo

WinPRT i WinRT - podobieństwa

Page 25: Współdzielenie kodu aplikacji Windows Phone i Windows 8

Namespace’y XAML WP – xmlns:imgsch="clr-namespace:ImageSearch;assembly=…" W8 – xmlns:imgsch="using:ImageSearch"

Event handlery WP – System.Windows.RoutedEventArgs W8 – Windows.UI.Xaml.RoutedEventArgs

Nawigacja WP – NavigationService.Navigate(new Uri("/page.xaml?Id=5", UriKind.Relative)); W8 – Frame.Navigate(typeof(DetailsPage), e.ClickedItem);

SQL CE Windows 8 - brak

Wybrane różnice

Page 26: Współdzielenie kodu aplikacji Windows Phone i Windows 8

Windows Phone 7

settings = IsolatedStorageSettings.ApplicationSettings;settings["exampleSetting"] = "Hello Phone";

Windows 8

settings = Windows.ApplicationData.Current.LocalSettings;container = settings.CreateContainer(“main", ApplicationDataCreateDisposition.Always);settings.Containers["main"].Values["exampleSetting"] = "Hello Windows";

Roaming – tylko Windows 8

settings = ApplicationData.Current.RoamingSettings;

Zapis ustawień

Page 27: Współdzielenie kodu aplikacji Windows Phone i Windows 8

Kontrolki XAML

Mapowanie kontrolek

Np. Panorama, PivotNp. GridView, ListView

Np. Grid, StackPanel, TextBox, ListBox, Button, itp.

Page 28: Współdzielenie kodu aplikacji Windows Phone i Windows 8

Demo

Z Windows Phone do Windows 8 - różnice

Page 29: Współdzielenie kodu aplikacji Windows Phone i Windows 8

Współdzielenie elementów XAML Separacja logiki i UI – wzorzec Model-View-ViewModel Wspólna logika w Portable Class Libraries Dodawanie plików jako link Własne komponenty Windows Runtime (tylko WP 8) Kompilacja warunkowa + dyrektywy preprocesora

Techniki współdzielenia kodu

Page 30: Współdzielenie kodu aplikacji Windows Phone i Windows 8

Współdzielenie logiki – jak? Brak binarnej kompatybilności między projektami

Silverlight, Windows Phone, Windows 8, WPF Osobne typy class library

Page 31: Współdzielenie kodu aplikacji Windows Phone i Windows 8

Trudności w utrzymaniu...

Page 32: Współdzielenie kodu aplikacji Windows Phone i Windows 8

Jedno źródło Jeden projekt Jedne binaria

Wiele platform!

Portable Class Libraries

Page 33: Współdzielenie kodu aplikacji Windows Phone i Windows 8

Platform / feature matrix

Page 34: Współdzielenie kodu aplikacji Windows Phone i Windows 8

Demo

Portable Class Library

Page 35: Współdzielenie kodu aplikacji Windows Phone i Windows 8

Model-View-ViewModel

View

ViewModel

DataBinding CommandsMessages

Model

View Service

Events

PropertyChanged

Widoki Jak wyświetlić

informację? Napisane w XAML

View Modele Jaką informację

wyświetlić? Logika interakcji

Modele Model danych Logika biznesowa ...

Platform-specific

Przenośne

Page 36: Współdzielenie kodu aplikacji Windows Phone i Windows 8

Demo

Przyspieszony kurs podstaw MVVM

Page 37: Współdzielenie kodu aplikacji Windows Phone i Windows 8

Architektura cross-platform

Startup

Widoki

Windows Store App

Kod platform - specific

View Modele

Modele

Portable Class Library

Abstrakcje platform - specific

Startup

Widoki

Windows Phone App

Kod platform - specific

Referencja Referencja

Page 38: Współdzielenie kodu aplikacji Windows Phone i Windows 8

// W Portable Class Library public interface IFileStorage { Task SaveFileAsync(string filename, string contents);

Task<string> LoadFileAsync(string filename); }

// W ViewModelu public void Save() { _fileStorage.SaveFileAsync(Filename, Contents); }

public async void Load() { Contents = await _fileStorage.LoadFileAsync(Filename); }

Abstrakcja – interfejs

Page 39: Współdzielenie kodu aplikacji Windows Phone i Windows 8

Dodawanie plików jako link

Również z Partial Classes...

Page 40: Współdzielenie kodu aplikacji Windows Phone i Windows 8

Kompilacja warunkowa

Nie w Portable Class LibraryW plikach XAML – nieobsługiwaneOstrożnie i z umiarem...

Page 41: Współdzielenie kodu aplikacji Windows Phone i Windows 8

Demo

Portable Class Libraries i MVVM

Page 42: Współdzielenie kodu aplikacji Windows Phone i Windows 8

public abstract class ServiceBusAdapter{  public static ServiceBusAdapter Current  {    get;    set;  }

  public abstract byte[] ComputeHmacSha256(byte[] secretKey, byte[] data);}

Abstrakcja - klasa abstrakcyjna

Page 43: Współdzielenie kodu aplikacji Windows Phone i Windows 8

// Windows Phone - implementacjapublic class PhoneServiceBusAdapter : ServiceBusAdapter{  public override byte[] ComputeHmacSha256(byte[] secretKey, byte[] data)  {    using (var cryptoProvider = new HMACSHA256(secretKey))    {      return cryptoProvider.ComputeHash(data);    }  }}

// Windows 8 - implementacjapublic class MetroServiceBusAdapter : ServiceBusAdapter{  private const string HmacSha256AlgorithmName = "HMAC_SHA256";  public override byte[] ComputeHmacSha256(byte[] secretKey, byte[] data)  {    var provider = MacAlgorithmProvider.OpenAlgorithm(HmacSha256AlgorithmName); //...    return hashed.ToArray();  }}

Page 44: Współdzielenie kodu aplikacji Windows Phone i Windows 8

ServiceBusAdapter.Current = new PhoneServiceBusAdapter(); // Windows Phone startupServiceBusAdapter.Current = new MetroServiceBusAdapter(); // Windows 8 startup

// W Portable Class Library

var adapter = ServiceBusAdapter.Current;byte[] signatureBytes = adapter.ComputeHmacSha256(issuerSecretBytes,

Encoding.UTF8.GetBytes(token));

Wywoływanie kodu platform-specific

Page 45: Współdzielenie kodu aplikacji Windows Phone i Windows 8

Kod specyficzny dla platformy Abstrakcje

Klasy abstrakcyjne Interfejsy

Przekazywanie zależności z kodu aplikacji Kontener IoC Service locator / platform abstraction layer

public class ServiceLocator{ public static IFileStorage FileStorage { get; set; } public static IPhotoChooser PhotoChooser { get; set; }}

Page 46: Współdzielenie kodu aplikacji Windows Phone i Windows 8

// Rejestrowanie usługi – start aplikacji WP 7_container.RegisterType<IStateService, PhoneIsolatedStorageStateService>();

// Rejestrowanie usługi – start aplikacji Win 8_container.RegisterType<IStateService, Win8LocalStorageStateService>();

// Rejestrowanie usługi – singleton_container.RegisterType<INavigationService, Win8NaviService>(

new ContainerControlledLifetimeManager());

Dependency Injection - Unity

Page 47: Współdzielenie kodu aplikacji Windows Phone i Windows 8

public class MyViewModel(IStateService stateService){

// ...}

// Wewnątrz Portable Class Library// Widok bindujemy (np. w XAML) do ServiceLocator.MainViewModelpublic class ServiceLocator{ public static MyViewModel MainViewModel {

get{ // Automatyczne wstrzykiwanie zal. do konstruktora return container.Resolve<MyViewModel>(); }

}}

Dependency Injection – c.d.

Page 48: Współdzielenie kodu aplikacji Windows Phone i Windows 8

Demo

Windows Phone i Windows 8 + PCL – przykład zaawansowany

Page 49: Współdzielenie kodu aplikacji Windows Phone i Windows 8

Xamarin Port Mono dla iOS (MonoTouch) i Android

MvvmCross Framework MVVM dostarczany w postaci Portable Class

Library Współdzielenie kodu ViewModeli, Modeli oraz usług między

Windows Phone, WinRT, MonoTouch i Mono for Android

Inne platformy?

Page 50: Współdzielenie kodu aplikacji Windows Phone i Windows 8

Demo

MVVMCross

Page 51: Współdzielenie kodu aplikacji Windows Phone i Windows 8

HTML 5 (+ PhoneGap) Niski koszt wejścia Wiele platform Niższa wydajność i mniejsze możliwości

MVVM i Portable Class Libraries Współdzielenie logiki Abstrakcje funkcjonalności platform-specific

Windows Phone 8 i Windows 8 Wiele współdzielonych elementów, ale też różnic

Podsumowanie

Page 53: Współdzielenie kodu aplikacji Windows Phone i Windows 8

MVVM Light toolkit (basics) http://channel9.msdn.com/Events/MIX/MIX10/EX14

MVVM Light toolkit (deep dive) http://channel9.msdn.com/Events/MIX/MIX11/OPN03

Windows 8 and MVVM Light toolkit http://blog.galasoft.ch/archive/2012/02/19/impressions-slides-and-code-from-techdays-belgium-and-netherlands.aspx

Caliburn.micro concepts http://channel9.msdn.com/Events/MIX/MIX10/EX15

Zasoby – c.d.

Page 54: Współdzielenie kodu aplikacji Windows Phone i Windows 8

Daniel Plaisted’s blog

http://blogs.msdn.com/b/dsplaisted/archive/2012/08/27/how-to-make-portable-class-libraries-work-for-you.aspx

Portable Class Library MSDN documentation

http://msdn.microsoft.com/en-us/library/gg597391(v=vs.110)

Portable Class Library overview blog post blogs.msdn.com/b/dotnet

/archive/2012/07/06/targeting-multiple-platforms-with-portable-code-overview.aspx

Create a continuous client using portable libraries msdn.microsoft.com/en-us/magazine/hh852593.aspx

MvvmCross slodge.blogspot.com/2012/05/portable-class-libraries-in-mvvmcross.html

Portable Class Libraries on Channel 9 (lots of links in show notes) channel9.msdn.com/Shows/Visual-Studio-Toolbox/Visual-Studio-ToolboxPortable-Class-

Libraries

Zasoby – c.d.

Page 55: Współdzielenie kodu aplikacji Windows Phone i Windows 8

© 2012 Microsoft Corporation. Wszelkie prawa zastrzeżone. Microsoft, Windows oraz inne nazwy produktów są lub mogą być znakami towarowymi lub zastrzeżonymi znakami towarowymi firmy Microsoft w Stanach Zjednoczonych i innych krajach. Zamieszczone informacje mają charakter wyłącznie informacyjny. FIRMA MICROSOFT NIE UDZIELA ŻADNYCH GWARANCJI (WYRAŻONYCH WPROST LUB DOMYŚLNIE), W TYM TAKŻE USTAWOWEJ RĘKOJMI ZA WADY FIZYCZNE I PRAWNE, CO DO INFORMACJI ZAWARTYCH W TEJ PREZENTACJI.