1. 程式人生 > >利用JSPatch跳過AppStore稽核,動態更新APP

利用JSPatch跳過AppStore稽核,動態更新APP

hotfix的作用眾所周知,Android和iOS都有各自的技術,但是相比Android的當天釋出來說(如果你們的專案不需要灰度),iOS熱更新的意義更加重大。因為iOS稽核週期長不說,而且運氣不好會遇到各種被拒,即使申請快速稽核,也必須滿足二者之一:能夠準確的告訴蘋果復現crash的步驟,或者在特殊節日附近。 可能你費勁周折的提心吊膽和那麼多天其實也就是在某個類中加三行程式碼。

1.簡單介紹

在沒有JSPatch之前,可能有人會使用過JSCocoa。但是有著一系列複雜問題,比如原始碼已經多年沒有維護,程式碼規模巨大,不支援ARM64。如果想使用還需要升級libffi,並且嘗試相容ARM64,想編譯通過都很困難。

JSPatch的出現基本解決了上述所有問題。在一個專案中接入JSPatch的成本很低,需要動點腦筋的可能就是如何合理的提交和下載。

關於JSPatch的原理作者的部落格已經說的很清楚,本文不再說明,本文主要說的時一些接入操作相關。

如果你不是在董鉑然部落格園看到本文可點選檢視原文

2.倉庫設定

js檔案肯定不能隨便往後臺某個資料夾一放就讓前端去下載了,雖然使用方便但是在App或者版本較多時容易混亂。建議專門搭建一個遠端倉庫,倉庫裡主要就是資料夾和js檔案,當需要提交js檔案時,從主幹遷出一個分支,在合適的地方新建資料夾並新增js檔案,然後給主幹提Pull Request, 這應該是一個麻煩但是規範的流程。資料夾結構參考下圖:

第三層資料夾裡,可以用版本名稱也可以使用build號。之後在發請求下載的時候應該是需要拼上專案appname,version等引數。

3.安全策略

安全相關工作如果沒有做好,最慘的情況是人家可以通過js檔案呼叫你的任何OC方法,我們肯定不能允許此類事情發生。一般在js檔案提交到倉庫以後後端應該對這一段js程式碼進行 md5或者更高手段的編碼,並將這段編碼與檔案存在一起,上圖中得meta.json裡存的就是這一段編碼。 之後在發請求的返回值的結構應該是大致如下:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 { data: { isUpdate: true, content: "require('MTPoiFeedbackM') defineClass('MTFeedbackRankCell',{ setPoiFeedback:function(poiFeedback){ self.ORIGsetPoiFeedback(poiFeedback) var temColor = require('UIColor').lightGrayColor(); self.detailLbl().setTextColor(temColor); } })", code: "9c944f39e57f2e50bdb85deb878cc0f798efb9b0" } }

就是首先有個欄位告訴我們較上次下載的js檔案是否有更新。如果為true再檢測下方返回的code與內容編碼後得到的code是否相同。當然這個內容也可以不直接返回而是返回一個下載的url也是完全可以的。

4.更新頻率

我之前看到很多人把使用js和下載js的程式碼都放在了didFinishLaunchingWithOptions:這個方法。我覺得有所不妥,因為如果這個app使用者一直放在手機的後臺(比如微信),並且也沒出現記憶體警告的話,這個方法應該一直不會呼叫。我建議的是:使用js檔案的程式碼放在didFinishLaunchingWithOptions: 而下載js檔案的程式碼放在applicationDidBecomeActive: 因為這個方法在程式啟動和後臺回到前臺時都會呼叫。並且我建議設定一個間隔時間,根據一些資料和權衡之後我們採用的是間隔時間設為1小時。 也就是說每次來到這個方法時,先要檢測是距離上次發請求的時間間隔是否超過1小時,超過則發請求,否則跳過。

5.接入流程

接入的方式很簡單,作者也提供了Demo程式,大致就分為幾步:

①在General 的 LinkFrameworks and Libraries裡面 新增javascriptcore.framework

這個庫裡主要用於js與oc語言的橋接,比如一些資料型別間的相互轉化。

②podfile新增 pod 'JSPatch' 並pod install

③在程式碼中新增使用js和下載js的程式碼

這裡作者也給出了示例,使用和下載

1 2 3 4 [JPEngine startEngine]; NSString *sourcePath = [[NSBundle mainBundle] pathForResource:@"demo" ofType:@"js"]; NSString *script = [NSString stringWithContentsOfFile:sourcePath encoding:NSUTF8StringEncoding error:nil]; [JPEngine evaluateScript:script];
1 2 3 4 [NSURLConnection sendAsynchronousRequest:[
Ios熱更新實時程式碼更新動態更新動態庫framework

動態更新,iOS有三種處理方案 1,開源框架reactive native,但是程式語言是js iOS app可以在執行時從伺服器拉去最新的js檔案到本讀,然後執行,因為js是一門動態的指令碼語言 所以可以在執行時直接讀取js檔案執行,也因此能夠實現iOS的熱更新

Bootstrap常用、實用整理(bootstrap踩的坑)持續更新......

bootstrap是一個響應式前段框架、豐富的外掛。可以提高開發效率,前段時間專案中用到了bootstrap在這裡我記錄下專案中用到的東西及我的理解(我只是一個小白),希望大家多多指正、共同學習。 在這裡我要介紹下常用的、比如bootstrap suggest、及boots

iOS 熱更新實時程式碼更新動態更新動態庫framework

  允許轉載! demo 下載   只要稽核通過後,無須再次稽核,就可以動態更新,iOS有三種處理方案:    一、開源框架 reactive native,但是程式語言是js   二、lua 指令碼   三、使用oc語言的動態庫framewo

動態更新App的圖示(AppIcon)

序言         隨著時代的進步,人的生活多元化。一些公司的 App 也隨著人的生活改變而進行適和情景的變化。比如,本公司的 App 在四月時是本公司成立 4 週年的生日,那就想在本公司 App 的 Icon 上新增一個聖誕帽。第一種方法: 在 App 的

robotframework 判斷下拉框是否存在如果存在就執行下拉框操作不存在就執行下拉框操作進行下一步操作;

新頁面 存在 robot sel log 是否 work val image #本人新手,僅做學習記錄之用 因為工作要求,打開的ui頁面,根據前面篩選的條件不同,跳轉的新頁面不同,本記錄涉及的就是有下拉框和沒有下拉框,所以要對新打開的頁面進行判斷;run keyword

C#工作日計算幾個工作日之後到期的方法

double helper == spa public data- return mes cal 需求:消費者投訴企業,企業在2個工作日之內做出應答。 分析:1.工作日要刨去周末和法定節假日,而且每年的節假日不一樣。 2.消費者可以在任意時間發起投訴,如果在非工作日發起

debian/liunx更新源: 不支持 'amd' 體系結構配置文件 'non-free/binary-amd/Packages

捕獲 軟件包 free -s 軟件 binary amd debian 不支持 忽略:1 http://mirrors.ustc.edu.cn/debian stretch InRelease命中:2 http://mirrors.ustc.edu.cn/debian st

我在機器學習踩的坑現在告訴你怎麽過去

表示 alt 這樣的 就是 學習者 又是 路徑 com weixin 我在機器學習踩過的坑,現在告訴你怎麽跳過去 https://mp.weixin.qq.com/s/ko3WtQqilQ-7-H9vRZHdlg 大家好,我是為人造的智能操碎了心的智能禪師。 最

JSch登入sftp Kerberos username 身份驗證提示

一般情況下,我們登入sftp伺服器,使用者名稱認證或者金鑰認證即可。 但是如果對方伺服器設定了Kerberos 身份驗證,而已方又沒有對應的配置時,則會提示輸入 Kerberos username [xxx] Kerberos password 此時,簡單的解決辦法是,可以去掉Ke

MySQL複製衝突事物

日常生產中存在資料衝突導致的主從中斷,本文章模擬下主從中斷場景及修復。 1、兩臺主機互為主主,ip分別為192.168.26.75、192.168.26.76,以下簡稱75、76。目前複製正常。 2、在75操作,斷開76到75的複製。並在76插入一條資料,其中id為主鍵,具有唯一性。

【Django2x 學習筆記 05】面向api(模板使用者請操作已有資料庫的查詢、增加、修改

根據部落格https://blog.csdn.net/itas109/article/details/80898943 才知道如何查詢已有資料庫欄位。 Django官方文件https://docs.djangoproject.com/zh-hans/2.0/寫的真爛,愣是沒找到如何

C學習之路-scanf輸入char型別直接變數定義說明!

一:定義一個char型別變數的時候,如果沒有初始化為常量,預設值為空字元,對應ASCII為0,所佔記憶體為1個位元組 二:定義一個int型別變數的時候,如果沒有初始化為常量,預設值為 0,所佔記憶體為4個位元組 三:定義一個數組型別變數的時候,如果沒有初始化,每個元素的值都是

gitlab-ci window下構建Nodejs程式npm install後面的其他指令碼

背景 最近在處理一個nodejs的構建程式,因為需要打包為win可執行程式,並且有現成的ci工具可以用,就找了一個window機子作為gitlab-runner註冊到gitlab伺服器上,本地利用node npm 安裝包,起服務測試都沒問題,但是在gitlab-ci伺服器上執行的時候,就

shell判斷當前檔案是否存在目錄存在則

#獲取指定目錄下的所有檔名 path=/home/data files=$(ls ${path}) for filename in $files do #判斷檔案是不是目錄,是就跳過    if [ -d ${path}/$filename ]  

python某段程式碼執行時間如何執行下一步?

在工作中遇到過 個問題 執行一條程式碼時間過長 而且還不報錯,卡死在那。還要繼續執行下面程式碼,如何操作。 下面是個簡單的例項 pip安裝 第三方eventlet這個包 import time import eventlet#匯入eventlet這個模組 eventlet.monke