上传App Store报错信息记录

ITMS-90171

ITMS-90171: Invalid Bundle Structure - - The binary file (ITMS-90171:包结构无效--不允许使用二进制文件)。

应用程序不能包含独立的可执行文件或库,只能包含受支持捆绑包的有效CFBundleExecutable。

处理方法 :

查看Build phases下面的Copy Bundle Resources下面是否存在错误中提示的文件或库,如果存在,将其删掉。

ITMS-90087

ITMS-90087:Unsupported Architectures.The executable for XXX.app/Frameworks/NMCBasicModuleFramework.framework contains unsupported architectures '[i386,x86_46]' (可执行的文件XXX. app/Frameworks/NMCBasicModuleFramework.framework包含不受支持的体系结构“[i386,x86_46]”)。

成因 :由于 iOS 编译的特殊性,为了方便开发者在模拟器调试,很多 SDK 将i386、x86_64、armv7、arm64几个平台都合并到了一起。在开发阶段都没有问题,但生产编译上传到 App Store 时,需要将i386和x86_64两个平台的库删除,否则无法正常提交审核。

项目手动集成了网易云信,并且引入了网易云信处理手动集成提供的脚本,脚本如下:

#!/bin/sh

# Strip invalid architectures

strip_invalid_archs() {
binary="$1"
echo "current binary ${binary}"
# Get architectures for current file
archs="$(lipo -info "$binary" | rev | cut -d ':' -f1 | rev)"
stripped=""
for arch in $archs; do
if ! [[ "${ARCHS}" == *"$arch"* ]]; then
if [ -f "$binary" ]; then
# Strip non-valid architectures in-place
lipo -remove "$arch" -output "$binary" "$binary" || exit 1
stripped="$stripped $arch"
fi
fi
done
if [[ "$stripped" ]]; then
echo "Stripped $binary of architectures:$stripped"
fi
}

APP_PATH="${TARGET_BUILD_DIR}/${WRAPPER_NAME}"

# This script loops through the frameworks embedded in the application and
# removes unused architectures.
find "$APP_PATH" -name '*.framework' -type d | while read -r FRAMEWORK
do
FRAMEWORK_EXECUTABLE_NAME=$(defaults read "$FRAMEWORK/Info.plist" CFBundleExecutable)
FRAMEWORK_EXECUTABLE_PATH="$FRAMEWORK/$FRAMEWORK_EXECUTABLE_NAME"
echo "Executable is $FRAMEWORK_EXECUTABLE_PATH"

strip_invalid_archs "$FRAMEWORK_EXECUTABLE_PATH"
done

但是打包上传之后仍旧报错了,经过多次排查,再打包的输出信息中发现了这种警告 :warning:skipping copy phase strip, binary is code signed(警告:跳过复制相位条,二进制是有符号的)。后来才发现是脚本执行时机造成的问题,如图:

截屏2020-10-01上午12.20.55.png

ps:

Xcode创建shell脚本文件脚本的地方:

截屏2020-10-01上午12.29.31.png

ps:

查看打包时的输出:

截屏2020-10-01上午12.36.41.png

Guideline 4.3 - Design

We noticed that your app provides the same feature set as other apps submitted to the App Store; it simply varies in content or language, which is considered a form of spam.

The next submission of this app may require a longer review time, and this app will not be eligible for an expedited review until this issue is resolved.

Next Steps

  • Review the Design section of the App Store Review Guidelines.
  • Ensure your app is compliant with all sections of the App Store Review Guidelines and the Terms & Conditions of the Apple Developer Program.
  • Once your app is fully compliant, resubmit your app for review.

When creating multiple apps where content is the only varying element, you should offer a single app to deliver differing content to customers. If you would like to offer this content for purchase, it would be appropriate to use the in-app purchase API.

Alternatively, you may consider creating a web app, which looks and behaves similar to a native app when the customer adds it to their Home screen. Refer to the Configuring Web Applications section of the Safari Web Content Guide for more information.

Submitting apps designed to mislead or harm customers or evade the review process may result in the termination of your Apple Developer Program account. Review the Terms & Conditions of the Apple Developer Program to learn more about our policies regarding termination.

译:

准则4.3-设计

我们注意到,您的应用程序提供的功能集与提交到应用程序商店的其他应用程序相同;它只是在内容或语言上有所不同,这被视为垃圾邮件的一种形式。

