H5+混合移動app應用開發——坑我太甚

来源:https://www.cnblogs.com/jiekzou/archive/2018/01/30/8384863.html
-Advertisement-
Play Games

用了MUI之後,才發現,那坑比我想象之中的要多得多,有些是H5的坑,有些是plus的坑,接下來我一一來吐槽一番。 IOS下麵,上拉的時候,速度稍微快一點,表頭自動隱藏,等你不拉的時候又自動顯示 這種情況,在Android下麵是正常的。why? 因為mui框架的頭部header和底部nav都是採用的f ...


用了MUI之後,才發現,那坑比我想象之中的要多得多,有些是H5的坑,有些是plus的坑,接下來我一一來吐槽一番。

IOS下麵,上拉的時候,速度稍微快一點,表頭自動隱藏,等你不拉的時候又自動顯示

這種情況,在Android下麵是正常的。why?

因為mui框架的頭部header和底部nav都是採用的fixed佈局

 <header id="header" class="mui-bar mui-bar-nav action-head" 

而IOS下麵壓根就不支持fixed佈局,所以嘍就杯具了,這個問題還體現在另一種情況下。那就是當頁面中的內容很長超出了一屏,而且頁面中存在文本框,這個時候如果我們文本框一聚焦,在ios下麵會自動滾動,軟鍵盤會彈出來,這時如果你上拉下拉操作,fixed佈局的部分就漂浮了。

我的解決方案

拋棄mui中舊的openWindow和openWindowWithTitle,採用最新的titleNView

    owner.openWindowWithTitle = function (WebviewOptions, title) {
        var _styles = {                             // 視窗參數 參考5+規範中的WebviewStyle,也就是說WebviewStyle下的參數都可以在此設置
            titleNView: {                       // 視窗的標題欄控制項
                titleText: title,                // 標題欄文字,當不設置此屬性時,預設載入當前頁面的標題,並自動更新頁面的標題
                titleColor: "#fff",             // 字體顏色,顏色值格式為"#RRGGBB",預設值為"#000000"
                titleSize: "17px",                 // 字體大小,預設17px
                backgroundColor: "#449DED",        // 控制項背景顏色,顏色值格式為"#RRGGBB",預設值為"#F7F7F7"
                progress: {                        // 標題欄控制項的進度條樣式
                    color: "#56CF87",                // 進度條顏色,預設值為"#00FF00"  
                    height: "2px"                    // 進度條高度,預設值為"2px"         
                },
                splitLine: {                       // 標題欄控制項的底部分割線,類似borderBottom
                    color: "#CCCCCC",                // 分割線顏色,預設值為"#CCCCCC"  
                    height: "0px"                    // 分割線高度,預設值為"2px"
                },
                autoBackButton: true
            },
        };
        WebviewOptions.styles = _styles;
        mui.openWindow(WebviewOptions);
    }

為什麼官方提供的Demo沒有這樣的現象,說到這裡,心裡就火,官方提供的demo,限制了上拉下拉的速度,很慢的,所以自然無法出現表頭在ios下麵自動隱藏的情況,而且也沒有這個長屏幕輸入文本框的情況。可是官方沒有給出任何說明,這才是最坑的。

其它問題:這裡的返回圖標的大小無法設置。H5+文檔中沒有找到相關設置的地方,我暈。

設置狀態欄顏色IOS下麵無效

一開始,我直接是通過修改manifest.json的配置來進行修改的,怎知Android下麵是可以了,但是ios下麵無效。plus節點下麵添加如下配置,將狀態欄設置為藍色背景。

"plus": {
        "launchwebview":{"statusbar":{"background":"#449DED"}},
        "statusbar":{"background":"#449DED"},/*狀態欄*/

為了在IOS中所有頁面中修改狀態欄顏色,我在一個公共的js文件中添加瞭如下代碼:

document.addEventListener('plusready', function () {
    plus.navigator.setStatusBarBackground("#449DED");// 設置系統狀態欄背景為藍色
    plus.navigator.setStatusBarStyle("UIStatusBarStyleBlackOpaque");// 設置系統狀態欄樣式為淺色文字
}, false);

OK,問題解決。

單WebView下麵的上拉下拉問題

為什麼官網給的Demo沒問題?因為那Demo太簡單了,實在是無法模擬真實的應用場景。

 

我目前的解決辦法:判斷當主界面的數據大於2條時,這是因為我這裡大於2條時會出現滾動條,我自動設置主界面的高度+1px,這樣做是為了產生垂直滾動條,然後在所有觸發這個滾動彈出層的地方,添加如下代碼:(比如說點擊狀態、或者點擊報修部門的時候)

isEmptyScroll = true;
window.scrollTo(1, 1);

載入數據列表的代碼

            if (app.$data.list.length <= 2) {
                if (isEmptyScroll) {
                    g.id("pullrefresh").style.height = g.getScreenInfo('height') +1 + 'px';
                }
            } else {
                g.id("pullrefresh").style.height = 'auto';
            }
            isEmptyScroll = false;

公共js代碼:

    /**
     * 獲得屏幕的高度
     * @param {Object} element
     */
    owner.getScreenInfo = function (element) {
        if (element == 'width') {
            return document.documentElement.clientWidth || document.body.clientWidth;
        } else {
            return document.documentElement.clientHeight || document.body.clientHeigth;
        }
    };

據說採用雙webview的話不會出現這種問題,我暫時沒有去實驗過,可是官方又推薦使用單webview的方式,說雙webview太耗性能而且使用沒那麼方便。很操蛋啊,我自然是優先採用官方推薦的方式哇!

獲取App緩存大小並清除緩存Android無效

按照H5+的方式去操作,IOS下麵能取到值,但是Android無效。

//清除緩存
                document.getElementById('clearCache').addEventListener('tap', function() {
                    mui.confirm('圖片及離線緩存的內容將會被刪除', '確定刪除所有緩存?', btnArray, function(e) {
                        if(e.index == 1) {
                            plus.cache.clear(function() {
                                mui.toast("應用緩存清除成功!");
                            });
                        }
                    });
                });

獲取緩存大小

    mui.plusReady(function() {
//獲取緩存大小 var _result = ''; plus.cache.calculate(function(size) { _result = g.bytesToSize(size); console.log(_result) document.getElementById("cacheSize").innerText =_result; });
});

公共方法:

    //位元組轉換為KB等大小
    owner.bytesToSize = function (bytes) {
        if (bytes === 0) return '0 B';
        var k = 1024;
        sizes = ['B', 'KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB'];
        i = Math.floor(Math.log(bytes) / Math.log(k));
        var _size = (bytes / Math.pow(k, i));
        return _size.toFixed(2) + ' ' + sizes[i];
    }

目前暫時沒有想到什麼好的辦法解決。

波浪效果在部分Android機型下無效

由於我這個動畫特效是採用的css3,所以很容易想到是瀏覽器樣式不相容引起的。其實就是添加-webkit-首碼來指定。因為移動端許多瀏覽器都是webkit內核。

HTML

<div class="portrait-clockin fr">
                        <div class="dot" v-on:tap="doPunchCard()">
                            <div class="dot2">
                                <div class="dot3">
                                    <ul>
                                        <li class="one fl" v-text="nowTime"></li>
                                        <li class="fl">打卡</li>
                                    </ul>
                                </div>
                            </div>
                        </div>
                    </div>

css樣式:

.portrait-clockin{width: 3rem;height: 3rem;margin: 0 15px 0px 0px;}
.fr {
    float: right;
}
/*上班打卡 水波紋效果*/
a.dot:active,a.dot2:active,a.dot3:active{background: #70a236;}
.dot {
  animation: sploosh 1.5s cubic-bezier(0.165, 0.84, 0.44, 1);
  -webkit-animation:sploosh 1.5s cubic-bezier(0.165, 0.84, 0.44, 1);
}
.dot2 {
  animation: sploosh2 1.5s cubic-bezier(0.165, 0.84, 0.44, 1);
   -webkit-animation:sploosh2 1.5s cubic-bezier(0.165, 0.84, 0.44, 1);
}
.dot3 {
  animation: sploosh3 1.5s cubic-bezier(0.165, 0.84, 0.44, 1);
  -webkit-animation:sploosh3 1.5s cubic-bezier(0.165, 0.84, 0.44, 1);
}
.dot ul{margin: 0px;padding: 0px;width: 100%;margin: 0.65rem 0px;}
.dot li{width: 100%;font-size: 0.48rem;line-height: 0.5rem;height: 0.5rem;}
.dot li.one{font-size: 0.4rem;line-height: 0.8rem;height: 0.8rem;}
.dot,.dot2,.dot3{
  height: 96px;width: 96px;
  font-size: 20px;color: #fff;line-height: 96px;text-align: center;border-radius: 100%;
  position: absolute;z-index: 1;animation-iteration-count:infinite;
  -webkit-animation-iteration-count:infinite;background: transparent;
}
@keyframes sploosh {
  0% {box-shadow: 0 0 0 0px rgba(158, 203, 244, 0.7);background: rgba(84, 166, 240, 0.7);}
  100% {box-shadow: 0 0 0 10px rgba(158, 203, 244, 0);background: rgba(84, 166, 240, 0);}
}
@keyframes sploosh2 {
  0% { box-shadow: 0 0 0 0px rgba(110, 179, 243, 0.7);background: rgba(84, 166, 240, 0.7);}
  100% {box-shadow: 0 0 0 6px rgba(110, 179, 243, 0);background: rgba(84, 166, 240, 0.3);}
}
@keyframes sploosh3 {
  0% {box-shadow: 0 0 0 0px rgba(255, 255, 255, 0.7);background: rgba(84, 166, 240, 0.7);}
  100% {box-shadow: 0 0 0 2px rgba(255, 255, 255, 0); background: rgba(84, 166, 240, 1);}
}

@-webkit-keyframes sploosh {
  0% {-webkit-box-shadow: 0 0 0 0px rgba(158, 203, 244, 0.7);background: rgba(84, 166, 240, 0.7);}
  100% {-webkit-box-shadow: 0 0 0 10px rgba(158, 203, 244, 0);background: rgba(84, 166, 240, 0);}
}
@-webkit-keyframes sploosh2 {
  0% {-webkit-box-shadow: 0 0 0 0px rgba(110, 179, 243, 0.7);background: rgba(84, 166, 240, 0.7);}
  100% {-webkit-box-shadow: 0 0 0 6px rgba(110, 179, 243, 0);background: rgba(84, 166, 240, 0.3);}
}
@-webkit-keyframes sploosh3 {
  0% {-webkit-box-shadow: 0 0 0 0px rgba(255, 255, 255, 0.7);background: rgba(84, 166, 240, 0.7);}
  100% {-webkit-box-shadow: 0 0 0 2px rgba(255, 255, 255, 0); background: rgba(84, 166, 240, 1);}
}
/*波紋結束*/

 關於圓點在IOS下麵顯示的問題

圓點效果如下:

我之前的做法:

<span v-if="item.rad" href="#" class="round"></span>

CSS代碼如下:

/*小圓點*/
.round {
    width: 6px;height: 6px;display: -webkit-inline-box;font-size: 7px;margin-left: -2px;
    line-height: 6px;text-align: center;color: #FD7777;text-decoration: none;position: absolute;top: 5px;
}

結果我發現,在IOS下麵這個小圓點是在是太小了,而且無論你怎麼修改樣式的寬和高都無效。

後來的做法:

HTML代碼結構如下, class="round"部分

 <a v-for="(item,index) in menus" v-on:tap="getTaskList(item.name)" class="mui-control-item" v-bind:id="item.id" v-bind:class="{'mui-active': !index}">
                    <span v-text="item.title"></span>(<span v-text="item.taskNum"></span>)
                    <span v-if="item.rad" href="#" class="round"></span>
                </a>

CSS代碼如下:

/*小圓點*/
.round {
    border-radius:50%;width: 6px;height: 6px;display: -webkit-inline-box;font-size: 6px;margin-left: -2px;
    line-height: 6px;text-align: center;background-color: #FD7777;text-decoration: none;position: absolute;top: 5px;
}

HBuilder更新有風險

HBuilder隔三差五的就會發佈新的補丁,然後你每天打開的時候,它就會自動彈出提示框,提示你是否更新,如果你一不小心點擊了更新,那你最好先看看補丁解決了哪些問題,看一下它的更新日誌。

然後一定要記得的是,要去更新你項目中mui.js、mui.css等等這些你項目中引用了的文件。如何更新呢?可以在最新的HBuilder中新建一個mui項目,然後把項目中的js和css文件拷貝過來。因為每一次打補丁,你很難確定它是否只修改了基座,還是其它mui相關的css或者js都有修改,所以保險的做法就是一起更新。還有個問題需要註意的是,每一次補丁升級,都有可能改出新的問題,所以在更新之前,建議先備份所有代碼,或者給代碼打一個標簽。

使用圖片縮放要註意

mui官方demo中提供了圖片縮放功能,其實這裡有需要註意的地方,如果需要用到圖片縮放的界面中,存在文本框等需要輸入和編輯的地方,會讓你輸入和編輯無效。也就是說你圖片縮放只能在詳情這種只需要展示的場景下使用,而官方是不會告訴你這些的,只有你被碰得頭破血流,才會感到多麼痛的領悟!

暫時就先吐槽這麼多,其它的問題還有很多....


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • NProgress.js 說明: NProgress是基於jquery的,且版本要 >1.8 下載地址: https://github.com/rstacruz/nprogress API: NProgress.start() — 啟動進度條 NProgress.set(0.4) — 將進度設置到具 ...
  • 初學Javascript做的一個別踩白塊小游戲,代碼簡陋,如下: 點擊之後,黑塊才能往下落,只能在最後一行點擊 ...
  • 使用BootStrap做一個簡單的商城首頁 代碼: ...
  • 匹配URL參數的正則表達式是: var reg = new RegExp("(^|&)" + name + "=([^&]*)(&|$)", "i"); ...
  • 目前正在學JS的原型思想(準確的說是從昨天2018.1.29開始正式接觸),琢磨了兩天,在chrome的console不停的敲了好多代碼測試__proto__和prototype的關係,有了些小收穫(見下圖,俗話說,具體的東西比抽象的更容易吸收,所以我就畫了一張圖)。 圖解:不同顏色線互不相交,同種 ...
  • BootStrap:優秀的前端框架 需要引入jQuery1.11以上版本 基本使用方式: 佈局容器: 用BootStrap佈局,需要容器,這裡有兩種容器,供參考: <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta http-equi ...
  • 上幾篇文章中我們羅列了一些獲取HTML頁面DOM對象的方法,當我們獲取到了這些對象之後,下一步將對這些對象進行更改,在適當的時候進行對象各屬性的修改就形成了我們平時看到的動態效果。具體js中可以修改DOM對象的那些屬性請參考下麵代碼片段和效果。 1、element.innerHTML 設置或返回元素 ...
  • 問題描述: nodejs require 緩存,無法檢測文件變化,當文件require引入後,當文件發生變動後即使再次使用require,返回的依然是第一次引入的文件內容,這怎麼破? 解決方案: delete require.cache[require.resolve('./testModule.j ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...