基于Qt开发的应用程序进驻Mac App Store

最近摸索着将一个基于用Qt开发的App发布Mac App Store,在网上查找相关资料的时候,发现很多文档都过期了,要有一些修改,所以想记录下来,希望能帮助有需要的同学,让他们少走一些弯路。

这里我们假设你已经有一个Mac开发者账号,成功安装好了相关证书,并且已经准备好你的App了(release版,但未部署)。

第一步:打包

在Mac下,对基于Qt应用程序的部署,官方文档这里已经讲解很详细了

我用的是framework的方式,大致意思就是要把所依赖的库和插件拷贝到App的Bundle里,然后修改程序的依赖链接,让其启动时加载的是Bundle里的库和插件。

Qt自带的macdepolyqt工具能够很方便的帮助你实现这一目的。

虽然很多人觉得这个工具并不完美,会把一些实际上用不到的插件和库也会拷贝进去

这是因为它本身的判断方式,比如你的程序用到了QtSql.framework, 那么它就会把所有的sqldrivers目录中的插件都拷贝过来,而不管你的程序有没有用到,这让你的程序变得臃肿)

但是对于初学者,我相信你更喜欢用这种方式,因为它相当简单

假如你是一个完美主义者,对自己的App有着严格的要求,那么建议你自己写Shell Script去把程序用到的Framework和Plugins都拷贝进去,然后修改依赖链接。

Xcode自带指令帮你查看程序依赖哪些库,库又依赖了哪些库,插件依赖了哪些库,如果想要知道程序是如何加载插件的,可以查阅这里,当然也有指令修改这些依赖。这些都可以在上面提供的链接里找到。

第二部:sandbox 和 info.plsit文件

Windows程序员可能不知道什么是sandbox。赶紧恶补一下,可以去google一下或者看下Apple的官方文档

你要有一个.entitlements的文件(为第三步做准备),里面就是你需要的sandbox权限(其实就是个xml格式的文件,记录着一些键值对,你可以用Xcode新建一个项目,然后勾选需要的sandbox权限,生成的.entitlements文件就可以拿过来用了)。

如果没有勾选相关的权限,在签名之后是无法正常使用相关功能的。

这里说的info.plist文件是整个程序的,在App所在目录/Contents下和后面说的info.plist文件不是同一个(但作用都是一样的)。

Qt默认生成的info.plist 文件是不符合上Mac App Store要求的,需要额外加一些键值对,比如能运行的最低系统版本信息等等。详情可以参看Apple的文档

第三部:签证书

在完成上一步后,所有用到的库和插件都已经拷贝到程序所在的Bundle里面了

可以按照这里的说明进行Code Signing,但是这里需要注意的是,

在签证书之前必须手动的把每个Framework下面的info.plist文件考到相应的目录下

QtCore.framework为例,你需要将Qt安装目录/5.2.0/clang_64/lib/QtCore.framework/Contents/info.plist拷贝到App所在目录/Contents/Frameworks/QtCore.framework/Resources/, 否则在给Framework签证书的时候会失败,当然会导致最后给整个Bundle签证书的时候失败。签证书的顺序应该是先签里面的Framework 和Plugins,最后签整个Bundle。

签成功之后,除了Plugins,每个Framework的子目录内和Contents目录下都会有一个_CodeSignature的文件夹。

http://www.sollyu.com/mac-qt-program-released/

