.NET MAUI auf Samsung-Smart-TVs 18.11.2024, 00:00 Uhr

Die große Freiheit

Samsung setzt im Bereich der Smart-TV-Applikationsentwicklung schon länger auf .NET-Technologien. Vergleichsweise neu ist dagegen die Möglichkeit der MAUI-Entwicklung.
(Quelle: dotnetpro)
Ziel dieses Artikels ist eine kurze Vorstellung der Möglichkeiten und Grenzen der MAUI-Entwicklung im Bereich der Smart-TVs. Außerdem soll auf einige Besonderheiten und Änderungen im Bereich der Entwicklungswerkzeuge eingegangen werden.
Gerade in Bezug auf Usability und Co. sei darauf hingewiesen, dass die in der dotnetpro-Ausgabe 1/2024 getroffenen Feststellungen [1] nach wie vor uneingeschränkt gültig sind. Insbesondere gilt, dass ein Smart-TV weder eine Workstation noch ein Handcomputer ist – nicht jeder Inhalt, der auf den letztgenannten beiden Plattformen problemlos funktioniert, lässt sich auch auf Fernsehgeräten gewinnbringend oder zu einer allgemein hohen Benutzerzufriedenheit deployen.

Zwangsupgrades

Ein Grund, warum Fernsehgeräte-Hersteller den Trend zum „Smart-TV“ forcieren, ist nach Ansicht des Autors die Sicherstellung von permanenten Aktualisierungen der Fernsehgeräte. Der Unterschied zwischen HD und 4K mag merkbar sein, der Sprung von 4K auf 8K jedoch ist kaum noch sichtbar und dürfte darum nur wenige Benutzer zum Umstieg animieren. Um neue Kaufanreize zu schaffen, setzt man in Korea deshalb konsequent auf Aktualisierungen des Betriebssystems: Bei der Erstellung dieses Artikels ist Tizen 7.0 im Handel, das SDK wurde mittlerweile allerdings bereits auf Version 8.0 aktualisiert. Allgemein gilt dabei die unter [2] bereitstehende Kompatibilitätsliste, welche die Zuordnung von TV-Geräteserien zu den Betriebssystemversionen ermöglicht.
Wenige Tage vor Abschluss der Arbeiten an diesem Artikel kündigte Samsung an, in Zukunft die mit Tizen 8 ausgelieferten Geräte mit Updates auf neue Versionen zu versorgen – für existierende Hardware mit Tizen 7 gilt dieses Angebot dem Vernehmen nach nicht oder nur sehr eingeschränkt.
Allerdings kommen insbesondere in Europa oft leicht unterschiedliche Produktbezeichnungen zum Einsatz. Der einfachste Weg zum schnellen Feststellen der Plattform-Version eines vorliegenden Smart-TV ist ein Aufruf des URL http://j2i.net/apps/userAgent/, der – wie Bild 1 zeigt – eindeutig über den Versionsstand auf dem jeweiligen Gerät informiert.
Dieser Smart-TV läuft mit Tizen 7.0 (Bild 1)
Quelle: Autor
Im Hintergrund gibt es dabei allerdings ebenfalls Veränderungen: Smart-TVs mit älteren Versionen inklusive Tizen 6.5 werden von MAUI nicht unterstützt. Cross-Plattform-Benutzerinterfaces für diese ältere Gerätegeneration entstehen ausschließlich unter Xamarin Forms, wobei anzumerken ist, dass solche Xamarin-Forms-Applikationen auch auf Fernsehgeräten mit Tizen 7.0 problemlos funktionieren.
Außerdem bietet Samsung mit NUI noch einen komplett ­eigenständigen GUI-Stack an, der allerdings nicht hier, sondern erst in einem Folgeartikel zur Sprache kommen soll.

Aktualisierung des Stand-alone-SDK

