Author Archives: xhan - Page 2

用AppleScript设置Adium的状态信息

找了下找到个比较挫的办法

tell application "Adium"
	go away with message "Busy"
end tell

但是必须指定鸭子的状态, 最后翻了下文档自己写了段测试成功:

tell application "Adium"
	set the title of every status to "funny"
	set the status of every account whose status type is not offline to the first status whose title is "funny"
	#   也可以这么写
	#	repeat with state in every status
	#		set title of state to "come on baby"
	#	end repeat
end tell

也许下版本 LessDJ 会多个同步歌曲信息到 鸭子状态的功能 :D

对了 LessDJ 上线一周下载2000多次了, 但最近状态低迷, 需要些时间来添加新功能.

iOS5不支持gmail推送的解决方法

iOS5后苹果居然不支持gmail的推送了。找到个解决方法:

  1. 删除原有的Gmail账户
  2. 添加新邮件账户,选择 Exchange (不是gmail)
  3. 输入 email, username(还是邮件名),passcode
  4. 接下来会提示输入服务器 m.google.com
  5. 验证后即重新支持推送了!
遗留问题:此方法不支持gmail的存档功能
资料来源:
1.installed IOS5, bye-bye gmail push
2.Setting up Google Sync with IOS

1955-2011

是时候在这些照片后面加上乔帮主了。

附广告中的诗词全文

Here’s to the crazy ones.

The misfits.
The rebels.
The troublemakers.
The round pegs in the square holes.

The ones who see things differently.
They’re not fond of rules.
And they have no respect for the status quo.

You can quote them, disagree with them, glorify or vilify them.
About the only thing you can’t do is ignore them.
Because they change things.
They push the human race forward.

And while some see them as the crazy ones,
We see genius.
Because the people who are crazy enough to think
they can change the world,
Are the ones who do.

向那些疯狂的家伙们致敬。

那些我行我素的家伙。
那些桀骜不驯的家伙。
那些惹事生非的家伙。
那些方孔中的圆桩。

他们总是异想天开,
既不喜欢循规蹈矩,
也不尊重既成事实。

你尽可以赞美他们,否定他们,引用他们,
质疑他们,颂扬抑或是诋毁他们。

不过惟独不能漠视他们。
因为他们进行着变革。
他们推动着人类的进程。

他们是别人眼里的疯子,
却是我们眼中的天才。

因为,只有疯狂到认为
自己能够改变世界的人,
才能真正做到这一点

向乔帮主致敬,你是我永远的精神领袖。

你是享有如此成就却仍然燃烧到最后一刻的伟人。
很庆幸能亲眼见证你的年代。
很庆幸能亲手体验到你的产品对我们生活产生的巨大改变。
很庆幸留给我们巨大的财富,作为开发者我们能在你的世界里继续寻找未来,追逐自己的梦想。

Thanks Steve!

-send from my macbook air

ObjC中URL编码

NSString类已经中提供了现成的API:

/* Adds all percent escapes necessary to convert the receiver in to a legal URL string.
  Uses the given encoding to determine the correct percent escapes (returning nil if
the given encoding cannot encode a particular character).  See
CFURLCreateStringByAddingPercentEscapes in CFURL.h for more complex transformations
*/
- (NSString *)stringByAddingPercentEscapesUsingEncoding:(NSStringEncoding)enc;

但是非常重要的一点苹果没注明:该API并不会将”& + -”等需要转义的字符编码。
如若将需要传递的某个param的内容通过该API来转义就可能坑爹了!!你内容中的&=不会被转义,服务端就会把原来的内容根据&和=拆开成一片一片了!!

解决方法是使用介绍中提到的CFURLCreateStringByAddingPercentEscapes

@implementation NSString (URLEscaped)
- (NSString *)URLEscaped {
	CFStringRef escaped = CFURLCreateStringByAddingPercentEscapes(NULL, (CFStringRef)self, NULL, (CFStringRef)@"!*'();:@&=+$,/?%#[]",
			 kCFStringEncodingUTF8);
	NSString *out = [NSString stringWithString:(NSString *)escaped];
	CFRelease(escaped);
	return [[out copy] autorelease];
}

