苹果Iphone-IOS系统14版本以下不支持webp格式的图片

41800次阅读 3150人点赞 作者: WuBin 发布时间: 2021-07-27 13:54:28
扫码到手机查看

webp支持的范围

截止到2021年7月27日,webp格式支持的范围如下图(最新webp格式支持的设备):

如果项目是基于ios14.x以上的系统版本,那么可以放心的使用。

由于我手机IOS版本过低(13.3.1),打开嵌入有webp的页面,效果如下:

在安卓上的支持性,就非常的好了,我的一款华为畅享系列的手机都支持。所以在安卓上可以放心使用。

IOS不支持的原因

iOS 这边:

  1. 根据App Store 审核指南 - Apple Developer第 2.5.6 条:「如果 app 会浏览网页,则必须使用相应的 WebKit 框架和 WebKit Javascript」,上架 App Store 的应用不允许使用自己的浏览器内核
  2. iOS 的 WebView 基于 Safari
  3. Safari 不支持 WebP

安卓这边:

  1. 安卓不限制应用使用自己的浏览器内核,安卓微信用了腾讯自己的基于 WebKit 的 X5 内核:腾讯浏览服务
  2. 安卓的 WebView 基于 Chromium
  3. Chromium 支持 WebP,所以即使微信直接使用系统的 WebView 也支持 WebP

检测浏览器是否支持webp

使用 canvas 的 toDataURL 进行判断

经过真机测试,在IOS版本在14以上的设备上(即支持webp播放的设备上),也会提示false,所以此方法还是有点问题。经测试,
document.createElement('canvas').toDataURL('image/webp', 0.5)

在ios手机上会打印data:image/png;base64,..(无论是否是14.x之上或者之下的版本),只有在PC和安卓上才会打印data:image/webp;base64,所以这个方法仅仅作为参考,或者快速筛选出ios机型。

toDataURL方法在MDN解释如下:
HTMLCanvasElement.toDataURL() 方法返回一个包含图片展示的 data URI 。可以使用 type 参数其类型,默认为 PNG 格式。图片的分辨率为96dpi。
  • 如果画布的高度或宽度是0,那么会返回字符串“data:,”。
  • 如果传入的类型非“image/png”,但是返回的值以“data:image/png”开头,那么该传入的类型是不支持的。
  • Chrome支持“image/webp”类型。

toDataURL方法将图片转化为包含dataURI的DOMString,通过 base64 编码前面的图片类型值是image/webp进行判断。比如在谷歌浏览器使用toDataURL方法转成image/webp:

在 Safari 浏览器使用toDataURL方法转成image/webp:

可以发现在不支持 webp 的浏览器进行toDataURL,得到的图片类型并不是 webp,因此我们可以通过这个进行判断。

以下方法在IOS上判断会有错误,在IOS14.x支持webp的设备上也会得到false.试用时要特别注意,一定要进行真机测试,再决定是否使用。

var isSupportWebp = function () {
  try {
    return document.createElement('canvas')
               .toDataURL('image/webp', 0.5)
                .indexOf('data:image/webp') === 0;
  } catch(err) {
    return false;
  }
}(); // 自执行

通过加载一张 webp 图片进行判断

const supportsWebp = ({ createImageBitmap, Image }) => {
  if (!createImageBitmap || !Image) return Promise.resolve(false);

  return new Promise(resolve => {
      const image = new Image();
      image.onload = () => {
          createImageBitmap(image)
              .then(() => {
                  resolve(true);
              })
              .catch(() => {
                  resolve(false);
              });
      };
      image.onerror = () => {
          resolve(false);
      };
      image.src = 'data:image/webp;base64,UklGRh4AAABXRUJQVlA4TBEAAAAvAAAAAAfQ//73v/+BiOh/AAA=';
  });
};

const webpIsSupported = () => {
  let memo = null;
  return () => {
      if (!memo) {
          memo = supportsWebp(window);
      }
      return memo;
  };
};

webpIsSupported()().then(res => {
    console.log("是否支持 webp", res)
}).catch(err => {
    console.log(err)
})

此方法会加载一张 1x1 的白色的正方形背景图,用来测试浏览器是否支持 webp。

Google官方处理(推荐,无论什么机型都会得到正确结果)

先加载一个WebP图片,如果能获取到图片的宽度和高度,就说明是支持WebP的,反之则不支持

