pptx

Report
Programowanie urządzeń mobilnych
Bartłomiej Zass
Microsoft
Plan prezentacji
 Aplikacje mobilne w HTML i JavaScript
 Aplikacje natywne
 Windows 8, Windows Phone 7 – krótkie przypomnienie
 Windows Phone 8 dla programistów
 Techniki współdzielenia kodu dla aplikacji natywnych
 Windows Phone 8, Windows 8 – podobieństwa i różnice
 Architektura aplikacji - MVVM i Portable Class Libraries
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
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
TypeScript
 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!
Demo
TypeScript
Strategie - HTML 5 i aplikacje mobilne
Frameworki Javascript
Titanium (Appcelerator)
…
Cross-kompilacja
Apache Cordova (PhoneGap)
AppMobi
…
Rozwiązania hybrydowe
Natywna platforma aplikacyjna
OS platform
JQueryMobile
SenchaTouch
Jo
Propulsion
…
Mobilna strona
Przeglądarka obsługująca HTML 5
Demo
jQuery Mobile
Apache Cordova
 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
PhoneGap i Windows Phone
Demo
PhoneGap i Windows Phone
Aplikacje natywne
Windows 8 – krótkie przypomnienie
Windows Phone
System Services
Model
Controller
View
Platforma Windows 8
XAML
C
C++
HTML / CSS
C#
VB
JavaScript
(Chakra)
WinRT APIs
Communication
& Data
Graphics & Media
Application Model
Devices &
Printing
Demo
Windows 8 i Windows Phone 7
Windows Phone 8
Nowe telefony, nowe rozdzielczości, …
• wiele rdzeni procesora,
• nowy procesor graficzny,
• nowoczesna architektura,
• karty MicroSD,
• NFC,
•…
WVGA
800 x 480
15:9
WXGA
1280 x 768
15:9
720p
1280 x 720
16:9
WVGA
480x800
1.0 Scale
WXGA
768x1280
1.6 Scale
720p
720x1280
1.5 Scale
400 Logical
400 Physical
400 Logical
640 Physical
400 Logical
600 Physical
2 Logical
2 Physical
2 Logical
3Physical (Rounded)
2 Logical
3 Physical
30 Logical
30Physical
30 Logical
48Physical
30 Logical
45Physical
Windows Phone 8 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 API
WP8.0 Games DirectX/Direct 3D & C++
•
•
•
•
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
WP8.0 XAML & C++
WP8.0 XAML & C#/VB with Direct3D Graphics
WP8.0 XAML & C#/VB
WP7.1 XNA & C#/VB
WP7.1 XAML & C#/VB
.NET API for
Windows
Phone
Windows
Phone
Runtime
Managed
Managed &
Native
Win32 & COM
Native
.NET API for Windows Phone
• 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
•…
Windows Phone Runtime API
• 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
Pełny WinRT
(ok. 11,000 obiektów)
Podzbiór przeniesiony
do Windows Phone
Runtime
(ok. 2,800 obiektów)
Specyficzne dla Windows Phone (wybrane):
Nowe dla Windows
Phone Runtime
(ok. 600 obiektów)
•
•
•
•
•
Synteza i rozpoznawanie mowy
VOIP
Windows.Phone.PersonalInformation
LockScreen,LockScreenManager
Wszystkie i dodatki
Win32 i COM API
• 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)
Co z aplikacjami na Windows
Phone 7.x?
Aplikacje WP 7.x na systemie WP 8.0
• Aplikacje stworzone na WP 7.x
będą działały na telefonach z
systemem WP 8.0
bez rekompilacji
WP OS
7.1 app
WP OS
8.0 app
WP
OS
8.0
app
WP
OS
7.1
app
+Quirks
WP 8.0
Runtime/
Libraries
Skąd wziąć narzędzia do
programowania?
Twoje centrum dowodzenia aplikacjami
http://dev.windowsphone.com
Konto deweloperskie
• Nie jest wymagane do tworzenia aplikacji
• Jest wymagane do testowania aplikacji na urządzeniu i publikacji jej w
Windows Phone Store
• Jak je otrzymać?:
• znajduje się w MSDN,
• studenci bezpłatnie poprzez Dreamspark,
• płacąc 99$ rocznie per programista.
Wymagania sprzętowe dla WP SDK 8.0
• System operacyjny:
• Windows 8 x64
• Hardware:
• zalecane 4GB RAM,
• 8GB wolnej przestrzeni dyskowej
• WP Emulator wymaga Second Level Address Translation (SLAT)
Lock the Screen na emulatorze
• Z klawiatury:
• Dwa razy F12
• Simulation Dashboard
Symulacja sieci
• Dostępne w simulation dashboard
• Testowanie dla różnych warunków sieci
Zrzuty ekranu
• Na emulatorze
• Na urządzeniu
• Przyciski Win + power
3
6
Co nowego
w Windows Phone 8?
Wydajność aplikacji
• Czas startu bardzo ważny z punktu widzenia użytkownika
• Facebook
• WP 7 – 12 sekund
• WP 8 – 4 sekundy
• Dlaczego?
•
•
•
•
Zmiany w środowisku uruchomieniowym
Usprawnienia CoreCLR
Kompilowanie w chmurze
Dual core > 1 ghz 
Kompilowanie w chmurze
• CoreCLR dodaje wsparcie dla NGEN
• Czasochłonne na urządzeniu
• Po zgłoszeniu aplikacji do Windows Store automatyczny NGEN
• Nowe aplikacje
• Zgłaszamy XAP
• XAP aktualizowany – kod natywny
• Co z istniejącymi aplikacjami?
• Aplikacje WP 7.5 kompilowane przez NGEN dla WP 8
• Oryginalny XAP pozostaje dla WP 7.x
Model aplikacji
• Użytkownicy oceniają aplikację na podstawie własnych doświadczeń
• 4 sekundy to wciąż długo, jeśli często uruchamiamy aplikację
• Za każdym razem wchodzenie do określonej sekcji aplikacji
• Fast Application Swithing – WP 7.x
• Przycisk wstecz
• Task switcher – wielu użytkowników nie wie o nim
Fast Application Resume
• Aplikacja może być wskrzeszana niezależnie od tego jak została
uruchomiona
•
•
•
•
Lista aplikacji
Live Tile
Toast
Deep link
• Jeśli jest na stosie – przywracanie
• Jeśli nie ma jej na stosie – nowa instancja
• Podobnie jak w Windows 8
Włączanie Fast Application Resume
• Ochrona interfejsu użytkownika
• Pewność, ze aplikacje będą działały prawidłowo
• Nowy atrybut ActivationPolicy w DefaultTask
<DefaultTask Name="_default" NavigationPage="MainPage.xaml"
ActivationPolicy="Resume"/>
Kontrolki
• ProgressBar animuje się poza wątkiem UI
• Panorama, Pivot i LongListSelector przeniesione do ROM
• Mniejsze zużycie pamięci przez kontrolkę Panorama
• Poprawiony „first touch experience”
• Toolkit – http://phone.codeplex.com
LongListSelector
Nowa kontrolka do wyświetlania map
• Nowa kontrolka korzysta z technologii i zasobów Nokia
• Zawiera m.in.:
• Bazuje na wektorach
• cztery modele kartograficzne
• tryb jasny i ciemny
• informacje o ruchu, trasach itp.
Nowe API służące do lokalizacji
• Bliźniacze do API w Windows 8
• Windows Phone OS 7.1 .NET Location API nadal jest
wspierane
• Background task pobierający lokalizację urządzenia
• Tylko 1 agent
• Tylko kiedy aktywnie śledzi położenie
Jak włączyć?
<DefaultTask Name="_default" NavigationPage="Views/Home.xaml">
<BackgroundExecution>
<ExecutionType Name="LocationTracking" />
</BackgroundExecution>
</DefaultTask>
Nowe wielkości i szablony kafelków
• W Windows Phone 8 możemy korzystać z trzech typów Tile:
• Flip – dwa „rotujące” obrazki (tożsame z WP 7.1 Tile)
• Iconic – sama pojedyncza ikona
• Cycle – „rotacja” do dziewięciu różnych obrazków
Dostęp do Lockscreen
• Użytkownik może dodać powiadomienia z
naszej aplikacji (LockScreen Notification)
• Nasza aplikacja może zmienić tło
zablokowanego ekranu (LockScreen
Background)
• New Shell APIs
• ShellSetWallpaper to use a new image
• ShellWallpaperSchedule to download a single
image from the internet on a specific interval
(e.g., 30 mins, 1 hour, etc.)
• ShellWallpaperFolderSchedule to cycle through a
set of image in app’s isolated storage
(e.g., a photo slideshow) based on number of
views of the lock screen
Zestaw nowych launcherów
• SaveAppointmentTask
• ShareMediaTask
• MapDownloaderTask
• MapsTask
• MapsDirectionsTask
Komendy głosowe i rozpoznawanie mowy
• Voice Commands
umożliwia
uruchomienie aplikacji, lub jej konkretnej
funkcji, za pomocą głosu, po przytrzymaniu
przycisku Start
• Speech Recognition + Text-to-Speech API
wspiera przekształcenie mowy w tekst i
czytanie już zapisanego teksu
Portfel
 Możliwość zarządzania kartami
