Archive

Archive for the ‘iPhone’ Category

Change iPhone/iPod app orientation within a UITabBarController

September 4th, 2008 12 comments

The documentation for the official iPhone SDK is less than stellar, and as a result I’ve encountered lots of frustrating little problems. In particular, I wasn’t able to get my app to change its orientation when the phone was rotated. UIViewController has a method shouldAutorotateToInterfaceOrientation: that gets called when the iPhone/iPod orientation is changed by the user, and overriding this method to return YES should cause your view to be rotated. You may have implemented this method and to your frustration, nothing happened when you rotated the device. The trick is that Cocoa only calls shouldAutorotateToInterfaceOrientation: on the top most UIViewController. Meaning if your program lives inside a UITabBarController (possibly with a UINavigationController inside some of the tab bar items), the UIViewController that the user is currently interacting with, is not necessarily the one receiving the method call.

In my app, everything lives inside a UITabBarController, so that’s what was receiving the shouldAutorotateToInterfaceOrientation: call. In order to get orientation changes to work you need to subclass UITabBarController (contrary to Apple doc recommendations) and override the method so you can return YES when it’s called. Below is some code for a simple UITabBarController subclass used inside a program that supports a horizontal view.

RotatingTabBarAppDelegate.h

#import <UIKit/UIKit.h>

#import "RotatingTabBarController.h"

/*
 Nothing special implemented in our delegate for this example.
 */

@class RotatingTabBarAppViewController;

@interface RotatingTabBarAppAppDelegate : NSObject <UIApplicationDelegate> {
    IBOutlet UIWindow *window;
}

@property (nonatomic, retain) UIWindow *window;

@end

RotatingTabBarAppDelegate.m

#import "RotatingTabBarAppAppDelegate.h"

@implementation RotatingTabBarAppAppDelegate

@synthesize window;

/*
 We’ll programmatically lay out a simple GUI for this demonstration.
 */

- (void)applicationDidFinishLaunching:(UIApplication *)application {    
    
    // Just make two empty view controllers for fun
    UIViewController *tab1 = [[UIViewController alloc] init];
    tab1.tabBarItem = [[UITabBarItem alloc] initWithTabBarSystemItem:UITabBarSystemItemTopRated tag:0];

    UIViewController *tab2 = [[UIViewController alloc] init];
    tab2.tabBarItem = [[UITabBarItem alloc] initWithTabBarSystemItem:UITabBarSystemItemSearch tag:1];
    
    // Now create an instance of our rotating tab bar controller
    RotatingTabBarController *tbc = [[RotatingTabBarController alloc] init];
    // Add the two view controllers to the tab bar
    [tbc setViewControllers:[NSArray arrayWithObjects:tab1, tab2, nil]];
    
    // Add the tab bar controller’s view to the window
    [window addSubview:tbc.view];
    
    // Make our program visible
    [window makeKeyAndVisible];
}

- (void)dealloc {
    [window release];
    [super dealloc];
}

@end

RotatingTabBarController.h

#import <UIKit/UIKit.h>

/*
 The subclass doesn’t need any new methods or members.
 */

@interface RotatingTabBarController : UITabBarController {

}

@end

RotatingTabBarController.m

#import "RotatingTabBarController.h"

@implementation RotatingTabBarController

/*
 Just override this single method to return YES when we want it to.
 */

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {
    // Always returning YES means the view will rotate to accomodate any orientation.
    return YES;
}

@end

The one thing this doesn’t address, is when you only want certain views in your program to rotate. In that case you just need to make your UITabBarController ask the currently visible view controller in the program if the app should rotate, and return that BOOL.

T-Zones on iPhone 2.0

July 26th, 2008 8 comments

If you’re trying to get T-Zones working on the iPhone 2.0 software, you don’t need to follow the old manual way of doing it. Just go into Cydia and search for ‘TZones Hack’ (without the quotes) and install the BigBoss tweak that comes up. Restart your phone, and you’re good to go.

As usual, the YouTube app still won’t work with this hack.

Categories: iPhone, Tutorials Tags: ,

Updating 1st gen iPhone to 2.0 software

July 19th, 2008 14 comments