下次提交此应用程序可能需要更长的审阅时间,在解决此问题之前,此应用程序将没有资格进行快速审阅。

下一步

-查看App Store Review Guidelines的设计部分。
-确保你的应用程序符合app Store审查指南的所有章节以及Apple开发者程序的条款和条件。
-一旦你的应用程序完全兼容,请重新提交你的应用程序以供审查。

当创建多个应用程序时,内容是唯一不同的元素,您应该提供一个应用程序来向客户交付不同的内容。如果您想提供此内容以供购买,则使用应用内购买API是合适的。

或者,您可以考虑创建一个web应用程序,当客户将其添加到主屏幕时,它的外观和行为类似于本机应用程序。有关详细信息,请参阅《Safari Web内容指南》的“配置Web应用程序”部分。

提交旨在误导或伤害客户或逃避审查过程的应用程序可能会导致您的Apple开发者程序帐户终止。请查看Apple Developer Program的条款和条件,以了解有关终止的更多政策。

处理方法 :

可以尝试使用KLGenerateSpamCode工具混淆代码后再次尝试上传,KLGenerateSpamCode的GitHub地址:https://github.com/klaus01/KLGenerateSpamCode

KLGenerateSpamCode简单使用记录:

  • 1.使用Xcode打开KLGenerateSpamCode项目 -> Product -> Scheme -> Edit Scheme,然后选中 Run -> Arguments -> Arguments Passsd On Launch

如图:

截屏2020-04-18下午2.03.37.png
截屏2020-04-18下午4.20.49.png
  • 2.填入操作项,可操作项目如下:
  1. (必填) 源码文件夹绝对路径(如:/Users/shawn/Desktop/iOS-YiShopCustomer-GuangYuan/YiShopCustomer)。

如图 :

截屏2020-04-18下午4.30.42.png
截屏2020-04-18下午4.33.22.png
  1. -modifyProjectName [原名称]>[新名称] 修改工程名。程序会修改原名称-Swift.h、Podfile、原名称-Bridging-Header.h、源码文件夹绝对路径、原名称.xcodeproj和原名称.xcworkspace的名称和内容。Podfile被修改后需要手动pod install。

例如 :

格式:-modifyProjectName [原名称]>[新名称]

示例:-modifyProjectName WxsTestDemo3>WxsTestDemo4

如图 :

截屏2020-04-18下午4.40.42.png

保存后运行KLGenerateSpamCode项目,注意控制台的输出,如图 :

截屏2020-04-18下午4.42.54.png

查看项目 :

截屏2020-04-18下午4.43.54.png
  1. -modifyClassNamePrefix [工程文件 xcodeproj 绝对路径] [原前缀]>[新前缀] 修改源代码类名前缀。程序会扫描源码文件夹绝对路径下的 .h .swift 文件,修改文件名,修改使用该类名的代码,修改工程文件中的文件名。文件名有原前缀的会修改成新前缀,如:原前缀ViewController变成新前缀ViewController;没有原前缀的会增加新前缀,如:ViewController变成新前缀ViewController。因为会有添加前缀的情况,操作完成后编译检查一下是否会有找不到文件的情况。

例如 :

格式:-modifyClassNamePrefix [工程文件 xcodeproj 绝对路径] [原前缀]>[新前缀]

示例:-modifyClassNamePrefix /Users/shawn/Desktop/iOS-YiShopCustomer-GuangYuan/ZQOneCardSolution.xcodeproj YSC>ZQO

如图 :

截屏2020-04-18下午5.14.07.png

保存后运行KLGenerateSpamCode项目,注意控制台的输出,如图 :

截屏2020-04-18下午1.29.46.png

查看项目 :

原来 :

截屏2020-04-18下午5.18.55.png

现在 :

截屏2020-04-18下午5.17.52.png
  1. -spamCodeOut [垃圾代码文件输出目录] [垃圾代码方法增加的参数名] 生成垃圾代码。程序会扫描源码文件夹绝对路径下的 .m .swift 文件中的类和方法,并生成category和extension文件,文件中的方法是在代码原方法的基础上增加垃圾代码方法增加的参数名参数。如:-spamCodeOut /dir AppLog ,会将- (void)setupKeys {}生成为+ (BOOL)setupKeysAppLog:(NSInteger)AppLog { return AppLog % 20 == 0; },会将- (void)foo:(NSString *)str {}生成为+ (BOOL)fooAppLog:(NSInteger)AppLog { return AppLog % 23 == 0; }

