1. 程式人生 > >Ios熱更新,實時程式碼更新,動態更新,動態庫framework

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

動態更新,iOS有三種處理方案

1,開源框架reactive native,但是程式語言是js

iOS app可以在執行時從伺服器拉去最新的js檔案到本讀,然後執行,因為js是一門動態的指令碼語言

所以可以在執行時直接讀取js檔案執行,也因此能夠實現iOS的熱更新

2,  lua指令碼

Lua指令碼如同js一樣,也能在動態時被。之前憤怒的小鳥使用lua指令碼做的一個外掛wax,

可以實現使用lua寫iOS應用。熱更新時,從伺服器拉去lua指令碼然後

動態的執行就可以了。遺憾的是wax目前已經不更新了。

3, 使用oc語言的動態庫framework。用oc進行熱更新

http://blog.csdn.net/jianrenbubai/article/details/50351507

===================

步驟:

1,建立framework工程

iOS----framework&library----cocoa touch framework


2,程式碼處理

寫一個controller的控制工具類

  1. #import "HotUpdateControl.h"
  2. #import "AController.h"
  3. #import "BViewController.h"
  4. #import "CViewController.h"
  5. #import "DViewController.h"
  6. #import "EViewController.h"
  7. @implementation HotUpdateControl  
  8. -(NSArray *)getVcs {  
  9.     return @[  
  10.              [[AController alloc]init],  
  11.              [[BViewController alloc]init],  
  12.              [[CViewController alloc]init],  
  13.              [[DViewController alloc]init],  
  14.              [[EViewController alloc]init]];  
  15. }  
  16. @end

好了,開始打包framework,為了避免打包出來的framework,在真機上面執行不了,我們使用一個指令碼來進行打包,目的是多型號CPU核心的合成,就是打出一個通用的包。

# Sets the target folders and the final framework product.
# 如果工程名稱和Framework的Target名稱不一樣的話,要自定義FMKNAME
# 例如: FMK_NAME = "MyFramework"
FMK_NAME=${PROJECT_NAME}
# Install dir will be the final output to the framework.
# The following line create it in the root folder of the current project.
INSTALL_DIR=${SRCROOT}/Products/${FMK_NAME}.framework
# Working dir will be deleted after the framework creation.
WRK_DIR=build
DEVICE_DIR=${WRK_DIR}/Release-iphoneos/${FMK_NAME}.framework
SIMULATOR_DIR=${WRK_DIR}/Release-iphonesimulator/${FMK_NAME}.framework
# -configuration ${CONFIGURATION}
# Clean and Building both architectures.
xcodebuild -configuration "Release" -target "${FMK_NAME}" -sdk iphoneos clean build
xcodebuild -configuration "Release" -target "${FMK_NAME}" -sdk iphonesimulator clean build
# Cleaning the oldest.
if [ -d "${INSTALL_DIR}" ]
then
rm -rf "${INSTALL_DIR}"
fi
mkdir -p "${INSTALL_DIR}"
cp -R "${DEVICE_DIR}/" "${INSTALL_DIR}/"
# Uses the Lipo Tool to merge both binary files (i386 + armv6/armv7) into one Universal final product.
lipo -create "${DEVICE_DIR}/${FMK_NAME}" "${SIMULATOR_DIR}/${FMK_NAME}" -output "${INSTALL_DIR}/${FMK_NAME}"
rm -r "${WRK_DIR}"
open "${INSTALL_DIR}"


點選1,新增一個指令碼2----HotUpdateScript,然後點選3,產生4的Run Script,然後把指令碼複製進去,再點選5,選擇指令碼打包編譯

複製到另一個專案的沙箱裡面去,就可以給另外的專案使用

33,建立一個主專案,就是使用這些動態庫的工程

現在進行讀取離線包的測試,只要這個專案,能夠從沙箱裡面讀取到程式碼檔案,就意味著可以線上更新程式碼,遠端升級,

我修改了UITabBarConroller載入板塊的初始化方法,如果沙箱有framework動態庫,就載入framework動態庫上面的版塊,令到專案可以模組化

  1. //
  2. //  TabController.m
  3. //  HotUpdate
  4. //
  5. //  Created by wukong on 15/12/18.
  6. //  Copyright © 2015年 lhc. All rights reserved.
  7. //
  8. #import "TabController.h"
  9. //#import <HotUpdateMudel/HotUpdateControl.h>
  10. @interface TabController ()  
  11. @end
  12. @implementation TabController  
  13. -(instancetype)initWithCoder:(NSCoder *)aDecoder{  
  14.     if (self = [super initWithCoder:aDecoder]) {  
  15.         NSString *documentDirectory = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];  
  16.         NSArray* arrFramework = [self getFilenamelistOfType:@"framework" fromDirPath:documentDirectory];  
  17.         NSLog(@"%@",arrFramework);  
  18.         if (arrFramework.count==0) {  
  19.              NSArray * arrTitle = @[@"首頁",@"廣場",@"朋友圈",@"我的",@"設定"];  
  20.             NSMutableArray * arrVcs = @[].mutableCopy;  
  21.             for (int i=0; i<arrTitle.count; i++) {  
  22.                 UIViewController * vcRoot = [[UIViewController alloc]init];  
  23.                 vcRoot.title = arrTitle[i];  
  24.                 vcRoot.view.backgroundColor = [UIColor whiteColor];  
  25.                 UINavigationController * navi = [[UINavigationController alloc]initWithRootViewController:vcRoot];  
  26.                 [arrVcs addObject:navi];  
  27.             }  
  28.             [self setViewControllers:arrVcs animated:YES];  
  29.         }else{  
  30.             NSString *bundlePath = [NSString stringWithFormat:@"%@/%@",documentDirectory,[arrFramework lastObject]];  
  31.             if (![[NSFileManager defaultManager] fileExistsAtPath:bundlePath]) {  
  32.                 NSLog(@"file not exist ,now  return");  
  33.                 returnself;  
  34.             }  
  35.             NSBundle *bundle = [NSBundle bundleWithPath:bundlePath];  
  36.             if (!bundle || ![bundle load]) {  
  37.                 NSLog(@"bundle load error");  
  38.             }  
  39.             Class loadClass = [bundle classNamed:@"HotUpdateControl"];  
  40.             if (!loadClass) {  
  41.                 NSLog(@"get bundle class fail");  
  42.                 returnself;  
  43.             }  
  44.             NSObject *bundleObj = [loadClass new];              
  45.             NSArray * arrVc = [bundleObj performSelector:@selector(getVcs)];  
  46.             NSMutableArray * arrVcs = @[].mutableCopy;  
  47.             for (int i=0; i<arrVc.count; i++) {  
  48.                 UIViewController * vcRoot =arrVc[i];  
  49.                 vcRoot.view.backgroundColor = [UIColor whiteColor];  
  50.                 UINavigationController * navi = [[UINavigationController alloc]initWithRootViewController:vcRoot];  
  51.                 [arrVcs addObject:navi];  
  52.             }  
  53.             [self setViewControllers:arrVcs animated:YES];  
  54.         }  
  55.     }  
  56.     returnself;  
  57. }  
  58. -(NSArray *) getFilenamelistOfType:(NSString *)type fromDirPath:(NSString *)dirPath  
  59. {  
  60.     NSArray *fileList = [[[NSFileManager defaultManager] contentsOfDirectoryAtPath:dirPath error:nil]  
  61.                          pathsMatchingExtensions:[NSArray arrayWithObject:type]];  
  62.     return fileList;  
  63. }  
  64. - (void)viewDidLoad {  
  65.     [super viewDidLoad];  
  66. }  
  67. @end

NANANANANANANNANANANANANNANNANANANANANNANANANANANANANANANANANA

如果 是本地的預設版本,應該是

@[@"首頁",@“廣場”,@“朋友圈”,@“我的”,@“設定”]的模組

但如果是沙箱裡面的模組,那麼就應該是ABCDE

===================================================

Lua熱更新

==========================================

Cocos2d-x已經封裝了用於實現熱更新功能的類,就是assetsmanager

api說明:

// 檢測是否有版本更新
virtual bool checkUpdate();

// 下載更新的資源包並解壓到下載路徑
virtual void update();

// 獲取當前客戶端版本號
std::string getVersion();

// 刪除客戶端版本號
void deleteVersion();

// 設定下載回撥(AssetsManagerDelegateProtocol)
void setDelegate(AssetsManagerDelegateProtocol *delegate);

// 設定連線超時時間(單位:秒)
void setConnectionTimeout(unsigned int timeout);

// 設定從服務端下載資源包的url
void setPackageUrl(const char* packageUrl);

// 設定服務端獲取版本號的url
void setVersionFileUrl(const char* versionFileUrl);

// 設定資源儲存路徑
void setStoragePath(const char* storagePath);

因為AssetsManager使用了pthread庫,所以需要在win32工程中需要包含pthread庫所在目錄。

VS在工程屬性——C/C++——常規——附加包含目錄中新增:$(ProjectDir)..\..\..\cocos2dx\platform\third_party\win32\pthread


相關推薦

Ios更新實時程式碼更新動態更新動態framework

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

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

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

深入理解java列舉程式碼更簡潔、易懂提升工作效率!

以往設定常量,通常將常量在介面中,在JDK1.5版本新增列舉型別後就逐漸取代了這種常量定義方式 列舉常量定義 列舉常用方法 values():該方法可以將列舉型別成員以陣列的形式返回。 valueOf():該方法可以實現將普通字串轉換為列舉例項。 compare

矩形ROI截圖實時顯示滑鼠的座標值顯示原圖與截圖C++程式

 //main.cpp檔案 #include <opencv2/core/core.hpp> #include <opencv2/highgui/highgui.hpp> #include <stdio.h> using name

WebStorm2017中專案更新智慧程式碼提示不顯示的解決方法

出現這個問題的時候,我百度了網上各種解決方法,都沒有用,後來就莫名其妙的好了。寫一個部落格記錄一下,以後再遇到同樣的問題的時候,給自己提供一個解決方法,雖然不能確保是不是有效,但多一種方法也沒有任何問題。對解決方法進行了一個總結,總結如下: 1.File-Power Save Mode,檢視該

利用svn鉤子hooks/post-commit實現程式碼更新自動執行指令碼

1. 在svn伺服器對應的專案中會存在以下幾個目錄和檔案 conf  db  format  hooks  locks  README.txt 其中目錄hooks是放置程式碼提交執行的檔案 進入 hooks目錄新建一個 post-comm

2018 阿里雲優惠大全彙總_阿里雲優惠券實時更新

企業上雲,首選阿里雲!企業及個人首選!全部優惠入口 阿里雲全部優惠都在這裡!實時更新!各入口點選下面 1、阿里雲通用代金券,點選領取1888元 2、阿里雲高效能伺服器2折入口: 3、阿里雲企業級效能雲伺服器限時優惠 4、阿里雲自營建站

關於vscode更新後 格式化程式碼造成函式括號後的空格被刪除單引號變雙引號問題的解決方法

前段時間做專案時遇到了語法格式的警告即 究其原因是因為專案建立時選擇了 ESLint 來規範程式碼,由於在VSCode1.7.2中替換了內建格式化外掛。所以在新的專案中格式化程式碼後引發程式碼規範驗證錯誤,經過幾番研究之後終於將其解決下面貼出解決方案: 修改Vscode的配置檔案,不知

AndroidStudio GiT 處理衝突(兩端更新程式碼處理程式碼衝突)

1.如果同時有不止1人修改了,專案中的同一個檔案,此時點選pull 會彈出一個訊息,提示說會 override覆蓋掉你的本地版本,此時,點選androidStudio上面的 updateProject按鈕 此時選擇: merge Using Stash 然後點選ok,會提示你有

通過複製程式碼建立專案功能如何在後期建立並更新到gitee程式碼倉庫

第一步:git修改遠端倉庫地址  方法有三種: 1.修改命令 git remote origin set-url [url] 2.先刪後加 git remote rm origin git remote add origin [url] 3.直接修改config檔案 第二步: 參考

程式碼】小技巧動態更新中。。。。

若要在迴圈內部修改正在遍歷的序列(例如複製某些元素),建議您首先製作副本。在序列上迴圈不會隱式地建立副本。切片表示法使這尤其方便: >>> words = ['cat', 'window', 'defenestrate'] >>> for w in w

Qt學習:QtCharts繪製動態曲線實時更新資料與座標軸

1.首先是掌握qtchart的基本使用,封裝一個屬於自己的繪圖類: Mychart.h #pragma once #ifndef CHART_H #define CHART_H #include <QtCharts/QChart> #inc

ios 企業證書明明已更新我的手機可以下載其他使用者都下載不了填坑

前言:企業 $299的賬號遇到的問題。事情的經過是這樣的~ 上週五的晚上,同事在微信群裡說我們的app下載不了了,他們都試過了都是一團黑乎乎的在那,一直不動呢。what~!!額~怎麼可能上個星期還可以下載的呀,而且證書早就更新過了,怎麼會呢!於是我自己手機掃描下

爬取微信好友資訊進行視覺化分析(頭像人臉識別部分已更新!)(程式碼已上傳)

【Code】下載 1、專案說明 本次專案主要實現了以下功能: 2、微信好友資訊的獲取與檔案儲存 3、微信好友性別分析 4、微信好友地區分佈視覺化 5、微信好友個性簽名詞雲圖及好友備註詞雲圖 6、微信好

不出門就知天下事的網站實時更新

1,OpenCV  中文網  http://www.opencv.org.cn/ 2,伯樂線上   blog.jobbole.com 3,IT公司面試手冊  http://www.mianwww.com 4,菜鳥網  http://www.runoob.com/ja

RxJava實戰(後臺執行耗時操作實時通知 UI 更新

開源專案 RxJava-Android-Samples,這裡一共介紹了十八種RxJava2的使用場景,這一系列文章主要參考該專案進行。 我們經常會在後臺執行緒中去做一些耗時的操作,比如去網路取資料,處理的方法有 HandlerThread、Threa

測試程式碼解決java gui swing多執行緒介面假死、僵死問題實現介面動態重新整理動態同步更新資料

(原創) 測試程式碼,解決java gui swing多執行緒介面假死、僵死問題,實現介面動態重新整理,動態更新,同步顯示資料 主類: package testguimulitiplethread; /** * * @author Administrator */ public class Mai

jenkins安裝構建第一個工程(更新程式碼到工作空間)

1.安裝jenkins 第一種方式:可以再windows系統通過安裝包的方式直接安裝 第二種方式:下載jenkins.war,在tomcat執行,linux系統和windows系統都

IOS學習之常見問題】蘋果開發者協議更新【Edit Phone Number】跳不出同意按鈕(紅色的警告)

█ 問題:  ● 蘋果開發者協議更新後,跳不出同意按鈕  ● 有提示需要編輯手機號碼(以前沒填寫),修改後還是一樣  ● 部分人換了好幾張手機卡測試(和運營商沒關係),結果還是一樣  ● 部分人反應,在4月21號操作,可以成功,之後操作的就沒成功 

ionic實現App動態更新更新

本來自己要寫一篇熱更新的文章,發現有其他好文章,就推薦給大家: 補充一: 在第6步之後,生成的.chcpenv檔案裡的 { "content_url": "http://xxxxx.com",       //用於獲取檔案 "config_url