Einem iOS Xcode Projekt eine Bibliothek hinzufügen

Es gibt die einfache Art und die nicht ganz so einfache Art. So ist es zum Beispiel unter C# ziemlich einfach eine Bibliothek zu einem Projekt hinzuzufügen und diese anschließend zu benutzen. Also was liegt näher als das gleiche unter Objective C mittels Xcode zu versuchen.

Und dort merkt man dann das Objective C ein Superset von C ist. Es ist leider nicht ganz so einfach wie man es sich wünscht. Aber fangen wir von vorne an. Gegeben seien zwei Projekte:

  • Taschenrechner (iOS App)
  • LibCore (Cocoa Touch Bibliothek)

Die Bibliothek „LibCore“ soll dabei dem Projekt „Taschenrechner“ hinzugefügt werden, damit man dieses die entsprechenden Funktionen nutzen kann. Unter Objective C gibt es Frameworks und Bibliotheken. Frameworks können auf den iOS Geräten nicht benutzt werden, damit bleiben nur noch statische Bibliotheken.

Die Einstellungen für die Suchpfade

Im ersten Schritt müssen im Projekt die Suchpfade definiert werden. Dazu gehen wir in die Projekteinstellungen in den Punkt „Build Settings“ und suchen dort nach „Header“. Die Suche wird dann den Punkt „Header Search Paths“ finden. Dort tragen wir den Pfad zur entsprechenden Bibliothek ein.

Nun werden Headerdateien welche mittels:

#import "LibCore.h";

eingebunden werden vom Compiler gefunden. Beim Linker kommt es allerdings noch zu Fehlern. Deshalb ziehen wir das Projekt (die „LibCore.xcodeprj“) auf unserer Taschenrechnerprojekt. Dadurch ist dieses Projekt nun ein „Unterprojekt“ von Taschenrechner. In den Projekteinstellungen suchen wir nun den Tab „Build Phases“ auf „Link Binary With Libraries“ und fügen dort die „LibCore.a“ hinzu.

Die Bibliothek wird dem Linker bekannt gemacht

Danach sollte das Projekt mit der Bibliothek ohne Probleme kompilieren.

Weitere Informationen gibt es unter:
http://de.wikipedia.org/wiki/Xcode
http://de.wikipedia.org/wiki/Objective_C

Freier Matheparser für Objective C

Bei der Entwicklung möchte manchmal mathematische Ausdrücke wie folgende lösen:

5*sin(3.4)/2+1234

Dabei möchte man diese Ausdrücke nicht während der Compilezeit lösen, sondern zur Laufzeit. Hier bietet sich ein Matheparser an. Ein solcher für Objective C ist „DDMathParser“ welcher unter https://github.com/davedelong/DDMathParser zu finden ist. Der Parser steht dabei unter der MIT-Lizenz und kann dabei mit einer Reihe von Operatoren, Ausdrücken und Funktionen umgehen, was man sich auch in der ausführlichen Dokumentation ansehen kann.

Private Funktionen in MooTools Klassen

Mit dem JavaScript Framework MooTools ist es möglich Klassen in JavaScript zu schreiben. In diesen Klassen kann man auch private Methoden definieren. Dazu hängt man ein „.protect()“ an die Methoden an, welche privat sein sollen. Aussehen könnte das ganze dann z.B. so:

var MessageIn = new Class({
  id: 0,
  parts: [],
	
  //Konstruktor
  initialize: function(message) {
    this.parts = this.splitCommand(message);
    this.id=parseInt(this.parts[0], 16);
    this.parts.splice(0, 1); //Erstes Element entfernen
  },
	
  //Methoden
  getPart: function(index) {		
    return this.parts[index];
  },
	
  //Private Methoden
  splitCommand: function(command) {
    ret=new Array();

    ...	

    return ret;
  }.protect()			
});

Dadurch kann die Methode „splitCommand“ nur noch durch die Klasse selbst und nicht mehr von außen aufgerufen werden.

Weitere Informationen gibt es unter:
http://de.wikipedia.org/wiki/MooTools

Libtiff und libjpeg für .NET/Mono

