APT16: Correct program crashes in review

First, I wanted to name this article Correct program crashes at Apple, but then I realized that this was not a story about the APPLE review team but a story about the apple REVIEW TEAM. And of course about a bug, but mentioning that in the title would spoil the milk before the end of the story. So let’s get started.

I had submitted a new version of Regattakalender. As a sailor, one of my hobbyist side-projects had been this iOS app, that lists all sailing regattas of Germany that want to get listed in order to help me or other sailors plan their sailing season. Of course, the app is only available in German due to it’s regional character.

When the app got rejected because of crashing on an “iPad3,3” I was shocked. I had tested all available hardware versions EXCEPT the “new iPad” – simply because I do not own one. So was there something different? I had used parallel processing, synchronization with semaphores and other tricks to make sure that the customer gets the quickest possible response. And when this crash message came, my immediate reaction was: Let’s search for the race condition. This machine is faster than anything I have – this may have revealed a race condition in my parallel programming, that I simply hadn’t been aware of. I have seen so many examples of this problem pattern, that I spent a whole night looking through my code. I found nothing.

Some days later, when an iPad3 crossed my paths, I pulled out my Laptop and tested for the bug. The party guests at this birthday party where not amused of me showing my “nerdiest face”, but, hey, iPads from party visitors come and go, so you better use your time while you can. It turned out – in no way I could reproduce the error. It just did not fail. No crashes. It ran better than on the other apple products I had tested it before. So much for my theory.

In a very depressed mood, I wrote the apple review team, that I could not find any error and that I had no idea what to do. I had corrected an error that the iPad showed a different icon than I wanted, but this was very likely not the reason for the crash. Unnecessary to say that this message from me was not helpful, but I obviously wrote it for personal relief. After a few minutes a message arrived from the review team. They had made a video of the app trying to start and crashing on their iPad. You could see the person filming it with a black iPhone 4 / 4S running the app on the iPad and being reflected in the iPad screen. And you could see that he (it looked more like a male person) had a cubicle with a bookshelf. I was positively motivated to try harder to find the error – much to the discomfort of all the other party guests.

When I had corrected the icon error, I was getting aware of the configuration being different for the iPad than for the iPhone. So I went through all the configurations and configuration files to check whether they contained some things that were “looking suspicious”. Since an iOS configuration consists of so many details, there is a lot to be looked at, but I was trying to find something that would be different for the iPad or for the review version, when compared to the version I was using for testing.

When I stumbled over the optimizer settings, some hope returned: The crash logs that the review team had sent me had strange numbering for the lines, may be the optimizer had mixed something up? I tested with the optimizer settings turned the same for testing and distribution: Nothing, still everything was working. I put the settings back to original settings (always only change one parameter at a time for testing, else you will never know which one was the reason for the cure) and scrolled down.

And then it hit me: The setting for automatic reference counting (ARC) being applied was different for distribution! I could resist my urge to test the corrected settings, because I know the law of error testing:

    You can not prove the absence of an error. You can prove its existence. And when the error is gone after the change, then it is plausible, that the change made the error go away. But it is only plausible, not proven.

And in order to see the error go away, you have to be able to reproduce it first. You have to. Else you have no reason to believe that the error was fixed. So I changed the setting for “Objective-C Automatic Reference Co…” (so I had to guess what this means until I saw the help text at the right hand side: “CLANG_ENABLE_OBJC_ARC”) to: “NO” for testing as well. And guess what? It crashed! Yippie!

So I corrected me settings, recompiled submitted and … started to party again.

So I am happy that the review team exists and I did not ship a broken app to my customers. And that they took the time for the video, which motivated me.

So what did I learn from this?
– When I agree to upgrade my project to whatever “new”, I will double check the settings afterwards to find any glitches
– When I prepare my program for submission, I will now test the distribution version and not only test the debug version and then compile for distribution. Anyone any ideas how to run the .app file in the .xcarchive file?
– The guys from the app store test team are not only useful (I knew that before), but actually helpful.