Mac中QT程序发布的更多相关文章

  1. Linux环境中Qt程序的手工发布

    Linux环境中Qt程序的手工发布

  2. qt 程序发布

    Qt 程序发布步骤: 注意5.5 以后不再支持 WinXP 1) dll 抽取工具 windeployqt.exe 2) Windows脚本 实例: D:\Qt\Qt5.5.0\5.5\mingw49 ...

  3. Qt 程序发布以及打包成exe安装包

    一.简述 Qt 项目开发完成之后,需要打包发布程序,而因为用户电脑上没有 Qt 配置环境,所以需要将 release 生成的 exe 文件和所依赖的 dll 文件复制到一个文件夹中,然后再用 Inno ...

  4. 基于vs2005以上版本Qt程序发布的注意事项(讲了manifest的问题)

    最近发现了一个非常恼人的程序deployment的问题,估计大家有可能也会遇到,特此memo. 问题的出现我觉得主要还是微软搞的花头太多, 一个不知所谓的manifest文件让本来简单的程序发布变得困 ...

  5. 解决Qt程序发布时中文乱码问题(通过QApplication.addLibraryPath加载QTextCodec插件)

    Qt程序的文字编码,是通过插件来解决的,所以我们发布的时候需要把相应的插件也发布出去,在开发者电脑上程序会自动从插件目录加载到插件,但是如果发布给别的电脑使用,需要手动指定插件路径,如下所示: int ...

  6. QT程序发布

    1.新建一个脚本文件,后缀为.bat 2.查看自己qt的windeployqt.exe路径,一般在QT安装的bin目录,而且脚本程序中需要去掉其后缀, 前面部分是windeployqt.exe的路径以 ...

  7. VS编译的QT程序发布时产生的AppCrash问题

    至少我碰到了三个情况,都是AppCrash错误(以下都指VS2008的Release的设置) 第1个错误,报错模块是程序自己 我使用VS2008 Team with SP1和QT4.86编译程序,一直 ...

  8. qt 程序发布打包

    1. 首先把 release 版本的 exe 复制到其他文件夹,比如 Desktop\test 2. 使用开始菜单中 qt 里面的控制台窗口,使用 cd 命令打开到 Desktop\test 位置,然 ...

  9. Windows 下QT程序发布

    方法1:利用QT自带打包工具 1.新建文件夹,把编译好的exe文件放入该文件夹 2.使用QT下的命令行 3.进入该exe所在文件,执行windeployqt xxx.exe,若出现找不到命令的情况 4 ...

随机推荐

  1. Jquery构建Form表单Post提交数据的简单方法

    $.extend({ PostSubmitForm: function (url, args) { var body = $(document.body), form = $("<fo ...

  2. STL之stack(栈)

    栈(statck)这种数据结构在计算机中是相当出名的.栈中的数据是先进后出的(First In Last Out, FILO).栈只有一个出口,允许新增元素(只能在栈顶上增加).移出元素(只能移出栈顶 ...

  3. ThinkPHP第九天(在Admin分组中配置__PUBLIC__,$POST异步传输,import使用方法,验证码点击刷新方法,Create方法作用)

    1.项目分组之后,后台模板的公用文件一般放置在Tpl/Admin/Public中,这样子在替换模板路径时候如果还用__PUBLIC__时为了不与前台冲突,应该在Admin/config.php中配置一 ...

  4. 让正则表达式变简单(PythonVerbalExpressions)

    一.安装pip install VerbalExpressions二.导入from verbalexpressions import VerEx三.示例 使用案例一: 测试URL是否有效 from v ...

  5. day1作业脚本

    1.编写登录接口: - 输入用户名和密码 - 认证成功后显示欢迎信息 - 输错三次后锁定 2.编写多级菜单 - 三级菜单 - 可依次进入子菜单 第一次写python脚本,因为没有学到函数,所以写的有点 ...

  6. Python学习之路——模块

    一.模块: 模块,用一砣代码实现了某个功能的代码集合. 类似于函数式编程和面向过程编程,函数式编程则完成一个功能,其他代码用来调用即可,提供了代码的重用性和代码间的耦合.而对于一个复杂的功能来,可能需 ...

  7. C语言之固定格式输出当前时间

    固定格式输出当前时间 编程实现将当前时间用以下形式输出:星期  月  日   小时:分:秒   年 代码如下: #include<stdio.h>#include<stdlib.h& ...

  8. 启动(Startup)

    Startup Chrome是一个单一的可执行程序.它清楚如何运行其它进程. 下面是chrome启动的概述: 1. 首先,chrome有一个平台相关的入口点:在windows上是wWinMain(): ...

  9. fedora audacious 不能播放音乐

    采用命令sudo dnf search audacious 可以看到 audacious-plugins-freeworld-mp3.x86_64 : MP3 playback plugin for ...

  10. 最小生成树Prim算法

    文章作者:甘航  文章来源:http://www.cnblogs.com/ganhang-acm/转载请注明,谢谢合作. 由于数据结构老师布置的一道题 ,我看prim算法看了半天还是一知半解. 在浏览 ...