Skip navigation

Warum ich finde, dass das iOS Homescreenkonzept fehlerhaft ist und überholt werden muss:

1. Der iOS Homescreen ist nie für das iPad konzipiert worden
Man sortiert seine Apps auf dem iPad nach eigenen Konzepten, richtig? Klar, jeder macht das! Es macht ja auch Sinn, die eigene Ordnung auf dem Homescreen zu nutzen, um sich selbst effizienter zu recht zu finden– so ist das am iPhone auch vorgesehen gewesen und funktioniert genan so. Aber was macht das iPad damit? Genau, das iPad sortiert sich selbst, wenn man den Orientation-Modus ändert. Die Reihen verändern sich. Gern hat man beispielsweise immer links die ersten drei wichtigsten Apps zum Thema „soziale Netze“ und an vierter Stelle von links einen Ordner mit weiteren Apps zu diesem Thema. Sortiert man so und rotiert das iPad vom Portrait in den Landscape-Mode, sortiert das iPad um und eine Reihe hat nicht mehr vier Apps sondern fünf. Schon verrutscht alles. So sollte das garantiert im Konzept nicht sein, daraus kann man folgern, dass das Konzept eben nie für das iPad entworfen wurde, sondern einfach nur übertragen.

20120415-120706.jpg

20120415-120714.jpg

2. „Multitasking“ ist im iOS Homescreenkonzept nie vorgesehen gewesen
2.1 Dass das „Multistasking“ kein Wirkliches ist, wissen wir wohl alle. Wenn man sich jetzt mal ein bisschen näher mit der Implementierung des „Multitasking“ beschäftig, fällt auf, dass hier ein schwerer Designfehler präsentiert wird. Und zwar kennt man aus quasi jedem Betriebssystem ein “X” als einen Schließenbutton für ein Fenster. Wofür wird er in iOS auf dem Homescreen verwendet? Richtig: um eine App zu löschen. Es würde ohne das Multitasking ja nicht mal auffallen. Aber was wird im Homescreenkonzept verwendet, um eine App. zu schließen (also aus der Multitaskingbar zu ntfernen)? Genau. Ein rotes “-”. Ein Minus steht für mich für ein Löschen einer App. Warum ist das alles so? Sehr wahrscheinlich, weil Apple das auffiel mit der Implementierung des „Multitasking“ zwar auffiel aber es auch sehr unangemessen wäre das jetzt im Nachhinein nach mehreren Jahren noch zu ändern. Es müsste eben genau umgekehrt sein. Ein rotes Minus als Löschenbutton und ein schwarzes “X” als Schließenbutton. Man sieht also hier, dass Apple „Multitasking“ nie im Konzept des Homescreens vorsah.

20120415-124434.jpg

20120415-124448.jpg

2.2 Die Multitaskingbar ist unnötig. Ja natürlich, weil sie, zumindest bei mir, einfach nur alle Apps enthält, die ich auch auf dem Homescreen habe. Nur eben anders sortiert, nach letzter Verwendung. Als Ersatz dafür hat man am iPad die vier/fünf-Fingergesten. Nun, hier kann man noch einen Sinn in dieser Bar sehen. Aber insgesamt ist sie überflüssig, weil diese Bar eben nur die Apps anzeigt, die auch auf dem Homescreen sind. Weil ganz ehrlich, schließen muss man diese Apps ja nicht. Die meisten arbeiten ja gar nicht im Hintergrund, das sind die Wenigsten. Die meisten liegen einfach im RAM und warten darauf, wieder geöffnet zu werden. Sie verbrauchen also keine reale Leistung bzw. Akku, da sie einfach nur im Arbeitsspeicher liegen. Tja, also wozu noch schließen? RAM haben die iOS-Geräte heute genug. Das iPad 3rd Generation sogar einen ganzen Gigabyte. Es ist also aus meiner Sicht sinnfrei, dass es diese Bar gibt. Auch, weil Apple unter Lion die Politik vertritt, es soll dem Anwender doch egal sein, wieviele Apps laufen, deshalb entfernte Apple die kleinen Punkte im Dock unter dem laufenden Programm im Desktopbetriebssystem. Also, warum nicht auch unter iOS? Klar ist es ein mobiles Gerät bzw Smartphone, aber eben mit Leistung um das zu ermöglichen.
Natürlich hat die Multitaskingbar als zweites Feature die Lautstärkereglung und die Helligkeiterglung bzw Wiedergabeeinstellungen, aber was war der Hauptzweck der Multitaskingbar? Wohl doch eher die Apps, die laufen. Stellt sich also heraus, diese Bar ist mehr oder weniger überflüssig.

