关于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字段

  1. LBCast.app: accepted
  2. 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. python科学计算和数据分析常用库

    NumPy NumPy最强大的是n维数组,该库还包含基本的线性代数函数.傅立叶变换.随机函数和其他底层语言(如Fortran.C和C++)集成的工具. SciPy SciPy建立在NumPy基础上,它 ...

  2. 如何下载B站哔哩哔哩(bilibili)弹幕网站上的视频呢?小白教你个简单方法

    对于90后.00后来说,B站肯定听过吧.小编有一个苦恼的地方,有时候想把哔哩哔哩(bilibili)上看到的视频保存到手机相册,不知道咋操作啊.网上百度了下,都是要下载电脑软件的,有些还得要付费的.前 ...

  3. 如何在Mac上使用Netstat命令

    macOS上的netstat命令是一个终端命令,用于显示有关Mac网络通信的详细信息.网络通信包括Mac通过所有端口和所有应用程序与外界进行交流的所有方式.掌握netstat可以帮助您了解计算机之间的 ...

  4. docker-19.03安装部署,阿里源加速

    docker所依赖的包环境,为了方便不报错,推荐执行 [root@liujunjun ~]# yum install -y yum-utils device-mapper-persistent-dat ...

  5. numpy函数查询手册

    写了个程序,对Numpy的绝大部分函数及其说明进行了中文翻译. 原网址:https://docs.scipy.org/doc/numpy/reference/routines.html#routine ...

  6. java之数据结构

    数据结构有什么用? 现实世界的存储,我们使用的工具和建模.每种数据结构有自己的优点和缺点,想想如果Google的数据用的是数组的存储,我们还能方便地查询到所需要的数据吗?而算法,在这么多的数据中如何做 ...

  7. 【Java】导入项目时,出现The project cannot be built until build path errors are resolved错误解决方法

    先检查jar包,jar包的地址如果不一样需要remove后重新导入的,右键项目→Build Path. 看额外的jar包有没有×,地址正不正确,要是不正确,remove错误jar包,再点击Add Ex ...

  8. Python 调用 Hprose接口、Dubbo接口、Java方法

    #!/usr/bin/env python # -*- coding:utf-8 -*- # ************************************* # @Time : 2019/ ...

  9. Gerrit常见命令及最佳实践

    概述 本文记录了笔者在使用Gerrit(一种免费.开放源代码的代码审查软件)过程中的一些微小的经验,在这里做个简单的分享. 克隆工程 git clone ssh://tusi@xx.xx.cn:294 ...

  10. MySql-8.0.16-winx64 安装

    参考文章: https://www.cnblogs.com/lxlin/p/9635350.html https://www.cnblogs.com/xc1234/p/9050149.html MyS ...