需要注意的是不能将这个函数用来 encode 整个URL,而是params的内容


写这篇文章是因为自己也掉了这个大坑,而且半年后才注意到。惨吖,不知道收集的10多w条数据中有多少是内容破坏的 – -

LessLyrics 重启

原谅4月份时候的大放厥词 “LessLyrics歌词秀后续计划

今天写这文章时才发现居然又过去了5个月。这几个月里辞去了百度的工作,和朋友们开始了全新的创业之路,断断续续的也就选择性的忘记了这个升级计划。

当然还有2个原因,计划的0.8版本中无缝滚动动画效果依赖非常精确的iTunes播放时间,但是能取到最小的间隔是1秒,所以处理起一些细节会比较麻烦。但是呢从当时的预览视频可以看到其实当时完成度已经很高了,在我开心的向datou炫耀这个超级华丽无缝歌词滚动动画效果,结果datou研究了很久后,说了句。不好。

虽然不愿意承认这么帅气的效果被否决,但仔细想确实有很大的问题。无缝滚动效果会导致整个界面一直处于动画中,当前高亮播放中的歌词也一直在逐渐向上滚动,会导致使用者为了fo这行歌词一直让眼球向上扫描,接着目光聚集到下面的歌词,然后又继续向上扫。看久了就会觉得挺累。

昨天在我们的app内测qq群中有用户问要显示歌词的软件。我赶紧推荐了LessLyrics,结果人家居然说,居然说,说:“这个app早就知道了!!我想要iPhone版本的”

于是我爽到现在,于是决定必须立刻重新启动LessLyrics软件计划了!

新的0.8版本没增加太多的功能,因为迫不及待要发布新版本收集下反馈。这次完全重写了app的设计结构和渲染模块(现在看1年前刚学习mac开发的代码真的很戳),接下来的添加新功能就方便了。

不用期待,几小时内发布。

哈哈哈哈哈哈哈哈哈哈哈哈哈哈。

下载请移步至 项目页面

[iOS]设置界面快速生成脚手架介绍

写iOS程序最讨厌的就是写个如下图的设置界面 或 登陆(注册)界面了

这完全是体力活,没头脑,还得在cell里加入一大堆控件。同时由于tableview的重用机制,导致必须每次都得对各个控件设置属性,防止出现内容错误。

虽然iOS5中增加了新的静态tableview类型,可等它普及估计至少要半年,还是早些其他解决方法为妙。

目前有两个开源的代码能完成类似的功能

InAppSettingsKit

原来是将苹果app外部的setting.bundle在程序内部显示用的开源库。现在也提供了快速搭建脚手架的功能

地址 https://github.com/futuretap/InAppSettingsKit

QuickDialog

QuickDialog allows you to create HIG-compliant iOS forms for your apps without having to directly deal with UITableViews, delegates and data sources. Fast and efficient, you can create forms with multiple text fields, or with thousands of items with no sweat!

刚发现的,看起来比InAppSetting方便,未测试使用过~

地址 https://github.com/escoz/QuickDialog/

[iOS] In App Purchase 坑爹啊

原来计划几个小时内加个IAP功能,结果一天过去了,还没搞定。无奈的刷机中。

搜索了下IAP是个超级大坑,各种奇怪的问题,而且苹果没一份完整的文档解释可能出现的情况。于是有人根据回馈总结了这么个表格

To save you the pain of exhaustively searching the web for the cause of your error, here is a checklist of everything I have stumbled across that can cause an invalid product ID. Make sure you can answer “Yes” to each of these questions:

  • Have you enabled In-App Purchases for your App ID?
  • Have you checked Cleared for Sale for your product?
  • Have you submitted (and optionally rejected) your application binary?
  • Does your project’s .plist Bundle ID match your App ID?
  • Have you generated and installed a new provisioning profile for the new App ID?
  • Have you configured your project to code sign using this new provisioning profile?
  • Are you building for iPhone OS 3.0 or above?
  • Are you using the full product ID when when making an SKProductRequest?
  • Have you waited several hours since adding your product to iTunes Connect?
  • Are your bank details active on iTunes Connect?
  • Have you tried deleting the app from your device and reinstalling?
  • Is your device jailbroken? If so, you need to revert the jailbreak for IAP to work.

