我是个淡泊名利的人,从来不奢望世界和平啦、全人类幸福啦这类的事情,我只要自己过得好就别无所求,很谦虚吧?

- 药师寺凉子第三章

iPhone App开发笔记

March 8, 2008

index_steps_2.jpg第一,标题里的app指的是根正苗红老实本分的Web App,昨天的这个时候,对是在昨天,iPhone Web App就等同于iPhone App,咳咳,虽然现在不是了,但我这笔记是两个星期前的……

第二,不全,主要是我关心的一些细节,以及我自己理解的一些东西……




————————————懒得想小标题的分界线————————————

html里可以调用系统接口,比如电话拨号:

  1. <a href="tel:1-408-555-5555">1-408-555-5555</a>

还有mail和google map的接口……



————————————懒得想小标题的分界线————————————

在js里嗅探iphone的safari环境,要注意agent字符串里有额外两处:

“Mobile/1A543″,这个是iphone OS的操作系统版本(注意不是固件版本)
“iPhone”,这个是移动平台的类型,如果是ipod touch的话这里会是“ipod”

此外:

“version/3.0″,Safari的市场版本号
“Safari/419.3″,这个是build版本,虽然iphone跟osx一样都是safari3.0,但build版本号不同

完整的例子:

Mozilla/5.0 (iPhone; U; CPU like Mac OS X; en) AppleWebKit/420+ (KHTML, like
Gecko) Version/3.0 Mobile/1A543 Safari/419.3



————————————懒得想小标题的分界线————————————

调用css的时候,media类型支持CSS3,比如可以用“only”来屏蔽旧浏览器,用“(min-device-width: 481px)”屏蔽小屏幕手机。由于iphone里的safari不支持print和handheld的media类型,可以用它们来对iphone屏蔽一些css文件。
示例:

  1. <link media="only screen and (min-device-width: 481px)" href="not-small-device.css" type="text/css" rel="stylesheet" >

也可以作为css选择器里,比如

  1. @media screen { 
  2. #text { color: white; background-color: black; } 
  3. }

由于safari支持css3,你还可以享受到的福利包括在background里放6张图片做圆角,给文本加阴影,使用属性选择器之类……



————————————懒得想小标题的分界线————————————

iphone的浏览器里有一个很重要的概念是viewport(视区),系统默认的viewport为980像素,可以用meta标签指定,宽度范围从200到10,000,高度范围从223到10,000,还可以使用user-scalable禁止用户缩放页面(常见的iphone web应用,比如facebook,google reader,因为要仿原生界面,都是这样设置的),minimum-scale和maximum-scale可以设置缩放的限制,initial-scale是默认的缩放程度,范围从>0到10
示例:

  1. <meta name="viewport" content="width = 320" />
  2. <meta name="viewport" content="initial-scale=2.3, user-scalable=no" />

iphone默认的浏览器窗口尺寸是: 竖向(body[orient="profile"])为宽320px,高356px,横向(body[orient="landscape"])为宽208px,高480px,但实际上这是显示了浏览器地址栏之后剩余的空间,往下拖动页面时,地址栏会隐藏,所以实际的viewport(竖向)是宽320px,高416px。
页面加载之后可以用 window.scrollTo(0, 1) 隐藏地址栏,自动使用最大化的viewport。

关于viewport,还有一个很重要的概念是:iphone的safari浏览器完全没有滚动条,而且不是简单的“隐藏滚动条”,是根本没有这个功能。所以不但iframe, overflow:scroll的元素没有滚动条,整个窗口也没有的,iphone的safari浏览器实际上从一开始就完整显示了这个网页,然后用viewport查看其中的一部分。当你用手指拖动时,其实拖的不是页面,而是viewport…………由此引申出的结果很多,比如CSS里的 position:fixed 无效……



————————————懒得想小标题的分界线————————————

浏览器行为的改变不止是滚动条,交互事件也跟普通桌面不一样:

所有hover动作,还有mouseover,都不存在,链接上的title内容,会在你点击链接并按住不动时弹跳出来(如果你不放开手指,继续移动的话,点击事件不会发生,具体原因下面解释)…………而mouseover,直接转换成了mousedown……

点击页面元素之后发生的事情很复杂…………比如当你用单指按住可点击元素(大约就是默认为block的元素),然后放开,首先触发的event居然是mousemove! 接下来如果元素内容不变(这个条件比较难理解,我知道),会陆续触发mousedown,mouseup,click,如果内容改变,就不会再触发任何事件……

如果你恰好不太走运的给网页上一些inline元素绑过js事件(这比较常见,我也知道),比如span,有一个不用修改标签的方法是给它们都加上onclick=”void(0)”,这样iphone就会认为它们是可点击的元素-_____-b

如果按住元素之后移动手指,当然就不要指望会触发mousemove了,啥事情都没有,不过停下的时候,会触发onscroll (因为你刚才移动了viewport嘛……)

如果你用两个手指做缩放的动作,啥事件都不会有啦,但是如果你用两个手指在屏幕上一起移动,而且所在的位置是一个本来有滚动条的页面元素(比如iframe罢),会触发一个叫mousewheel的事件(但是别指望iframe本身的内容会滚动-___-b), 停止移动时同样触发onscroll。

OK,你希望像平时那样用onmousedown,onmouseup,onmousemove来做页面元素的拖拽交互把iphone web app的界面做的像原生界面一样活蹦乱跳的梦想已经破灭了,请努力克制骂乔布斯的欲望。

对了,不用我说也应该想得到,onkeyup,e.charCode,e.keyCode这类玩意都不能用罢?



————————————懒得想小标题的分界线————————————

默认的html控件的样式大家都已经知道很cool了,不过也可以自己修改,具体内容请查看《iphone用户界面指南》的第三章:Metrics, Layout Guidelines, and Tips

iphone里的safari调整了默认的文字样式,这些调整被包括在了一个新的css属性“-webkit-text-size-adjust”里面,相当于“-webkit-text-size-adjust:auto;”,你可以覆盖它,根据需要改成none或者200%



————————————懒得想小标题的分界线————————————

web app可以像原生应用一样,在home界面里上添加一个快捷方式图标,方法是增加一个link标签:

  1. <link rel="apple-touch-icon" href="custom_icon.png" />

这是针对单个页面的,如果你把图片命名为“apple-touch-icon.png”,放在网站的某个目录里面,该目录下所有页面都会获得添加图标的功能……

图标的要求是尺寸57×57,png格式,不用画蛇添足的去做圆角渐变或玻璃反光效果,iphone系统会把图片自动裁剪和渲染成统一的风格……

喔对了……不要高兴太早……这个快捷图标的功能,只有1.1.3或更高的固件版本才支持……考虑到国内那些买旧版本破解机器还被商家反复叮嘱不要升级的用户……呃……



————————————懒得想小标题的分界线————————————

关于网页中的媒体文件,普通图片最大支持200万像素(jpg的话,最大可以显示出3200万的,不过超过200万的jpg都会被压成缩略图),支持的最大尺寸是2 * 1024×1024,gif动画最大支持2m(否则只显示第1帧)

iphone支持的视频格式:

H.264 Baseline Profile Level 3.0 video, up to 640 x 480 at 30 fps. Note that B frames are not supported in the Baseline profile.
MPEG-4 Part 2 video (Simple Profile)
AAC-LC audio, up to 48 kHz
.mov, .mp4, .m4v, .3gp file formats

需要注意的是这里的“Baseline profile”,由于这种编码的质量跟“Extended Profile”和“main profile”相比效果比较差,目前主流的支持“高清”(h264)的视频网站,比如youtube,土豆,都没有采用Baseline profile压缩h264视频,所以iphone不但不能播放网络上流行的flv视频(因为不支持flash),连刚开始流行的h264也不能直接播放…………提供iphone应用的视频网站无法使用现有资源,不得不压缩iphone专用的视频文件,所以不要指望能立即在iphone上观看视频网站上的所有资源……T__T

