Software DevelopmentSoftware Entwicklung


Techniken die ich bisher eingesetzt habe…

Hier sehen Sie eine Liste der Techniken und Tools die ich bisher bei der Entwicklung von iOS und Mac OS-X Apps eingesetzt habe. Die Reihenfolge ist zufällig.

Technik/Framework Beispielanwendung
System Sound mit AudioToolbox Spiele einen Ton ab, wenn ein Button berührt wird, oder wenn ein Task abgearbeitet wurde. Die Sound-Datei (z.B. im AIFF Format) kann dem Projekt hinzugefügt werden und danach während das Programm läuft abgerufen werden.
Zugriff auf Benutzer-Kontakte mit AdressBook and AddressBookUI Abrufen von einzelnen Kontaktinformationen die vom Benutzer ausgewählt werden oder das ganze Adressbuch kann in die App integriert werden.
Kamera Video Aufnahme mit AVFoundation & Accelerate Video Einzelbilder empfangen und bearbeiten, bevor sie auf dem Display gezeigt werden. Analyse der Einzelbilder ermöglicht die Erkennung bestimmter Charakteristika. Das YUV Format ist in diesem Fall besonders nützlich weil damit eine Bildanalyse nur auf dem Luminanz-Kanal stattfinden kann. Das reduziert auch die Menge an Daten, die prozessiert werden muss.
Multithreading Zeitintensive Tasks können auf verschiedene Queues abgesetzt werden, zum Beispiel für Netzwerkzugriffe oder komplexe Video Analyse. Auf diese Weise kann das User Interface noch weiter funktional bleiben. Wichtig ist es, darauf zu achten dass Objekte die in unterschiedlichen Threads manipuliert werden, auch threadsafe sind.
CoreGraphics/QuartzCore Layers Einfacher Zugriff auf die Display Grafik. Diese Technik erlaubt es eigene Grafiken auf UIView Objekte anzuwenden, unabhängig von UIKit.
GPS Tracking mit MapKit und CLLocation Finde die Position des Benutzers und zeige sie auf einer Karte. Speichere Positionsänderungen des Benutzers, auch wenn die App im Hintergrund läuft. Berechne die grobe Reisestrecke. Finde die tatsächliche Adresse (Straße, Stadt, PLZ, etc.) mit dem Reverse Geocoder. Zeige Zusatzinformationen auf der Karte an (zum Beispiel die berühmte rote Stecknadel). Nutze Annotation Objekte zur Darstellung von sogenannten Callouts, welche als Button benutzt werden können, um z. B. zu einem anderen View Controller zu navigieren.
UI Elemente mit der Appearance Methode anpassen Nutze eigene UI Grafiken für die verschiedenen UI Elemente um ein eigenes Look&Feel zu generieren.
Datenmodelle in einer CoreData Datenbasis innerhalb der App sichern Damit können Benutzer-Eingaben in einer SQLite Datenbasis gespeichert werden und später wieder nachgeladen werden. Der NSFetchedResultsController kann benutzt werden um die Daten an einen UITableViewController auf einfache Weise zu übermitteln. Ebenso ist es möglich eine Kopie der Datenbasis in iCloud zu speichern. Auf diese Weise ist es möglich eine Datenbasis auf mehreren Geräten (desselben Nutzers) zu nutzen.
Dropbox mit dropbox- und Security.framework Erlaube es dem Benutzer in sein Dropbox Konto einzuloggen und ein Abspeichern von Dokumenten oder App-Eigenschaften, die als property-lists in Form einer XML Datei abgelegt werden, in der Cloud zu ermöglichen. Diese property list kann auch von anderen Benutzern der gleichen App abgerufen werden (wenn die Datei vorher in der Dropbox freigegeben wurde). Dadurch lässt sich eine Synchronisierung zwischen verschiedenen Benutzern bewerkstelligen.
Categories für vorhandene Klassen Mit dieser Technik kann eine vorhandene Klasse mit zusätzlichen Eigenschaften (properties) oder Methoden ausgestattet werden. Im Fall von CoreData ist dies besonders nützlich weil die Xcode tools Klassen für die Entities in der CoreData Datenbank automatisch generieren. Da diese Klassen mit jedem Update der Datenstruktur neu generiert werden müssen, bieten sich Kategorien für diese Klassen an, zum Beispiel für Initialisierungsmethoden die die Verwendung der Klasse vereinfachen sollen.
Zeichnen mit CoreGraphics Ableiten einer UIView Klasse ermöglicht das Zeichnen in der drawRect: Methode. Zum Beispiel können Geraden und Kreise gezeichnet werden und die Farbe und Linienbreite kann verändert werden. Textbausteine können auch verwendet werden. Man kann auch in einen Bitmapcontext gezeichnet werden und dieser kann dann als Grafikdatei abgespeichert werden.
Selbsterstellte UITableViewCell Mit dem InterfaceBuilder kann man komplexere table view cells bauen, die es ermöglichen mehr Daten oder auch Bilder (zum Beispiel Piktogramme) in einer Tabellenzelle unterzubringen.
PDF Ausgabe mit CoreText Generiere eine PDF Datei mit der Datenbasis der App als Quelle für den PDF Inhalt. Zeige das PDF in einem page view controller, der es dem Benutzer ermöglicht durch die Datei zu blättern wie durch ein Buch.
Lokalisierung Strings Dateien können genutzt werden, um alle Zeichenketten in der App (Localizable.strings), sowie alle Zeichenketten im Userinterface (z.B. MainStoryboard.strings) für verschiedene Sprachen aufzubereiten. Für Zeichenketten im UI kann ein command line tool „ibtool“ verwendet werden, dass aus der Storyboard Datei (von InterfaceBuilder, kurz: ib) eine erste .strings Datei erstellt, die als Basis für die Übersetzungen genutzt werden kann (erst ab iOS 6.0). Diese Text-Dateien können mittels „diff“ auf einfache Weise verglichen werden, was für eine Kontrolle der verschiedenen Sprachen hervorragend geeignet ist.
Eigene (soft) Tastatur Abgeleitet von der UIViewController Klasse, kann diese als Ersatz für die Standard Tastatur genutzt werden. Dadurch werden andere oder zusätzliche Tasten ermöglicht, die besser zur App passen. Die Tastatur kann ihre eigene XIB Datei bekommen (das Format für InterfaceBuilder), zudem kann sie so konfiguriert werden, dass sie den typischen Tastatur-Klick-Ton abspielt (wenn der Nutzer diese Funktion in den Allgemeinen Einstellungen aktiviert hat). Im Fall, dass die App nicht nur aufrecht sondern auch quer verwendet werden soll, können zwei unterschiedliche Layouts genutzt werden.
Abgeleitete Klasse von NSImageView Für Mac OS-X: füge der Klasse eine Positions-Info hinzu, und erlaube dem Nutzer den View in seinem Toplevel-View zu verschieben. Diese Technik nutzt eine überschriebene mouseDown: Methode um Maus-Events abzurufen und Positionsveränderungen festzustellen. Die hitTest: Methode kann überschrieben werden, z.B. um transparente Pixel zu unterscheiden. Eine Beispielanwendung ist, den Nutzer nur Views verschieben zu lassen, wenn ein nicht-transparentes Pixel angeklickt wird. Wenn das Maus-Event nicht genutzt wird, kann es an den nächsten View weitergeleitet werden, so vorhanden.
Bilder Browser mit NSArrayController Nochmals Mac OS-X. Bindings können genutzt werden um einen NSArrayController mit einem Bildbrowser auf der einen Seite und mit einer CoreData Datenbank auf der anderen Seite zu verknüpfen. Jegliche Änderung in der Datenbasis wird auf diese Weise mit dem Bildbrowser synchronisiert.
Dateien öffnen mit dem NSOpenFilePanel Das ist das Standard Fenster für das Laden von Dateien in Mac OS-X. Hier können bestimmte Dateitypen festgelegt werden (zum Beispiel ausschließlich Bilddateien). Erlaubt das Laden einer einzelnen Datei oder auch gleich mehrerer Dateien, die dann einzeln verarbeitet werden.
Drag & Drop nutzen zum Laden von Dateien mit dem IKImageBrowser Diese Technik ermöglicht es, Dateien (eine oder auch mehrere) in die App zu laden, indem sie mit der Maus über den entsprechenden Bereich gezogen (und fallen gelassen) werden.
Nutze die Flickr API um öffentliche Fotos zu laden … und diese dann auf einer Karte anzuzeigen. Dies ist ein gutes Beispiel für einen lang andauernden Task, der besser seinen eigenen Thread bekommen sollte, so das das UI nicht blockiert wird. Die Flickr API nutzt REST XML Dateien als Informationsträger. In diesem Fall kann es nützlich sein, eine öffentliche Bibliothek zum Parsen der XML Datei zu nutzen. (Wie immer, versuche ich nicht das Rad neu zu erfinden).
Foto mit UIImagePickerController und ImageIO aufnehmen Die einfachste Möglichkeit ein Foto, das vom Nutzer aufgenommen wird, oder das eines seiner gespeicherten Fotos ist, in der App zu nutzen. Allerdings können mit dieser einfachen Möglichkeit nur Bilder im Portrait-Modus aufgenommen werden.
Informationen auf Facebook oder Twitter veröffentlichen, mit Social.framework (ab iOS v6.0) Sehr einfach nutzbare API für das Posten von Bildern und Text auf diesen Sozialen Netzwerken.