If you answered “No” to any one of these questions, there’s your problem.

原文附录了一大堆可能提供解决方案的链接,如果你也有类似的问题可以尝试下。
当然stackoverflow也有大量关于IAP的离奇问题

--- 更新 ---

刷玩最新的 4.3.5后,然后什么都没改动就突然能用了。

这里有篇写的不错的教程,希望对用IAP的人有帮助

In App Purchases: A Full Walkthrough

 

开发的一些事2011中秋版

最近在开发一款叫 秘密 的iPhone应用,经验值涨了不少,也有了些感悟。

 从 UILabel 的垂直顶部对齐(Vertical Alignment to top)说起

UILabel文字内容对齐方式是垂直居中的。这对于要将内容控制在绝对位置上就比较头疼。但想到这种大众需求肯定网上有了不少解决方案,搜索后果然在此发现了一堆解决方案。

解决方法无非就是填充了文字后,计算文字高度,然后重新修改label的高度,达到让文字顶部对齐的效果。但为了这个小功能加几十行代码,甚至有人封装了个类来实现不免有些笨拙。继续浏览,发现个投票数不高的答案:

myLabel.lineBreakMode = UILineBreakModeClip;
myLabel.text = [displayString stringByAppendingString:"\n\n\n\n"];

非常一亮的方法,简单暴力有效,在内容后面插入几个换行将内容顶到头部。和大头说了这个事后皆对回复者非常佩服。时刻得保持着跳动的思维真是件困难的事情。

非完美主义

不久前我还对完美主义有着些褒奖的看法。上次因为我对公司目前比较混乱的节奏表达了些看法后高同学表示很生气,datou第二天给我们准备了个ppt 非完美主义。

里面有张很生动的照片:人民大会堂的天花板上繁星般的灯泡,这种情况下要保证每个灯泡能完美的运行是很高难度的事,选择忍受些灯泡无法发光而不影响大局是比较折中并可行的方法。

另一个场景,小明回家嚷着吃西瓜,可家里没有。若等买了西瓜再给小明吃,小明早哭完而蛋了。但如果仔细询问小明,会发现他是踢了足球后口渴想吃西瓜,然后我们就可以先提供水来满足这个主要需求,等有了西瓜后再完成次要需求。

所谓的中间状态就是跳出完美主义一步到位的误区,在故障下给出快速有效的解决最基本需求。方式这个在腾讯有个专有的名词。忘记了,姑且称呼为非完美主义。

一个真实案例,qq早期有段时间服务器压力过载,无法容纳众多用户,问如何解决。
我的回答是做成游戏的队列模式,排队等待进入。
正确答案是,每个电脑只允许登陆一个qq!

答案有点急转弯,但真理是得谨记真实环境下问题都得分析到源头才能找到个比较快速暴力的解决方法。

一些片段

-对iPad
xu老板说:我从来不知道iPad有长按图标排列和拖放功能,但是我女儿一下子就发现了。

-某新版电视剧
gao同学说:那些骂着新版各种垃圾的人,有多少人是抱着怀旧心理,忽略新版的好,却揪着新版里不给力的地方不放缅怀着老版本,痛骂糟蹋老版。

-车玻璃的雾气
今晚小雨,gao同学车上起了雾气,开着空调吹啊吹。这次我忍不住了,你车没去雾功能?gao同学表示不知情。我把空调面板上按钮挨个一按,突然车窗下吹出很大的风,把堆积在上面的杂物废纸都吹了起来….. gao说,我从来没看过说明书

-光子的秘密
光子来北京出差,发现也安装了秘密,逐抢过想把玩下却被立即抢了回去。原来这小子也发了不少秘密却不会设置密码!这么明显的设置密码功能却不会用,我开始犹豫下版本加个tips功能

未完待续

UITableView 离奇滚动到顶部的问题

