【ThirdParty】iOS-友盟推送

Demo:(XSLC项目,未上线)
参考文档: http://dev.umeng.com/push/ios/integration

开通友盟的消息推送服务
  • 添加应用并上传证书
【ThirdParty】iOS-友盟推送_第1张图片
【ThirdParty】iOS-友盟推送_第2张图片

因为本项目的开发证书我已经申请过了,当时没有勾选推送的服务,现在直接选证书进去编辑.创建两种证书即可,下面演示如何创建开发环境下的证书

【ThirdParty】iOS-友盟推送_第3张图片
【ThirdParty】iOS-友盟推送_第4张图片

文件名为:aps_development.cer的是推送证书


【ThirdParty】iOS-友盟推送_第5张图片

双击开发证书,会打开钥匙串

【ThirdParty】iOS-友盟推送_第6张图片
【ThirdParty】iOS-友盟推送_第7张图片
【ThirdParty】iOS-友盟推送_第8张图片

照样创建生产的推送证书即可

然后你会发现,推送证书的两个证书都是可用的了

【ThirdParty】iOS-友盟推送_第9张图片
  • 配置向导
【ThirdParty】iOS-友盟推送_第10张图片
集成推送

注意:友盟推送不支持pod

  • 手动导入SDK


    【ThirdParty】iOS-友盟推送_第11张图片
  • 打开推送开关
    点击项目---->TARGET---->Capabilities,将这里的Push Notification的开关打开

【ThirdParty】iOS-友盟推送_第12张图片
代码部分
  • 实现基本推送

AppDelegate中

//友盟推送
#import "UMessage.h"
#import 
实现协议

AppDelegate中的didFinishLaunchingWithOptions中

   //友盟推送
    [UMessage startWithAppkey:@"你的key" launchOptions:launchOptions];
    //注册通知,如果要使用category的自定义策略,可以参考demo中的代码。
    [UMessage registerForRemoteNotifications];
    //打开日志,方便调试
    [UMessage setLogEnabled:YES];
    //iOS10必须加下面这段代码。
    UNUserNotificationCenter *center = [UNUserNotificationCenter currentNotificationCenter];
    center.delegate=self;
    UNAuthorizationOptions types10=UNAuthorizationOptionBadge|  UNAuthorizationOptionAlert|UNAuthorizationOptionSound;
    [center requestAuthorizationWithOptions:types10     completionHandler:^(BOOL granted, NSError * _Nullable error)
     {
        if (granted)
        {
            //点击允许
            //这里可以添加一些自己的逻辑
        }
        else
        {
            //点击不允许
            //这里可以添加一些自己的逻辑
        }
    }];


此时项目还没有上线,没有上线的话需要我们手动一个一个的添加测试设备,需要获取这个设备的token

//现在是线下环境,用这个来获取用户token
- (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken
{
    NSLog(@"%@",[[[[deviceToken description] stringByReplacingOccurrencesOfString: @"<" withString: @""]
                  stringByReplacingOccurrencesOfString: @">" withString: @""]
                 stringByReplacingOccurrencesOfString: @" " withString: @""]);
}

以上代码,已经实现了基本的推送
此时
APP在前台显示时收不到推送
APP在后台挂起时弹出推送,点击打开APP,APP外部的未读数量在进入APP后消失
APP被杀死时弹出推送,点击打开APP,APP外部的未读数量在进入APP后消失

  • 实现页面跳转,分三种状态:APP未启动时,APP在前台(任何界面),APP在后台

以下代码,实现了下面内容
APP未启动时
在前台首页时
在前台二级页面时
在后台时
均可以推送,点击顶部或下拉屏幕上的推送进入相应的页面,
APP上均显示未读消息数
点击顶部或下拉屏幕上的推送,或是点击APP进入应用,再退出应用,APP外的未读消息数均会消失

但是有以下几个问题:
1.不管什么时候来推送,顶部或下拉屏幕上都会显示,同时APP外面有未读消息数,但是点击APP直接进入不会跳入相应的页面
2.当在在前台首页时或在前台二级页面来推送时,会同时显示顶部的推送和页面内的Alert提示框,如果我顶部的推送和Alert提示框均点击了,则会push两次推送界面,这个叠加了

代码如下

### (AppDelegate.h中)
@property (nonatomic,strong) NSDictionary* userInfo;

### (AppDelegate.m中)
import "UMessage.h"
import 
import "YCFPushController.h"
@interface AppDelegate ()
@end

//pragma mark - 应用程序准备开始运行
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    //友盟推送
    [UMessage startWithAppkey:@"591eada875ca35626f000812" launchOptions:launchOptions];
    //注册通知,如果要使用category的自定义策略,可以参考demo中的代码。
    [UMessage registerForRemoteNotifications];
    //打开日志,方便调试
    [UMessage setLogEnabled:YES];
    //iOS10必须加下面这段代码。
    UNUserNotificationCenter *center = [UNUserNotificationCenter currentNotificationCenter];
    center.delegate=self;
    UNAuthorizationOptions types10=UNAuthorizationOptionBadge|  UNAuthorizationOptionAlert|UNAuthorizationOptionSound;
    [center requestAuthorizationWithOptions:types10     completionHandler:^(BOOL granted, NSError * _Nullable error)
     {
        if (granted)
        {
            //点击允许
            //这里可以添加一些自己的逻辑
        }
        else
        {
            //点击不允许
            //这里可以添加一些自己的逻辑
        }
    }];


    ###1.APP未启动时添加下面代码,其实不添加下面这段代码,APP未启动时也能收到推送
    NSDictionary* userInfo = [launchOptions objectForKey:UIApplicationLaunchOptionsRemoteNotificationKey];
    if(userInfo)
    {
        NSLog(@"未启动时有消息,保存");
        self.userInfo = userInfo;//[userInfo copy]
    }

}

