您现在的位置是:网站首页> C/C++

qt开发的APP发布到appstore

  • C/C++
  • 2024-08-26
  • 984人已阅读
摘要

文章


客户要求app上线appstore,因为没用做过,一脸懵逼,不知从何下手,技术群问问技术大佬,也都是三言两语,虽然有人做过,但是人家大佬根本不想鸟你,没办法了只能自己慢慢莫搜了。
 

写这篇博客就是为了以后有相关需求的人避免走弯路或者踩坑了,我从头到尾踩了一次,我把整个流程大概讲一遍,有坑的地方我会提出来。一开始因为不懂,拿到账号后,总是乱玩一通、各种创建删除、弄个xcode的app测试发布一下,结果悲剧了,有些东西会删除不掉的,比如那个appid我测试的数据都删除不了,因为被使用过,感觉是bug,具体也不去纠结了,还有就是在app store connect创建app的时候,使用过的app名字后面就没有办法在使用了,我就是测试的时候使用真实的app名字,导致后面我真的要发布的时候用不了这个名字,就算把测试的app删除了 ,还是用不了太坑了,被迫改了app名字。后面在签名的时候各种问题,感觉就是我测试的时候各种创建删除导致的信息错乱,最后把所有东西都删除了,只剩下测试的appid删除不了,全部都重新创建一套,包括:证书、appid、描述文件、app等一一对应的创建一套。总结就是,没事别瞎玩,完整的创建一套要使用的数据,没必要去测试发布demo。讲的有点多,下面进入主题。

第一步:你已经有了一个qt开发好的macos app,可以正常发给客户或者其他电脑上安装使用的app,一般是dmg或者pkg包。
 

第二步:注册一个苹果开发者账号,这个具体流程可以网上找一找,有个人、公司、企业三种账号,我注册的是公司的苹果开发者账号,也是第一次弄,前前后后差不多一个月的时间,终于注册申请好了苹果开发者账号。

