拿来即用删掉即走:iOS客户端无侵入、一包任意环境切换实践篇

本文主要是介绍拿来即用删掉即走:iOS客户端无侵入、一包任意环境切换实践篇,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

本篇以基于mPaaS框架的工程为例。

        在开发测试过程中需要在不同的环境中来进行,比如UAT、SIT、准生产。不同的阶段,不同的需求需要在不同环境测试。这样会引发两个问题:

1.工程庞大,源码文件好几G,每次切换环境需要修改宏定义,修改了宏定义就使得整个工程需要重新编译,而工程完整编译一次需要10多分钟,这样大大降低了开发效率;

 2.测试人员一次只能安装一个环境的测试包并且安装其他环境测试包则需要先卸载原来的安装包

网络上主流的环境切换也存在着各种各样的问题:

1. 设置Build Configuration:改变bundleid来达到一个手机安装多个测试包,每个测试包环境都不一样 这样会导致工程内比如登录中使用的安全键盘、扫描身份证的OCR插件、人脸识别的活体认证插件等需要验证bundleid的功能无法使用

 2.设置Settings.bundle :这是苹果提供的可以在iOS系统设置中添加设置选项的功能。但这样改会修改原有工程代码,上线整理生产代码会带来风险

3.开发一个切换环境的ViewController每次打开应用先选环境:这样首先会污染源代码其次如果不是100%源码工程是做不了的比如我们使用了mPaaS

本文首先先介绍两种iOS提供的比较强大的技术

1.分类(Category)Category主要作用是给原来的类添加新的方法。如果分类中的方法名与原类的方法名一致则会覆盖掉原类的这个方法。如果有两个分类都实现了与原类的方法名一样的方法则需要看编译顺序,只会调用最后编译的那个分类中的同名方法。

2.方法交换(method_exchange)主要作用是只要知道方法名就能替换任何一个类中的方法,而且替换后的方法还能继续调用原有的方法,包括系统的api。

这两种技术结合使用就能实现“拿来即用 用完即走"的环境切换理念。

这种方法不会污染源工程代码,打测试包时把关于切换环境的文件夹直接拖到工程里,打生产包把整个文件夹删掉。

之前的文章已经把思路说过了

使用mpaas的iOS客户端如何一包支持任意环境切换(理论篇)__小呵呵的博客-CSDN博客

这里更加清晰的描述一下

工程原本配置环境需要改的是

1.meta.config环境配置文件中的所有内容

2.info.plist xcode工程配置文件中的mPaaSCrypt

3.无线保镖图片(测试环境不验,不用管)

实现方法就是

1.重定向meta.config文件取值的是NSBundle-pathForResource:ofType:方法

2.重定向info.plist文件取值的是NSBundle-infoDictionary方法

准备好不同环境的config文件, 命名为metasit.config  metauat.config  meta准生产.config

然后核心代码就是

