現在各種小程式風靡,這邊H5的需求還沒有搞定,產品又要求做小程式版本,做可以,關鍵是618前上線,我…… whatever,618要做推廣,日期訂了,剩下的就只能是排期,定方案,儘可能完成。 最後和產品商量之後的決定是:小程式中特有的營銷推廣的頁面,用小程式編寫,剩下的黃金流程,內嵌H5解決。 聽起 ...
現在各種小程式風靡,這邊H5的需求還沒有搞定,產品又要求做小程式版本,做可以,關鍵是618前上線,我……
whatever,618要做推廣,日期訂了,剩下的就只能是排期,定方案,儘可能完成。
最後和產品商量之後的決定是:小程式中特有的營銷推廣的頁面,用小程式編寫,剩下的黃金流程,內嵌H5解決。
聽起來好像很簡單,but,沒有想象中那麼簡單。
判斷是否在小程式中
這個問題,網上一搜,答案很多,有說用UA的,有說用微信註入的JS對象的,有說用原生提供判斷方法的。
UA的有一個很大的問題,iOS判斷不了,它是沒有miniProgram這個欄位的。在開發工具和Android中是可以的。
而__wxjs_environment這個對象,在測試的一臺三星上也不行,Android6.0系統。
而微信提供的原生方法,wx.miniProgram.getEnv。在小程式和微信瀏覽器打開,是沒有問題的。
但是在瀏覽器裡面,回調不執行啊啊啊啊!!!
這就導致了一個問題,如果在瀏覽器中打開,因為回調沒有執行,所以需要再執行一遍,不在小程式時的代碼邏輯。
如果只是簡單的顯示隱藏,就還好,小程式里多走一遍也沒有關係,但是,如果是一些對執行次數敏感的代碼,就會有問題。
我們做了檢測,雖然是回調,但是在小程式里,回調函數的執行總是排在前面。所以,前期決定先定義一個Flag,如果執行過一遍的代碼,Flag置為false,就不再執行了。
在後續開發中,還是覺得這個方案不大穩妥,雖然不清楚微信的JS引擎如何解析JS代碼,但是總歸也是要回歸標準的,回調的代碼極有可能在後面才執行。
我提出一個方案,沒有必要非要判斷在小程式內,因為小程式的UA雖然在iOS中沒有miniProgram的欄位,但是卻有microMessage的欄位。
我們逆向思維一下,只要判斷這個代碼不在微信中即可,根據microMessage這個欄位。
if (ua.indexof('MicroMessage') == -1) {//說明不在微信中
// 走不在小程式的邏輯
} else {
wx.miniProgram.getEnv(function(res) {
if (res.miniProgram) {
// 走在小程式的邏輯
} else {
// 走不在小程式的邏輯
}
})
}
這樣基本上可以解決上面提到的次數敏感代碼執行的問題。
一個小坑
提一個小坑,為了代碼的健壯,我習慣性在調用方法時,寫成下麵的樣子:
if(wx && wx.miniProgram && wx.mingProgram.getEnv) {
wx.mingProgram.getEnv(function(){})
}
但是,這麼寫,在實際小程式里,wx一直都是undefined。
只能直接寫裡面的判斷代碼,就好使了。
這是什麼黑科技??
不管怎樣,微信是爸爸,小程式有坑也得忍著。我們做得H5頁面,據說還不如小程式日活高。
真是要笑著活下去……
end