APT15: NSKeyedUnarchiver initForReadingWithData: data is NULL

Lately, we had the following error:
*** -[NSKeyedUnarchiver initForReadingWithData:]: data is NULL

What had we done to get this error?
It turned out, that the reason was a loop in which multiple calls of

UIImageWriteToSavedPhotosAlbum ([assets objectAtIndex:currentIndex], self, @selector(image:didFinishSavingWithError:contextInfo:), nil);

had been sitting. We checked the documentation – not a single mention, that multiple calls could be a problem. On the other hand – that it is asynchronous, that was clear through the callback. And thus we decided to “serialize” our problem, as can be seen below. Problem gone.

Explanation: The action starts with saveButtonPressed, when the call to UIImageWriteToSavedPhotosAlbum is ready it sends a image:didFinishSavingWithError:contextInfo: method-message to the given class and in that method we trigger the next write, if there still is one…

Have a look yourself:

- (void) image: (UIImage image didFinishSavingWithError: (NSError error contextInfo: (void contextInfo {
NSLog(@"didFinishSavingWithError");
if (error != NULL) {
NSLog(@"error");
}
currentIndex++;
if (currentIndex < [assets count]) { UIImageWriteToSavedPhotosAlbum ([assets objectAtIndex:currentIndex], self, @selector(image:didFinishSavingWithError:contextInfo:), nil); NSLog(@"currentIndex %i",currentIndex); } } -(IBAction)saveButtonPressed:(id)sender{ NSLog(@"saveButtonPressed"); currentIndex = 0; UIImageWriteToSavedPhotosAlbum ([assets objectAtIndex:currentIndex], self, @selector(image:didFinishSavingWithError:contextInfo:), nil); NSLog(@"photos saved"); }

APT14: Lookout, Screenshots only in HiRes

When I was doing my study on which iTunes country Apple App Store presence uses which language (for results, see here), I used my least selling worldwide available app to do this, which was Dinner Speech until today. I added a number at the end of each description to document the language I had edited this in.

Then I had to wait, since even after 4 hours, not all shops had the changes pushed.

The next day my son Jonathan carried out much of the worldwide research and edited the table. Since I was busy with other things, I did not immediately change back all App Website texts to delete the numbers at the end.

When I wanted to do this today, I received the friendly notice from iTunes Connect:

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.

What had happened, I just deleted two chars: ” 1″?

It turns out,

  • the edit button that enables me to change the text also uploads the screen shots
  • my screen shots are still all 320×480 (low resolution) in size
  • in the three days in between adding the 1 and today, Apple iTunes Connect had changed the rules
  • it will not change my text as long as I have no new screenshots
  • my old app website text and screenshots are not affected (as far as I can see)

Of course I am OK with that rule change, it is a change to the better, it is good for the customer and more correct to the iPhone 4(s) users. It is just that I now have to prepare 5 screenshots for 4 different supported languages before I am able to delete all the numbers in the text. It will cost me about 4 hours of work (guesstimate (a word the spelling checker knows!)) and it will not sell a single copy of Dinner Speech for me.

Another example of the meaning of: “Sometimes, progress is painful to the individual.”

APT13: WordPress Learnings

Here the quick list of my WordPress learnings after moving from iWeb to WordPress

  1. WordPress is really easy to use, install, maintain and update
    The “famous 5 minute install” really is a 5 minute install – if you are a computer science pro like me. If the version number of your database is something that sounds like a mongolian city name to you, then you better ask a pro to set up your webspace. But once this is done (and since this is easy to do, it is rather cheap, call us for a quote), then you can do all other tasks on your own. Really. OK, at least probably.
  2. Stick with the defaults if you want results
    There are too many choices: Themes, Plugins, Settings… I ‘lost’ two days for browsing and previewing a lot of nice-looking “Themes”, which is the WordPress name for design and layout of your website. Even if you have a clear vision of how your website should look like, browsing for the exactly matching theme may not be the right thing to do. After some trying here and there, I decided to stick with the default theme, as so many others out there do.
  3. By default, WordPress is a blog
    If you want WordPress to be your website rather than your blog, then you can do that too, but you have to change and tweak here and there. Not much of a problem, but by default it wants to be your blog. So if you don’t want to blog, it may not feel like the best choice.
  4. WordPress is one blog with one language
    Of course there exist multiple plugins that make a multi-language blog out of WordPress. But by default, it has only one blog and one language. Although this does not seem like a big issue and although I am using one of the multi-language plugins, this is a big problem for me. If WordPress gets updated, you have to check and wait for the plugins to be checked and updated (if needed) as well.
  5. WordPress is Web 2.0 built in
    Since by default all pages and posts on your website have a built-in comment part and functionality, it really is a blog system for the web 2.0. Your definition may differ, I usually refer to web 2.0 as the version of the web tools that made user interaction possible, e.g. commenting a comment, comments being taken as serious as the blog post itself and being an important or event the important part of the web page, generating a completely new web experience.
  6. Migrating the texts from iWeb to WordPress is easy – but only the text
    I used to generate my website from a tool called iWeb that Apple ships with their Mac OS X. If your iWeb website was little more than a blog, then you can easily write out the website to local disk, look for the.rss and use the rss importer plugin to read the texts into WordPress. But do not expect support for non-blog pages, pictures, picture galleries, layout or the complete website. And sorry, no, I have not written a php script to migrate my site.
  7. [UPDATE:] Since I switched from iWeb blogging with comments enabled to WordPress with comments, I get A LOT OF SPAM comments. With iWeb I had no (zero) Spam comments. With WordPress – without using any filter – I get about two (2) spam comments a day. So I will have to add a captcha (which is included in iWeb commenting functions, but not in WordPress). [/UPDATE]

That’s it for now, may be the list gets longer in the future!

Regards, Thomas

APT12: Which language is used in which App-Store?

The list of available languages  When you want to publish your app in the Apple App Store, you have the choice in which countries you want your app to be offered. I have not counted the number of countries lately, but hey, it is a long list, so you probably rather click on “all countries”.

Since every app has it’s own App-Store “webpage”, you have to decide in which language the app description in this webpage will be. The easiest choice is to use only one language, e.g. english. But I decided different and used german, english, spanish and french descriptions of my apps. Nowadays, when you create a new app, you can select which language will be used as the default language. But my apps are still stuck with the options at that time and this meant: German as default language. I already wrote about the default language issue in the app store some time ago here.

Now imagine I have these 4 descriptions in those four languages. So I go to iTunes Connect and it offers me the choice of 18 languages (see picture) as of today. While you may know, that the word sundowner is listed in an australian dictionary, the question, if the Apple App Store of New Zealand will make use of my text filed under:

  • UK English
  • Australian English
  • English

is not as easy to be answered. To answer that: Apple uses the text you store under Australian English for New Zealand as well.

But what if I did not store any text as Australian English? Then your apps webpage will get the content from your default language, of course. Unfortunately for me, the default language of my existing apps is German, which is rather inappropriate for New Zealand customers. In order to have a complete list of all stores and their iTunes-Connect language settings being used, Jonathan and I compiled this list.

Instruction: If your app website address is

http://itunes.apple.com/de/app/tischrede-app/id459096545?mt=8

then the de in the address above indicates the german store, because de is the ISO 3166-1 code for Germany. I can not guarantee that Apple really uses this code, but at least I tried the codes below and most of them worked. (If you prefer a pdf version of the list, download it here).

Enjoy and feel free to share…

iTunes Country Code Language Comment
Europe
België be UK English benl’ doesn’t work
Belgique be UK English befr’ doesn’t work
България (Bulgaria) bg UK English
Česká republika cz UK English
Danmark dk UK English
Deutschland de German
Eesti ee UK English
España es Spanish
France fr French
Greece gr UK English
Hrvatska (Kroatia) hr UK English
Ireland ie UK English
Italia it Italian
Latvija lv UK English
Liechtenstein li English
Lietuva lt UK English
Luxembourg lu UK English
Macedonia mk UK English
Magyarország (Hungary) hu UK English
Malta mt UK English
Moldova md UK English
Montenegro me Error
Nederland nl Dutch
Norge no UK English
Österreich at German
Polska pl UK English
Portugal pt Portuguese
România ro UK English
Россия (Russia) ru Russian
Slovakia sk UK English
Slovenia si UK English
Schweiz chde Error
Suisse chfr Error
Suomi (Finnland) fi UK English
Sverige se Swedish
Türkiye tr UK English
UK uk UK English changes to gb
Asia Pacific
Australia au Australian English
中国 (China) cn Simplified Chinese
Hong Kong (English) hk/en Not found
香港 (Hong Kong) hk UK English
Indonesia id UK English
日本 (Japan) jp Japanese
대한민국 (Korea) kr Korean
Malaysia my UK English
New Zealand nz Australian English
Philippines ph UK English
Singapore sg UK English
台灣 (Taiwan) tw UK English
Thailand th UK English
Vietnam vn UK English
Other Asia asia
Africa, Middle East
Armenia am UK English
Botswana bw UK English
Bahrain bh UK English
Cameroun cm English
Centre Afrique cf Error
Côte d’Ivoire ci English
Egypt eg UK English
Guinea-Bissau gw Error
Guinée gn Error
Guinée Equatoriale gq Error
India in UK English
Israel il UK English
Jordan jo UK English
Kenya ke UK English
Kuwait ku English
Madagascar mg UK English
Mali ml UK English
Maroc ma Error
Mauritius mu UK English
Mozambique mz Error
Niger ne UK English
Nigeria ng UK English
Oman om UK English
Qatar qa UK English
Saudi Arabia sa UK English
Sénégal sn UK English
South Africa za UK English
Tunisie tn UK English
Uganda ug UK English
United Arab Emirates ae UK English
Latin America
Anguilla ai UK English points to lae
Antigua & Barbuda ag UK English points to lae
Argentina ar Latin American Spanish points to la
Barbados bb UK English points to lae
Belize bz UK English points to lae
Bermuda bm UK English points to lae
Bolivia bo Latin American Spanish points to la
Brasil br Brazilian Portuguese
British Virgin Islands vg UK English points to lae
Cayman Islands ky UK English points to lae
Chile cl Latin American Spanish points to la
Colombia co Latin American Spanish points to la
Costa Rica cr Latin American Spanish points to la
Dominica dm UK English points to lae
República Dominicana do Latin American Spanish points to la
Ecuador ec Latin American Spanish points to la
El Salvador sv Latin American Spanish points to la
Grenada gd UK English points to lae
Guatemala gt Latin American Spanish points to la
Guyana gy UK English points to lae
Honduras hn Latin American Spanish points to la
Jamaica jm UK English points to lae
México mx Latin American Spanish
Montserrat ms UK English points to lae
Nicaragua ni Latin American Spanish points to la
Panamá pa Latin American Spanish points to la
Paraguay py Latin American Spanish points to la
Perú pe Latin American Spanish points to la
St. Kitts & Nevis kn UK English points to lae
St. Lucia lc UK English points to lae
St. Vincent & The Grenadines vc UK English points to lae
Suriname sr UK English points to lae
The Bahamas bs UK English points to lae
Trinidad & Tobago tt UK English points to lae
Turks & Caicos tc UK English points to lae
Uruguay uy UK English points to la
Venezuela ve Latin American Spanish points to la
América Latina y el Caribe (Español) la Error
Latin America and the Caribbean (English) lae Error
US, Canada
Canada (English) ca Canadian English
Canada (Français) ca/fr Not found
Puerto Rico (English) pr Error points to lae
Puerto Rico (Español) pr Error points to lae
USA us English

 

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…

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 echter 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. Schliesslich 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.