日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

微信 android兼容性问题怎么解决方案,微信小程序兼容性问题

發布時間:2025/3/11 编程问答 51 豆豆
生活随笔 收集整理的這篇文章主要介紹了 微信 android兼容性问题怎么解决方案,微信小程序兼容性问题 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

本文我們來談談微信小程序系統兼容性的那些坑。

微信小程序兼容性問題

微信小程序發布一周多了,兼容性問題,特別是 Android 平臺兼容性問題特別嚴重。據我觀察,好多小程序掉到兼容性的坑里。掉坑里不要緊,更讓人捉急的是,從坑里爬上來的時候,手剛抓到坑沿,又被微信官方踩到(緊急修復兼容性的版本沒審核通過,被微信打回重審),再次跌落坑底,然后眼睜睜地看著后臺用戶在破口大罵“什么東西都沒有啊~,什么破小程序”。

微信小程序的兼容性問題除了微信本身的 Bug 外,大部分是目標平臺對 JavaScript 標準庫支持程度不同造成的。

微信本身的 Bug 引起的

微信本身的 Bug 引發的兼容性問題有個現成的例子,就是 wx.request() 返回的狀態碼 res.statusCode 的值在 iOS 下是 int 型數據,而在 Android 6.0.1 上卻是 String 型數據。如果你判斷服務器的返回狀態碼方法不當,可能就踩到坑里了。

wx.request({

url: 'http://api.example.com',

success: function (res) {

if (res.statusCode === 200) {

// success

} else {

// server failure

}

}

})

上述代碼就踩坑了,正確的做法是使用 == 而不是使用 === 來判斷。另外一個更規范的方法是使用 parseInt(res.statusCode) === 200 來實現。

Javascript 標準庫兼容性問題

比如 Array.find() 方法在 iOS 10.2/Android 7.0 上完美支持,但在 Android 6.0.1 上卻不支持。如果代碼里用到了這個接口,就會導致在 Android 6.0.1 上無法正常工作。通過對比發現,這類接口不支持的個數還是比較多的。特別是 Android 平臺版本眾多,兼容性問題就更嚴重,可能一不小小心就掉到坑里。

解決方法

微信本身 Bug 只能繞過去,但對 JavaScript 引擎的兼容性,可以有更優雅的解決方法。比如,我們可以打補丁,使用 polyfill 來實現這些不支持的標準庫方法。比如,修復 Android 6.0.1 平臺不支持 String.startsWith() 的問題,可以使用下面的 polyfill 代碼:

if (!String.prototype.startsWith) {

console.warn('define polyfill for Array.prototype.startsWith');

String.prototype.startsWith = function (searchString, position) {

position = position || 0;

return this.substr(position, searchString.length) === searchString;

};

}

推而廣之,我們可以把平臺不支持的標準庫方法,使用 polyfill 實現。這就是 minapp-polyfill 這個項目的目的。

使用方法很簡單,把 minapp-polyfill 項目里的 polyfill.js 拷貝到小程序源碼目錄下,在需要打補丁的 JavaScript 源文件頭部引入如下代碼即可:

import 'path/to/polyfill.js'

目前這個項目只是搭了個骨架,還有很多方法需要實現。PRs is welcome。

各個平臺對 JavaScript 標準庫支持情況

條件限制,這里統計了四個平臺對 JavaScript 標準庫的支持情況,分別是 iOS 10.2, Android 6.0.1, Android 7.0, 微信開發者工具,具體數據如下:

Component.apiName

iOS 10.2

Android 6.0.1

Android 7.0

devtool

Array.toString

YES

YES

YES

YES

Array.values

YES

N/A

YES

N/A

Array.toLocaleString

YES

YES

YES

YES

Array.concat

YES

YES

YES

YES

Array.fill

YES

N/A

YES

YES

Array.join

YES

YES

YES

YES

Array.pop

YES

YES

YES

YES

Array.push

YES

YES

YES

YES

Array.reverse

YES

YES

YES

YES

Array.shift

YES

YES

YES

YES

Array.slice

YES

YES

YES

YES

Array.sort

YES

YES

YES

YES

Array.splice

YES

YES

YES

YES

Array.unshift

YES

YES

YES

YES

Array.every

YES

YES

YES

YES

Array.forEach

YES

YES

YES

YES

Array.some

YES

YES

