Update für Xcode behebt Fehler

Version 6.3.1 von Apples Entwicklungsumgebung für iOS & OS X soll verschiedene potenziell problematische Bugs ausmerzen, die sich in die Vorversion eingeschlichen hatten.
Den vollständigen Report finden Sie hier Update für Xcode behebt Fehler

Hello World,

ich bin Michael und seit September als iOS Entwickler bei creative workline. Meine erste App habe ich für Android im Rahmen des Studiums entwickelt. Nach dem ersten Kontakt mit Android ist bei mir das Feuer entfacht worden. Seitdem gehört das Smartphone neben der Erfindung des Rades zu den besten Errungenschaften der Menschheit. Noch lieber als neue Apps zu entdecken, entwickle ich sie selbst. Inzwischen habe ich mich auf iOS eingeschossen und um nicht eine große Restaurantkette zu zitieren muss ich sagen “Ich liebe es”.

Heute möchte über meine Erfahrungen bei der Entwicklung von iOS 7 berichten. Apple hat mit iOS 7 viele Änderungen in seinem Betriebssystem gemacht. Für den Nutzer fällt natürlich als erstes das neue Design auf. Hier hat sich alles komplett geändert. Das Motto ist jetzt “Flat Design” und ich muss sagen es kann sich wirklich sehen lassen. Neben dem Design hat sich für den Benutzer auch einiges an der Bedienung geändert, hier sei das verbesserte Multitasking sowie die neue Kamera App zu erwähnen.

Es gibt noch zahlreiche weitere Änderungen, aber in diesem Beitrag soll es um die Änderungen gehen die das neue SDK mit sich gebracht hat. Was hat sich alles für den Programmierer geändert? Worauf muss man sich gefasst machen, wenn man ein bestehendes Projekt mit iOS Version 6 oder kleiner nun für iOS 7 lauffähig machen möchte? Es sei im Vorhinein erwähnt, dass hier natürlich nicht alles angesprochen werden kann, dafür sind die Änderungen doch zu umfangreich.

Wenn man für iOS 7 programmieren möchte benötigt man zu allererst mal Xcode 5. Die Entwicklungsumgebung beinhaltet das iOS 7 SDK. Das setzt aber auch eine Mindestanforderung an das OS X voraus. Hier wird mindestens die Version 10.8 benötigt, also Mountain Lion. Nach Download und Installation, das kann schon mal länger dauern, ist man auch schon bereit um loszulegen.

Apple hat bei Xcode viele Änderungen vorgenommen. Auch hier ist alles im “Flat Desgin”. Das Menü hat sich etwas geändert und manche Sachen befinden sich an einen neuen Platz. Eine Übersicht zu “What’s new in Xcode 5 ” gibt es hier und ist recht nützlich. Aber im Grunde ist alles sehr intuitiv und im Netz findet man immer Hilfe.

Verschobene Ansichten
Als ich ein bestehendes, laufendes, Pixel perfektes Projekt erstmals mit Xcode 5 kompiliert habe und es auf iOS 7 startete habe ich nicht schlecht geguckt. Hier war der Button verschoben dort hing der View unter der transparenten Statusbar, der Scrollview versteckte sich unter der Tabbar und mehr. Kurz die Elemente der Views waren teilweise verschoben oder nicht mehr an der richtigen Stelle.

Dem ist aber schnell Abhilfe geschaffen. Das Storyboard stellt hierfür Einstellungen zur Verfügung. Man wählt einen View Controller aus und ändert die Ansicht.

blog_view_as

Unter “View as” ist es möglich ein Projekt für die verschiedenen iOS Versionen anzeigen zu lassen. Wechselt man zwischen Ansichten zum jeweiligen iOS hin und her sieht man die verschobenen Elemente auf dem Storyboard. Nun wählt man eine beliebige Ansicht aus. Ich würde vorschlagen, man nimmt die, in der noch alles am rechten Fleck ist.

Ist unter der Ansicht “iOS 7.0 and Later” ein Element zu weit nach oben gerückt kann man das mittels der iOS 6/7 Deltas korrigieren.

blog_deltas

Hier gibt man den gewünschten Wert ein um wie viel das Element verschoben werden soll. Der aktuelle View wird nicht beeinflusst, aber der View für die andere iOS Version. Wechselt man nun wieder die Ansicht, Tada, das Element befindet sich nun an der richtigen Position. Diese Schritte muss man nun wahrscheinlich öfters wiederholen. Diese Vorgehensweise bringt deutliche Vorteile gegenüber Änderungen der Position im Code mit sich. Zum einem muss nicht ständig abgefragt werden auf welcher iOS Version die App gerade läuft und man sieht die Änderungen sofort.

Bewerten im App Store
Gerne möchte man seine App auch im Store von den Nutzern bewerten lassen. Hat unter iOS 6 noch alles funktioniert wundert man sich jetzt vielleicht das man jetzt nur eine leere Seite im App Store angezeigt bekommt. Der Grund dafür ist das Apple unter iOS 7 eine andere URL für die iTunes App verwendet.

Die alte URL
itms-apps://itunes.apple.com/app/idYOUR_APP_ID

ist weiter hin für alle Versionen kleiner als iOS 7 gültig und funktioniert.

Für alle Versionen ab iOS 7 und größer muss jetzt folgende URL verwendet werden
itms-apps://itunes.apple.com/WebObjects/MZStore.woa/wa/viewContentsUserReviews?type=Purple+Software&id=YOUR_APP_ID

