通过推送后台查看到 线上还没有有效设备,意思就是没有注册设备。 则集成可能少了步骤,需重新查看小米推送的集成文档。或是出现xcode本身的参数配置错误:

 https://dev.mi.com/console/doc/detail?pId=98

2.3. 配置SDK运行参数

运行SDK注册小米推送服务的时候,需要使用AppID,AppKey,等参数来验证使用者的合法性。

  1. 打开工程下资源文件Info.plist
  2. 文件为源代码形式打开,添加以下信息
    <dict>
    	<key>MiSDKAppID</key>
    	<string>1000888</string>
    	<key>MiSDKAppKey</key>
    	<string>500088888888</string>
    	<key>MiSDKRun</key>
    	<string>Online</string>
    </dict>
  3. 如果开发版本较多,修改连接环境比较繁琐,提供以下方式。
    !--请注意MiSDKRun写法, 用buildSetting里面的宏替换--
    <dict>
    	<key>MiSDKAppID</key>
    	<string>1000888</string>
    	<key>MiSDKAppKey</key>
    	<string>500088888888</string>
    	<key>MiSDKRun</key>
    	<string>${MiSDKRun}</string>
    </dict>
    其中在Build Settings中添加添加宏MiSDKRun的方法为:

  1. MiSDKAppID, MiSDKAppKey 为在小米开发者网站http://developer.xiaomi.com,注册App后的AppID,AppKey。MiSDKRun 是设定SDK是连接Development环境/Distribution环境 对应参数为debug/online

####################### xcode参数错误 #########################################

一天又一天,淹没在无穷无尽剪不断理还乱的业务线,时不时出来跑下脚本,打打各种环境的包。
最近在联调push的时候,又碰上一些奇怪的问题,一番拉扯,终于搞定,特此记录。

错误信息

NSError(NSCocoaErrorDomain:3000) 未找到应用程序的“aps-environment”的授权字符串

尝试解决

1、打开 Capabilites -> Push Notifications 开关属性为 ON (确认已打开)。

2、删除本地 profile 文件,重新download,无效。

3、Command+shift+K 清空Xcode缓存,无效。

4、Build Setting 搜索 code sign

观察 Code Signing Entitlements ,确认值为 entitlements 文件正确路径。
观察 Code Signing Identity,不同环境对应不同打包证书,开发环境对应开发证书,正式环境对应生产证书,确认是ok的。

5、stackoverflow 上看到这么一条挺心动的,大概意思是这么说的,确保你的 profile 文件生成在推送证书生成之后。于是重新生成了一波,无效。

APNs Development iOS 开发环境推送证书
Apple Push Services 生产环境推送证书

额,到这里,似乎有点山穷水尽了啊,不行,殊死一搏

1
删除mac钥匙串中心所有关于项目的证书,包括开发证书,生产证书,开发推送证书,生产推送证书等等。

重启,重新应用,重新打包,然后,居然…竟然…特么的好了!!!Are you fucking kidding me?!!

四种打包模式的区别

  1. Save for iOS App Store Deployment
    保存到本地 准备上传App Store 或者在越狱的iOS设备上使用

  2. Save for Ad Hoc Deployment
    苹果的官方解释是:To distribute your app to users with designated devices, select “Save for Ad Hoc Deployment.” The app will be code signed with the distribution certificate.(保存到本地 准备在账号添加的可使用设备上使用(具体为在开发者账户下添加可用设备的udid),该app包是发布证书编译的)

  3. Save for Enterprise Deployment 生成企业包
    这种主要针对企业级账户下 准备本地服务器分发的app,也可直接发给你的客户或测试人员安装,无需在帐号中添加设备的udid。注意:此证书为299$的企业证书

  4. Save for Development Deployment
    苹果的官方解释是:To distribute your app for internal testing, select “Save for Development Deployment.” The app will be code signed with your development certificate. (针对内部测试使用,主要给开发者的设备(具体也为在开发者账户下添加可用设备的udid)。该app包是开发证书编译的)

至于 Save for Ad Hoc Deployment 和 Save for Development Deployment两个选项的区别,官方给出的解释是证书的区别,但是对于我们来说,还不是特别清楚具体的用处。其实最早当我们选择Save for Ad Hoc Deployment来生成ipa包的时候,我们是可以选择开发证书的,但是现在,它需要我们使用发布证书。我们最早在做程序真机测试的时候,大部分时候是用的开发证书,并没有发布证书,所有我认为,Save for Development Deployment是我们前期用开发证书,给测试人员发包测试的时候使用的,而到程序开发的后期,我们为了发布,生成了发布证书,此时,我们给client或者tester的时候,应该选择Save for Ad Hoc Deployment,使用发布证书打包, 而官方对Ad Hoc的解释是:Ad Hoc模式的包,和将来发布到App Store的包在各种功能测试上是一样的,只要Ad Hoc模式下测试(推送,内购等)没有问题,发布到App Store也是没有问题的。

entitlements文件

Xcode8之后,我们如果需要打开推送功能,必不可少的一步就是打开 Capabilites -> Push Notifications 开关属性为 ON,细心的同学就会发现,Xcode为我们自动生成了一个 xxx.entitlements文件,xxx是我们的项目名称,打开这个文件,里面只有一对键值对如下

1
APS Environment: development

这个有什么作用呢?

我们此时Archive出一个ipa包来,右键解压并查看包内容,会发现一个embedded.mobileprovision,里面放的是各种PP文件属性,包括关于项目的一些权限字段和功能开关,其中,我们要关注的则是 aps-environment 这个字段,这个字段的值真正决定我们打出来的包是正式环境的push还是开发环境的push,值为 development 代表开发环境push,distribution 代表正式环境的push。

然而,经过测试,无论我们如何修改上面生成的 xxx.entitlements 文件中 APS Environment 的值,打出来的包内容 embedded.mobileprovision 中 aps-environment始终为 development,这是为什么呢?

经过本人亲自反复多次测试,我们手动修改 xxx.entitlements 的 APS Environment 是没有用的,因为Xcode打包会自动帮我们修改 APS Environment 的值,而这个值只取决于我们的打包方式, 即使我们把 APS Environment 的值改成 abc 都没有关系。

打包方式最终实际 aps-environment
Save for iOS App Store Deployment distribution
Save for Ad Hoc Deployment distribution
Save for Enterprise Deployment 尚未测试
Save for Development Deployment development

所以,我们得出一个结论,使用 firim 或者 蒲公英 分发平台给测试push发包的时候,就需要选择正确的打包模式,否则后端调起的推送证书是开发环境还是生产环境将直接影响我们app是否会受到推送。

校验正式环境的push功能,选择 ad-hoc 模式打包。

校验测试环境的push功能,选择 Development Deployment 模式打包。

小彩蛋

如何查看 embedded.mobileprovision 文件内容?

方法一:直接在Finder左键选中该文件,修改Finder查看方式为图标、列表、分栏或封面流方式显示项目(默认从左往右第三个查看方式),那么我们就会在右边封面流看到文件内容了。

方法二:cd到该文件目录下,使用命令 security cms -D -i embedded.mobileprovision 即可查看。