YES

YES

Array.indexOf

YES

YES

YES

YES

Array.lastIndexOf

YES

YES

YES

YES

Array.filter

YES

YES

YES

YES

Array.reduce

YES

YES

YES

YES

Array.reduceRight

YES

YES

YES

YES

Array.map

YES

YES

YES

YES

Array.entries

YES

N/A

YES

YES

Array.keys

YES

N/A

YES

YES

Array.find

YES

N/A

YES

YES

Array.findIndex

YES

N/A

YES

YES

Array.includes

YES

N/A

N/A

YES

Array.copyWithin

YES

N/A

YES

YES

Array.constructor

YES

YES

YES

YES

Buffer

N/A

N/A

N/A

N/A

DataView.getInt8

YES

YES

YES

YES

DataView.getUint8

YES

YES

YES

YES

DataView.getInt16

YES

YES

YES

YES

DataView.getUint16

YES

YES

YES

YES

DataView.getInt32

YES

YES

YES

YES

DataView.getUint32

YES

YES

YES

YES

DataView.getFloat32

YES

YES

YES

YES

DataView.getFloat64

YES

YES

YES

YES

DataView.setInt8

YES

YES

YES

YES

DataView.setUint8

YES

YES

YES

YES

DataView.setInt16

YES

YES

YES

YES

DataView.setUint16

YES

YES

YES

YES

DataView.setInt32

YES

YES

YES

YES

DataView.setUint32

YES

YES

YES

YES

DataView.setFloat32

YES

YES

YES

YES

DataView.setFloat64

YES

YES

YES

YES

DataView.constructor

YES

YES

YES

YES

Date.toString

YES

YES

YES

YES

Date.toISOString

YES

YES

YES

YES

Date.toDateString

YES

YES

YES

YES

Date.toTimeString

YES

YES

YES

YES

Date.toLocaleString

YES

YES

YES

YES

Date.toLocaleDateString

YES

YES

YES

YES

Date.toLocaleTimeString

YES

YES

YES

YES

Date.valueOf

YES

YES

YES

YES

Date.getTime

YES

YES

YES

YES

Date.getFullYear

YES

YES

YES

YES

Date.getUTCFullYear

YES

YES

YES

YES

Date.getMonth

YES

YES

YES

YES

Date.getUTCMonth

YES

YES

YES

YES

Date.getDate

YES

YES

YES

YES

Date.getUTCDate

YES

YES

YES

YES

Date.getDay

YES

YES

YES

YES

Date.getUTCDay

YES

YES

YES

YES

Date.getHours

YES

YES

YES

YES

Date.getUTCHours

YES

YES

YES

YES

Date.getMinutes

YES

YES

YES

YES

Date.getUTCMinutes

YES

YES

YES

YES

Date.getSeconds

YES

YES

YES

YES

Date.getUTCSeconds

YES

YES

YES

YES

Date.getMilliseconds

YES

YES

YES

YES

Date.getUTCMilliseconds

YES

YES

YES

YES

Date.getTimezoneOffset

YES

YES

YES

YES

Date.setTime

YES

YES

YES

YES

Date.setMilliseconds

YES

YES

YES

YES

Date.setUTCMilliseconds

YES

YES

YES

YES

Date.setSeconds

YES

YES

YES

YES

Date.setUTCSeconds

YES

YES

YES

YES

Date.setMinutes

YES

YES

YES

YES

Date.setUTCMinutes

YES

YES

YES

YES

Date.setHours

YES

YES

YES

YES

Date.setUTCHours

YES

YES

YES

YES

Date.setDate

YES

YES

YES

YES

Date.setUTCDate

YES

YES

YES

YES

Date.setMonth

YES

YES

YES

YES

Date.setUTCMonth

YES

YES

YES

YES

Date.setFullYear

YES

YES

YES

YES

Date.setUTCFullYear

YES

YES

YES

YES

Date.setYear

YES

YES

YES

YES

Date.getYear

YES

YES

YES

YES

Date.toJSON

YES

YES

YES

YES

Date.toUTCString

YES

YES

YES

YES

Date.toGMTString

YES

YES

YES

YES

Date.constructor

YES

YES

YES

YES

Error.toString

YES

YES

YES

YES

Error.constructor

YES

YES

YES

YES

Float32Array.constructor

YES

YES

YES

YES

