在解决标题提到的问题之后,先来介绍下Qt Framework一些基本知识。
基于QT的Mac端工程,在打包时需要对所有需要嵌入到APP的framework及dylib文件进行手动签名处理。

一、签名处理的流程

1. 先编译工程生成APP。
2. 对所有framework/dylib进行签名,命令为:
codesign --force --verify --verbose --sign "Developer ID Application: XXXX. (XXXXXXX)" MMMMMM.framework

在终端输入即可,注意MMMMMM.framework 需要是绝对路径。

3. 对所有framework执行签名后,对app进行签名处理:
codesign --force --verify --verbose --sign "Developer ID Application: XXXXXX. (XXXXX)" NNNNNNN.app
在终端输入即可,注意NNNNNNN.app是绝对路径。

二、验证APP是否签名成功

如果想验证下APP是否签名成功,可以输入下面任意一个命令:

(1)第一条命令:用于判断APP及所有framework是否签名工程

codesign -v --strict --deep --verbose= aaaaa.app

如果提示下面两行表示成功:

aaaaa.app: valid on disk
aaaaa.app: satisfies its Designated Requirement

如果提示类似下面的提示,表示失败:

In subcomponent /XXXX/XXXX/XXXX/ff.framework

表示这个framework签名不合格,需要查看此framework内部文件结构是否正常等,完成之后重新进行签名,再对APP进行签名。

(2)第二条命令:用于查看APP签名信息及嵌入到APP的dylib和framework等

 codesign -d --deep --verbose= -r- aaaaa.app

提示如下表示成功:

(3)第三条命令:

spctl --assess -vv NNNNN.app

提示如下表示成功:

aaaaa.app: accepted
source=Developer ID
origin=Developer ID Application: XXXXXXXXX. (XXXXXX)

三、Qt Framework/dylib文件签名失败问题

xcode 提示 " framework/Versions/A:bundle format unrecognized, invalid, or unsuitable" ,

说明当前framework不符合apple官方对framework这种bundle的格式要求。查看Versions/A文件夹下为空。

以QtConcurrent.framework(Qt 5.5.1版本)为例说明问题,提示的framework结构为:

由于发版时都是基于release版本编译,因此移除根目录下QtConcurrent_debug和QtConcurrent_debug.prl文件,然后重新对当前framework进行签名处理,

此时会提示“Unsealed contents present in the root directory of an embedded framework”,说明在framework的根目录下存在不符合要求的文件,

此时除了软连接文件,就剩余QtConcurrent.prl文件,经查阅发现此文件用于在链接时查找库的依赖关系,因此此文件不能删除。

那不删除又无法签名成功,该如何处理呢?

可以将QtConcurrent.prl移动到Resources(软连接的文件夹)文件夹中,此时进行签名OK,签名成功后,文件目录为:
 

QtConcurrent.framework根目录下没有了QtConcurrent.prl,并且在/5/目录下生成了一个名为 _CodeSignature的文件夹,表示当前framework签名成功。

对于APP所依赖所有Qt的framework进行上述处理,而对于其他dylib文件则比较简单,直接输入签名命令进行签名即可。

需要特别注意的是QtWebEngineCore.framework,对此进行签名之前,需要先对/Versions/5/Helpers/QtWebEngineProcess.app进行签名。

等所有依赖的库签名成功后,再对APP进行签名:

codesign --force --verify --verbose --sign "Developer ID Application: XXXXX (XXXXX)" aaaaaa.app

其中aaaaa.app代表app的绝对路径如果app签名也成功,那么在APP/Contents根目录下会多出一个_CodeSignature文件夹和embedded.provisionfile文件。

四、处理脚本

为了方便编译,自己封装了一个脚本(codesign_framework_test.sh),在xcode的配置即可,如下图所示。

codesign_frameworks_test.sh的内容为:

 #!/bin/sh

 # WARNING: You may have to run Clean in Xcode after changing CODE_SIGN_IDENTITY!
