标签归档:iOS

在iOS设备上运行python

作者: 张初阳

iOS上其实有很多优秀的跨平台项目,比如RubyMotion,能作出一些简单的UI逻辑了。

最近因为分析数据的缘故需要用python,昨天突然想在iOS上跑python,毕竟有的时候iPad还是挺好的。可是老婆的iPad没有越狱,而且被我升级了iOS6,所以不能通过shell来运行。

网上搜索了下有Python for iOS,应该很不错,可是有些贵,于是想想自己能不能也写一个?

应该可以吧。

其实很久之前就有了在iOS上假设更高级语言的IDE的想法,毕竟iOS就是一个BSD。设备有了Cydia之后拥有更多的权限和更多的API,甚至底层的调用,自由度会很大。至于Cydia的延伸行为我就不发表意见了。

我记得首先在iOS上出现的IDE是关于html5的,这个很好理解,有webkit对吧。

言归正传,我使用的是boost的lib,然后加上python到c的翻译,原理很简单。

这是一个简单的测试:

b_large_xwiw_7cc400000a611262

主要的工作就是编译boost到ios上面,我已经把boost和python-c两个文件价上传到了baidu网盘。

链接地址在下面,只要直接加入工程就好了。网上还有一种方法是做成动态链接库,链接地址在下面,过程老长老长了- -不过是一个一劳永逸的方法,我提供的文件每个工程都需要添加,而且比较大。

boost:http://pan.baidu.com/share/link?shareid=68742&uk=1194307691

python-c:http://pan.baidu.com/share/link?shareid=68743&uk=1194307691

另外给点福利,iOS的越狱入门书,别理解错了,是教你怎么自己动手不用工具越狱ios设备并获得高级权限,也就是ios黑客的入门教材。

连接在下面:

http://pan.baidu.com/share/link?shareid=68809&uk=1194307691

其实开发不难,重在参与。

[转]iOS中NSUserDefaults的用法(轻量级本地数据存储)

NSUserDefaults适合存储轻量级的本地数据,比如要保存一个登陆界面的数据,用户名、密码之类的,个人觉得使用NSUserDefaults是首选。下次再登陆的时候就可以直接从NSUserDefaults里面读取上次登陆的信息咯。

因为如果使用自己建立的plist文件什么的,还得自己显示创建文件,读取文件,很麻烦,而是用NSUserDefaults则不用管这些东西,就像读字符串一样,直接读取就可以了。

NSUserDefaults支持的数据格式有:NSNumber(Integer、Float、Double),NSString,NSDate,NSArray,NSDictionary,BOOL类型。很实用吧

NSUserDefaults很方便,读取也很容易。下面给出一个示例看看如何使用:(PS:更详细的也可以参考官方文档哈)

ViewController.h文件中主要是放几个控件,用于显示存储的数据:

  1. #import <UIKit/UIKit.h>
  2. @interface ViewController : UIViewController
  3. {
  4.     IBOutlet UILabel *txtInteger;
  5.     IBOutlet UILabel *txtFloat;
  6.     IBOutlet UILabel *txtDouble;
  7.     IBOutlet UILabel *txtNSString;
  8.     IBOutlet UILabel *txtNSDate;
  9.     IBOutlet UILabel *txtNSArray;
  10.     IBOutlet UILabel *txtNSDictionary;
  11. }
  12. @end

ViewController.m文件中最重要的是两个方法:saveNSUserDefaults:用于将各种类型数据保存到NSUserDefaults中

