Thursday, November 27, 2008

iPhone SDK 2.2 header files dump is here

http://ericasadun.com/iPhoneDocs220/

MPTVOutWindow video code demo is here
http://www.appleinsider.com/articles/08/11/26/iphone_2_2_hides_video_out_code_for_third_party_apps.html

and the perl script to generate header files
http://arstechnica.com/journals/apple.ars/2008/11/24/dumping-the-iphone-2-2-frameworks


Alternatively you can classdump in iPhone

(1) Install class-dump in Cydia / apt-get
apt-get install class-dump

(2) run this script in iPhone to generate the header files in current directory
dump.sh: Select all

#/bin/bash
for FRAMEWORKS in Frameworks PrivateFrameworks; do
frameworklib=/System/Library/"${FRAMEWORKS}"
for frameworkpath in "${frameworklib}"/*.framework; do
frameworkdir="$(basename "${frameworkpath}")"
frameworkbin="${frameworkdir%.*}"
if [ -f "${frameworkpath}/${frameworkbin}" ]; then
echo "Framework: ${frameworkbin}"
mkdir -p ${frameworkbin}
class-dump -H -o "${frameworkbin}" "${frameworkpath}/${frameworkbin}"
fi
done
done


(3) If you want to remove all header directories under current directory and start over again run
find . -type d -name '[a-zA-Z]*' -print | xargs rm -rf
.
.
.
.
.

Sunday, November 23, 2008

How to skip provisioning profile for iPhone SDK 2.2 (build 9M2621)

The trick to skip provisioning profile still works

Just backup and edit the file

/Developer/Platforms/iPhoneOS.platform/Info.plist

and add the magic words in red as below

<key>NATIVE_ARCH</key>
<string>armv6</string>
<key>PLIST_FILE_OUTPUT_FORMAT</key>
<string>binary</string>
<key>PROVISIONING_PROFILE_ALLOWED</key>
<string>NO</string>
<key>PROVISIONING_PROFILE_REQUIRED</key>
<string>NO</string>

<key>SDKROOT</key>
<string>iphoneos2.2</string>


Please remember to restart your Xcode after the amendment above.

I have tested it to build app on jailbreaked iPhone firmware 2.1 & 2.2

For MobileInstallation patch, please use my package as posted here
http://hackint0sh.org/forum/showpost.php?p=340693&postcount=14

Updated Notes
If you have "security policy error" after Build & Go. Do these steps

(1) Install a new free app from App Store in iPhone (not sync from iTunes)
(2) Launch that newly purchased free app and then close it.
(3) Reboot your iPhone (that is power off and on again)
(4) Launch the app again that you have Build & Go in Xcode to iPhone.

Please also refer to the latest article for SDK2.2.1
http://iphonesdkdev.blogspot.com/2009/01/how-to-skip-provisioning-profile-for.html




Tuesday, November 4, 2008

Upgrade VMWare Image to Ubuntu 8.10 for iPhone open toolchain SDK2.0 / Android SDK development

(1) Download ubuntu-8-1.10-desktop-i386.iso (32 bit Intel i386 Desktop)
http://www.ubuntu.com/getubuntu/download
MD5 (ubuntu-8-1.10-desktop-i386.iso) = 24ea1163ea6c9f5dae77de8c49ee7c03

Installation is very easy just mount the iso image in the VMWare, and everything goes default. then install VMWare tools. If network does not work try command "sudo dhclient"

(2) VMWare Settings : Harddisk Size 8G, Ram 512MB

(3) Purpose : sdk development on iPhone / Android
Allows samba mount, ssh / scp access
apache2 server with php5 support for sqlite3 db

(4) Add root access for useraccount without password (this does not work, I don't know why, so you still need password)
Ubuntu default root disabled, so you can disable password input by editing etc/sudoers
sudo visudo
Add this line (e.g. sdkuser is the default user account)
sdkuser ALL=(ALL) NOPASSWD:ALL

(5) install build essential packages so that you can compile llvm-gcc for iPhone toolchain SDK2.0

sudo apt-get update
sudo apt-get install build-essential bison flex


(6) install server packages so that you can have local webserver and ssh and samba server

sudo apt-get install apache2 php5 libapache2-mod-php5 php5-cli php5-common php5-cgi php5-sqlite openssh-server samba


Install php5-sqlite3
sudo apt-get install php-db php-pear
wget http://us.archive.ubuntu.com/ubuntu/pool/universe/p/php-sqlite3/php-sqlite3_0.5-1_i386.deb
sudo dpkg -i php-sqlite3_0.5-1_i386.deb


(7) Create Project folder for smb mount (guest login ok) so that you can use windows / smb mount the virtual machine folder

(assume sdkuser is the default user account)


mkdir -p /home/sdkuser/Projects
chmod 777 /home/sdkuser/Projects

sudoedit /etc/samba/smb.conf


and add the followings at the end

smb.conf: Select all

[Projects]
comment = Projects Folder Share
writable = yes
locking = no
path = /home/sdkuser/Projects
public = yes
browseable = yes
guest ok = yes
create mask = 0666
directory mask = 0777


Note : you have to restart samba server to make the new configuration effective
sudo /etc/init.d/samba restart

(8) install jdk6 so that you can compile Andriod app

sudo apt-get install sun-java6-jdk



(9) Download Android SDK http://dl.google.com/android/android-sdk-linux_x86-1.0_r1.zip from http://code.google.com/android/download_list.html

install in ~/Android/

mkdir -p ~/Android/
sudo unzip ~/Desktop/android-sdk-linux_x86-1.0_r1.zip -d ~/Android/
sudo chown -R sdkuser:sdkuser ~/Andriod


create sd card & test emulator

~/Android/android-sdk-linux_x86-1.0_r1/tools/mksdcard -l SD500M 500M ~/Android/sd500m.img

~/Android/android-sdk-linux_x86-1.0_r1/tools/emulator -datadir ~/Android -scale 0.7 -sdcard ~/Android/sd500m.img &


(10) Download and Install Eclipse 3.4.1 (you can't use the debian package eclipse which is 3.2 only)
from http://www.eclipse.org/downloads/
http://www.eclipse.org/downloads/download.php?file=/technology/epp/downloads/release/ganymede/SR1/eclipse-java-ganymede-SR1-linux-gtk.tar.gz

install in /usr/lib

cd /usr/lib; sudo tar -xzvf ~/Desktop/eclipse-java-ganymede-SR1-linux-gtk.tar.gz


Add main menu & icon for eclipse in GNOME


sudoedit /usr/share/applications/eclipse.desktop


and save this

eclipse.desktop: Select all

[Desktop Entry]
Name=Eclipse
Comment=Develop applications in a variety of different programming languages
Exec=/usr/lib/eclipse/eclipse
Icon=eclipse48.png
Terminal=false
Type=Application
Categories=Development;
StartupNotify=true


There is no eclipse icon in the download file eclipse-java-ganymede-SR1-linux-gtk.tar.gz. You can get it from eclipse 3.2.2 package
and install it manually

download the eclipse 3.2.2 package
wget http://us.archive.ubuntu.com/ubuntu/pool/universe/e/eclipse/eclipse_3.2.2-5ubuntu2_i386.deb

extract the package and copy the icons to /usr/share/pixmaps/
dpkg -x eclipse_3.2.2-5ubuntu2_i386.deb tmp
sudo cp tmp/usr/share/pixmaps/* /usr/share/pixmaps/
rm -fr tmp


Install Android sdk plug-in for Eclipse
(based on http://code.google.com/android/intro/installing.html#installingplugin)
add this site and install in Eclipse
http://dl-ssl.google.com/android/eclipse/

Edit Eclipse's preference for Andriod (Window -> Preferences -> Android)

SDK location
/home/sdkuser/Android/android-sdk-linux_x86-1.0_r1/

emulator options
-scale 0.7 -sdcard /home/sdkuser/Android/sd500m.img

Test HelloActivity in Eclipse
(a) Create a New Android Project in Eclipse (File -> New -> Project... -> Android -> Android Project)
(b) Choose Create project from existing source and browse to ~/Android/android-sdk-linux_x86-1.0_r1/samples/HelloActivity
(c) Run HelloActivity as Android Application
(d) Then the emulator will start Hello, World! will be on the emulator screen

Note: Please don't set the workspace of Eclipse to the sample project folder
~/Android/android-sdk-linux_x86-1.0_r1/samples/
or else you will get error when importing project from existing source


(11) Install iPhone llvm-gcc and toolchain SDK2.0
Refer to this article and download the file UpgradeToolChain2.tgz and build the llvm-gcc for iPhone
http://iphonesdkdev.blogspot.com/2008/10/how-to-install-llvm-gcc-for-iphone-sdk.html


Install ldid in Linux, so that you can fake codesign it

cd ~/Projects
wget http://svn.telesphoreo.org/trunk/data/ldid/ldid-1.0.476.tgz
tar -zxf ldid-1.0.476.tgz
cd ldid-1.0.476
g++ -I . -o util/ldid{,.cpp} -x c util/{lookup2,sha1}.c
sudo cp -a util/ldid /usr/bin


If you need to codesign the iPhone binary in Linux add this (as one line) to your build script

export CODESIGN_ALLOCATE=/usr/toolchain2/pre/bin/arm-apple-darwin9-codesign_allocate; ldid -S $(PROJECTNAME)



(12) test apache2 and php so that you can see the php info page in the local webserver

In Firefox browser of Ubuntu enter this address
http://localhost/

enable php5 (sometimes you need this)
a2enmod php5

restart apache server
sudo /etc/init.d/apache2 restart

create this test.php script in /var/www

sudo chown -R sdkuser:sdkuser /var/www
echo "<?php phpinfo(); ?>" > /var/www/test.php


and see the php info in Firefox browser of Ubuntu
http://localhost/test.php

(13) create sqlite3 db
sqlite3 test.db: Select all


sudo chown -R sdkuser:sdkuser /var/www
cd /var/www
sqlite3 test.db
sqlite> create table test (id integer primary key, value text);
sqlite> insert into test (value) values('eenie');
sqlite>
sqlite> insert into test (value) values('meenie');
sqlite> insert into test (value) values('miny');
sqlite> insert into test (value) values('mo');
sqlite> select * from test;
sqlite>
sqlite> .exit


and test sqlite3 & php5-sqlite3 by using testdb.php script to test the access to sqlite3 db on webserver

(14) testdb.php
testdb.php: Select all


<// Version 0.01
<html>
<head><meta http-equiv="Content-Type" content="text-html; charset=UTF-8" /></head>
<title>iPhone Database</title>
<body>
<?php

$ip_dbpath[] = '/var/www/test.db';

// $ip_dbpath[] = '/var/www/sms.db';
// $ip_dbpath[] = '/var/www/call_history.db';
// $ip_dbpath[] = '/var/www/notes.db';
// $ip_dbpath[] = '/var/www/AddressBook.sqlitedb';
// $ip_dbpath[] = '/var/www/Calendar.sqlitedb';

// db location in iPhone /private/var/mobile/Library/SMS/sms.db
// db location in iPhone /private/var/mobile/Library/CallHistory/call_history.db
// db location in iPhone /private/var/mobile/Library/Notes/notes.db
// db location in iPhone /private/var/mobile/Library/AddressBook/AddressBook.sqlitedb
// db location in iPhone /private/var/mobile/Library/Calendar/Calendar.sqlitedb


$ip_dbdesc[] = 'test';

// $ip_dbdesc[] = 'SMS';
// $ip_dbdesc[] = 'Call History';
// $ip_dbdesc[] = 'Notes';
// $ip_dbdesc[] = 'Address Book';
// $ip_dbdesc[] = 'Calendar';

$ip_query[] = 'SELECT * from test order by 1';
// $ip_query[] = 'SELECT date, address, text FROM message order by 1 desc, 2;';
// $ip_query[] = 'SELECT date, address, duration FROM call order by 1 desc;';
// $ip_query[] = 'SELECT creation_date, data, title FROM Note inner join note_bodies on Note.ROWID = note_bodies.note_id order by 1;';
// $ip_query[] = 'SELECT First, Last, Middle, CreationDate, ModificationDate FROM ABPerson;';
// $ip_query[] = 'SELECT start_date, end_date, summary, location, description FROM Event order by 1, 2;';

// $dbcount = sizeof($ip_dbpath);
// if you uncomment the above db & query and add copy the iPhone db , you can list out the content of sqlitedb of iPhone
$dbcount = 1;

for ($dbnum=0;$dbnum<$dbcount;$dbnum++){

try {
$dbpath = $ip_dbpath[ $dbnum ];
$dbh = new PDO('sqlite:'.$dbpath);
$query = $ip_query[ $dbnum ];
$stmt = $dbh->prepare($query);
$stmt->execute();
}
catch (PDOException $e) {
die("Could not open database" . $e->getMessage());
}
$colcount = $stmt->columnCount();
echo "<h1>". $ip_dbdesc[ $dbnum ] . "</h1>";
echo "<table cellpadding=10 border=1>";

for ($i=0;$i<$colcount;$i++) {
$meta = $stmt->getColumnMeta($i);
echo "<td>".$meta["name"]."</td>";
}

while ($row = $stmt->fetch()) {
echo "<tr>";
for ($i=0;$i<$colcount;$i++) {
$meta = $stmt->getColumnMeta($i);
if ($meta["native_type"] == "null") {
echo "<td> </td>";
}
elseif (preg_match("/date$/i", $meta["name"])) {
echo "<td>". date("j M Y D g.i a", $row[$i])."</td>";
}
elseif (preg_match("/[call|sms]$/i", $meta["name"]) && $meta["name"] == "address" && strlen(rtrim($row[ $i])) == 8) {
echo "<td><A href='Tel:".$row[$i]."'>".$row[$i]."</A></td>";
}
else {
echo "<td>".$row[ $i]."</td>";
}
}
echo "</tr>";
}
echo "</table>";
}
?>
</body>
</html>


(15) Enjoy building app




Why to install apache2, php5 and php5-sqlite3 in Ubuntu ?

Because both iPhone and Andriod SDK use sqlite3 as database engine.
Webserver can be served for many purposes when testing including http get/post access and cydia repository as well.



Additional Notes
If you need to install flash plugin in firefox
sudo apt-get install flashplugin-nonfree

If you need to install java plugin in firefox
sudo apt-get install sun-java6-plugin

If you need to install xpdf
sudo apt-get install xpdf-reader

If you need to install jedit
sudo apt-get install jedit

Install Ubuntu in Virtual PC 2007

The above installation can also be applied for Virtual PC2007 if you use Windows OS. One problem of Ubuntu in VPC 2007 is that "sound does not work"

Install Ubuntu in Virtual PC 2007 may have screen display problem (similar to Fedora) and fail during installation.

Here are the steps to successfully install Ubuntu in Virtual PC 2007.

(1) Setup the new Virtual Machine in VPC 2007 and mount the iso image (ubuntu-8-1.10-desktop-i386.iso).

(2) Inside the Ubuntu Install Screen, first Press "F4" and Select "Safe Graphics mode"

(3) Then press down arrow and highlight the menu "Install Ubuntu". (highlight only and don't press Enter)

(4) Press "F6" to bring up the "Other Options"
Then type "vesa vga=771" at the end of the option line
Then Press "Enter", the installation will start instantly.

Note: If you want other resolution, you can try say vga=791 instead of vga=771

I did not try all these, some of them might not work. The codes are listed out for reference only.

vga=769 means 600x480 8 bits color
vga=785 means 600x480 16 bits color
vga=786 means 600x480 24 bits color
vga=771 means 800x600 8 bits color
vga=788 means 800x600 16 bits color
vga=789 means 800x600 24 bits color
vga=773 means 1024x768 8 bits color
vga=791 means 1024x768 16 bits color
vga=792 means 1024x768 24 bits color


(5) After installation, it will prompt to restart. But the restart might not work and you have to manually reset the VM in VPC 2007

(6) Then release the mounted iso image and in VPC 2007 menu to reset the VM that is in VPC 2007 menu do Action -> Reset

(7) Enjoy using Ubuntu in VPC 2007



(8) To solve the sound problem in VPC2007, start the Terminal in Ubuntu and type

sudoedit /etc/rc.local

At the end of the # lines, but before “exit 0″, type on a new line (again without quotes) “modprobe snd-sb16″
Ctrl + O to write out, enter to accept the name, Ctrl + X to close.