北京一卡通 APP iOS 研发手册
前言
一、我的项目架构
我的项目依照代码的组织构造和调用关系,能够分为四层,别离是视图层、业务层、根底模块和数据拜访层。其中视图层负责页面展现和与用户交互(如用户的点击事件、划动手势等),业务层则对应具体的业务,例如充值模块、用户信息、乘车码、多扣票款等,根底模块蕴含了我的项目运行各个性能最根本的能力和组件,比方网络模块负责业务的网络申请,平安模块负责报文的加解密和签名验签,存储模块负责本地的数据长久化等等,数据拜访层是对我的项目所用到的所有信息的获取形式的形象和封装,包含从接口获取数据,从本地资源文件、本地缓存以及数据库等获取数据。
上面别离对各个模块做下介绍:
1、视图层
2、业务层
3、根底模块
4、数据拜访层
二、我的项目目录构造
1、工程目录构造
工程目录构造如下:
我的项目采纳了 cocoapods 的集成形式,目录构造次要分为 Base、Common、Macro、Main、Resources、Sources、Supporting Files、Vendors、Pods。
其中,
- Base 目录下是我的项目用到的根底 ViewController 的封装,蕴含加载 WebView 的,加载原生页面的,曾经他们的独特基类。
- Common 目录蕴含了我的项目用到的公共代码。
- Macro 是对我的项目罕用的宏的汇总。
- Main 是我的项目的主代码目录。
- Resources 是我的项目的资源文件,蕴含图片、预置离线包等。
- Sources 是程序启动相干的源文件。
- Supporting Files 蕴含了 main.m 也就是程序的入口文件,还有 info.plist 程序的配置文件,还有启动图等等。
- Vendors 是手动导入的第三方库。
- Pods 目录下是通过 pod 导入的第三方库。
2、mPaas 目录构造
mPaaS 目录构造如下:
└── MPaaS
├── mpaas_sdk.config
├── Targets
| └── mPaaSDemo(工程 Target 名称)| ├── mPaaSDemo-mPaaS-Headers.h
| ├── mPaaSDemo-Prefix.pch
| ├── APMobileFramework
| ├── mPaas
| ├── meta.config
| └── yw_1222.jpg
├── Resources
└── Frameworks
其中,
mpaas_sdk.config
:以后工程增加的模块信息,包含版本、增加工夫、资源文件等,由 mPaaS 插件主动保护,不得手动批改。mPaaSDemo-mPaaS-Headers.h
:以后工程依赖的 mPaaS 模块的头文件,由 mPaaS 插件主动保护,不得手动批改。mPaaSDemo-Prefix.pch
:以后工程 pch 文件的援用,会主动将mPaaSdemo-mPaaS-Headers.h
退出 mPaaS 模块的头文件。APMobileFramework
:mpaas 框架的生命周期治理的 category 文件。mPaas
:MPaaSInterface 的 category 文件。meta.config
:从 mPaaS 控制台下载的云端元数据。yw_1222.jpg
:通过元数据中的 base64code 字段生成的无线保镖验签图片,在挪动网关验签时应用。如不须要挪动网关性能,可删除此图片。Resources & Frameworks
:mPaaS 模块的资源文件和二进制文件目录,是以后工程所有 Targets 应用的 mPaaS 模块的并集,由 mPaaS 插件主动保护,不得手动批改。
三、开发流程标准
1、需要评审
产品在明确需要之后,通过邮件收回需要文档,而后招集大家一起进行需要评审。参加需要评审的人个别蕴含负责该项目标产品经理,已及相干测试人员,负责开发的前后端开发人员,局部重要我的项目领导也会参加评审。
产品经理讲完产品需要后,大家依据需要设计展开讨论,最终大家达成对立意见后,产品收回会议纪要和需要计划的最终版本,客户端开始依据需要文档和 UI 设计启动流程设计。
2、流程设计
依照产品的需要文档和 UI 设计,开始绘制流程图。流程图应蕴含业务的所有流程节点和各种异常情况,重要的网络申请和相干参数。设计文档应该蕴含业务每一步的操作流程形容,对应的流程图和 UI 截图,必要业务应有相干时序图。
3、设计评审
实现流程设计之后,像需要评审一样,招集相干人员进行设计评审。开发人员依据设计文档和流程图讲述设计思路,而后征求各方意见,最终大家达成统一后批改设计文档,开始排期。
排期个别蕴含开发工夫,联调工夫以及自测工夫。能够依照性能或者页面进行排期,排期的单位是人 / 日。排期实现后发给上级领导审核,审核通过后启动开发。如果排期有问题,则依照领导给出的意见进行调整,直至没有问题后开始开发。
4、开发联调
依据设计流程进行编码,每天的进度会上汇报本人的实现状况,期间定时提交代码和写禅道日志。如果中途产生需要变更或者其余状况(例如后盾不具备联调条件),及时向领导阐明状况,要求相干人员予以邮件阐明,领导批准后酌情调整排期。
开发结束后启动联调,联调包含与后盾联调曾经与 H5 的联调,或者别离称为内部联调和外部联调。如果接口呈现任何问题及时和相干开发共事沟通,如果未能达成对立意见,找产品或者相干领导进行探讨协商。
联调实现后进入自测阶段。
5、自测提测
自测阶段依据流程图或者参考测试收回的测试用例,对业务的失常流程和异常情况进行测试,如果发现问题及时批改,保障测试能够顺利进行。
自测通过后发提测邮件,邮件里写明提测的具体性能和对应的开发人员。发送给测试人员,抄送相干开发人员和领导。并在相干群里告诉测试人员启动测试。
6、bug 批改
提测后每天关注禅道,及时解决测试提出的 bug。如果遇到难以复现的 bug,找测试沟通,理解相干的复现步骤。如果呈现了解不统一的状况找产品进行确认。
待二轮测试通过后,测试收回测试报告,开始合并代码到 dev 分支,切换本地配置和预置离线包,筹备打包加固,启动生产测试。
7、加固打包
应用梆梆的加固客户端 SCShieldClient,抉择咱们的我的项目目录。配置加固选项后开始加固。加固实现后,关上加固生成的我的项目目录,开始打包,打包胜利后商城 APP Store,应用 testflight 进行生产测试。具体打包流程参见 环境配置。
8、生产提测
加固打包并上传到 APP Store 后,发生产环境提测邮件,待后盾上线实现后,告诉测试组进行生产验证。
9、提交审核
测试验证通过后,经产品和领导一致同意,提交审核,是否重置评分抉择否,是否分阶段公布抉择是,审核通过后抉择手动公布。提交审核后,为防止因第三方登录导致审核被拒,告诉后盾配合批改配置文件,待审核通过后告诉后盾改回配置。公布的版本号和降级提醒内容由产品确定。
如果产生审核被拒,第一工夫查明被拒的起因,依据被拒起因找到对应的解决办法,批改后再次提交审核,如果是审核方起因导致的误判等,则通过申述入口提交申述。
个别 1 - 2 个工作日会有审核后果。如果上线比拟紧急,则提交审核的同时补充一份提测邮件。
10、公布上线
审核通过当前,学生成 10-20 个兑换码进行自测和外部验证。验证通过后,征求领导意见,领导批准后点击公布。是否持续抉择分阶段公布依据领导意见来定。
11、线上巡检
上线后第一工夫上传符号表到友盟官网,并在 git 上打 tag。定时查看友盟统计的谬误日志,发现有谬误或者奔溃状况,第一工夫剖析问题并解决,如果问题比较严重,影响范畴比拟大,及时汇报领导,征求领导意见是否公布一版紧急修复的版本。
四、第三方库
1、通过 Pod 引入的第三方库
SDK 名称 | 以后版本 | 最新版本 | SDK 性能 | 在我的项目中应用的模块 |
---|---|---|---|---|
JPush | 3.2.8 | 3.7.4 | 极光推送 | 波及到音讯推送相干的 |
JCore | 2.2.5 | 极光外围依赖 | ||
JAnalytics | 2.1.2 | 2.1.2 | 极光统计 | |
JVerification | 2.6.8 | 2.7.5 | 极光运营商的网关认证 | 注册辨认本机号码 |
UMengAnalytics | 4.2.5 | 4.2.5 | 友盟统计 | |
PGDatePicker | 2.6.9 | 2.6.9 | 日期选择器 | 抉择日期相干模块 |
AFNetworking | 3.2.1 | 4.0.1 | 网络申请 | 所有申请数据相干 |
MJRefresh | 3.1.12 | 3.7.2 | 列表刷新 | 列表,页面刷新相干 |
SVProgressHUD | 2.2.5 | 2.2.5 | hud 提醒 | 登录模块网络申请加载 |
MBProgressHUD | 1.2.0 | 1.2.0 | hud 提醒 | 公交码,地铁码,以及网络加载后果提醒 |
FLAnimatedImage | 1.0.12 | 1.0.16 | gif 动画加载 | 广告相干视频的占位图片展现 |
OpenSDK | 1.8.0 | 微信登录,领取,分享相干 | 登录 充值,分享 | |
JJImagePicker | / | / | 抉择照片 | 上传照片相干 |
MSWeakTimer | / | / | 定时器 | 乘车二维码定时更换 |
JDSDK | / | / | 京东相干 | |
LBXScanNative | / | / | 扫码性能,生成二维码 | 公交码、地铁码生成二维码 |
SM2 | / | / | 加密解密 | |
WhiteBox | / | / | 白盒测试 | |
QYSDK | / | / | 网易七鱼客服 | 在线客服 |
OpenSSL | / | / | 创立申请证书加密 | |
UniPaymentcontrol | / | / | 银联领取 | |
JDpay | / | / | 京东领取 | |
YYModel | / | / | 数据转模型 | 数据申请 |
metroSDK | / | / | 地铁乘车码相干 | 地铁码相干 |
iOSPGLib | / | / | 明码平安控件 | 平安键盘 |
WMZBanner | / | / | 轮播图 | 首页广告轮播 |
SJActionSheet | / | / | 弹窗 | |
mPaaS | / | / | 挪动开发、测试、经营及运维提供云到端的一站式解决方案 |
2、手动导入的第三方库
五、原生办法
1、离线包调用原生办法
办法名 | 性能 |
---|---|
pushWindow | push 页面 |
appSendDataWarpToWeb | 注册离线包通信 |
cardCompareVersion | 辨别卡与手机零碎 |
toWXLaunchMiniProgram | 跳转微信小程序 |
obtainConfigureInfo | 获取领取程序 |
setupCurrentUserId | 设置以后 UserId |
updateAllNebulaApps | 更新全副离线包 |
updateNebulaApp | 依据 AppId 更新指定离线包 |
MPNebulaStartApp | 跳转离线包页面 appId |
skipOfflineToUrl | 跳转离线包页面 url |
obtainCardState | 获取卡状态 |
getCardArray | 获取卡片 |
encryptDataWithRSA3 | 3.0 加密 |
decryptDataWithRSA3 | 3.0 解密 |
getDeviceParam | 获取以后设施信息 |
electronicMetroAndPayCode | 点击地铁码 |
getUserInfoUnEncode | 获取未加密的用户信息 |
activityFinish | 敞开小程序跳转登录页面 |
getWolfcertTokenString | 获取 3.0 接口 token |
showLoadingView | 注册全局加载 |
obtainPublicNoticeMessage | 首页自定义音讯,获取保留在本地的音讯 |
OpenBankHTMLWebview | 跳转先乘后付绑卡页面 |
toWebViewWithUrlAndTitle | 依据 URL 跳转 webview |
obtainClientBaseUrl | 获取生产或者测试 环境 baseURL |
shopClientBaseUrl | 获取商城生产或者测试 环境 baseURL |
isPhoneHaveNFC | 获取手机是否设置 NFC 性能 |
resetScreenLight | 还原手机以后屏幕亮度 |
setScreenLight | 设置手机屏幕亮度为最高 |
getLoginUserInfo | 获取登录用户的信息并保留 |
getBasicInfo | 获取版本根底信息 |
isClickfaceSwitch | 点击指纹解锁 |
tsmEncryptDataWithRSA | 获取加密信息 |
tsmDecryptDataWithRSA | 解密信息 |
AddEventburyPoints | 极光统计 |
getMetroCode | 获取地铁码数据 |
sm4DecryptStringWithBase64 | 注册 SM4 |
sm2SignPlainText | 注册 SM2 |
imageConvertBase64Code | 注册图片转 base64 |
callThirdPayment | 跳转领取 |
skipPaymentSign | 跳转签约 |
skipWechatLogin | 跳转微信登录 |
wechatAuthorize | 微信受权认证 |
skipAlipayAuthorization | 支付宝受权认证 |
toWebViewWithUrlAndTitleRevised | 跳转 webview |
checkiOSVersionUpdate | 版本更新检测 |
openQRCode | 跳转公交码和地铁码 |
receiveFacedIdentifyCode | 获取人脸识别登录 code 办法 |
YKTFacedIdentifyPhoto | 人脸识别头像上传 |
skipFacedIdentify | 跳转人脸识别 getFaceCode |
shareWechatUrl | 微信分享 |
openElectronicInvoice | 跳转电子发票 |
advertisingMoreState | 用户是否敞开过广告位 |
advertisingMoreClose | 用户敞开广告位 |
toOnLineServiceUrlAndTitle | 跳转客服 |
jPushLoginStatus | 一键登录返回后果 |
jumpPageToLogin | 一键登录 |
upQrPayNotice | 获取是否设置默认领取渠道 |
isSatisfyNFC | 是否满足 NFC 应用条件 |
setPayMentContract | 是否领取渠道解约 |
freePayMentContract | 移除本地领取渠道解约 |
isHiddenWechat | 微信登录是否展现 |
YKTClosePage | 敞开页面 |
defaultToQR | 设置公交 / 地铁 |
getDefaultToQR | 获取是否设置公交 / 地铁 |
YKTShowPassKeyboard | 展现明码键盘 |
isSupportNFCCard | 判断手机是否有 NFC |
invalidateNFCScan | NFC 扫描终止 |
startNFCScan | NFC 开始扫描 |
endNFCScan | NFC 扫描完结 |
nfcExecuteApdu | NFC 扫描执行 APDU |
updateTip | NFC 扫描更新提醒 |
nfcCardTouch | NFC 贴卡开始 |
getNfcCardParams | 获取 NFC 扫描参数 |
getLocationPermission | 获取手机定位权限 |
YKTJSPostMessage | 发送告诉 |
loginSuccess | 登录胜利刷新首页音讯 |
logoutSuccess | 退出胜利革除首页自定义音讯 |
skipUnipayAuthorization | 云闪付签约 |
YKTSafeControlShow | 平安键盘显示 |
YKTSafeControlClearPassword | 平安键盘清空 |
YKTSafeControlHidePassword | 平安键盘暗藏 |
YKTApplePay | Apple pay 调起操作 |
ApplePayCallBack | Apple pay 回调 |
YKTPhotoDelete | 移除手机照片 |
YKTPhotoPicker | 抉择照片 |
YKTDateTimePicker | 抉择日期 |
YKTSubmitPhoto | 提交抉择的照片 |
YKTH5PageRefresh | 页面刷新 |
YKTResetNavBarBackType | 重置导航栏返回按钮款式 |
YKTConfigureNavBarBackType | 配置默认导航栏返回按钮款式 |
YKTHideNavBar | 暗藏导航栏 |
YKTSetupNavBarTranslucent | 导航栏通明 |
YKTSetupStatusBarStyle | 导航栏类型 |
YKTApplyCard | 注册开卡 |
skipAPPLocation | 跳转利用 |
2、一般 Html 页面调用原生办法
pushWindow | push 页面 |
---|---|
appSendDataWarpToWeb | 注册离线包通信 |
cardCompareVersion | 辨别卡与手机零碎 |
toWXLaunchMiniProgram | 跳转微信小程序 |
obtainConfigureInfo | 获取领取程序 |
setupCurrentUserId | 设置以后 UserId |
updateAllNebulaApps | 更新全副离线包 |
updateNebulaApp | 依据 AppId 更新指定离线包 |
MPNebulaStartApp | 跳转离线包页面 appId |
skipOfflineToUrl | 跳转离线包页面 url |
obtainCardState | 获取卡状态 |
getCardArray | 获取卡片 |
encryptDataWithRSA3 | 3.0 加密 |
decryptDataWithRSA3 | 3.0 解密 |
getDeviceParam | 获取以后设施信息 |
electronicMetroAndPayCode | 点击地铁码 |
getUserInfoUnEncode | 获取未加密的用户信息 |
activityFinish | 敞开小程序跳转登录页面 |
getWolfcertTokenString | 获取 3.0 接口 token |
showLoadingView | 注册全局加载 |
obtainPublicNoticeMessage | 首页自定义音讯,获取保留在本地的音讯 |
OpenBankHTMLWebview | 跳转先乘后付绑卡页面 |
toWebViewWithUrlAndTitle | 依据 URL 跳转 webview |
obtainClientBaseUrl | 获取生产或者测试 环境 baseURL |
shopClientBaseUrl | 获取商城生产或者测试 环境 baseURL |
isPhoneHaveNFC | 获取手机是否设置 NFC 性能 |
resetScreenLight | 还原手机以后屏幕亮度 |
setScreenLight | 设置手机屏幕亮度为最高 |
getLoginUserInfo | 获取登录用户的信息并保留 |
getBasicInfo | 获取版本根底信息 |
isClickfaceSwitch | 点击指纹解锁 |
tsmEncryptDataWithRSA | 获取加密信息 |
tsmDecryptDataWithRSA | 解密信息 |
AddEventburyPoints | 极光统计 |
getMetroCode | 获取地铁码数据 |
sm4DecryptStringWithBase64 | 注册 SM4 |
sm2SignPlainText | 注册 SM2 |
imageConvertBase64Code | 注册图片转 base64 |
callThirdPayment | 跳转领取 |
skipPaymentSign | 跳转签约 |
skipWechatLogin | 跳转微信登录 |
wechatAuthorize | 微信受权认证 |
skipAlipayAuthorization | 支付宝受权认证 |
toWebViewWithUrlAndTitleRevised | 跳转 webview |
checkiOSVersionUpdate | 版本更新检测 |
openQRCode | 跳转公交码和地铁码 |
receiveFacedIdentifyCode | 获取人脸识别登录 code 办法 |
YKTFacedIdentifyPhoto | 人脸识别头像上传 |
skipFacedIdentify | 跳转人脸识别 getFaceCode |
shareWechatUrl | 微信分享 |
openElectronicInvoice | 跳转电子发票 |
advertisingMoreState | 用户是否敞开过广告位 |
advertisingMoreClose | 用户敞开广告位 |
toOnLineServiceUrlAndTitle | 跳转客服 |
jPushLoginStatus | 一键登录返回后果 |
jumpPageToLogin | 一键登录 |
upQrPayNotice | 获取是否设置默认领取渠道 |
isSatisfyNFC | 是否满足 NFC 应用条件 |
setPayMentContract | 是否领取渠道解约 |
freePayMentContract | 移除本地领取渠道解约 |
isHiddenWechat | 微信登录是否展现 |
YKTClosePage | 敞开页面 |
defaultToQR | 设置公交 / 地铁 |
getDefaultToQR | 获取是否设置公交 / 地铁 |
YKTShowPassKeyboard | 展现明码键盘 |
isSupportNFCCard | 判断手机是否有 NFC |
invalidateNFCScan | NFC 扫描终止 |
startNFCScan | NFC 开始扫描 |
endNFCScan | NFC 扫描完结 |
nfcExecuteApdu | NFC 扫描执行 APDU |
updateTip | NFC 扫描更新提醒 |
nfcCardTouch | NFC 贴卡开始 |
getNfcCardParams | 获取 NFC 扫描参数 |
getLocationPermission | 获取手机定位权限 |
YKTJSPostMessage | 发送告诉 |
loginSuccess | 登录胜利刷新首页音讯 |
logoutSuccess | 退出胜利革除首页自定义音讯 |
skipUnipayAuthorization | 云闪付签约 |
YKTSafeControlShow | 平安键盘显示 |
YKTSafeControlClearPassword | 平安键盘清空 |
YKTSafeControlHidePassword | 平安键盘暗藏 |
YKTApplePay | Apple pay 调起操作 |
ApplePayCallBack | Apple pay 回调 |
YKTPhotoDelete | 移除手机照片 |
YKTPhotoPicker | 抉择照片 |
YKTDateTimePicker | 抉择日期 |
YKTSubmitPhoto | 提交抉择的照片 |
YKTH5PageRefresh | 页面刷新 |
YKTResetNavBarBackType | 重置导航栏返回按钮款式 |
YKTConfigureNavBarBackType | 配置默认导航栏返回按钮款式 |
YKTHideNavBar | 暗藏导航栏 |
YKTSetupNavBarTranslucent | 导航栏通明 |
YKTSetupStatusBarStyle | 导航栏类型 |
YKTApplyCard | 注册开卡 |
skipAPPLocation | 跳转利用 |
getCurrentLocationParam | 获取以后地位经纬度 |
六、mPaas 框架
mPaas 框架、mPaas、热修复、离线包、小程序
1、mPaas 接入
mPaas 接入形式共有两种,一种是基于 mPaas 框架接入,另一种是基于已有工程接入。其中基于已有工厂接入能够应用 mPaaS 插件接入,也能够应用 CocoaPods 接入。咱们目前应用的是 mPaaS 插件接入形式。具体接入步骤如下:
①装置 mPaaS Xcode Extension;
前置条件:
a、装置了 Xcode。目前 mPaaS Xcode Extension 仅反对 9.0(含)和 12.2(含)之间版本的 Xcode。
b、macOS 版本 ≥ 10.13。
c、未装置过 mPaaS Xcode Extension(如果想降级装置,倡议间接应用插件内的降级性能)。
具体步骤:
1、在终端运行以下装置命令。
curl -sSL https://mpaas-ios.oss-cn-hangzhou.aliyuncs.com/mpaaskit/Xcode-extension/install.sh | sh
2、装置实现后,会关上疏导页面,点击 开始应用(或者敞开页面,手动重启 Xcode)即可应用。
3、关上任意 Xcode 工程,在 Xcode 左侧工程构造面板中抉择任意可编辑文件(如:main.m),若能看到菜单 Editor > mPaaS,则阐明 mPaaS 插件加载胜利。
4、导入配置文件后,应用编辑模块为我的项目增加和删除对应的组件,点击开始编辑后我的项目启动配置。
②在控制台创立利用;
1、关上 mpaas 官网的治理平台,点击创立 mPaas 利用,输出利用名称点击确定,创立利用;
2、点击代码配置,配置对应的 Bundle ID;
3、下载配置文件,通过 mPaasPlugin 配置我的项目;
留神:配置文件辨别测试环境和生产环境。
2、mPaas 我的项目配置
通过 mPaas 插件配置我的项目步骤如下:
1、点击 Xcode 菜单项 Editor > mPaaS > 编辑工程,关上编辑工程页面。
2、抉择 导入云端元数据 菜单,点击 抉择配置文件 按钮,选中第二步中下载的 .config 配置文件,点击 开始导入 按钮,将对应的配置导入到以后工程中。
阐明 :抉择配置文件之后,能够点击“X”按钮来敞开,只有点击 开始导入 之后配置才会失效。
3、点击界面上的 编辑模块 菜单,工作区会展现未集成的提醒页面。
4、点击 增加模块 会弹出 模块列表 编辑页面。进入页面会提醒抉择集成的 基线类型和版本 ,默认为最新基线,点击 确认 按钮。
4、收起基线抉择菜单后,下方会刷新出对应基线的模块列表,在列表中点击卡片来增加对应的模块。
5、点击每个模块右侧的 详情 按钮能够查看该模块的具体信息,包含形容、Release Note、蕴含的 framework 文件详情等。
6、抉择好须要增加的模块后,点击右上角的 保留 按钮保留编辑后果,同时返回到主页面,工作区的模块列表中会展现编辑的后果。
7、返回主页面后,点击 开始编辑,将抉择的模块增加到以后工程中。
阐明:只有点击开始编辑之后,后果才会失效。
8、重新启动以后工程,您会看到工程中新增了与工程文件同级的 mPaaS 目录,mPaaS 相干的文件都在该目录下。
9、间接 build 工程,确保工程能够编译通过。至此您已胜利实现 mPaaS 接入过程。
3、离线包配置
1、增加 SDK
我的项目应用 mPaaS Xcode Extension 形式增加
①点击 Xcode 菜单项 Editor > mPaaS > 编辑工程,关上编辑工程页面。
②抉择 H5 容器 & 离线包 ,保留后点击 开始编辑,即可实现增加。
2、应用 SDK
-
启动容器
为了应用 Nebula 容器,须要在程序启动实现后调用 SDK 接口,对容器进行初始化。初始化必须在 DTFrameworkInterface
的 - (void)application:(UIApplication *)application beforeDidFinishLaunchingWithOptions:(NSDictionary *)launchOptions
中进行。
- (void)application:(UIApplication *)application beforeDidFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
// 初始化容器
[MPNebulaAdapterInterface initNebula];
}
因为咱们应用 预置离线包 、 自定义 JSAPI 和 Plugin 等性能,所以须要应用 initNebula
接口替换为下方代码中的 initNebulaWith
接口,传入对应参数对容器进行初始化。
presetApplistPath
:自定义的预置离线包的包信息门路。
appPackagePath
:自定义的预置离线包的包门路。
pluginsJsapisPath
自定义 JSAPI 和 Plugin 文件的存储门路。
- (void)application:(UIApplication *)application beforeDidFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
// 初始化容器
NSString *presetApplistPath = [[NSBundle mainBundle] pathForResource:[NSString stringWithFormat:@"MPCustomPresetApps.bundle/h5_json.json"] ofType:nil];
NSString *appPackagePath = [[NSBundle mainBundle] pathForResource:[NSString stringWithFormat:@"MPCustomPresetApps.bundle"] ofType:nil];
NSString *pluginsJsapisPath = [[NSBundle mainBundle] pathForResource:[NSString stringWithFormat:@"Poseidon-UserDefine-Extra-Config.plist"] ofType:nil];
[MPNebulaAdapterInterface initNebulaWithCustomPresetApplistPath:presetApplistPath customPresetAppPackagePath:appPackagePath customPluginsJsapisPath:pluginsJsapisPath];
}
阐明:initNebula
和 initNebulaWithCustomPresetApplistPath
是两个并列的办法,不能同时应用。
-
定制容器
通过设置 MPNebulaAdapterInterface
的属性值来定制容器配置。必须在 DTFrameworkInterface
的 - (void)application:(UIApplication *)application afterDidFinishLaunchingWithOptions:(NSDictionary *)launchOptions
中设置,否则会被容器默认配置笼罩。
- (void)application:(UIApplication *)application afterDidFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
// 定制容器
[MPNebulaAdapterInterface shareInstance].nebulaVeiwControllerClass = [MPH5WebViewController class];
[MPNebulaAdapterInterface shareInstance].nebulaNeedVerify = NO;
[MPNebulaAdapterInterface shareInstance].nebulaUserAgent = @"mPaaS/Portal";
[MPNebulaAdapterInterface shareInstance].nebulaCommonResourceAppList = @[@"77777777"];
}
-
更新离线包
启动实现后,全量申请所有离线包信息,查看服务端是否有更新包。为了不影响利用启动速度,倡议在 (void)application:(UIApplication \*)application afterDidFinishLaunchingWithOptions:(NSDictionary \*)launchOptions
之后调用。
- (void)application:(UIApplication *)application afterDidFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
// 定制容器
[MPNebulaAdapterInterface shareInstance].nebulaVeiwControllerClass = [MPH5WebViewController class];
[MPNebulaAdapterInterface shareInstance].nebulaNeedVerify = NO;
[MPNebulaAdapterInterface shareInstance].nebulaUserAgent = @"mPaaS/Portal";
[MPNebulaAdapterInterface shareInstance].nebulaCommonResourceAppList = @[@"77777777"];
// 全量更新离线包
[[MPNebulaAdapterInterface shareInstance] requestAllNebulaApps:^(NSDictionary *data, NSError *error) {NSLog(@"");
}];
}
4、热修复配置
1、增加 SDK
如下图所示,应用 mPaaS 插件增加 Hotpatch SDK。更多信息,请参考 mPaaS 插件 > 编辑模块。
2、应用 SDK
增加 SDK 之后,要依照以下形容配置工程:
在 info.plist 中配置利用版本 Product Version。在公布平台中,须要依据这里配置的版本号进行公布。
公布平台反对白名单灰度公布。在这种状况下,客户端去拉取热修复脚本时,服务端会依据白名单判
断是否下发热修复包给该用户。为此,客户端在 MPaaSInterface 的 category 中,需指定用户的 userID。
3、治理加密信息
执行以下命令生成公钥文件(public_key.pem)和私钥文件(private_key.pem),将公钥文件增加到工程中:
openssl genrsa -out private_key.pem 2048
openssl rsa -in private_key.pem -p
在 main.m 中验证公钥本身的签名,以确保公钥文件未被替换。具体步骤如下:
执行以下命令生成公钥文件的签名二进制串:
mpaas inst hotpatch sign -i /path/to/rsa_public_key.pem -p /path/to/rsa_private_key.pem -o
/path/to/output.sig
-i:openssl 生成的公钥文件 public_key.pem
-p:openssl 生成的私钥文件 private_key.pem
-o:签名二进制串输入文件
将终端打印进去的签名数组拷贝到 main.m 办法中,对公钥本身进行签名。示例代码如下:
阐明:若 initDynamicSec() 返回 NO,则阐明公私钥不匹配,须要批改,否则平台下发的包在客户端会校验不过,从而导致热修复失败。
5、小程序配置
1、增加 SDK
应用 mPaaS Xcode Extension 基于已有工程的接入形式。
- 点击 Xcode 菜单项 Editor > mPaaS > 编辑工程,关上编辑工程页面。
- 抉择 小程序 ,保留后点击 开始编辑,即可实现增加。
2、应用 SDK
1. 初始化配置
-
初始化容器
容器初始化操作包含启动容器、定制容器和更新小程序包。
1.1 启动容器
为了应用 Nebula 容器,须要在程序启动实现后调用 SDK 接口,对容器进行初始化。必须在 DTFrameworkInterface
的 - (void)application:(UIApplication *)application beforeDidFinishLaunchingWithOptions:(NSDictionary *)launchOptions
中进行初始化。
- (void)application:(UIApplication *)application beforeDidFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
// 初始化容器
[MPNebulaAdapterInterface initNebula];
}
1.2 定制容器
通过设置 MPNebulaAdapterInterface
的属性值来定制容器配置。必须在 DTFrameworkInterface
的 - (void)application:(UIApplication *)application afterDidFinishLaunchingWithOptions:(NSDictionary *)launchOptions
中设置,否则会被容器默认配置笼罩。
- (void)application:(UIApplication *)application afterDidFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
// 定制容器
[MPNebulaAdapterInterface shareInstance].nebulaVeiwControllerClass = [MPH5WebViewController class];
[MPNebulaAdapterInterface shareInstance].nebulaNeedVerify = NO;
[MPNebulaAdapterInterface shareInstance].nebulaUserAgent = @"mPaaS/Portal";
}
1.3 更新小程序
启动实现后,全量申请所有小程序包信息,查看服务端是否有更新包。为了不影响利用启动速度,倡议在 (void)application:(UIApplication \*)application afterDidFinishLaunchingWithOptions:(NSDictionary \*)launchOptions
之后调用。
- (void)application:(UIApplication *)application afterDidFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
// 定制容器
[MPNebulaAdapterInterface shareInstance].nebulaVeiwControllerClass = [MPH5WebViewController class];
[MPNebulaAdapterInterface shareInstance].nebulaNeedVerify = NO;
[MPNebulaAdapterInterface shareInstance].nebulaUserAgent = @"mPaaS/Portal";
[MPNebulaAdapterInterface shareInstance].nebulaCommonResourceAppList = @[@"77777777"];
// 全量更新小程序包
[[MPNebulaAdapterInterface shareInstance] requestAllNebulaApps:^(NSDictionary *data, NSError *error) {NSLog(@"");
}];
}
初始化实现后,成果如下:
2、配置小程序
2.1 配置权限
在 info.plist
中配置以下 App 权限:
NSBluetoothAlwaysUsageDescription
:蓝牙权限(iOS 13 中的新增权限)。NSCameraUsageDescription
:相机权限。NSPhotoLibraryUsageDescription
:相册权限。NSLocationWhenInUseUsageDescription
:定位权限。
2.2 配置动静库
在以后工程 TARGETS 的 General > Embedded Binaries 中增加 FalconLooks
库。
阐明:
- 配置动静库在 10.1.68.15(含)及以上版本基线中曾经勾销,无需配置。