readNSUserDefautls:用于从NSUserDefaults中读取各种类型的数据。在viewDidLoad中调用这两个方法就可以看出结果咯

  1. #import “ViewController.h”
  2. @interface ViewController ()
  3. @end
  4. @implementation ViewController
  5. – (void)viewDidLoad
  6. {
  7.     [super viewDidLoad];
  8.     [self saveNSUserDefaults];  //调用此方法将各种数据存储到NSUserDefautls中,在下面定义
  9.     [self readNSUserDefaults];  //调用此方法从NSUserDefautls中读取各种数据,在下面定义
  10. }
  11. – (void)viewDidUnload
  12. {
  13.     [txtNSString release];
  14.     txtNSString = nil;
  15.     [txtNSDate release];
  16.     txtNSDate = nil;
  17.     [txtNSArray release];
  18.     txtNSArray = nil;
  19.     [txtNSDictionary release];
  20.     txtNSDictionary = nil;
  21.     [txtInteger release];
  22.     txtInteger = nil;
  23.     [txtFloat release];
  24.     txtFloat = nil;
  25.     [txtDouble release];
  26.     txtDouble = nil;
  27.     [super viewDidUnload];
  28.     // Release any retained subviews of the main view.
  29. }
  30. – (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
  31. {
  32.     return (interfaceOrientation != UIInterfaceOrientationPortraitUpsideDown);
  33. }
  34. – (void)dealloc {
  35.     [txtNSString release];
  36.     [txtNSDate release];
  37.     [txtNSArray release];
  38.     [txtNSDictionary release];
  39.     [txtInteger release];
  40.     [txtFloat release];
  41.     [txtDouble release];
  42.     [super dealloc];
  43. }
  44. //保存数据到NSUserDefaults
  45. -(void)saveNSUserDefaults
  46. {
  47.     NSString *myString = @”enuola”;
  48.     int myInteger = 100;
  49.     float myFloat = 50.0f;
  50.     double myDouble = 20.0;
  51.     NSDate *myDate = [NSDate date];
  52.     NSArray *myArray = [NSArray arrayWithObjects:@”hello”, @”world”, nil];
  53.     NSDictionary *myDictionary = [NSDictionary dictionaryWithObjects:[NSArray arrayWithObjects:@”enuo”, @”20″, nil] forKeys:[NSArray arrayWithObjects:@”name”, @”age”, nil]];
  54.     //将上述数据全部存储到NSUserDefaults中
  55.     NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];
  56.     //存储时,除NSNumber类型使用对应的类型意外,其他的都是使用setObject:forKey:
  57.     [userDefaults setInteger:myInteger forKey:@”myInteger”];
  58.     [userDefaults setFloat:myFloat forKey:@”myFloat”];
  59.     [userDefaults setDouble:myDouble forKey:@”myDouble”];
  60.     [userDefaults setObject:myString forKey:@”myString”];
  61.     [userDefaults setObject:myDate forKey:@”myDate”];
  62.     [userDefaults setObject:myArray forKey:@”myArray”];
  63.     [userDefaults setObject:myDictionary forKey:@”myDictionary”];
  64.     //这里建议同步存储到磁盘中,但是不是必须的
  65.     [userDefaults synchronize];
  66. }
  67. //从NSUserDefaults中读取数据
  68. -(void)readNSUserDefaults
  69. {
  70.     NSUserDefaults *userDefaultes = [NSUserDefaults standardUserDefaults];
  71.     //读取数据到各个label中
  72.     //读取整型int类型的数据
  73.     NSInteger myInteger = [userDefaultes integerForKey:@”myInteger”];
  74.     txtInteger.text = [NSString stringWithFormat:@”%d”,myInteger];
  75.     //读取浮点型float类型的数据
  76.     float myFloat = [userDefaultes floatForKey:@”myFloat”];
  77.     txtFloat.text = [NSString stringWithFormat:@”%f”,myFloat];
  78.     //读取double类型的数据
  79.     double myDouble = [userDefaultes doubleForKey:@”myDouble”];
  80.     txtDouble.text = [NSString stringWithFormat:@”%f”,myDouble];
  81.     //读取NSString类型的数据
  82.     NSString *myString = [userDefaultes stringForKey:@”myString”];
  83.     txtNSString.text = myString;
  84.     //读取NSDate日期类型的数据
  85.     NSDate *myDate = [userDefaultes valueForKey:@”myDate”];
  86.     NSDateFormatter *df = [[NSDateFormatter alloc] init];
  87.     [df setDateFormat:@”yyyy-MM-dd HH:mm:ss”];
  88.     txtNSDate.text = [NSString stringWithFormat:@”%@”,[df stringFromDate:myDate]];
  89.     //读取数组NSArray类型的数据
  90.     NSArray *myArray = [userDefaultes arrayForKey:@”myArray”];
  91.     NSString *myArrayString = [[NSString alloc] init];
  92.     for(NSString *str in myArray)
  93.     {
  94.         NSLog(@”str= %@”,str);
  95.         myArrayString = [NSString stringWithFormat:@”%@  %@”, myArrayString, str];
  96.         [myArrayString stringByAppendingString:str];
  97. //        [myArrayString stringByAppendingFormat:@”%@”,str];
  98.         NSLog(@”myArrayString=%@”,myArrayString);
  99.     }
  100.     txtNSArray.text = myArrayString;
  101.     //读取字典类型NSDictionary类型的数据
  102.     NSDictionary *myDictionary = [userDefaultes dictionaryForKey:@”myDictionary”];
  103.     NSString *myDicString = [NSString stringWithFormat:@”name:%@, age:%d”,[myDictionary valueForKey:@”name”], [[myDictionary valueForKey:@”age”] integerValue]];
  104.     txtNSDictionary.text = myDicString;
  105. }
  106. @end