Float64Array.constructor

YES

YES

YES

YES

Function.constructor

YES

YES

YES

YES

Int16Array.constructor

YES

YES

YES

YES

Int32Array.constructor

YES

YES

YES

YES

Int8Array.constructor

YES

YES

YES

YES

Map.forEach

YES

N/A

YES

YES

Map.clear

YES

N/A

YES

YES

Map.delete

YES

N/A

YES

YES

Map.get

YES

N/A

YES

YES

Map.has

YES

N/A

YES

YES

Map.set

YES

N/A

YES

YES

Map.keys

YES

N/A

YES

YES

Map.values

YES

N/A

YES

YES

Map.entries

YES

N/A

YES

YES

Map.constructor

YES

N/A

YES

YES

Math.abs

YES

YES

YES

YES

Math.acos

YES

YES

YES

YES

Math.asin

YES

YES

YES

YES

Math.atan

YES

YES

YES

YES

Math.acosh

YES

N/A

YES

YES

Math.asinh

YES

N/A

YES

YES

Math.atanh

YES

N/A

YES

YES

Math.atan2

YES

YES

YES

YES

Math.cbrt

YES

N/A

YES

YES

Math.ceil

YES

YES

YES

YES

Math.clz32

YES

N/A

YES

YES

Math.cos

YES

YES

YES

YES

Math.cosh

YES

N/A

YES

YES

Math.exp

YES

YES

YES

YES

Math.expm1

YES

N/A

YES

YES

Math.floor

YES

YES

YES

YES

Math.fround

YES

N/A

YES

YES

Math.hypot

YES

N/A

YES

YES

Math.log

YES

YES

YES

YES

Math.log10

YES

N/A

YES

YES

Math.log1p

YES

N/A

YES

YES

Math.log2

YES

N/A

YES

YES

Math.max

YES

YES

YES

YES

Math.min

YES

YES

YES

YES

Math.pow

YES

YES

YES

YES

Math.random

YES

YES

YES

YES

Math.round

YES

YES

YES

YES

Math.sign

YES

N/A

YES

YES

Math.sin

YES

YES

YES

YES

Math.sinh

YES

N/A

YES

YES

Math.sqrt

YES

YES

YES

YES

Math.tan

YES

YES

YES

YES

Math.tanh

YES

N/A

YES

YES

Math.trunc

YES

N/A

YES

YES

Math.imul

YES

YES

YES

YES

Object.toString

YES

YES

YES

YES

Object.toLocaleString

YES

YES

YES

YES

Object.valueOf

YES

YES

YES

YES

Object.hasOwnProperty

YES

YES

YES

YES

Object.propertyIsEnumerable

YES

YES

YES

YES

Object.isPrototypeOf

YES

YES

YES

YES

Object._defineGetter_

YES

YES

YES

YES

Object._defineSetter_

YES

YES

YES

YES

Object._lookupGetter_

YES

YES

YES

YES

Object._lookupSetter_

YES

YES

YES

YES

Object.constructor

YES

YES

YES

YES

Promise.then

YES

YES

YES

YES

Promise.catch

YES

YES

YES

YES

Promise.constructor

YES

YES

YES

YES

RegExp.compile

YES

YES

YES

YES

RegExp.exec

YES

YES

YES

YES

RegExp.toString

YES

YES

YES

YES

RegExp.test

YES

YES

YES

YES

RegExp.constructor

YES

YES

YES

YES

Set.forEach

YES

N/A

YES

YES

Set.add

YES

N/A

YES

YES

Set.clear

YES

N/A

YES

YES

Set.delete

YES

N/A

YES

YES

Set.has

YES

N/A

YES

YES

Set.entries

YES

N/A

YES

YES

Set.values

YES

N/A

YES

YES

Set.keys

YES

N/A

YES

YES

Set.constructor

YES

N/A

YES

YES

String.match

YES

YES

YES

YES

String.padStart

YES

N/A

N/A

N/A

String.padEnd

YES

N/A

N/A

N/A

String.repeat

YES

N/A

YES

YES

String.replace

YES

YES

YES

YES

String.search

YES

YES

YES

YES

String.split

YES

YES

YES

YES

String.toString

YES

YES

YES

YES

String.valueOf

YES

YES

YES

YES

String.charAt

YES

YES

YES

YES

String.charCodeAt