Trotz der Änderungen im Bereich des Smartwatch-Betriebssystems hat sich Samsung zumindest zum Zeitpunkt der Abfassung dieses Artikels noch nicht von der Illusion gelöst, dass Tizen irgendwann auch im Handcomputer- und Smartwatch-Markt Marktdominanz erreichen könnte.
Konsequenz für Entwickler ist, dass das SDK nach wie vor „janusköpfig“ aufgebaut ist – die in Visual Studio lebende ­Instanz interagiert, analog zum Fall von Android, mit ­einer alleinstehenden, vollständigen Variante der sonstigen Entwick­lungswerkzeuge. Wer bisher keine größere Zertifikats-Infrastruktur eingerichtet hat, ist deshalb gut beraten, das Tizen-Plug-in zu löschen und zudem den Tizen-Deinstallationsassistenten für das SDK zu verwenden. Im Visual Studio Marketplace ist danach über Extras | TiZen|TiZen Package Manager die Erweiterung Vi­sual Studio Tools for Tizen herunterzuladen – der darin enthaltene Paketmanager erlaubt dann das abermalige Deployen der diversen SDK-Komponenten.
Alternativ dazu ist es möglich, den Paketmanager mit der Aktualisierung der vorliegenden Komponenten zu beauftragen. Wichtig ist dabei, dass die in ­Visual Studio enthaltene Komponente ebenfalls aktualisiert werden muss.
Aktivierung des Samsung-Entwicklermodus
Die auf Samsungs Smart-TVs zum Freischalten des Entwicklermodus notwendigen Fernbedienungsmanöver sind mitunter etwas verwirrend. Auf YouTube findet sich unter [7] ein Video des Autors, das die Vorgehensweise illustriert.

Erzeugen einer neuen Projektvorlage

Sobald alle auf der Workstation des Entwicklers befindlichen Komponenten auf den aktuellen Stand gebracht sind, ist es abermals an der Zeit, den Projektgenerator-Assistenten von Visual Studio anzuwerfen. Dass im Rahmen des Starts der IDE erneut eine UAC-Aufforderung samt Verweis auf die Power­Shell erscheint, ist ärgerlich, war allerdings beim Schreiben dieses Artikels nicht zu eliminieren. Das Verneinen dieser Aufforderung führt übrigens dazu, dass das Tizen-SDK später nicht ordnungsgemäß funktioniert.
Die MAUI-Entwicklung für den Smart-TV setzt eine weitere Besonderheit im Bereich der Projekterstellung voraus: Die korrekte Vorlage ist nämlich die in Bild 2 gezeigte Variante
.NET MAUI-App. Samsung hat sich vom Sonderweg der eigenen Tizen-Projektvorlagen mittlerweile verabschiedet.
Das Tizen-Callout informiert über die Eignung dieser Projektvorlage (Bild 2)
Quelle: Autor
Unschön ist, dass bei Abfassung dieses Artikels Tizen selbst in der neuesten Version 8, die noch nicht auf realer Hardware verfügbar ist, das .NET Framework ausschließlich in Version 6.0 unterstützt – die in der iOS- und Android-Welt weit verbreiteten .NET-Versionen 7 und 8 dürften demgemäß frühestens im Jahr 2025 verfügbar werden. Insbesondere auf sonst produktiv genutzten Workstations scheint jedoch häufig die Version 6.0 gar nicht mehr in der Zielauswahl-Combobox auf.
Zur Umgehung dieses Problems öffnen Sie im ersten Schritt den Visual Studio Installer und laden danach die Paket-Einstellungen der für die Arbeit mit dem Smart-TV vorgesehenen Instanz von Visual Studio. Prüfen Sie im Installer dann nach, ob die Komponente .NET 6.0-Runtime (Langfristige Unterstützung) als auf der Workstation vorhanden markiert ist.
Aufgrund eines bekannten Problems in Visual Studio reicht dies normalerweise nicht aus, um die Version 2022 zum Anbieten von .NET 6.0 als Ziel zu animieren. Im nächsten Schritt folgt deshalb der Besuch der Microsoft-Download-Webseite für .NET 6.0 unter [3], wo Sie die aktuellste Version von .NET 6.0 herunterladen. Beim Schreiben dieses Artikels lautet der korrekte Link .NET 6.0 SDK (v6.0.421) – Windows x64 Installer; er führt zum Herunterladen der Datei dotnet-sdk-6.0.421-win-x64.exe. Diese wird danach wie gewohnt ausgeführt.
Nach dem obligatorischen System-Neustart kehren wir in Visual Studio 2022 zurück und erzeugen auf Basis der MAUI-Vorlage ein neues Projekt. Im Auswahl-Assistenten entscheiden wir uns vorerst für die Plattform-Version 7.0, um die Kompilation durchlaufen zu lassen – in den folgenden Schritten wird der Autor den String NMGMauiTV als Solution-Namen vergeben.
Nach dem erfolgreichen Durchlaufen des Projektgenerators öffnen wir die Eigenschaften der Projektmappe und scrollen – wie in Bild 3 gezeigt – in die Rubrik für die Tizen-Ziele.
Die komplette Aktivierung von Tizen setzt im Visual-Studio-GUI einige Kunstgriffe voraus (Bild 3)
Quelle: Autor
Im ersten Schritt muss dabei die Checkbox Aktivieren Sie das Targeting der Tizen-Plattform aktiviert werden. Im Bereich der .NET-Ziel-Runtime wird die Version 6.0 ausgewählt; als Ziel-Tizen-Framework und minimales Framework ist jeweils die Version 6.5 auszuwählen. Zu beachten ist, dass es sich dabei um eine Inkonsistenz zwischen dem Visual-Studio-Tooling und den von Sam­sung tatsächlich implementierten Komponenten handelt – MAUI-basierte Applikationen dürfen ausschließlich auf Smart-TVs zur Ausführung gelangen, die auf Tizen 7.0 basieren.
Nach dem Speichern der Eigenschaften blendet Visual Studio im Projektmappen-Explorer normalerweise eine Aufforderung zur Installa­tion zusätzlicher Komponenten ein. Diese sollten Sie anklicken und eventuell fehlende Komponenten bereitstellen lassen.
Nach dem Schließen des Einstellungs- und Installationsfensters folgt ein Klick auf die Ziel-Auswahl, wo Sie in der Option Tizen-Framework darauf achten müssen, wie in Bild 3 gezeigt Tizen 6.5 auszuwählen.
Nach dem Durchführen dieser Manipulationen empfiehlt sich ein Neustart von Visual Studio – im Idealfall lassen sich die Projektmappe beziehungsweise ihre Eigenschaften danach bereits öffnen. In der Praxis kommt es allerdings stattdessen oft zum in Bild 4 gezeigten Fehlerbild. Kritisch daran ist, dass in diesem Fall keine Kompilation des resultierenden Projekts möglich ist.
Dieser Bildschirm dient als eine Art Lackmustest (Bild 4)
Quelle: Autor