好了,运行一下,可以看到xib文件中的各种数据已经绑定上了吧?1

再次运行的时候,可以把viewDidLoad中的  [self  saveNSUserDefaults];  这一行注释掉,让程序直接读取而不存储数据,发现以前保存的数据仍然可以读取到界面上。

嘻嘻,很简单吧,就这样就可以是实现数据的存储了。

下面讲一下原理:

你可能会问一个问题:NSUserDefautls将数据存储在什么地方了???我都没有显示的指定路径???很疑惑吧。。。。

用NSUserDefaults存储的数据下次程序运行的时候依然存在,它把数据存储在什么地方了?如何能够清除?

其实它存储在应用程序内置的一个plist文件里,这个可以根据路径看到。
比如说这个是你的程序沙盒位置
/UsersLibrary/Application Support/iPhoneSimulator/4.1/Applicati*****/29788E40-AF47-45A0-8E92-3AC0F501B7F4/,(这个是应用程序对应在mac上的位置)
这个下面有/Library/Prefereces,里面有个plist文件,存储的就是你的userDefaults
想要删掉的话,用removeObjectForKey或者删掉沙盒,也就是你的应用程序然后重新安装。

解决 “this class is not key value coding-compliant for the key view”问题

在iPhone开发中,由于喜欢比较干净的环境,所以放弃了StoreBoard,改用手工创建xib文件和controller,结果删除storeboard、添加xib及其控制后,怎么也无法启动,报错:

Terminating app due to uncaught exception ‘NSUnknownKeyException’, reason: ‘[<UIApplication 0x14568a10> setValue:forUndefinedKey:]: this class is not key value coding-compliant for the key view.’

*** First throw call stack:

(0x2ef1ef4b 0x3935f6af 0x2ef1ec61 0x2f85e18b 0x2f86fdd5 0x2ee8ee6f 0x319f0f87 0x319f27eb 0x3190a94b 0x316fc265 0x3169741f 0x31696721 0x316fbb3d 0x33b7a70d 0x33b7a2f7 0x2eee99df 0x2eee997b 0x2eee814f 0x2ee52c27 0x2ee52a0b 0x316fadd9 0x316f6049 0xa4235 0x39867ab7)

libc++abi.dylib: terminating with uncaught exception of type NSException

(lldb)

 

stackoverflow中的解释是File’s Owner没有跟他的view连接导致,实际上我试验过,根本不是,而是因为我的app delegate中的代码也是自己写的,通过手动装载xib文件:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
    // Override point for customization after application launch.
    self.viewController = [[RootViewController alloc] initWithNibName:@"RootView" bundle:nil];

    UINavigationController *nationController = [[UINavigationController alloc] initWithRootViewController:self.viewController];

    self.window.rootViewController = nationController;
    [self.window makeKeyAndVisible];
    return YES;
}

 

一是想到,既然我手动装载了RootView,那么就没必要在File’s Owner中将RootViewController关联给xib:

1

 

一是马上又想到,既然是我自己在app delegate中装载了根视图,那么在项目设置中也没必要指定启动视图,在Main Interface中留空就行:

2