echo ">>>>>>>>start to process unseable files in framework <<<<<<"
ITEMS="" echo "build dir:"
echo $TARGET_BUILD_DIR FRAMEWORKS_DIR="${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" echo "Framework path:"
echo $FRAMEWORKS_DIR # Prefer the expanded name, if available.
CODE_SIGN_IDENTITY_FOR_ITEMS="${EXPANDED_CODE_SIGN_IDENTITY_NAME}"
if [ "${CODE_SIGN_IDENTITY_FOR_ITEMS}" = "" ] ; then
# Fall back to old behavior.
CODE_SIGN_IDENTITY_FOR_ITEMS="${CODE_SIGN_IDENTITY}"
fi echo "Identity:"
echo "${CODE_SIGN_IDENTITY_FOR_ITEMS}" if [ -d "$FRAMEWORKS_DIR" ] ; then
FRAMEWORKS=$(find "${FRAMEWORKS_DIR}" -depth -type d -name "*.framework" -or -name "*.dylib" -or -name "*.bundle")
RESULT=$?
if [[ $RESULT != 0 ]] ; then
exit 1
fi
ITEMS="${FRAMEWORKS}"
fi echo "Framworks_Found:" for ITEM in $ITEMS;
do
framework_filepath="${ITEM##*/}"
# file name no ext
framework_filename="${framework_filepath%.*}"
# file name with ext
current_framework_name="${framework_filepath##*/}"
echo "**************:"$current_framework_name
# ext
extension=${ITEM##*.} if [ "$extension" != "framework" ]
then
# code sign
codesign --force --verify --verbose --sign "${CODE_SIGN_IDENTITY_FOR_ITEMS}" "${ITEM}"
continue
fi
# debug file
debug_name="${framework_filename}_debug"
framework_debug="${ITEM}/${debug_name}" # debug prl file
debug_prl_name="${framework_filename}_debug.prl"
framework_debug_prl="${ITEM}/${debug_prl_name}" echo "${framework_debug} deleting >>>"
echo "${framework_debug_prl} deleting >>>" # delete files
rm $framework_debug
rm $framework_debug_prl # delete folder
rm -rf "${ITEM}/Versions/A" resources_folder="${ITEM}/Versions/5/Resources"
echo $resources_folder
release_prl_name="${framework_filename}.prl"
framework_release_prl="${ITEM}/${release_prl_name}"
echo $framework_release_prl
echo "move ${framework_release_prl} to Resources folder::"
mv $framework_release_prl $resources_folder if [ "QtWebEngineCore" == "$framework_filename" ]
then
QtWebEngineProcess_app="${ITEM}/Versions/5/Helpers/QtWebEngineProcess.app"
codesign --force --verify --verbose --sign "${CODE_SIGN_IDENTITY_FOR_ITEMS}" "${QtWebEngineProcess_app}"
fi
# code sign
codesign --force --verify --verbose --sign "${CODE_SIGN_IDENTITY_FOR_ITEMS}" "${ITEM}"
done MacOS_DIR="${TARGET_BUILD_DIR}/${CONTENTS_FOLDER_PATH}/MacOS"
MacOS_ITEMS="" if [ -d "$MacOS_DIR" ] ; then
MacOSLibs=$(find "${MacOS_DIR}" -depth -type d -name "*.framework" -or -name "*.dylib" -or -name "*.bundle")
RESULT=$?
if [[ $RESULT != 0 ]] ; then
exit 1
fi
MacOS_ITEMS="${MacOSLibs}"
fi echo "MacOSItems:"
for MacOS_ITEM in $MacOS_ITEMS;
do
framework_filepath="${MacOS_ITEM##*/}"]
# file name with ext
current_framework_name="${framework_filepath##*/}"
echo "**************:"$current_framework_name
# code sign
codesign --force --verify --verbose --sign "${CODE_SIGN_IDENTITY_FOR_ITEMS}" "${MacOS_ITEM}"
done PROJECT_NAME="${TARGET_BUILD_DIR}/${FULL_PRODUCT_NAME}"
echo $PROJECT_NAME
#code sign app
codesign --force --verify --verbose --sign "${CODE_SIGN_IDENTITY_FOR_ITEMS}" "${PROJECT_NAME}" #用于判断是否签名
codesign -v --strict --deep --verbose=2 "${PROJECT_NAME}"

注意:

1. 如果未使用ZipArchive.framework,则不需要特殊处理。

2.如果未使用etcpack和convert,也无需签名处理。

