Write once, run everywhere? Cross-Platform Mobile mit .NET

36
© Zühlke 2016 Cross-Platform | Kerry W. Lothrop 10. März 2016 Cross-Platform Mobile mit .NET

Transcript of Write once, run everywhere? Cross-Platform Mobile mit .NET

© Zühlke 2016Cross-Platform | Kerry W. Lothrop 10. März 2016

Cross-Platform Mobile mit .NET

© Zühlke 2016Cross-Platform | Kerry W. Lothrop 10. März 2016

Mobile Entwicklungslandschaft

Nativ Cross-compiled Hybrid Web

Beste Usability? Überschaubare Kosten?

© Zühlke 2016Cross-Platform | Kerry W. Lothrop 10. März 2016

Was ist Xamarin?

© Zühlke 2016Cross-Platform | Kerry W. Lothrop 10. März 2016

© Zühlke 2016Cross-Platform | Kerry W. Lothrop 10. März 2016

Was ist Xamarin?

• 2011 Gegründet

• aus dem Ximian, Novell und dem Mono-Projekt hervorgegangen

• wichtigste Produkte:– Xamarin Platform, ein Cross-Compiler auf Basis von Mono– Xamarin.Forms, eine plattformübergreifende XAML-basierte UI-Bibliothek– Xamarin Test Cloud, eine Lösung für UI-Tests auf einer Vielzahl von Geräten

• Februar 2016 von Microsoft aufgekauft

© Zühlke 2016Cross-Platform | Kerry W. Lothrop 10. März 2016

Was ist Xamarin Platform?

• Cross-Compiler

• Wrapper-Libraries um native Bibliotheken

• Plattformen– iOS– Android– Mac OS X

© Zühlke 2016Cross-Platform | Kerry W. Lothrop 10. März 2016

Warum Xamarin Platform?

