© 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?
• 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 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
View
ArchitekturMVVM
ViewAndroid
Model
ViewModel
plattformunabhängig
data binding
ViewiOS
ViewWindows
Phone
© 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
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
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
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