iOS学习 --- 接入信鸽推送功能(V3.2.0 2018-09-11)(一)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/jiaxin_1105/article/details/82626023

前言

最近公司项目在接入信鸽推送功能,详细记录下整个过程。。。

一,信鸽后台创建iOS应用

  1. 注册信鸽推送开发账号,并登陆;
  2. 登录成功后,右上角“个人中心”,下拉列表点击“应用列表”创建iOS应用。

选择平台

填写配置(证书可以暂时不上传,后面补填即可)

应用创建完成

应用配置(证书)

二,APNs推送证书制作并上传至信鸽后台(开发证书,生产证书)

参考信鸽官方文档 iOS推送证书说明

三,下载官方SDK

SDK地址

四,配置工程

参考信鸽文档 iOS集成接入指南

注意:

checkTargetOtherLinkFlagForObjc报错,是因为build setting中,Other link flags未添加-ObjC

参考文章

iOS Bug --- 信鸽推送报错:+[NSObject checkTargetOtherLinkFlagForObjc]: unrecognized selector sent to ......

五,主要代码

  • 引入头文件,并遵守协议
#import "XGPush.h"

#if __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_10_0
#import <UserNotifications/UserNotifications.h>
#endif
@interface AppDelegate ()<XGPushDelegate>

@end
  •   注册苹果推送服务
- (BOOL)application:(UIApplication *)application
didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {

[self registerAPNS];

}

- (void)registerAPNS {
    float sysVer = [[[UIDevice currentDevice] systemVersion] floatValue];
#if __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_10_0
    if (sysVer >= 10) {
        // iOS 10
        [self registerPush10];
#endif
    if (sysVer < 8) {
        // before iOS 8
        [self registerPushBefore8];
    } else {
        // iOS 8-9
        [self registerPush8to9];
    }
}
- (void)registerPush10{
#if __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_10_0
//请求通知权限,本地和远程公用
    UNUserNotificationCenter *center = [UNUserNotificationCenter currentNotificationCenter];
    [center requestAuthorizationWithOptions:UNAuthorizationOptionBadge | UNAuthorizationOptionSound | UNAuthorizationOptionAlert completionHandler:^(BOOL granted, NSError * _Nullable error) {
        if (granted) {
          //请求成功
        }else{
          //请求失败
        }
    }];
//设置通知的代理
    center.delegate = self;
//注册远程通知
    [[UIApplication sharedApplication] registerForRemoteNotifications];

#endif
}

- (void)registerPush8to9{
    UIUserNotificationType types = UIUserNotificationTypeBadge | UIUserNotificationTypeSound | UIUserNotificationTypeAlert;
    UIUserNotificationSettings *mySettings = [UIUserNotificationSettings settingsForTypes:types categories:nil];
    [[UIApplication sharedApplication] registerUserNotificationSettings:mySettings];
//注册远程通知
    [[UIApplication sharedApplication] registerForRemoteNotifications];
}

- (void)registerPushBefore8{
    [[UIApplication sharedApplication] registerForRemoteNotificationTypes:(UIRemoteNotificationTypeAlert | UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeSound)];
}
  • 启动信鸽推送服务 

通过使用在信鸽官网注册的应用的信息,启动信鸽推送服务,参数说明如下:

appID:通过前台申请的应用 ID, 即 Access ID

appKey: 通过前台申请的 appKey,即 Access Key

delegate:回调对象

- (BOOL)application:(UIApplication *)application
didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    
    //开启debug模式,打印log信息
    [[XGPush defaultManager] setEnableDebug:YES];
    //初始化信鸽
    [[XGPush defaultManager] startXGWithAppID:2200319067 appKey:@"I89PBJ5G62KU"  delegate:self];
    //角标设置为0
    [[XGPush defaultManager] setXgApplicationBadgeNumber:0];
    //为了更好的了解每一条推送消息的运营效果,需要将用户对消息的行为上报
    [[XGPush defaultManager] reportXGNotificationInfo:launchOptions];
    
}
  • 判断程序是不是由推送打开

- (BOOL)application:(UIApplication *)application
didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {

    if (launchOptions) {
        self.isLaunchedByNotification = YES;
        NSDictionary *pushNotificationKey = [launchOptions objectForKey:UIApplicationLaunchOptionsRemoteNotificationKey];
        [self performSelector:@selector(receiveRemoteNotificationWithUserInfo:) withObject:pushNotificationKey afterDelay:1.0];
    }else{
        self.isLaunchedByNotification = NO;
    }
}
    //可以通过launchOptions这个参数是否为空来判断程序是否是点击推送消息启动了应用。launchOptions有几个key:
    //UIApplicationLaunchOptionsRemoteNotificationKey返回一个远程推送的userInfo字典类型参数;
    //UIApplicationLaunchOptionsLocalNotificationKey返回一个UILocalNotification对象;
    //receiveRemoteNotificationWithUserInfo:这个方法用来处理接收到的通知,如通过推送过来的userInfo中的内容跳转不同的界面;
  •   注册信鸽

在V3.2.0中注册信鸽是在 SDK内部做的,项目中可以通过下面方法获取到注册的deviceToken ,一般这个deviceToken要上传到服务端,然后服务端通过deviceToken发送推送消息。

- (void)application:(UIApplication *)application
didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken {
    
    //将来需要将此Token上传给后台服务器
    NSString *XGPushtokenStr = [[XGPushTokenManager defaultTokenManager] deviceTokenString];
    NSLog(@"XGPushtokenStr===>%@",XGPushtokenStr);
}

********************************************************************************************************************************** 

  • iOS10之前通知的处理方法(2个)
/**
 在iOS10 以前 收到推送分为下面两种形式,如果有方法1,方法2,方法1就不会执行
 */
//iOS 3-10
- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo{
    NSLog(@"%s======》",__func__);
    
    NSString *zero =[[[userInfo objectForKey:@"aps"] objectForKey:@"alert"] objectForKey:@"body"];
    if (application.applicationState == UIApplicationStateActive) {
        [self showAlertViewWithTitle:@"新消息提示" Message:zero ConfirmTitle:@"确定" CancelTitle:nil];
    }
    [self receiveRemoteNotificationWithUserInfo:userInfo];
    
}
/**
iOS7 +
iOS10之前,接收远程通知时,不管在前台、后台还是程序杀死都会调用此方法
在前台,App内展示alert
在后台,点击弹框,进入App
 */
- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler {
    NSLog(@"%s",__func__);

    NSLog(@"[XGDemo] receive slient Notification");
    NSLog(@"[XGDemo] userinfo %@", userInfo);

    if (self.isLaunchedByNotification == NO) {
        NSString *zero =[[[userInfo objectForKey:@"aps"] objectForKey:@"alert"] objectForKey:@"body"];
        if (application.applicationState == UIApplicationStateActive) {
            //iOS10之前,在前台时用自定义AlertView展示消息
            [self showAlertViewWithTitle:@"新消息提示" Message:zero ConfirmTitle:@"确定" CancelTitle:nil];
            [self receiveRemoteNotificationWithUserInfo:userInfo];
        }else {
            [self receiveRemoteNotificationWithUserInfo:userInfo];
        }
    }else{
        self.isLaunchedByNotification = NO;
    }

    //iOS 9.x 及以前,需要在 UIApplicationDelegate 的回调方法(如下)中调用上报数据的接口
    [[XGPush defaultManager] reportXGNotificationInfo:userInfo];
    completionHandler(UIBackgroundFetchResultNewData);

}

 **********************************************************************************************************************************

  • iOS10之后通知的处理方法 

1,前台运行

前台运行: 指的是程序正在运行中, 用户能看见程序的界面.

