在 iOS 开发中,“隐式推送”通常是指没有在 `Info.plist` 或 Xcode 配置中显式声明的通知推送行为,或者是指由系统或第三方服务触发的推送而非你自己代码中直接调用的通知。要“找到”这些隐式推送来源,可以从以下几个方向排查和分析:
---
一、查找隐式推送的来源方法:
1. 使用 Console.app 查看系统日志
- 连接 iPhone 真机到 Mac。
- 打开 Mac 上的 `Console.app`(控制台)。
- 在左侧选择你的设备,使用过滤词如:
- `Push`
- `apsd`(Apple Push Service Daemon)
- `UNUserNotification`
- 查找可疑的推送行为或相关进程调用。
2. App 中的通知行为
在你的 App 中添加以下代码来所有接收到的通知:
```swift
UNUserNotificationCenter.current().delegate = self
```
然后实现对应的代理方法:
```swift
func userNotificationCenter(_ center: UNUserNotificationCenter,
willPresent notification: UNNotification,
withCompletionHandler completionHandler: @escaping (UNNotificationPresentationOptions) -> Void) {
print("Received push: \(notification.request.content.userInfo)")
completionHandler([.banner, .sound])
}
```
这样你可以捕获到前台的所有通知内容(包括“隐式”来的推送)。
3. 排查是否来自第三方 SDK
- 一些广告 SDK 或统计 SDK(如 Firebase、OneSignal、UMeng、友盟推送等)可能会在未主动调用的情况下触发推送。
- 检查 Podfile 或项目依赖中是否引入了这些库。
- 查看是否有注册远程通知的代码,如:
```swift
UIApplication.shared.registerForRemoteNotifications()
```
4. 通过 Apple Push Notification Server (APNs) 日志分析
如果你有服务器端的推送服务,可通过日志确认发送记录。如果你没发送,但 App 收到通知,很可能是第三方服务或者系统行为。
---
二、判断“隐式推送”的常见来源
| 来源 | 特征 | 查找方式 |
|------------------|--------------------------------------------|--------------------------------------------|
| 系统服务 | 如 Apple ID、App Store 更新提醒 | Console.app 过滤 apsd 或 system push 日志 |
| 第三方 SDK 推送 | 广告、数据采集相关 | 检查是否集成第三方 SDK,是否有自动注册行为 |
| 静默推送 | `content-available: 1` 的推送 | App 无 UI 弹窗,但后台会收到通知 |
| Safari PWA 推送 | iOS 16.4+ 支持网页推送 | 检查是否有网页注册通知 |
---
三、附加建议
- 在 Xcode 中设置断点 `-[UIApplication registerForRemoteNotifications]` 可监控哪些地方调用了注册推送。
- 使用 `OS_ACTIVITY_MODE=disable` 启动 App 时可以屏蔽 Xcode 的杂项日志,更容易聚焦推送相关输出。
---
你是想排查哪种类型的隐式推送?(系统的、第三方 SDK 的、还是其他?)