你是否有过类似的经验,从一个TableView push到另一个视图后,然后pull back, 这时候有可能会发现tableView的contentOffset 已经滚动到顶部了,而且时有时无,所以也就没深入探讨下去了?

举个很简单的例子,现在有个附件位置聊天工具叫 陌陌, 我就喜欢在列表页面一直向下滑动找各种美女看PP,可是在看完美女资料返回列表后经常发现居然又滚回视图的顶部了,悲痛之余,又得话费很久时间重新滚动到下面,继续看美女。然后又被离奇的滚动到顶部。。。。

其实这个问题在 这篇文章 里提到过,没错还是 -viewDidUnload 导致的问题。首先我们来快速重现下这个bug

  1. 新建一个iOS项目,模板使用 Navigation-base App
  2. 在默认的tableViewController里
    1. - viewDidLoad 设置下 self.title=@”table”
    2. - numberOfRows 设置为 200 个cell
    3. 给每个cell添加点文字,当前的indexPath.row 的值就很好
    4. - didSelectRow 里随便push到个新的 ViewController
    5. - viewDidUnload 加个NSLog,方便跟踪消息
  3. 向下滚动些cell,然后点击进入第二个vc的视图
  4. 选择模拟器的菜单 Hardware->Simulate Memory warning , 你应该能在console里看到2行log,第二行log应该是来自于你的 -viewDidUnload  方法
  5. 返回tableView,你会发现bug重现,tableView的y偏移位已经变回0 !

其原因很容易解释,在接收到内存警报的通知后,非当前用户可见的视图控制器(vc)会接收到额外的通知,并将它的view给释放掉节约内存占用。然后当该vc的视图即将重新被用户可见时(比如被pullBack),vc会调用 -loadView , – viewDidLoad 这些方法重新将view创造出来, 但是偏移位却没有被保存下来,所以就发生这个Bug了。

写到这里应该已经知道如何解决这个问题了吧,增加一个变量记录来记录当前tableView.contentOffset.y 的数值,然后 – viewDidLoad 里面将tableview的偏移位给恢复即刻。

番外篇

iOS 中内存问题会导致各种奇怪的现象,在 – viewDidUnload被执行后会导致下次 – loadView, – viewDidLoad 被重新执行,所以一定要在 -viewDidUnload 中把其他retain的东西给释放掉。

每次通过模拟器的菜单来模拟内存警告比较麻烦,这里提供一个特殊的类来实现自动内存警报功能,将你的视图控制器从该类继承下来,这里以UIViewController为例子。当视图不可见时,该控制器便会自动接收到内存警告并释放掉自己的视图。这样子调试起来就方便了。有木有!!!

@interface MotherUIViewController : UIViewController
- (void)simulateMemoryWarning;
@end
@implementation MotherUIViewController
- (void)viewDidDisappear:(BOOL)animated{
	[super viewDidDisappear:animated];
	[self simulateMemoryWarning];
}
- (void)simulateMemoryWarning
{
#if TARGET_IPHONE_SIMULATOR
#ifdef DEBUG
	CFNotificationCenterPostNotification(CFNotificationCenterGetDarwinNotifyCenter(), (CFStringRef)@"UISimulatedMemoryWarningNotification", NULL, NULL, true);
#endif
#endif
}
@end

XCode4 文档中激活文档目录功能

在XCode3的文档中,我们可以方便的通过文档目录(Table of contents) 来迅速导航到需要的章节

但是在xcode4中,居然去掉了这么重要的功能,而仅仅在文档顶部有个蹩脚的导航功能。

以下是重点,一句话恢复toc

sudo egrep -lRZ "Prototype.Browser.Xcode4OrNewer=Prototype.Browser.XcodeVersion<1000;" /Library/Developer/Documentation/DocSets | xargs -0 -L % sudo sed -i '' -e 's/Prototype\.Browser\.Xcode4OrNewer\=Prototype\.Browser\.XcodeVersion\<1000\;/Prototype\.Browser\.Xcode4OrNewer\=false\;/g'

稍等片刻后目录便回来了,这下查阅文档方便不少。

源地址