Yet another trap of CocoaPods

Creating a pod in my private repo, it worked fine till I made some uncertain changes. Now running ‘pod install’ in Example will complain:

Resolving dependencies of `Podfile`
[!] Unable to satisfy the following requirements:

– `DataModel (from `../`)` required by `Podfile`
– `DataModel (from `../`)` required by `Podfile`
– `DataModel (= 0.1.0)` required by `Podfile.lock`

And eventually, I figured it out, it is caused by iOS platform version which I just modified to reflect truth of framework in bundle requires 8.0.

  s.platform     = :ios, ‘8.0’

It works like a charm when the version is 7.0 or 7.1 . How could it be so weird?! Well, it is not weird indeed, I just didn’t give the iOS version in Podspec file. It will work with right iOS platform version, like:

platform :ios, ‘8.0’

The error information didn’t mention platform version, it should have saved my day!

Xcode7 的两个小坑

Xcode7 还在 beta,时不时崩一下什么的倒也是预料之中的事,没料到的是之前用着好好的,今天升完 El Capitan 之后,模拟器居然不见了,设备倒是在 schema 栏右边里能看到,不过注明不能用。

看了看系统日志是 Simulator 服务不停的崩。查了查,有人已经分析过了:
http://stackoverflow.com/questions/31551480/xcode-7-beta-4-ios-simulators-missing-and-not-installable
简单点说,去把7.x / 8.x 的 simulator 映像文件都移走或者干脆删除,就好了。

另外,beta4 会报怨 CoreData 模型文件没有指定版本号,这新建的文件哪来的版本好,在 Editor 里给建了一个版本终于不 warning 了。

Install MacPorts on Mac OS X 10.11

Just notice MacPorts is missing after upgraded to 10.11 beta, need re-installing.

Downloaded MacPorts 2.3.3 source tar ball, but configure complains there is no Foundation framework. And it is solved by xcode-select -s to switch to Xcode7-beta:

sudo xcode-select -s /Applications/Xcode-beta.app/Contents/Developer/

Little tricks with XCTest

Tried to call all other tests in one test function.

    // alternate what setup done
    // full tests in alternated state
    NSArray * tests = [FileLibraryTests testInvocations];
    for (NSInvocation * inv in tests ) {
        NSString * sel = NSStringFromSelector(inv.selector);
        if (![sel containsString:@"WithInit"] && ![sel containsString:@"Monitoring"]) {
            [inv invokeWithTarget:self];
        }
    }
    //back to normal state

And just noticed XCode6 added XCTestExpetation, no longer need semaphore like:

    #import 
dispatch_semaphore_t sema = dispatch_semaphore_create(0);
dispatch_after(dispatch_time(0, (int64_t)(0.2 * NSEC_PER_SEC)), 
        dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), 
        ^{
            ... dispatch_semaphore_signal(sema); ...
        }
    );
dispatch_semaphore_wait(sema, dispatch_time(DISPATCH_TIME_NOW, 30*NSEC_PER_SEC));

It is much simple to test async operations now:

    XCTestExpectation *expectation = [self expectationWithDescription:@"xxx"];
// invoke it in code async executing
    ... ^(){
        [expectation fulfill];
    } ...
[self waitForExpectationsWithTimeout:1 handler:^(NSError *error) {
        // cleanup.
    }];

CocoaPods and objc_msgSend

I got this “Too Many arguments to function call, expected 0, have 3” error while compiling a project relies on QuickDialog.

According “https://developer.apple.com/library/ios/documentation/General/Conceptual/CocoaTouch64BitGuide/ConvertingYourAppto64-Bit/ConvertingYourAppto64-Bit.html”, it is easy to fix, just cast the function to right prototype, like:

int (*action)(id, SEL, int) = (int (*)(id, SEL, int)) objc_msgSend;

But, the invocation is in a pod project which is locked for editing and even if I unlock it, the change will lose at next checking out of the project.

Further peek at objc/message.h shows it is a trick to help compiler ensuring the call is with right frame, the signature is still available with OBJC_OLD_DISPATCH_PROTOTYPES micro. Then I found the:Screen Shot 2015-06-12 at 9.27.25 AM

Set “Enable Strict Checking of objc_msgSend Calls” in QuickDialog target of Pod project, done.

原型工具小结