Technologies used so far…

This is a list of techniques and tools I have used so far for iOS/Mac OS-X development in loose order.

Technology/Framework Example of Usage
System Sound with AudioToolbox Play a sound when a button is touched, or a task is finished. The sound file (e.g. in AIFF format) can be added to the project and then retrieved at runtime.
Access to user contacts with AdressBook and AddressBookUI Retrieve contact information for one contact to be picked by user, or incorporate the complete address book database into the app.
Camera video input with AVFoundation & Accelerate Capture video frames and process them before showing the video frames on the display. Analyze the frame to find specific features in it. YUV frame format can be used to extract the luminance for faster image analysis, in case color is of no interest (this is frequently the case).
Use Multithreading Post resource (time) intensive tasks, like network access or complex video analysis, on different queues, as not to block UI updates. Take care that objects manipulated in different threads are threadsafe.
Use CoreGraphics/QuartzCore Layers Easy access to display graphics. This allows to add graphics to any view objects, independent of UIKit.
GPS Tracking with MapKit and CLLocation Find user location and show on map. Track position also when app is in background. Calculate rough travel distance. Get real name address with reverse geocoder. Show map annotations (e.g. the infamous red pin) as overlay on the map view. Use annotation objects to show callouts which can be used as buttons to navigate to another view controller.
Modify UI elements with Appearance method Use non-standard graphics for UI elements for a more individual look and feel of the app.
Save model in database with CoreData Save and retrieve user input to the app in a SQLite database on the device. Use NSFetchedResultsController to administer data to a UITableViewController in a straightforward way. This also allows to save a copy in the iCloud if enabled, thus making the data available across devices for the same user.
Use Dropbox with dropbox- and Security.framework Login to Dropbox account to save and distribute documents or app properties in property lists, saved as XML file. The property list can be retrieved by other users of the same app, thus enabling a synchronization between users.
Use categories on existing classes This allows to extend an existing class by additional properties or methods. Used with coredata which auto-creates classes for the entities in the database. Because these classes will be overwritten, when the database schema is updated, it makes sense to use categories on those classes, for example to add convenience methods to initialize said classes.
Drawing with CoreGraphics Create subclasses of UIView and draw content within the drawRect: method. Draw lines and circles, change color and line width, and draw text. Also, draw into a bitmap context, which can be exported as an image file.
Custom UITableViewCell Create more complex table view cells in order to display more information in each cell.
PDF output with CoreText Generate a PDF file with the app’s database as data source for the PDF content. Show PDF in a page view controller, which allows user to flip through pages as in a book.
Localization Use strings files to localize all in-app strings (Localizable.strings) and any strings in the UI (MainStoryboard.strings) to different languages. For the UI strings the command line tool ibtool can be used to generate a starting point with the standard language used within Interface Builder. This can be used in a later stage for diff checks (to see what has changed compared to the last version) as well.
Custom (soft) keyboard Subclass of UIViewController used as a replacement for the standard keyboard. This allows for different buttons on the keyboard, better suited for the task at hand. The keyboard can have its own xib file and it can be configured to play the keyboard clicking sound (if enabled in the system preferences by the user). Two different button layouts are used, depending on device orientation (landscape or portrait mode).
Subclass NSImageView For Mac OS-X: add location information to image view and allow user to drag the image around inside its top level view. This uses a mouseDown: method override to intercept mouse events and determine the location changes. The hitTest: method can be overridden to e.g. check for transparent pixels. For example, to only allow user to drag the view if an opaque pixel is clicked with the mouse. Otherwise the mouse event can be forwarded to the next responder.
Image Browser with NSArrayController Again Mac OS-X. Use bindings to connect the NSArrayController to the image browser on one side and to the CoreData database on the other side. Any update to the db is automatically reflected in the image browser.
Let user open file with NSOpenFilePanel This is the Mac OS-X standard file open panel. Allows to restrict to specific file types (e.g. only images). Can be used to load one or more files into the app and process them one by one.
Use Drag & Drop for file input with IKImageBrowser Allows to add files to the image browser (one or many) by dragging and dropping with the mouse.
Use Flickr API to retrieve public photos … and display them on map annotations inside a map view. This is a good example for a long lasting task which gets its own thread, so the UI is not blocked. The Flickr API uses REST XML files as data information. In this case a public library for XML parsing can be useful. (As always, try not to invent the wheel).
Capture Photo with UIImagePickerController and ImageIO Easiest way to retrieve a photo either to be taken by the user directly, or from the user’s camera roll. This is limited to photo taking in portrait mode.
Post info on Facebook/Twitter using Social.framework Very easy to use API for posting text and images on social networks.