关于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. leaflet 结合 Echarts4 实现迁徙图(附源码下载)

    前言 leaflet 入门开发系列环境知识点了解: leaflet api文档介绍,详细介绍 leaflet 每个类的函数以及属性等等 leaflet 在线例子 leaflet 插件,leaflet ...

  2. English:2019100401_Suffix"ery"

    Ax_introduction source a Frech mean to "state,quality,act,place where etc" 1)After the ver ...

  3. How do I unmute my Lenovo laptop?

    If the FN key does have a green light just press and hold down the FN button on the bottom left of t ...

  4. 升级python2.7至python3.7

    最近在centos7下执行命令时,出现以下提示: DEPRECATION: Python 2.7 will reach the end of its life on January 1st, 2020 ...

  5. 安装CentOS 6.x报错"Disk sda contains BIOS RAID metadata"解决方法

    今天在安装CentOS 6.2的时候,当进到检测硬盘的时候,总是过不去,报错如下: Disk sda contains BIOS RAID metadata, but is not part of a ...

  6. ResultSet RS_resultxtgg=connDbBean.executeQuery(sqlxtgg);

    <%String sqlxtgg="select * from dx where leibie='系统公告'"; ResultSet RS_resultxtgg=connDb ...

  7. 【oracle】ORA-00947: 没有足够的值

    insert 时 对应NOT NULL 的列 必须有值

  8. 修改项目语言为C#8.0

    错误 CS8370 功能“Using 声明”在 C# 7.3 中不可用.请使用 8.0 或更高的语言版本.  用记事本打开项目文件 XXX.csproj,找到LangVersion,修改为8.0. 如 ...

  9. vue组件化思想和模块化

    组件化 注册组件的基本步骤 创建组件构造器 (调用Vue.extend()方法) 注册组件 (调用Vue.component()方法) 注册组件语法糖 省去了调用Vue.extend()的步骤,而是可 ...

  10. eclipse_neon 的Spket 目录下只有一个Task Tags,没有其他的选项,导致没有办法添加提示文件! 添加sdk文件之后还是没有办法显示的解决办法

    问题解决办法: 将 spket-1.6.23的安装包里面的features  plugins 单独复制到D:\eclipse_neon\dropins 目录下,重启一下eclipse即可正常显示! 添 ...