Qt Framework 问题之 framework/Versions/A:bundle format unrecognized, invalid, or unsuitable的更多相关文章

  1. MWPhotoBrowser.bundle: bundle format unrecognized, invalid, or unsuitable

    今天在github下载了MWPhotoBrowser的demo想跑一下,却发现报了MWPhotoBrowser.bundle: bundle format unrecognized, invalid, ...

  2. iOS, Xcode11,项目提示第三方库报错无法运行 bundle format unrecognized, invalid, or unsuitable

    检查你有没有把静态库和动态库配置错误!! 下图处是配置动态库的地方! 对于动态库和静态库都有使用的时候,注意把静态库设置成“Do not Embeded”

  3. Qt的Model/View Framework解析(数据是从真正的“肉(raw)”里取得,Model提供肉,所以读写文件、操作数据库、网络通讯等一系列与数据打交道的工作就在model中做了)

    最近在看Qt的Model/View Framework,在网上搜了搜,好像中文的除了几篇翻译没有什么有价值的文章.E文的除了Qt的官方介绍,其它文章也很少.看到一个老外在blog中写道Model/Vi ...

  4. iOS 中 .a 和 .framework 静态库的创建与 .bundle 资源包的使用

    iOS 中 .a 和 .framework 静态库的创建与 .bundle 资源包的使用 前言 开发中经常使用三方库去实现某特定功能,而这些三方库通常又分为开源库和闭源库.开源库可以直接拿到源码,和自 ...

  5. 【Robot Framework】robot framework 学习以及selenium、appnium、requests实践(一)

    话说之前自己写了个selenium的自动化框架,然后又研究了下RF,觉得RF这种基于关键字驱动的框架更为容易上手,当然在做一些比较繁琐的验证时,似乎还不是太灵活,不如自己写几行python来的实惠(也 ...

  6. [Entity Framework] MySQL @ Entity Framework 6

    原文 [Entity Framework] MySQL @ Entity Framework 6 要让MySQL能够用EF6,我花了一点时间,在此记录一下 安装元件 在设定档加入Provider 安装 ...

  7. 【转】iPhone通讯录AddressBook.framework和AddressBookUI.framework的应用

    通讯录中联系人相关的应用iPhone提供了两个框架:AddressBook.framework和AddressBookUI.framework,使用这两个框架我们可以在程序中访问并显示iPhone数据 ...

  8. ios Standard Framework和Umbrella Framework

    Standard Framework:标准库,通过引用对应的header文件而不是引用master header 文件来引用类(也可以通过引用Master Header file来引用需要使用的类), ...

  9. 解决Activator X for bundle Y is invalid 以及 Activator not found

    如果没有发现编译期异常(就是导航栏项目上有红叉,红感叹号),那么Activator X for bundle Y is invalid和Activator not found这两个异常通常发生在ecl ...

随机推荐

  1. Swoole 实现在线聊天

    Swoole 跟 thinkphp5 结合开发 WebSocket 在线聊天通讯系统 ThinkPHP 使用 Swoole 需要安装 think-swoole Composer 包,前提系统已经安装 ...

  2. 张高兴的 .NET Core IoT 入门指南:(五)PWM 信号输出

    什么是 PWM 在解释 PWM 之前首先来了解一下电路中信号的概念,其中包括模拟信号和数字信号.模拟信号是一种连续的信号,与连续函数类似,在图形上表现为一条不间断的连续曲线.数字信号为只能取有限个数值 ...

  3. 详解Java8 Optional类{最全}

    1:Optional 1.1 概述 Optional 类主要解决的问题是臭名昭著的空指针异常(NullPointerException),提供了一些的方法代替过去的if-else处理逻辑,并与Stre ...

  4. 面试又被 Java 基础难住了?推荐你看看这篇文章。

    本文已经收录自 JavaGuide (59k+ Star):[Java学习+面试指南] 一份涵盖大部分Java程序员所需要掌握的核心知识. 1. 面向对象和面向过程的区别 面向过程 :面向过程性能比面 ...

  5. Apache 4.x HttpClient

    public static Map callRequest(String requestUrl, Method method, Map<String, String> data) thro ...

  6. 小白学 Python(12):基础数据结构(字典)(上)

    人生苦短,我选Python 前文传送门 小白学 Python(1):开篇 小白学 Python(2):基础数据类型(上) 小白学 Python(3):基础数据类型(下) 小白学 Python(4):变 ...

  7. LeetCode刷题笔记(1)常用知识点

    1.Integer.parseInt(String s, int radix)方法的作用是:将radix进制的字符串s转化成10进制的int型数字并返回. Integer.valueof(String ...

  8. K8s 还是 k3s?This is a question

    本文来自:Rancher Labs 自k3s问世以来,社区里有许多小伙伴都问过这样的问题"除了中间的数字之外,k3s和K8s的区别在哪里?","在两者之间应该如何选择?& ...

  9. 百度ERNIE 2.0强势发布!16项中英文任务表现超越BERT和XLNet

    2019年3月,百度正式发布NLP模型ERNIE,其在中文任务中全面超越BERT一度引发业界广泛关注和探讨. 今天,经过短短几个月时间,百度ERNIE再升级.发布持续学习的语义理解框架ERNIE 2. ...

  10. 阿里六面,挂在hrg,我真的不甘心!

    前言最近跟一位朋友聊天,福报场-阿里是大部分程序员的梦想.这位老哥梦想进入阿里很久了,连续两年面试阿里不同bu,有几次是技术面挂,最冤的一次是技术6面了,连P10大老板都面了,但是挂在了hrg. 我以 ...