而我在删除storeboard时想到,既然默认启动是storeboard,现在被删除了,是不是也要指定一个默认装载视图,于是在Main Interface中填入了一个rootview。

就是第二个想法修复了我的问题,原因嘛,只能是猜测:你自己手工装载了一份;由于你又在Main Interface中指定了一个,所以系统编译时会指定要启动的默认视图,结果你手工装载的视图把系统默认装载的视图替换了,导致错误的产生。

 

 

 

 

 

 

CoreTelephony框架

iOS 4.0 的官方 API 里头,多了一个叫做 Core Telephony 的 framework;一直以来 Core Telephony 都是 private API,现在开放出来,但是从文件来看,里头根本没有几行,既没有告诉你应该怎么用,也没有范例,你从 framework 里头寥寥四个 class 的 header 中,也搞不清楚,究竟可以把这个东西用在什么用途上。

目前只知道可以拿来做两件事情:1. 知道目前你这只 iPhone 用的是哪个电信商的服务;2. 知道现在 iPhone 是不是在打电话。

※ 电信商资讯

用 CTTelephonyNetworkInfo 与 CTCarrier 这两个 class,就可以取得电信商资讯,例如:

CTTelephonyNetworkInfo *info = [[CTTelephonyNetworkInfo alloc] init];
CTCarrier *carrier = info.subscriberCellularProvider;
NSLog(@"carrier:%@", [carrier description]);

倒出来的结果像是:

CTCarrier (0x140dc0) {

    Carrier name: [中国移动]
    Mobile Country Code: [466]
    Mobile Network Code:[92]
    ISO Country Code:[tw]
    Allows VOIP? [YES]
}

 

然后,如果你对 CTTelephonyNetworkInfo 喂一个 block 进去,像是:

info.subscriberCellularProviderDidUpdateNotifier = ^(CTCarrier *carrier) {NSLog(@"carrier:%@", [carrier description]);};

 

如 此一来,当你的 iPhone 漫游到了其他网路的时候,就会执行你这段 block,但光是知道手机现在漫游在哪个电信商的网路里头,大概能做的,就是一些跟电信商关系密切的服务之类,你或许可以决定软体里头有哪些功能,一定 要在某个电信商的网路才能用;电信商自己做 iPhone 软体的时候大概会想做这种事情。
※ 通话资料

用 CTCallCenter 与 CTCall 这两个 class,便可以知道目前 iPhone 是否在通话中。CTCallCenter 的用途是用来监控是不是有电话打进来、正在接听、或是已经挂断,而 CTCall 则是将每一则通话事件包装成一个物件。我们先写一小段程式-

CTCallCenter *center = [[CTCallCenter alloc] init];
center.callEventHandler = ^(CTCall *call) {
    NSLog(@"call:%@", [call description]);
};

然后,在实机上执行,接著打通电话到这支 iPhone 上,打通电话进去,然后马上挂断(人好端端的,干嘛为了测试程式跟自己的电话费帐单过不去呢?)就可以看到 iPhone 执行了我们的 block,把 CTCall 物件倒出来:

CTCall (0x143400) {
    callState: [CTCallStateIncoming]
    Call ID: [CE5F9337-1990-4254-8797-1CCEA85B061B]
}
CTCall (0x10bac0) {
    callState: [CTCallStateDisconnected]
    Call ID: [CE5F9337-1990-4254-8797-1CCEA85B061B]
}

 

CTCall 物件只有两个属性,一是通话状态(来电中、通话中…),二是这则通话的 unique id,除此之外没有其他资讯,你没办法知道这通电话是从哪里打来的,只能知道有电话进来而已,也没办法透过这个 API 打电话出去。

大抵上可以想到的用途,就是当你的程式执行到一半的时候,程式流程被电话打断,这时候就可能要中断原本正在做的事情,在通话结束之后恢复。

最后,CTCallCenter 与 CTTelephonyNetworkInfo,在模拟器上是没有办法用的,呼叫 alloc、init 之后回传的结果只会是 nil。

 

 

用xcode 5 开发访问IOS 7上面的通讯录问题

NSMutableArray *addressBookTemp = [NSMutableArray array];ABAddressBookRef addressBooks = ABAddressBookCreate();
CFArrayRef allPeople = ABAddressBookCopyArrayOfAllPeople(addressBooks);

