diff --git a/Chapter1 - iOS/1.74.md b/Chapter1 - iOS/1.74.md index 1c2d460..786753a 100644 --- a/Chapter1 - iOS/1.74.md +++ b/Chapter1 - iOS/1.74.md @@ -720,6 +720,8 @@ App 内存不足时,系统会按照一定策略来腾出更多的空间供使 由于闪存容量和读写限制,iOS 没有交换空间机制,而是在 iOS7 引入了 **memory compressor**。它是在内存紧张时候能够将最近一段时间未使用过的内存对象,内存压缩器会把对象压缩,释放出更多的 page。在需要时内存压缩器对其解压复用。在节省内存的同时提高了响应速度。 + 比如 App 使用某 Framework,内部有个 NSDictionary 属性存储数据,使用了 3 pages 内存,在近期未被访问的时候 memory compressor 将其压缩为 1 page,再次使用的时候还原为 3 pages。 + App 运行内存 = pageNumbers * pageSize。因为 Compressed Memory 属于 Dirty memory。所以 Memory footprint = dirtySize + CompressedSize 设备不同,内存占用上限不同,App 上限较高,extension 上限较低,超过上限 crash 到 `EXC_RESOURCE_EXCEPTION`。 diff --git a/Chapter1 - iOS/1.78.md b/Chapter1 - iOS/1.78.md index fad0ee3..43577e2 100644 --- a/Chapter1 - iOS/1.78.md +++ b/Chapter1 - iOS/1.78.md @@ -1,102 +1,26 @@ -# 上架包预检 +# App 上架包预检 -## 常见被拒原因汇总 +## 一、 iOS 端常见被拒原因汇总 -### iOS - -钱伴 - -敏感词:审核、热更新、开关 -1. App 内包含分发下载分发功能(比如贷款超市、引导用户下载 App 等功能)。 -2. 提供的测试账号无法查看贷款实际利率。 -3. notification 接口返回:showupgrade:true,提示用户升级。 审核期间接口不要返回该字段。 -4. 审核账号,任何时候在任何ip登录看到的都是审核版。 -5. 审核的时候屏蔽 getwarehouseinfo 接口(tab接口)。审核期间 getwarehouseinfo 接口不返回数据。读取本地的配置 -6. upgrade:签到不能展示。 方案:把现在提额页copy一份,通过审核开关控制展示哪个页面。隐藏活动入口 -7. getSdkConfig 屏蔽接口返回内容。审核阶段接口返回空 -8. switch字样接口 -9. review字样接口 - -基金: -没有发版问题 - - -挖财宝: -1. App 内部某个控件点击后跳转到了信用卡的 H5 页面,可以引导用户线下办卡 -2. 提供的登陆账号和密码不对,登陆不上 -3. 运营填写的营销关键字有问题 -4. 元数据问题,iPhoneX 截图中 iPhone 壳子是 iPhone7 的,应该是 iPhoneX -5. 说明隐私权限的作用。 - -闪电公积金: -1. 苹果看到“代缴公积金”,这个需要有政府机构资质,此类功能在审核期间都关闭。 - - -社保: -1. 修改隐私权限相关的文案,做到让审核人员看得懂 - - -记账: -1. Guidelines 3.2.2 审核期间,隐藏邀请好友、天天挖宝相关的运营活动 - - -信用保镖: -1. 狗年大礼包: 修改元数据后申诉;更换销售地区后提审。 - - -### Android - -信贷超人: -1. App 无法登陆进去,属于 bug 级别 -2. App 没有适配 ipad。 -3. Privacy - Data Collection and Storage,说明 App 没有做隐私权限的收集。 -4. 访问 h5 页面出现问题。 属于 bug 级别 - -微记账: -暂无 - - -挖财宝: - -1. 原因:挖财宝集成了设备指纹SDK, 会上传用户设备安装应用列表,所以被拒. 解决:移除设备指纹SDK, 成功上架 -2. 原因:挖财宝中,存在更多App按钮,会导向应用宝,所以被华为拒过,其他应用市场没有拒过. 解决:移除更多App按钮,无再被华为拒过。 - - -基金: -暂未遇到审核被拒的情况。 - -快贷: -暂未遇到审核被拒的情况。 - -钱伴: -暂未遇到审核被拒的情况。 - -信用卡: - -1. 经检测你的应用targetsdk版本低于26 ,请修改。 -2. 你的应用未加固 -3. 你提交的应用被检测到存在不合理获取短信/通话记录相关权限的行为,请勿获取SEND_SMS、READ_SMS、READ_CALL_LOG、RECEIVE_SMS权限。 -4. 你的应用注册登录界面的《用户协议》内容空白,请添加。 -5. 你的应用注册登录时无法接收验证码,注册登录时需输入图形验证码,且无图形参考,请定位修复。 -6. 在你的应用内任选一款借贷产品注册点击下载应用后直接进入第三方下载渠道,请修改为华为应用市场下载链接或者直接删除应用分发模块。 -7. 你的应用版权未通过审核,请提供a.《计算机软件著作权证书》或《APP电子版权证书》; b. ICP备案;c.《免责函》;d.你提供的合作协议已到期,请重新提供至少三家贷款产品合作单位的金融监管部门备案登记文件、授权书。e.请提供《金融许可证》或对应银行信用卡中心授权证明(至少三家)。免责函模板下载链接,https://url.cloud.huawei.com/1vbaVckwPC -8. 你的应用截图与实际内容不相符,请修改。如有疑问,请发邮件至developer@huawei.com。 -9. 使用了动态更新的能力。回复苹果,问具体使用的地方,并贴出代码。 - - - -只能根据政策去做,比如当前的隐私权权限问题就是政策 -还有一些如理财、贷款类,没有资质就无法过审,这个也是政策。 - -解决方案: - -苹果那边是把接口字段定义的隐晦一点。之前是定义了一个颜色值作为审核的开关 -如果是对应的颜色,就开启相应功能。 +1. App 内包含分发下载分发功能(引导用户下载 App 等功能) +2. 提供的测试账号无法查看实际功能 +3. 通过接口返回布尔值判断 App 是否升级,但审核期间该接口不请求 +4. 审核账号,任何时候在任何 ip 登录看到的都是审核版 +5. 提供的登陆账号和密码不对,登陆不上 +6. 运营填写的营销关键字有问题 +7. 元数据问题,iPhoneX 截图中 iPhone 壳子是 iPhone7 的,应该是 iPhoneX +8. 说明隐私权限的作用 +9. 营销文字,某些能力需要资质。此类功能在审核期间都关闭 +10. 修改隐私权限相关的文案,做到让审核人员看得懂,做到「信达雅」 +11. App 无法登陆进去,属于 bug 级别 +12. App 没有适配 ipad +13. Privacy - Data Collection and Storage,说明 App 没有做隐私权限的收集。 +14. 访问 h5 页面出现问题。 属于 bug 级别 -## 原因汇总 +## 二、 App 被拒原因汇总 从 Android 和 iOS 2端 App 被驳回的一些信息来看,驳回原因一般划分为下面几类: @@ -112,77 +36,71 @@ +## 三、 方案 -## 方案 +常见审核失败的原因很多,很大比重一个就是代码或者文本里面存在一些敏感词,所以本文的侧重点在于关键词扫描。像上架设置的截图和当前设备不匹配、提供的账号无法使用功能 😂 这种情况打一顿就好了,非主流行为不在本文范围内 -### 敏感词云 +### 3.1 词云谁去收集? -loan、online、ischeck、isonline、switch、review、审核、热更新、开关、代缴公积金 +每个公司一般来说都不止一条业务线,所以每个业务线的 App 情况和内容也不一样,所以敏感词也是千差万别。敏感词收集这个事情,应该由业务线主要负责 App 的开发者来收集,根据平时的上架情况,苹果的驳回的邮件来整理。 -扫描是基于源代码出发的扫描的 -1. 关键词词云在什么阶段分析,构建前、构建后? - 放在构建前进行。因为需要对敏感词划分等级,如果是 error 级别,则在扫描构建的时候匹配,匹配任意一个则马上构建失败;如果是 warning 级别,则需要在构建完成后展示出来。 -2. 词云要不要分等级,比如 error、warning。 - 遇到 error 构建马上停止;waring 的话给出警告 console -3. 私有 api 要不要扫描,扫描的话怎么做? - 性质和关键词一样。做到一个 yml 文件里面。然后用正则将一堆关键词和每个代码文件进行匹配。 -4. 私有 api 是做 top 100 呢?还是 top 50,还是全部的? - 私有 api 扫描要做,将私有 api 打包到关键词 yml 文件中。所以本质上还是字符串查找的问题。 -5. 私有 api 要不要设置开关,让打包的人选择要不要扫描私有 api - 不做关键词扫描的场景目前没想到,所以最好是每个打包都需要做关键词扫描。 +### 3.2 方案设计 -测试实验: -NodeJS 实现: 9个铭感词语、代码文件5967个,耗时3.5秒 +公司自研工具 cli(iOS SDK、iOS App、Android SDK、Android App、RN、Node、React 依赖分析、构建、打包、测试、热修复、埋点、构建),各个端都是通过「模版」来提供能力。包含若干子项目,每个子项目就是所谓的 “**模版**”,每个模版其实就是一个 Node 工程,一个 npm 模块,主要负责以下功能:特定项目类型的目录结构、自定义命令供开发、构建等使用、模版持续更新及 patch 等。 + +所以可以在打包构建(各个端将项目提交到打包系统,打包系统根据项目语言、平台调度打包机)的时候,拿到源代码进行扫描。基于这个现状,所以方案是「扫描是基于源代码出发的扫描的」。 + +按照 iOS 端 `pod install` 这个过程,cocoapods 为我们预留了钩子:`PreInstallHook.rb`、`PostInstallHook.rb`,允许我们在不同的阶段为工程做一些自定义的操作,所以我们的 iOS 模版设计也参考了这个思想,在打包构建前、构建中、构建后提供了钩子:`prebuild`、`build`、`postbuild`。定位好了问题,要做的就是在 prebuild 里面进行关键词扫描的编码工作。 + +确定了什么时候做什么事情,接下来就要讨论怎么做才合适。 + +### 3.3 技术方案选择 + +字符串匹配算法 KMP 是一开始想到的内容,针对某个 App 进行时机测试,发现50多个敏感词的情况下,代码扫描耗时60秒钟,觉得非常不理想,看 KMP 算法没有啥问题,所以换个思路走下去。 + +因为模版本质上 Node 项目,所以 Node 下的 **glob** 模块正好提供根据正则匹配到合适的文件,也可以匹配文件里面的字符串。然后继续做实验,数据如下:9个铭感词语、代码文件5967个,耗时3.5秒 - -## 技术方案 +### 3.4 完整方案 1. 业务线需要自定义敏感词云(因为每条业务线的关键词云都不一样) 2. 敏感词需要划分等级:error、warning。扫描到 error 需要马上停止构建,并提示「已扫描到你的源码中存在敏感词***,可能存在提交审核失败的可能,请修改后再次构建」。warning 的情况不需要马上停止构建,等任务全部结束后汇总给出提示「已扫描到你的源码中存在敏感词***、***...,可能存在提交审核失败的可能,请开发者自己确认」 -3. 铭感词云的格式。scaner.yml 文件。 - - error: 数组的格式。后面写需要扫描的关键词,且等级为 error,表示扫描到 error 则马上停止构建 - - warning:数组的格式。后面写需要扫描的关键词,且等级为 warning,扫描结果不影响构建,最终只是展示出来 - - searchPath:字符串格式。可以让业务线自定义需要进行扫描的路径。 - - fileType:数组格式。可以让业务线自定义需要扫描的文件类型。默认为 `sh|pch|json|xcconfig|mm|cpp|h|m` - - warningkeywordsScan:布尔值。业务线可以设置是否需要扫描 warning 级别的关键词。 - - errorKeywordsScan:布尔值。业务线可以设置是否需要扫描 error 级别的关键词。 - ``` - error: - - checkSwitch - warning: - - loan - - online - - ischeck - searchPath: - ../fixtures - fileType: - - h - - m - - cpp - - mm - - js - warningkeywordsScan: - true - errorKeywordsScan: - true - ``` +3. 铭感词云的格式 `scaner.yml` 文件。 + - error: 数组的格式。后面写需要扫描的关键词,且等级为 error,表示扫描到 error 则马上停止构建 + - warning:数组的格式。后面写需要扫描的关键词,且等级为 warning,扫描结果不影响构建,最终只是展示出来 + - searchPath:字符串格式。可以让业务线自定义需要进行扫描的路径。 + - fileType:数组格式。可以让业务线自定义需要扫描的文件类型。默认为 `sh|pch|json|xcconfig|mm|cpp|h|m` + - warningkeywordsScan:布尔值。业务线可以设置是否需要扫描 warning 级别的关键词。 + - errorKeywordsScan:布尔值。业务线可以设置是否需要扫描 error 级别的关键词。 + + ```yml + error: + - checkSwitch + warning: + - loan + - online + - ischeck + searchPath: + ../fixtures + fileType: + - h + - m + - cpp + - mm + - js + warningkeywordsScan: true + errorKeywordsScan: true + ``` + 4. iOS 端存在私有 api 的情况,Android 端不存在该问题 - 私有 api 70111个文件,每个文件假设10个方法,则共70万个 api。所以计划找出 top 100.去扫描匹配,支持业务线是否开启的选项 -5. 利用 NodeJS 实现关键词预审能力,wax cli 调度各个模版的能力实现相应的功能,所以要做的事情就是找到相应的时机去编码实现相应的需求。几个问题需要确认?包预检需要放在构建的什么阶段?需要不需要设置关键词的等级?需要不需要设置关键词扫描的文件路径?需要不需要支持自定义文件匹配类型? + 私有 api 70111个文件,每个文件假设10个方法,则共70万个 api。所以计划找出 top 100.去扫描匹配,支持业务线是否开启的选项 其实这些问题都是业界标准的做法,肯定需要预留这样的能力,所以自定义规则的格式可以查看上面 yml 文件的各个字段所确定。明确了做什么事,以及做事情的标准,那就可以很快的开展并落地实现。 - - -
- -点击展开代码 - ```javascript 'use strict' -const { Error, logger } = require('@wac/wax-utils') +const { Error, logger } = require('@company/BFF-utils') const fs = require('fs-extra') const glob = require('glob') const YAML = require('yamljs') @@ -321,22 +239,4 @@ module.exports = class PreBuildCommand { } } } -``` - -
- - -## wax ? -公司自研工具 wax 是「一站式协同开发利器,重新定义混合开发」。包含若干子项目,每个子项目就是所谓的 “**模版**”,每个模版其实就是一个 Node 工程,一个 npm 模块,主要负责以下功能: - -- 特定项目类型的目录结构 -- 自定义命令供开发、构建等使用 -- 模版持续更新及 patch 等 - -按照 iOS 端 `pod install` 这个过程,cocoapods 为我们预留了钩子:`PreInstallHook.rb`、`PostInstallHook.rb`,允许我们在不同的阶段为工程做一些自定义的操作,所以我们的 iOS 模版设计也参考了这个思想,在打包构建前、构建中、构建后提供了钩子:`prebuild`、`build`、`postbuild`。定位好了问题,要做的就是在 prebuild 里面进行关键词扫描的编码工作。 - -![wax 项目子工程](./../assets/2019-12-18-wax-project.png) - - - - +``` \ No newline at end of file diff --git a/Chapter1 - iOS/chapter1.md b/Chapter1 - iOS/chapter1.md index c37cf70..8f69ea7 100644 --- a/Chapter1 - iOS/chapter1.md +++ b/Chapter1 - iOS/chapter1.md @@ -81,7 +81,7 @@ * [75、如何写好测试](https://github.com/FantasticLBP/knowledge-kit/blob/master/Chapter1%20-%20iOS/1.75.md) * [76、iOS Crash分析](https://github.com/FantasticLBP/knowledge-kit/blob/master/Chapter1%20-%20iOS/1.76.md) * [77、iOS 打包系统构建加速](https://github.com/FantasticLBP/knowledge-kit/blob/master/Chapter1%20-%20iOS/1.77.md) - * [78、上架包预检](https://github.com/FantasticLBP/knowledge-kit/blob/master/Chapter1%20-%20iOS/1.78.md) + * [78、App 上架包预检](https://github.com/FantasticLBP/knowledge-kit/blob/master/Chapter1%20-%20iOS/1.78.md) * [79、深入理解各种锁](https://github.com/FantasticLBP/knowledge-kit/blob/master/Chapter1%20-%20iOS/1.79.md) * [80、打造功能强大的数据上报组件](https://github.com/FantasticLBP/knowledge-kit/blob/master/Chapter1%20-%20iOS/1.80.md) * [81、__asm__ 重命名符号](https://github.com/FantasticLBP/knowledge-kit/blob/master/Chapter1%20-%20iOS/1.81.md) diff --git a/Chapter7 - Geek Talk/7.10.md b/Chapter7 - Geek Talk/7.10.md index b772f7e..210a51c 100644 --- a/Chapter7 - Geek Talk/7.10.md +++ b/Chapter7 - Geek Talk/7.10.md @@ -32,8 +32,8 @@ alias pru='pod repo update' alias pi='pod install' alias pu='pod update' alias piu='pod install --repo-update' -alias repoanalysis='specbackwarddependency /Users/liubinpeng/.cocoapods/repos/51xianqu-xq_specs' -alias plint='pod lib lint --sources=git@git.caimi-inc.com:client/i-New-All-Specs.git,git@git.caimi-inc.com:client/CocoaPods-Specs.git --allow-warnings --verbose --use-libraries' +alias repoanalysis='specbackwarddependency /Users/liubinpeng/.cocoapods/repos/XXCompany_specs' +alias plint='pod lib lint --sources=git@git.***-inc.com:client/App-Specs.git,git@git.***-inc.com:client/CocoaPods-Specs.git --allow-warnings --verbose --use-libraries' alias errorShow=' >1.log 2>&1' # git 相关指令 alias gck='git checkout' diff --git a/Chapter7 - Geek Talk/7.2.md b/Chapter7 - Geek Talk/7.2.md index 7ed060b..71d25df 100644 --- a/Chapter7 - Geek Talk/7.2.md +++ b/Chapter7 - Geek Talk/7.2.md @@ -31,7 +31,7 @@ Charles 是收费软件,作者开发出这样一个方便开发者使用的伟 ## 安装 Charles - 方式1:[ Charles 官网地址](https://www.charlesproxy.com/download/),根据你的电脑操作系统选择合适的下载方式。此时下载下来的是需要收费的,不差钱的同学当然可以直接购买。[购买链接](https://www.charlesproxy.com/buy/) -- 方式2:按照方式1的方式去官网下载,然后下载相应 **[JAR包](https://pan.baidu.com/s/1QqSiEwMGIFrxwyKYg_6Kdw)**。这里以 MAC 为例,打 **Finder**,选择应用程序,选中 Charles,右击并选择“显示包内容”,看到 **Contents** 目录,点击进去选择 **Java** 文件夹,将下载下来的 **JAR包** 拖进去替换。至此,完成了 Charles 的破解。 +- 方式2:按照方式1的方式去官网下载,然后下载相应 **[JAR包](https://raw.githubusercontent.com/FantasticLBP/knowledge-kit/master/assets/charles.jar)**。这里以 MAC 为例,打 **Finder**,选择应用程序,选中 Charles,右击并选择“显示包内容”,看到 **Contents** 目录,点击进去选择 **Java** 文件夹,将下载下来的 **JAR包** 拖进去替换。至此,完成了 Charles 的破解。 diff --git a/Chapter7 - Geek Talk/7.20.md b/Chapter7 - Geek Talk/7.20.md index 7fa3d47..5a9e64f 100644 --- a/Chapter7 - Geek Talk/7.20.md +++ b/Chapter7 - Geek Talk/7.20.md @@ -126,4 +126,4 @@ git commit 的几个钩子,也暴露出来了,所以可以结合时机做一 - commit-msg:在编写 commit 信息的时候触发 - pre-push:在 git push 之前触发 -所以基于上述时机,可以根据项目特点做一些别的事情。比如在 git commit 之前判断是否单元测试通过。是否自动化根据 commit 信息生成 changeLog 等。 +所以基于上述时机,可以根据项目特点做一些别的事情。比如 code lint、unit test 代码覆盖率检测、changelog 自动生成、unit test 脚本等、也可以借此机会产生 lint 报表