Leider ist der Eintrag nur auf Amerikanisches Englisch verfügbar.
Kategorie: APT – App Programming Tipps
App Programming Tips from programmer to programmer
APT15: NSKeyedUnarchiver initForReadingWithData: data is NULL
APT14: Achtung, Screenshots nur in HiRes
Als ich letztens meine Studie zu der Frage, „In welchen Ländern verwendet der App Store welche der in iTunes Connect verwendeten 18 Sprachen“ gemacht habe, verwendete ich die sich wenig verkaufende App Tischrede App um das zu tun. Ich änderte alle 18 Sprachtexte und fügte immer am Ende eine Zahl ein.
Dann musste ich warten, bis sich die neuen Sprachversionen in allen Stores zeigten. Nach 4 Stunden waren immer noch nicht alle Shops weltweit geändert und am nächsten Tag half mein Sohn Jonathan, alle App Store Webseiten weltweit abzuklappern und das ganze in eine Tabelle einzutragen. Ich war mit anderen Dingen beschäftigt.
Heute hatte ich gerade wieder etwas Zeit um die Änderung rückgängig zu machen. Es geht ja nur um 18 mal „Knopf drücken, zwei oder drei Zeichen löschen, wieder Knopf drücken“, das geht schnell. Denkste! Ich bekam die folgende Meldung:
In order to save your changes, all iPhone/iPod touch screenshots must be a .jpeg, .jpg, .tif, .tiff, or .png file that is 960×640, 960×600, 640×960 or 640×920 pixels, at least 72 DPI, and in the RGB color space.
Was war los? Ich wollte doch nur zwei Buchstaben ändern: “ 1″!
Es stellte sich heraus, dass:
- Der „Edit“ Button nicht nur die Texte zum Ändern freigibt, sondern auch die Screenshots.
- Wenn man nach einer Änderung „Save“ drückt, wird offensichtlich die Größe der Screenshots geprüft.
- Meine Screenshots sind noch 320×480
- In den drei Tagen zwischen den Änderungen wurde die Regel für die Mindestgröße geändert.
- Meine Textänderungen hat das Webinterface nicht übernommen, ich muss wohl erst mal meine Screenshots neu machen.
- Immerhin sind meine alten Screenshots noch da (soweit ich das sehen kann).
Ich finde es ja OK, dass man solche Regeln immer mal wieder im Sinne des Fortschritts anpasst, es ist ja auch ein Vorteil für die Kunden. Ich kann nur gerade die Screenshots nicht machen, es sind dann immerhin 5 Screenshots für 4 Sprachen, und es sind immerhin 18 mal 5 mal 4 Klicks mehr als eben noch. Dann doch lieber diesen Text hier schreiben und die Änderung machen, wenn ich wieder im Büro bin. Leider wird nicht eine Kopie von der Tischrede App mehr verkauft dadurch – obwohl: Wer weiß, wenn die Screenshots besser sind, kommt vielleicht der Durchbruch zum Millionen-Seller ? 😉
Nun ja: „Fortschritt ist manchmal schmerzlich“
APT13: WordPress Erfahrungen
APT12: Welche Sprache wird in welchem App-Store verwendet?
APT11: Beim Server muss man eingeloggt sein?
Heute mal was von Laptops und Servern und nix von Apps
Es ist ja normalerweise eine tolle Sache, mit Mac OS X zu arbeiten. Beispielsweise installiere ich nie Druckertreiber oder so etwas. Einfach Gerät anschließen, ein paar Sekunden warten, fertig. Auch wenn ein Gerät im Netzwerk ist, einfach auf das „+“ (für‘s hinzufügen) klicken, man bekommt das Gerät mit Namen angezeigt, angeklickt, fertig. Mein Mac findet immer alle Treiber und alles funktioniert einwandfrei. Meistens jedenfalls…
So klappte auch alles mit der Drucker-Scanner-Kombi, die ich mir gekauft hatte, weil der alte Büroscanner mit seinem Besitzer ausgezogen ist. Leider war das USB Kabel zu kurz um den neuen Drucker-Scanner an den Router anzuschließen. Außerdem: Drucker kann der ja, der Router. Aber könnte der auch Scanner? Egal, schließen wir den Scanner einfach am Mac Server an und geben ihn dann im Netz frei.
Wenige klicks später ist alles OK: Scanner auf dem Server installiert und im Netz freigegeben und dann geht es auch von „remote“ von meinem Laptop aus den Scanner zu verwenden. Geht so etwas in Windows?
Was ich an dem Tag nicht gemerkt habe: Auf dem Server muss jemand (ich?) eingeloggt sein, sonst geht der Scanner nicht. Man sieht ihn nicht im Netz, wenn man den Scanner Dialog bei sich öffnet, sagt der nur „Scanner nicht da“ (oder so ähnlich).
Meist hilft dann einfach, sich auf dem Server einzuloggen. [Edit:] Ein paar Tage später ging es mal wieder nicht, dann wieder doch. Unterschied: Als es nicht ging, war Leonard eingeloggt, als es ging, ich. Das ist noch kein Beweis, denn zu viel war jedes mal unterschiedlich. Die Suche nach einer richtigen Lösung geht weiter, stay tuned… [/Edit ENDE]
Heute half auch das nicht – wohl weil irgend etwas mit Scanner und Remote und einloggen in der falschen Reihenfolge passiert ist. Also Server und Laptop rebootet (Ja, das ist unwissenschaftlich, man sollte erst das eine, dann noch mal testen und dann das andere Gerät booten, aber es war mir wirklich nicht wichtig, heraus zu bekommen, welches Gerät „schuld“ ist, dass es nicht geht). Danach ging alles wieder. Scanner da, alles fein.
Aber schräg ist das schon, oder? Ein Server gibt den Scanner nur dann im Netz frei, wenn man eingeloggt ist? Andererseits: Ob es auch gegangen wäre, wenn ich mich nach dem booten nicht auf beiden Systemen wieder eingeloggt hätte? Und gilt das Gleiche für den Drucker-Teil, oder geht der immer? Beim nächsten mal probiere ich‘s aus, ich verspreche es…
[EDIT:] Seitdem ich mich immer beim Server einlogge, bevor ich die Scanner-App aufrufe, geht alles.[/EDIT Ende]
APT10: Schnell ist …anders
Beim Testen achte ich eigentlich immer darauf, dass ich alle meine Programme auf alten und auf neuen iOS Geräten teste. Dabei passiert meist nicht sehr viel – so selten, dass man manchmal etwas versucht ist, das viele Testen nicht so wichtig zu nehmen.
Aber ich bin ja schon ein bisschen länger im Business, daher erwarte ich immer, dass sich schnellere Geräte immer mal wieder anders verhalten, als langsame. Oft ist es so, dass korrekte Software auf einem schnelleren Gerät sich anders verhält und Fehler auftauchen, die eigentlich gar nicht da waren.
Jetzt endlich habe ich das auch mal unter iOS erlebt. Eine App funktioniert unter iOS 4.2 auf dem iPod der zweiten Generation. Aber auf dem iPhone 4S unter iOS 5 läuft das gleiche Programm etwas anders. Grund ist wohl, dass der schnellere Prozessor (oder der zweite Prozessor) eine andere Event-Reihenfolge auslöst. Kein großer Fehler, aber ein deutlicher Unterschied im Verhalten.
Eine kleine Änderung später war alles wieder in Ordnung. Tut gut, wenn man mal wieder für sein aus Erfahrung motiviertes verhalten bestätigt wird. Nun ja, unerfahrene, junge Softwerker hätten das auch gefunden, wenn sie Testen richtig ernst nehmen.
In diesem Sinne. Testen, testen, testen !
APT9: Xcode 4.2, iOS 4.2.1
Das neueste Xcode 4.2 war schon installiert, da wollte ich doch gleich mal auf meinem alten iPod der 2. Generation testen. Wie man das halt so macht.
Ja, ich weiß, Ihr jungen Hüpfer da draußen wollt immer gleich ein Release machen, wenn eine App bei Euch fehlerfrei durchgetestet ist,… Aber der echte Entwickler will erst noch alle Hardware und Software-Optionen testen. erst wenn da alles zufriedenstellend schnell ist und funktioniert, erst dann weiß er, dass er wirklich fertig ist.
Also flugs mein iPod der 2. Generation angesteckt und getestet. Kleiner aber wichtiger Nebeneffekt: Man testet noch einmal die Installation auf einem völlig leeren Gerät – was ja nach dem 10. Test auf dem eigenen Gerät nicht immer 100% der Fall ist.
Xcode kompiliert und schwupp – der Test sagt, er ist fertig.
Hä?
Die App ist weder installiert, noch ist ein Verlauf eines Tests zu finden. Stattdessen ein
Dauer-Warte-Kreis im Log-Navigator.
Etwas später ist dann der Verdächtige gefunden: unter
project-> Build Settings -> Architectures steht: Standard(armv7)
Das ist für den alten ipod der 2. Generation nicht die richtige Einstellung.
Also noch den Wert für Architectures um die Arm6 Architektur erweitert. Dazu habe ich auf „Standard…“ geklickt, dann erscheint eine Auswahl, da auf „other…“ geklickt, dann „+“ (plus) angeklickt und „armv6“ eingegeben, dann neu kompiliert, und schon geht alles wieder. Und nur um sicher zu gehen, dass ich nichts übersehen habe, schaue ich noch nach: Nein, in den Release notes steht nichts davon, na toll. Egal, Problem gelöst!
APT8: Apps und Backup
Neulich war ich leider der verwerflichen Meinung, dass es viel interessanter sein könnte, das neue iOS 5 zu installieren, als meine Zeit mit sinnvollem Programmieren zu verschwenden. Hier muss gesagt werden, dass es sich um die „Golden Master“ Version handelt. Ein Begriff, den ich immer glaubte erfunden zu haben – aber auch Apple bezeichnet damit die letzte Version vor einem Release – sozusagen die Testweise Release-Version.
Gesagt, getan, „Do you really want to …“ wird man noch gefragt, es werden ja alle Daten gelöscht, wenn man die Test-Version installiert, aber davor hat man ja wenig Angst, es ist ja alles in einem Backup gespeichert. Allerdings hatte ich das vor sooo vielen Monaten zuletzt gemacht, dass ich etwas zögerte, bevor ich es tat.
Leider ging die Installation schief, ich hatte vergessen, vorher das richtige XCode an zu werfen, Denn die iOS 5 GM-Version funktionierte nicht mit der gerade laufenden Xcode 4.1-Version. Klasse. das iPhone war im embryonal Zustand, mir lief die Zeit davon, meine Verabredung würde mich bald erwarten und ich konnte nicht mal anrufen um Bescheid zu sagen, es würde vielleicht später werden… Also: iPhone so schnell wie möglich wieder gesund machen – egal wie!
Kurze Überlegung – jetzt lieber keine Experimente mehr, kein iOS 5, sondern wieder die „alte“ Version 4.3.5 aufspielen. Risikomanagement, wenn auch kein Gutes, weil ja nur noch Schadensbegrenzung.
Eigentlich wollte ich schreiben, „schnell wieder die alte Version installiert“, aber das dauerte alles so lange, da war nur der Entschluss zum Installieren schnell. Ich sah vor meinem Inneren Auge, wie meine Verabredung am Tisch im Restaurant saß und ein ums andere mal dem Kellner sagen musste, nein, ich esse noch nicht…
Endlich war das Telefon wieder benutzbar, da machte ich den nächsten Fehler: Anstatt einfach im Computer die Telefonnummer rauszusuchen und im iPhone einzutippen um dann schnell los zu fahren, warf ich die Synchronisierung an, damit ich alle Telefonnummern und Apps wieder auf dem Telefon haben würde.
Das synchronisieren dauerte auch noch mal eine Weile, denn ich habe zwar nur sehr wenig Musik und sonstiges auf dem iPhone, aber zu Test-Zwecken der App war ja noch das Hörbuch von Charlotte Roche „Schoßgebete“ drauf und die neue Platte von Feist wollte auch synchronisiert werden. Die Zeit rinnt, dann, endlich fertig, schnell anrufen, ja, ich komme etwas später, Rechner runter fahren und los!
– Leider war die Geschichte hier noch nicht ganz zu ende…
Nun bin ich ja App Entwickler – und auf eine App die ich veröffentliche, kommen ca. vier Apps, die ich nicht veröffentliche, sondern nur zu Testzwecken programmiert habe, oder wo ich glaube, dass es sich nicht lohnt, diese App zu veröffentlichen.
Das Treffen war mit einem langjährigen Freund, den ich ca. ein Jahr nicht mehr gesehen hatte. Wir plauderten über dies und jenes, irgendwann will ich ihm eine meiner Apps zeigen, hole das iPhone raus, wische vom ersten Bildschirm mit den Apps zum nächsten, zum dritten und … entsetzen !
Mich starrte die leere von meinem iPhone an. Der Erste Bildschirm noch voller Apps, der zweite leer bis auf eine App, der dritte noch zwei… Wo zum Teufel sind alle meine Apps ??? Wieso sind nur die gekauften Apps wieder aus dem Backup eingespielt worden???
Was ich nicht bedacht hatte, ist, dass alle meine selbst-entwickelten und lokal installierten Apps auch alle gelöscht sind. Und leider, leider, leider nicht im Apple Backup landen. Warum auch immer. Ich wusste es ja eigentlich, hatte es nur vergessen.
Was mich in dem Moment am meisten wurmte: Taschengeld, eine der Apps, die ich seit der Entwicklung immer mal wieder benötige war auch nicht mehr da. Schließlich führe ich so Buch, welches Kind wann Taschengeld von mir bekommen hat. Und jetzt? Einfach Computer hochfahren, iPhone mit meiner Taschengeld App neu bespielen und …fertig? Oder einfach meine eigene App selber kaufen?
So komisch es klingt, damit ich beim nächsten mal meine eigene App auch im Backup wieder eingespielt bekomme, wähle ich, meine eigene App selber zu kaufen. Einen Moment lang überlege ich noch, ob ich die App mal eben einen Tag lang umsonst anbieten sollte um mir die 31 Cent, die Apple in Deutschland vom Entwickler-Verdienst abzieht (79-48=31) auch zu sparen, aber das ist zu viel Arbeit für meine Ungeduld, ich kaufe, lade runter…
Und bin überrascht!
Alle meine Daten sind da! Wann welches meiner Kinder Taschengeld bekommen hat, alles da. Eigentlich ja kein Wunder, hatte ich es doch so programmiert, dass die Daten eine Neuinstallation einer Version überstehen würden. HATTE ICH NUR NICHT ERWARTET, DASS DIE DATEN IM BACKUP SIND, ABER NICHT DIE APP. Na gut, wunderbar, Apple ist gut, meine App ist gut und mein einer Sohn hat noch sein Taschengeld für diesem Monat zu bekommen.
…NA WENN DAS KEIN HAPPY END IST!
APT7: Objective-C Style Guide
Ich bin ja selber kein großer Freund von Regeln, wie man zu programmieren hat, auch Coding Conventions genannt. Insbesondere, weil ich in verschiedenen Programmiersprachen und über die vielen Jahre hinweg so viele verschiedene Coding Styles kennen gelernt habe.
Da ich meinen Source Code aber immer öfter an andere Leute übergebe, die ihn dann gut und leicht lesbar finden sollen, hier meine eigenen Coding conventions, an die ich mich versuchen werde zu halten:
– Classes start with upper case letter
– Variables start with lower case letter
– init methods (all methods that have an „init“ in their name) have return type id
– Class and Factory methods (all methods that have a „+“ before them) have return type id
– all method calls need to be checked for return value
– always have a dealloc function and release all properties in it
– initialize all variables
– if a Class has a factory method (e.g.: + (id)Array), then check if your are allowed to use init
– Always read the Overview Part of the Class you are using
– put the stars „*“ to the variable name
– generate a nice looking indenting for Variables, e.g. in Xcode use I to do correct indenting
Ich hoffe, jetzt machen wir alle tolle Programme.