iOS提交ipa包时出现"The binary file XXX libswiftRemoteMirror.dylib is not permitted"

字数 626阅读 1153

IOS打包主要分为Archive打包和.app文件打包,题主之前一直用着.app文件打包的,但是之前提交一个混编的swift项目打的包的时候,提交ipa报错如下:

Paste_Image.png

提示:ERROR ITMS-90171:Invalid Bundle Structure - The binary file XXX libswiftRemoteMirror.dylib is not permitted. Your app can’t contain standalone executables or libraries, other than the CFBundleExecutable of supported bundles……..

根据提示来看,说是不应该存在libswiftRemoteMirror.dylib这个文件,当然这个文件在项目中是搜不到的,是在编译打包后生成在.app文件中的,解压ipa包就可以发现

Paste_Image.png

后来,经过多次实验发现,可以通过以下几种方式解决:

1.通过Xcode的Archive方式打包。Archive打的包,就没有包含这个libswiftRemoteMirror.dylib文件。
2.手动删除.app中的libswiftRemoteMirror.dylib文件,然后进行.app打包。
3.在Xcode7中进行.app打包。在Xcode7和Xcode8中分别进行.app打包,发现Xcode7打包后没有libswiftRemoteMirror.dylib文件。

由于笔者不想改变xcodebuild打包的脚本,也就是继续用.app文件打包,用xcrun压缩成ipa的方式,所以1否决。另外由于笔者这边编译机器已经整体升级到Xcode8,也不想回退回Xcode7,所以3否决。因此,笔者决定采用2的方式解决问题,编译脚本手动删除.app中的libswiftRemoteMirror.dylib文件,然后对.app进行重新签名,最后再用xcrun压缩成 .ipa文件

手动删除libswiftRemoteMirror.dylib不难,怎么对.app进行重新签名才是重点,经过搜索,重签名的步骤如下所示:

在xcodebuild 对工程进行编译打包,生成了对应的.app文件
1.删除App里的libswiftRemoteMirror.dylib

rm  YourApp.app/libswiftRemoteMirror.dylib

2.替换证书配置文件(文件名必须为embedded,不得自定义)

cp 你要签名的mobileprovision路径  YourApp.app/embedded.mobileprovision 

3.生成entitlements.plist,后面重签名要用

security cms -D -i 你要签名的mobileprovision路径 > entitlements_full.plist
/usr/libexec/PlistBuddy -x -c 'Print:Entitlements' entitlements_full.plist > entitlements.plist

4.重签名(certifierName为重签名证书文件名,可以加证书ID后缀)

certifierName="iPhone Distribution: olinone Information Technology Limited(6a5TVN58SY)"
codesign -f -s $certifierName  --entitlements entitlements.plist YourApp.app

这3步完成后,就可以继续用xcrun命令,把对应的.app文件压缩成.ipa文件,而这个.ipa文件提交至appstore也就不会报错了,至此问题已基本解决

参考资料如下:
http://www.olinone.com/?p=198
http://www.jianshu.com/p/f4cfac861aac
http://www.cocoachina.com/ios/20141017/9949.html
http://blog.csdn.net/u013531246/article/details/52813598

推荐阅读更多精彩内容