最早执行的load方法中写{Method originalMethod = class_getInstanceMethod([NSBundle class], @selector(pathForResource:ofType:));Method swizzledMethod = class_getInstanceMethod([NSBundle class], @selector(pathForResource:ofTypeS:));method_exchangeImplementations(originalMethod, swizzledMethod);}{Method originalMethod = class_getInstanceMethod([NSBundle class], @selector(infoDictionary));Method swizzledMethod = class_getInstanceMethod([NSBundle class], @selector(infoDictionaryS));method_exchangeImplementations(originalMethod, swizzledMethod);}
NSBundle+YYY.h#import <Foundation/Foundation.h>NS_ASSUME_NONNULL_BEGIN@interface NSBundle (YYY)@endNS_ASSUME_NONNULL_END
NSBundle+YYY.m#import "NSBundle+YYY.h"
#import <objc/runtime.h>
@implementation NSBundle (YYY)
- (NSDictionary*)infoDictionaryS{NSMutableDictionary *dicc = [self infoDictionaryS].mutableCopy;//防止其他环境残留 影响[dicc removeObjectForKey:@"mPaaSInternal"];[dicc removeObjectForKey:@"mPaaS"];if ([[YYYPlistDataManage getCurrentEnvironmentFromPlist] containsString:@"uat"]){[dicc setObject:@{@"Crypt":@YES,@"GWWhiteList":@[@"http://*.*.*.*/mgw.htm",@"http://*.*.*.*/mgw.htm",@"http://*.*.*.*/mgw.htm",@"http://*.*.*.*/mgw.htm",@"http://*.*.*.*/mgw.htm",@"PubKey":@"-----BEGIN PUBLIC KEY-----\n******\n-----END PUBLIC KEY-----",@"RSA/ECC/SM2":@"SM2",} forKey:@"mPaaSCrypt"];}else if ([[YYYPlistDataManage getCurrentEnvironmentFromPlist] containsString:@"sit"]){[dicc setObject:@{@"Crypt":@YES,@"GWWhiteList":@[@"http://*.*.*.*/mgw.htm",],@"PubKey":@"-----BEGIN PUBLIC KEY-----\n*********\n-----END PUBLIC KEY-----",@"RSA/ECC/SM2":@"SM2",} forKey:@"mPaaSCrypt"];}else if ([[YYYPlistDataManage getCurrentEnvironmentFromPlist] containsString:@"准生产"]){[dicc setObject:@{@"Crypt":@YES,@"GWWhiteList":@[@"http://#.#.#.#/mgw.htm"],@"PubKey":@"-----BEGIN PUBLIC KEY-----\n#######\n-----END PUBLIC KEY-----",@"RSA/ECC/SM2":@"SM2",} forKey:@"mPaaSCrypt"];}
}- (nullable NSString *)pathForResource:(nullable NSString *)name ofTypeS:(nullable NSString *)ext;
{if ([name containsString:@"Settings"]) {//排除掉蚂蚁提供的环境配置对功能的影响name = @"";}if([name containsString:@"meta"] && ([ext isEqualToString:@"config"])){if ([[YYYPlistDataManage getCurrentEnvironmentFromPlist] isEqualToString:@"uat"]) {name = @"metauat";}else if ([[YYYPlistDataManage getCurrentEnvironmentFromPlist] isEqualToString:@"sit"]){name = @"metasit";}else if ([[YYYPlistDataManage getCurrentEnvironmentFromPlist] isEqualToString:@"准生产"]){name = @"meta准生产";}return [self pathForResource:name ofTypeS:ext];
}

注意事项:

1.mpaas框架是在load方法中读取的配置信息,因此需要保证把我们的交换方法先执行。

2.mpaas也提供了环境切换方法,在我们代码里已经屏蔽掉了

3.再配置个弹框来选择切换哪个环境,选完后清数据并且exit,重新打开客户端切换完成

4.彻底清数据的方法,其他博客有写

5.蚂蚁官网demo中的两个文件字段样式是

6.展示效果示例

这篇关于拿来即用删掉即走:iOS客户端无侵入、一包任意环境切换实践篇的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/421024

相关文章

基于MySQL Binlog的Elasticsearch数据同步实践

一、为什么要做 随着马蜂窝的逐渐发展,我们的业务数据越来越多,单纯使用 MySQL 已经不能满足我们的数据查询需求,例如对于商品、订单等数据的多维度检索。 使用 Elasticsearch 存储业务数据可以很好的解决我们业务中的搜索需求。而数据进行异构存储后,随之而来的就是数据同步的问题。 二、现有方法及问题 对于数据同步,我们目前的解决方案是建立数据中间表。把需要检索的业务数据,统一放到一张M

阿里开源语音识别SenseVoiceWindows环境部署

SenseVoice介绍 SenseVoice 专注于高精度多语言语音识别、情感辨识和音频事件检测多语言识别: 采用超过 40 万小时数据训练,支持超过 50 种语言,识别效果上优于 Whisper 模型。富文本识别:具备优秀的情感识别,能够在测试数据上达到和超过目前最佳情感识别模型的效果。支持声音事件检测能力,支持音乐、掌声、笑声、哭声、咳嗽、喷嚏等多种常见人机交互事件进行检测。高效推

Android实现任意版本设置默认的锁屏壁纸和桌面壁纸(两张壁纸可不一致)

客户有些需求需要设置默认壁纸和锁屏壁纸  在默认情况下 这两个壁纸是相同的  如果需要默认的锁屏壁纸和桌面壁纸不一样 需要额外修改 Android13实现 替换默认桌面壁纸: 将图片文件替换frameworks/base/core/res/res/drawable-nodpi/default_wallpaper.*  (注意不能是bmp格式) 替换默认锁屏壁纸: 将图片资源放入vendo

安卓链接正常显示,ios#符被转义%23导致链接访问404

原因分析: url中含有特殊字符 中文未编码 都有可能导致URL转换失败,所以需要对url编码处理  如下: guard let allowUrl = webUrl.addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed) else {return} 后面发现当url中有#号时,会被误伤转义为%23,导致链接无法访问