The new PwnageTool is out, and I’m gonna document my steps to install the 2.0 software on my 1st gen iPhone. Note that this is not an upgrade. The process will wipe your phone, so backup any pictures or notes that you may have on there.

  1. First thing’s first. Downoad the latest PwnageTool.
  2. Unzip the file and drop it in your /Applications folder
  3. Make sure you have the latest version of iTunes (Apple->Software Update). Start up iTunes after updating to make sure it starts.
  4. Plug in your iPhone, and iTunes will ask if you want to update your phone. Click ‘Download Only’. After it finishes downloading, close iTunes.
  5. Download the version 3.9 and 4.6 boot loaders. I used this link, but that link might not work after awhile. Extract the file (and extract the .zip file inside of it again) until you see the bl39.bin and bl46.bin files.
  6. After the download is finished, close iTunes.
  7. Open the ‘Activity Monitor’ application. (/Applications/Utilities/Activity Monitor). Find the ‘iTunes Helper’ process and force quit the program.
  8. Plug in your iPhone and turn off the auto lock. (Settings->General->Auto-Lock->Never)
  9. Launch PwnageTool, then click on the iPhone on the left.
  10. Select the 2.0 firmware that it finds (iPhone1,1_2.0_5A347)
  11. Pwnage tool should be able to find your boot loaders (mine were in my Documents directory). If not, make sure you’ve extracted the boot loader file you downloaded. Worst case, just browse for it manually.
  12. Pwnage will ask you if you’re legit. I use T-Mobile in America, so I clicked ‘No.’
  13. Pwnage may ask you for your admin password.
  14. Now it will ask if your phone has been ‘Pwned’ before. I presume this is your first time (seeing as how the application just came out), so click ‘No’.
  15. This part is tricky. Watch the PwnageTool screen carefully as it will prompt you to press combinations of your Home and Power buttons in order to put the phone into DFU mode. It took me several times to do it, but just keep trying by following the on screen instructions. (When Pwnage says you have successfully entered DFU mode, your screen might be off. That’s ok)
  16. Once Pwnage tells you that you’re in DFU mode, open up iTunes. iTunes will say that the phone needs to be restored. Hold down the ‘option’ key and click on the ‘Restore’ button. iTunes will prompt you for the location of a firmware file. Select the one on the Desktop that PwnageTool created (iPhone1,1_2.0_5A347_Custom_Restore.ipsw).
  17. Go make yourself a cup of tea. :-) After the restore, the phone will reboot and Boot Neuter will flash the boot loader and base band. Your phone will reboot again, and you’re done!

If iTunes doesn’t immediately recognize your phone, try restarting iTunes. It seems the iTunes Helper is necessary for syncing the iPhone.

Categories: iPhone, Tutorials Tags:

t-zones on 1.1.4

March 2nd, 2008 Comments off

I finally upgraded my iPhone from 1.1.1 to 1.1.4, and after dealing with the Installer.app “main script execution failed” error (solution here), I began to setup my EDGE access. The steps are mostly the same as before, with the exception of the location of the preferences.plist file. Previously, it was located in the user partition, but now the file is located in:

/Library/Preferences/SystemConfiguration/preferences.plist

In addition to the upgrade, I also took the opportunity to install Telesphoreo/Cydia, which is a port of APT to the iPhone by Jay Freeman. There seems to be lots of interesting ports available to install, and a Java VM, which is of particular interest to me. If I make any progress in developing with the new tools, I’ll post any helpful info I find.

Categories: iPhone Tags: ,

t-zones (a.k.a. $5.99 Internet access) on the iPhone

September 17th, 2007 119 comments

UPDATE 3 (May 12, 2009): This tutorial and the two update links below it are outdated. Instead, setting up T-zones is now a super easy 30 second process.

UPDATE 2 (July 26, 2008): There is a much easier way to set up T-Zones now.

UPDATE: After going through my logs I’ve noticed that there are a lot of Windows users checking out this guide. So I’ve added a step 0 to help them out.

I received my iPhone on Friday and immediately went about actvating and unlocking it, and at the end of the tutorial, there’s a link to a forum discussion on getting t-zones working on your iPhone. After reading through it and placing a call to t-mobile’s customer support (great folks over there!) I finally got it working. Here are the steps needed in an easy to follow format.