###2.iOS10以下,APP在前台(任何界面)和APP在后台均在下面方法中实现
- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo
{
    _userInfo = userInfo;
    //关闭友盟自带的弹出框
    [UMessage setAutoAlert:YES];
    //收到远程通知
    [UMessage didReceiveRemoteNotification:userInfo];
    if ([UIApplication sharedApplication].applicationState == UIApplicationStateActive)
    {
         NSLog(@"APP内,不知道要干嘛");
        UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"标题"
                                                            message:@"Test On ApplicationStateActive"
                                                           delegate:self
                                                  cancelButtonTitle:@"不去"
                                                  otherButtonTitles:@"去看看",nil];
        [alertView show];
    }
    else
    {
        NSLog(@"APP外,直接跳转");
    }
}

###3.iOS10,APP在前台(任何界面)在下面方法中实现
-(void)userNotificationCenter:(UNUserNotificationCenter *)center willPresentNotification:(UNNotification *)notification withCompletionHandler:(void (^)(UNNotificationPresentationOptions))completionHandler
{
    NSDictionary * userInfo = notification.request.content.userInfo;
    _userInfo = userInfo;
    if([notification.request.trigger isKindOfClass:[UNPushNotificationTrigger class]])
    {
        //自定义弹出框
        UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"标题"
                                                            message:@"接收到了推送消息"
                                                           delegate:self
                                                  cancelButtonTitle:@"不去"
                                                  otherButtonTitles:@"去看看",nil];
        [alertView show];
        //关闭友盟自带的弹出框
        [UMessage setAutoAlert:NO];
        [UMessage didReceiveRemoteNotification:userInfo];
    }
    else
    {
        //应用处于前台时的本地推送接受
    }
    //当应用处于前台时提示设置,需要哪个可以设置哪一个
    completionHandler(UNNotificationPresentationOptionSound|UNNotificationPresentationOptionBadge|UNNotificationPresentationOptionAlert);
}

###4.iOS10,APP在后台在下面方法中实现
-(void)userNotificationCenter:(UNUserNotificationCenter *)center didReceiveNotificationResponse:(UNNotificationResponse *)response withCompletionHandler:(void (^)())completionHandler
{
    NSDictionary * userInfo = response.notification.request.content.userInfo;
    _userInfo = userInfo;
    if([response.notification.request.trigger isKindOfClass:[UNPushNotificationTrigger class]])
    {
        //应用处于后台时的远程推送接受
        [UMessage didReceiveRemoteNotification:userInfo];
    }
    else
    {
        //应用处于后台时的本地推送接受
    }
    [self didGetPushNotifi];
}

//alertView代理方法
-(void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex
{
    //点击去看看
    if (buttonIndex==1)
    {
       [self didGetPushNotifi];
    }
}

//其他
-(void)didGetPushNotifi
{
    //友盟推送,跳转到指定页面,处理程序已启动(在后台或者程序内)
    NSString *pushName = [[_userInfo objectForKey:@"aps"] objectForKey:@"url"];
    if(![pushName isNotBlank])
    {
        NSLog(@"无,不操作");
    }
    else
    {
        [self getPushInfo:_userInfo];
    }
}

-(void)getPushInfo:(NSDictionary *)userInfo
{
    NSLog(@"userInfo是什么%@,跳转至其他界面",userInfo);
    NSString *url = userInfo[@"aps"][@"url"];
    YCFPushController *controller = [[YCFPushController alloc] initWithURL:url];
    [((YCFMainController *)self.window.rootViewController).selectedViewController  pushViewController:controller animated:YES];
}



推送

进入后台
消息列表的消息是发送给线上用户的
测试模式的消息是让未上线的项目使用的,没有全选中所有安装项目的设备的入口,只能一个一个的添加

【ThirdParty】iOS-友盟推送_第13张图片
【ThirdParty】iOS-友盟推送_第14张图片

你可能感兴趣的:(【ThirdParty】iOS-友盟推送)