MacOS命令行打包+签名+公证+生成dmg文件
关于dmg文件是什么,和为什么要进行公证?
简单说下,dmg文件就是一个可直接在mac上安装的安装包,我自己的理解是就像windows上的exe安装包一样;
公证是将app传到苹果商店去做认证,如果不认证的话,安装的时候会提示该软件是不可信任软件。https://developer.apple.com/cn/news/?id=09032019a
官网描述如下:
1.打包
我们先定义几个要用到的变量,如下:
project_name=LBCast #你的工程名,即后缀为xcodeproj的那个文件的名字
app_name=LBCast #你的app的名字,即对应的scheme
ios_type=Release #包类型,是Debug包还是Release包
你的目录结构如下,至少要有这两个文件夹:
LBCast
LBCast.xcodeproj
命令如下:
xcodebuild clean -project ${project_name}.xcodeproj -scheme ${app_name} -configuration $ios_type #clean 清理
xcodebuild build -project ${project_name}.xcodeproj -scheme ${app_name} -configuration $ios_type #build构建打包
操作结束后,会得到一个${app_name}.app,即LBCast.app
2.签名
(1)这里是解锁钥匙串,否则会出现报错“errSecInternalComponent”,详情参考文末“报错1”
security unlock-keychain -p "1234567890" ~/Library/Keychains/login.keychain
(2)获取证书文件,只需要带“Developer ID Application”这一条即可
security find-identity -v > info_file #这里会检索出已有的所有的证书文件
cert_file=`cat info_file |grep "Developer ID Application" |awk -F "\"" '{print $2}'` #检索出需要的证书,只要后面的证书名即可(也可以使用证书签名的hash字符串)
echo cert_file=$cert_file
(3)用证书文件签名上面打包生成的app,即LBCast.app
codesign -f -s "$cert_file" -v LBCast.app --deep
(安装使用过程中app出现崩溃问题的现象,参考另一篇博客:https://www.cnblogs.com/zndxall/p/12964641.html)
(4)检查签名是否成功
spctl --verbose=4 --assess --type execute LBCast.app
如果出现“accepted”,说明签名成功,参考如下:
3.公证
这里需要几个参数,如下:
p_bundle_id=“www.letest.com” #这是app的bundle id, 开发有,或者开发在代码里写了,问开发要即可
u_name="test@163.com" #这是开发者登陆账号
u_passwd="ldlv-aoos-asza-qawe" #注意,这不是开发者的登陆密码,是需要重新生成的,详情看文末“公证密码”
asc_provider="7R34852FKA" #通过命令获取providershortname : xcrun altool --list-providers -u "my apple id" -p "app password"
关于这几个参数的描述,如下:
(1)将app生成zip或者pkg格式的文件,因为.app格式是不支持上传公证的,我下面用的是生成zip的格式,pkg格式的,请自行百度下吧
ditto -c -k --keepParent LBCast.app signed_LBCast.zip
(2)上传zip进行公证,大概需要一两分钟(斜杠是用来分行的,更加好看点~)
xcrun altool --notarize-app \
--primary-bundle-id "$p_bundle_id" \
--username "$u_name" \
--password "$u_passwd" \
--asc-provider "$asc_provider" \
--file signed_LBCast.zip > info_file
成功的话,会返回一个RequestUUID,如下:
No errors uploading 'LBCast.zip'.
RequestUUID = xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
(3)用上面生成的uuid去查询公证状态,公证过程要一两分钟,所有我等待了120s后才查询
n_uuid=`cat info_notarize |grep -rn "RequestUUID" |awk -F " = " '{print $2}' `
echo n_uuid=$n_uuid
echo sleep 120s to wait notarize....
sleep 120
xcrun altool --notarization-info "$n_uuid" --username "$u_name" --password "$u_passwd"
成功的话,会返回如下字段:
如果返回了“Status: in progress”,说明还在进行中,你可以将sleep时间设置长一点
(4)公证通过后,给zip添加票据即可,只需要对zip添加票据即可,没必要单独再对app处理
xcrun stapler staple -v signed_LBCast.zip #对app添加票据
rm -rf LBCast.app #删除原始的app
unzip -q signed_LBCast.zip #解压公证过的zip
#xcrun stapler staple -v $dapp_name.app #have no need staple again
spctl -a -v LBCast.app #查看是否公证成功
显示如下表示公证成功了,有Notarized字段
LBCast.app: accepted
source=Notarized Developer ID
标注:这里遇到一个问题,即spctl命令不能将执行结果重定向到文件,比如执行 spctl -a -v LBCast.app > info_file ,控制台有信息输出,但是文件里是空的,啥也没有,
不知道为什么,我本来像通过文件获取Notarized字段,这样就可以证明公证成功了,但是文件空,就没办法处理,如果你在操作时,结果写入文件没问题,可否在评论中分享下~~~
4.生成dmg
需要的文件:
(1)icon.icns 这个是icon生成的,可以让开发生成给你,也可以自己用工具生成,
(2) mg_bg@2x.png 这是背景图,开发给的,说是两倍高清图
(3) appdmg.json 这个是生成dmg的json处理文件,其中需要关注的一点是如何把不需要的隐藏文件拿掉,详情参考文末“生成dmg时隐藏文件的处理”
先看看appdmg.json的内容
{
"title": "LBCast",
"icon-size": 48,
"background": "dmg_bg@2x.png",
"icon": "Icon.icns",
"window": {
"position": { "x": 200, "y": 400 },
"size": { "width": 600, "height": 360 }
},
"contents": [
{ "x": 200, "y": 180, "type": "file", "path": "LBCast.app" },
{ "x": 400, "y": 180, "type": "link", "path": "/Applications" },
{ "x": 500, "y": 500, "type": "position", "path": "/.VolumeIcon.icns" },
{ "x": 500, "y": 500, "type": "position", "path": "/.background" }
]
将上面三个文件和处理过的LBCast.app放在同一个路径下,然后执行appdmg命令生成dmg文件,命令如下:
appdmg appdmg.json LBCast.dmg
公证密码:
参考:https://blog.csdn.net/lovechris00/article/details/102309757
“生成dmg时隐藏文件的处理”:
所以我使用了"type":"position",配合“path”将.VolumeIcon.icns和.background移动到了窗口外面。
{ "x": 500, "y": 500, "type": "position", "path": "/.VolumeIcon.icns" },
{ "x": 500, "y": 500, "type": "position", "path": "/.background" }
报错1:出现报错“errSecInternalComponent”
https://www.cnblogs.com/wjw-blog/p/10683759.html
https://www.cnblogs.com/ficow/p/7861989.html
参考:
关于苹果公证(Apple Notarizition)机制的一些总结: https://blog.csdn.net/ftpleopard/article/details/102721138
https://developer.apple.com/cn/developer-id/
adddmg: https://www.npmjs.com/package/appdmg
https://blog.csdn.net/huilibai/article/details/83659399
https://www.jianshu.com/p/dbdafa1f21cf
github: https://github.com/shengpeng3344/Apple-Mac-Notarized-script/blob/master/Apple-Mac-Notarized-script.sh
MacOS命令行打包+签名+公证+生成dmg文件的更多相关文章
- android 7.0 多渠道打包 - 美团开源工具Walle 命令行打包
在Android 7.0(Nougat)推出了新的应用签名方案APK Signature Scheme v2后,之前快速生成渠道包的方式(美团Android自动化之旅-生成渠道包)已经行不通了,对此美 ...
- 用命令行编译java并生成可执行的jar包
用命令行编译java并生成可执行的jar包 1.编写源代码. 编写源文件:CardLayoutDemo.java并保存,例如:I:\myApp\CardLayoutDemo.java.程序结构如下: ...
- mac下使用命令行打包出现bash gradle command not found的解决方案
命令行打包的时候出现 bash gradle command not found这个问题,主要是因为gradle环境丢失.需要重新配置gradle的环境变量. 1. gradle路径的查找 然后gra ...
- macos 命令行安装 ipa
macos 命令行安装 ipa 苹果发神经后itunes已经无法在安装app了,如果有知道的兄弟可以告诉我啊 ideviceinstaller 使用这个开源项目可以在macos下安装app brew ...
- Jmeter在非GUI(命令行)模式下生成测试报告
根据各大招聘网站上的需求来看,熟悉Jmeter做性能测试已经几乎成为必要条件了. 那么今天在这个给大家安利一波,怎么使用Jmeter在非GUI(命令行)模式下生成测试报告呢?? 条件准备: 1.Jme ...
- 2019-5-21-C#-命令行如何静默调用-del-删除文件
title author date CreateTime categories C# 命令行如何静默调用 del 删除文件 lindexi 2019-05-21 11:32:28 +0800 2019 ...
- 命令行创建Android应用,命令行生成签名文件,命令行查看签名信息,对APK包签名并编译运行
一.命令行创建Android应用 android create project -n HelloWorld -t android-22 -p HelloWorld1 -k org.crazyit.he ...
- Android 命令行打包和签名
使用命令行方式进行签名需要JDK中的两个命令行工具:keytool.exe和jarsigner.exe.可按如下两步对apk文件进行签名: 1. # keytool -genkey -v -keyst ...
- [原] Android自动打包之命令行打包
Android自动打包流程详细图: 总结为以下几个步骤: 1. 生成R文件 2. Java代码编译成class文件 3. class文件生成dex文件 4. 打包资源 5. 生成apk 6. 创建密匙 ...
随机推荐
- 如何下载Twitter视频?最简单的保存推特视频的方法
Twitter上面的短视频越来越流行了,但是推特官方并没有提供下载通道.如果你想下载这些小视频到电脑或者手机(安卓/iPhone),该如何操作呢?下面介绍一种最简单的方法. 下载Twitter视频我们 ...
- react生命周期函数的应用-----1性能优化 2发ajax请求
知识点1:每次render其实就会将jax的模板生成一个虚拟dom,跟上一个虚拟dom进行比对,通过diff算法找出不同,再更新到真实dom上去. 1性能优化 每次父组件render一次(除了第一次初 ...
- 学java可以做些什么
学java可以做些什么 对于很多新手来说,刚开始接触Java会很迷惘,不知道Java可以做什么.其实Java 可以做的东西太多了,手机游戏.中间件.软件.网站,电脑游戏,以及现在流行的安卓手机app等 ...
- table+分页+模糊查询
这个分页超级棒嘞. 网页链接:http://www.cssmoban.com/cssthemes/7528.shtml
- 转载-C语言中<<、>>、&、|的实际用途
C语言中<<.>>.&.|的实际用途 作为一个开发人员,在看别人项目或者看第三方库的源代码时,可能经常会看到譬如a>>4&0x0f这样的写法,对于一 ...
- 【游戏开发】网络编程之浅谈TCP粘包、拆包问题及其解决方案
引子 现如今手游开发中网络编程是必不可少的重要一环,如果使用的是TCP协议的话,那么不可避免的就会遇见TCP粘包和拆包的问题,马三觉得haifeiWu博主的 TCP 粘包问题浅析及其解决方案 这篇博客 ...
- GitLab CI/CD持续集成设置
GitLab CI/CD持续设置 官方文档地址(https://docs.gitlab.com/ee/ci/README.html) GitLab CI.CD功能非常完善,只需要简单几步,就可以完成项 ...
- go语言的错误处理
1.系统自己抛异常 //go语言抛异常 func test3_1() { l := [5] int {0,1,2,3,4} var index int = 6 fmt.Println(l) l[ind ...
- (四十六)c#Winform自定义控件-水波进度条-HZHControls
官网 http://www.hzhcontrols.com 前提 入行已经7,8年了,一直想做一套漂亮点的自定义控件,于是就有了本系列文章. GitHub:https://github.com/kww ...
- Scrapy框架-中间件
一.中间件中主要有3个函数方法 process_request:处理请求,默认返回值是None process_response:处理响应,默认返回值是response对象 process_exce ...