I’m going to make a couple of assumptions in this tutorial.

  1. You have T-Mobile and t-zones
  2. You installed OpenSSH on your iPhone (part 3 of the unlocking process
  3. Your iPhone has Wi-Fi access.

0) Windows users install WinSCP If you’re running Windows, install a file transfer client to move the files between your computer and your iPhone. I recommend WinSCP. If the tutorial makes anymore mention about transferring files between computers, just use WinSCP and connect to the IP of your iPhone. Set the protocol to be SSH/SSH2.

1) Turn off Auto-Lock Go to ‘Settings’ -> ‘General’ -> ‘Auto-Lock’ and select ‘Never.’ You can turn it back on after you’re done with this, but for now disable it.

2) Enter APN, username and password Go to ‘Settings’ -> ‘General’ -> ‘Network’ -> ‘Edge.’ For the APN field enter wap.voicestream.com. Make sure the username and password fields are empty.

3) Create proxy.pac Thanks to kdub3000 for the file contents. Open TextEdit or your favorite text editor on Linux, and paste in the following code into a new document:

function FindProxyForURL(url, host)
{
if (isInNet(myIpAddress(), "10.0.0.0", "255.0.0.0"))
return "PROXY 216.155.165.50:8080";
else
return "DIRECT";
}

Save the file to your Desktop as proxy.pac. On OS X, make sure TextEdit doesn’t append a .txt extension to the file.

4) Find the IP address of your iPhone Go to ‘Settings’ -> ‘Wi-Fi’, and click on the blue dot next to the name of the network your iPhone is currently connected to (the one with the checkbox). Look at the IP address there and remember it or write it down.

5) Upload proxy.pac to the iPhone Now we need to copy proxy.pac to our iPhone’s /private/var/root/ directory. If you know how to do this using a Cyberduck or any other file transfer program, feel free to do so. Otherwise open up a terminal (OS X, go to Applications -> Utilities -> Terminal.app) and enter the following command with the ip address of your iPhone substituted for the $IPHONE_IP:

scp ~/Desktop/proxy.pac root@$IPHONE_IP:/private/var/root/

On my Wi-Fi network, my iPhone’s IP is 192.168.1.52, so I typed this command:

scp ~/Desktop/proxy.pac root@192.168.1.52:/private/var/root/

Hit ‘Enter’ and it will prompt you for your iPhone’s root password. The default is ‘dottie’, without the quotes.

6) Update preferences.plist Now we’ll copy preferences.plist to our local system for editing. It’s located at /private/var/root/Library/Preferences/SystemConfiguration/preferences.plist on your iPhone. Download it to your desktop using your favorite file transfer client, or use this command:

scp root@$IPHONE_IP:/private/var/root/Library/Preferences/SystemConfiguration/preferences.plist ~/Desktop/

Open up the preferences.plist file from your Desktop in your text editor, and look for the area of the file where it has the lines:

<key>DeviceName</key>
<string>ip1<string>

Note that the text inside the string tags should be ip1 (as opposed to en0, ip2 or anything else). Now add the following chunk of xml (in red) to the file in the appropriate place (thanks to syasses):

<key>Interface</key>
<dict>
<key>DeviceName</key>
<string>ip1</string>
<key>Hardware</key>
<string>com.apple.CommCenter</string>
<key>Type</key>
<string>com.apple.CommCenter</string>
</dict>

<key>Proxies</key>
<dict>
<key>ProxyAutoConfigEnable</key>
<integer>1</integer>
<key>ProxyAutoConfigURLString</key>
<string>file:///private/var/root/proxy.pac</string>
</dict>

<key>com.apple.CommCenter</key>
<dict>
<key>AllowNetworkAccess</key>
<integer>1</integer>
<key>Available</key>
<integer>1</integer>
<key>Setup</key>
By adding this code to the file, you’re instructing your iPhone to use a proxy (T-Mobile’s t-zones server) for your communications over GPRS. Save the file.
Now upload the file back to your iPhone with the command:

scp ~/Desktop/preferences.plist root@$IPHONE_IP:/private/var/root/Library/Preferences/SystemConfiguration/

7) Restart the iPhone Hold down the sleep button for 3 seconds on your iPhone, and then turn it off. Turn it back on, and you should be able to access the Internet through t-zones for just $6!

I tested my GPRS speed at iphonenetworktest.com and I got 154.2 kbps.

Categories: iPhone, Tutorials Tags: