iOS8的Wish List

下周二苹果又要开发布会了,赶快在发布之前把自己对iOS的Wish List贴出来。

对于目前的iOS已经相当满意了。没啥特别的要求。基本上都是对现有系统的改良。

  • Mac和iOS之间的AirDrop
  • 内置字典
    • 解决中文字典每次都需要下载的Bug
    • 字典可以直接输入单词(经常碰到使用过去式的单词结果查不出结果)
    • 自动适配单词的各种时态
  • Control Center
    • 更容易进入Music App(现在点歌曲名字也能跳转,但非常难点中)
    • 开启关闭3G
    • 开启关闭Hotspot
    • 开启关闭自动锁屏。
  • Notification:一键驱散,直接回复。
  • 按钮更像按钮(而不是像label)。
  • 类似于OS X的Battery Shaming,知道哪个App最耗电。
  • 更容易的3G流量统计和控制
  • iCloud变得更可靠一点。
  • iCloud备份老出现空间不够的bug
  • 倒转PhotoStream,提供类似于PictureInLife那样的备份服务。

为什么App抛弃旧设备

几个月之前,ZM同学向我投诉了iPad的恶行:为什么新的App都不再支持我的iPad1呢?

这个问题有个背景知识:iPad 1无法安装iOS 6,而现在,支持iOS 5的App基本上已经绝迹(实际上支持iOS 6的App也日渐稀少)。
当时我回答不出这个问题。
夏教授调笑说:只怪iPad的质量太好,如果是别的产品用了两年肯定早就坏了,问题也就不存在了。
这个问题一直在我脑中思考。
随着我对iOS平台开发经验的积累,我对这个问题的理解也越来越深。
第一篇文章:《The Fallacy Of Android-First》,EMU,一个社交App,因为安卓平台首发而名噪一时。但最近他们决定把安卓App下线雪藏起来。他们的CEO写了一篇文章解释为什么他们要这么做。文章讲了很多细节问题,但归根结底就是一个原因:维护安卓App的代价太大,每天都要付出大量的时间精力来修复各种Bug,外加客服电话给用户打爆。而iOS App则稳定得多。
第二篇文章《Why Android First Is a Myth》,讲了为什么大多数真刀真枪的开发者的App都会选择在iOS上平台上首发。
提到这两个文章,似乎有点跑题。问题是为什么iOS App不再支持旧设备。而前面两个文章是论述为啥开发者喜欢iOS平台而不是安卓平台。
其实这两个问题是有联系的,非常大的联系。
安卓为什么会出现这么大的开发难度,正是因为它试图兼容旧设备!这个旧设备:是指手机内部的操作系统使用的是旧版本。
为什么安卓必须支持旧设备,上次回国的时候,我把高中同学的手机统计了一下,一半人用iPhone,一半人用安卓。而在安卓用户中,2.2版本占了一半以上。2.2版本发布于2010年5月,也就是4年前。
基于这个现状,开发者必须支持旧设备,否则等于自己舍弃掉一半以上的潜在客户。而这些旧设备五花八门,搞得开发者不堪其扰。
那么iOS那么不需要支持旧设备了吗?我在做iOS开发的时候,看了一眼iOS设备的版本占有率图表。
2014年4月6日的图表如下:
ios_share
一开始我准备兼容到iOS5(这样等于支持了iPad 1),看完这个图,我就改主意了。
做事都有个投入产出比。如果你花了大力气去做一件事情,最好能够赚得金满筐银满筐。
我算了一下,如果支持iOS5,我不能用自动布局这个特性:这意味着每个界面我都写代码让它手动适配3.5寸屏幕和4寸屏幕。
这个任务也不算难但也有好几个小时的工作量;作为回报,我换来了额外的2%的用户。
换句话讲,如果我不支持iOS5,也就是说,每50个人里面,可能有一个人用不了我写的App(其中包括ZM同学)。我一琢磨,觉得连iOS6也不升级的用户,有非常大的可能他从来都不会去App Store购买App。换句话讲,这部分用户的含金量比较低。
大部分开发都会选择不支持iOS 5,我也一样。
苹果并没有阻止开发者去支持iOS 5,开发者自己做出选择决定不支持旧设备。原因是两个:
  1. 支持旧版本性价比太低
  2. 使用新版本可以使用新特性
所以对于开头这个问题,很好解答了:“因为顾客太少,所以没人卖”。App开发者并不是势利眼,他们不过是在遵循市场规律而已。
后继:我在开发过程中,又遇到了网络部分的API的处理,iOS7提供了新的API来简化代码优化性能。我犹豫了一下,还是决定不使用iOS7的新API,毕竟11%的潜在用户在使用iOS 6。等到iOS 6的市场占有率继续萎缩,那么去掉对iOS 6的支持是早晚的事情。

身教高于言传

我小时候。很怕我妈。因为我妈一发火真的很可怕。但是有时候,我更怕我爸,因为我爸深不可测,平时不怎么讲话,一讲话却可能有很严重的后果。

长大以后,妈妈的威力日薄西山。而爸爸的身教却成为我的榜样。

当我想自己创业的时候,我就想到我爸是如何创业的。

我记得他走的弯路,记得他错过的机会。爸爸是个普通人,所以他会犯错误。我也一样。他最后不算非常成功,但也算小老板一个。

所谓出生决定眼光。我事实上看错了很多东西。我以为一些没有意思的东西,其实只是我不懂而已。很多事情,等到毕业十年以后我才懂得。

而选择成为一个技术人员,是一个符合我性格和特长的决定,但远不是最好的决定;我一直觉得做技术很快乐很有趣,直到最近才有些压力。

但是不要紧,我相信自己就是我爸爸的翻版。爸爸给我放了我自己的预告片。

我要坚持走下去。我知道远处有机会在等着我。

回头看看,很多努力都是过眼云烟。不变的只有对自己的认识越来越深。有些事情我肯定可以做,有些事情我永远不会去做。

我很少要求别人什么,因为我只相信自己的努力,相信努力就有回报,也相信知足常乐。我还相信一切自有天意。

一时的困扰和失望总是暂时的,而未来是注定的。说到底,一个工程师怎么可能会失败呢。


想到此,一切仇恨被驱逐散尽,
灵魂恢复了根本的天真,
终于得知那是自娱自乐,
自慰自安,自惊自吓,
它自己的美好愿望就是天意;
尽管每一张面孔都会恼怒,
每一处风源都会咆哮,或每一组
风箱都会胀破,但她会依然欢喜。

Pebble小评测

photo-main

Pebble大概是两年前开始火起来的一只智能手表,发源于众筹网站KickStarter,目标是筹款十万美金,最终筹款到一千二十六万美金。一个巨大的成功。

Pebble手表的诉求非常清晰。和三星一年多以后发售的Gear手表不一样,Pebble一开始就选择了黑白电子墨水屏幕,目标就是具有智能功能的同时还能够长时间续航。

三星的Gear手表,官方待机时间只有一天(实际时间更短),简直不是人能用的东西。对比三星来看,更能看出Pebble团队的智慧。要知道Pebble只有五六个人,而三星是个巨无霸公司。

虽然Pebble那么成功,我依然没有动心下单。实际上,说得天花乱坠结果一塌糊涂是众筹项目的通病。这方面的典型是就是Ouya游戏机,这种游戏机以没有任何人愿意为它开发游戏收场,成为一个可悲的闹剧。

Pebble筹款成功以后,遇到不少困难,发货日期一拖再拖,计划中的电子墨水屏幕也被换成其他屏幕。承诺中的开放开发平台,至少迟到了半年才到。

但Pebble团队最终证明了自己是靠谱的。

现在戴手上的Pebble,看起来真的就像一块手表。戴着出门不会引人注意,不会被人看成是怪物。不管从哪个方面看,它都很像小时候戴过的电子表。不同的是电子表不能换WatchFace。

手表防水。为了做到防水,充电口不是标准的手机充电口,而是一种很奇特的接口。(因此如果不小心丢了充电线估计会哭死)

待机时间号称是5到7天,一开始找不到看剩余电量的地方,后来发现有的watchface支持显示电量。看到用了整整两天的pebble还有至少80%的电量,还是挺意外的。pebble的电量管理真的好强。

Pebble有背光功能,晃一晃手腕就能唤醒背光,这样晚上也不用担心看不了时间。另外背光的光线很弱,这样不用担心太亮影响其他人。

手表本身不支持WIFI只支持蓝牙,要想从网络上下载表面,必须使用蓝牙连接手机。因为手表没有WIFI,没有触摸屏,没有键盘,所以Pebble团队做了一个顺理成章的决定,Pebble做不了或者不好做的全部放到iPhone上去做。watch face的设置也被放在iPhone里面;这简直和iPod不支持编辑播放列表简直是如出一辙。

有趣的一点是,pebble有些app可以显示本地天气情况,但pebble本身不带GPS,他是如何做到的?我的理解是:它利用的是iPhone的GPS,然后根据GPS再让iPhone取天气信息,最后显示在手表上。(不知道是不是错觉:但开启了这个表面以后,似乎iPhone的电走的特别快)

设置过程非常友好:

  • 手表第一次充电的时候,会提示你访问一个网址
  • 用手机打开这个网址,网站会引导你去下载一个App
  • 在手机上运行Pebble的App,会有一个非常容易的配对过程,基本上两秒钟就配对完成了。
  • 我一直担心这种配对会不会丢失链接。结果证明不会。
  • 使用App就可以从官网下载对应的WatchFace和各种服务了。
  • 下载WatchFace非常容易,在Pebble App和Pebble手表会同时显示下载进度。

功能方面(按有用程度打星):

  • 看时间(★★★★★)
  • 切换不同的WatchFace(★★★★☆)
  • 运动数据的显示(★★★★☆)
  • 闹钟震动。(★★★☆☆)
  • 当手机有通知消息的时候,Pebble会同步显示。(★★★☆☆)
  • 可以用Pebble控制手机播放手机播放音乐(★☆☆☆☆)

以下详细解释:

看时间。我很多年没有带手表了,要看时间就把手机掏出来看看。

现在我手腕一翻就可以看到时间,甚至日期和星期几。翻手腕看时间这种完全不用动脑子的潜意识行为,在出走了好多年以后,突然又回来了。

早上女儿在看书,我让她休息一会,她讨价还价再看两分钟,以前我要把手机掏出来看一眼时间开始计时,现在手腕一翻就开始计时了。

切换表面。可以换手表面板真的挺酷的。Pebble做得挺好,切换WatchFace的时候,没有繁琐的设置,而是按上下键切换,循环轮换,还带有动画效果。我挺喜欢的。

运动数据。这个最有意思。Pebble本身没有GPS,没有各种传感器,它的实现方式是,让你的手机运行"运动记录App",然后把运动数据通过蓝牙传送到Pebble上进行显示。

跑步用的App有很多,我选择的是RunKeeper。在RunKeeper中开始记录的同时,Pebble就会开始显示计时/公里/速度三项数据。这里最棒的一点是,你无需对Pebble做任何设置,只要操作iPhone App就可以了。

这点很好用。以前跑步的时候,老想着怎么还不到整公里数,特别想掏手机看进度,很不科学。现在好了,手腕一翻,就看到了公里数了。

闹钟是个惊喜。手腕上的震动给人的感觉完全不一样。

消息通知。我本来觉得没啥用的,结果证明有点意思,因为手表是一直在手腕上的,偶尔瞄一眼就会看到新通知。这种无干扰的通知,还有有点意思的。我曾经写过文章,认为通知出现在智能手表上意义不大,主要理由是:手机上看到通知以后,后继操作还得掏手机。这句话还是对的,但我却喜欢上了手表上的通知功能,原因是:手表的通知停留时间更长,瞄一眼就可以看到,你可以很快地决定忽略或者处理它。我以前一直担心的情况是,蓝牙连接能不能足够稳定,保证通知系统及时而好用,现在看起来这一点是多余的。