„kuponami” z poziomu własnej aplikacji
 Obsługa kart:
 kredytowych i debetowych,
 lojalnościowych,
 specjalnych ofert,
 Wsparcie dla „tap to pay”
i
Nowe możliwości aparatu fotograficznego
przetwarzania zdjęć
• Lenses = rozszerzenia do kamery
oferujące nowe opcje, możemy tworzyć
je sami i udostępniać użytkownikom
• Picture.GetPreviewImage() = miniaturka
obrazka
• Integracja aplikacji z Photo Edit Picker
lub rejestracja jako własny edytor
• Upload zdjęć w tle do zewnętrznych
serwisów
• Zaawansowana kontrola (klasy
PhotoCaptureDevice i
AudioVideoCaptureDevice)
i
VoIP i wideo rozmowy
 API dostępne dla wszystkich deweloperów
 Rozmowy integrują się z systemem
telefonu
 Aplikacje VoIP działają również w tle
Protokoły i asocjacje
• Własne schematy
• Rejestracja własnego URI dla aplikacji
• Np. skype:jankowalski – rozpoczyna konwersację
• Fb://profile/7031234 – otwiera profil użytkownika
• Integracja z przeglądarką
• Integracja między aplikacjami
• Typy plików
• Zarejestruj aplikację dla danego formatu pliku
Deep linking - przykład
Peter Bergman
Loved the Purple Onion
Bluetooth i NFC
• Bluetooth API
•
•
komunikacja aplikacja – aplikacja,
komunikacja aplikacja – urządzenie
• Proximity API
• połączenie aplikacji z wykorzystaniem Bluetooth,
• ustanowenie połączenia Wi-Fi, Bluetooth lub Wi-Fi
Direct pomiędzy aplikacją, a jej instancją działająca
na innym urządzeniu,
• wysyłanie danych poprzez NFC,
• interakcję z tagami NFC
Możliwości sieciowe
• Windows.Networking Windows Phone Runtime API
• nowe API kompatybilne z Windows 8
• Nasłuchiwanie przychodzących połączeń (Incoming Sockets)
• wspierane przez System.Net.Sockets i Windows.Networking.Sockets
• Wsparcie dla IPV6
• Wsparcie dla Winsock API
• możliwość przenoszenia już istniejących bibliotek natywnych korzystających
z tego API
Przechowywanie danych na kartach MicroSD
• Microsoft.Phone.Storage API umożliwia
czytanie danych
z karty MicroSD
• Użytkownik może zapisywać personalne
dane i multimedia na karcie w telefonie
Zdjęcia ▪Muzyka
Filmy ▪ Instalacja aplikacji
Baza danych
• SQL Server i Linq To SQL nadal obsługiwane
• Wiele zgłoszeń, że potrzebne są alternatywne rozwiązania
• Kompatybilność z innymi platformami
• SQLite
Własna lista kontaktów
• Dostęp do API umożliwiającego tworzenie, edycję,
kasowanie, przeszukiwanie własnych typów kontaktów
• Możliwość automatycznej synchronizacji listy z listą
wystawiona na własnym serwerze
• Dostęp read/write do własnych
• Dostęp readonly do pozostałych jeśli użytkownik
wyraził zgodę (jak w Mango)
In-app Purchase = zakupy wewnątrz aplikacji
• API do tworzenia aplikacji z katalogiem
własnych produktów
• Microsoft zapewnia całe środowisko
sprzedażowe
• Po stronie programisty pozostaje obsługa
zakupionego przez użytkownika przedmiotu
Enterprise
• Zarządzanie urządzeniami
• inTune, itp.
• Ustawianie i aktualizowanie polis
• Automatyczne aktualizowanie aplikacji
• Deployment
• Nie trzeba zgłaszać aplikacji do Windows Store
• Różne sposoby wdrażania (managed / unmanaged), web, email, aplikacja
Tworzenie konta
Deployment – managed vs unmanaged
Feature
Managed
Unmanaged
Enrollment method
Settings applet + MDM
Email/browser
Policy management
Yes
No
Number of enrollments
Limited to 1
Unlimited
App install method
MDM/company hub
Email/browser/company hub
App inventory
MDM
No
Silent app updates
MDM
No
Unenroll
Remote and local
No
Managed enrollment
Company Hub
Windows Phone i Windows 8
Wspólne API dla WinRT i WinPRT
Wybrane wspólne przestrzenie nazw i klasy
• Windows.ApplicationModel.Package
• Windows.Foundation.IAsyncAction
• Windows.ApplicationModel.Activation
• Windows.Foundation.IAsyncOperation(TResult)
• Windows.ApplicationModel.DataTransfer
• Windows.Graphics.Display
• Windows.ApplicationModel.DataTransfer.DataTransferManager
• Windows.Networking.Connectivity
• Windows.ApplicationModel.Store
• Windows.Networking.Proximity
• Windows.Devices.Geolocation
• Windows.Networking.Sockets
• Windows.Devices.Sensors.Accelerometer
• Windows.Storage
• Windows.Devices.Sensors.Compass
• Windows.Storage.Pickers
• Windows.Devices.Sensors.Gyrometer
• Windows.System.Launcher
• Windows.Devices.Sensors.Inclinometer
• Windows.System.Threading.Threadpool
• …
• Wszystkie
Przypadki duplikacji w API
• W kilku przypadkach, WinPRT API oferują podobne funkcjonalności do .NET API
z WP 7.5, np.:
.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
• 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
Demo
WinPRT i WinRT - podobieństwa
Wybrane różnice
 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