20120415-125727.jpg

Insgesamt sind das nur drei kleine Dinge die mir auffielen, auch das Dock verliert meiner Meinung nach durch die Folder seine Bedeutung. Ich glaube, dass Apple mit dem neuen iOS 6th Generation vieles ändert. Unter Anderem erwarte ich:
- Apple entfernt die Multitaskingbar
- Apple fördert Exposé unter iOS
- Apple fügt mindestens am iPad Benutzerverwaltung hinzu
- Apple ändert sehr wahrscheinlich den Löschenbutton nicht.
- Apple könnte das Dock entfernen, aber doch eher unwahrscheinlich, weil es auch in OS X fundamentaler Bestandteil des Desktops ist

Q

Huhu!

Ich wurde gebeten hier mal etwas über die Kommunikation in Cocoa mit MySQL zu berichten.
Fangen wir also gleich an! (Hier konkret beschrieben als iOS-App)

Was brauchen wir?
- Eine SQL Datenbank
- Einen Table den wir in einem UITableView darstellen wollen
- Daten im Table, der Table muss einen autoincrement id Tag haben
- Einen PHP Wrapper
- Einen SQL2JSON Wrapper
- Ein bisschen Geduld!

Hier einmal den Source zur PHP API unserer App:

require_once("db.php");

$id = $_GET["id"];

$sql = "SELECT * FROM ourTable WHERE id = '$id'";
$string = sql2json($sql);

echo $string;

// Diese Wrapper-Funktion ist nicht von mir, allerdings finde ich den Link nicht mehr, wo ich sie gefunden habe!

//Function will take an SQL query as an argument and format the resulting data as a
// json(JavaScript Object Notation) string and return it.
function sql2json($query) {
$data_sql = mysql_query($query) or die("'';//" . mysql_error());// If an error has occurred,
// make the error a js comment so that a javascript error will NOT be invoked
$json_str = ""; //Init the JSON string.

if($total = mysql_num_rows($data_sql)) { //See if there is anything in the query
$json_str .= "[\n";

$row_count = 0;
while($data = mysql_fetch_assoc($data_sql)) {
if(count($data) > 1) $json_str .= "{\n";

$count = 0;
foreach($data as $key => $value) {
//If it is an associative array we want it in the format of "key":"value"
if(count($data) > 1) $json_str .= "\"$key\":\"$value\"";
else $json_str .= "\"$value\"";

//Make sure that the last item don't have a ',' (comma)
$count++;
if($count < count($data)) $json_str .= ",\n";
}
$row_count++;
if(count($data) > 1) $json_str .= "}\n";

//Make sure that the last item don't have a ',' (comma)
if($row_count < $total) $json_str .= ",\n";
}

$json_str .= "]\n";
}

//Replace the '\n's - make it faster - but at the price of bad redability.
$json_str = str_replace("\n","",$json_str); //Comment this out when you are debugging the script

//Finally, output the data
return $json_str;
}

In der db.php im gleichen Verzeichnis muss die SQL Verbindung hergestellt werden:
$dbname="our_dbname";
$dbhost="our_dbhost";
$dbuser="our_dbuser";
$dbpass="our_dbuserpassword";

mysql_connect($dbhost,$dbuser,$dbpass);
mysql_select_db($dbname);
?><\code>

Wichtig um die gesamt Anzahl an Einträgen zu bekommen benötigen wir noch eine PHP Datei im gleichen Verzeichnis:

require_once("db.php");

