An update on OS X Code Signing(OS X代码签名)
There has recently been updates to the OS X code signing process. These updates also affect Qt applications signed for distribution, both on and outside the App Store.
OS X 10.9 Mavericks introduced version 2 signatures. As of OS X 10.9.5 and 10.10 Yosemite, v2 signatures are now required. We’ve recently spent some time updating Qt to be v2 compliant and Qt 5.4 will be the first compliant release. This includes patches to qmake and the macdeployqt deployment utility. Manually correcting the signing errors is possible if you are using an older version of Qt.
The Apple documentation is quite comprehensive on this topic, in particular see Code Signing Guide and TN2206 OS X Code Signing In Depth. The Qt tracking bug for this issue is QTBUG-32896.
Required changes to Qt
The required changes falls in three categories: updating the framework and application bundle structure, updating Info.plist contents, and special Qt Quick imports handling.
Updating the framework and application bundle structure
The Info.plist file must be placed in Versions/5/Resources/Info.plist. Updated symlink structure: “Current” symlink points to the actual version (“4” or “5”). The framework must be “clean” at code signing time, with for example no QtCore.prl at the root. This is currently enforced by macdeployqt. As an example, the QtCore.framework structure should look like this:
QtCore.framework/ QtCore -> Versions/Current/QtCore Resources -> Versions/Current/Resources Versions/ Current -> 5 5/ QtCore Resources/ Info.plist And a typical app bundle:
foo.app/ Contents/ Frameworks/ QtCore.framework/ Info.plist MacOS/ foo PkgInfo/ PlugIns/ Resources/ Update Info.plist contents The Info.plist files as generated by current qmake versions are missing some required keys:
CFBundleIdentifier (“org.qt-project.QtCore”) CFBundleVersion (“5.4.0″) Split Qt Quick imports into code and data in the application bundle
This is a v2 code signing requirement which affects applications with Qt Quick imports that contain both binary code (.dylib) and data (.qml) files.
Previous versions macdeployqt would deploy all files to Resources/, but as of v2 binary code in Resources/ is now prohibited. This is solved deploying .dylib files to PlugIns/ and then placing a symlink in Resources/ pointing to the .dylib.
Code signing flow and checkpoints
The following outlines a typical code signing process, with notes on where a current 4.8/5.3 Qt install may fail. The focus is on using the command line tools. Code signing using Xcode is possible but not covered here. The process is incremental: Some steps can be verified by any developer locally, while others require developer account admin access.
Signing and verifying the app bundle.
sign: codesign --deep foo.app -s MyCertificate or: macdeployqt foo.app -codesign=MyCertificate verify: codesign —verify foo.app The -deep option signs the app bundle recursively, including contained frameworks. While convenient to use, –deep is documented for “emergency repairs and temporary adjustments only“. As of Qt 5.4 macdeployqt has a -codesign option that recursively signs the app bundle without using –deep.
Common errors at this stage include “bundle format unrecognized, invalid, or unsuitable”, and/or “bar.dylib: code object is not signed at all”, which indicates that the framework structure is not correct or that some contained binary was not signed.
At this point which certificate you use does not matter. You can use a self-signed one created in Keychain Access for development and testing purposes.
2a) Distribution outside the App Store Verify that GateKeeper will allow the app:
spctl --assess --type execute foo.app
spctl outputs nothing on success. Common errors include “Rejected”. The bundle must be signed with the correct “Developer ID Application” production certificate for this check to work. The certificate is available for download to the Team Agent in the Mac Dev Center.
2b) App Store distribution May trigger additional errors:
ERROR ITMS-9000 The application bundle contains a tool or framework
foo.app/Contents/Frameworks/QtCore.framework that is missing the
bundle identifier.
This is currently a pending task for Qt 5.4. You can edit the plist files manually and add a bundle identifiers.
Availability
The updates are/will be available for three Qt versions:
5.3 source code (not packaged) 5.4 release. The updates will be be a part of the 5.4 source and binary release. 4.8 patches: https://codereview.qt-project.org/#/c/95572, with the intention that this will be a part of a future 4.8.x release. TODO list
The fixes for some issues are currently in progress:
Adding CFBundleIdentifier for the Qt frameworks Changing the location of .prl files Do you have corrections or additional info? Hit the comments section!
http://www.heilqt.com/topic/5454f72fa8c1c22d30bb1ac5
An update on OS X Code Signing(OS X代码签名)的更多相关文章
- [转载]iOS Provisioning Profile(Certificate)与Code Signing详解
原文:http://blog.csdn.net/phunxm/article/details/42685597 引言 关于开发证书配置(Certificates & Identifiers & ...
- iOS Provisioning Profile(Certificate)与Code Signing详解
引言 关于开发证书配置(Certificates & Identifiers & Provisioning Profiles),相信做 iOS 开发的同学没少被折腾.对于一个 iOS ...
- iPhone OS 开发 - 了解并解决代码签名问题
译者:Jestery 发表时间:2010-04-24浏览量:21082评论数:0挑错数:0 了解并解决代码签名问题 (为保持跟开发环境以及APPLE开发者社区网站结构对应,一些名词未作翻译) 绝大多数 ...
- (译)iOS Code Signing: 解惑
子龙山人 Learning,Sharing,Improving! (译)iOS Code Signing: 解惑 免责申明(必读!):本博客提供的所有教程的翻译原稿均来自于互联网,仅供学习交流之用,切 ...
- 【转】iOS Provisioning Profile(Certificate)与Code Signing详解 -- 待看
原文网址:http://blog.sina.com.cn/s/blog_82c8198f0102vy4j.html 引言 关于开发证书配置(Certificates & Identifiers ...
- 【转】 iOS Provisioning Profile(Certificate)与Code Signing详解
原文:http://blog.csdn.net/phunxm/article/details/42685597 引言 关于开发证书配置(Certificates & Identifiers & ...
- iOS Code Signing: 解惑详解
iPhone开发的代码签名 代码签名确保代码的真实以及明确识别代码的来源.在代码运行在一个开发系统以前,以及在代码提交到Apple发布以前,Apple要求所有的的应用程序都必须进行数字签名.另外,Ap ...
- 微软推荐的Get a code signing certificate流程和链接
Get a code signing certificate Before you can establish a Windows Dev Center hardware dashboard ac ...
- os.path.join合并 os.path.dirname返回上一级目录 os.path.exists(path) os.stat('path/filename')获取文件/目录信息
import os str1 = "grsdgfd" str2 = "wddf" str3 = "gddgs" # print(str1 + ...
随机推荐
- nginx与ios实现https双向认证
服务端配置 nginx关键配置例如以下: listen 443; server_name localhost; ssl on; ssl_certificate /usr/local/opt/nginx ...
- HDU 1976 prime path
题意:给你2个数n m.从n变成m最少须要改变多少次. 当中: 1.n m 都是4位数 2.每次仅仅能改变n的一个位数(个位.十位.百位.千位),且每次改变后后的新数为素数 思路:搜索的变形题,这 ...
- 如何解决Android 5.0中出现的警告:Service Intent must be explicit
有些时候我们使用Service的时需要采用隐私启动的方式,但是Android 5.0一出来后,其中有个特性就是Service Intent must be explitict,也就是说从Lollip ...
- 在unity中用鼠标实现在场景中拖动物体,用鼠标滚轮实现缩放
在场景中添加一个Plan,Camera,Directional Light,Cube.添加两个脚本scrollerScirpt(挂在Camera),CubeDragScript(挂在Cube上). 1 ...
- C# 获得当前应用程序路径
1.获得当前应用程序的路径最稳定的方法:AppDomain.CurrentDomain.BaseDirectory 生成的路径:../项目名称/bin/Debug下的路径
- 使用Notepad++快速有效删除复制代码中的行号
转载:http://plum.0602.blog.163.com/blog/static/1130006502011101524120757/ 试了该方法,很好用! 为什么我把用Notepad++删除 ...
- foundation 框架 NSString常用总结(二)
以此作为NSString常用总结(一)的补充 NSString* str = [NSString stringWithFormat:@"I love programing! You, com ...
- RUP(Rational Unified Process)笔记整理
RUP,统一软件开发过程是一种面向对象且基于网络的程序开发方法论. RUP的思路:Implementing BestPractices ·迭代式开发 在软件开发的早期阶段就想完全.准确的捕获用户的需求 ...
- 磁盘性能,你可能不知道的IOPS计算方法
每个I/O 请求到磁盘都需要若干时间.主要是因为磁盘的盘边必须旋转,机头必须寻道.磁盘的旋转常常被称为”rotational delay”(RD),机头的移动称为”disk seek”(DS).一个I ...
- nodejs入门demo
demo的实例引用自:http://www.runoob.com/nodejs/nodejs-event.html, 官方文档:https://nodejs.org/dist/latest-v6.x/ ...