感谢支持
我们一直在努力

在Ubuntu上iPhone开发教程

想开发iPhone应用,没有Mac Book也没有Mac Mini,怎么办?


想尝试在Linux上开发iPhone吗,那就请接着往下看。


1.  前提条件:


在Ubuntu上编译好toolchain,参见http://www.linuxidc.com/Linux/2010-04/25542.htm。


因为不能跑模拟器,需要一部iPhone手机来测试程序,iPhone3或iPhone4都可以


(目前支持到iPhone 3.1SDK,程序可以在iPhone4上运行)


2.  从UIApplication派生你的应用程序类:


头文件MyScylla.h


  1. #import <CoreFoundation/CoreFoundation.h>   

  2. #import <UIKit/UIKit.h>   

  3. @class MyMainView;   

  4. @interface MyScylla : UIApplication   

  5. {   

  6.     UIWindow *window;   

  7.     MyMainView *mainView;   

  8. }   

  9. @property (nonatomic, retain) IBOutlet UIWindow *window;     

  10. @property (nonatomic, retain) IBOutlet MyMainView *mainView;     

  11. – (void)applicationDidFinishLaunching:(UIApplication *)application;   

  12. – (void)dealloc;   

  13. – (void) redirectConsoleLogToDocumentFolder;   

  14. @end  


m文件MyScylla.m


  1. #import <Foundation/Foundation.h>   

  2. #import <UIKit/UIKit.h>   

  3. #import <UIKit/UIAlert.h>   

  4. #import “MyMainView.h”   

  5. #import “MyScylla.h”   

  6. int main(int argc, char* argv[])   

  7. {   

  8.        

  9.     NSAutoreleasePool *autoreleasePool = [   

  10.         [ NSAutoreleasePool alloc ] init   

  11.     ];   

  12.     int returnCode = UIApplicationMain(argc, argv, @“MyScylla”, @“MyScylla”);   

  13.     [ autoreleasePool release ];   

  14.     return returnCode;   

  15. }   

  16.   

  17. @implementation MyScylla   

  18. @synthesize window;   

  19. @synthesize mainView;   

  20. – (void)applicationDidFinishLaunching:(UIApplication *)application {   

  21.     NSLog(@“applicationDidFinishLaunching”);   

  22.     [self redirectConsoleLogToDocumentFolder];   

  23.        

  24.     // 可以用bounds方法会得到整个屏幕区域,包括状态栏   

  25.     CGRect screenBounds = [ [ UIScreen mainScreen ] bounds ];   

  26.        

  27.     // 然后用initWithFrame创建UIWindow对象   

  28.     window = [ [ UIWindow alloc ] initWithFrame: screenBounds ];   

  29.     // 用applicationFrame方法返回可显示区域,不包括状态栏   

  30.     CGRect rect = [ [ UIScreen mainScreen ] applicationFrame ];   

  31.     rect.origin.x = rect.origin.y = 0.0f;   

  32.     mainView = [[MyMainView alloc]init];   

  33.     [window addSubview: mainView];   

  34.     [window makeKeyAndVisible];   

  35. }   

  36. – (void)dealloc {   

  37.     [window release];   

  38.     [mainView release];   

  39.     [super dealloc];   

  40. }   

  41. – (void) redirectConsoleLogToDocumentFolder {   

  42.     

  43.     NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUSErDomainMask, YES);   

  44.     NSString *documentsDirectory = [paths objectAtIndex:0];   

  45.     NSString *logPath = [documentsDirectory stringByAppendingPathComponent:@“myscylla_log.txt”];   

  46.     freopen([logPath cStringUsingEncoding:NSASCIIStringEncoding],“a+”,stderr);   

  47. }   

  48. @end  

3. 定义自己的ViewController


CustomViewController.h


  1. #import <UIKit/UIKit.h>   

  2. @class MyMainView;   

  3. @interface CustomViewController: UIViewController {   

  4.     UITextView *textView;   

  5.     MyMainView *mainView;   

  6. }   

  7. – (void)viewDidLoad;   

  8. – (void)dealloc;    

  9. @end  