$sql = "SELECT * FROM ourTable";
$result = mysql_query($sql) OR die("

\n".$sql."

\n".mysql_error());

$num_rows = mysql_num_rows($result);

echo $num_rows;

?>

Mit diesem Code können wir für eine ID den Inhalt der Datenbank als JSON darstellen. Der ID Tag muss per GET übergeben werden.

Hinweis! Es ist wichtig, dass ihr die Datensätze nacheinander (id für id) und nicht alle auf einmal ausgebt, da das am Ende in JSON oft langsam wird bzw. die maximale Größe des Datensatzes überschreitet!

Hinweis! Es scheint Probleme mit bestimmten Sonderzeichen beim Einlesen des JSON Codes zu geben.

In unserem Xcode Project benötigen wir einen UITableViewController und eine Klasse, die sich um die Kommunikation kümmert.
Das Gute an Objective-C ist in diesem Fall, dass das NSDictionary quasi mit JSON arbeiten kann. Ab 10.7 und iOS5 gibt es eine NSJSONSerilisation, die aus dem gefetchten NSData einer NSURLConnection ein NSDictionary macht. Man kann dann also mit [myJSONDict objectForKey:@"xy"]; aus dem JSON Dictionary den Wert Auslesen. Der Key ist der Name der Spalte aus der Datenbank und das Object die hinterlegte Information.
Man könnte also zB. jetzt den Wert 'id' wie folgt auslesen:
int id = [[myJSONDict objectForKey:@"id"] intValue];

Was wir jetzt also machen:
Den UITableViewController laden und von diesem aus in der viewDidLoad Methode anfangen die Daten zu laden. Und zwar so, dass jedes geladene Item aus der Datenbank direkt in den TableView geladen wird.
Wir ermitteln also erst die Anzahl der Datensätze und wenn wir diese haben, gehen wir durch eine Schleife mit Countbedingung.
In der Schleife können wir dann mit der aktuellen Schleifencountvariable eine NSURLConnection an die API mit der aktuellen id (eben die Schleifenvariable) stellen. Da ich empfehle GCD zu nutzen, wird eine synchrone Verbindung aufgebaut, die ein NSDate ausgibt mit dem JSON Code. Dieses NSData wird in ein NSDictionary umgewandelt und dann per NSNotification als UserInfo mitgesendet. Der UITableViewController observiert diese Nachricht und fügt das NSDictionary dem dataArray des UITableViewController hinzu und lässt dann den TableView neuladen.
So werden Schrittweise alle Daten geladen und angezeigt.
Durch den id Tag ist es auch möglich nur die 15 neusten Item der Datenbank zu laden.

Der SampleCode für das Xcode Project folgt in Kürze!

Viel Spaß damit,
Q

Hey Leute!

Apple möchte für die Apps im MacAppStore seit geraumer Zeit (!) das AppSandboxing per Pflicht einführen, zur Sicherheit des Users.
Nun, dass AppSandboxing funktionieren kann, zeigt iOS. Dort rennt jede App in einem Sandkasten, erfolgreich.
Aber unter OS X gestaltet es sich auch für Apple scheinbar schwieriger, da man es nachträglich integriert.
Beispielsweise würde damit die Wahrscheinlichkeit, dass eine App das Adressbuch auf die eigenen Server lädt verringert, da der Entwickler bestimmte Zugriffe »beantragen« muss. Wenn also eine Dateisynchronisations-App um Adressbuchzugriff bittet, wird im MAS Review auffallen, dass die App das Adressbuch gar nicht ‘braucht’ und somit wird der Antrag abgelehnt und die App rejected.

Nun zu dem Zeitablauf der Geschichte:
Apple versuchte bereits die Deadline bis zum November 2011 einzuhalten, da dies sich immer noch schwierig gestaltete wurde der Termin auf den ersten März 2012 verschoben.
Heute gab Apple bekannt, dass die Deadline auf den 1. Juni 2012 aufgeschoben wurde.
Interessant oder? Eine Firma wie Apple, die tatsächlich die ganzen Bugs im Sandboxing zum wiederholten Male nicht pünktlich fixen kann?
Nun, ich kann nur bestätigen, dass das Sandboxing noch sehr fehlerhaft ist. Probleme bereiten mir das Pathobserving und der Auto-Start beim Login.

Hoffen wir mal, dass Apple das bald in den Griff bekommt und sich nicht weiter blamiert.

Q.

Eine kurze Anmerkung meiner Seits zu 10.8.

Apple wird in die Sicherheitseinstellung ‘GateKeeper’ integrieren. Dieses Feature sorgt dafür, dass der User einstellen kann, welche Arten von Programm installiert werden dürfen.
Man kann wählen zwischen ‘MAS Apps’, ‘von verifizierten Entwicklern’ (Mac Dev Programm wird benötigt) und ‘anywhere’.

Unterschwellig wird hier dem User suggeriert nur MAS Apps zu installieren und den offenen Markt von Programmvertrieb von OS X Programmen zu meiden.

Damit entwickelt sich aus meiner Sicht ein iOS im OS X. Ein geschlossenes System, in das keiner reinkommt. Hier eben die unterschwellige Manipulation des Users.

Ich finde es echt nicht schön. 10.6.6 hat byteproject es schon erwähnt, es wird ein geschlossenes System. OpenSource wird für OS X abgeschafft.

Danke, Apple.

Q.

Huhu!

Da ich momentan selbst auch oft mit dem kleinen Problem kämpfe, dass viele custom Frameworks/Classes, die man benutzen möchte, kein ARC supporten hier ein kleines Workaround, wenn man trotzdem weiterhin ARC in seinem Projekt benutzen möchte.

Man gehe in Xcode/Project/Build Phases/Compile Sources.
Dort wählt man die Sources an, die man von ARC ausschließen möchte und fügt rechts bei den Compiler flags folgendes ein:

-fno-objc-arc

Das war’s und sollte auch so funktionieren! :)

