关于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. My Home Page

    Recently I use github student pack to build my personal home page.

  2. 控制台提示“Invalid string length”的原因

    控制台提示“Invalid string length”,浏览器直接卡掉,是为什么呢? 答:因为在写嵌套循环时,定义的变量重名了,内层和外层用了同一个i变量. -THE END-

  3. [转载]——Automatic Tuning of Undo_retention Causes Space Problems (文档 ID 420525.1)

    Automatic Tuning of Undo_retention Causes Space Problems (文档 ID 420525.1) 转到底部 In this Document   Sy ...

  4. Mysql安装、配置、优化

    MYSQL定义 MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,属于 Oracle旗下产品.MySQL 是最流行的关系型数据库管理系统之一,在 WEB 应用方面,MySQL是最 ...

  5. [PHP] 编译安装swoole

    不知道为啥,家里的网访问不了pecl.php.net,这也就没有办法直接使用pecl install swoole安装swoole,也可以直接进行编译安装 在git仓库下载源码 https://git ...

  6. 如何解决Sublime text3文件名称中文乱码问题

    在sublime text 3中,Preference, Settings-User,最后加上一行 "dpi_scale": 1.0 { "auto_complete_t ...

  7. volatile可见性案例-黑马

    volatile可见性案例-黑马 package com.mozq.demo.demo; class Task implements Runnable{ //public boolean flag = ...

  8. C语言程序设计100例之(15):除法算式

    例15   除法算式 问题描述 输入正整数n(2≤n≤68),按从小到大输出所有形如abcde/fghi=n的表达式.其中a~i为1~9的一个排列. 输入格式 每行为一个正整数n (n <= 1 ...

  9. 一篇文章看懂angularjs component组件

     壹 ❀ 引 我在 angularjs 一篇文章看懂自定义指令directive 一文中详细介绍了directive基本用法与完整属性介绍.directive是个很神奇的存在,你可以不设置templa ...

  10. PAT 1012 The Best Rank 排序

    To evaluate the performance of our first year CS majored students, we consider their grades of three ...