3、Xcode项目配置:Capabilities中开启Push Notifications、Background Modes配置(Remote notifications)、Info.plist相关设置
好,咱们直接进入实操环节。
很多新手在配置推送时,容易卡在Xcode的项目设置里。其实说白了,就是三个地方要动:Capabilities、Background Modes、还有Info.plist。我当年第一次配的时候,漏掉了Background Modes,结果远程推送死活收不到,排查了一下午……嗯,咱们今天一次性说清楚。
3.1 Capabilities:开启Push Notifications
这一步最简单,但也是最容易忘的。
打开你的Xcode项目,选中Target,然后找到Signing & Capabilities标签页。点击左上角的+ Capability按钮,搜索并添加Push Notifications。
关键点:添加成功后,你会看到列表里多了一项Push Notifications,并且右侧会显示一个开关。确保它是开启状态(绿色)。
我个人习惯是,每次新建项目都会先检查这里。为什么?因为苹果的证书和Provisioning Profile有时候会抽风,你明明在开发者中心配好了,但Xcode这里没开,照样收不到推送。我曾经被这个坑过两次,后来就长记性了。
小提示:如果你用的是SwiftUI生命周期,这一步同样需要做。别以为用了新框架就能跳过,Capabilities是项目级别的配置,跟UI框架无关。
3.2 Background Modes:开启Remote notifications
这一步才是真正的「灵魂配置」。
推送通知分为两种:一种是用户在前台时收到的展示型推送,另一种是应用在后台时静默唤醒去拉取数据的推送。如果你想让应用在后台也能收到推送并执行代码,就必须开启Background Modes里的Remote notifications。
操作步骤:
- 还是在Signing & Capabilities页面,再次点击+ Capability。
- 搜索并添加Background Modes。
- 在Background Modes的列表中,勾选Remote notifications。
注意:这里有个常见的误解。很多人以为只要勾了Remote notifications,应用就能在后台收到所有推送。其实不是的。你发送的推送payload里必须包含"content-available": 1这个字段,系统才会唤醒你的应用。否则,即使你勾了这里,推送也只是走普通展示流程。
我记得有一次,后台同事跟我说推送已经发了,但我这边就是收不到静默回调。后来一查,发现他漏了content-available字段。嗯,这种跨团队协作的坑,真的得靠沟通和文档来避免。
3.3 Info.plist相关设置
Info.plist这块,其实苹果已经帮我们简化了很多。但在某些场景下,你还是需要手动配置一些东西。
3.3.1 UIBackgroundModes(可选但推荐)
如果你已经通过Capabilities开启了Background Modes,Xcode会自动在Info.plist里生成UIBackgroundModes数组,并包含remote-notification这个值。你可以打开Info.plist确认一下:
<key>UIBackgroundModes</key>
<array>
<string>remote-notification</string>
</array>
如果你发现这里没有,或者你手动编辑过Info.plist,记得补上。否则后台唤醒功能会失效。
3.3.2 推送证书相关的Bundle Identifier
这个其实不算Info.plist的直接配置,但跟项目设置强相关。你的Bundle Identifier必须和Apple Developer Center里创建的App ID完全一致。包括大小写和连字符。我见过有人把com.example.myapp写成了com.example.MyApp,结果证书一直验证失败。
避坑指南:在Info.plist里找到Bundle identifier这一项,复制出来,去开发者中心核对。一个字都不能差。
3.3.3 本地化推送文案(可选)
如果你的应用支持多语言,可以在Info.plist里配置CFBundleLocalizations数组,列出所有支持的语言。这样推送的文案可以针对不同语言做本地化处理。不过这个属于进阶用法,初期可以跳过。
3.4 配置完成后,如何验证?
配置完了,心里没底?我教你一个快速验证的方法。
写一个简单的application(_:didRegisterForRemoteNotificationsWithDeviceToken:)回调,把deviceToken打印出来。如果能正常打印出token,说明你的Capabilities和证书配置基本没问题。
func application(_ application: UIApplication,
didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) {
let tokenParts = deviceToken.map { data in String(format: "%02.2hhx", data) }
let token = tokenParts.joined()
print("Device Token: \(token)")
}
如果这个回调没被调用,或者报错,那大概率是Capabilities没开,或者证书/Provisioning Profile不匹配。别慌,回头检查一下3.1和3.2的步骤。
个人经验:我习惯在真机上测试推送配置。模拟器虽然也能注册推送,但拿到的deviceToken是假的,无法用于生产环境。所以,有条件的话,直接上真机。
3.5 总结一下配置清单
| 配置项 | 位置 | 必须/可选 | 备注 |
|---|---|---|---|
| Push Notifications | Capabilities | 必须 | 开启后才有推送权限 |
| Remote notifications | Background Modes | 必须(如需静默推送) | 配合content-available使用 |
| UIBackgroundModes | Info.plist | 自动生成 | 手动确认一下即可 |
| Bundle Identifier | Info.plist / Target设置 | 必须 | 与开发者中心一致 |
嗯,配置这块其实不难,但细节多。你只要按着这个清单走一遍,基本不会出问题。下一章咱们会聊到如何获取Device Token,以及Token的格式处理。到时候见。