CFIndex nPeople = ABAddressBookGetPersonCount(addressBooks);

 

 

这段代码在IOS6是可以读取通讯录的,但在IOS7下面就不行,程序没报错,调试时候发现返回的都是nil,有木有朋友遇到这个问题?

找到原因了,原来IOS7需要隐私验证,调用通讯录里面API需要以下代码作为权限认证:

 __block BOOL accessGranted = NO;
 if (ABAddressBookGetAuthorizationStatus() == kABAuthorizationStatusNotDetermined)
{
  ABAddressBookRequestAccessWithCompletion(addressBooks, ^(bool granted, CFErrorRef error)
 {
   // First time access has been granted, add the contact 
   accessGranted = granted; });
 }
 else if (ABAddressBookGetAuthorizationStatus() == kABAuthorizationStatusAuthorized)
 {
  // The user has previously given access, add the contact 
  accessGranted = YES;
 }
 else
 {
 // The user has previously denied access
 // Send an alert telling user to change privacy setting in settings app
 }

不过IOS6好像没有,希望对其他朋友有帮助 – sfdux 2013-09-24 11:12 回复

阐述制作优秀iOS游戏的14条法则

本文转自游戏邦:http://gamerboom.com/archives/34102

作者:Ziv Kitaro

很多人认为制作诸如《愤怒的小鸟》之类的畅销作品不是难事。从表面来看,《愤怒的小鸟》略显幼稚。描述游戏内容着实有些令人为难。玩家可用弹弓弹出系列彩色小鸟,瞄准被小猪占领的建筑,将小猪置于死地。

谈及游戏成功秘诀,很多人都会想到病毒式传播和画面效果,毕竟人人都能构思类似游戏内容,是吧?完全错误。优质不仅仅体现在杰出画面效果和音效。作品要想真正具有病毒扩散性,需具有优质内容。游戏就是产品,需经历系列制作流程,先是构思,最后才是真正的交易。

参考下述步骤,你或许无法制作出轰动巨作,但游戏定是款优秀作品。

1. 不要试图制作杀手级游戏。单压力就足以剥夺你的创造性,阻碍你踏上制作成功作品之路。目标很简单,就是给玩家创造优秀体验。这个体验包含系列元素:可玩性、可用性、故事内容、画面效果和音效。

2. 确定构思。其源自考量某特定用户群体。这或许是映入你脑海中的简单笑话。构思听起来有点无聊(游戏邦注:就像引导飞机着陆),但一旦成功落实,就会变成有趣内容(就像《机场空管》)。模仿未尝不可,但构思需足够强大,不要制作同他人相同的游戏。

3. 进行调查研究。设计就是艺术,但艺术家也得吃饭。把游戏打造成别具一格、错综复杂、史无前例、夸张无比的作品是个不错构想,但需确保其能够吸引用户眼球。观察App Store,阅读评论,获悉玩家偏好什么类型。

4. 集思广益。和普遍看法不同,集体讨论会议是个持续进行的活动。不要特别安排某段时间开展此活动,你需明白这是项目进展过程的一部分。例如,集体讨论如何把构想制作成作品,然后再共同讨论游戏规则。

5. 了解游戏法则。清晰把握游戏类型能够确保你不偏离轨道。这是款益智游戏?那么为何要设计第一人称射击游戏的关卡?这是款休闲易上手的游戏?那么为何要融入如此多控制装置?不妨参考《喷嚏泡泡》、《涂鸦跳跃》和《机场空管》:他们都是简单、休闲和特别的游戏内容。

6. 保持灵活性。游戏独立成型需耗费一定时间。若游戏不是简单谜题关卡,那么就不要将其打造成塔防游戏。制作过程分多个阶段,因此很多元素都会发生变化(游戏邦注:从可玩性到故事情节,从规则到游戏机制)。若这些改变能够完善游戏,那么就大胆进行。

7. 控制设置需配合iOS设备。触屏界面不同于实体控制装置。你也许会说,但很多开发商都在作品中融入虚拟按键装置。切勿这么做。你需把控制装置设置成游戏的有机组成部分,可以借助陀螺仪和指南针,就像《无尽之剑》,游戏使用手势进行攻击。

