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).
2. 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
logiki
aplikacji Windows Phone i Windows 8
Cel sesji
3. 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
4.
5.
6. 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
7. 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
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
12. 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
15. 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
16. 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
17. 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
18. 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.
19. 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
20. 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.PersonalInformation
• LockScreen,LockScreenManager
• Wszystkie i dodatki
21. 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.DataTransferManag
er
• 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(TResult)
• 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
22. W kilku przypadkach, WinPRT API oferują podobne funkcjonalności do .NET
API
z WP 7.5, np.:
Możemy skorzystać z dowolnego API
Deweloperzy adresujący WP 7.1 oraz WP 8 będą preferowali .NET API
Deweloperzy 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
23. Oprócz .NET i WinPRT API, dostęp do niektórych Win32 API, np.:
Winsock do niskopoziomowego oprogramowania połączeń
Camera APIs dla aplikacji natywnych
COM 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
29. 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
30. Współdzielenie logiki – jak?
Brak binarnej kompatybilności między projektami
Silverlight, Windows Phone, Windows 8, WPF
Osobne typy class library
42. public abstract class ServiceBusAdapter
{
public static ServiceBusAdapter Current
{
get;
set;
}
public abstract byte[] ComputeHmacSha256(byte[] secretKey, byte[] data);
}
Abstrakcja - klasa abstrakcyjna
43. // Windows Phone - implementacja
public class PhoneServiceBusAdapter : ServiceBusAdapter
{
public override byte[] ComputeHmacSha256(byte[] secretKey, byte[] data)
{
using (var cryptoProvider = new HMACSHA256(secretKey))
{
return cryptoProvider.ComputeHash(data);
}
}
}
// Windows 8 - implementacja
public 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();
}
}
44. ServiceBusAdapter.Current = new PhoneServiceBusAdapter(); // Windows Phone startup
ServiceBusAdapter.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
45. 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; }
}
47. public class MyViewModel(IStateService stateService)
{
// ...
}
// Wewnątrz Portable Class Library
// Widok bindujemy (np. w XAML) do ServiceLocator.MainViewModel
public class ServiceLocator
{
public static MyViewModel MainViewModel
{
get
{
// Automatyczne wstrzykiwanie zal. do konstruktora
return container.Resolve<MyViewModel>();
}
}
}
Dependency Injection – c.d.
49. 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?
51. 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
54. 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.