Umgehungsversuch, der erste – Erzeugen der Applikation über die Windows-Kommandozeile

Da sich das Tooling in Visual Studio an dieser Stelle als renitent erwiesen hat, bietet sich der Umstieg in die .NET-Entwicklerkommandozeile an. Unsere erste Aktion ist hier die Erzeugung eines neuen Arbeitsverzeichnisses nach folgendem Schema:

C:\>mkdir tizennetspace
C:\>cd tizennetspace
Im nächsten Schritt ist eine Steuerungsdatei erforderlich, welche die bei der Arbeit in diesem Ordner zu verwendende Version des .NET Frameworks beschreibt. Der einfachste Weg zu ihrer Generierung ist die Nutzung von Notepad:

C:\tizennetspace>notepad global.json
Inhaltlich finden sich in diesem File keine Überraschungen. Achten Sie lediglich darauf, die Versionsinformationen an die von Ihnen installierte Version des SDK anzupassen; in unserem Fall bedeutet das:

{
  "sdk": {
    "version": "6.0.421"
  }
}
Nach getaner Arbeit ist im ersten Schritt das Aktualisieren der im SDK lokal vorgehaltenen Work­load-Liste erforderlich. Sinn dieser Operation ist die Möglichkeit zum Freischalten des eigentlichen Install-Befehls, der die notwendigen Komponenten auf den Rechner schafft:

C:\tizennetspace>dotnet workload search
C:\tizennetspace>dotnet workload install maui-tizen
Workload(s) maui-tizen wurde(n) erfolgreich installiert.
Nach dem Herunterladen der Payload haben Sie die Möglichkeit, über den .NET-Projektgenerator nach folgendem Schema ein neues Projektskelett ins Leben zu rufen:

C:\tizennetspace>dotnet new maui -n HelloMaui
Die Vorlage ".NET MAUI-App" wurde erfolgreich erstellt.
Im nächsten Schritt bietet es sich an, die Struktur der Projektdatei zu analysieren. Von Haus aus deaktiviert der Generator – wie im nachfolgenden Code-Snippet gezeigt – die relevanten Deklarationen, die das Projekt als für Tizen kompilierbar beziehungsweise nutzbar markieren:

<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
    <TargetFramework>net6.0-tizen</TargetFramework>
    <!-- Uncomment to also build the tizen app. You will 
      need to install tizen by following this: 
      https://github.com/Samsung/Tizen.NET -->
    <!-- <TargetFrameworks>$(TargetFrameworks);
      net6.0-tizen</TargetFrameworks> -->
    <OutputType>Exe</OutputType>
Zweckmäßig ist es nun, die vom Kommandozeilenwerkzeug generierte Solution in Visual Studio 2022 zu laden und zu probieren, ob die Kompilation erfolgreich verläuft.
In den meisten Fällen kommt es stattdessen abermals zum in Bild 4 gezeigten Fehler. Als Behebungsmaßnahmen bieten sich dann zwei Methoden an. Erstens könnte man in der Power­Shell die beiden folgenden Kommandos ausprobieren, um abermals zusätzliche Payloads herunterzuladen:

PS C:\tizennetspace\HelloMaui> dotnet workload restore
Workloads werden installiert: android ios maccatalyst
PS C:\tizennetspace\HelloMaui> dotnet workload install 
  maui-tizen
Workloads 'maui-tizen' sind bereits installiert.
Lösungsweg Nummer zwei ist das von Samsung unter [4] zum Download bereitgestellte Skript, das sich um die Armierung der diversen notwendigen Komponenten kümmern soll. Laden Sie es herunter und führen Sie es danach in einer mit Administratorrechten ausgestatteten Power­Shell aus:

PS C:\tizennetspace> .\workload-install.ps1
Während der Programmausführung kommt es dabei mitunter zu Warnmeldungen, wie in Bild 5 gezeigt. Die Ursache dafür ist, dass das Samsung-Skript einfach stur alle zur Verfügung stehenden unbekannten SDK-Versionen ausprobiert – findet es für die jeweilige .NET-Variante keine Binärdateien auf dem Server, so wird eine Statusmeldung ausgegeben. In den Tests des Autors führte allerdings auch dies nicht zu einer vollständig lauffähigen Projektstruktur.
Das Samsung-Installationsskript zeigt sich kommunikativ (Bild 5)
Quelle: Autor
Vielmehr ließ sich in den Tests des Autors – siehe die Ausgabe des Strings Done installing Tizen workload 8.0.154 in Bild 5 – nur in einer bestimmten Situation eine ausführbare Datei generieren. Anhand der unter [5] bereitstehenden Informationen lässt sich nämlich feststellen, dass das heruntergeladene Tizen-Unterstützungspaket mit der Framework-Version SDK 8.0.200 funktioniert.
Wer diese nach den weiter oben besprochenen Anweisungen installiert, kann über global.json nach folgendem Schema eine auf diese SDK-Version optimierte Version des MAUI-Projektskeletts rehydrieren:

{
  "sdk": {
    "version": "8.0.200"
  }
}
Im Test des Autors ließ sich diese problemlos kompilieren – die Auslieferung auf den Smart-TV scheiterte indes, obwohl dieses in den Einstellungen des Tizen-Plug-ins als anzielbares Gerät aufgelistet war.

Umgehungsversuch, der zweite – zwangsweise
Kompilation

Die Probleme im Bereich der Visual-Studio-Integration hat der Autor bei Samsung bereits gemeldet. Wer zum aktuellen Zeitpunkt MAUI-Payloads ausführen möchte, sollte stattdessen auf Ubuntu 20.04 setzen. Zu beachten ist, dass die IDE-Unterstützung dort noch rudimentärer ausfällt. Andererseits ist es dort möglich, eine ausführbare .tpk-Datei zu erhalten.
Die Einrichtung des .NET-SDK unter Ubuntu wollen wir hier als bekannt annehmen. Unsere erste Aktion ist deshalb die Erzeugung einer Arbeitsumgebung, in der wir danach den Tizen-Workload nach folgendem Schema installieren:

tamhan@TAMHAN18:~$ mkdir tizenspace
tamhan@TAMHAN18:~$ cd tizenspace/
tamhan@TAMHAN18:~/tizenspace$ curl -sSL 
  https://raw.githubusercontent.com/Samsung/Tizen.NET/
  main/workload/scripts/workload-install.sh | sudo bash
[sudo] password for tamhan:
...
Nach der Abarbeitung ist es erforderlich, einige zusätzliche Workloads zu installieren:

tamhan@TAMHAN18:~/tizenspace$ dotnet workload search
...
tamhan@TAMHAN18:~/tizenspace$ sudo dotnet workload 
  install maui-tizen tizen
[sudo] password for tamhan:
Der erste Befehl aktualisiert dabei die auf der Workstation befindliche Workload-Liste, während sich das zweite Kommando um das eigentliche Ausliefern der Komponenten kümmert.
Die Generierung des Projektskeletts erfolgt dann wie erwartet unter Nutzung von dotnet new. Die unter Ubuntu auf dem CLI herunterladbare Version des MAUI-Projektskeletts ist dabei etwas „kompatibler“ als ihre für Windows vorgesehene Variante:

tamhan@TAMHAN18:~/tizenspace$ dotnet new tizen -n 
  HelloTizenNet6
Im nächsten Schritt ist ein Rauchtest erforderlich. Neben ­einer erstmaligen Kompilation befehligen wir hier auch das Restaurieren der diversen für die Ausführung der Solution notwendigen Pakete:

tamhan@TAMHAN18:~/tizenspace/HelloMaui$ dotnet build 
  -t:Run -f net6.0-tizen
MSBuild version 17.7.4+3ebbd7c49 for .NET
  ...
tamhan@TAMHAN18:~/tizenspace/HelloMaui$ sudo dotnet 
  workload restore
  ...
Successfully installed workload(s) android wasm-tools 
  maui-tizen tizen.
Im nächsten Schritt ist eine Anpassung der Projektsteuerungsdatei erforderlich, denn die Toolchain für Tizen funk­tio­niert beim Schreiben dieses Artikels ausschließlich dann, wenn Tizen als einzige Zielplattform deklariert ist. Die Anpassung lässt sich nach folgendem Schema bewerkstelligen:

<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
  <TargetFrameworks>$(TargetFrameworks);net6.0-tizen</TargetFrameworks>
  <OutputType>Exe</OutputType>
  <RootNamespace>HelloMaui</RootNamespace>
  <UseMaui>true</UseMaui>
  <SingleProject>true</SingleProject>
  <ImplicitUsings>enable</ImplicitUsings>
Zu guter Letzt ist dann eine abermalige Kompilation erforderlich – scheitert diese mit der Fehlermeldung „error: /home/tamhan/tizen-studio/tools/sdb not found. Please set SdbToolPath property“, so ist der erste Teil der Konfiguration erfolgreich verlaufen.

Einrichtung von Tizen Studio zur Bereitstellung der SDK-Komponenten

Die Erzeugung von Tizen-Kompilaten setzt verschiedene Elemente des nativen SDK voraus. Das Herunterladen des MAUI-Tizen-Workloads installiert diese (wohl aus lizenzrechtlichen Gründen) nicht. Zur Umgehung des Problems besuchen wir die Tizen-Studio-Downloadseite unter [6], wo wir die Linux-Variante des Studio-Installers herunterladen und diesen mit folgenden Befehlszeilen ausführen:

tamhan@TAMHAN18:~$ cd Downloads/
tamhan@TAMHAN18:~/Downloads$ chmod +x 
  web-ide_Tizen_Studio_5.6_ubuntu-64.bin
tamhan@TAMHAN18:~/Downloads$ 
  ./web-ide_Tizen_Studio_5.6_ubuntu-64.bin
Im Rahmen der Ausführung fragt der Installations-Assistent, wo die zu Tizen gehörenden Pakete unterkommen sollen. Die in Bild 6 gezeigten Standardeinstellungen für die Ablageorte sind dabei korrekt.
Die Standardeinstellungen reichen völlig aus (Bild 6)
Quelle: Autor
Während der Installation erscheinen mehrere UAC-Anfragen, in denen Ubuntu zur Eingabe des Superuser-Passworts auffordert – diesem müssen Sie nachkommen, um dem In­staller das Verankern von Tizen Studio im Rechtesystem des Betriebssystems zu ermöglichen.
Nach der erfolgreichen Installation fragt das Werkzeug mitunter, ob es den Paketmanager starten darf. Dies sollten Sie bejahen und die beiden folgenden Komponenten installieren:
  • Main SDK | 8.0 Tizen
  • Extension SDK | Extras | TV Extensions 8.0