CustomViewController.m


 


  1. #import <UIKit/UIKit.h>  

  2. #import “MyMainView.h”  

  3. #import “CustomViewController.h”   

  4. @implementation CustomViewController   

  5. – (void)viewDidLoad {   

  6.     [super viewDidLoad];   

  7.     self.view.backgroundColor = [UIColor blueColor];   

  8.     CGRect rect = [ [ UIScreen mainScreen ] applicationFrame ];   

  9.     mainView = [ [ MyMainView alloc ] initWithFrame: rect ];     

  10.     [self.view addSubview: mainView];   

  11. }   

  12. – (void)dealloc {    

  13.     [super dealloc ];    

  14. }    

  15. @end  


4.  定义View


MyMainView.h


  1. #import <UIKit/UIKit.h>   

  2. #import <UIKit/UINavigationBar.h>   

  3. @interface MyMainView : UIView {   

  4.      

  5.     UINavigationBar *navBar;   

  6.     UINavigationItem *navItem;   

  7.     BOOL isMuted;   

  8.     UITextView *textView;   

  9.     UIButton *button;   

  10.     int count;   

  11. }   

  12. @property (nonatomic, retain) IBOutlet UINavigationBar *navBar;     

  13. @property (nonatomic, retain) IBOutlet UINavigationItem *navItem;     

  14. @property (nonatomic, retain) IBOutlet UITextView *textView;   

  15. @property (nonatomic, retain) IBOutlet UIButton *button;   

  16. -(IBAction) clickButton: (id) sender;   

  17. – (void)AlertWindow:(NSString *)transValue;   

  18. – (id)initWithFrame:(CGRect)rect;    

  19. – (void)dealloc;    

  20. – (UINavigationBar *)createNavBar: (CGRect) rect;   

  21. – (void)setNavBar;   

  22. – (void)clickButton:(id)inSender;   

  23. – (void)clickButton:(id)inSender forEvent:(UIEvent *)event;   

  24. //- (void)navigationBar: (UINavigationBar *)navbar buttonClicked:(int) button;   

  25. @end  


MyMainView.m


#import <UIKit/UIKit.h>
#import <UIKit/UIAlert.h>

#import “MyMainView.h”

@implementation MyMainView

@synthesize navBar;
@synthesize navItem;
@synthesize textView;
@synthesize button;

– (id)initWithFrame:(CGRect)rect {
    self = [ super initWithFrame: rect ];
      if (self != nil) {
        NSLog(@”start initWithFrame”);
       
        isMuted = NO;
        count = 0;
        //navBar = [ self createNavBar: rect];
        //[ self setNavBar ];
        //[ self addSubView: [navBar view] ];
        //NSLog(@”after add navBar”);
       
        CGRect rectText = CGRectMake(100,100,300,100);
        textView = [ [ UITextView alloc] initWithFrame: rectText ];
        //[ textView setTextSize: 12 ];
        [ textView setText: @”Hello, world!” ];
        [ self addSubview: textView ];

        button = [UIButton buttonWithType:UIButtonTypeRoundedRect];
        CGRect rect = CGRectMake(120,400,100,50);
        //[sendButton setFrame:rect];
        //sendButton = [ [ UIButton alloc] initWithFrame: rect];
        button.frame = rect;
        [button setTitle:@”Test” forState:UIControlStateNormal];
        [button addTarget:self action:@selector(clickButton:)
        forControlEvents:UIControlEventTouchUpInside];
        //[button addTarget:self action:@selector(clickButton:forEvent:)
        //forControlEvents:UIControlEventTouchUpInside];

        [self addSubview:button];

              
    }
    NSLog(@”end initWithFrame in MyMainView”);
    return self;
}

-(void)AlertWindow:(NSString *)transValue{

    UIAlertView *alertView= [[UIAlertView alloc] initWithTitle:transValue message:transValue delegate:self cancelButtonTitle:@”OK” otherButtonTitles:nil];
    [alertView show];
    [alertView release];
}