控制手机音乐的播放,是个超级鸡肋的功能。因为iPhone的线控实在是太完美了。我能想到的,就是如果iPhone在Dock上放音乐的时候,用Pebble来切换也许是个好主意。这功能也隐藏得比较深,需要按至少三下按钮才能访问到。还有就是它会显示歌名(只支持英文歌名啦),听到不熟悉的歌看一下歌名比较方便。

电池:

我之前一直担心蓝牙链接会影响iPhone电池消耗过快。实际上证明我多虑了。

我做了一个测试。晚上睡前把iPhone充满电,然后连接上Pebble(特意切换到带天气显示的表面),早上起来看iPhone电量,还剩92%。第二天,我还是把iPhone充满电,然后关掉Pebble,早上起来发现电量还剩93%。

也就是说,Pebble对手机电池的影响非常小,八个小时才消耗1%这样子。

另一个问题是Pebble本身的待机问题。我算了一下,Pebble入手到现在,开机状态差不多是4天半(24小时乘4再加12小时),电池显示还剩三分之一。所以官方号称待机5-7天完全不是吹牛。

缺点:

首先是买回来居然手表一点电也没有。至少留一点电给我玩一会吧。当时拆开来没有地方充电,傻乎乎地戴着没电的手表戴了2个小时。冏。

Pebble缺点是不支持中文。这个缺点非常讨厌。比如收到一封中文邮件,在Pebble上看到的提醒全部是小方块。在使用微信时,这一点也是很讨厌的,我对重要的人(比如老大)开启微信通知,结果在Pebble上显示的全是方块。冏。

最后一个缺点是特殊的充电器。考虑到Pebble并不如iPhone那么流行,万一丢了充电器基本上就意味这Pebble也完蛋了。

Pebble似乎学习了苹果,不允许app在后台运行,悲剧的地方在于,它没有提供系统级的定时器(timer),第三方的timer到了时间点不会震动。要知道我最常用的功能之一,就是进停车场停车要设个timer,因为停车场前两个小时是免费的。如果手表有这种功能,那可真是太好了。希望将来pebble能够完善这个功能。另外高级点的电子表应该都有这种功能了吧。

展望:

苹果的iPhone5S上引入了M7协处理器,这枚处理器被设计成了功能极其简单但几乎不耗电,其实就是计步器。有个5S用户手机电池耗尽又无法充电,等到他两天以后充上电,惊讶地发现他的运动记录软件居然在没电的两天里依然记录了走路的数据。

M7实在太适合集成到Pebble手表里面了。

我现在相信传说的iWatch走的应该也是差不多的路子:

传感器  ——   iPhone App   ——  iWatch

这样iWatch可以最大程度地把耗电的计算任务(比如GPS和互联网)丢给iPhone,保证它自己的续航力。

当然也可能是这样:传感器  —  iWatch,但这样做似乎有很多问题:蓝牙能不能同时支持多台设备,大数量的存储,以及大计算量的分析,还有GPS这种超级耗电的部件似乎不管放在哪里都不妥。

Pebble没有触摸屏,它配置了4个按钮,按钮的设置还算合理,但我希望iWatch是个触摸屏加上实体Home键。4个按钮太多了,哪怕设计得非常好也总觉得不太容易按,特别是单独在手表另外一侧的返回按钮。

至于黑白屏幕,我倒是没有意见,我觉得小屏幕的手表其实黑白屏幕就够了。如果有彩屏当然是最好了,但如果在电量和彩屏之间选择,我选择省电的方案。

Pebble的未来:

Pebble已经出了第二代,叫做Pebble Steel,售价240美金。它看起来和一代没啥区别,除了它的外壳变成了金属的,包括表盘和表带,表面这是康宁的防刮玻璃。表带同时也是提供皮革版。

我说实话挺想要一只金属版的。功能上我觉得Pebble只要把中文和定时器加上就好了。协处理器虽然肯定是大方向,但Pebble毕竟是小公司,我看是做不了这事情了。

最后呢,我觉得Pebble虽然不错,但只要iWatch一出来就会变成炮灰。苹果的厉害之处是它知道该如何发力,pebble做得已经相当不错,苹果会做得更好更漂亮,再把协处理器一加,再加上苹果的产能和营销网络以及品牌效应,Pebble真的是一点还手之力也没有啊。