YES

YES

YES

YES

String.codePointAt

YES

N/A

YES

YES

String.concat

YES

YES

YES

YES

String.indexOf

YES

YES

YES

YES

String.lastIndexOf

YES

YES

YES

YES

String.slice

YES

YES

YES

YES

String.substr

YES

YES

YES

YES

String.substring

YES

YES

YES

YES

String.toLowerCase

YES

YES

YES

YES

String.toUpperCase

YES

YES

YES

YES

String.localeCompare

YES

YES

YES

YES

String.toLocaleLowerCase

YES

YES

YES

YES

String.toLocaleUpperCase

YES

YES

YES

YES

String.big

YES

YES

YES

YES

String.small

YES

YES

YES

YES

String.blink

YES

YES

YES

YES

String.bold

YES

YES

YES

YES

String.fixed

YES

YES

YES

YES

String.italics

YES

YES

YES

YES

String.strike

YES

YES

YES

YES

String.sub

YES

YES

YES

YES

String.sup

YES

YES

YES

YES

String.fontcolor

YES

YES

YES

YES

String.fontsize

YES

YES

YES

YES

String.anchor

YES

YES

YES

YES

String.link

YES

YES

YES

YES

String.trim

YES

YES

YES

YES

String.trimLeft

YES

YES

YES

YES

String.trimRight

YES

YES

YES

YES

String.startsWith

YES

N/A

YES

YES

String.endsWith

YES

N/A

YES

YES

String.includes

YES

N/A

YES

YES

String.normalize

YES

YES

YES

YES

String.constructor

YES

YES

YES

YES

Symbol.toString

YES

N/A

YES

YES

Symbol.valueOf

YES

N/A

N/A

YES

Symbol.constructor

YES

N/A

YES

YES

TypeError.toString

YES

N/A

N/A

YES

TypeError.constructor

YES

YES

YES

YES

Uint16Array.constructor

YES

YES

YES

YES

Uint32Array.constructor

YES

YES

YES

YES

Uint8Array.constructor

YES

YES

YES

YES

Uint8ClampedArray.constructor

YES

YES

YES

YES

WeakMap.delete

YES

YES

YES

YES

WeakMap.get

YES

YES

YES

YES

WeakMap.has

YES

YES

YES

YES

WeakMap.set

YES

YES

YES

YES

WeakMap.constructor

YES

YES

YES

YES

N/A 表示這個標準庫方法在平臺上不支持

Q: 這些數據是怎么來的,靠譜嗎?

A: 這些數據是在真實小程序運行環境下運行,然后把 API 支持情況發送到服務器后臺,再寫個腳本把數據整理匯總后得來的。

Q: 其他平臺,比如 Android 5.0 的支持情況怎么樣?

A: 由于條件限制,手上沒有 Android 5.0 的手機,有愿意配合收集數據的,私信留言。配合的方法很簡單,用指定型號的手機打開一個微信小程序,按一個按鈕即可。

Q: 為什么不使用 lodash 之類效率更高的庫,而使用的標準庫?

A: 使用 lodash 之類的確實效率更高,兼容性也更好。基于兩個原因沒有使用,一是 lodash 太大,而微信小程序限制在 1MB 以內。當然,可以用 lodash 模塊化的版本來解決,但還有第二個原因,即 lodash 的一些 API 也有兼容性問題,比如我試過 lodash.findIndex 這個包,結果在 Android 6.0.1 上也無法成功運行 (這一點未做深入驗證,感興趣的同學可以驗證一下)。

總結

從后臺數據來看,小程序剛發布的前三天,確實帶來了非常可觀的流量紅利,但這部分償鮮的用戶,很快就消失了。三天過后,基本上保持了平衡的訪問量。流量紅利和廣告一樣,是催化劑,真正有價值的還是要做用戶需要的產品。

在此順手安利一下開發的兩個小程序 360好書推薦 和 51經典電影,偶爾想用的時候打開,可能會偶遇一些小驚喜。但坦白講,這兩個小程序都和微信倡導的小程序價值觀不符。微信還是希望通過小程序把線下低頻的,服務成本高(這里應該主要是時間成本,即便利性)的場景,轉化為線上快捷的使用方式。

總結

以上是生活随笔為你收集整理的微信 android兼容性问题怎么解决方案,微信小程序兼容性问题的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。