• Cross-Platform– Gemeinsame Codebasis– Eine moderne Sprache (C#) für alle Plattformen

• Nativ– Performance– User Interface– API

• Wiederverwendung von Code und Know-How

© Zühlke 2016Cross-Platform | Kerry W. Lothrop 10. März 2016

Cross-compiling

• Kompilieren aus C# (oder F#) in nativen, plattformabhängigen Code

• (Fast) vollständiger Funktionsumfang von .NET 4.6 und C# 6

• Durch Integration von Teilen des Frameworks steigt die Paketgröße

© Zühlke 2016Cross-Platform | Kerry W. Lothrop 10. März 2016

Xamarin.iOS(früher MonoTouch)

• Ahead-of-time-Compiler direkt in ARM-Assembler-Code

• Keine dynamische Codegenerierung– System.Reflection.Emit fehlt– Keine Dynamic Language Runtime

.NETC# AOTiOS-API

.app

ARM binaryläuft nativ

© Zühlke 2016Cross-Platform | Kerry W. Lothrop 10. März 2016

Xamarin.Android(früher Mono for Android)

• IL (Intermediate Language) und Mono-Runtime werden auf das Gerätdeployed

• Just-in-time compiler

• Mono-Runtime läuft parallel zur Dalvik-VM

• Ahead-of-time-Kompilierung als Option möglich

.NETC#Android-API

.apk

IL + JITläuft nativ

kompilierenlinken

© Zühlke 2016Cross-Platform | Kerry W. Lothrop 10. März 2016

Native Libraries verwendenBindings unter iOS und Android

© Zühlke 2016Cross-Platform | Kerry W. Lothrop 10. März 2016

BindingsiOS

•Tool: Objective Sharpie

•Nacharbeit meist nötig

.h

[BaseType(typeof(NSObject))]interface MyClass{

// Method[Export("draw:atColumn:andRow:")]void Draw(string text, int column, int row);

// Property[Export("menuVisible")]bool MenuVisible { [Bind("isMenuVisible")] get; set; }

}

.cs

© Zühlke 2016Cross-Platform | Kerry W. Lothrop 10. März 2016

BindingsAndroid

•*.jar einfügen

•C# wird automatisch generiert (JNI)

•Transformationen müssen u.U. manuell ergänzt werden<metadata>

<attrpath="/api/package[@name='com.nostra13.universalimageloader.cache.memory.impl']

/class[@name='FIFOLimitedMemoryCache']/method[@name='removeNext']"

name="managedReturn">Java.Lang.Object

</attr><attr path="/api/package[@name='com.nostra13.universalimageloader.core.imageaware']

/class[@name='ImageViewAware']/method[@name='getWrappedView']"

name="managedReturn">Android.Views.View

</attr></metadata>

© Zühlke 2016Cross-Platform | Kerry W. Lothrop 10. März 2016

BindingsC/C++

•Aus Android und iOS möglich

public static class MyClass{

[DllImport("myLib")]int Calculate(int oneValue, int anotherValue);

}

© Zühlke 2016Cross-Platform | Kerry W. Lothrop 10. März 2016

Entwicklungsumgebung

MacBook

Windows 10 (VM)

Visual Studio 2015

ReSharper Xamarin (iOS &

Android)

OS X

Xcode (SDK, Simulatoren)

Xamarin.iOS

© Zühlke 2016Cross-Platform | Kerry W. Lothrop 10. März 2016

Code Sharing

© Zühlke 2016Cross-Platform | Kerry W. Lothrop 10. März 2016

Code SharingPortable Class Libraries

• Sharing auf Binary-Ebene

• Eingeschränkter Funktionsumfang

• Nur andere PCLs als Referenzen

© Zühlke 2016Cross-Platform | Kerry W. Lothrop 10. März 2016

Code SharingShared Projects

• Sharing auf Code-Ebene

• Compiler-Direktiven möglich (#if)

© Zühlke 2016Cross-Platform | Kerry W. Lothrop 10. März 2016

Architektur

© Zühlke 2016Cross-Platform | Kerry W. Lothrop 10. März 2016

ArchitekturMVC

View

Model Controller

© Zühlke 2016Cross-Platform | Kerry W. Lothrop 10. März 2016

View

ArchitekturMVVM

ViewAndroid

Model

ViewModel

plattformunabhängig

data binding

ViewiOS

ViewWindows

Phone

© Zühlke 2016Cross-Platform | Kerry W. Lothrop 10. März 2016

MvvmCross

© Zühlke 2016Cross-Platform | Kerry W. Lothrop 10. März 2016

MvvmCrossProjekt

• Open Source MVVM Framework

• Data Binding

• Dependency Injection

• Lokalisierung

• Navigation

• Messenger

• Portable Class Libraries

• Plugins

• NuGet

• NinjaCoder

© Zühlke 2016Cross-Platform | Kerry W. Lothrop 10. März 2016

MvvmCrossPlattformen

© Zühlke 2016Cross-Platform | Kerry W. Lothrop 10. März 2016

MvvmCrossErweiterbarkeit

ViewAndroid

Model

ViewModel

ViewiOS

ViewWindows

Phone

plattform-spezifischer

Dienst

© Zühlke 2016Cross-Platform | Kerry W. Lothrop 10. März 2016

MvvmCrossErweiterbarkeit

interface IMvxPhoneCallTask{

void MakePhoneCall(string name, string

number);}

ViewAndroid

Model

ViewModel

ViewiOS

ViewWindows

Phone

Windows-Phone-Dienst

Android-Dienst

iOS-Dienst

© Zühlke 2016Cross-Platform | Kerry W. Lothrop 10. März 2016

MvvmCrossPlugins

© Zühlke 2016Cross-Platform | Kerry W. Lothrop 10. März 2016

Demonstration

© Zühlke 2016Cross-Platform | Kerry W. Lothrop 10. März 2016

Was gibt es noch?

© Zühlke 2016Cross-Platform | Kerry W. Lothrop 10. März 2016

User InterfaceXamarin.Forms

• Code-Sharing für den UI-Code

• XAML

• Native User-Interfaces

• Mischen von Xamarin.Forms und plattformspezifischen Views möglich

<ContentPagexmlns="http://xamarin.com/schemas/2014/forms"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"x:Class="ButtonXaml.ButtonXamlPage">

<ButtonText="Tap for click count!"Clicked="OnButtonClicked" />

</ContentPage>

© Zühlke 2016Cross-Platform | Kerry W. Lothrop 10. März 2016

User InterfaceXamarin Inspector

© Zühlke 2016Cross-Platform | Kerry W. Lothrop 10. März 2016

User InterfaceXamarin Test Cloud

© Zühlke 2016Cross-Platform | Kerry W. Lothrop 10. März 2016

Zusammenfassung

© Zühlke 2016Cross-Platform | Kerry W. Lothrop 10. März 2016

Mobile Entwicklungslandschaft

Nativ Cross-compiled Hybrid Web

Beste Usability? Überschaubare Kosten?

© Zühlke 2016Cross-Platform | Kerry W. Lothrop 10. März 2016

Zusammenfassung

• Cross-Platform für alle wichtigen Endgeräte ohne JavaScript

• Native Performance und Möglichkeiten

• Mit bekannten Tools mehr Plattformen erreichen

• Die jeweilige plattformspezifische UI-Technologie muss trotzdem erlernt werden

• Ein breites Tooling unterstützt die Entwicklung

© Zühlke 2016Cross-Platform | Kerry W. Lothrop 10. März 2016

FragenKerry W. Lothropkerry.lothrop.de@kwlothrop