Categories
Programmierung

Automatisiertes Mobile UI Testing mit Xamarin.UITest und Xamarin Test Cloud

Im Zühlke-Blog habe ich einen Blogeintrag (auf Englisch) veröffentlicht zum Thema Automatisiertes Mobile UI Testing mit Xamarin.UITest und Xamarin Test Cloud:

https://www.zuehlke.com/en/insights/automated-mobile-ui-testing-xamarinuitest-and-visual-studio-app-center

Categories
Programmierung

Unified API: 64 bit für Xamarin.iOS

Alle iOS-Entwickler stehen vor einer Deadline: Ab 1. Februar 2015 müssen alle neuen Apps und App-Updates, die an den App-Store übermittelt werden, gegen das iOS 8 SDK gebaut sein und müssen 64 bit unterstützen. Für Objective-C-Entwickler ist dieses Update hauptsächlich Routine wie bei anderen SDK-Updates. Für Xamarin.iOS-Entwickler bedeutet dies eine Umstellung.

Das ursprüngliche Design der MonoTouch-API verwendete einige der eingebauten .NET-Typen, z.B. System.Int32 (int), System.Single (float) und RectangleF. Leider sind diese Typen alle entweder 32-bit-Typen oder bestehen aus 32-bit-Typen. Was jedoch benötigt wird, sind Typen, die auf 32-bit-Plattformen 32 bit groß und auf 64-bit-Plattformen 64 bit groß sind.

Aus diesem Grund hat Xamarin eine Änderung umgesetzt, die alle Xamarin.iOS-Entwickler betrifft. Da diese Änderungen bestehenden Code sowieso brechen wird, hat Xamarin die Gelegenheit genutzt, einige Unstimmigkeiten in der alten API zu beseitigen. Wer sich für alle Änderungen im Detail interessiert sieht sich am besten die Evolve session von Miguel de Icaza zu dem Thema an.

Die neue Unified API ist in der Assembly Xamarin.iOS.dll enthalten, statt wie bisher in monotouch.dll. In dieser werden die bisherigen numerischen Typen ersetzt, wie dieser Tabelle zu entnehmen ist:

alt neu
System.Int32 (int) System.nint
System.UInt32 (uint) System.nuint
System.Single (float) System.nfloat
System.Drawing.PointF CoreGraphics.CGPoint
System.Drawing.SizeF CoreGraphics.CGSize
System.Drawing.RectangleF CoreGraphics.CGRect

Projekte, die die neue Unified API verwenden, müssen einen neuen Projekttyp verwenden.

Unified API

Innerhalb von Projekten mit dem neuen Projekttypen können keine Projekte, die noch die bisherige (Classic) API verwenden, referenziert werden.

Das Wort “Unified” (vereinheitlicht) in Unified API bezieht sich Xamarins Versuch, gemeinsamen Code für iOS- und Mac-Projekte zu ermöglichen. Aus diesem Grund wurde Auch der Namespace MonoTouch ersatzlos gestrichen. Hierdurch können Teile des Apple-spezifischen Codes zwischen den beiden Plattformen geteilt werden, für die bisher plattformspezifische Implementierungen notwendig waren, z.B. über Shared Projects.

Bestehende Projekte können von Hand oder halbautomatisiert von der Classic API auf die Unified API umgestellt werden. Xamarin hat hierfür eine Anleitung für sowohl die manuellen Schritte als auch für eine Update via Skript oder das in Xamarin Studio eingebaute Updatefeature veröffentlicht.

Ich habe den iOS-Code in MvvmCross auf die neue Unified API umgestellt. Hier sind einige Erkenntnisse aus der Umstellung:

  • Einige Methodennamen wurden verschönert (z.B. UINavigationController.PopViewControllerAnimated() wurde zu UINavigationController.PopViewController(), CGContext.SetRGBFillColor() wurde zu CGContext.SetFillColor(), NetworkReachability.SetCallback() wurde zu NetworkReachability.SetNotification()).
  • Einige Methoden mit Callbacks wurden durch awaitable-Methoden ersetzt.
  • Einige als deprecated markierte Methoden wurden entfernt.
  • Die neuen numerischen Typen sehen aus wie eingebaute Typen, verhalten sich aber nichts so (sie können z.B. nicht const sein, man kann sie nicht mit System.Math.Max() verwenden, etc.).
  • MonoTouch.Foundation.NSAction scheint entfernt worden und durch System.Action ersetzt worden zu sein.

