iPhoneX适配之Hybrid开发

Hybrid开发针对iPhoneX的适配之路

2017年9月苹果发布了iPhoneX。它的“新发型-齐刘海”很让程序猿们揪心。如何适配呢?由于AppCan的客户们逐渐的开始遇到iPhoneX适配问题了,那这里就以AppCan平台为例子,记录和分享一下适配过程。

Hybrid开发是指应用内既有原生也有H5页面(本地或在线)。H5页面通常使用系统提供的WebView来呈现。

适配前状况

  1. 打包使用Xcode8,不支持iOS11新特性,也无法支持iPhoneX等新机型;
  2. App运行在iPhoneX上的表现是:系统可能识别到app使用了iOS10的SDK打包,因此自动留下了比普通的安全区更“安全”(更宽)的黑边,极其难看;
  3. 等等。

基本方面适配

  1. AppIcon:(不过这跟iPhoneX适配无关)图标需要加入1024×1024的图标了,要不然上AppStore会被拒;

  2. 启动图:需要加入1125×2436分辨率的针对iPhoneX分辨率的启动图。加入正确分辨率的启动图之后,运行在iPhoneX时,可以看到不会有那种更“安全”(更宽)的黑边了,但是还是有黑边(也不是黑边,其实就是露出了后面的View背景),不是全屏的,而是似乎系统自动将WebView显示的内容放在了正常的安全区域内(即上空44px,下空34px);

WebView适配(以UIWebView为例)

有两种思路,一种是将UIWebView本身放在安全区域内,另一种是UIWebView铺满全屏,H5代码中对安全区进行适配。

UIWebView本身放置在安全区域内

  • 其实不用刻意去做,上文中已经提到,发现系统已经把WebView的大小调整在了安全区内,可能算是一种自动适配的手段吧。那既然如此,我们只需要调整一下WebView后面的View的背景颜色,让它与WebView的内容中上边缘和下边缘的颜色风格一致就看起来没问题了。

  • 但是,在AppCan框架中,我们发现打开插件和浮动窗口时,H5代码中传入的x和y都是相对于WebView页面内容的,而实际上addView时却是相对于外层的全屏View框架,这就导致了addView错位上移。于是我们采取统一给x和y添加偏移量来自动适配安全区位置。

  • 这样的适配方式,简单粗暴,强行留边,适用于一般情况。不过如果H5代码中需要一些花哨的适配,或者一些更加灵活的适配方式,那就需要下面的方式了。

UIWebView铺满全屏,H5进行进行适配

  • 由于目前UIWebView看起来好像是自动调整了自身的大小来把自己放在安全区内,所以,为了让它铺满全屏,我们还需要取消它的自动适配功能。方法是:在所有的H5页面中的meta标签加入下面的viewport-fit=cover属性:
<meta name="viewport" content="...,viewport-fit=cover" />
  • 可是,如果我们想要默认把所有页面都应用viewport-fit=cover的效果,就必须挨个页面改一遍么?我想默认就铺满全屏可以么?有个办法:我们在自定义的UIWebView初始化时加入下面代码即可:
    //设置webView自带的scrollView,使得view充满屏幕
    if(@available(iOS 11.0, *)){
        [self.scrollView setContentInsetAdjustmentBehavior:UIScrollViewContentInsetAdjustmentNever];
    }
  • 现在UIWebView铺满全屏了,H5代码如何处理呢?好心的苹果良心发现,在iOS11系统中的最新的WebKit内核中加入了一些常量,定义了what is 安全区,可以用于css中做padding使用,从而把内容限定在安全区内。示例如下:
        .iphonex-compat {
            /* iOS11.0-iOS11.1 */
            padding: constant(safe-area-inset-top) constant(safe-area-inset-right) constant(safe-area-inset-bottom) constant(safe-area-inset-left);
            /* iOS11.2+ */
            padding: env(safe-area-inset-top) env(safe-area-inset-right) env(safe-area-inset-bottom) env(safe-area-inset-left);
        }
  • 如果此时UIWebView没有使用开始的那两种方式进行铺满全屏的操作,则上述的constant或者env拿到的这些变量则均为0。而如果不是iOS11的系统,上述CSS function则是未定义状态,不起效果。

  • 另外,iOS 11.2 新增了 CSS function: min() 和 max(),用于横竖屏切换时,动态修改上下左右的padding(因为可能自己的页面本身就有padding,这是就要看谁大谁小了)。例如:

padding-left: max(12px, env(safe-area-inset-left));

参考文章

极速适配 iPhone X 秘笈:https://mp.weixin.qq.com/s/sCfNNxiX6v8Ak9JaOwljuw

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,015评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,262评论 1 292
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,727评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,986评论 0 205
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,363评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,610评论 1 219
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,871评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,582评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,297评论 1 242
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,551评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,053评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,385评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,035评论 3 236
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,079评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,841评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,648评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,550评论 2 270

推荐阅读更多精彩内容