iOS10会出现通知横幅, 而在以前的框架中, 前台运行时, 不会出现通知的横幅.


/**
   iOS 10 新增 API
   iOS 10 会走新 API, iOS 10 以前会走到老 API
   App 在前台弹通知需要调用这个接口
 */

#if __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_10_0

- (void)xgPushUserNotificationCenter:(UNUserNotificationCenter *)center willPresentNotification:(UNNotification *)notification withCompletionHandler:(void (^)(UNNotificationPresentationOptions))completionHandler {
    [[XGPush defaultManager] reportXGNotificationInfo:notification.request.content.userInfo];
    //可设置是否在应用内弹出通知
    completionHandler(UNNotificationPresentationOptionBadge | UNNotificationPresentationOptionSound | UNNotificationPresentationOptionAlert);
}

#endif
  • iOS10之后通知的处理方法

2,后台运行及程序退出 会调用的方法


/**
   iOS 10 新增 API
   iOS 10 会走新 API, iOS 10 以前会走到老 API
   App 用户点击通知
   App 用户选择通知中的行为
   App 用户在通知中心清除消息
   无论本地推送还是远程推送都会走这个回调
 */
#if __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_10_0
- (void)xgPushUserNotificationCenter:(UNUserNotificationCenter *)center didReceiveNotificationResponse:(UNNotificationResponse *)response withCompletionHandler:(void (^)(void))completionHandler {
     NSLog(@"%s",__func__);
    [[UIApplication sharedApplication] setApplicationIconBadgeNumber:0];
    NSLog(@"Userinfo %@",response.notification.request.content.userInfo);
    //处理接收到的消息
    [self receiveRemoteNotificationWithUserInfo:response.notification.request.content.userInfo];
    [[XGPush defaultManager] reportXGNotificationResponse:response];
    completionHandler();
}

#endif

**********************************************************************************************************************************

  • 查询信鸽注册结果
/**
 @brief 注册设备token的回调
 
 @param deviceToken 当前设备的token
 @param error 错误信息
注意:此回调方法在注册成功之后调用,当前的 Token 已经注册过之后,SDK 将缓存注册信息,此方法将不会再调用
 */
- (void)xgPushDidRegisteredDeviceToken:(NSString *)deviceToken error:(NSError *)error{
    NSLog(@"======》%s",__func__);
    NSLog(@"xgPushDidRegisteredDeviceToken===>%s, result %@, error %@", __FUNCTION__, error?@"NO":@"OK", error);
}
  • 监控信鸽推送服务的启动情况
/**
 @brief 监控信鸽推送服务的启动情况

 @param isSuccess 信鸽推送是否启动成功
 @param error 信鸽推送启动错误的信息
 */
-(void)xgPushDidFinishStart:(BOOL)isSuccess error:(NSError *)error{
    NSLog(@"======》%s",__func__);
    NSLog(@"%@ error %@",isSuccess? @"Success":@"Fail",error);
}
  • 远程通知注册失败代理方法
/**
 远程通知注册失败代理方法
 */

-(void)application:(UIApplication *)application didFailToRegisterForRemoteNotificationsWithError:(NSError *)error{
    NSLog(@"%s",__func__);
    NSLog(@"[XGDemo] register APNS fail.\n[XGDemo] reason : %@", error);
    //    [[NSNotificationCenter defaultCenter] postNotificationName:@"registerDeviceFailed" object:nil];
}

六,信鸽后台调试

信鸽后台 http://xg.qq.com

应用列表-->历史明细

七。。。。。

相关文章:

IOS 普通推送和静默推送

iOS学习笔记5-推送(信鸽推送)

iOS 信鸽推送

记录iOS 10信鸽推送适配

iOS手把手教你生成推送证书(测试和生产)

iOS静默通知

关于推送消息的处理

猜你喜欢

转载自blog.csdn.net/jiaxin_1105/article/details/82626023