小程序技術調研
非技術側內容精簡提要
通常審核被拒絕的原因
- 服務類目必須明確,與小程序內容符合,不可含有商業化,違禁用語
- 名稱簡介需要有關聯性,並不能使用通用且布局識別性的詞語命名
- logo清晰,且不得包涵騰訊,微信官方標識
- 誘導分享,關注,下載行為,含有明示或暗示的浮層,彈窗,文案,按鈕等,會被拒絕
- 小程序主要用途為營銷或者廣告的,會被拒絕(例如,懸浮廣告占據頁面50%視覺范圍,廣告遮住了內容等)
- 小程序可用性和完整性沒有達到要求的(小程序本身會崩潰或導致微信崩潰的,存在嚴重bug的,非測試版)
- 如果要收集用戶隱私,必須明確告訴用戶用途
- 需要提供小程序文檔和說明
- 禁止熱更新,禁止自動播放(斗魚都自動播放了,所以這條對我們沒什么用)
- 自有賬戶體系必須有易於發現的退出選項
- UI不符合規范(小程序有嚴格的UI規范)
- 浮層和彈窗不可關閉
- logo非透明或無有色邊框
- 如相關法律法規規定提供服務的界面必須進行特別信息標識的,應予以明確標識。如小游戲必須在游戲開始畫面顯著位置標明游戲的批准文號、網絡游戲出版號以及著作權登記號,全文登載《健康游戲忠告》等。
其他注意事項
- 小程序名稱不能喝公眾號,訂閱號,服務號重名,如果重名需要更換名稱
- 小程序名稱設置完成后就再也不能更改了
- 認證需要一點認證費用
- 服務器配置每個月只能修改三次
- 小程序頭像,介紹,服務范圍每個月只能修改1次,小程序二維碼在第一個版本上線后才能獲得
- 一個主體可以注冊30個小程序,一個綁定身份的開發者只能創建5個小程序
- 地理位置信息的采集使用必須征得用戶同意
-
特殊行業所需要的資質材料
- 社交直播類: 《信息網絡傳播視聽節目許可證》或《網絡文化經營許可證》(經營范圍含網絡表演)
- 小程序設計指南(不按規范來會被拒絕發布)
支付規范
- 支付必須明確提示
- 支付不得違法
- ios暫不能為虛擬物品購買提供支付功能(由apple程序開發許可協議和app store審核指南所限制)
功能頁面的配置
功能頁面不涉及參數,可以配置最多5組,這五組可以生成小程序二維碼
綁定開發者
- 已認證的企業小程序可以綁定20個開發者,40個體驗者。可以設置不同的權限。
- 未認證的減半。
- 個人的減半再減半。
技術側內容精簡提要
代碼的審核與發布
代碼在騰訊服務器上托管,所以我們需要在本地倉庫保管一份
小程序內是否可以內嵌網頁
- 可以,但是要遵循微信外部鏈接內容管理規范
- 但是提供功能應該與小程序一致,不得繞過微信小程序平台規則
- 如果違反,可能導致被限制功能或封禁處理
程序內登錄問題
小程序可以通過公眾號授權登錄,也可以通過自有賬號體系登錄,但是自有賬號體系在審核時需要為審核員提供一份測試賬號。
小程序服務器域名
現有現場程序支持四個合法域名地址。
request合法域名 | socket合法域名 | uploadFile合法域名 | downloadFile合法域名 |
---|---|---|---|
網絡請求合法域名 | websocket合法域名 | 文件上傳服務合法域名 | 文件下載服務合法域名 |
是否需要加密 | 是否需要加密 | 是否需要加密 | 是否需要加密 |
是 https | 是 wss | 是 https | 是 https |
小程序開發者工具
能夠查看小程序開發結果和上傳小程序代碼,必備
簡易教程
基礎庫兼容處理
基礎庫是什么
微信客戶端提供給小程序的基礎能力的庫,有版本區別,所以用戶需要處理好不同版本之間的兼容問題
如何兼容?
微信在最初的api接口中就內置了wx.getSystemInfo,wx.getSystemInfoSync接口可以獲取版本信息,可以通過這個來給用戶提示,要求用戶升級到最新版本等。
如果要使用某個超前api特性,並想要向下兼容,可以使用wx.canIUse接口來判斷當前api是否支持
小程序運行機制處理
你關閉小程序的時候會發現小程序依然在執行,這是涉及到了小程序的運行機制,為了了解這些坑,以及對小程序的更新,運行,再次打開等邏輯進行優化,有必要了解一下其機制
小程序的性能問題
- 不能濫用setData
- setData傳遞的數據不宜過大
- 如果用戶處於后台狀態,不宜進行setData
- 大圖片,長列表圖片資源過多會導致客戶端內存占用上升,會觸發webview內存回收,導致頁面卡頓。應勁量減少大圖片使用,並嘗試做圖片懶加載
- 嚴格限制代碼包大小,(代碼包最大只能2MB,注意)
- 控制靜態資源圖片的質量
- 及時清理無用代碼和資源
小程序多線程問題
目前小程序支持多線程,但是我們貌似沒有特別的需求要處理大量數據。
小程序api能力
- 網絡請求
- 上傳下載請求
- websocket請求能力
-
選擇圖片能力
- 從本地相冊選擇圖片或使用相機拍照
-
預覽圖片能力
- 預覽網絡圖片
-
獲取圖片信息能力
- 獲取圖片寬高本地路勁
- 圖片方向
- 圖片格式
-
保存圖片能力
- 需用戶授權
- 錄音能力
-
背景音樂播放控制
- 只支持m4a,aac,mp3,wav,hls。。。
-
音頻組件
- 創建並返回內部audio上下文(全局只有一個<audio>)
-
視頻組件控制
- 創建並返回視頻(就是video標簽對象)上下文對象,易於操作
-
視頻能力
- 拍攝視頻或從手機相冊中選視頻,返回視頻的臨時文件路徑。
-
保存視頻到用戶相冊
- 需要授權
-
相機組件控制api
- <camera/>
-
實時音視頻API
- <live-player/>(需要遞交材料申請開通)
-
文件操作API
- 保存
- 獲取文件信息
- 獲取已保存文件列表
- 獲取已保存文件信息
- 刪除已保存文件
- 打開文檔、、只支持doc,xls,ppt,pdf,docx,xlsx,pptx
-
數據操作api
- localStore緩存操作相關
- 地理位置api
-
system api
- 包括系統信息
- 網絡狀態
- 加速度記
- 羅盤
- 大電話
- 掃碼
- 剪貼板操作
- 藍牙操作
- 屏幕
- 震動
- nfc
- wifi
-
界面交互api
- 界面交互反饋(toast一類),
- 界面設置(導航條設置,tabBar設置,置頂信息設置等),
- 導航跳轉api,
- 動畫api,
- 頁面滾動api,
- 繪圖api(與canvas息息相關),
- 下拉刷新,
- 頁面節點操作(wxml api),
- 布局操作api
- 第三方平台相關api
-
開放接口
- 登錄api
- 授權api
- 用戶信息api
- 微信支付api
- 模板消息推送
- 客服消息
- 轉發分享api
- 收貨地址api
- 設置api
- 卡卷api
- 微信運動api
- 打開app API
- 生物認證api
- 更新api
- 打點上報api
- 多線程api
小程序的測試
如何在移動應用中直接拉起小程序
首先,公眾號平台關聯小程序(小程序平台也能關聯公眾號)。
其次,安卓,ios可以加入相關sdk,調用其調起接口。
如何在一個程序頁面內發起群聊
- 首先要分享
- 群聊id
- wx.updateShareMenu api了解一下,其中參數shareTicket是獲取openGID的關鍵
- 使用wx.updateShareMenu({withShareTicket:true})重置了分享鏈接的,在微信群里的分享卡片無法被長按分享
- 啟動小程序時可以通過App.onLaunch 或者App.onShow 獲取 shareTicket
- openGID並不能直接獲取,需要向自己的后台發送shareTicket並解密后拿到真實的openGID
- wx.onShareAppMessage api在2018年7月5日后將不再支持,最終只能在啟動參數中獲取了,請注意
- 群聊對應的名稱不能直接獲取,只能調用<open-data>組件展示
- 首個分享群聊的群友,也必須通過點擊群里的分享卡片才能進入群聊
- 群聊具體實現依賴我方,小程序並不直接提供群聊功能
小程序es6 api支持情況
不支持以下api
- String.prototype.normalize
- Array.prototype.values
- Array.prototype.includes (ios 8 不支持)
- Proxy
小程序樣式支持問題
wxss在某些情況下,渲染表現可能不一致(ios WKWebView UIWebView, Android Mobile Chrome 53/57),開啟樣式補全可以解決大部分問題,但不是全部
針對es6/7特性如何做
小程序ide本身可以開啟es6轉es5。但限制於內置babel-core,開發體驗其實並不好。
在現有的解決方案中,為了減少學習曲線,可以使用wepy等現有開發框架直接進行開發(原因: wepy等類似框架對小程序原有開發體驗封構了一層,可以使用類似vue單文件的開發體驗進行開發)
wepy同時使用promise對小程序提供的原生API封裝了一層,可以方便的使用 async await等語法,避免了同步只能發起5個wx.request的問題。
wepy作為一套官方解決方案,可以直接上手使用。
小程序iconfont
不支持引入ttf等文件,如果非要用,轉成base64或者使用網絡靜態資源
樣式層級問題
小程序樣式層級由於嚴格的資源限制,並沒有做過多的樣式層級解析
所以如果你有
<view class="a"> <view class="b"></view> </view> <style> .a { color: #000; } .b { color: #f00; } </style>
形如上面的樣式層疊寫法,.b不起作用,必須寫成 .a .b {}才行
小程序頁面棧限制
小程序最多允許5層頁面記錄,超過就會產生回不到首頁的問題,所以請合理使用wx.navigateTo, wx.redirectTo,wx.switchTab幾個api
redirectTo會覆蓋當前棧記錄,所以請不要在首頁用
小程序音視頻組件,在線直播應用場景
<video>標簽直接支持m3u8直播形式,但不支持flv直播形式(如果在白名單內可以直接播放m3u8, 我們在)
<live-player>標簽支持兩種直播形式,但是需要資質證明
wx.getUserInfo問題
由於收到開發者的反饋,為了方便開發者更好地使用 獲取用戶信息 的接口,開發者仍然可以使用 wx.getUserInfo 接口獲取用戶信息。
具體優化調整如下:
1.獲取用戶頭像昵稱,第一次需要使用 button 組件授權,如果已經用組件授權了,wx.getUserInfo 可直接返回用戶數據,無需重復授權彈窗。
- 如果沒有用 button 組件授權,wx.getUserInfo 調用接口返回失敗,提醒開發者需要先使用 button 組件授權。
- 用戶可在設置中,取消授權。取消授權后需重新用 button 組件拉起授權。
此次調整僅會影響開發者工具、體驗版和開發版,正式版本小程序暫不受影響。
rpx單位
由於小程序當前使用的單位視口就是一個相對根元素單位root em-quads px,已經做好相對轉換(他把屏幕均分成750個單位)。所以在作圖的時候,以750px的圖稿開發正好合適
1rpx問題
在有些機型上,1rpx可能顯示不出來,原因很簡單,rem計算方式了,屏幕實際像素,邏輯像素的相關概念
0rpx問題
margin padding 寫0的時候最好不要帶rpx單位,不然可能產生間隙
全屏問題
height: 100%解決不了就用height: 100vh
vh和vw的兼容性良好
setTimeout問題
小程序的頁面setTimeout會一直存在,即使跳轉頁面依然存在,請書寫業務的時候注意
原生組件問題
input,textarea,video,map,canvas,live-player等組件,非webComponent,是原生實現,顯示層級上相當高,可能出現樣式層蓋不住的情況,開發和設計請注意.
wx.require
有並發5個請求的限制,wepy框架是怎么解決的呢?wepy框架實現了一個簡單的消息隊列,只有當上一個請求完成,才會進行下一個請求,隊列最大限制是10個請求
其他開發坑
-
{{}}不能執行方法,只能處理簡單運算+-*/
-
由於小程序無管道實現(也就是time | filters 這類),所以只能運用以下幾種方式
- 1.直接setData (大量循環時成本過高)
- 2.設置getter (大量循環時經常訪問,也不是很好)
- 3.在獲取數據時直接過濾掉
-
wxs擴展的方法可以在wxml里使用,wepy框架同理
<!-- wxml使用方式 --> <wxs src="../filter/index.wxs" module="filter" /> <view>{{filter._filterOrderType(item.type)}}</view> <view>{{filter._filterTimestamp(item.time)}}</view> <!-- wepy使用方式.wpy --> <template> <text>{{filter.doSomething(...)}}</text> </template> <script> import filter from './../filter/filter1.wxs' default class Page1 extends wepy.page { wxs = { filter: filter } } </script>
-
- wcss本地靜態資源支持問題(圖片),所以我們需要實現一套圖片資源上傳至cdn的邏輯
wepy
wepy主要解決哪些問題?
原生小程序開發的痛點
- 小程序的定制開發文件體系中,難以直接使用某些es6特性(即使是開啟es6轉es5的編譯)
- 一個頁面或者一個組件對應3-4個文件,其實不怎么利於維護
- 你要手動引入npm,極端費力
- request的並發限制問題
- 全局數據的維護問題
- 並不支持less scss stylus pug hbs等不同預編譯器
所以wepy直接解決了上述問題,優化了開發體驗
wepy創建模板項目
npm i wepy-cli -g wepy init standard myproject # 輸入上面一行代碼會有一系列選項 cd myproject npm init
由於wepy自帶構建和打包,所以用戶需要關閉project.config.js里的一些選項,避免微信開發者工具沖突,微信開發者工具僅僅當做一個預覽工具,但要預覽,你需要設置項目目錄(微信開發者工具-添加項目-項目目錄更改)
wepy如何賦予書寫者書寫es6能力
- wepy-compiler-babel
- wepy-compiler-less
-
babel-plugin-transform
-
支持class屬性寫法
class a { data = { a: 1, b: 2 } }
-
支持裝飾器寫法
- 裝飾器描述詳見tc39草案文檔
function dec(id){ console.log('evaluated', id); return (target, property, descriptor) => console.log('executed', id); } class Example { @dec(1) @dec(2) method(){} }
-
允許擴展export from語句
- export * as ns from 'mod';
- export v from 'mod';
-
支持object成員展開
- let { x, y, ...z } = { x: 1, y:2, c: 3, d: 4 };
- let n = { x, y, ...z };
-
- 其他transform,你可以自行npm i babel-plugin-transform-x -D,並在wepy.config.js里配置,擴展其余tc39草案規則
為什么說wepy更適合dev-prod開發
wepy引入了cross-env,你可以在wepy.config.js里同時寫上dev配置和prod配置,靈活使用
WePY根據環境變量來改變運行時的參數
wepyignore文件
用於忽略不用打包的文件,不要什么都帶上線
.eslintrc
可以自行擴展代碼檢查規則,保證代碼風格一致
測試
wepy-cli 支持以html的形式直接打開,通過cli發送命令,可以模擬登陸,獲取微信用戶數據等一系列操作,可以進行頁面測試。但wepy並沒有提供測試套件,需要自行研究。
后期可以自行加上測試腳本,可以參考小程序測試方案初探
總結
用已有的腳手架直接開發更快速,自己搭建太慢了,並且我們沒有時間寫wcss, wxml, wxs文件解析器,所以請直接使用現有腳手架。
轉載自:https://segmentfault.com/n/1330000015597474