`

iOS Web App 如何变成本地应用 (转)

 
阅读更多

1、放到桌面

其实这个最简单啦,点浏览器的加号(2012年8月27日注:新版safari中已经不是加号了,而是iOS中经常表示“更多操作”的箭头),就会有一个菜单,添加到屏幕就行。

2、设置图标和启动画面

添加到屏幕后,默认的图标是一个纯白色图标,启动画面则是上次运行时的画面截图(所以感觉不到有启动画面)。为了更像原生的App,我们添加一下图标和启动画面。

图标的添加方法是在head区添加如下代码:

<linkrel="apple-touch-icon"href="icon.png"/>

其中,icon.png是图标,必须为png格式,大小为5757像素(2012年8月27日注:iPad1/2为7272,iPhone3为5757,retina屏对应2,即iPad3为144144,iPhone4(s)为114114),不需要添加圆角和光影效果,iOS自己会处理。(2012年8月27日注:也可处理好圆角和光影,让iOS不再自动添加效果。)

启动画面的添加方法也差不多:

<linkrel="apple-touch-startup-image"href="startup.png"/>

其中,startup.png是图标,必须为png格式,纵向图片,iphone/itouch的大小为320460,ipad为7681004。

要说明的是,启动画面的时间会很短,而且这个时间似乎是不可控的,个人感觉是在页面ready的时候启动画面消失。另外,在我试验用的itouch3上,图标和启动画面均未生效,iphone4和ipad上有效。(2012年8月27日注:关于启动画面是否可以横屏的问题,我找了很久没有找到对应的方法,但上次WebRebuild广州站,有演讲嘉宾说可以实现,待考。)

3、隐藏地址栏

为了更像本地App,我们要隐藏掉地址栏和系统工具栏,而在隐藏这个之前,我们必须设定程序全屏,否则无效。(2012年8月27日注:这里之前理解有误,第二个设定其实是底栏样式。)

全屏:

<metaname="apple-mobile-web-app-capable"content="yes"/>

设定顶栏颜色为黑色(也可设为white或者black-translucent):

<metaname="apple-mobile-web-app-status-bar-style"content="black"/>

4、控制用户的缩放

作为一个网页,事实上可以无限缩放的(当然,缩小到比viewport还小时会自动充满viewport),而作为一个程序,我们有时候不希望这样的事情发生,如下代码可以解决:

<metaname="viewport"content="width=device-width; initial-scale=1.0; minimum-scale:1.0; maximum-scale:2.0; user-scalable=yes"/>

上述代码的意思是,viewport的宽度为设备宽度,initial-scale是初始的缩放值。(按照我的理解,viewport的宽度值和initial-scale这两个属性应该是不可以同时存在的,因为定义了一个值会自动推算出另一个值,比如我将viewport的宽度设为屏幕宽度的2倍,那么initial-scale应该自动为0.5,待验证。)后面两个自然是能缩放的最小和最大值了。

如果不想让用户缩放,则可以将最小值和最大值设为一样,都为1.0,或者直接将user-scalable设为no。

5、离线

到这里,我们的App已经很像原生App了。可是,如果断网了怎么办?于是,最后的一步——离线。离线之后,我们的程序就可以在没有网络的时候正常运行,完全和原生App一样了!

上述已经说过的特性都是iOS独有的(2012年8月27日,事实上有很多已经变成事实标准了,比如viewport控制),但是离线是HTML5的特性。

要实现离线,首先得有一个先决条件:能修改web服务器的MIME(确切地讲,是MIME中有manifest类型)。关于MIME是什么就不详细介绍了。(2012年8月27日,关于这点也不太准确,在PC端的chrome中,并不关于.manifest文件的MIME,但是在iOS 4.3和5.0的safari中,都需要有准确的MIME才能使离线正常工作。)

首先,我们需要在web服务器中将.manifest后缀的MIME设为“text/cache-manifest”。对IIS,在站点属性中可以设置,对apache,则能直接通过修改.htaccess文件实现。不详述。

接下来,我们需要创建一个离线文件列表,列表中的文件将被缓存供下次使用。

我建立的名叫cache.manifest,内容如下:

CACHE MANIFEST 
# xpad v0.1.0009# 指明缓存入口 
CACHE: 
index.html 
index.css 
jquery.js 
xpadicon.png 
xpadstartup.png 
images/pic.png

# 以下资源必须在线访问 
NETWORK: 
login.php

# 如果index.php无法访问则用404.html代替 
FALLBACK:/index.php /404.html

开头的是注释,这个好理解。文件分为三段:CACHE、NETWORK、FALLBACK。

CACHE表示要缓存的文件,即可以离线使用的资源,可以看到,html/css/js/pic都可以缓存,当然,其他类型的也可以。

NETWORK表示必须在线访问的,例如登录之类的页面。

FALLBACK表示如果在线访问失败时,用什么文件替换。上面的代码表示index.php访问失败时用404.html替换。这个可以用在网络不好的时候,例如一个离线应用去访问一个在线页面,但是没有访问成功,这时就可以调用一个已经离线了的页面去,不破坏用户体验。

再接下来,就是告诉iOS,我们的程序需要离线,方法是在访问的页面中的html标签中加入一个属性标记上面说的manifest文件:

 

访问一次,只要文件传输完毕,我们的应用就成功离线啦!这时断开网络再次打开,依然可以使用!

App化的操作基本都完成啦,可以先喝口茶休息下。

接下来呢?接下来你可能会修改你的页面,但是,悲剧来了,你发现无论你怎么刷新,页面都没有变化,即使清掉缓存也不行。

事实上,更改页面文件并不会导致离线文件也更新,而清掉缓存也不会清掉离线的文件!(2012年8月27日注:事实上,这里发生的情况是带有manifest属性的页面即使没有被写到manifest文件中,也会被离线下来,导致入口文件根本更新不到。)更新缓存的条件是:.manifest内容发生变化!所以如你看到那样,我在最前面加入了版本,这样一方面可以标版本,另一方面刚好让程序更新缓存。

我们的Web App在打开时会检测更新,但是,本次打开使用的仍然会是老版本,如果更新完成,再刷新或者再次启动会是新版本,而如果更新过程未完成,则仍然是老版本。这中间不会有任何提示。(2012年8月27日注:简单地说,就是最少要启动两次才能应用新版本。)当然,可以用脚本更新,不详述。

小结

至此,一个完美的Web App就诞生了!

现在唯一的局限就是技术限制了——网页不可能调用系统的API,如文件IO,摄像头等等。要使用这些功能,就得老老实实地下载SDK回来开发原生的App。可是,如果用HTML+js+css,也能调用本地API,和原生App实现同样的功能,是不是很心动?事实上,已经有这样的框架出现,如PhoneGap等等。有兴趣不妨Google之。因超出本文范围,故就此打住。

 

=======================================

对于UIWebView不支持html5 cache的问题,可以参考:

http://stackoverflow.com/questions/1540240/html5-cache-manifest-in-a-uiwebview

分享到:
评论

相关推荐

    ios-iOS-本地应用分发.zip

    在iOS平台上,应用的分发通常通过App Store进行,但有时出于测试、内部分享或特定用户群体的需求,开发者可能需要实现本地应用分发。标题"ios-iOS-本地应用分发.zip"暗示了这个压缩包包含了一个解决方案,使得在没有...

    iOS 10 App Development Essentials

    iOS 10 App Development Essentials: Learn to Develop iOS 10 Apps with Xcode 8 and Swift 3 Author: Neil Smyth Length: 816 pages Edition: 1 Language: English Publisher: CreateSpace Independent Publishing...

    ios一个app应用内部调用另一个新的app应用

    在标题和描述中提到的"ios一个app应用内部调用另一个新的app应用",实际上就是指通过URL Scheme实现iOS应用间的跳转。 首先,我们需要理解什么是URL Scheme。URL Scheme是一种类似于http或https的自定义协议,但它...

    iOS应用程序本地化

    在iOS开发中,本地化(Localization)和国际化(Internationalization)是两个重要的概念,它们使得应用程序能够适应全球不同地区的用户需求。本地化是指将应用程序的内容、界面和功能适应特定地区的语言、文化和...

    高仿iOS11 App Store列表效果

    在iOS应用开发中,创建与iOS 11 App Store类似的列表效果是一项常见的需求,它可以提升用户的体验感,使应用更具吸引力。本项目标题为“高仿iOS11 App Store列表效果”,其主要目的是通过编程技术实现类似App Store...

    ios-App-App.zip

    标题中的"ios-App-App.zip"可能是一个包含iOS应用开发相关资源的压缩包,可能是源代码、文档或者示例项目。"App-App"可能指的是两个或多个iOS应用间的通信。在iOS中,这种通信通常涉及以下几种方式: 1. **URL ...

    基于ios的HTML5 Web APP

    首先,HTML5在移动设备上的应用越来越广泛,其强大的离线存储能力(如localStorage和IndexedDB)、多媒体支持(如video和audio元素)、以及拖放功能等,使得开发者能够创建功能丰富的Web应用。在这个案例中,`index....

    Pro iOS Web Design and Development

    5. **iOS Web App的本地化集成**:iOS设备支持多种语言,开发者需要了解如何通过国际化和本地化技术使Web应用适应不同地区的用户。包括日期格式、货币符号、文本方向等都需要考虑。 6. **性能优化**:由于iOS设备的...

    iOS App Signer Mac

    标题“iOS App Signer Mac”指的是一个专为Mac用户设计的工具,用于签署iOS应用程序。这个工具使得开发者或者普通用户能够在非官方应用商店之外安装和运行iOS应用,这对于测试、调试或者分发自定义构建的应用至关...

    ios app调用第三方app

    - 通用链接是iOS 9引入的一种新特性,允许Web和iOS应用之间无缝切换,即使第三方应用没有被安装,也可以通过Safari或其他浏览器访问相应内容。 5. **处理回调** - 当第三方应用处理完请求后,可能需要返回数据或...

    Native App与Web App移动应用发展.pdf

    同时,Progressive Web App(渐进式Web应用)的概念提出,使得Web App更加接近Native App的体验,有望在未来成为一种趋势。 5. 未来展望 未来,移动应用可能会走向更加多元化和融合的方向。一方面,Native App将...

    ios判断App是否安装.

    ### iOS 判断 App 是否安装的方法解析 #### 一、引言 在iOS开发过程中,有时候我们需要判断用户设备上是否已经安装了某个特定的应用程序。这种需求常见于应用间跳转或推荐安装等场景。本文将详细介绍如何通过自定义...

    iOS App Signer.zip

    总的来说,“iOS App Signer”为开发者和爱好者提供了一种快速且简便的方法来签署iOS应用,使得在非越狱设备上安装和测试应用成为可能。了解并掌握这一工具的使用,对于iOS开发者来说,无疑能够提高工作效率,拓宽...

    IOS WebView与JavaScript交互实现Web App

    这种模式下,`UIWebView`是苹果提供的一种关键组件,它允许我们在iOS应用中内嵌网页内容,并实现iOS应用与网页之间的交互。本篇文章将深入探讨如何在iOS中使用`UIWebView`加载bundle内的HTML文件,并实现WebView与...

    iOS 11 App Development Essentials Learn to Develop iOS 11 Apps with Xcode 9 epub

    iOS 11 App Development Essentials Learn to Develop iOS 11 Apps with Xcode 9 and Swift 4 英文epub 本资源转载自网络,如有侵权,请联系上传者或csdn删除 查看此书详细信息请在美国亚马逊官网搜索此书

    IOS Web Clip 代码保存内容到手机桌面

    【iOS Web Clip】是苹果iOS系统提供的一种功能,允许用户将特定的网页或者Web应用程序作为一个图标保存在手机主屏幕上,类似于创建一个快捷方式,方便快速访问。这种技术主要基于Safari浏览器,使得用户无需每次都...

    iOS 6 SDK在应用内展示App Store

    在iOS开发中,展示App Store是一项常见的功能,特别是在iOS 6时代,苹果引入了新的SDK,使得开发者可以更方便地在自己的应用内嵌入App Store的内容。本文将深入探讨如何利用iOS 6 SDK来实现在应用内展示App Store的...

    iOS跑步App代码

    在iOS平台上开发一款跑步应用,通常涉及到多个技术领域和组件,包括用户界面设计、地理位置服务、运动数据跟踪、数据存储以及可能的社交网络集成。以下是对"iOS跑步App代码"的详细解读: 首先,让我们从核心功能...

Global site tag (gtag.js) - Google Analytics