iOS 基础:证书介绍

2023-10-27

首先,打开developer.apple.com ,在iOS Dev Center打开Certificates, Indentifiers & Profiles认识一下基本结构。列表就包含了开发、调试和发布iOS应用程序所需的所有内容:Certificates、Identifiers、Devices、Provisioning Profiles。

Certificate

证书是用来给应用程序签名的,只有经过签名的应用程序才能保证他的来源是可信任的,并且代码是完整的, 未经修改的。在Xcode Build Setting的Code Signing Identity中,你可以设置用于为代码签名的证书。

众所周知,我们申请一个Certificate之前,需要先申请一个Certificate Signing Request (CSR) 文件,而这个过程中实际上是生成了一对公钥和私钥,保存在你Mac的Keychain中。代码签名正是使用这种基于非对称秘钥的加密方式,用私钥进行签名,用公钥进行验证。如下图所示,在你Mac的keychain的login中存储着相关的公钥和私钥,而证书中包含了公钥。你只能用私钥来进行签名,所以如果没有了私钥,就意味着你不能进行签名了,所以就无法使用这个证书了,此时你只能revoke之前的证书再申请一个。因此在申请完证书时,最好导出并保存好你的私钥。当你想与其他人或其他设备共享证书时,把私钥传给它就可以了。私钥保存在你的Mac中,而苹果生成的Certificate中包含了公钥。当你用自己的私钥对代码签名后,苹果就可以用证书中的公钥来进行验证,确保是你对代码进行了签名,而不是别人冒充你,同时也确保代码的完整性等。

证书主要分为两类:Development和Production,Development证书用来开发和调试应用程序Production主要用来分发应用程序(根据证书种类有不同作用),下面是证书的分类信息:(括号内为证书有效期)

  • Development
    • App Development (1年):用来开发和真机调试应用程序。
    • Push Development (1年):用来调试Apple Push Notification
  • Production
    • In-House and Ad Hoc (3年):用来发布In-House和AdHoc的应用程序。

    • App Store :用来发布提交App Store的应用程序。

    • MDM CSR
    • Push Production (1年):用来在发布版本中使用Apple Push Notification。
    • Pass Type ID Certificate:用于通行证类证书
    • Website Push ID Certificate

有一些类型的证书我没有使用过,所以也不了解具体的作用。

 

App ID

App ID用于标识一个或者一组App,App ID应该是和Xcode中的Bundle ID是一致的或者匹配的。App ID主要有以下两种:

  • Explicit App ID:唯一的App ID,这种App ID用于唯一标识一个应用程序,例如com.ABC.demo1,标识Bundle ID为com.ABC.demo1的程序。
  • Wildcard App ID:通配符App ID,用于标识一组应用程序。例如*可以表示所有应用程序,而com.ABC.*可以表示以com.ABC开头的所有应用程序。

每创建一个App ID,我们都可以设置该App ID所使用的APP Services,也就是其所使用的额外服务。每种额外服务都有着不同的要求,例如,如果要使用Apple Push Notification Services,则必须是一个explicit App ID,以便能唯一标识一个应用程序。下面是目前所有可选的服务和相应的配置要求。

如果你的App使用上述的任何一种service,就要按照要求去配置。

 

Device

Device最简单了,就是iOS设备。Devices中包含了该账户中所有可用于开发和测试的设备。 每台设备使用UDID来唯一标识。

每个账户中的设备数量限制是100个。Disable 一台设备也不会增加名额,只能在membership year 开始的时候才能通过删除设备来增加名额

 

Provisioning Profile

一个Provisioning Profile文件包含了上述的所有内容:证书、App ID、设备。

试想一下,如果我们要打包或者在真机上运行一个应用程序,我们首先需要证书来进行签名,用来标识这个应用程序是合法的、安全的、完整的等等;然后需要指明它的App ID,并且验证Bundle ID是否与其一致;再次,如果是真机调试,需要确认这台设备能否用来运行程序。而Provisioning Profile就把这些信息全部打包在一起,方便我们在调试和发布程序打包时使用,这样我们只要在不同的情况下选择不同的profile文件就可以了。而且这个Provisioning Profile文件会在打包时嵌入.ipa的包里。

