消息推送

APNs推送

配置证书

详细的证书制作及上传请参考文档:制作推送证书并在管理后台配置

注册推送服务

需在 App 启动时注册推送服务:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    ...
    //注册 APNS
    if ([[[UIDevice currentDevice] systemVersion] doubleValue] >= 10.0) {
        [UNUserNotificationCenter currentNotificationCenter].delegate = self;
        UIUserNotificationType types = UNAuthorizationOptionAlert | UNAuthorizationOptionBadge | UNAuthorizationOptionSound;
        [[UNUserNotificationCenter currentNotificationCenter] requestAuthorizationWithOptions:types completionHandler:nil];
        [[UIApplication sharedApplication] registerForRemoteNotifications];
    } else if ([[[UIDevice currentDevice] systemVersion] doubleValue] >= 8.0) {
        UIUserNotificationType types = UIUserNotificationTypeAlert | UIUserNotificationTypeBadge | UIUserNotificationTypeSound;
        UIUserNotificationSettings *settings = [UIUserNotificationSettings settingsForTypes:types categories:nil];
        [[UIApplication sharedApplication] registerUserNotificationSettings:settings];
        [[UIApplication sharedApplication] registerForRemoteNotifications];
    } else {
        UIRemoteNotificationType types = UIRemoteNotificationTypeAlert | UIRemoteNotificationTypeSound | UIRemoteNotificationTypeBadge;
        [[UIApplication sharedApplication] registerForRemoteNotificationTypes:types];
    }
    ...
}

注意 iOS10 及以上系统推送相关 API 变化较大,可分系统做注册处理。

获取到设备的 DeviceToken 后,传给 SDK:

- (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken {
    ...
    [[QYSDK sharedSDK] updateApnsToken:deviceToken];
    ...
}

常见问题

  1. 无法正常推送

    • 检查管理端 App接入 中是否配置过推送证书 p12 文件,此证书是否就是此 App bundleID 关联的推送证书。

    • 检查初始化时填的 AppName 是否和管理端 添加一个App 时填写的 App名称 一致。

    • 检查证书的线上、测试环境是否跟管理后台配置的相同。请注意,若您想同时在 Debug 包和 Release 包中均接收推送消息,应添加两个 App,分别填入不同的名称并上传线上环境和测试环境的证书,同时在注册 AppKey 的地方这样写代码:

      #if DEBUG
          [[QYSDK sharedSDK] registerAppId:Appkey appName:Debug包App名称];
      #else
          [[QYSDK sharedSDK] registerAppId:Appkey appName:Release包App名称];
      #endif
      
    • 检查 provision profile 是否包含了推送证书。

    • 检查推送证书中是否有 p12 文件。

    • 检查代码调试是否可以获取到 DeviceToken。

    • 使用第三方推送工具(例如 Pusher )检查是否可以正常推送,如果不能,说明可能是证书本身的问题。

  2. 可以同时使用第三方推送工具吗

    • 可以同时使用第三方推送工具和 SDK 的消息推送,两者可以共存,不会有任何冲突。
  3. 能否区分出哪些推送消息是来自七鱼的

    • 所有来自七鱼的推送消息中payload都带有nim:1,以此可判断是否为七鱼的推送消息。

七鱼系统推送

七鱼系统推送与苹果的 APNs 推送无关。开发者可以主动要求服务器推送指定ID的消息,调用[QYSDK sharedSDK]单例接口:

/**
 *  获取推送消息
 *
 *  @param messageId 消息id
 */
- (void)getPushMessage:(NSString *)messageId;

同时,需注册推送消息通知回调:

/**
 *  推送消息回调
 */
typedef void(^QYPushMessageBlock)(QYPushMessage *pushMessage);

/**
 *  注册推送消息通知回调
 *
 *  @param block 收到消息的回调
 */
- (void)registerPushMessageNotification:(QYPushMessageBlock)block;

收到服务器返回的消息后,进行界面展示;无论是主动获取的消息还是管理后台主动推送的消息,均采用统一接口回调。