Bei Libtiff und libjpeg handelt es sich um zwei oft verwendete Bibliotheken zum lesen von TIFF und JPG Dateien. Die Biblitheken liegen dabei als C-Quelltext vor. Auf der Suche nach einer entsprechenden .NET Portierung bin ich auf der Seite http://bitmiracle.com/ fündig geworden. Dort gibt es .NET Portierungen der Bibliotheken unter der „New BSD license“. Augenscheinlich werden die Bibliotheken auch aktuell gehalten, so das der Abstand zwischen den Originalen nicht zu groß wird.

Weitere Informationen gibt es unter:
http://en.wikipedia.org/wiki/Libtiff
http://en.wikipedia.org/wiki/Libjpeg

Binärdaten über Websockets verschicken

Über Websockets kann man Binärdaten verschicken, leider ist dies nicht ganz so einfach wie es sein sollte. Das erste Problem ist, das es in JavaScript bis vor einiger Zeit keine „Binärtypen“ gab. Aber dank einiger Dinge ist es mittlerweile möglich Binärdaten per JavaScript und Websockets zu versenden. Mein Problem an der binären Datenübertragung war bisher, das es augenscheinlich nirgens ein komplettes Beispiel gibt, welche diese einfach mal demonstriert. Dabei ist das ganze relativ einfach:

<!DOCTYPE html>
<html>
  <head>
    <title>Websocket Binary Test</title>
    <meta charset="utf-8" />
  </head>
  <body>
    <script type="text/javascript">
      websocket = new WebSocket("ws://echo.websocket.org");
      websocket.binaryType = "arraybuffer"; //Binärtyp auf arraybuffer setzen

      //OnOpen verdraten
      websocket.onopen = function (e) {
        //Array zusammenbauen
        var message = new ArrayBuffer(9);
        var dataViewMessage = new DataView(message);

        dataViewMessage.setInt8(0, 25); //Command ID
        dataViewMessage.setInt16(1, 11); //Account ID
        dataViewMessage.setInt32(5, 43333020); //Anzahl der Credits

        //message per Websocket wegschicken
        websocket.send(message);
      }

      //OnMessage verdraten
      websocket.onmessage = function (wsPackage) {
        //Datentyp ermitteln
        if(wsPackage.data instanceof ArrayBuffer) alert("ArrayBuffer");
        else if(wsPackage.data instanceof Blob) alert("Blob");
        else if(typeof wsPackage.data === "string") alert("string");

        //Daten empfangen und auseinander bauen
        var dataViewPackage = new DataView(wsPackage.data);
        alert(dataViewPackage.getInt8(0));
        alert(dataViewPackage.getInt16(1));
        alert(dataViewPackage.getInt32(5));
      }
    </script>
  </body>
</html>

Im den ersten Zeilen im Skriptteil wird zuerst ein Websocket angelegt, welches sich mit „ws://echo.websocket.org“ verbindet. Dieser Server gibt immer genau das zurück was er empfängt und eignet sich somit ausgezeichnet für diesen kleinen Test.

Danach wird der „binaryType“ des Websockets auf „arraybuffer“ gesetzt, da wir mit einem solchen arbeiten wollen. In der verknüpften „OnOpen“ Methode wird ein „ArrayBuffer“ mit der passenden Größe angelegt und mit diesem ein „DataView“ initialisiert. Mit diesem ist es dann möglich problemlos möglich die entsprechenden Werte in den „ArrayBuffer“ zu setzen.

Dies geschieht dann mit den Zeilen:

dataViewMessage.setInt8(0, 25); //Command ID
dataViewMessage.setInt16(1, 11); //Account ID
dataViewMessage.setInt32(5, 43333020); //Anzahl der Credits

Am Ende wird das ganze weggeschickt und anschließend wieder in der „OnMessage“ Funktion empfangen. Dort wird der Datentyp ermittelt (für den Fall das man mit mehreren Typen arbeitet) und anschließend wird das Paket wieder Binär auseinander genommen.

Weitere Informationen gibt es unter:
http://www.websocket.org/echo.html
http://www.html5rocks.com/en/tutorials/webgl/typed_arrays/
https://developer.mozilla.org/en-US/docs/JavaScript_typed_arrays
http://msdn.microsoft.com/de-de/library/br212463%28v=vs.94%29.aspx
https://developer.mozilla.org/en-US/docs/JavaScript_typed_arrays/ArrayBuffer
http://stackoverflow.com/questions/11390021/transferring-files-with-javascript-through-websockets