例如,如下图所示,一个用于Development的Provisioning Profile中包含了该Provisioning Profile对应的App ID,可使用的证书和设备。这意味着使用这个Provisioning Profile打包程序必须拥有相应的证书,并且是将App ID对应的程序运行到Devices中包含的设备上去。

 

如上所述,在一台设备上运行应用程序的过程如下:

 

 

与证书一样,Provisioning Profile也分为Development和Distribution两种:

 

(注:前面提到不同账户类型所能创建的证书种类不同,显然Profile文件的种类是和你所能创建的证书种类相关的)

 

  • Development (1年)
  • Distribution (1年)
    • In House
    • Ad Hoc
    • App Store

 

In House 与Ad Hoc的不同之处在于:In House没有设备数量限制,而Ad Hoc是用来测试用的,Ad Hoc的包只能运行在该账户内已登记的可用设备上,显然是有最多100个设备的数量限制。所以这两种Provisioning Profile文件的区别就在于其中的设备限制不一样而已,而他们所使用的Certificate是相同的。

 

2.开发/发布流程

 

了解了上面的概念,再来看开发及发布流程就非常简单了,而且相信你不用看教程也能一步步完成所有的操作了。

 

开发/真机调试流程

 

根据上面的介绍,可以知道进行Development主要有以下几个步骤:

 

  • 申请证书
  • 加入设备
  • 生成Provisioning Profile
  • 设置Xcode Code Sign Identifer

 

事实上第三步通常是不需要的,因为我们通常都是用Xcode生成和管理的iOS Team Provisioning Profile来进行开发,因为它非常方便,所以不需要自己手动生成Provisioning Profile。

 

iOS Team Provisioning Profile是第一次使用Xcode添加设备时,Xcode自动生成的,它包含了Xcode生成的一个Wildcard App ID(*,匹配所有应用程序),账户里面所有的Devices和所有Development Certificates,如下图所示。因此,team中的所有成员都可以使用这个iOS Team Provisioning Profile在team中的所有设备上调试所有的应用程序。并且当有新设备添加进来时,Xcode会更新这个文件。

 

 

发布流程

 

不管是App Store、In-House还是Ad-Hoc,打包流程都是差不多的,都包括了以下几个关键步骤:

 

  • 创建发布证书
  • 创建App ID
  • 创建对应的Provisioning Profile文件
  • 设备Bundle ID和App ID一致
  • 设置Xcode Code Sign Identifer,选择合适的Profile和证书进行签名,打包
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