安装nodejs环境

本文介绍了如何通过nvm(NodeVersionManager)安装和管理Node.js及npm的不同版本,包括下载安装脚本、检查版本并安装特定版本的方法。 1、安装nvm curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.0/install.sh | bash 2、查看nvm版本 nvm --version 3、安装

【IPV6从入门到起飞】5-1 IPV6+Home Assistant(搭建基本环境)

【IPV6从入门到起飞】5-1 IPV6+Home Assistant #搭建基本环境 1 背景2 docker下载 hass3 创建容器4 浏览器访问 hass5 手机APP远程访问hass6 更多玩法 1 背景 既然电脑可以IPV6入站,手机流量可以访问IPV6网络的服务,为什么不在电脑搭建Home Assistant(hass),来控制你的设备呢?@智能家居 @万物互联

系统架构师考试学习笔记第三篇——架构设计高级知识(20)通信系统架构设计理论与实践

本章知识考点:         第20课时主要学习通信系统架构设计的理论和工作中的实践。根据新版考试大纲,本课时知识点会涉及案例分析题(25分),而在历年考试中,案例题对该部分内容的考查并不多,虽在综合知识选择题目中经常考查,但分值也不高。本课时内容侧重于对知识点的记忆和理解,按照以往的出题规律,通信系统架构设计基础知识点多来源于教材内的基础网络设备、网络架构和教材外最新时事热点技术。本课时知识

高并发环境中保持幂等性

在高并发环境中保持幂等性是一项重要的挑战。幂等性指的是无论操作执行多少次,其效果都是相同的。确保操作的幂等性可以避免重复执行带来的副作用。以下是一些保持幂等性的常用方法: 唯一标识符: 请求唯一标识:在每次请求中引入唯一标识符(如 UUID 或者生成的唯一 ID),在处理请求时,系统可以检查这个标识符是否已经处理过,如果是,则忽略重复请求。幂等键(Idempotency Key):客户端在每次

pico2 开发环境搭建-基于ubuntu

pico2 开发环境搭建-基于ubuntu 安装编译工具链下载sdk 和example编译example 安装编译工具链 sudo apt install cmake gcc-arm-none-eabi libnewlib-arm-none-eabi libstdc++-arm-none-eabi-newlib 注意cmake的版本,需要在3.17 以上 下载sdk 和ex

pip-tools:打造可重复、可控的 Python 开发环境,解决依赖关系,让代码更稳定

在 Python 开发中,管理依赖关系是一项繁琐且容易出错的任务。手动更新依赖版本、处理冲突、确保一致性等等,都可能让开发者感到头疼。而 pip-tools 为开发者提供了一套稳定可靠的解决方案。 什么是 pip-tools? pip-tools 是一组命令行工具,旨在简化 Python 依赖关系的管理,确保项目环境的稳定性和可重复性。它主要包含两个核心工具:pip-compile 和 pip