Q

Tag!

Im Zuge des Xcode3 PPC-Buildings wollte ich mir ein Test-Run vereinfachen.
Und zwar müsste ich für einen Test-Run die App immer manuell auf den PPC Ziel Rechner übertragen. Das ist natürlich extrem aufwendig, daher hab ich mir da was ausgedacht, was (vielleicht auch für Euch) praktisch sein kann.

Plan: Xcode bei einem Build sagen, dass es nach dem Build die App auf den Remote Rechner kopiert und dort ausführt.

Umsetzung:
1. Xcode: Rechtsklick auf »Targets/Add/New Build Phase/New Run Script Build Phase/«.
2. Wenn sich kein Fenster öffnet: Targets aufklappen, AppName aufklappen, Doppelklick auf »Run Script«.
3. In besagtem Fenster können alle Voreinstellungen übernommen werden.
4. Anpassen dieses Scripts: Gist für Eure Laufzeitumgebungen. Und in das Script Fenster einfügen. Ein spezielles Speichern des Scripts ist nicht nötig, das Fenster kann einfach geschlossen werden. Warnungen und Fehler werden in der Log ausgegeben.

Viel Spaß damit und bei Fragen, kommentieren.

Q

Schon mal versucht?

Eine Herausforderung heutzutage, Builds für 10.4 Tiger zu erstellen.
Nicht nur, dass man sich umstellen muss, von Objective-C 2 herunter zu Objective-C 1 (wobei ich die Propertys wirklich vermisse!), nein. Als 10.7 Lion User sogar unmöglich.
Um Builds für PPC Tiger Computer zu erstellen, muss man Xcode 3 installieren und benutzen. Alles Andere ist schlichtweg nicht möglich. Da dachte ich mir: Gut, installiere ich halt Xcode 3, was es im Developer Center für registrierte Entwickler immer noch kostenfrei gibt.
Ich musste dazu vorher Xcode 4 deinstallieren und danach Xcode 3 installieren. Aber wenn das so einfach gewesen wäre, wäre es keinen Blog Eintrag wert.
Natürlich ging das nicht. Xcode 3 läuft unter 10.7 Lion nicht mehr.
Der gute Entwickler hat natürlich für alles (Verständnis/) eine Lösung: Zweite Partition anlegen und Snow Leopard installieren. (Und bitte macht nicht den Fehler wie ich, macht die Partition 30GB mindestens groß. Wenn ihr das aktuellste Xcode 3 installieren wollt, braucht ihr das aktuellste 10.6 Snow Leopard. Und für ein Update auf das neuste 10.6 Snow Leopard benötigt die Softwareaktualisierung grob 10GB freien Festplattenspeicher auf dem Startvolume.)
So, unter 10.6 Snow Leopard dann (nach der zweiten Installation, Updateorgie und Repartitionierung) kann man dann endlich Xcode 3 installieren. (UND BEI DER INSTALLATION BITTE DAS 10.4 SDK MIT INSTALLIEREN, SONST WIRD DAS NICHTS)