function check_webp_feature(feature, callback) {
    var kTestImages = {
        lossy: "UklGRiIAAABXRUJQVlA4IBYAAAAwAQCdASoBAAEADsD+JaQAA3AAAAAA",
        lossless: "UklGRhoAAABXRUJQVlA4TA0AAAAvAAAAEAcQERGIiP4HAA==",
        alpha: "UklGRkoAAABXRUJQVlA4WAoAAAAQAAAAAAAAAAAAQUxQSAwAAAARBxAR/Q9ERP8DAABWUDggGAAAABQBAJ0BKgEAAQAAAP4AAA3AAP7mtQAAAA==",
        animation: "UklGRlIAAABXRUJQVlA4WAoAAAASAAAAAAAAAAAAQU5JTQYAAAD/////AABBTk1GJgAAAAAAAAAAAAAAAAAAAGQAAABWUDhMDQAAAC8AAAAQBxAREYiI/gcA"
    };
    var img = new Image();
    img.onload = function () {
        var result = (img.width > 0) && (img.height > 0);
        callback(feature, result);
    };
    img.onerror = function () {
        callback(feature, false);
    };
    img.src = "data:image/webp;base64," + kTestImages[feature];
}

应用:

check_webp_feature('lossless', function(fea, res) {
  alert(res); // IOS-14之前的会显示false
});

PHP判断浏览器是否支持

# 判断浏览器是否支持webp解析 1支持  0不支持
$webp = strpos($_SERVER['HTTP_ACCEPT'], 'image/webp');
define('IS_WEBP', $webp === false ? 0 : 1);
echo IS_WEBP;

相关资料

点赞 支持一下 觉得不错?客官您就稍微鼓励一下吧!
关键词:webp
推荐阅读
  • uniapp实现被浏览器唤起的功能

    当用户打开h5链接时候,点击打开app若用户在已经安装过app的情况下直接打开app,若未安装过跳到应用市场下载安装这个功能在实现上主要分为两种场景,从普通浏览器唤醒以及从微信唤醒。

    9603次阅读 623人点赞 发布时间: 2022-12-14 16:34:53 立即查看
  • Vue

    盘点Vue2和Vue3的10种组件通信方式

    Vue中组件通信方式有很多,其中Vue2和Vue3实现起来也会有很多差异;本文将通过选项式API组合式API以及setup三种不同实现方式全面介绍Vue2和Vue3的组件通信方式。

    4297次阅读 317人点赞 发布时间: 2022-08-19 09:40:16 立即查看
  • JS

    几个高级前端常用的API

    推荐4个前端开发中常用的高端API,分别是MutationObserver、IntersectionObserver、getComputedstyle、getBoundingClientRect、requ...

    14452次阅读 948人点赞 发布时间: 2021-11-11 09:39:54 立即查看
  • PHP

    【正则】一些常用的正则表达式总结

    在日常开发中,正则表达式是非常有用的,正则表达式在每个语言中都是可以使用的,他就跟JSON一样,是通用的。了解一些常用的正则表达式,能大大提高你的工作效率。

    13497次阅读 491人点赞 发布时间: 2021-10-09 15:58:58 立即查看
  • 【中文】免费可商用字体下载与考证

    65款免费、可商用、无任何限制中文字体打包下载,这些字体都是经过长期验证,经得住市场考验的,让您规避被无良厂商起诉的风险。

    12015次阅读 963人点赞 发布时间: 2021-07-05 15:28:45 立即查看
  • Vue

    Vue3开发一个v-loading的自定义指令

    在vue3中实现一个自定义的指令,有助于我们简化开发,简化复用,通过一个指令的调用即可实现一些可高度复用的交互。

    16376次阅读 1307人点赞 发布时间: 2021-07-02 15:58:35 立即查看
  • JS

    关于手机上滚动穿透问题的解决

    当页面出现浮层的时候,滑动浮层的内容,正常情况下预期应该是浮层下边的内容不会滚动;然而事实并非如此。在PC上使用css即可解决,但是在手机端,情况就变的比较复杂,就需要禁止触摸事件才可以。

    15187次阅读 1234人点赞 发布时间: 2021-05-31 09:25:50 立即查看
  • Vue

    Vue+html2canvas截图空白的问题

    在使用vue做信网单页专题时,有海报生成的功能,这里推荐2个插件:一个是html2canvas,构造好DOM然后转canvas进行截图;另外使用vue-canvas-poster(这个截止到2021年3月...

    29849次阅读 2347人点赞 发布时间: 2021-03-02 09:04:51 立即查看
  • Vue

    vue-router4过度动画无效解决方案

    在初次使用vue3+vue-router4时候,先后遇到了过度动画transition进入和退出分别无效的情况,搜遍百度没没找到合适解决方法,包括vue-route4有一些API都进行了变化,以前的一些操...

    25909次阅读 1994人点赞 发布时间: 2021-02-23 13:37:20 立即查看
交流 收藏 目录