1.AppStore 审核被拒
最近在提交app新版本到appstore进行审核,收到了审核人员2.5.2与2.3.1的大礼包,app审核没有通过。
2.分析
2.1.网上搜索遇到同样问题的网友,发现基本上所有网友会遇到2.5.2与2.3.1问题同时出现的情况。主要问题在于苹果认为你违反了2.5.2规则,有热更新的倾向。苹果不允许非教育类app程序有热更新功能。
2.2.有的网友违反2.5.2规则,苹果审核解决中心的邮件会回复具体问题: This includes any code which passes arbitrary parameters to dynamic methods such as dlopen(), dlsym(), respondsToSelector:, performSelector:, method_exchangeImplementations(), and running remote scripts in order to change app behavior and/or call SPI, based on the contents of the downloaded script。
2.3. 具体原因是: 程序代码或第三方库中使用了dlopen(), dlsym()高危方法做动态加载功能, 或者使用respondsToSelector:, performSelector:, method_exchangeImplementations()相关函数去调用或替换系统私有api,不被允许(备注:正常使用 respondsToSelector:, performSelector:, method_exchangeImplementations()不会有问题)。
3.使用nm 命令查找相关符号
通过 shell 脚本查找符号,执行脚本,输入工程地址。
脚本源码如下:
#!/bin/bash
# 定义用到的变量
project_path=""
# 定义读取输入字符的函数
function getProjectPath() {
# 输出换行,方便查看
echo "================================================"
# 监听输入并且赋值给变量
read -p " Enter project path: " project_path
# 如果为空值,从新监听
if test -z "$project_path"; then
getProjectPath
else
read_dir ${project_path}
fi
}
function read_dir(){
for file in `ls $1` #注意此处这是两个反引号,表示运行系统命令
do
if [ -d $1"/"$file ] #注意此处之间一定要加上空格,否则会报错
then
read_dir $1"/"$file
else
#在此处处理文件即可
file_path="$1/$file"
if `file ${file_path} | grep -q 'Mach-O'` ; then
find_world=$(echo `nm -u ${file_path} | grep -E 'dlopen|method_exchangeImplementations|performSelector|respondsToSelector|dlsym'`)
# -n 字符串 字符串的长度不为零则为真
if [ -n "$find_world" ] ; then
echo '-----------------------------\n'
echo ${file_path}
echo '包含字段:'
echo ${find_world}
echo '\n'
fi
fi
fi
done
}
#读取第一个参数
getProjectPath
echo "------- end processing -------"
#作者:iHTCboy
#链接:https://www.jianshu.com/p/da0bf326c2fc
#来源:简书
#简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。
发现问题
执行脚本 输入工程目录后 发现主要是一些第三方库(友盟统计、科大讯飞、openssl)中含有相关违规符号
回复appstore审核人员
执行脚本如果发现只是一些第三方库使用了相关函数,你可以回复appstore审核人员 说明具体情况,审核人员有可能会让你通过,有可能要你修复相关问题,升级第三方库重新提交版本。在我们这次与审核人员的沟通中,我们列出了出问题的第三库和官网,并且说明程序没有使用热更新相关功能,最后通过了审核。
后续
虽然通过与审核人员的沟通,通过了appstore的审核,但不能保证以后不会被拒。开发者应该在后续版本中升级相关第三方库来修复此问题。很多第三方库旧版本含有热更新功能,新版本一般会通过去除热更新或混淆代码的方式来通过appstore的审核。