苹果开发之App签名

如果你的Apple ID账号(可使用邮箱来注册)为Apple developer类型的话,登录之后是看不到Certificates, Indentifiers & Profiles信息的

Apple developer是最基础的账号类型,主要用来在App Store下载各种应用(包括xCode等开发工具和SDK库)及在iCloud上备份文件和照片

可通过点击下方的“Joining the Developer Program”链接,按照指引点击enroll按钮,付费99$/year之后,成为registered Apple developer

此时你才能看到Certificates, IDs & Profiles按钮,点击之后就可以进入Certificates, Indentifiers & Profiles面板了

Certificate(证书)

Certificates(证书)是一个经证书授权中心数字签名的包含公开密钥拥有者信息以及公开密钥的文件

用于用来给应用程序签名(Signature)的,只有经过签名的应用程序才能保证它的来源是可信任的,并且代码是完整的, 未经修改的

证书一般具有时效性,只在特定的时间段内有效。

苹果的证书分为Development和Distribution两种。Development证书用于开发和调试应用程序,可用于真机调试;Distribution证书用于打包上传App Store,用于验证开发者身份

Certificates列表中列出证书(.cer文件)都是公钥证书,如果这个证书是在别人机器上生成的,在机器上安装后是没有私钥与其匹配的

注1:在mac中,可以通过右键快捷菜单“快速查看XXX.cer”来查看证书的基本信息

注2:钥匙串访问(Keychain Access)在应用程序\实用工具(Applications\Utilities)中

你可以在自己的机器上创建一个与本机私钥相匹配的公钥证书(.cer文件)

方法1:

(1)选择证书分类,在钥匙串访问(Keychain Access)菜单:“钥匙串访问” -- “证书助理” -- “从证书颁发机构请求证书”

用户电子邮件地址和CA电子邮件地址可以随便输入一个邮箱,常见名称为密钥的名称,点击继续后会从苹果官方CA(Certificate Authority,证书授权中心)获取得到一个证书请求文件(.certSigningRequest文件)

注:生成certSigningRequest文件过程中,实际上是生成了一对公钥和私钥(Key Pair),保存在你Mac的keychain中。代码签名正是使用这种基于非对称秘钥的加密方式,用私钥进行签名,用公钥进行验证。

如下图所示,在你Mac的keychain的login中存储着相关的公钥和私钥,而证书中包含了公钥。你只能用私钥来进行签名,所以如果没有了私钥,就意味着你不能进行签名了,所以就无法使用这个证书了,此时你只能revoke(删除)之前的证书再申请一个。

因此在申请完证书时,最好导出并保存好你的私钥。当你想与其他人或其他设备共享证书时,把私钥传给它就可以了。私钥保存在你的Mac中,而苹果生成的Certificate中包含了公钥。

当你用自己的私钥对代码签名后,苹果就可以用证书中的公钥来进行验证,确保是你对代码进行了签名,而不是别人冒充你,同时也确保代码的完整性等

(2)在页面上点击“+”创建一个新证书,选择证书类型后,需要上传第一步中的certSigningRequest文件,来生成与本机私钥相匹配的公钥证书(.cer文件)

(3)下载.cer文件,双击或将其拖入钥匙串访问(Keychain Access)中进行安装,结果如下

注:左边有个三角形箭头的证书是可以点开看到专用密钥(private key),这种证书才能用来签名应用程序

方法2:

在菜单Xcode -- “Preferences”的Accounts标签页中,登录Apple ID账号后,也可以看到账号下的证书列表

点击左下角的+号可以创建并安装一个有私钥的证书

注1:点击左下角的+号来创建安装一个证书时,才会刷新XCode这个证书列表(应该是一个bug)

注2:灰色(Stauts:Not in Keychain)为没有安装到钥匙串访问(Keychain Access)的证书

图标上带个x(Status:Missing Private Key)为安装到钥匙串访问(Keychain Access)但在本机找不到私钥相匹配的公钥证书

正常图标为安装到钥匙串访问(Keychain Access)且本机有私钥相匹配的证书

从钥匙串访问(Keychain Access)将含有私钥的证书导出(.p12文件)给其他mac机器使用

(1)选中证书私钥,右键菜单选择“导出xxx...”,选择保存路径

(2)会弹出一个框,要求填入一个对p12文件加密密码(也可以不填)

(3)最后,钥匙串访问(Keychain Access)会要求输入当前账号密码来授权输出p12证书文件

在mac上, 双击证书(.p12文件)或将证书拖入到钥匙串访问(Keychain Access)即可完成证书的安装

在windows上,导入的iOS证书会保存到证书管理器(certmgr.msc)中

注1:可在管理器中选中对应证书进行删除

注2:含有私钥的证书的左上角有一个钥匙的小图标

UE4使用IPhonePackager.exechs)工具来在windows上安装iOS证书,命令如下:

"D:/UnrealEngine/Engine/Binaries/DotNET/IOS/IPhonePackager.exe" Install Engine -project "D:/svn/TPSProject/TPSProject.uproject" -certificate "D:/txjsj_dev.p12" -bundlename "com.ten.DGame"

如果有证书的pp文件,可以从证书管理器中导出p12格式的iOS证书,命令如下:

"D:/UnrealEngine/Engine/Binaries/DotNET/IOS/IPhonePackager.exe" ExportCertificate "D:/svn/TPSProject/TPSProject.uproject" "D:/DGame.mobileprovision" -outputcertificate "D:/mycertificate.p12"

注:生成出来的mycertificate.p12的密码(在UnrealEngine\Engine\Source\Programs\IOS\iPhonePackager\CompileTime.cs的ExportCertificate函数中写死)为:A

扩展阅读:udn:iPhonePackager Tool中文

UE4会在“平台” -- “iOS”中列出当前机器上安装的所有的iOS证书和PP文件

勾选某个证书和PP文件后,会将选中的证书和PP文件的名称记录在DefaultEngine.ini中

[/Script/IOSRuntimeSettings.IOSRuntimeSettings]
MinimumiOSVersion=IOS_10
bSupportsPortraitOrientation=False
bSupportsUpsideDownOrientation=False
bSupportsLandscapeLeftOrientation=True
PreferredLandscapeOrientation=LandscapeLeft
MobileProvision=DGame.mobileprovision
BundleIdentifier=com.ten.DGame
SigningCertificate=iPhone Developer: cert RDM (CFG5EWN5ME)

App ID

App ID用于标识一个或者一组应用程序,App ID需要与应用程序的Bundle ID是一致的或者匹配的

App ID主要有以下两种:
Explicit App ID:唯一的App ID,这种App ID用于唯一标识一个应用程序,例如com.ten.DGame,标识Bundle ID为com.ten.DGame的程序
Wildcard App ID:通配符App ID,用于标识一组应用程序。如:*可表示所有应用程序,com.*可表示以com.开头的所有应用程序,com.ten.*可表示以com.ten开头的所有应用程序

Device(设备)

Devices即设备, Devices中包含了该账户中所有可用的设备。 每台设备使用UDID(形如:0f3f1a4430543305f21f17cb49d0c0f3f1a44305,由40个16进制数字组成的字符串,共160 bits)来唯一标识

每个账户中的设备数量限制是100个,Disable一台设备也不会增加名额,只能在membership year开始的时候才能通过删除设备来增加名额。详见:关于iOS测试机个数上限的详细规则

查看设备UDID

方法1:

(1)将手机通过数据线查到电脑,并在手机上信任此电脑后,就可以在iTune中查看手机的UDID

(2)如下可以看到当前手机的UDID(注:如显示为序列号、ECID、型号识别符等,请点击切换到UDID)

方法2:将手机通过数据线查到电脑,并在手机上信任此电脑后,在Xcode菜单“Window” -- “Devices and Simulators”的Devices面板中查看手机的UDID

Provisioning Profiles(PP文件) 

Profiles即为Provisioning Profiles文件(后缀名为.mobileprovision),简称PP文件

PP文件包含了上述的所有内容:证书、App ID、设备,决定应用程序能在那些设备上运行

注1:PP文件也分为Development和Distribution两种,必须与证书相对应

即Development的PP文件要使用Development的证书,Distribution的PP文件要使用Distribution的证书

注2:Development的PP文件才允许使用xCode进行调试

注3:PP文件可以关联多张证书,多个设备

注4:Distribution类型的PP文件又分为In House(配合企业证书使用,没有设备限制)、Ad Hoc(只能运行在该账户内已登记的可用设备上,最多100个设备)、App Store(上架App Store用,没有设备限制)

在打包或者在真机上运行一个应用程序,我们首先需要证书来进行签名,用来标识这个应用程序是合法的、安全的、完整的等等;

然后需要指明它的App ID,并且验证Bundle ID是否与其一致;再次,如果是真机调试,需要确认这台设备能否用来运行程序。

PP文件把这些信息全部打包在一起,方便我们在调试和发布程序打包时使用,这样我们只要在不同的情况下选择不同的profile文件就可以了

PP文件会在打包时嵌入.ipa的包里(即名为embedded.mobileprovision的文件)

在一台设备上启动应用程序时,会用PP文件进行如下校验:

Mac机器上PP文件的安装目录为:/Users/<用户名>/Library/MobileDevice/Provisioning Profiles

中文路径为:/用户/<用户名>/资源库/MobileDevice/Provisioning Profiles

注:该目录在Finder中不可见,可通过菜单“前往” -- “前往文件夹...”来打开

或者在Terminal终端中查看  cd ~/Library/MobileDevice/Provisioning\ Profiles

注1:上图中mobileprovision文件名中的UUID是从mobileprovision文本文件中读取的

<key>UUID</key>
<string>672e56b7-d5e2-45a2-acc8-00f6cde47063</string>

注2:mobileprovision文件原始的文件名也存储在mobileprovision文本文件中

<key>Name</key>
<string>PP20190723_1120</string>

注3:可以从Xcode中将Apple ID账号中的PP文件同步到本地

在windows上,PP文件安装目录为:%homepath%\Appdata\Local\Apple Computer\MobileDevice\Provisioning Profiles

在Xcode中开发应用时,可以从项目工程中设置其使用的PP文件,让其对ipa文件进行签名输出(CodeSign)

注1:点击Provisioning Profile后面的上下箭头,会弹出快捷菜单

Import Profile:可导入本地的一个PP文件到PP文件的安装目录

Download Profile:若在Xcode中登录了Apple ID账号,会列出账号中拥有的PP文件

注2:也可以勾选“Automatically manage signing”,让Xcode来自动管理

注3:当在Xcode中登录了Apple ID账号,“Automatically manage signing”下可以看到一个iOS Team Provisioning Profile的PP文件

该PP文件为Development类型,是利用Apple ID账号中的最大范围的App ID + 所有的证书 + 所有设备自动生成出来的

鼠标放在该PP文件图标上拖曳到Terminal终端中可以看到该PP文件存放的路径,如:/Users/<用户>/Library/MobileDevice/Provisioning\ Profiles/d563efb3-d555-4921-81eb-c9a32ddac164.mobileprovision

将安装目录中的该文件删除,然后在Xcode中登录Apple ID账号并勾选“Automatically manage signing”,会强制利用Apple ID账号中的资源重新生成出最新的iOS Team Provisioning Profile的PP文件

更详细地设置在BuildSetting中

Keys(extra service)

Keys定义了开启了那些Service,如上DGame该值为2,代表开启了Apple Push Notifications service (APNs)和DeviceCheck服务

Apple Push Notifications service (APNs)
Establish connectivity between your notification server and the Apple Push Notification service. One key is used for all of your apps. 
DeviceCheck
Access per-device, per-developer data that your associated server can use in its business logic. One key is used for all of your apps.

其他

Xcode中共享developerprofile来共享Apple ID账号

(1)在Xcode登录Apple ID账号,点击左下角螺母图标,弹出快捷菜单“Export Apple ID and Code Signing Assets”输入保护密码后,就可导出开发者账号(*.developerprofile)

(2)在其他机器上对应位置的快捷菜单“Import Apple ID and Code Signing Assets”输入保护密码来导入该文件

注:developerprofile文件实际为一个zip文件,改后缀解压后,里面文件列表如下:

原文地址:https://www.cnblogs.com/chenzxl/p/11432476.html

时间: 2024-10-10 14:07:33

苹果开发之App签名的相关文章

android开发之APP Widget

android开发之APP Widget 本博文主要讲述的android开发中的桌面程序的开发--APP widget,主要用的是PendingIntent和RemoteViews. PendingIntent主要用来设置桌面程序的相应方式.此对象可以有三种Intent方式,第一个是开始一个新的Activity,第二个是发送一个广播,第三个是开始一个service. RemoteViews的作用:因为桌面程序和app程序不是属于一个进程,不能通过正常的操作控件的方式来操作.需要使用系统提供的Re

iOS开发之APP上线

首先自我介绍一下,我是来自广州的iOS程序猿,工作有2年了,没有写过博客啥的.第一次想写点东西,记录下自己学到的东西和感悟.今天半夜里看了篇文章后,我也想自己写篇文章,虽然我也不知道我要写什么,怎么写....好吧,那就APP上线吧! APP 上线有两种途径: 一种是 Xcode->openDeveloperTool->applicationLoader,这种打开后登陆appleID就可以选取并且交付您的应用程序了.这种呢,我们交付之前首先要Xcode打包出来一个.ipa (打包的过程,其实百度

iOS开发之App间账号共享与SDK封装

App间的数据共享可以使用KeyChian来实现.本篇博客就实战一下呢.开门见山,本篇博客会封装一个登录用的SDK, 该登录SDK中包括登录.注册.忘记密码等功能,当然该SDK中包括这些功能的UI.数据验证等业务逻辑.网络请求.数据存储等等.当然此处的登录SDK是一个简化版的,真正的登录SDK比这个考虑的东西要多的多,如果在加上多个App进行登录账号的共享的话,那么考虑的东西就更为复杂了. 本篇博客就先封装一个LoginSDK, 让后将该SDK植入到两个App中(一个暂且叫做"App One&q

iOS开发之App启动原理

iOS程序的启动过程 程序启动的完整过程大致步骤如下: 1.main函数 2.UIApplicationMain * 创建UIApplication对象 * 创建UIApplication的delegate对象 3.delegate对象开始处理(监听)系统事件(没有storyboard) * 程序启动完毕的时候, 就会调用代理的application:didFinishLaunchingWithOptions:方法 * 在application:didFinishLaunchingWithOpt

Android开发之App Widget的学习及使用

(以下为本人对于官方文档的理解,能力有限,有错还望指出) 1.首先,我们先阅读下官方文档,后面活给出Demo程序 App Widgets(小工具,窗口小部件) App Widgets are miniature application views that can be embedded in other applications (such as the Home screen) and receive periodic(周期的,定期的) updates. These views are re

iOS开发之App主题切换完整解决方案(Swift版)

本篇博客就来介绍一下iOS App中主题切换的常规做法,当然本篇博客中只是提到了一种主题切换的方法,当然还有其他方法,在此就不做过多赘述了.本篇博客中所涉及的Demo完全使用Swift3.0编写完成,并使用iOS的NSNotification来触发主题切换的动作.本篇博客我们先对我们的主题系统进行设计,然后给出具体实现方式.当然在我们设计本篇博客所涉及的Demo时,我们要遵循"高内聚,低耦合","面向接口编程","便于维护与扩充"等特点. 本篇博

移动端开发之APP消息推送

有这样一种场景,当你在手机APP上输入你的信息,会自动跳出一个弹窗,表示某任务已执行.最简单的一个例子就是当你输入手机号,点击获取验证码的时候,就会跳出一个对话框,说"验证码已发送到手机,请注意查收",这些都是如何实现的. 就以我参与开发的一款移动报表FineReport为例,讲解一下如何开发手动推送APP消息. 这个APP里有这样一个应用,它是可以实现在客户端填报录入数据,然后数据上传到数据库中的这样一个功能,也就是所谓的移动化办公,这在企业办公方面用得比较多.当数据录入系统成功后,

ios开发之 APP上架要填写什么?有什么要注意?

好不容易把APP开发完成,那我们上架的时候要填写什么?注意些什么?(关于申请上架帐号神马的,请参阅个人之前的文章) 1.国内发布APP,名字肯定是中文.那么在项目info文件里边,把Bundle display name 填写一个中文名字,Localization native development regior 选择中国.如果刚才提到的两个都没有,自己手动添加即可. 2.项目General注意点 2-1:Bundle identifier 命名规范,且具有唯一性,因为在发布时候,描述证书要匹

ios开发之APP升级的实现

直接上代码: /** * 检测软件是否需要升级 */ -(void)checkVersion { NSURL *url = [NSURL URLWithString:[NSString stringWithFormat:@"http://itunes.apple.com/cn/lookup?id=%i",iFeverAPPID]]; ASIHTTPRequest *request = [[ASIHTTPRequest alloc]initWithURL:url]; [request s