2017.02.06 版本
tabBar
tabBar 是一個數組,只能配置最少2個、最多5個 tab,tab 按數組的順序排序
邏輯層(App Service)
小程序開發框架的邏輯層是由JavaScript編寫。
邏輯層將數據進行處理后發送給視圖層,同時接受視圖層的事件反饋。 在 JavaScript 的基礎上,我們做了一些修改,以方便地開發小程序。
- 增加 App 和 Page 方法,進行程序和頁面的注冊。
- 增加 getApp 和 getCurrentPages 方法,分別用來獲取 App 實例和當前頁面棧。
- 提供豐富的 API,如微信用戶數據,掃一掃,支付等微信特有能力。
- 每個頁面有獨立的作用域,并提供模塊化能力。
- 由于框架并非運行在瀏覽器中,所以 JavaScript 在 web 中一些能力都無法使用,如 document,window 等。
- 開發者寫的所有代碼最終將會打包成一份 JavaScript,并在小程序啟動的時候運行,直到小程序銷毀。類似 ServiceWorker,所以邏輯層也稱之為 App Service。
App
- App() 必須在 app.js 中注冊,且不能注冊多個。
- 不要在定義于 App() 內的函數中調用 getApp() ,使用 this 就可以拿到 app 實例。
- 不要在 onLaunch 的時候調用 getCurrentPage(),此時 page 還沒有生成。
- 通過 getApp() 獲取實例之后,不要私自調用生命周期函數。
Page.prototype.setData()
- setData 函數用于將數據從邏輯層發送到視圖層,同時改變對應的 this.data 的值。
- 直接修改 this.data 無效,無法改變頁面的狀態,還會造成數據不一致。
- 單次設置的數據不能超過1024kB,請盡量避免一次設置過多的數據。
getCurrentPages()
不要嘗試修改頁面棧,會導致路由以及頁面狀態錯誤。
Page 實例的生命周期
mina-lifecycle.png
Bug & Tip
- bug: iOS/Android 6.3.30, 首次進入頁面,如果頁面不滿一屏時會觸發 onReachBottom ,應為只有用戶主動上拉才觸發;
- bug: iOS/Android 6.3.30, 手指上拉,會觸發多次 onReachBottom ,應為一次上拉,只觸發一次;
網絡
- 發起請求
- 網絡請求的 referer 是不可以設置的,格式固定為 https://servicewechat.com/{appid}/{version}/page-frame.html, 其中 {appid} 為小程序的 appid,{version} 為小程序的版本號,版本號為 0 表示為開發版。
- data 數據說明 最終發送給服務器的數據是 String 類型,如果傳入的 data 不是 String 類型,會被轉換成 String 。
轉換規則如下:
對于 header['content-type'] 為 'application/json' 的數據,會對數據進行 JSON 序列化
對于 header['content-type'] 為 'application/x-www-form-urlencoded' 的數據,會將數據轉換成 query string (encodeURIComponent(k)=encodeURIComponent(v)&encodeURIComponent(k)=encodeURIComponent(v)...) - content-type 默認為 'application/json'
bug: 開發者工具 0.10.102800 版本,header 的 content-type 設置異常; - 客戶端的 HTTPS TLS 版本為1.2,但 Android 的部分機型還未支持 TLS 1.2,所以請確保 HTTPS 服務器的 TLS 版本支持1.2及以下版本;
- 要注意 method 的 value 必須為大寫(例如:GET);
- url 中不能有端口;
- request 的默認超時時間和最大超時時間都是 60s
- request 的最大并發數是 5
- wx.request請求,method設為POST時,加上header: {'content-type': 'application/x-www-form-urlencoded'}可以正常獲取數據
- 上傳
- 最大并發限制是 10 個
- 默認超時時間和最大超時時間都是 60s
- 下載
- 最大并發限制是 10 個
- 默認超時時間和最大超時時間都是 60s
- 網絡請求的 referer 是不可以設置的,格式固定為 https://servicewechat.com/{appid}/{version}/page-frame.html, 其中 {appid} 為小程序的 appid,{version} 為小程序的版本號,版本號為 0 表示為開發版。
- 6.5.3 以及之前版本的 iOS 微信客戶端 header 設置無效
- WebSocket
- 如果 wx.connectSocket 還沒回調 wx.onSocketOpen,而先調用 wx.closeSocket,那么就做不到關閉 WebSocket 的目的。必須在 WebSocket 打開期間調用wx.closeSocket 才能關閉
- createSocket 鏈接默認和最大超時時間都是 60s
- 網絡請求的 referer 是不可以設置的,格式固定為 https://servicewechat.com/{appid}/{version}/page-frame.html, 其中 {appid} 為小程序的 appid,{version} 為小程序的版本號,版本號為 0 表示為開發版。
- 媒體
- 文件的臨時路徑,在小程序本次啟動期間可以正常使用,如需持久保存,需在主動調用 wx.saveFile,在小程序下次啟動時才能訪問得到。
- 錄音: wx.startRecord 接口需要用戶授權,請兼容用戶拒絕授權的場景。
- 控制音樂播放進度:iOS 6.3.30 wx.seekBackgroundAudio 會有短暫延遲
- 文件
- 本地文件存儲的大小限制為 10M
- 新開頁面打開文檔,支持格式:doc, xls, ppt, pdf, docx, xlsx, pptx
- 數據緩存
- 本地數據存儲的大小限制為 10MB
- 位置
- iOS 6.3.30 type 參數不生效,只會返回 wgs84 類型的坐標信息
- wx.getLocation、wx.chooseLocation 接口需要用戶授權,請兼容用戶拒絕授權的場景。
- 設備
- 獲取網絡類型 wifi/2g/3g/4g/unknown(Android下不常見的網絡類型)/none(無網絡)
- 重力感應、羅盤
- 監聽重力感應數據,頻率:5次/秒
- 監聽羅盤數據,頻率:5次/秒
- 交互反饋
- Android 6.3.30,wx.showModal 的返回的 confirm 一直為 true;
- wx.showActionSheet 點擊取消或蒙層時,回調 fail, errMsg 為 "showActionSheet:fail cancel"
- 導航
- 為了不讓用戶在使用小程序時造成困擾,我們規定頁面路徑只能是五層,請盡量避免多層級的交互方式。
- wx.navigateTo 和 wx.redirectTo 不允許跳轉到 tabbar 頁面,只能用 wx.switchTab 跳轉到 tabbar 頁面
- 開發接口
- 登錄
- code 換取 session_key(https://api.weixin.qq.com/sns/jscode2session?appid=APPID&secret=SECRET&js_code=JSCODE&grant_type=authorization_code)
- 在 App.onLaunch 調用 wx.login 會出現異常;
- 用戶信息
- wx.getUserInfo 接口需要用戶授權,請兼容用戶拒絕授權的場景
- 接口如果涉及敏感數據(如wx.getUserInfo
當中的 openId 和unionId ),接口的明文內容將不包含這些敏感數據。開發者如需要獲取敏感數據,需要對接口返回的加密數據( encryptedData )進行對稱解密。
- 微信支付
- 6.5.2 及之前版本中,用戶取消支付不會觸發 fail 回調,只會觸發 complete 回調,回調 errMsg 為 'requestPayment:cancel'
- 模板信息
- 微信6.5.2及以上版本支持模板功能。低于該版本將無法收到模板消息
- 分享
- 享圖片不能自定義;會取當前頁面,從頂部開始,高度為 80% 屏幕寬度的圖像作為分享圖
- 獲取二維碼
- 通過該接口,僅能生成已發布的小程序的二維碼。
- 可以在開發者工具預覽時生成開發版的帶參二維碼。
- 帶參二維碼只有 100000 個,請謹慎調用。
- POST 參數需要轉成 json 字符串,不支持 form 表單提交。
組件
- input
- 微信版本 6.3.30, focus 屬性設置無效;
- 微信版本 6.3.30, placeholder 在聚焦時出現重影問題;
- input 組件是一個 native 組件,字體是系統字體,所以無法設置 font-family;
- 在 input 聚焦期間,避免使用 css 動畫;
-
textarea
- 微信版本 6.3.30,textarea 在列表渲染時,新增加的 textarea 在自動聚焦時的位置計算錯誤。
- textarea 的 blur 事件會晚于頁面上的 tap 事件,如果需要在 button 的點擊事件獲取 textarea,可以使用 form 的 bindsubmit。
- 不建議在多行文本上對用戶的輸入進行修改,所以 textarea 的 bindinput 處理函數并不會將返回值反映到 textarea 上。
- textarea 組件是由客戶端創建的原生組件,它的層級是最高的。
- 請勿在 scroll-view 中使用 textarea 組件。
- css 動畫對 textarea 組件無效。
map
- map 組件是由客戶端創建的原生組件,它的層級是最高的。
- 請勿在 scroll-view 中使用 map 組件。
- css 動畫對 map 組件無效。
- canvas
- canvas 組件是由客戶端創建的原生組件,它的層級是最高的。
- 請勿在 scroll-view 中使用 canvas 組件。
- css 動畫對 canvas 組件無效。