但pebble活下去没啥问题,手表就是个细分市场,再冷门的手表也有人买。而对于安卓用户来说,Pebble依然是最好的选择之一(另一个可能是三星的Gear)。

但对果粉而言,Pebble肯定会变成鸡肋。

App的开发日志

昨天终于把App递交到App Store里面了。

先晒晒开发日志吧。是的,我每天都记录,几个好处:看自己走了哪些弯路,成就感,以及自我鞭策。

所有开发都在业余时间完成,所以很累。

一开始就想好了,做好最基本的功能,高级功能全部放到以后去做,所以很多想法都没有实现。最后出来的界面比较乏味(Tedious),其实我是有高大上的设计在脑子里面的,没做都是因为没有时间。

其实到了昨天,还有很多功能想塞进去,后来想想,需求无止境,不能再拖了,拖下去永无翻身之日。

递交完了以后,唐教授还告诉iOS 6下有问题。手头没有iOS 6的设备,只能先不管不顾,等第二个版本再说了。

后面的几周只修复Bug,不加新功能,争取把功能稳定下来再说。

 

20140316,周日

历史纪录为空进行提示。
试着上传app到app store。
修复历史记录重复的问题。

20140315,周六

加载文章时显示Loading
完成了加载分类
传送Token到服务器
更新了导航栏的页面名字
如果token已经上传过,不要再传了

20140314,周五

部分实现了分类的动态加载的问题。
修复了XCode5.1下不能编译的问题

20140313,周四

美工上各种优化
增加取文章兼容性

20140311,周二

换了图标
界面细节优化

20140309,周日

做了红底白字

20140308,周六

图片异步加载成功
界面上很多小优化
手工刷新搞定

20140307,周五

重写了加载图片的部分。

20140303,周一

重构了Model的部分

20140228,周五

现在历史浏览能够显示日期了。
手工刷新看起来正常了。

20140227,周四

浏览历史基本正常了
增加了修改数据的DataSource的接口
手工刷新还有待进一步定位。

20140226,周三

解决了表格下拉刷新的崩溃问题。
需要继续完善表格下拉刷新的问题。
增加了浏览历史。

20140225,周二

Deploy Target修改成6.0,增加对应的图片
上次commit漏掉了一张图片,重新Commit。
解决了两个TableView加载前行为不同的问题。
尝试添加表格下拉刷新,遇到奇怪的App崩溃问题。

20140224,周一

优化微信的分享功能
网络取数据兼容iOS6

20140223,周日

更新了微信的图标
更新了App图标。
更新了UIActivityIndicatorView
更新了Splash窗口

20140222,周六

搞定了AutoLayout。
优化某些表格的二次加载。

20140221,周五

实现了缓存有效期
实现了分类的缓存
解决了表格单元图片乱掉的问题
把表格单元的TextView换成了Label

20140218,周二

现在Article显示标题和图片了

20140217,周一

搞定了一下catergory article view。
解决了不少界面的问题:点击以后的停顿消失了,标题有意义了。
成功通过TestFlight.com发布测试版本

20140216,周日

给Category新加了一层View,但是还没有搞完。
重新搞了DataSource,修改为类似于工厂模式,支持多层Key。扩展性大大增强

20140215,周六

TableCell进一步优化
解决了异步刷新的死锁问题
图片缓存
解决了重复Segue的问题。

20140214,周五

实现工厂模式
实现本地缓存
搞定了TableCell的定制。

20140213,周四

异步加载网页
网页打开有加载界面
数据源

20140212,周三

解析HTML
“最新更新”的Tab
启动计数
“分享到微信”和“分享到朋友圈”
“分类浏览”的Tab
单篇文章截头去尾

20140211,周二

优化“分享到朋友圈”

想出了新的界面设计

20140210,周一

增加了分享朋友圈的功能
实现Push Notification功能
数据保存功能:分享次数,通知Token

20140209,周日

新的文章列表的界面,分享按钮

20140208,周六

分享按钮

20140207,周五

封装了网站,第一个例子