招聘 高级iPhone开发者 工作地点:美国
- 八月 23rd, 2010
- 进行评论
设置标签 ‘iPhone’

UniT (Universal Twitter),t现在不止代表Twitter了,还代表着微博,t.sina…/t.ifeng…/t.sohu…, 所以,这是一个通用的微博客户端,支持 Twitter, 新浪微博,搜狐微博,嘀咕,雷猴,人人网,将要支持腾讯微博…(只是将要,没最后确定)
程序主页: http://unit.imi.im (建设中,马上就好,开始的图就是一个截图)
Twitter : @trawor
新浪微博: http://t.sina.com.cn/trawor
下载地址: http://cl.ly/2Dtr


-----------9月2日更新-----------
增加 人人网支持
增加 Twitter OAuth支持
增加 自动侦测粘贴板
修复 Twitter 8月31日后不能发布bug
-----------8月29日更新-----------
1.0快要成型了!!!!!
网站设计快要完成了 :) 到时候UniT就有个家了
-----------8月26日更新-----------
第一个测试版 0.9.4 刚出炉的, 热乎的
ipa格式, 大家知道怎么装吧 :) (我说的不是B)
第一次拿出东西来现眼, 不要嘲笑 :) 现在还有很多工作要做, 感觉1.0的目标现在只实现了60% 但是, 这个程序最后肯定会是一个全能,通用的客户端.
已知问题:
-----------8月15日更新-----------
先声明一下,由于时间有限,第一个milestone(9月上线的),我只打算把精力放在雕琢群发功能上,而接收,转发,评论则放在第二个milestone(可能要等一个月时间)。
明天就是8月16日,一个特殊的日子。twitter将要停止对简单密码验证的支持。到时候可能绝大多数twitter客户端api支持都将要失效。我现在已经能用oAuth通过代理来验证了,只是还需要,更多的调试来全面支持twitter。不过我会尽快让大家用上,至少能发出去。
另外,可能会在8月25日左右开始内测,如果想要帮忙测试的朋友,请给我发邮件或者留言。iPod和1代iPhone最好,因为我现在只有3Gs和iPad,好多性能问题测不出来。
更新图:(这里面有好多的动画效果,截图体现不出来,等功能完备了后我回做一个录像)
可以有选择的对已经绑定的帐号进行更新(那个对勾)。
-----------分割线--------------
好长时间没有更新了。一直忙,忙里偷闲,UniT for iPhone 即将上线。现在正在赶工。赶归赶,但是我一直抱着完美的心态去做,所以,质量不会受影响。从像素级的美工,到字母级的代码(晕,没这么表达过),到任何细节(很快会有更多细节公布)。我不是一个人在战斗!(还有我女朋友 Popeye)。
UniT (Universal Twitter),t现在不止代表Twitter了,还代表着微博,t.sina…/t.163…/t.sohu…, 所以,这是一个通用的微博客户端,将要支持 Twitter, 新浪微博,搜狐微博,嘀咕,雷猴,人人网,(只是将要,没最后确定)
估计程序会在8月底完工,现在只完成了30%,计划9月初上线。还有,程序免费!!
如果大家有什么好的建议和对这个程序的要求(如果你的要求被采用,在制作人员/感谢里面,会出现你的名字 *_^ ),或者要提前尝鲜的,请给我留言。
这是所有做电子书之类的程序都会遇到的一个问题. 前一阵搞一个项目, 花了3天时间搞这个小方法, 总是分页不够精确. 谢谢CCLV@CocoaChina 在老婆生病的时候还给我提供帮助 :) 最后我发现了问题所在: 要用UILabel来显示文字, 而不是TextView!!
我发现盛大起点中文的电子书app还存在分页不准的问题, 李博 要努力噢 哈哈~~
大体思路就是,把字符串分段落, 用段落去填充页. 下面是这个小方法, 希望会对大家有帮助:
-(NSArray*)getPagesOfString:(NSString*)cache withFont:(UIFont*)font inRect:(CGRect)r{
//返回一个数组, 包含每一页的字符串开始点和长度(NSRange)
NSMutableArray *ranges=[NSMutableArray array];
//断行类型
UILineBreakMode lineBreakMode=UILineBreakModeCharacterWrap;
//显示字体的行高
CGFloat lineHeight=[@"Sample样本" sizeWithFont:font].height;
NSInteger maxLine=floor(r.size.height/lineHeight);
NSInteger totalLines=0;
NSLog(@”Max Line Per Page: %d (%.2f/%.2f)”,maxLine,r.size.height,lineHeight);
NSString *lastParaLeft=nil;
NSRange range=NSMakeRange(0, 0);
//把字符串按段落分开, 提高解析效率
NSArray *paragraphs=[cache componentsSeparatedByString:@"\n"];
for (int p=0;p< [paragraphs count];p++) {
NSString *para;
if (lastParaLeft!=nil) {
//上一页完成后剩下的内容继续计算
para=lastParaLeft;
lastParaLeft=nil;
}else {
para=[paragraphs objectAtIndex:p];
if (p<[paragraphs count]-1)
para=[para stringByAppendingString:@"\n"]; //刚才分段去掉了一个换行,现在换给它
}
CGSize paraSize=[para sizeWithFont:font
constrainedToSize:r.size
lineBreakMode:lineBreakMode];
NSInteger paraLines=floor(paraSize.height/lineHeight);
if (totalLines+paraLines<maxLine) {
totalLines+=paraLines;
range.length+=[para length];
if (p==[paragraphs count]-1) {
//到了文章的结尾 这一页也算
[ranges addObject:[NSValue valueWithRange:range]];
//IMILog(@”===========Page Over=============”);
}
}else if (totalLines+paraLines==maxLine) {
//很幸运, 刚好一段结束,本页也结束, 有这个判断会提高一定的效率
range.length+=[para length];
[ranges addObject:[NSValue valueWithRange:range]];
range.location+=range.length;
range.length=0;
totalLines=0;
//IMILog(@”===========Page Over=============”);
}else{
//重头戏, 页结束时候本段文字还有剩余
NSInteger lineLeft=maxLine-totalLines;
CGSize tmpSize;
NSInteger i;
for (i=1; i<[para length]; i++) {
//逐字判断是否达到了本页最大容量
NSString *tmp=[para substringToIndex:i];
tmpSize=[tmp sizeWithFont:font
constrainedToSize:r.size
lineBreakMode:lineBreakMode];
int nowLine=floor(tmpSize.height/lineHeight);
if (lineLeft<nowLine) {
//超出容量,跳出, 字符要回退一个, 应为当前字符已经超出范围了
lastParaLeft=[para substringFromIndex:i-1];
break;
}
}
range.length+=i-1;
[ranges addObject:[NSValue valueWithRange:range]];
range.location+=range.length;
range.length=0;
totalLines=0;
p–;
//IMILog(@”===========Page Over=============”);
}
}
return [NSArray arrayWithArray:ranges];
}
如果您有更好的方法, 希望不吝赐教 :)
最近iPhone上的一个新闻阅读软件 Reeder 更新了, 非常好用, 稳定,而且速度飞快. 用了之后 我立马就把原来的 Byline 删除了.
这个软件征服我这个吹毛求疵的人的一个地方, 其实在于一个小细节, 有了这个细节, 我觉得, 这软件值了!
这个细节就是系统状态栏图标, 从来没有一个程序在状态栏上做文章, Reeder 做到了, 新闻的刷新, 图片加载, 在系统状态栏上显示, 显得非常的苹果味道, 如图:

当然, 本文是讨论技术, 不是软件评测.
国外好多论坛上在问这个问题,但答案都是需要Private API之类的,无法上Store的方法. 但是Reeder怎么可以? 我也得可以才行 :) ,经过一段时间的琢磨, 我知道了这个实现方法, 分享给大家.
方法的原理就是, 生成一个新的UIWindow, 把这个Window放在状态栏之上! 其实这个效果早在2.0的时候就能实现, 只是我们这些不求甚解, 学习不扎实的人没有注意到罢了.
那具体怎么做, 我先卖个关子, 大家自己根据这思路研究一下, 其实, 很简单, 很简单, 我几天后公布答案 :) 不要抢答噢 嘎嘎~~~
——————————–
公布答案:
首先 继承 UIWindow, init的方法: 关键的语句 self.windowLevel=UIWindowLevelAlert;
- (id) init
{
CGRect f=[[UIScreen mainScreen] bounds];
CGRect s=[[UIApplication sharedApplication] statusBarFrame];
self = [super initWithFrame:CGRectMake(0, 0, f.size.width, s.size.height)];
if (self != nil) {
self.windowLevel=UIWindowLevelAlert;
self.backgroundColor=[UIColor clearColor];
[self makeKeyAndVisible];
}
return self;
}
现在 在这个window添加view 就会覆盖到状态栏上了, 你猜对了么??
作为一名iPhone开发者, 你需要对你的用户安全负责. 请问, 你是怎么保存用户的密码的?
直接保存到plist里?
加密? AES? DES? 能保证你的代码不被反编译拿到你的加密Key?
这也未免太不苹果了吧. 我Google了一下, 国内的开发者根本没有注意到这个问题.
苹果系统中有个程序叫”钥匙串” (Keychain), 它不仅仅是你申请开发证书用的, 哈哈. 它可以存密码!
这也是苹果给出的保存密码的最佳解决方案.
iPhone中也有Keychain, 用过PushFix破解包(就是那个修复推送的小工具)的国内iPhone破解用户应该还有印象.
用原生的Security.framework就可以实现钥匙串的访问, 读写, 但是只能在真机上进行, 模拟器会出错. 在Github上, 有个封装的非常好的类 来实现这个功能, 让你既能在模拟器又能在真机上访问钥匙串.
//获取密码+ (NSString *) getPasswordForUsername: (NSString *) username andServiceName: (NSString *) serviceName error: (NSError **) error;
//保存密码+ (void) storeUsername: (NSString *) username andPassword: (NSString *) password forServiceName: (NSString *) serviceName updateExisting: (BOOL) updateExisting error: (NSError **) error;
//删除密码+ (void) deleteItemForUsername: (NSString *) username andServiceName: (NSString *) serviceName error: (NSError **) error;
类的地址: http://github.com/ldandersen/scifihifi-iphone/tree/master/security
先澄清一下, 我也是盗版用户(先自己抽两嘴巴, 但是我已经花了$200买app, 买觉得值得的程序, 而不是apple推崇的冲动式购买, 装盗版是先预览一下这个程序是不是值得买). 在中国做软件, 想不被盗版, 不太现实.
不想自己辛辛苦苦写出来的程序被盗版? 接着看.
首先简单介绍一下原理:
现在大多数的破解苹果验证安装app的办法都会动一个文件, 就是在.app文件夹下的”Info.plist”, 也就是那个程序信息文件.
代码很简单, 不再详细解释什么意思了
1. 检查Info.plist 是否存在 SignerIdentity这个键名(Key).
未破解的程序是不会有这个键名的, 苹果没给你加, 你自己没有加, 如果有, 那是哪儿来的呢?? 嘻嘻….
if ([[[NSBundle mainBundle] infoDictionary] objectForKey: @”SignerIdentity”] != nil) {
// 这就是被破解过的app
}
2. 检查3个文件是否存在
NSString* bundlePath = [[NSBundle mainBundle] bundlePath];
BOOL fileExists = [[NSFileManager defaultManager] fileExistsAtPath:(@”%@/_CodeSignature”, bundlePath)];
if (!fileExists) {
// 这就是被破解过的app
}
BOOL fileExists2 = [[NSFileManager defaultManager] fileExistsAtPath:(@”%@/CodeResources”, bundlePath)];
if (!fileExists2) {
/// 这就是被破解过的app
}
BOOL fileExists3 = [[NSFileManager defaultManager] fileExistsAtPath:(@”%@/ResourceRules.plist”, bundlePath)];
if (!fileExists3) {
// 这就是被破解过的app
}
3. 对比文件修改时间是否一致, 看看你的程序是不是被二进制编辑器修改过了
NSString* bundlePath = [[NSBundle mainBundle] bundlePath];
NSString* path = [NSString stringWithFormat:@"%@/Info.plist", bundlePath];
NSString* path2 = [NSString stringWithFormat:@"%@/程序名字", bundlePath];
NSDate* infoModifiedDate = [[[NSFileManager defaultManager] fileAttributesAtPath:path traverseLink:YES] fileModificationDate];
NSDate* infoModifiedDate2 = [[[NSFileManager defaultManager] fileAttributesAtPath:path2 traverseLink:YES] fileModificationDate];
NSDate* pkgInfoModifiedDate = [[[NSFileManager defaultManager] fileAttributesAtPath:[[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:@”PkgInfo”] traverseLink:YES] fileModificationDate];
if([infoModifiedDate timeIntervalSinceReferenceDate] > [pkgInfoModifiedDate timeIntervalSinceReferenceDate]) {
//Pirated
}
if([infoModifiedDate2 timeIntervalSinceReferenceDate] > [pkgInfoModifiedDate timeIntervalSinceReferenceDate]) {
//Pirated
}
如果以上3条都没挡住丫挺的步伐, 请等我出高级篇吧 :) 恭喜发财!
苹果刚刚公布了iPhone固件 3.1.3版,可应用于iPhone和iTouch,本次更新主要修正了 iPhone 3GS的电池电量精密度问题,并且修复了日文Kana键盘崩溃的问题。
详细的更新如下:
• 改进 3GS 的电池精密度问题
• 加快第三方程序的开启速度
• 修复日本键盘bug引起的程序崩溃
大概 300M 估计改动不小啊!
最讨厌的是 官方没给下载地址 只能iTunes升级….
还有点 4.0 的小道消息:
1.这是一个大范围使用多点触摸的版本(iPad)
2.许多新的应用程序运行方法出现,包括后台运行 — 也就是多任务
3.图形和UI上的改进是iPhone OS发布以来最大的,一个全新的主屏也会让您眼前一亮,让iPhone的整体操控和导航都更有效率。
4.只能用于iPhone 3G、3GS等高版本的iPhone,可能一部分一代用户感到很沮丧,但这是技术的进步。iPhone OS 4.0让iPhone越来越像一台全功能的电脑。
5.可能会提供更棒的联系人和日程同步能力,我们估计应该是在Wifi环境下的同步改进, 当然我们也可以小小的期望一下最好是无线同步iTunes。