Jetzt geht’s an die Feinheiten. Denn wenn man gegen G4/G5 32bit kompilieren will mit Xcode 3 bedarf es zu beachten in den Build Settings:
1. Build SDK: 10.4
2. Deployment Target: 10.4
3. Valid Architectures: i386 ppc ppc64 ppc7400 ppc970 x86_64
4. Architecture: ppc7400
5. Den GCC auf 4.0 umstellen
6. Bitte denkt daran, es gibt keine Protokolle und Propertys. Sobald die aus dem Sample Xcode 3 Project entfernt sind, könnt ihr gegen ppc7400 kompilieren. (Das wäre dann 10.4 Tiger unter 32bit mit G4 oder G5 Prozessor)

Wenn Fragen sind, einen Kommentar schreiben. Jedenfalls könnt ihr mit dieser Konfiguration gegen 10.4 Tiger G4 kompilieren.
(Bitte beachtet: Ihr könnt damit zwar Kompilieren aber keinen Run auf 10.6 machen!)

Q

Moin!

Hier der Quellcode und Downloadlink zum ersten Programm.
Es überprüft eine Zeichenkette aus Klammern auf Wohlgeformtheit, d.h. ob jede Klammer richtig geschlossen wird.

Beispiele:
Wohlgeformt ist: ({}([]))
Nicht wohlgeformt ist: ([)]{}

Herunterladen könnt ihr die Datei hier: http://www.xup.in/dl,73882819/Wohlgeformt.java/

Quellcode: https://docs.google.com/document/d/1VouigsbWbnXtzC860AzfDpRbcJe7gjpYbtZwRVUr_eA/edit

Viel Spaß damit!
Gruß,
P

Moin!

Für mein Studium muss ich momentan Java programmieren lernen. Ein paar der Programme werde ich hier kommentiert online stellen.

Java an sich ist eine tolle Sprache mit vielen Möglichkeiten und zeichnet sich vor allem dadurch aus, dass man plattformübergreifend programmieren kann. Natürlich reicht Java auf dem Mac nicht an Cocoa/Objective-C heran – Das ist aber auch nicht plattformübergreifend.

P

Tag auch!

Im Zuge des Umzugs zu unserem neuen Hoster arbeite ich momentan an den Backup-Scripts.
Für das Backup plante ich mich per SSH zu verbinden, tar-Archive zu erstellen, diese runter zu laden auf den lokalen Home und Fileserver (G4, Tiger-Server) und dort zu vergleichen und eine Großvater/Vater/Sohn Struktur aufzubauen.
Ich habe also angefangen, die SSH Keys auszutauschen, um eine passwortfreie Authentifizierung zu ermöglichen. Das Ganze funktionierte soweit, bis mir auffiel, dass beim Leerlassen der Phassphrase bei der Keyerzeugung, Lion trotzdem nach dem Passwort für den SSH-Account fragt. Das machte mich ein wenig stutzig, bis mich auch @BruteforcerJohn dann darauf hinwies, dass es ein Softwarefehler sein muss.

Und tatsächlich funktioniert unter Lion scheinbar keine phassphrasefreie SSH Public-Key-Auth, denn unter dem System, unter dem später die Backups gemacht werden sollen (10.4), funktioniert die Authentifizierung auch ohne Phassphrase einwandfrei und ich werde nicht, wie unter Lion, trotzdem nach dem SSH Passwort gefragt.

Also zusammengefasst: Lion akzeptiert das Public Key Auth. zu einem Server nur noch, wenn ein Phassphrase im Key hinterlegt wurde!

Gruß, Q