Im Stable-Kanal findet man aktuell eine Vorschau der Unified API. Die finale Version sollte bis Anfang Dezember 2014 in den Alpha- und Beta-Kanälen auftauchen. Jedes bestehende Xamarin.iOS-Projekt wird auf die neue Unified API umgestellt worden sein, wenn es nach dem 1. Februar 2015 an den App Store übermittelt wird. Es ist an der Zeit, sich mit dem Aktualisieren der eigenen Projekte zu befassen.

Update 18. Januar 2015:

  • Die Unified API für iOS ist jetzt im Stable-Kanal verfügbar.
  • In der Zwischenzeit hat Apple die Ankündigung bezüglich der Einreichungsfrist genauer spezifiziert: Die Deadline vom 1. Februar gilt nur für neue Apps. Updates für bestehende Apps können bis einschließlich 31. Mai 2015 noch als reine 32-bit-Anwendungen eingereicht werden.
  • Zwischen der Vorabversion Xamarin.iOS 8.4 und der finalen Version 8.6 gab es leider Änderungen an der API.
  • Xamarin hat die Klasse System.NMath für arithmetische Operationen auf den neuen Datentypen nint, nuint, nfloat zur Verfügung gestellt.
  • Um eine App beim Store einzureichen, muss diese app zusätzlich für die ARM64-Architektur kompiliert worden sein. Dies kann bisher nur in Xamarin Studio oder für Visual-Studio-Anwender direkt in der .csproj-Datei durchgeführt werden.
Categories
Programmierung

DWX14-Nachtrag: Einführung in Xamarin und MvvmCross


Bei der diesjährigen Developer Week in Nürnberg durfte ich einen Vortrag zu Cross-Platform-Entwicklung mit Xamarin und MvvmCross halten. Das hat mir großen Spaß mit Live-Coding und den Fragen aus dem Publikum.

Die Folien zum Vortrag sind auf Slidshare auf deutsch und englisch verfügbar. Der Code aus dem Live-Coding, den ich mit Hilfe von Ninja Coder erstellt habe, ist auf Github verfügbar.

Categories
Programmierung

Eine App-interne Statusleiste für Xamarin.iOS und MvvmCross

Für eine iPad-App für unseren Kunden Smart Enterprise Solutions brauchten wir die Möglichkeit, dem Anwender mehrere Nachrichten anzuzeigen. Diese Nachrichten waren hauptsächlich Rückmeldungen der Business-Logik-Schicht, die mit dem Backend kommuniziert. Die Nachrichten sollten innerhalb der App sichtbar sein. The messages should be visible inside the app. Einige der Nachrichten sollten vom Anwender bestätigt werden müssen während andere nach einer bestimmten Zeit wieder verschwinden sollten.

Die finale Statusleiste sieht so aus:

StatusBar

Der Code hierzu ist unter https://github.com/lothrop/StatusBar.iOS frei zugänglich.

Die Statusleiste heißt StatusView. Um die StatusView zu verwenden, sollte man sie mit Hilfe von Auto Layouts an den linken, rechten und unteren Rand andocken. StatusView wird durch das ViewModel MessageViewModel mit Daten befüllt. MessageViewModel beinhaltet eine ObservableCollection<IMessageItem>. Man kann MessageItems an jeder der Stelle der Collection hinzufügen oder entfernen oder auch innerhalb der Collection verschieben.

Ein Anwendungsbeispiel steht in der Datei MainViewController.cs.

Vielen Dank an Smart Enterprise Solutions, die mir erlaubt haben, diese Code zu veröffentlichen.

Categories
Programmierung

Animationen mit UIView.AnimateAsync()

Xamarin.iOS 6.4 brachte async/await-Unterstützung für iOS-Geräte. Neben der Unterstützung des Idioms im Mono-3.0-Compiler hat Xamarin auch viel Arbeit investiert, um awaitable-Versionen aller lang andauernden Methoden in Apples iOS API zu erstellen. Eine meiner liebsten ist

UIView.AnimateAsync()

die eine Action oder Lambda zum Animieren bekommt, ohne den UI-Thread zu blockieren.

Richtig Spaß macht das ganze, wenn man die Animationen verkettet. Hier ist ein Beispiel einer horizontalen Schüttel-Animation, die z.B. verwendet werden könnte, um eine ungültige Eingabe zu signalisieren: