ios 由于苹果的审核政策,一旦上线后发现bug是件让人崩溃的事情

不过可以利用oc的runtime机制可以家用JSPatch动态的为工程打热补丁

下载地址:https://github.com/agelessman/JSPatch.git

如果不用cocoapods导入的话,不需要修改,如果拖到工程的,需要改头文件,

例如: #import “abc.h”

在appdelegate中添加类似下边的方法,写一个本地的属性记录补丁的版本号,如果文件存在,再调用

 - (void)hotfix {

     // 获得应用程序沙盒的Downloads文件夹路径

     QKYGuideAccount *guideAccount = [QKYAccountTool guideAccount];

     NSArray *arrDownloadPaths =  NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask,YES);
NSString *loadPathsPath=[arrDownloadPaths objectAtIndex:];
NSString *patchPath = [loadPathsPath stringByAppendingPathComponent:[NSString stringWithFormat:@"patch_%@.js",guideAccount.patchVersion.length ? guideAccount.patchVersion : @""]];
NSFileManager *fileManager = [NSFileManager defaultManager];
BOOL isdir = NO;
if ([fileManager fileExistsAtPath:patchPath isDirectory:&isdir]) {
[JPEngine startEngine];
[JPEngine evaluateScript:[NSString stringWithContentsOfFile:patchPath encoding:NSUTF8StringEncoding error:nil]];
}; QKYLog(@"Downloads path: %@",patchPath);
}

在控制器中添加下边的方法,目的就是发请求到服务器,获取是否更新,

    //处理热修复
self.dataController = [[QKYListDataController alloc] init];
[self.dataController getIsNeedHotfixResultWithSuccessBlock:^(QKYIsNeedHotfixResult * _Nonnull success, BOOL last) { if (success.code.integerValue == && success.newpatch.integerValue == ) {// 现在补丁
[self.dataController downloadpatchWithUrl:success.patchurl];
} } errorMsgBlock:^(NSError * _Nullable error, id _Nullable msgBody) { }]; NSDictionary *infoDictionary = [[NSBundle mainBundle] infoDictionary];
NSString *version = [infoDictionary objectForKey:@"CFBundleShortVersionString"];
NSMutableDictionary *dicM = [NSMutableDictionary dictionary];
[dicM setValue:@"" forKey:@"comefrom"];
[dicM setValue:version forKey:@"patchappversion"];
QKYGuideAccount *guide = [QKYAccountTool guideAccount];
[dicM setValue:guide.patchVersion.length ? guide.patchVersion : @"" forKey:@"patchversion"];

需要说明的是这里的dataController 是一个模型,下载补丁的方法封装到了这个模型中

在下载的条件成熟的情况下,下载附件

 - (void)downloadpatchWithUrl:(NSString *)url {

     if (!url) return;

     NSURLSessionConfiguration *configuration = [NSURLSessionConfiguration defaultSessionConfiguration];

     AFURLSessionManager *manager = [[AFURLSessionManager alloc] initWithSessionConfiguration:configuration];

     manager.responseSerializer = [AFHTTPResponseSerializer serializer];

     NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:url]];

     NSProgress *downloadProgress = nil;

     NSURLSessionDownloadTask *downloadTask = [manager downloadTaskWithRequest:request progress:&downloadProgress destination:^NSURL * _Nonnull(NSURL * _Nonnull targetPath, NSURLResponse * _Nonnull response) {

         NSURL *downloadURL = [[NSFileManager defaultManager] URLForDirectory:NSDocumentDirectory inDomain:NSUserDomainMask appropriateForURL:nil create:NO error:nil];
return [downloadURL URLByAppendingPathComponent:[NSString stringWithFormat:@"patch_%@.js",self.result.patchversion]]; } completionHandler:^(NSURLResponse * _Nonnull response, NSURL * _Nullable filePath, NSError * _Nullable error) { if (error) {
return ;
}
QKYGuideAccount *account = [QKYAccountTool guideAccount];
account.patchVersion = self.result.patchversion;
[QKYAccountTool saveGuideAccount:account]; [appDelegate hotfix]; }]; [downloadTask resume];
}

下载成功后保存最新的补丁号到本地属性中,调用JSPatch,让刚下载的代码生效

需要特别说明的是,加载补丁文件,是有顺序的,例如0,1,2 而且补丁文件中使用的是js的代码,

能够帮助我的功能:

1 修复导致崩溃的错误

2 替换原来的方法

3.添加新的方法

4 替换原来的界面

等等,更多功能,有待研究

有问题可以写评论哦,

iOS 利用JSPatch 添加热补丁功能的更多相关文章

  1. 为我们的SSR程序添加热更新功能

    前沿 通过上一篇文章 通过vue-cli3构建一个SSR应用程序 我们知道了什么是SSR,以及如何通过vue-cli3构建一个SSR应用程序.但是最后遗留了一些问题没有处理,就是没有添加开发时的热更新 ...

  2. iOS+JSPatch在线修改app功能-b

    什么是热更新? 举个例子,你的app上架了,但是突然想添加个小功能,那么你有两种方法 第一种方法:在原生代码中修改源代码,然后提交到appStore,这个过程真是很漫长...虽然最近我提交的都是一两天 ...

  3. iOS开发那些事儿(二)热补丁

    一.热补丁作用:修复导致崩溃的错误.替换/增加方法.替换原来的界面等等 二.实现手段:JSPatch (使用Objective-C Objective-C和JavaScript jspatch桥.你可 ...

  4. React-Native 工程添加推送功能 (iOS 篇)

    推送已经是是手机应用的基本功能,如果自己实现一套推送系统费时费力,所有一般我们会使用第三方的推送服务,这里我使用「极光推送」作为集成推送的例子,因为有现成的 react native 插件 jpush ...

  5. 利用nginx向现有网站添加登录验证功能(不添加修改现有网站代码)

    在不改变现有网站代码的前提下加入验证功能: 1.假设现有网站后端nodejs,端口3000,nginx配置如下 server { listen 80; server_name localhost; l ...

  6. 利用反馈字段给帝国cms添加留言板功能(图文教程)

    帝国cms的插件中提供信息反馈字段,很多人却不会用.这里谢寒教大家如何来给自己的帝国cms网站添加留言板功能 1.找到添加地址 2.添加字段 3.你可以在字段中添加多种字段类型(有文本域,单行文本框, ...

  7. 利用SHELL的PROMPT_COMMAND添加日志审计功能,实时记录任何用户的操作到日志文件中

    利用 PROMPT_COMMAND 实现命令审计功能:记录什么用户,在什么时间,做了什么操作,然后将查到的信息记录到一个文件里. 具体操作: 将以下内容追加到/etc/profile: ####### ...

  8. 【腾讯Bugly干货分享】QFix探索之路—手Q热补丁轻量级方案

    本文来自于腾讯bugly开发者社区,非经作者同意,请勿转载,原文地址:http://dev.qq.com/topic/57ff5832bb8fec206ce2185d 导语 QFix 是手Q团队近期推 ...

  9. 【腾讯Bugly干货分享】微信热补丁Tinker的实践演进之路

    本文来自于腾讯bugly开发者社区,非经作者同意,请勿转载,原文地址:http://dev.qq.com/topic/57ad7a70eaed47bb2699e68e Dev Club 是一个交流移动 ...

随机推荐

  1. jsfl调整笔刷的笔触和颜色

    今天在用jsfl写脚本以简化对fla资源的处理工作,在画矩形时需要能自动调整笔刷的笔触颜色,填充颜色透明度,查jsfl文档无果,上网查了多番资料写出了可用代码,共享下: var fill = fl.g ...

  2. perl学习之路3

    Perl编程之路3 标签: perl 列表与数组   Perl里面代表复数的就是列表和数组 列表(list)指的是标量的有序集合, 而数组(array)则是存储列表的变量. 在Perl这两个属于尝尝混 ...

  3. pythonchallenge 解谜 Level 2

    好吧,赶紧贴一下. #-*- coding:utf-8 -*- #代码版本均为python 3.5.1 #Level 2 import re file = open("Level 2.txt ...

  4. JavaScript 作用域知识点梳理

    JavaScript的作用域一直以来是前端开发中难以理解的知识点,对于JavaScript的作用域主要记住几句话. 一.“JavaScript” 中无块级作用域 在   Java 或 C# 中存在块级 ...

  5. Shell下突破安全狗远程桌面守护

    首先在Shell下把安全狗的安装配置给下来 默认安装路径: C:\Program Files\SafedogServer\SafeDogGuardCenter  找到 ProGuardData.ini ...

  6. MySQL Can't connect to MySQL server on 'localhost' (10061)

    run > services.msc > rightclick MySQL > properties >start 搞定

  7. 2016huasacm暑假集训训练五 H - Coins

    题目链接:http://acm.hust.edu.cn/vjudge/contest/126708#problem/H 题意:A有一大堆的硬币,他觉得太重了,想花掉硬币去坐的士:的士司机可以不找零,但 ...

  8. 树莓派pppoe

    连接的网络是移动(铁通)的宽带,不同的宽带的dns需要修改. 1.首先安装pppoe包 apt-get install pppoe 2.然后,复制conf文件/etc/ppp/pppoe.conf: ...

  9. Hadoop 2.6.0 Namenode HA,ResourceManager HA

    先启动所有的zookeeper zkServer.sh start 在所有节点上启动JournalNode: sbin/hadoop-daemon.sh start journalnode 格式化第一 ...

  10. String驻留带来的危害

    原创文章转载请注明出处:@协思, http://zeeman.cnblogs.com   前段时间接手了一个项目优化工作,在同等场景下内存使用从4G降低到200M.   项目是将实体序列化成字符串存入 ...