耍了一堆原型工具,感觉可以分成三类:

  1. 动图型:已经有界面的图片了,不管是手绘还是 PS / Sketch 3,有许多工具都可以导入后加上热区跳转和交互效果了。
  2. 描绘型:提供各种图形组件,可以快速描画界面,普通可以快速实现界面跳转,复杂的交互和条件处理只有少量组件可以了。
  3. 编程型:无论是直接拿 html/js 开练,还是拿 Quartz Composer 用图形语言写,本质上都是在编程了,看用的人会写js还是熟图形处理了。

目前看下来,还是 Axure 功能比较全面,其它的工具处理处理小项目还成,管理复杂项目还是费劲点。Pencil 这个开源项目其实很不错,就是蛮久没人维护了。

Apple Watch 使用小结

Apple Watch 到手有些日子了,用下来还不错。

最为担心的问题是电池,实际表现非常好,我基本早上7点带上,到晚上23点左右取下来,正常一天下来还剩40~50%的电量,工作日活动比较少且没时间不停折腾表的话,2天其实也坚持得过来。

运动探测不是太准,比如我在键盘上工作时,它有时就会误判而影响久坐提醒,1.0.1说改进了算法,希望会好一点。

抬腕亮屏需要的加速度或行程比较大,有时手本来就抬着,再举到眼前偶尔会有不亮屏的情况,需要再来一次;而开车时,转动方向盘则会经常自己亮着,是经常呀,这个略浪费电。

导航功能就是个样子货,还是手机开语音比较实在。接电话很酷,特别是开车的时候,方便多了,就是音质实在太差!

现在改用太阳表盘了,每天看看日出日落时间还蛮酷的, Module 表盘太快就看疲劳了。

第三方应用普遍还打磨得不大够。

微信,消息功能做得还比较完整,能收能看能开朋友圈,就是时不时跳出来说“您收到了一条消息”又不告诉我是啥,而且打开消息时速度比较闹心。在对话里图片处理也不细致,似乎是按比例缩放的,而不是占满全屏,经常大一点又不是正方形的图片会看不清楚。但凑合着用还是可以的,且而微信手机版本的主界面还蛮好看的。

微博,有直接消息时还是会弹通知的,还可以回,不过万一当时没回,就再也看不到了。平常它在手机上只会卖萌,完全没用,那个计步功能现在也没搞清楚怎么生效,反正我这儿一直是0.

Twitter 做得还是不错的,可惜没 wi-fi 时翻墙比较烦人,基本只拿来收通知了。丫的 iOS 客户端我没找到在哪里设置代理,Android 版本倒是很好找。

搜狐视频动作很快,已经有表上的播放控制和个人收藏查看功能了,不过它没法控制 iPad 上的播放呀,手机我就拿手上看了,放远了看不清楚呀。也试了 AirPlay 到 Apple TV 上,这个不知道是我不会用还是咋得,音量似乎控制不了,也不能控制 airplay 切换。顺便吐个槽,在 iPad 上做个看得见的 AirPlay 目标切换菜单就那么有挑战性?

淘宝有交易时会弹通知,不过平时基本在捣乱,时不时发一个上边“手机淘宝”,下边“关闭”,中间啥也没有的消息是几个意思?招行的客户端就文明多了。

听说这货防水其实很 NB,不过坏了不保,想来想去还是没带它去游泳,反正也没有游泳统计模式。

最后越来越觉得还是应该买 42mm 的,特别是被某人吐槽说 38mm 的在我手上颇有基佬范以后。

Apple Watch 初体验

Apple Watch 用了大半天了。感觉很不错,操作流畅,电力持久,屏幕明亮艳丽,就是铝壳比表盘还是逊色不少,应该买不锈钢的。

手表的基本功能自然是时间管理。
默认的时钟表盘一点也不花哨,但是很实用:时间、日期、最近事项提示、运动量摘要、气温都有了。如果不满意,用力按一下,就可以换表盘了,还可以对现有表盘做一些定制,试下来还是觉得默认的实用。
自带的世界时钟,能够自动同步我在手机上添加过的地区;自带的秒表,设计很花心思,默认的视图是一个大表盘,最近一圈与总时间用两根不同颜色的指针显示在表盘上,上划一下,则进入具有分、秒、厘秒三个小表盘并附每圈记录清单
自带的小定时器非常直接,默认最多12小时,用力按一次则可以切换12/24小时。
自带的日历就略显简陋,默认显示从今天起的待办事项清单,可以滑动到以后的日子,点左上角的日期可以显示整个月,但是似乎不能切到其它月。用力按可以将清单换成今天视图。
自带的闹钟功能齐全,可以用力按新建闹钟,点击已有的闹钟可以修改时间、重复、提醒等等,功能很全。不过,在我这个38mm表盘上操作实在让人精神紧张,还是用 Siri 设置闹钟更舒服。