8. 融入幽默元素。幽默有助于提高游戏流行程度。PopCap原本只消制作简单僵尸塔防游戏。但植入植物作为防御武器就增加游戏愉悦气氛,掳获大量粉丝的芳心。《植物大战僵尸》中的幽默感影响其画面效果、音效、奖励级别和机制。

9. 把握游戏机制。这能够促使玩家反复回访游戏。不妨参考《极品飞车》。这是首款竞赛游戏,玩家在游戏中所要进行的操作就是倾斜iPhone控制汽车。玩家无需进行加速,汽车会以最快速度行驶,这是个合理设置。

10. 尽早进行测试。不要待程序员完成所有工作后才进行测试。从理想角度看,编写任何代码前都应体验游戏数次。怎么操作?去除不真实的画面,在你的Mac运作框架应用,使用橡皮泥制作游戏模型。那么对于游戏你将会有更深理解。

11. 把握故事情节。游戏故事无需是角色推动的叙述内容,情节无需跌宕起伏,结局无需潸然泪下。故事可以更简单,例如小鸟驱赶偷蛋小猪。故事元素能够调动玩家兴趣,提高游戏层次。

12. 创建游戏世界。一旦获悉故事内容,你就知晓游戏世界形态(游戏邦注:《The Lord of the Rings: Middle-Earth Defense》就是个典型例子)。《LotR》世界植入丰富建筑、角色和道具,将普通塔防游戏打造成蕴含魔力的游戏内容。

13. 观察GUI(图形用户界面)如何影响游戏法则。创建游戏后,反复体验数次,观察其在iPhone和iPad的运作效果,然后再步入GUI阶段。在此阶段,你需试验所有元素,直至确保内容能够流畅运作。有些元素需稍作调整,有时甚至包括游戏规则和机制。

14. 关卡设计。最后就是关卡设计,这是游戏的核心内容。其名称容易令人误解,因为甚至连在线多人游戏也有关卡设计,在此游戏中,玩家不是真正从某关卡移至下个关卡。所有关卡内容需协调一致,这样玩家才不会不知所措。《愤怒的小鸟》就是优秀关卡设计的典型例子。

(本文为游戏邦/gamerboom.com编译,如需转载请联系:游戏邦)

Create a killer app for iOS

by Ziv Kitaro

People imagine that it’s pretty easy to create a bestselling app like Angry Birds. On the surface, Angry Birds looks childish. Describing it is embarrassing. You get a few colourful birds that you slingshot at buildings occupied by pigs, with the aim of killing all the pigs.

When trying to understand its success, people think of viral marketing and graphics as the lead reasons – after all, anyone can come up with a game like that, right? Wrong. A good game has more to it than nice graphics and sound. To become truly viral your product actually has to be good. Games are products, and they have to go through a pipeline that begins with the concept and ends with the real deal.

Follow the steps below and you might not have the next bestseller, but you will have a good game.

1. Don’t try to create a killer game The stress alone will kill your creativity and prevent you from following paths that will eventually lead to a really successful game. The aim is simple – to create a good experience for the player. This experience consists of several elements: playability, usability, story, graphics, and sound.

2. Find a concept It can come from thinking about a specific audience. It can be a one-liner that pops into your head. Concepts can sound boring (directing airplanes to land), but once developed they can be amazing (like Flight Control). Copying is OK, but the idea must be strong and don’t build the same game as someone else.

3. Do your research Game design is an art, but artists need to eat. It’s great to create your special, intricate, never-before-seen, over-the-top game, but make sure you’ve got the numbers to support that. Check the App Store, read reviews and understand what types of games people pay for.

4. Keep on brainstorming Contrary to popular belief, a brainstorming session is an ongoing activity. Don’t schedule a limited time slot for this activity, you need to accept that it’s part of the process. For example, brainstorm on ideas that make the concept into a game, then brainstorm on game rules.

5. Know the game principles A clear vision of the genre will help you stay on course. Is it a puzzle game? Then why are you planning levels for a first-person shooter? Is it a casual, easy-to-learn game? Why are you adding so many controls? Look at Sneezies, Doodle Jump, Flight Control: simple, casual and specific games.