Kontrolki XAML
Np. GridView, ListView
Np. Panorama, Pivot
Mapowanie kontrolek
Np. Grid, StackPanel, TextBox, ListBox, Button, itp.
Techniki współdzielenia kodu






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
Współdzielenie logiki – jak?
 Brak binarnej kompatybilności między projektami
 Silverlight, Windows Phone, Windows 8, WPF
 Osobne typy class library
Trudności w utrzymaniu...
Portable Class Libraries
 Jedno źródło
 Jeden projekt
 Jedne binaria
 Wiele platform!
Platform / feature matrix
Demo
Portable Class Library
Model-View-ViewModel
DataBinding
Commands
Messages
View Service
PropertyChanged
Events
Architektura cross-platform
Windows Store App
Windows Phone App
Portable Class Library
Abstrakcja – interfejs
// 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);
}
Dodawanie plików jako link
Również z Partial Classes...
Kompilacja warunkowa
Nie w Portable Class Library
W plikach XAML – nieobsługiwane
Ostrożnie i z umiarem...
Demo
Portable Class Libraries i MVVM
Abstrakcja - klasa abstrakcyjna
public abstract class ServiceBusAdapter
{
public static ServiceBusAdapter Current
{
get;
set;
}
public abstract byte[] ComputeHmacSha256(byte[] secretKey, byte[] data);
}
// 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();
}
}
Wywoływanie kodu platform-specific
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));
Dependency Injection - Unity
// 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 – c.d.
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>();
}
}
}
Demo
Windows Phone i Windows 8 + PCL – przykład zaawansowany
Inne platformy?
 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
Podsumowanie
 HTML 5 (+ PhoneGap)
 Niski koszt wejścia
 Wiele platform
 Niższa wydajność i mniejsze możliwości
 Windows Phone 8 i Windows 8
 Wiele współdzielonych elementów, ale też różnic
 MVVM i Portable Class Libraries
 Współdzielenie logiki
 Abstrakcje funkcjonalności platform-specific
Zasoby
 MVVM
 MVVM Light Toolkit portable fork
 MvvmCross
 IoC
 Autofac
 Ninject portable fork
 Microsoft.Composition (Lightweight MEF)
 Other
 Json.NET
Zasoby – c.d.
 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-codefrom-techdays-belgium-and-netherlands.aspx
 Caliburn.micro concepts
http://channel9.msdn.com/Events/MIX/MIX10/EX15
Zasoby – c.d.
 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

similar documents