iPhone
iPhone Apps selektiv wiederherstellen
Feb 25th
Vorgeschichte
Vor einigen Tagen wollte ich das iPhone als Modem nutzen – Stichwort “Internet-Tethering”. Musste dabei allerdings feststellen, dass dieser Menü-Eintrag (unter Einstellungen -> Allgemein -> Netzwerk -> Internet-Tethering gar nicht auftaucht.

Telekom Hotline konnte auch nicht helfen. Sollte ohne weitere Aktivierungen etc. im Menü angezeigt werden.
Wiederherstellung
Nun also zuerst ein aktuelles Backup des iPhones angelegt. Danach das iPhone über “Wiederherstellen” zurück gesetzt. KEIN BACKUP eingespielt – und siehe da, im o.g. Menü taucht der Punkt Internet-Tethering jetzt tatsächlich auf.

Jetzt noch das Backup zurück gesichert -> Menüeintrag verschwunden!
Demnach werden Einstellungen aus dem Backup wiederhergestellt, die die Option ausblenden. Ist durchaus vorstellbar, da ich bisher seit meinem iPhone 2G sämtliche Neugeräte immer per Backup des Altgeräts eingerichtet hatte (was im allgemeinen auch sehr gut funktioniert – sich aber in diesem Fall wohl verschluckt).
Wiederherstellungs-Dilemma
Sämtliche Versuche das iPhone per Einstellungen -> Allgemein -> Zurücksetzen den Menüeintrag zu entlocken scheiterte. iTunes bietet keine Möglichkeit nur Teile des Backups wiederherzustellen.
Bleiben zwei Optionen:
- ohne Tethering leben, dafür ein komplett eingerichtetes iPhone
- über gelegentliches Tethering freuen und dafür alle Einstellungen, Daten der Apps etc. neu eingeben
Das System selbst zu konfigurieren (E-Mail-Konten, WLAN-Kennworte etc.) ist ja relativ schnell machbar. Schwieriger wird es mit der Konfiguration / Wiederherstellung der Daten in einzelnen Apps – vor allem wenn die Daten nicht irgendwie serverseitig gespeichert werden.
In dieser Situation kam der Bericht auf iFun über das Sichern des kompletten iPhones außerhalb von iTunes gerade recht.
Auch wenn darin steht, man könne mit dieser Methode ohne Jailbreak eine komplette Sicherung durchführen, stimmt das zumindest für die Apps und deren Settings nicht.
Lösung
Mit den Informationen aus o.g. Artikel und etwas Recherche ergab sich nun folgender Lösungsweg:
- Sicherung des iPhones mit iTunes
- Extrahieren des kompletten Backups mit JuicePhone
- Wiederherstellen de iPhones OHNE einspielen eines Backups – also als Neugerät konfigurieren
- Übertragen der gewünschten Apps aus der iTunes Bibilothek
- Einrichten des iPhones von Hand, d.h. Einstellungen (E-Mail,WLAN, etc)
- Zurücksichern der Einstellungen einzelner Apps aus dem extrahierten Backup mit iPhone Explorer oder PhoneView
Schritt 2 und 6 sind also die interessanten.
Extrahieren des kompletten Backups mit JuicePhone
JuicePhone extrahiert Teile oder ein Komplettes Backup in ein gewünschtes Speicherzeil.

Im Zielordner befindet sich dann ein Unterordner “Application Data” in dem sich die Einstellungsdateien sämtlicher Apps befinden.
Zurücksichern der Einstellungen einzelner Apps
Das zurücksichern erfolgt für jede App einzeln. Mühsam aber dank Drag&Drop nur Fleißarbeit.
iPhone Explorer starten, iPhone anschließen (falls noch nicht geschehen). in iPhone Explorer Apps aufklappen und eine einzelne App auswählen. Aus dem App-Ordner des Backups den markierten Inhalt (z.B. Documents / Library) dieser einzelnen App per D&D darauf ziehen. iPhone Explorer fragt nach, ob man die Ordner Documents bzw. Library wirklich überschreiben möchte und danach beginnt das kopieren.
iPhone Explorer zeigt die Liste der installierten Apps unsortiert an und fragt auch beim Überschreiben der Ordner sehr oft nach. Daher empfehle ich eher PhoneView zu verwenden, da dies die Liste der Apps sortiert darstellt und auch das Überschreiben nur einmal pro App anfragt.
Fazit
Dank der Kombination der zwei Tools ist es möglich, die Daten und Einstellungen einzelner Apps nach einer Wiederherstellung selektiv zurück zu sichern. Ist zwar etwas zeitraubend, aber sicherlich angenehmer als die Daten von Hand auf dem iPhone eingeben zu müssen. Wer also evtl. Funktionen vermisst oder generell mal ein “sauberes Neuaufsetzen des Systems” durchführen möchte, ist mit dieser Methode schnell am Ziel.
New iTunes Connect fixes usability flaw
Nov 20th
Just yesterday I was discussing login screen design with a friend. We looked at some iPhone apps with login screens to find out the best way of implementation.
We came across iTunes Connect as an Apple own application.

- Layout is done via UITableView (at least visually)
- The Keyboard fits directly underneath the buttons so you can reach every UI-Element while typing
- Both fields for “Member Name” and “Password” are filled with a placeholder so the purpose is very clear.
- Each field provides a info-button for recovering the Apple ID / password (in case you’ve forgotten).
- If you type in your member name in the first text field an press the “Next”-button on the keyboard, the focus is set directly to the password field. So you can type in the password without being interrupted by having to tap in the password field first to activate it. And after typing the password you can use the keyboards “Go”-button or the “Sign In”-button to initiate the login process.
It’s very handy to use.
But one thing I was always wondering about is the “Cancel”-button. You can not use the app without signing in. Canceling at this point could only mean quitting the app (as you may expect for Desktop applications). But the (iOS) iPhone Human Interface Guidelines for stopping strongly discourages the programmatically termination.
And the cancel button indeed doesn’t exit the app. Instead an “Error” Popup with an dubious error code is shown.
So what purpose may this Button have in the future, I was wondering.

Apple must have read my mind! Today a new version was released and… the cancel button has vanished!

Malicious UIDatePicker
Nov 12th
I used the UIDatePicker a few times already. Mostly in german Apps. I have never had any problems setting the minimum or maximum date properties.
Yesterday we figured out a strange behavior. The App always quit with a “SIGABRT” and the information
-[UIDateTableCell date]: unrecognized selector sent to instance *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '*** -[UIDateTableCell date]: unrecognized selector sent to instance

at following line
self.datePicker.minimumDate = [NSDate date];
And it only crashes if the datePickerMode is UIDatePickerModeDateAndTime
self.datePicker.datePickerMode = UIDatePickerModeDateAndTime;
First try, use the setter Method instead of Dot-notation:
[self.datePicker setMinimumDate:[NSDate date]];
same effect.
As you can’t always rely on the simulator, we tried the code on the device. -> No crash!
First thought: A further Simulator discrepancy.
Tried it on a different Mac in Simulator -> NO CRASH!
So what was the difference between the two systems?
Same XCode Version
Same OS X Version
…
Different System Language!
Changed the language of the device to Language EN, Region US and voila, the App crashes at the expected line.
After a long google session without any hint, we tried some rearrangement of code and put the setting of the pickers date before the setting of the minimumDate.
self.datePicker.minimumDate = [NSDate date]; self.datePicker.date = [NSDate date]:
to
self.datePicker.date = [NSDate date]: self.datePicker.minimumDate = [NSDate date];
Guess what! Now the App runs fine even on the EN_US Simulator and Device!
So you will say: “it’s obvious you must set the pickers date before you can set a minimum date”.
Hm good point, but:
- the API tells you, that even if you omit setting the date explicitly “the default is the date when the UIDatePicker object is created“, so the date property is never nil.
- if the Picker is shown in “german” style the App won’t crash.
If your Picker is created by a nib-File as a IBOutlet, the date can be set in Interface Builder.
A second solution
set the Mode of the Picker in Interface Builder initially to “Date & Time”.

In your code you can change the Mode afterwards via datePickerMode.
self.datePicker.datePickerMode = UIDatePickerModeDate;
But Attention:
Setting the Mode in Interface Builder to “Date & Time” initially will cause the Picker to ignore a minuteInterval programmatically set in code.
So set “Date & Time” in IB -> self.datePicker.minuteInterval = 15; has no effect.
set “Date” -> self.datePicker.minuteInterval = 15; will be recognized (if you also set the Mode to Date & Time programmatically) – but you have to set also date to avoid crashing.
So have fun.