plist保存问题

问题描述
今天做Denizen Box,需要收集用户资料,用[NSDictionary writeToFile: atomically:]方法保存。模拟上此函数成功,返回true;真机上此函数失败,返回false。

问题分析
代码如下:

NSString *plistPath = [[NSBundle mainBundle] pathForResource:@"data" ofType:@"plist"];
bool result=[addDictionary writeToFile:plistPath atomically:YES];

代码没有变化,而真机就是写入不了,猜想是权限问题。

问题解决
把代码改为:

NSArray *storeFilePath = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *doucumentsDirectiory = [storeFilePath objectAtIndex:0];
NSString *plistPath=[doucumentsDirectiory stringByAppendingPathComponent:@"data.plist"];
bool result=[addDictionary writeToFile:plistPath atomically:YES];

问题解决了。

事后发现,路径不一样:
修改前:

/var/mobile/Applications/A528A4DE-F391-4247-8C5D-9386DC415A00/Box.app/data.plist

修改后:

/var/mobile/Applications/A528A4DE-F391-4247-8C5D-9386DC415A00/Documents/data.plist

《魔术师》

看完整部片子才知道作者要讲的是父爱。

官网:http://www.lillusionniste-lefilm.com/

故事发生在50年代末,正当年轻人的摇滚乐横扫秀场,帕斯帕斯,一个年老的法国魔术师渐渐失去了观众,生计难以为继。他带着道具和一只小兔子到伦敦碰运气,却依旧没有观众,直到偶然的机会来到苏格兰高地上一个偏远的小镇。娱乐稀少的小镇居民热烈欢迎魔术师的到来,更是在这里,帕斯帕斯碰到了他一生中最后一个观众,孤女爱丽丝。爱丽丝相信魔术是真的,相信魔术师可以变出任何想要的东西,当帕斯帕斯离开小镇的时候,爱丽丝瞧瞧跟着他上了船。在爱丁堡,他们住进了最简陋破旧的旅社,同住的都是些穷困潦倒的艺人。魔术师勉强靠演出维持生计,可是爱丽丝爱上了玻璃橱窗里的美丽衣裙和鞋子,并且要魔术师变给她。不会说英文的魔术师在演出的空档尝试了各种卑微的工作,给爱丽丝买了她所有喜欢的东西——却总是以魔术的形式变给她,从来没有戳破她那个相信魔术的梦。而他的回报,就是爱丽丝开心的笑脸和甜甜的吻。魔术师很满足,虽然有时候,他会看着一张照片沮丧。直到有一天,魔术师发现爱丽丝不见了,发了疯似的寻找她,终于撞见她和一个英俊的男孩手挽手走在一起。帕斯帕斯明白女孩找到了依赖的人。于是,他留下钱给女孩,还有一张字条:魔术师不存在,就这样像魔术一样“消失”。电影的结尾,那张总是让魔术师黯然神伤的照片终于清清楚楚的放在观众面前:一个小女婴,魔术师不知所终的女儿。所有的故事都缘起自魔术师对自己女儿没能完成的爱,如果说电影里有什么了不起的魔术,那也正是这份爱。

这是一部向法国最伟大的喜剧大师雅克·塔蒂致敬的片子。原剧本是雅克·塔蒂本人于1956年创作的一个鲜为人知的作品,被认为那是写给他当时才十几岁的私生女海尔格(Helga Marie-Jeanne Schiel)的一封特殊的信。这个剧本一直没有被搬上荧幕,是因为塔蒂本人认为片子蕴含太多私人情绪,隐晦而且让人感到不愉快。塔蒂与妻子米谢琳·温特的女儿索菲(Sophie Tatischeff)认为除了他的父亲塔蒂先生没人可以更好的演绎出这个片子。2000年,索菲将这个剧本交给了当时靠着处女短片杀入奥斯卡最佳动画短片、正在制作Les Triplettes de Belleville (美丽都三姐妹)、并且是默片粉丝的法国动画导演Chomet手中。他们之间的认识源于Chomet向索菲寻求剪辑使用一段塔蒂在电影Jour de fête(节日)中的片段,索菲提出一个建议,让Chomet制作一个动画中的tati,她不希望任何人来演绎他的父亲。不久索菲与世长辞,而私生女海格尔作为长女成为塔蒂唯一在世的直系亲属。

不同SDK对pathForResource函数兼容问题

问题描述
前些天做AD iPad版,程序在4.2版本的iPad上运行良好,但是安装到3.2版本的iPad上有些功能点load不出。

问题分析
设置断点,一步一步跟踪,查找到:

// init position
NSString *plistPath = [[NSBundle mainBundle] pathForResource:[NSString stringWithFormat:@"%d/feature_point",[self getPage]] ofType:@"plist"];
_positions=[[NSDictionary alloc] initWithContentsOfFile:plistPath];

以上代码plistPath值为空,查找这句中所有的语句的SDK支持,都只要SDK2.0,而我们是3.2,完全符合。

问题解决
一步一步排除,最后焦点在pathForResource: ofType:函数,查找SDK的时候发现另有一个函数是pathForResource: ofType: inDirectory:函数,把该句改为:

NSString *plistPath = [[NSBundle mainBundle] pathForResource:@"feature_point" ofType:@"plist" inDirectory:[NSString stringWithFormat:@"%d",[self getPage]]];

问题解决了!!!

Project Settings的设置bug

问题描述
帮客户的iPad安装AD demo,机器SDK是4.2.1,客户iPad SDK是3.2,直接developer debug不成功。

问题分析
把“Project Settings”的"Build"选项卡里的"Base SDK"设置为"Latest iOS"(最高),并把"iOS Deployment Target"设置为"iOS 3.0"(最低)。

问题解决
网上查了下,看到一老外的解决办法,如下:

I believe the only requirement is that you edit and resave the info.plist file. I editted to 1.7, saved, and then back to 1.0 and it worked fine.

It may be that XCode is binding in additional details from the build settings at the time of packaging and since the info.plist hadn't changed those additional bindings did not get attached. If this is the case I would consider it a bug.

我也认为是一个iOS的Bug,只有修改info.plist才会导致project settings设置生效。