6. Be flexible There will come a time when the game takes on a life of its own. If the game would be better as a riddle-based quest, don’t force it to be a tower defence. There are many stages that will change everything from playability to story, from rules to game mechanics. If these changes serve the game, make them.

7. Match the control to the iOS Touch interface is different to physical controllers. Obviously, you might say, yet many developers add virtual push buttons to their games. Don’t do that. Make the control an organic part of the game – use the gyroscope, and compass – like Infinity Blade, which uses gestures for attacks.

8. Use humour Humour has a great effect on the popularity of a game. PopCap could have created a simple Zombie-based tower defence. Adding plants as a defence weapon makes the game lighthearted, and opens it up to millions. The humour in Plants vs. Zombies influences the graphics, sound, bonus stages and mechanics.

9. Know the game mechanics This is what makes players return to the game again and again. Look at Need for Speed Undercover. It was the first racing game in which all a player had to do was to tilt the iPhone to steer the car. There was no need to accelerate, the car moved as fast as it could and this makes sense.

10. Start testing ASAP Never wait for the programmers to finish before testing. Ideally, you should have played the game several times before any code is written. How? Cut out cardboard images, use a wireframe application on your Mac, create the game out of playdough. You will have a better understanding of it.

11. Know the story The story of the game doesn’t have to be a character-driven narrative with twists and turns and an ending that brings tears to players’ eyes. It can be far simpler – birds dispatching pigs for stealing their eggs, for example. A story creates interest for the players and kicks a game up a notch or two.

12. Build the world Once you know the story, you know what the world looks like. The Lord of the Rings: Middle-Earth Defense is a great example, as it’s still no more than a tower defence game. The LotR world gives us rich architecture, characters, and units that change the generic tower defence game into something magical.

13. See how GUI affects principles After creating the game, play it a few times and see that it works on the iPhone and iPad, before going into the GUI stage. This is where you actually move all the elements around until you’re sure that the game-flow works. Certain elements will have to change, and even rules and mechanics.

14. Reach for the skies Last comes level design – the heart of the game. The name is misleading as level design exists even in online multiplayer games, where players don’t really move from one level to the next. Each level must be balanced so that players aren’t overwhelmed. Angry Birds is a prime example of good level design.(Source:macworld

几个提高 iOS 开发效率的开源类库及工具

转自 CocoaChina 会员 “花太香齐” 的博客

几个常用的开源类库及下载地址:

  1. jsonjson编码解码
  2. GTMBase64base64编码解码
  3. TouchXMLxml解析
  4. SFHFKeychainUtils安全保存用户密码到keychain中
  5. MBProgressHUD很棒的一个加载等待特效框架
  6. ASIHTTPRequesthttp等相关协议封装
  7. EGORefreshTableHeaderView下拉刷新代码
  8. AsyncImageView异步加载图片并缓存代码
  9. 类似setting的竖立也分栏程序

AppStore软件排名相关,工欲善其事,必先利其器。

  1. 下载排名相关:appanniehttp://developer.cocoachina.com/brand
  2. 用户行为分析:flurry
  3. majicrank-各国排名查询工具
  4. AppViz-App销售统计软件
  5. PodViz-用户评论等查看工具
  6. appfigures-报表统计分析工具

苹果i系列产品的操作系统:iOS

iOS是由蘋果公司為 iPhone 開發的操作系統。它主要是給 iPhone、iPod touch、iPad 以及 Apple TV 使用。就像其基於的 Mac OS X 操作系統一樣,它也是以 Darwin 為基礎的。原本這個系統名為 iPhone OS,直到 2010 年 6 月 7 日 WWDC 大會上宣布改名為 iOS。 iOS的系統架構分為四個層次:核心操作系統層(the Core OS layer),核心服務層(the Core Services layer),媒體層(the Media layer),可輕觸層(the Cocoa Touch layer)。系統操作佔用大概240MB的記憶體空間。

2011年2月2日,苹果已经发布了其 iOS4.3 beta3 预览版。

更详细的信息,请到Wiki上浏览:http://zh.wikipedia.org/zh/IOS