ich habe jetzt einen kostenpflichtigen Account bei Apple Developer und habe es nun geschafft eine Beta Version Online zu stellen (Adhoc Deployment).
Der kostenlose Account kann nicht viel und man macht mehr kaputt damit. Ich musste viele Umwege gehen bis App ID, Bundle ID, Certificate, Provisioning Profile und Signature funktioniert haben. Am Ende musste ich alle löschen und neu vom VS erstellen lassen.
XCode ist sehr wackelig und ich habe nun alles auf dem Windows Rechner gemacht. Der Mac muss eingeschaltet sein und ein iPhone muss angeschlossen sein. Zum Glück bekomme ich ein altes iPhone geschenkt. Das Windows Visual Studio läuft gut mit dem Mac zusammen und holt sich alle notwendigen Dokumente von der Apple Developer Seite. Und legt alles an was man braucht !
Außerdem prüfe ich den Hauptspeicherbedarf. Wenn ein Anwender versucht eine Liste mit 100 Millionen Datensätzen anzuzeigen kommt eine entsprechende Fehlermeldung.
Wie kannst Du das denn, wenn doch der Reader strikt vorwarding ist, du also noch gar nicht weißt, wie viele Daten kommen werden?
Meine Applikation ist 32 Bittig und ich erlaube 768 MB Hauptspeichernutzung beim Erstellen des Reports. Bis zu 2048 MB sind möglich.
Wenn man eigene Arrays / Listen benutzt spart man viel Speicher gegenüber einer DataTable, da diese die Zeilen mehrfach speichert.
So auf die Schnelle :
using (SqlDataReader x_reader = x_ermittle_verpackungen_kunde.ExecuteReader())
{
while (x_reader.Read())
{
cBestaende.Rows.Add(...);
if (HauptspeichernutzungInMegabyte() > 768) { Message("Der Bericht ist zu groß um ihn vollständig auszugeben !"); break; }
progresslabel.Text = " Bericht wird erstellt ... " + (index++ * 100 / length).ToString() + " % ";
progresslabel.BringToFront();
Application.DoEvents();
}
}
"Application.DoEvents();" ist böse, besser einen eigenen Task für die Anzeige erstellen.
using (SqlDataReader x_reader = x_ermittle_verpackungen_kunde.ExecuteReader())
{
while (x_reader.Read())
{
cBestaende.Rows.Add(...);
}
}
Ob das schneller ist weiß ich nicht. Aber man kann dem Anwender eine Progressbar anzeigen und einen Abbruch Button zur Verfügung stellen.
Bei mir hat alles was länger als 2 Sekunden dauert eine Progressbar.
Außerdem prüfe ich den Hauptspeicherbedarf. Wenn ein Anwender versucht eine Liste mit 100 Millionen Datensätzen anzuzeigen kommt eine entsprechende Fehlermeldung.
Der SQL Server bekommt den gesamten SQL Befehl und übersetzt ihn und führt ihn aus. Das ist ja Sinn der Sache.
Wenn Du eienn SQL Befehl mit Parametern übergibst dann setzt der SQL Server die Parameter ein, Du musst Dich nicht um länderspezifische Darstellung oder Sonderzeichen kümmern (SQL Injection).
Die Parameter haben noch den Vorteil dass der SQL Server jedes Kommando nur einmal übersetzen muss wenn sich nur die Parameter ändern.
Ich verzichte bei großen Datenmangen auf Tables und DataSet weil man nie weiß was beim Kunden passiert.
Was passiert wenn Du exakt den gleichen SQL Befehl im Code ausführst wie der aus dem Management Studio ?
Was passiert wenn Du einen DataReader benutzt ?
Ich denke dass man das Management Studio eher mit einem DataReader vergleichen kann weil es während der Ausführung responsiv bleibt und im Hintergrund lädt.
Wenn es eine Tabelle anzeigt ist es oft noch nicht fertig mit laden.
Hast Du dazu die Signatur aus dem Apple Developer Center benutzt ? Dann braucht man den kostenpflichtigen Developer Account, den habe ich noch nicht.
Mit XCode kann man auch ohne diesen Account signieren, ich weiß aber nicht ob nur für angeschlossene Handys gilt oder für alle Handys.
Für die Entwicklung benutze ich nur Visual Studio, auf Windows und auf dem Mac. Xcode habe ich nur für da Anmelden des iPhones und für das Signieren benutzt.
nach einigen steinigen Wegen und 1 h Telefonat mit Apple USA und 1,5 h Telefonat mit Apple München funktioniert nun mein Mac Mini mit XCode und Visual Studio.
Visual und Studio und XCode haben ja Funktionen um Apps zu signieren (archivieren) um sie für Ad Hoc Deployment per Link auf Website bereitzustellen.
Kann man die Signaturen manuell hinzufügen z.B. mit openssl ?
Apple braucht eine p12-Datei.
Wenn man die Signaturen per Skript hinzufügen könnte würde das meinen Ablauf für die Bereitstellung erheblich vereinfachen und sicherer machen.
Außerdem kriege ich es bisher nur ab und zu hin die Signaturen für iOS zu erstellen, das ist recht wackelig in XCode.
Jetzt habe ich ein iPhone zum Testen. Das Testen auf einem Gerät ist leider nicht so einfach wie mit einem Android Gerät. Da dauert es nur wenige Minuten bis die App auf dem Handy läuft.
ich scheitere immer daran ein Team oder ein Bereitstelungsprofil anzulegen. Das scheint mit dem kostenlosen Entwickleraccount nicht zu gehen obwohl es gehen sollte.
Weder am mac noch am Windows PC.
Leider gibt es auch keine durchgängige Anleitung dazu.
Die Buttons kriege ich alleine hin, da wird das BorderRound / CornerRound und das BorderWidth von iOS anders umgesetzt als beim Android.
Den inaktiven Button kann man nicht lesen, mal sehen.
Ich bin ja froh dass es überhaupt läuft.
Bis es perfekt ist ist es noch etwas Arbeit.
Den Remote iOS Emulator hab ich eben getestet, er startet aber bleibt schwarz. Das war ja schon beschrieben dass der nicht geht.
Ich habe auch aus Versehen Android Code in das gemeinsame Projekt geschrieben, muss ich auch ändern. Aber so auf Anhieb eine tolle Entwicklungsumgebung für Android und iOS und läuft auch auf dem M1 !
Grüße Bernd
PS.: Zeitformat ist auch falsch bei Einsatzbeginn. Das sind aber alles Luxus-Probleme !
Da Date- und Timepicker in Xamarin.Forms m.M.n. hässlich und nicht intuitiv bedienbar sind und dazu noch im Darkmode nicht funktionieren habe ich jetzt eigene Time- und Datepicker geschrieben. Ganz ohne Design, aber sie funktionieren !
Zuerst ließ sich die App nicht auf dem Handy installieren, die Fehlermeldung lautete "App nicht installiert".
Erst nach einigen Recherchen konnte ich das genaue Protokoll mit dem Programm adb anschauen und den Fehler eingrenzen.
Mit adb konnte ich die vorherige Version komplett de-installieren und die neue Version installieren.
Das Layout hatte ich komplett auf Grid umgestellt und so passt es sich an die verschiedenen Auflösungen an. Nur die Schriftgröße nicht. Die muss man manuell anpassen.
Dazu gibt es jetzt ein Menü mit dem man die Schrift größer und kleiner machen kann.
Im Listview kann ich die Schriftgröße leider nicht ändern, das habe ich dann anders gelöst.
Die erste Rückmeldung der Beta Version : "Man kann nichts sehen !"
"Dark Mode" was ist das ?
Für den Dark Mode muss man so einige Controls anpassen, dann klappt das auch. Nur der DatePicker läuft nicht, der zeigt seine Werte weiß auf weiß an. Lässt sicher leider nicht ändern. Das ist ein known issue und wird hoffentlich bald behoben.
Inzwischen läuft die App sehr gut auf vielen verschiedenen Android Devices.
Als nächstes kommt die iOS Version dran. Ich habe nun ein MacBook Pro leiheise hier. Leider muss sehr viel installiert werden, so werde ich mir doch einen eigenen Mac zulegen.
Der Query Builder ist ja fast genauso wie mein ORM.
Ich habe es nach einem Vortrag der .NET User Group in Bad Homburg über Statemachines und Fluent APIs im Jahr 2015 geschrieben.
Ich kann diese Vorgehensweise sehr empfehlen weil die Programmierung wirklich sehr einfach und typsicher ist.
Eine Grammatik kann ich bei mir nicht einbauen da ich sonst keine fallweise Verknüpfungen machen kann wie
if (...) qry = qry.sn_nr().IsLike(SuchfeldString(such_sn_nr)).And();
Bzw. ich hab's nicht hinbekommen.
Zusätzlich erstelle ich für die Datenbankstruktur Klassen, so dass die Query typsicher ist und Intellisense funktioniert. Das macht der Query Builder nicht glaube ich.
ich möchte hier mein Projekt 'Finderwille Einsatz App' vorstellen an dem ich gerade arbeite.
Durch die Beschränkung die wir zur Zeit bei Trainings und Einsätzen mit unseren Hunden haben habe ich eine App gesucht um Einsätze und einsatznahe Trainings aus der Ferne zu organisieren und die Live Standorte zu sehen. Leider habe ich da nichts gefunden. Also programmiert man so etwas selber !
Da ich mich normalerweise nur mit Desktop Software und Winforms beschäftige tu ich mich da etwas schwer. Aber man lernt ja gerne dazu.
Für die Server Applikation, die die GPS-Koordinaten entgegennehmen, speichern und darstellen soll, habe ich traccar gefunden.
Das ist eine professionelle Open Source Lösung die von Speditionen, Taxiunternehmen, Krankentransporten und Rettungsdiensten eingesetzt wird und bis zu 10.000 Geräte gleichzeitig im Blick haben kann. Der traccar Server kann neben meiner App bis zu 1200 verschiedene GPS Devices tracken, er versteht über 130 Protokolle. Also geht alles vom Hunde-GPS-Halsband bis zum Rettungshubschrauber. Für die Einsatzleitsoftware die hier in Einsätzen verwendet wird gibt es eine Schnittstelle, so dass die Einsatzkräfte auf der Karte der Einsatzleitsoftware erscheinen. Für Einsatzfahrzeuge gibt es OBD2-Dongle, die man einfach einsteckt und man sieht wo das Einsatzfahrzeug im Wald steht.
Die geplante App soll die GPS Koordinaten, einen Einsatz- bzw. Trainings-Status und einige weitere Daten an die Server Software senden.
Als Plattform habe ich Xamarin.Forms gewählt. Soll ja auch später mal auf einem iPhone laufen.
Die erste Hürde war das Laufen im Hintergrund. Das ist wohl etwas sehr böses bei einer Handy App, jeder Hersteller hat Angst um seine Akkulaufzeit.
Ich habe eine Bibliothek mit Beispiel gefunden, die das recht gut abdeckt. Hie muss auch mit einigen Tricks gearbeitet werden.
Zum Vergleich : GPS-Koordinaten abfragen und an einen Server schicken : 5 Programmzeilen. GPS-Koordinaten im HIntergrund abfragen und an einen Server schicken : 1500 Programmzeilen.
Der erste Entwurf war leider mit festen Größen und lief so nur auf meiner Handy Auflösung. Der jetzige Entwurf basiert auf Grids und passt sich vom Layout an alle Größen an. Lediglich die Schriftgröße und die Größe der Schalter muss man manuell anpassen.
Unten der Bildschirm der App (Design ist nicht mein Ding!).
Gestern war der erste Einsatz bei einer Einsatz-Übung. Hat super funktioniert. Der Standort der Teilnehmer war sekundengenau und metergenau zu sehen.
Vorherige Lösungen wie WhatsApp Live Standort, Viewranger oder Outdoor Active hängen schon mal 15 Minuten bis der nächste Standort kommt. Da ist man schon weit in die falsche Richtung gelaufen. Außerdem sind sie in Hessen bei Einsätzen verboten, weil einsatzrelevante Daten nur auf deutschen Servern gespeichert werden dürfen.
Ich werde berichten wie es mit dem Projekt weitergeht.
Achte auch darauf dass es intuitiv bedienbar ist. Dass sich ein Wert ändert wenn man mit der Maus drauf klickt finde ich unüblich und nicht vorhersehbar. Ein Button mit "Alter Wert" oder so fände ich besser.