MacOS命令行打包+签名+公证+生成dmg文件

摘要:
dmg文件是什么?为什么要进行公证?简而言之,dmg文件是一个可以直接安装在mac上的安装包。我自己的理解就像windows上的exe安装包;公证是将应用程序发送到苹果商店进行认证。如果未经验证,则在安装时会提示该软件不受信任。

关于dmg文件是什么,和为什么要进行公证?

简单说下,dmg文件就是一个可直接在mac上安装的安装包,我自己的理解是就像windows上的exe安装包一样;

公证是将app传到苹果商店去做认证,如果不认证的话,安装的时候会提示该软件是不可信任软件。https://developer.apple.com/cn/news/?id=09032019a

官网描述如下:

MacOS命令行打包+签名+公证+生成dmg文件第1张

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”,说明签名成功,参考如下:

             MacOS命令行打包+签名+公证+生成dmg文件第2张

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"

             关于这几个参数的描述,如下:

MacOS命令行打包+签名+公证+生成dmg文件第3张

(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"

             成功的话,会返回如下字段:

                   MacOS命令行打包+签名+公证+生成dmg文件第4张

              如果返回了“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

公证密码:

MacOS命令行打包+签名+公证+生成dmg文件第5张

 参考:https://blog.csdn.net/lovechris00/article/details/102309757

“生成dmg时隐藏文件的处理”:

MacOS命令行打包+签名+公证+生成dmg文件第6张

 所以我使用了"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文件》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇(转)用Eclipse编译你的ROS程序android根据图片路径显示图片下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

前端—HTML

前端 1.什么是前端? 任何直接能够跟用户打交道的交互界面都可以称之为前端 2.为什么要学前端? 因为我们是Python全栈开发 Web服务本质 importsocket sk =socket.socket() sk.bind(("127.0.0.1", 8080)) sk.listen(5) whileTrue: con...

Android Studio最新配置教程2016

http://blog.csdn.net/wen_demo 一、Android studio 基本简单介绍 1.Android studio和Eclipse的差别: 1、Studio中有Project和Module的概念,Studio中一个窗体仅仅能有一个项目,即Project,代表一个workspace。可是一个Project能够包括多个Modul...

Android进入一个新页面,EditText失去焦点并禁止弹出键盘

android在进入一个新页面后,edittext会自动获取焦点并弹出软键盘,这样并不符合用户操作习惯。 在其父控件下,添加如下的属性,就可以完美解决,使其进入页面后不主动获取焦点,并且不弹出软键盘: android:focusable="true"   android:focusableInTouchMode="true" 代码如下: 1 <S...

【小慕读书】—— 后台管理系统学习:后端框架搭建

前言:最近在学习Vue+Element UI+Node.js小慕读书中后台管理系统开发课程,这里对学习过程作个笔记,方便自己和大家翻阅。 一、Node 简介 Node 是一个基于 V8 引擎的 Javascript 运行环境,它使得 Javascript 可以运行在服务端,直接与操作系统进行交互,与文件控制、网络交互、进程控制等 与Chrome的区别:...

mac怎么快速回到桌面 隐藏所有窗口

当你同时按下Option+Command+h键,就能把所有已打开的程序窗口(不包括当前正在运行的应用程序窗口)最小化到Dock栏上。注意不是关闭哦,是最小化哦。如果需要把程序窗口恢复到屏幕上,直接点击相应的应用程序图标就可以了。如果你同时按下Option+Command键并点击桌面上空白的区域,就能把除Finder窗口以外的所有窗口隐藏起来,直接显示桌面。...

WIN10 使用POWERSHELL 设置单应用KIOSK模式(win10家庭版或企业版)

win10 使用PowerShell 设置单应用kiosk模式 win10 家版或企业版PowerShellshell 启动器 v1Autologon.exe 注意事项 win10 家庭版或企业版。 下载安装Autologon.exe。 Shell 启动器 v1调用的应用程序不可有黑窗(类似cmd)。 以下示例采用账号:- 账户:'KIOSK'- 密码:'...