IOS前端瀏覽器定製

公司開發的是一款H5的程序,需要加一個IOS瀏覽器外殼,我們需要增加的功能就是一個微信分享,其他的都是js實現的。
首先,需要定製一個瀏覽器,看了一下ios的開發,要求瀏覽器用webkit,這個東西是ios8之後才支持的,ios8之前版本的使用率是8%,問了一下我們的產品經理,ios8沒有問題,網上雖然有一些兼容webkit和uiwebview的組件,但是需要測試,時間緊迫,那就用這個了。
從網上搜了一些wkWebView的資料,初始化後加載,沒有問題,增加了js調用oc的接口,增加微信分享功能,成功啓動了微信的界面,分享後發現回不去,搜索了一下,發現是微信分享要想回去,需要在配置裏面配置好微信的id,配置好後,可以正常返回了,然後開發微信主動通知後調用js的功能,由於微信回調的應用程序類沒有當前界面的實例,因此採用ios的消息機制,通知到wkwebview界面,然後調用js,經調試,一切正常,可以調用到。
Js的alert對話框需要實現WKUIDelegate接口,否則不會彈出對話框的。
本來開發的時候,我們打算開發一個h5的bs型結構,但是讀了apple的審覈手冊後,發現這種程序可能通過不了,於是考慮像其他程序一樣,將頁面的一部分做成本地的,一部分做成h5的,但是如何協調這兩種界面的切換,是個問題,比如原來在首頁的時候,下面的按鈕是原生的,但是當我徹底切換成其他的頁面的時候,我希望下面的原生的按鈕隱藏掉,首先我得判斷什麼情況下,需要切換到一個新的界面,然後通知oc切換界面,這個工作看起來比較麻煩,後來乾脆想到了一個主意,我仍然全部採用h5程序,只是將所有的代碼放到本地,讀取本地的就可以了,至少這樣的審覈的時候,不至於在h5上門糾結了,於是採用這種方案。
加載本地的h5,發現wkWebView是到ios9.0之後纔可以,但是我們的程序需要最低支持ios8.0。網上搜索了一下,最終採用在本機搭建一個簡單的webserver來解決。一開始用cocoahttpserver,但是發現不支持svg格式的圖片,後來改用了GCDWebserver,可以正常加載了。
程序做好了,需要增加logo和啓動頁,從網上搜索了一下,logo做了3張圖片,一張120*120,一張180*180,一張1024*1024,將logo設置爲默認的[email protected],發現不好用,最後非得將圖片拖入imageset裏面纔可以生效。
在做js效果的時候,想要弄一個左滑返回的效果,但是我同事說,Safari瀏覽器本身支持左右滑動切換界面。我在瀏覽器的配置裏面找了半天,總算是找到了allowsBackForwardNavigationGestures這個控制變量,置爲ture就可以實現左右滑動,在歷史記錄裏面切換了。但是隨之而來帶來一個新的問題,就是歷史記錄的管理,原來沒有增加這個東西的時候,安卓平臺我是每次到了主頁面,就把歷史記錄給清空處理的,但是到了ios平臺,我沒有找到如何清空歷史記錄的共有api。考慮採用嚴格管理歷史記錄的方式,即將所有的一級目錄之間的跳轉都採用js 的location.replace(URL)來處理,這樣就不會產生歷史記錄了,但是還有另外一個問題,就是用戶訪問了二三級頁面後,回到一級頁面,然後跳轉到其他一級頁面,仍然可以滑動切換到剛纔訪問的二三級界面,我嘗試修改WKNavigationDelegate.didStartProvisionalNavigation,但是這個事件得頁面完全被滑動到上一個界面後纔有響應,甚至重載WKWebView的跳轉到前一個瀏覽記錄的方法,根本不管用,這個方法只是被開發者調用的,但是不是瀏覽器向前滑動的響應事件。考慮用history.replaceState這個方法來在用戶返回的時候,將歷史記錄給替換了,但是用戶滑動界面的時候,只有window.onpopstate事件可以捕捉到這個事件,但是這個方法只有在safari瀏覽器裏面有反應,我用來調試的chrome瀏覽器捕捉不到這一個事件,沒有辦法來看這個事件的event都含有什麼信息,着急上線,就把滑動切換界面這個功能給去掉了。
不清楚蘋果對於BS型架構的接受程度,因此我們決定第一次審覈的時候,直接採用訪問服務器來獲取網頁的方案。這樣以後基本上不存在升級的問題了。如果因爲BS型架構不行再將h5打包到應用程序中。這種方案存在如果在使用中會存在網絡斷掉,訪問不了頁面的問題。於是我增加了一個錯誤頁面,點擊後頁面嘗試去加載服務器上的網頁。這個頁面可是費了我很多時間。網頁加載問題不大,因爲要兼容ios8,所以將錯誤界面做成了一個單一的html文件,直接讀取爲字符串,然後調用loadHTMLString這個加載,但是js的調用可是費了我很大功夫,加載網頁後,我要把當前訪問的頁面地址傳遞給錯誤頁面,用戶點擊的時候,location.replace就可以了,但是問題是我傳不進去啊。加載網頁後直接調用網頁js是不行的,我sleep一段時間也不行,這個時候js還沒有加載好,調用它不起作用,最後想到的辦法是用oc變量來保存加載錯誤的頁面,然後用戶點擊重新加載的時候,js調用oc代碼,oc代碼調用js的location.replace來重新加載。
提交apple審覈也是一堆坑,一開始Achieve的時候,校驗我的程序ID不存在,但是我都可以上機器調試了啊。搜了半天,發現是要先在apple官網裏面,我的應用裏面添加這個程序,纔可以校驗通過。
希望蘋果可以接受我們的bs型架構,至少在他審覈的時候,我們可以對程序進行完善,達到蘋果的要求。如果方案通不過,代碼也趨於完美了。下次審覈的時候,直接打包,再次提審

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章