Das lässt sich beispielsweise folgender maßen realisieren:

 NSString *iOSAppStoreURLFormat = @"itms-apps://itunes.apple.com/app/id%@"; NSString *iOS7AppStoreURLFormat = @"itms-apps://itunes.apple.com/WebObjects/MZStore.woa/wa/viewContentsUserReviews?type=Purple+Software&id=%@" NSString *urlString = [NSString stringWithFormat:([[UIDevice currentDevice].systemVersion floatValue] >= 7.0f)? iOS7AppStoreURLFormat: iOSAppStoreURLFormat, @(self.appStoreID)]; [NSURL URLWithString:urlString]; 

AlertViews via Code bestätigen
Unter iOS 6 ist ein AlertView Bestandteil eines Windows. Das heißt, wenn ein AlertView aufpoppt, wird dieser ein Subview vom Window. Möchte man alle AlertView die angezeigt werden erhalten kann man unter iOS 6 folgendes machen: man geht alle Window Objekte durch und für jedes dieser Objekte geht man die Subviews durch und prüft ob der Subview von der Klasse UIAlertView ist und drückt dann beispielsweise den cancelButton via Code.

Verdeutlicht am folgenden Codebeispiel:

 for (UIWindow *win in [UIApplication sharedApplication].windows){    for (NSObject *obj in win.subviews){       if ([obj isKindOfClass:[UIAlertView class]]){          [(UIAlertView*)obj dismissWithClickedButtonIndex:[(UIAlertView*)obj cancelButtonIndex] animated:YES];       }    } } 

Unter iOS 7 hat sich das geändert. Ein AlertView ist jetzt nicht mehr Teil eines Windows und erscheint auch nicht unter [UIApplication windows]. Da ein UIAlertView niemals zu einem Window hinzugefügt wird, ist im obigen Codebeispiel die Abfrage niemals wahr. Somit hat man keine Möglichkeit eine Referenz auf das UIAlertView Objekt zu bekommen. Das AlertView gehört jetzt zu der Klasse UITransitionView und das kann alles sein. Leider gibt Apple selbst keine genaueren Auskünfte über diesen Sachverhalt.

Die einzige Option die man hat ist es, sich selbst über die Referenzen der AlertViews zu kümmern. Da gibt es verschiedene Ansätze. Beispielsweise kann man jeden UIAlertView der angezeigt wird in einem Array sammeln und bei Bedarf selbiges durchlaufen und bei allen UIAlertView programmatisch den cancelButton drücken. Jedenfalls muss man sich selbst um die Referenzen kümmern.

Navigation Bar anpassen
Nicht selten kommt es vor, dass die Navigation Bar nach seinen Wünschen angepasst werden soll. Unter iOS 6 kann man folgendes machen um beispielsweise die Farbe anzupassen.

 self.navigationController.navigationBar.tintColor = [UIColor colorWithRed:COLOR_RED green:COLOR_GREEN blue:COLOR_BLUE alpha:ALPHA_TOTAL]; 

Hier wird die Farbe über das Attribut tintColor gesetzt.

Unter iOS 7 hat das leider keinen Effekt mehr. Hier ist ein kleiner aber feiner Unterschied. Das Attribut welches für die Farbe zuständig ist hat sich geändert, nämlich zu:

 self.navigationController.navigationBar.barTintColor = [UIColor colorWithRed:COLOR_RED green:COLOR_GREEN blue:COLOR_BLUE alpha:ALPHA_TOTAL]; 

also von tintColor zu barTintColor. Hier ist aber Vorsicht geboten, denn iOS 6 kennt barTintColor nicht. Es ist eine Abfrage der Systemversion erforderlich. Das könnte in etwa so aussehen.

 if([[UIDevice currentDevice].systemVersion floatValue] >= 7.0f){    self.navigationController.navigationBar.barTintColor = [UIColor colorWithRed:COLOR_RED green:COLOR_GREEN blue:COLOR_BLUE alpha:ALPHA_TOTAL]; }else{    self.navigationController.navigationBar.tintColor = [UIColor colorWithRed:COLOR_RED green:COLOR_GREEN blue:COLOR_BLUE alpha:ALPHA_TOTAL]; } 

Ansonsten kracht es.

Fazit
Befindet man sich in der Lage sein bestehendes Projekt unter iOS 6 auf iOS 7 anzupassen geht das nicht ohne weiteres. Je nach Umfang, Funktionalität und Anzahl der Views sollte man mit entsprechenden Mehraufwand rechnen. Dafür lässt sich das Endprodukt wirklich sehen.

Zusammenfassend kann man sich auf folgendes gefasst machen:
Mit hoher Wahrscheinlichkeit müssen die Views für iOS 7 angepasst, da sich einige Elemente wohl verschoben haben. Eine Anpassung beim Bewerten muss ebenfalls gemacht werden, da die Nutzer sonst nur eine blanke Seite vorfinden werden. Ebenfalls ist mit Mehraufwand bei einer angepassten UITabBar zu rechnen. Zu guter Letzt sei nochmals daran erinnert das man sich um die Referenz eines UIAlertView jetzt selbst kümmern muss.

In diesem Sinne: Happy Coding :)

Den original Report gibt es bei Neuerungen in iOS 7 und Xcode 5