另一个基本功能则是运动和健康管理。
自带的健康活动非常简单,久坐会提醒我站起来活动活动非常有帮助。不过 Apple Watch 防溅不防水,不能带着游泳,是个遗憾,我目前主要靠游泳锻炼身体。
自带的健身功能也不错,支持各种常见的锻炼方式。我家小 Nemo 发现它之后,就开了室内跑步在家来回跑,玩得可欢了。结束时会提供热量消耗、心率等统计数据。
另外装了 Nike+ Runnign和咕咚运动。Nike+需要先在手机上完成设置,它会下载 viavoice 套件,可以在跑步过程中播放音乐、打气,当然也有各种统计和朋友间的排名。咕咚的功能也挺全,支持的活动类型挺多,就是需要在应用里先绑定一下健康设备,允许读写健康数据,这个没有放在初始设定过程里,有点小绕。

通知与消息
将各种通知弹到手表上,这种提醒方式很方便。手机经常需要静音,不静音也会时不时错过。手表会把通知显示在表面上,如果错过了,从顶上向下划一下就会显示清单了,跟 iPhone 上的方式是一样的。除了系统本身的短信、电话、邮件,微信、微博、QQ、Twitter 这类消息型应用,支付宝、招商银行掌上生活等也会有提醒。不过居然没看到 Facebook。

微信在手机上能够正常使用,不仅可以看消息,还可以发消息。微博则选择了另一个方向,做得比较好玩,感觉是猜测新上手的手表用户们应该急于显摆,所以提供了第多少位手表微博用户和朋友圈里运动量排名的功能,有新消息时也可以看、赞,但发不了消息,可以用力按然后分享到微博。我是第21090位用户,可见国内已经发了不少货了。

工具
系统自带了挺多功能的,向上划一下,会有:
手机连接状态与控制,音乐(会在手机上放而不是在表上),心率,电量,健康活动,日历,天气,股票,地图,和日照情况。

mwCalculator 是个小计算器,咋一看只有数字,还是挺困扰的,用力按也没用,后来发现是点击结果显示区域切换数字和运算符,这个就不应该用同样的颜色了,最好再加一个视觉暗示。

用手表来控制 Keynote / PowerPoint 是个很酷的主意。 Keynote 的手机扩展可以自动发现电脑上运行着的 Keynote 并控制翻页,就是测试的过程中断掉过一回,着实让人担心。

电池续航能力确实有点让人担心,14.5小时左右从100%到1%,其中打了1个10分钟左右的电话,下班高峰时段导航了约么10公里走了约30分钟,测量了1.7公里的户外步行约30分钟,额外测过五六次心跳,其余使用应该还在日常范围之内。

用 CSS 给 FORM Input 换行

自从若干年前看过《超越CSS:WEB设计艺术精髓》一书之后,再看 HTML 源文件就经常有各种心理障碍。刚才试着写个小注册表单,就有一个字段分行的问题。直接写:

<label><input>
<label><input>

会连成一行显示。这个问题非常容易解决,不管是用 div/p/br,还是用 label 包住 input 然后 display:box; 之,都可以达成效果。前者插了一堆没意义的标签,而且把布局与内容混为一体了;后者逻辑上感觉不太对,label 是 input 的一个修饰件才对嘛。

这个问题应该用 CSS 解决。直接的想法是 input:after ,不过 content:’\a’ 不起作用,又不能放标签,试了一下附个图片把后边的东东挤开,也没成。
再试 label:before,这回成了。
label:before { content: ‘\a’; white-space:pre; }


折腾图片的时候又掉坑里了,在 meteor app 里图片死活出不来,iron-router 总是跳出来说 template 找不着,明明图片是放在 public 下面,iron-rotuer 也是v1.0.7呀。各种疑神疑鬼,好久才发现,这 public 自己放到 /client 下边了,挪回顶上就好了。

** 扔草稿箱里居然忘了