# iOS 推送接入指南

**模块**：`XuqmPush` · **支持**：APNs（默认）、FCM（可选）

---

## 1. 添加依赖

在 `Package.swift` 中按需引入：

```swift
.target(
    name: "MyApp",
    dependencies: [
        .product(name: "XuqmPush", package: "XuqmGroup-iOSSDK"),
    ]
)
```

如需 FCM 支持，额外在 Xcode 中集成 `FirebaseMessaging`。

---

## 2. 申请通知权限

在应用启动时请求用户授权：

```swift
import XuqmPush

let granted = try await PushSDK.shared.requestAuthorization(options: [.alert, .badge, .sound])
if granted {
    print("用户已授权通知")
}
```

`requestAuthorization` 内部会自动调用 `UIApplication.shared.registerForRemoteNotifications()`，无需额外处理。

---

## 3. 注册 APNs Token

在 `AppDelegate` 中转发系统回调：

```swift
import XuqmSDK

func application(
    _ application: UIApplication,
    didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data
) {
    // 将 deviceToken 转发生给 SDK
    XuqmSDK.shared.registerDeviceToken(deviceToken)
}

func application(
    _ application: UIApplication,
    didFailToRegisterForRemoteNotificationsWithError error: Error
) {
    print("注册远程通知失败: \(error.localizedDescription)")
}
```

> `XuqmSDK.shared.login()` 成功后会自动将 APNs Token 上报到 Push 服务端，业务层无需手动调用 `PushSDK.shared.registerDeviceToken()`。

---

## 4. FCM 支持（可选）

如需集成 Firebase Cloud Messaging：

1. 在 Xcode 中添加 `FirebaseMessaging` 依赖
2. 配置 `GoogleService-Info.plist`
3. 在获取到 FCM Token 后手动注册：

```swift
import XuqmPush

// 在 Firebase Messaging 回调中获取 FCM Token
func messaging(_ messaging: Messaging, didReceiveRegistrationToken fcmToken: String?) {
    guard let token = fcmToken else { return }
    try await PushSDK.shared.registerFcmToken(token, userId: "user_001")
}
```

可通过 `PushSDK.shared.isFcmAvailable` 检查当前是否编译了 FCM：

```swift
if PushSDK.shared.isFcmAvailable {
    print("FCM 模块已集成")
}
```

---

## 5. 接收推送消息

实现 `PushMessageDelegate` 处理推送消息：

```swift
import XuqmPush

class MyPushHandler: NSObject, PushMessageDelegate {
    func pushSDK(_ sdk: PushSDK, didReceiveMessage message: PushMessage) {
        // 应用在前台时收到通知
        print("收到推送: \(message.title ?? "") - \(message.body ?? "")")
        print("Payload: \(message.payload)")
    }
    
    func pushSDK(_ sdk: PushSDK, didTapNotification message: PushMessage) {
        // 用户点击通知栏消息
        print("用户点击了通知: \(message.title ?? "")")
        // 可在此跳转至对应会话页面
    }
}

// 设置代理
PushSDK.shared.delegate = MyPushHandler()
```

`PushSDK` 内部已实现 `UNUserNotificationCenterDelegate`，会自动处理前台展示和点击事件。业务层只需设置 `delegate` 即可接收回调。

---

## 6. 多模块统一登录

Push 模块与 IM、Update 模块共享同一套登录态：

```swift
// 登录成功后自动触发
try await XuqmSDK.shared.login(userId: "user_001", userSig: userSig)
// ↓ 自动触发
//   · PushSDK 注册 APNs Token 并上报
```

---

## 7. 登出时注销 Token

```swift
try await PushSDK.shared.unregisterToken(userId: "user_001")
```