例如 :

格式:-spamCodeOut [垃圾代码文件输出目录] [垃圾代码方法增加的参数名]

  1. -ignoreDirNames [忽略文件夹名称字符串] 忽略这些文件夹,对-modifyClassNamePrefix、-spamCodeOut和-deleteComments参数有效。目前只会忽略源码文件夹绝对路径下一级的这些目录。如:/p/s -ignoreDirNames categorys,那么/p/s/categorys会被忽略,但/p/s/viewControllers/categorys不会忽略。

例如 :

格式:-ignoreDirNames [忽略文件夹名称字符串]

示例:-ignoreDirNames 第三方库

  1. -handleXcassets 修改xxx.xcassets文件夹中的 png 资源文件名,同时也Contents.json文件中的关联名称,不会影响代码中使用图片。

例如 :

格式:-handleXcassets

如图 :

截屏2020-04-18下午6.03.10.png

保存后运行KLGenerateSpamCode项目,注意控制台的输出,如图 :

截屏2020-04-18下午6.02.50.png

查看图片文件夹:

原来 :

截屏2020-04-18下午6.08.26.png

现在:

截屏2020-04-18下午6.08.36.png

7.-deleteComments 删除工程目录下 .h .m .swift 文件中的注释和空行。

例如 :

格式:-deleteComments

如图 :

截屏2020-04-18下午5.32.56.png

保存后运行KLGenerateSpamCode项目,注意控制台的输出,如图 :

截屏2020-04-18下午5.31.56.png
另外修改图片 hash 值的方法

使用 ImageMagick 对 png 图片做轻量压缩,既不损失图片质量,又可改变图片文件 hash 值。方法:

  1. 安装 ImageMagick,brew install imagemagick
  2. 压缩工程目录下所有 png 文件,find . -iname "*.png" -exec echo {} \; -exec convert {} {} \;

执行下载https://www.python.org/ftp/python/3.8.2/python-3.8.2.tar.xz时,安装过程会比较慢,可能会失败,使用联通的网络会快一些,安装成功后会有提示,例如:

==> python@3.8
Python has been installed as
  /usr/local/opt/python@3.8/bin/python3

You can install Python packages with
  /usr/local/opt/python@3.8/bin/pip3 install <package>
They will install into the site-package directory
  /usr/local/opt/python@3.8/Frameworks/Python.framework/Versions/3.8/lib/python3.8/site-packages

See: https://docs.brew.sh/Homebrew-and-Python

python@3.8 is keg-only, which means it was not symlinked into /usr/local,
because this is an alternate version of another formula.

If you need to have python@3.8 first in your PATH run:
  echo 'export PATH="/usr/local/opt/python@3.8/bin:$PATH"' >> ~/.bash_profile

For compilers to find python@3.8 you may need to set:
  export LDFLAGS="-L/usr/local/opt/python@3.8/lib"

For pkg-config to find python@3.8 you may need to set:
  export PKG_CONFIG_PATH="/usr/local/opt/python@3.8/lib/pkgconfig"

==> glib
Bash completion has been installed to:
  /usr/local/etc/bash_completion.d
==> libtool
In order to prevent conflicts with Apple's own libtool we have prepended a "g"
so, you have instead: glibtool and glibtoolize.

安装成功后直接运行 find . -iname "*.png" -exec echo {} ; -exec convert {} {} ; 命令即可,之后会对图片进行操作,如果为安装成功,执行命令会提示:find: convert: No such file or directory

大神的使用经验

只需要做如下修改就可以上马甲包了:

    1. 修改工程名
    1. 修改类名前缀
    1. 修改图片文件 Hash 值
    1. 修改 .xcassets 中的图片文件名
    1. 用别的电脑打包
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,117评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,328评论 1 293
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,839评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,007评论 0 206
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,384评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,629评论 1 219
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,880评论 2 313
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,593评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,313评论 1 243
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,575评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,066评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,392评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,052评论 3 236
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,082评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,844评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,662评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,575评论 2 270

推荐阅读更多精彩内容