https://www.gravatar.com/avatar/7a0c24f697ea1587001c36d00039b60f?s=240&d=mp

WKWebView 那些坑

本文出处“腾讯Bugly(http://bugly.qq.com ),作者林泽水”

导语

WKWebView 是苹果在 WWDC 2014 上推出的新一代 webView 组件,用以替代 UIKit 中笨重难用、内存泄漏的 UIWebView。WKWebView 拥有60fps滚动刷新率、和 safari 相同的 JavaScript 引擎等优势。

简单的适配方法本文不再赘述,主要来说说适配 WKWebView 过程中填过的坑以及善待解决的技术难题。

1、WKWebView 白屏问题

WKWebView 自诩拥有更快的加载速度,更低的内存占用,但实际上 WKWebView 是一个多进程组件,Network Loading 以及 UI Rendering 在其它进程中执行。初次适配 WKWebView 的时候,我们也惊讶于打开 WKWebView 后,App 进程内存消耗反而大幅下降,但是仔细观察会发现,Other Process 的内存占用会增加。在一些用 webGL 渲染的复杂页面,使用 WKWebView 总体的内存占用(App Process Memory + Other Process Memory)不见得比 UIWebView 少很多。

在 UIWebView 上当内存占用太大的时候,App Process 会 crash;而在 WKWebView 上当总体的内存占用比较大的时候,WebContent Process 会 crash,从而出现白屏现象。在 WKWebView 中加载下面的测试链接可以稳定重现白屏现象:

http://people.mozilla.org/~rnewman/fennec/mem.html

这个时候 WKWebView.URL 会变为 nil, 简单的 reload 刷新操作已经失效,对于一些长驻的H5页面影响比较大。

2019新个税扣除细则图例

2019的个税专项终于落定,对工薪阶层来说真的是个好事,可以说是个良心正常。 总体来说就是一下几项:

  1. 子女教育专项附加扣除
  2. 继续教育专项附加扣除
  3. 大病医疗专项附加扣除
  4. 住房贷款利息专项附加扣除
  5. 住房租金专项附加扣除
  6. 赡养老人专项附加扣除

其中房租和房贷利息只能二选一。

http://img.ibook8.club/2018-12-25-15457288297791.jpg

细则图解如下:

http://img.ibook8.club/2018-12-25-15457185296810.jpg

http://img.ibook8.club/2018-12-25-15457185435893.jpg

http://img.ibook8.club/2018-12-25-15457185490326.jpg

http://img.ibook8.club/2018-12-25-15457185625124.jpg

http://img.ibook8.club/2018-12-25-15457185724261.jpg

http://img.ibook8.club/2018-12-25-15457185810751.jpg

Android开发Jcenter替换为国内镜像

众所周知,在开发中我们需要从maven中央仓库下载依赖库,但是因为某种原因,导致这些仓库无法访问,幸运的是国内很多大公司都搭建的镜像库供我们使用,比如阿里的maven镜像。android现在都是通过gradle要管理依赖库,你发现直接添加maven{url: url}的方式是无效的。这里提供下一个有效的方案。

allprojects{
    repositories {
        def REPOSITORY_URL = 'http://maven.aliyun.com/nexus/content/groups/public/'
        all { ArtifactRepository repo ->
            if(repo instanceof MavenArtifactRepository){
                def url = repo.url.toString()
                if (url.startsWith('https://repo1.maven.org/maven2') || url.startsWith('https://jcenter.bintray.com/')) {
                    project.logger.lifecycle "Repository ${repo.url} replaced by $REPOSITORY_URL."
                    remove repo
                }
            }
        }
        maven {
            url REPOSITORY_URL
        }
    }
}

重磅!Flutter 1.0 正式发布!

Flutter Live 2018 上,Google 宣布 Flutter 1.0 正式发布。这是谷歌首个稳定发布的用于为 iOS 和 Android 创建优美的原生体验的 UI 工具包。

当今跨平台移动开发充满了妥协。 开发者不得不在两种情况下做出选择: 要么为多个操作系统多次开发同一个应用程序,要么接受一个以牺牲性能换取跨端能力的解决方案。 有了Flutter之后,我们相信我们有了一个两全其美的解决方案: 图形和UI的硬件加速,由本地 ARM 代码驱动,针对两种流行的移动操作系统。

并不是用来取代传统的苹果和安卓手机应用程序模式; 相反,它是一个应用程序引擎,你可以嵌入到一个现有的应用程序或者开发一个全新的应用程序。

http://img.ibook8.club/2018-12-05-image2a.png

使用 Flare 构建的动画可以作为一个小部件嵌入到现有的 Flutter 应用程序中 http://img.ibook8.club/2018-12-05-Flare.gif

自从第一个测试版发布以来,我们一直在努力为 Flutter 增加新的功能和亮点。 特别是,我们完善了pixel-perfect iOS apps iOS widgets支持; 添加了对近二十种不同 Firebase 服务的支持; 并致力于提高性能和减少 Flutter 应用程序的大小。 根据社区的反馈,我们也解决了数以千计的问题。

下面是Flutter 1.0的新特性:

  1. 1.0版本的主要焦点是 bug 修复和稳定性。Flutter 1.0 使用的是最新的 Dart 2.1。Dart 2.1 提供更小的代码体积,更快的类型检查和更好的诊断。按照 Google 的说法,Dart 2.1 将输出代码的大小减少了 17%,并将编译时间缩短了 15% 。Dart 2.1 还包含新的语言特性,例如通过新mixin关键字改进 mixin 支持、支持 int-to-double 的转换、编译时类型检查、新的 HTTP 状态码等等。
  2. Add to App 是一种逐步将现有应用移植到 Flutter 的方法,主要用于将 Flutter 用于现有应用,或者将现有应用分阶段转换为 Flutter 。
  3. platform views 则是一种相反的方式,用于将 Android 或 iPhone 平台的控件嵌入到 Flutter 应用。 可以把原生的视图控件嵌入到flutter app了 http://img.ibook8.club/2018-12-05-image7a.png

Google 还宣布了 Flutter 运行时基于 Web 的实验性实现 —— Hummingbird ,旨在将 Flutter 应用引入浏览器。它利用 Dart 平台的特性不仅可以编译原生 ARM 代码,还可以编译 JavaScript 。这使得 Flutter 代码可以在基于标准的 Web 上运行而无需任何更改。