– (UINavigationBar *)createNavBar: (CGRect) rect {
    NSLog(@”start createNavBar”);
    UINavigationBar *newNav = [ [ UINavigationBar alloc]
        initWithFrame: CGRectMake(0.0f, 0.0f, 320.0f, 48.0f)
    ];

    [ newNav setDelegate: self ];
   
    // add our title
    navItem = [ [UINavigationItem alloc] initWithTitle: @”My Navigation” ];
    [ newNav pushNavigationItem: navItem];
    [ navItem setTitle: @”Another Example” ];

    NSLog(@”end createNavBar”);
    return newNav;
}
– (void)setNavBar {

    if(isMuted == YES) {
        [ navItem setTitle: @”Spouse (Muted)”];
        [ navBar showLeftButton:nil withStyle: 0 rightButton:@”Mute” withStyle: 1];
    } else {
        [ navItem setTitle: @”Spouse”];
        [ navBar showLeftButton:nil withStyle: 0 rightButton:@”Mute” withStyle: 0];
    }
    NSLog(@”end setNavBar”);
}


-(IBAction) clickButton :(id)inSender {
    count++;
    NSLog(@”clickButton”);

    UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@”Action invoked!” message:@”Button clicked!”
        delegate:self cancelButtonTitle:@”OK” otherButtonTitles:nil];
    [alert show];
    [alert release];
}

-(IBAction) clickButton:(id)inSender forEvent:(UIEvent *)event {
    NSLog(@”clickButton forEvent”);
    count++;
    [inSender setTitle:[NSString stringWithFormat:@”count:%d”, count]
        forState:UIControlStateNormal];
}


/*
– (void)navigationBar: (UINavigationBar *)navbar buttonClicked:(int) button {
    switch(button) {
    case 1: // left
        [ self AlertWindow: @”Left Button”];
        break;
    case 0: // right
        [ self AlertWindow: @”Right Button”];
        break;
    }
}
*/

– (void)dealloc {
    [textView release];
    [navBar release];
    [navItem release];
    [super dealloc ];
}
@end

5.  Makefile


  1. PROJECT=MyScylla  

  2. IP=root@192.168.1.33   

  3. TOOL_CHAIN=/home/jack/iPhone/toolchain   

  4. Sysroot=$(TOOL_CHAIN)/toolchain/sys   

  5. CC = arm-apple-darwin9-gcc   

  6. LD = $(CC)   

  7. LDFLAGS = -lobjc \   

  8.           -framework CoreFoundation \   

  9.       -framework Foundation \   

  10.       -framework UIKit \   

  11.       -framework CoreGraphics \   

  12.       -L$(Sysroot)/usr/lib   

  13. CFLAGS =   

  14. HEADERS= -I$(Sysroot)/usr/include/UIKit   

  15. Target=$(PROJECT)   

  16. Objects=MyScylla.o \   

  17.     MyMainView.o    

  18. Package=$(PROJECT).app   

  19. all:      $(Target)    

  20. $(Target): $(Objects)   

  21.     $(LD) $(LDFLAGS) -o $@ $^   

  22. %.o:       %.m   

  23.     $(CC) -c $(CFLAGS) $(CPPFLAGS) $< -o $@   

  24. %.o:       %.c   

  25.     $(CC) -c $(CFLAGS) $(CPPFLAGS) $< -o $@   

  26. %.o:       %.cpp   

  27.     $(CC) -c $(CFLAGS) $(CPPFLAGS) $< -o $@   

  28. ldid: $(Target)   

  29.     ./myldid.sh   

  30. package: ldid   

  31.     cp -p MyScylla ./$(PROJECT).app/   

  32. install: ldid package   

  33.     scp -r $(Package) $(IP):/var/root   

  34.     ssh $(IP) chmod -R 755 $(Package)    

  35.     ssh $(IP) cp -rf $(Package) /Applications/   

  36.     ssh $(IP) killall SpringBoard   

  37. clean:   

  38.     rm -f *.o $(Target)   

  39.     rm -f ./$(PROJECT).app/MyScylla  


6. 编译


ldid.sh:


export CODESIGN_ALLOCATE=/home/jack/iPhone/toolchain/toolchain/pre/bin/arm-apple-darwin9-codesign_allocate
ldid -S MyScylla

赞(0) 打赏
转载请注明出处:服务器评测 » 在Ubuntu上iPhone开发教程
分享到: 更多 (0)

听说打赏我的人,都进福布斯排行榜啦!

支付宝扫一扫打赏

微信扫一扫打赏