Nach dem kompletten Deployen der Pakete bringt ein Neustart der Workstation den Path auf den aktuellen Stand.
Im nächsten Schritt folgt eine abermalige Rekompilation nach folgendem Schema:

tamhan@TAMHAN18:~/tizenspace/HelloMaui$ dotnet build 
  -t:Run -f net6.0-tizen
MSBuild version 17.7.4+3ebbd7c49 for .NET
  Determining projects to restore...
  ...Samsung.Tizen.Sdk.Packaging.targets(161,5): error : The api-version specified in tizen-manifest file is 7. [/home/tamhan/tizenspace/HelloMaui/HelloMaui.
  csproj::TargetFramework=net6.0-tizen]
/usr/share/dotnet/packs/Samsung.Tizen.Sdk/8.0.133/
  targets/Samsung.Tizen.Sdk.Packaging.targets(161,5): 
  error : Current target framework net6.0-tizen is not 
  supported in this api-version.
Die Ausgabe informiert dabei darüber, dass die vorliegende Projekt-Konfiguration erfolgreich kompiliert wurde und es erst im Rahmen der Verpackung und der Manifestverifika­tion zu Problemen kommt.
Zur Behebung dieses Missstands reicht es aus, die Datei ­tizen-manifest.xml zu öffnen und sie nach dem folgenden Schema zu adaptieren – die Datei findet sich im Unterordner Platforms/Tizen:

<?xml version="1.0" encoding="utf-8"?>
<manifest package="maui-application-id-placeholder" 
  version="0.0.0" api-version="8" xmlns=
  "http://tizen.org/ns/packages">
Danach ist auch schon eine Rekompilation möglich, die durch Generieren der .tpk-Datei ein schlüsselfertiges Archiv liefert:

tamhan@TAMHAN18:~/tizenspace/HelloMaui$ dotnet build 
  -t:Run -f net6.0-tizen
MSBuild version 17.7.4+3ebbd7c49 for .NET
  Determining projects to restore...
  ... [/home/tamhan/tizenspace/HelloMaui/HelloMaui.csproj::TargetFramework=net6.0-tizen]
  HelloMaui is signed with Default Certificates!
  HelloMaui -> /home/tamhan/tizenspace/HelloMaui/bin/
  Debug/net6.0-tizen/tizen-x86/com.companyname.
  hellomaui-1.0.0.tpk
Wer seine Ubuntu-Workstation noch nicht mit dem Smart-TV verbunden hat, sieht dann die sehr umfangreichen in Bild 7 gezeigten Fehler.
Probleme beim Deployment der Software führen zu einem vergleichsweise umfangreichen Fehlerbild (Bild 7)
Quelle: Autor
An dieser Stelle bietet sich der Start des Device Managers von Tizen Studio an, um eine Verbindung zum im Entwickermodus befindlichen Fernsehgerät herzustellen. Das Deployment der Applikation erfolgt dann unter Nutzung des sdb-Kommandozeilenwerkzeugs – es verhält sich sehr analog zu dem, was Entwickler von der Android Debug Bridge kennen:

$ sdb install helloworld/bin/Debug/tizen80/org.tizen.
  example.helloworld-1.0.0.tpk
$ tizen run -p org.tizen.example.helloworld

Fazit

Obwohl sich die Tizen-Toolchain zum Zeitpunkt der Abfassung dieses Artikels noch in einem sehr frühen Zustand befindet, ist offensichtlich, dass Samsung Unterstützung von MAUI im Smart-TV-Bereich über kurz oder lang nachrüsten wird. Die hier gezeigten Experimente ermöglichen erste Versuche im Bereich der Mobilisierung hauseigener Payloads. Was das Verhältnis von Aufwand zu Nutzen angeht, sei allerdings angemerkt, dass die Verwendung von Xamarin derzeit die größere Reichweite ermöglicht.
Dokumente
Artikel als PDF herunterladen


Das könnte Sie auch interessieren