iOS 基础:证书介绍 的相关文章

  • Swift - 保存在 TableView 中选择的复选标记

    我对 Swift 相当陌生 并且在 TableView 多重选择方面遇到问题 我有多个选择 可以用复选标记进行检查 类似于待办事项列表 当我检查项目时 我希望能够返回 ListView 并保存我的选择 我假设将其保持在已保存状态的代码将位于
  • iOS:如何创建核心数据库的备份副本?以及如何导出/导入该副本?

    我想为我的应用程序的用户提供创建核心数据数据库备份的可能性 特别是在他切换到新设备等情况下 我该怎么做呢 特别是如何重新导入该文件 我的意思是 假设他制作了数据库的备份副本 然后更改了大量内容并想要重置为以前保存的备份副本 我该怎么做呢 T
  • iOS 中是否需要 Google App Indexing SDK 才能使用 Google DeepLinking?

    我想用谷歌应用程序索引与我的网页和 iOS 应用程序 我支持通用链接 or 深层链接用谷歌术语 与苹果Search并相应地设置我的网页 From 谷歌文档 https developers google com app indexing i
  • 聊天室成员列表

    如何检索正在使用的聊天室的成员列表XMPP framework 我尝试使用 void xmppRoom XMPPRoom sender didFetchMembersList NSArray items 但它返回一个空数组 这个问题很老了
  • 外设 writeValue: forCharacteristic: 类型: 返回 null 错误和值

    我正在使用苹果编写的以下代码 https developer apple com library mac samplecode HeartRateMonitor Listings HeartRateMonitor HeartRateMoni
  • 将数据从子模态 VC 传递到父视图控制器的最佳方法?

    将数据从子模式视图传递到父视图控制器的最佳方法是什么 我的 iPad 应用程序上有一个子模式登录屏幕 我想将用户信息传回父级分割视图控制器 我正在考虑使用 NSNotification 但我不确定这是否是将数据传递回父级的最简单 最有效的方
  • 动态更新 UIAlertView 消息和换行符问题

    我需要在 UIAlertView 的消息中显示多行文本 我尝试过添加 n 但没有效果 它仍然显示 这是一个示例 但是 如果我将 iPhone 切换为横向模式 它会按照我的预期显示该消息 然后 如果我切换回纵向模式 它也会正确显示 更新 经过
  • RestKit:如何删除核心数据条目以保持内容与服务器同步?

    我正在使用 RestKit RKObjectManager 从我的服务器获取数据并将其存储在核心数据中 请参阅我的其他post https stackoverflow com questions 17066214 restkit how t
  • 如何在iOS8自定义键盘上方添加工具栏?

    My problem is write picture I really need you help Maybe inputAccessoryView inputAccessoryViwController can be used but
  • 数组索引超出范围的表视图

    我正在使用数组从数据库读取数据 目前数组中有 8 个项目 我正在尝试制作一个有节标题的表格 目前我有 4 个部分 并且我已正确设置并且它有效 它也可以在第一次运行时运行 但是当我尝试向后滚动时 我发现索引超出了范围 我正在使用 myarra
  • 自动布局+基于总行数的动态表高度约束

    首先 这与动态单元格的高度无关 所以不要把它搞混了 我有一个场景 我创建了三张卡 详细信息卡 显示位置的具体详细信息 图表卡 根据选择显示不同的图表 更多详细信息卡 卡显示更多详细信息 以下是上述卡片的屏幕 查看以上屏幕的层次结构 Cont
  • 了解 malloc_history 转储

    如果您曾经问 过如何调试 Objective C 中的释放 分配问题 您将遇到这些可以帮助跟踪问题的环境设置 NSZombieEnabled 释放后保留对象 以便您可以获得指针等 MallocStackLogging 保留对象历史记录以供以
  • 有没有办法以编程方式选择 Segue 锚点?

    假设我有一个 Storyboard 其中包含一个包含按钮的视图 当用户按下此按钮时 会出现一个弹出窗口 因此 我需要使用 Xcode 将 Segue 拖动到按钮来设置锚点 然后执行使用标识符执行Segue 所以 我的问题是 有没有办法以编程
  • iOS:接收“304 Not Modified”响应时 AVPlayerItem 中的错误

    这是一个非常奇怪的错误 我有一个 tableView 每个单元格都使用AVPlayer从远程服务器流式传输视频 想象一下类似 Vine 的时间线 因此 当我滚动时 重复使用的单元格会使用新视频重新配置播放器 问题是 如果我非常快地来回滚动
  • 从钥匙串保存和加载 |斯威夫特[重复]

    这个问题在这里已经有答案了 如何简单地将字符串存储在钥匙串中并在需要时加载 有几种SO解决方案 主要参考Git repo 但我需要最新 Swift 上最小和最简单的解决方案 当然 我不想添加 git 框架来简单地在我的项目中存储密码 有类似
  • Xcode - 免费清除设备文件夹?

    我正在删除一些文件夹和文件 以便在驱动器上腾出更多空间 我知道在路径中 Library Developer CoreSimulator Devices 每个模拟器和每个版本都有文件夹 这个文件夹对我来说大约有 11GB 大小 我知道我可以删
  • 为什么使用 UIImageJPEGRepresentation 方法通过 writetofile 保存的 .jpeg 文件大小比 ios 中的 UIImageWriteToSavedPhotosAlbum 大

    我正在尝试拯救一个UIImage设备中 jpeg 文件的对象 我正在使用这段代码 void saveImageToDocumentsDirectory UIImage mimage withFileName NSString fileNam
  • Quickblox 聊天未进行身份验证

    我在我的应用程序中使用 Quickblox 进行一对一聊天 用户已经登录 但是当我尝试登录聊天时 出现以下错误 2014 03 31 12 42 09 532 MyChat 2175 3803 QBChat didNotAuthentica
  • Base64Transcoder.m 重复符号

    我想使用 SKPSMTPMessage 库 唯一的问题是这个库包含文件 Base64Transcoder m 由于我有 Dropbox SDK 该文件会出现重复错误 我该如何解决这个错误 我不能直接删除 Base64Transcoder m
  • iOS swift 应用程序启动时出现黑屏

    我有个问题 当我启动我的应用程序时 会看到黑屏几秒钟 然后出现启动屏幕 我的启动画面不是默认的 我使用了视图控制器 因为我的启动画面有一个动画 我搜索了一个解决方案 我得到了这个 在我的闪屏加载 iPhone 之前出现黑屏 https st

随机推荐

  • IO流进阶

    IO流加强 字符流 整体框架 FileReader 文件字符输入流 作用 以内存为基准 可以把文件中的数据以字符的形式读入到内存中去 构造方法 构造器 说明 public FileReader File file 创建字符输入流管道与源文件
  • 【sql】在电商情境下提取数据

    总结了几个使用sql语言对电商业务的问题的提数思路 因为网上公开的数据难以获取 这里是取自公开出版书籍中的随书资源 过程在自己的workbench里进行实操 重在展示解决问题的语句的思路 mysql 5 7 17 1 计算用户的次日 3日
  • error: expected ‘}’ at end of input的一种可能解决方法

    1 排除正常的括号对应 2 直接再函数实现前面加个 看是否会报错 如果不是 则必定是头文件的问题 检查包含头文件 3 如果上一步无错误则检查每个函数具体实现 网上有些方法比较笨 之前跳过第二步直接来第三步 文件几十个函数一个个试 最后发现是
  • DevC++使用技巧

    目录 1 解决无法编译器无法使用C 11的问题 1 解决无法编译器无法使用C 11的问题 打开 工具 gt 编译选项 gt 代码生成 优化 gt 代码生成 gt 语言生成 std 选择ISO C 11版本 点击确定 2 c str 的问题
  • C# 实现电子签名

    本项目基于Emgu CV C 下OpenCv的封装 开发的 编译器最新版Vs2022 编译环境x86 直接看效果图 1 主页面 2 我们先看手写的方式 点击确认就到主界面 如下 点击自动适配 再点击生成 放大看 点击保存即可 生成透明电子签
  • kubernetes-证书过期,重建证书后出现的kubelet证书过期问题

    由于初期 创建证书的期限只有一年 后来经过重建10年的证书期限后 参考 kubernetes 证书过期 重建证书 稳定运行一年后 再次出现证书问题 1 故障的表现 kubectl get node NAME STATUS ROLES AGE
  • MYSQL注入天书之服务器(两层)架构

    Background 6 服务器 两层 架构 首先介绍一下29 30 31这三关的基本情况 服务器端有两个部分 第一部分为tomcat为引擎的jsp型服务器 第二部分为apache为引擎的php服务器 真正提供web服务的是php服务器 工
  • JS实现表格排序

    今天有点闲 写个小东西 使用JS实现点击表格标题栏实现自动排序功能 嘻嘻 一 JS代码 文件名为code js如下 function 插件 extend 命名空间 sortTable sort function tableId Idx va
  • 【翻译】3个(不,应该是4个)问题:大使实验室的丹尼尔-布莱恩特

    在我们的循环专题 3个问题 中 我们向云原生社区中具有影响力的人提出了三个问题 旨在定义云原生 在本期节目中 Ambassador Labs的开发关系总监和InfoQ的新闻经理Daniel Bryant接受了这个挑战 我们还偷偷地加入了第四
  • 【最优潮流】二阶锥松弛在配电网最优潮流计算中的应用(Matlab代码实现)

    欢迎来到本博客 博主优势 博客内容尽量做到思维缜密 逻辑清晰 为了方便读者 座右铭 行百里者 半于九十 本文目录如下 目录 1 概述 1 1 目标函数 1 2 约束条件 1 3 基于二阶锥松弛的模型转换 2 运行结果 2 1 算例分析 2
  • 调用百度API,文字转语音

    前言 文字转语音 运用在什么场景了 一般后台管理系统会用到 提示管理员有 新的订单 新的任务 等等 管理员可以马上收到 并及时处理 就好比 在餐厅 经常会听到 你有新的订单 下面就来看看是如何做到的 示例 首先我们需要用到百度API 百度演
  • Java 图片URL转Base64编码

    目录 前言 具体实现 前言 实现方式 通过图片URL获取二进制流 再对字节数组进行Base64编码转换 具体实现 实现类 import sun misc BASE64Encoder import java io ByteArrayOutpu
  • linux安装mysql5.7详细教程

    一 安装前的检查和准备工作 1 1检查自己的liunx是否安装过mysql yum list installed grep mysql 如果有的话 就删除 XXXX是自己的mysql目录 rpm e nodeps mysql xxxx 1
  • 入门级CC(Smart3D)照片建模

    一 准备和设置 1 准备 单反相机 没有相机用手机拍照也可以测试 软件 CC ContextCapture 版本 CCCenter partial 10 16 0 75 x64 en msi 软件下载地址 也阔以自己在网上下载 链接 htt
  • 计算机网络_选择题(一)

    前提 该轮是第二轮复习 旨在题型理解考什么 怎么考 同时巩固第一轮复习的重点 以下题型来自往年复习卷 选择题 A题 2006 2007 1 两个实体之间的通信不需要先建立好连接的通信方式为 B 的特点 A 面向连接 B 无连接 C 面向连接
  • IntelliJ IDEA插件_可用的IDE Eval Reset

    文章目录 IDEA版本说明 IDE Eval Reset安装 搜索不到IDE Eval Reset怎么办 不能Eval Reset怎么办 IDEA版本说明 我的IDEA版本是2021 2 2 如果你是最新版本或者比 2021 2 2 版本高
  • UE4 绑定场景中的摄像机到主角

    1 打开Level BluePrint 2 选中场景的摄像机 在Level BluePrint中右键 Create a Reference to CameraActor 3 右键 GetPlayerController 4 右键弹出窗口 右
  • LABVIEW通过Database Connectivity Toolkit工具访问MySQL数据库的方法(从安装MySQL数据库到Labview程序示例)

    目录 一 软件环境 二 MySQL数据库安装 三 ODBC的配置 四 Labview访问MySQL 五 总结 本文详细介绍MySQL数据库的安装 以及通过Database Connectivity Toolkit工具访问MySQL的方法 一
  • 一线工程师告诉你嵌入式真实现状与发展前景

    点击上方 大鱼机器人 选择 置顶 星标公众号 福利干货 第一时间送达 阅读文本大概需要 2 分钟 0 前言 有位哥们在微信中问了我一个这样的问题 基于我自己的一些经历 以及参考网上一些朋友写出的帖子 可以对此问题进行解答 1 嵌入式定义 根
  • iOS 基础:证书介绍

    首先 打开developer apple com 在iOS Dev Center打开Certificates Indentifiers Profiles认识一下基本结构 列表就包含了开发 调试和发布iOS应用程序所需的所有内容 Certif