关于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文件的更多相关文章

  1. android 7.0 多渠道打包 - 美团开源工具Walle 命令行打包

    在Android 7.0(Nougat)推出了新的应用签名方案APK Signature Scheme v2后,之前快速生成渠道包的方式(美团Android自动化之旅-生成渠道包)已经行不通了,对此美 ...

  2. 用命令行编译java并生成可执行的jar包

    用命令行编译java并生成可执行的jar包 1.编写源代码. 编写源文件:CardLayoutDemo.java并保存,例如:I:\myApp\CardLayoutDemo.java.程序结构如下: ...

  3. mac下使用命令行打包出现bash gradle command not found的解决方案

    命令行打包的时候出现 bash gradle command not found这个问题,主要是因为gradle环境丢失.需要重新配置gradle的环境变量. 1. gradle路径的查找 然后gra ...

  4. macos 命令行安装 ipa

    macos 命令行安装 ipa 苹果发神经后itunes已经无法在安装app了,如果有知道的兄弟可以告诉我啊 ideviceinstaller 使用这个开源项目可以在macos下安装app brew ...

  5. Jmeter在非GUI(命令行)模式下生成测试报告

    根据各大招聘网站上的需求来看,熟悉Jmeter做性能测试已经几乎成为必要条件了. 那么今天在这个给大家安利一波,怎么使用Jmeter在非GUI(命令行)模式下生成测试报告呢?? 条件准备: 1.Jme ...

  6. 2019-5-21-C#-命令行如何静默调用-del-删除文件

    title author date CreateTime categories C# 命令行如何静默调用 del 删除文件 lindexi 2019-05-21 11:32:28 +0800 2019 ...

  7. 命令行创建Android应用,命令行生成签名文件,命令行查看签名信息,对APK包签名并编译运行

    一.命令行创建Android应用 android create project -n HelloWorld -t android-22 -p HelloWorld1 -k org.crazyit.he ...

  8. Android 命令行打包和签名

    使用命令行方式进行签名需要JDK中的两个命令行工具:keytool.exe和jarsigner.exe.可按如下两步对apk文件进行签名: 1. # keytool -genkey -v -keyst ...

  9. [原] Android自动打包之命令行打包

    Android自动打包流程详细图: 总结为以下几个步骤: 1. 生成R文件 2. Java代码编译成class文件 3. class文件生成dex文件 4. 打包资源 5. 生成apk 6. 创建密匙 ...

随机推荐

  1. 如何下载Twitter视频?最简单的保存推特视频的方法

    Twitter上面的短视频越来越流行了,但是推特官方并没有提供下载通道.如果你想下载这些小视频到电脑或者手机(安卓/iPhone),该如何操作呢?下面介绍一种最简单的方法. 下载Twitter视频我们 ...

  2. react生命周期函数的应用-----1性能优化 2发ajax请求

    知识点1:每次render其实就会将jax的模板生成一个虚拟dom,跟上一个虚拟dom进行比对,通过diff算法找出不同,再更新到真实dom上去. 1性能优化 每次父组件render一次(除了第一次初 ...

  3. 学java可以做些什么

    学java可以做些什么 对于很多新手来说,刚开始接触Java会很迷惘,不知道Java可以做什么.其实Java 可以做的东西太多了,手机游戏.中间件.软件.网站,电脑游戏,以及现在流行的安卓手机app等 ...

  4. table+分页+模糊查询

    这个分页超级棒嘞. 网页链接:http://www.cssmoban.com/cssthemes/7528.shtml

  5. 转载-C语言中<<、>>、&、|的实际用途

    C语言中<<.>>.&.|的实际用途 作为一个开发人员,在看别人项目或者看第三方库的源代码时,可能经常会看到譬如a>>4&0x0f这样的写法,对于一 ...

  6. 【游戏开发】网络编程之浅谈TCP粘包、拆包问题及其解决方案

    引子 现如今手游开发中网络编程是必不可少的重要一环,如果使用的是TCP协议的话,那么不可避免的就会遇见TCP粘包和拆包的问题,马三觉得haifeiWu博主的 TCP 粘包问题浅析及其解决方案 这篇博客 ...

  7. GitLab CI/CD持续集成设置

    GitLab CI/CD持续设置 官方文档地址(https://docs.gitlab.com/ee/ci/README.html) GitLab CI.CD功能非常完善,只需要简单几步,就可以完成项 ...

  8. go语言的错误处理

    1.系统自己抛异常 //go语言抛异常 func test3_1() { l := [5] int {0,1,2,3,4} var index int = 6 fmt.Println(l) l[ind ...

  9. (四十六)c#Winform自定义控件-水波进度条-HZHControls

    官网 http://www.hzhcontrols.com 前提 入行已经7,8年了,一直想做一套漂亮点的自定义控件,于是就有了本系列文章. GitHub:https://github.com/kww ...

  10. Scrapy框架-中间件

    一.中间件中主要有3个函数方法 process_request:处理请求,默认返回值是None process_response:处理响应,默认返回值是response对象 process_exce ...