设置标签 ‘iPhone’

招聘 高级iPhone开发者 工作地点:美国

在Redmond,这是哪儿,你知道的哦 :)

  • 要求对iPhone开发有相当的经验,你明白我说的“相当”的分量 :) 如果你感觉跟我差不多,那就够了,要是比我强那绝对没问题
  • 要求英文听说能力强,估计做iPhone的英语应该都不会太差
  • 熟悉各种网络协议更有优势
  • 熟悉多媒体音视频更有优势
  • 工作需要长期待在美国,公司移民律师帮你办理工作签证
  • 待遇非常优厚,非国内能比
  • 想带男/女朋友去的可能会比较麻烦,发简历之前你想清楚
      

伙计们,有兴趣的发简历给我!邮件地址 hr[at]imi.im

UniT for iPhone (1.0正式版已经提交AppStore审察,9月6日更新)


Title.png

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

1.png IMG_0003.PNG

IMG_0003.PNG IMG_0004.PNG

-----------9月2日更新-----------

增加 人人网支持
增加 Twitter OAuth支持
增加 自动侦测粘贴板

修复 Twitter 8月31日后不能发布bug

-----------8月29日更新-----------

1.0快要成型了!!!!!

网站设计快要完成了 :) 到时候UniT就有个家了

  • 增加 动画效果 设置
  • 增加 自动更新 设置 (有新版本会自动提醒 而不用再去我网站刷了, 包括以后AppStore上架后, 会自动去更新)
  • 增加 繁体中文

  • 修复 状态栏提醒 (实时显示发送情况等, 显示电池的地方)
  • 修复 Tab前后切换用户体验

  • 改变 编辑框如果里边有文字的情况不加动画
  • 改变 UI细节更新

  • 感谢国家
  • 谢谢 @JackieQi @weilianxiaoyang
  • 谢谢所有人, 没想到大家这么支持我 :)
  1. 大家都在说 腾讯微博/人人网 我打算在正式版上线后再加上 (很快了)
  2. 如果大家觉得有必要的话 我建个QQ群?? (晕, 我不会建)

-----------8月26日更新-----------

第一个测试版 0.9.4 刚出炉的, 热乎的

ipa格式, 大家知道怎么装吧 :) (我说的不是B)

第一次拿出东西来现眼, 不要嘲笑 :) 现在还有很多工作要做, 感觉1.0的目标现在只实现了60% 但是, 这个程序最后肯定会是一个全能,通用的客户端.

已知问题:

  1. 状态栏提醒失效. (就是现实电池状态地方的那个小云彩, 本来好好的, 但是一到真机上就不灵了) 不能显示提醒信息, 但是后台的工作是正常的, 所以点了发送没见反应, 可能已经发送成功了. 不过最近两天我会修复这个问题
  2. 1代和2代设备上的动画效果有一点点卡, 所以我会在设置里加一个动画效果开关.
  3. 人人网/做啥 没有同步成功, 先暂时屏蔽他们了(只是暂时).

-----------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的状态栏可以设置成半透明, 这是众所周知的, 用UINavigationController,在页面切换时, 如果你的子viewController的view是全屏的(480*320) 就会出现错位, 表现是所以的子view会向下偏移了 20像素 (就是状态栏的高度).

我搜索了好长时间也没有找到答案, 于是自己去看官方文档, 结果发现了这个方法, 这是UIViewController的一个属性.

wantsFullScreenLayout

看字面意思就很好理解(苹果的方法名都很好理解, 还是带时态和语法的 很人性化), 就是”我要全屏布局” 这样错位的问题就解决了

把UIView覆盖到状态栏上的方法

Reeder

View In iTunes

最近iPhone上的一个新闻阅读软件 Reeder 更新了, 非常好用, 稳定,而且速度飞快. 用了之后 我立马就把原来的 Byline 删除了.

这个软件征服我这个吹毛求疵的人的一个地方, 其实在于一个小细节, 有了这个细节, 我觉得, 这软件值了!

这个细节就是系统状态栏图标, 从来没有一个程序在状态栏上做文章, Reeder 做到了, 新闻的刷新, 图片加载, 在系统状态栏上显示, 显得非常的苹果味道, 如图:

IMG_0177.png

当然, 本文是讨论技术, 不是软件评测.

国外好多论坛上在问这个问题,但答案都是需要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

防止你的iPhone程序遭盗版(入门篇)

先澄清一下, 我也是盗版用户(先自己抽两嘴巴, 但是我已经花了$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条都没挡住丫挺的步伐, 请等我出高级篇吧 :) 恭喜发财!

防止文字变模糊的小窍门

今天忽然想起来这个窍门,而且还是做Flash的时候得来的, 给大家说一下. 有时候, 我们在放置一个UILable 或者 TextView或者任何带文字的控件的时候, 很可能出现的一种情况就是, 发现文字变模糊了.

问题出在哪儿? 就是这个控件的坐标的问题, 很简单, 把控件的center的x,y值取整就解决了. 之前做过AS的应该都知道这个是文字渲染的问题, 我做iPhone后第一次遇到这个情况的时候想也不想的就取整了, 果然问题也解决了

保持WIFI在锁屏后仍然连接的方法

iPhone WIFI
Google了一下发现此方法不常被提到,甚至在这儿给出了非官方SDK的做法。
其实方法很简单。
每个app都有一个info.plist 我们只需要在里面加一个键值就可以实现: 阅读全文

iPhone 固件 3.1.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

Page 1 of 41234
回到顶部

关于我:

  • iPhone 开发者. 自由职业者.
  • 苹果忠实用户. 完美主义者.
  • Email/iChat/MSN/GTalk: i@imi.im
  • Twitter/Sina: @TraWor
  •  

    Switch to our mobile site