由于iphone不支持flash播放器,视频文件只能直接嵌在页面里,用自带的quicktime来全屏播放,示例:

  1. <embed src="screen.jpg" href="movie.m4v" type="video/x-m4v" target="myself" scale="1" ...>

更多细节请看官方文档:Including QuickTime In A Web Page



————————————懒得想小标题的分界线————————————

如果想全面了解iphone上的web开发,推荐阅读:

iPhone Human Interface Guidelines(官方还有一份名字类似的文档,简称OSXHIG,是界面设计者的圣经之一)

Safari Web Content Guide for iPhone

Web Page Development: Best Practices(这篇可以凑合看看,2月8号刚更新过的)

此外,ADC on iTunes里有好多iphone相关的视频,讨厌翻文档的可以去弄来看看,这可是iTunes store里少有的免费资源喔……



————————————懒得想小标题的分界线————————————

就像开头说的,这是2周前写的,一直懒得修改整齐了往blog上帖,但是昨天半夜(好罢是今天凌晨)在twitter上不小心看了iphone SDK发布的实况转播……我发现再拖延的话就只能贴到火星去了……

跟华丽的SDK相比,iphone safari上的开发环境可以说很糟糕,非常限制想象力——对javascript和RIA开发者来说,不过只要看看iphone用户上网的热情和相关数据,可以预见在很长一段时间里,iphone平台仍然会是立志开发web app的勇者们争夺的滩头阵地。

啊啊啊啊啊,2.10G的iphone_sdk.dmg终于下载完了,睡觉去……下周买《Cocoa入门–使用Objective-C》……



posted in Apple, CSS, JavaScript, web服务/应用, 界面 by Dexter.Yy

Follow comments via the RSS Feed | Leave a comment | Trackback URL

7 Comments to "iPhone App开发笔记"

  1. Robin Zhang wrote:

    无意走到你这里,也在研究iphone sdk中, 就留个言。

    写objective-c 已有三四个年头,但寥有朋友能一同讨论这小众里的小众的技术。Cocoa不错,千万不要一上来就被到处都是方括号的语法吓坏了。这可是small talk老祖宗留下来的语法。

    用下来发现,objective-c 除了内存管理有些难懂,其他都要比java易用。如果你还在学习中… 愿意多交流。

  2. Jackyshadow wrote:

    请继续更新呀!!!我要看后续呀!你是最棒的呀,YY哥哥!

  3. 京宅男 wrote:

    楼主的文笔很好。
    推荐楼主关心一下iphone上专版的web站点,希望能看到对这方面的评论。站点可以参考自舌头iphone上网导航,http://i.shetou.com

  4. Aether wrote:

    JetPhoto的作者?

  5. omtv wrote:

    请问~web app一定要通过safari打开么?可不可以像别的应用一样在桌面上直接点开?

  6. 陈先生 wrote:

    你好,我看过你的贴,知道你在IPHONE APP方面有开发经验,我们公司正有意开发这一块,我看你是个人在做,如果可以的话我们可以合作,请把详细的联系方式发到我邮箱,chen.wei.guo@139.com.QQ:93521053.

  7. 陈先生 wrote:

    我们公司正在找兼职做IPHONE APP的工程人员,有兴趣可以加我QQ详聊,93521053,或直接把你的联系方式发到我手机邮箱chen.wei.guo@139.com

Leave Your Comment

YY in Limbo (混沌海狂想) © Dexter.Yy

Except where otherwise noted, content on this site is licensed under a Creative Commons Attribution - NonCommercial - ShareAlike 3.0(署名-非商业性使用-相同方式共享).
Creative Commons License