第三步:登入开发者中心(https://developer.apple.com/),

主要操作都在我框出来的二级页面里面进行操作,主要有四个东西:

1、Certificates(证书)(开发证书、发布证书、安装证书(这个好像是macos app才需要的,ios app 不需要安装证书))、根据app类型进行添加证书,我创建Mac App Distribution、Mac Installer Distribution、Mac Development三个证书,其实qt开发的app根本就不需要用到开发证书,是给xcode开发的时候使用的,因为使用其他证书签名的程序在本地是运行不了,创建证书是为了后面的app签名用的,创建好下载安装到macos系统,双击下载文件就可以安装了,安装后打开系统工具钥匙串就可以看见安装的开发者证书了(具体这么创建证书可以百度下,我就不过于详细的描述了,比较签到)。

2、Identifiers(APPID),这个要注意下,一个appid可以对应创建一个app,后面在app store connect里面创建app的时候需要用到,一个app对于创建一个appid,这个id将会绑定描述文件个app,后面app的info.plist里面还要设置这个对于的appid,key叫做CFBundleIdentifier。

3、Profiles(描述文件),有开发和发布两种,qt app一般只需要创建发布的描述文件即可,创建的时候要选择上面创建的appid,进行绑定。

4. 进入app store connect创建app,最后app信息设置、提交审核、发布等都是在这边操作的,创建app的时候要选择appid 进行绑定,一个appid自能创建一个app,,先创建好,能填写的信息先填写好,剩下的就是,签名app,打包上传到app store connect对应的app上面,因为app上面绑定了appid,上传的时候会自己上传到对应的app的构建版本下面,到时候进行选择就好了。

上述准备都是在开发者中心进行设置的,下面回到代码上的处理,首先用qt编译好需要发布的app,拷贝好对应的依赖库和第三方库等(这个涉及到另外一个东西,macos打包app,个人感觉还是比较麻烦的,需要写一个脚本去执行拷贝依赖和修改依赖路径等)。

5、到了本文核心部分了,那就是给app签名,网上搜索到的都是使用xcode对项目进行自动签名的,这个就比较好操作,我也尝试过将qt项目转成xcode项目进行编译,使用自动签名,经过一番努力修改,还真的使用xcode把项目编译成功了,但是需要依赖qt库和其他你用到的第三方库,如果你编译的时候选择自动签名,可以编译成功,但是你的依赖库还没有拷贝过来,app无法运行,等你把依赖库都拷贝到app里面后,这些刚刚拷贝过来的库都是没有签名的,因为xcode签名的时候在编译的时候就完成了,这就导致了程序还是无法运行,折腾一番之后我又发现了另外一个方法,可以手动用命令对app进行签名,比较使用qt开发的还是选择手动签名会比较好管理整个项目,使用xcode应该也是可以实现的,后面那个问题,应该是可以设置xcode,使其在编译的时候就把依赖库都自动拷贝过来进行签名的,后面我也没有再去研究,有兴趣的可以自行研究。

6、回到正题,上述已经准备好了可以运行的qt编译的app,签名的时候还需要一个.entitlements文件,这个类似info.plist,也是配置app权限信息的,使用xcode创建一个macos项目就会生成一个.entitlements文件,根据自己app的需求进行设置,然后把这个.entitlements文件直接拷贝出来使用。

7、对info.plist添加必要的信息,之前因为信息不全审核的时候被打回来好几次,

CFBundleName :app的名字,需要跟app store connect上面创建的app名字一致

CFBundleVersion:大版本号(1)

CFBundleShortVersionString:完整版本号(1.0.1)

CFBundleIdentifier:appid(在开发者中心创建的那个appid,不能写错了)

LSApplicationCategoryType:app类,要选择一个app分类

ITSAppUsesNonExemptEncryption:这个好像时什么加密协议 写NO或者FALSE

可以用xcode打开info.plist文件可视化添加key比较直观

8、下面就是使用命令对app进行签名:(所有的库都需要签名,资源文件不需要)

注意:还有一个地方需要注意的,就是在app目录下面的的MacOS目录下面不要放其他的文件,我之前把语言包放在这个目录下面了,后面在上传app的时候一直报错,其他文件都放到资源文件夹里面

命令:codesign --entitlements ${entitlementPath} -v -f -s "${cert}" ${frameworkpath}*

${entitlementPath}  就是xcode拷贝过来的文件路径

${cert}  发布证书名字

${frameworkpath} 被签名的库路径

-v 输出详细信息

-f 覆盖签名,这个一定要加,因为后面你发布的时候经常会不会重新拷贝依赖库,不加就签名不上了,如果证书或者其他信息发生变化时就会存在不同的签名主体,我就是出现过这个问题,因为后面证书删除了重新创建,所以出问题了

-s 发布证书名字

因为依赖库很多,手动敲命令一个一个去签名就比较繁琐了,我写了一个脚本会把所有的库进行签名,然后把app打包成pkg,pkg就是上传app store connect的最终形式。

脚本如下:

#! /bin/bash# app 绝对路径apppath="/Users/michaellyn/Desktop/demo"#依赖库路径frameworkpath="${apppath}/demo.app/Contents/Frameworks/"#Qt插件路径pluginpath="${apppath}/demo.app/Contents/PlugIns/"#发布证书名字cert="3rd Party Mac Developer Application: xxxx. (xxx)"#安装证书名字certInstall="3rd Party Mac Developer Installer: xxxx. (xxx)"#沙盒权限配置文件entitlementPath="${apppath}/demo.entitlements"#给程序签名codesign --entitlements ${entitlementPath} -v -f -s "${cert}" ${frameworkpath}*codesign --entitlements ${entitlementPath} -v -f -s "${cert}" ${pluginpath}bearer/*codesign --entitlements ${entitlementPath} -v -f -s "${cert}" ${pluginpath}audio/*codesign --entitlements ${entitlementPath} -v -f -s "${cert}" ${pluginpath}imageformats/*codesign --entitlements ${entitlementPath} -v -f -s "${cert}" ${pluginpath}mediaservice/*codesign --entitlements ${entitlementPath} -v -f -s "${cert}" ${pluginpath}platforms/*codesign --entitlements ${entitlementPath} -v -f -s "${cert}" ${pluginpath}printsupport/*codesign --entitlements ${entitlementPath} -v -f -s "${cert}" ${pluginpath}iconengines/*codesign --deep --entitlements ${entitlementPath} -v -f -s "${cert}" ${apppath}/demo.app#打包pkg并签名安装包productbuild --component ${apppath}/demo.app /demo --sign "${certInstall}" demo.pkg#检查安装包以及测试安装sudo installer -store -pkg demo.pkg -target /

执行上述脚本就可以完成对app的签名打包了,注意修改路径和app名字。

9、上传pkg到app store connect,首先在app store里面下载上传工具:Transporter.

然后使用这个工具上传pkg,上传成功就可以到app store connect对应app的构建版本里面选择刚刚上传的pkg,在编辑完善其他信息就可以提交审核了。

 

审核通过:

发布成功:

Top