友盟+搜索

{{errorMsg}}

版本简介:

 介绍

【友盟+】消息推送组件帮助您实时的推送消息给用户。

版本号:v1.5.0

更新说明 

  1. 新增应用内消息功能,丰富提醒用户的场景;
  2. 优化消息打开的统计策略。

提示
查看老版本的文档可以点击这里
遇到问题可以查看论坛帖子,绝大多数问题都可以在论坛找到:进入问题索引页

 集成前的准备

集成之前, 请在http://push.umeng.com/申请开通【友盟+】消息推送服务。

下载 UMessage_Sdk_All_x.x.x.zip并解压缩

下载的压缩包中将包括以下内容:

文件名称 介绍
UMessage_Sdk_Introductions.html 该文件介绍如何使用【友盟+】消息推送SDK
UMessage_Sdk_ReleaseNotes.html 该文件记录了【友盟+】消息推送SDK的更新日志
UMessage_Sdk_Api_Reference/ 该文件夹中包含了【友盟+】消息推送的API文档
UMessage_Sdk_x.x.x/ 该文件夹中包含了SDK的库文件
UMessage_Sdk_Demo/ 该文件夹中包含了示例工程
NotificatonService/ iOS10的Notificaton Service

提示
集成1.4.0以上版本的SDK,必须使用XCode8+的版本来集成。因为iOS10中更改了推送消息的接口,增加了一个UserNotifications的Framework。如果要适配iOS8以下版本,可以将低版本的SDK的Disk image加入到XCode8中,进行适配。

基本功能

 应用配置

提示
请先在【友盟+】消息推送管理后台中创建App,获得AppKey和AppSecret

    导入SDK

    所需SDK文件夹:UMessage_Sdk_x.x.x
    请在你的工程目录结构中,右键选择Add->Existing Files…,选择这个文件夹。或者将这个文件夹拖入XCode工程目录结构中,在弹出的界面中勾选Copy items into destination group's folder(if needed), 并确保Add To Targets勾选相应的target。

    引入库文件

    增加UserNotifications.framework到项目中。
    具体操作如下:点击项目---->TARGET---->Build Phases---->Link Binary with Libraries ---->左侧+号---->搜索UserNotifications---->选中UserNotifications.framework---->点击Add

    配置(可选)

    SDK采用ARC管理内存,非ARC项目也是默认支持,如遇问题,请联系我们

    如果您使用了-all_load,可能需要添加libz的库:
    TARGETS-->Build Phases-->Link Binary With Libraries--> + -->libz.dylib

    说明
    SDK支持iOS 7.0+

    打开推送开关

    点击项目---->TARGET---->Capabilities,将这里的Push Notification的开关打开,效果如图所示: 这里写图片描述

    注意:一定要打开Push Notification,且两个steps都是正确的,否则会报如下错误:Code=3000 "未找到应用程序的“aps-environment”的授权字符串"

    集成推送

    打开*AppDelegate.m

    引入头文件

    引入UMessage.h,UserNotifications.h

    设置代理

    设置UNUserNotificationCenterDelegate

    适配Https

    [UMessage startWithAppkey:@"your appkey" launchOptions:launchOptions httpsenable:YES ];

    将初始化方法的httpsenable 的Value设置为YES。

    初始化

    didFinishLaunchingWithOptions中的设置:

    [UMessage startWithAppkey:@"your appkey" launchOptions:launchOptions];
        //注册通知,如果要使用category的自定义策略,可以参考demo中的代码。
        [UMessage registerForRemoteNotifications];
    
        //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 {
            //点击不允许
            //这里可以添加一些自己的逻辑
        }
    }];
    

    打开日志调试

    didFinishLaunchingWithOptions中的设置:

    //打开日志,方便调试
    [UMessage setLogEnabled:YES];
    

    完整的初始化代码

    - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
    {
        //初始化方法,也可以使用(void)startWithAppkey:(NSString *)appKey launchOptions:(NSDictionary * )launchOptions httpsenable:(BOOL)value;这个方法,方便设置https请求。
        [UMessage startWithAppkey:@"your appkey" launchOptions:launchOptions];
        //注册通知,如果要使用category的自定义策略,可以参考demo中的代码。
        [UMessage registerForRemoteNotifications];
    
        //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 {
            //点击不允许
            //这里可以添加一些自己的逻辑
        }
    	}];
    	//打开日志,方便调试
    	[UMessage setLogEnabled:YES];
    }
    
    

    说明
    didRegisterForRemoteNotificationsWithDeviceToken中设置(1.2.7开始可以不用设置)

    - (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken
    {
        // 1.2.7版本开始不需要用户再手动注册devicetoken,SDK会自动注册
        //[UMessage registerDeviceToken:deviceToken];
    }
    
    

    接受通知

    关闭自带的弹出框

    //关闭U-Push自带的弹出框
    [UMessage setAutoAlert:NO];
    

    统计点击数

    [UMessage didReceiveRemoteNotification:userInfo];
    

    完整的接受通知代码

    
    //iOS10以下使用这个方法接收通知
    - (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo
    {
        //关闭U-Push自带的弹出框
            [UMessage setAutoAlert:NO];
        [UMessage didReceiveRemoteNotification:userInfo];
        
        //    self.userInfo = userInfo;
        //    //定制自定的的弹出框
        //    if([UIApplication sharedApplication].applicationState == UIApplicationStateActive)
        //    {
        //        UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"标题"
        //                                                            message:@"Test On ApplicationStateActive"
        //                                                           delegate:self
        //                                                  cancelButtonTitle:@"确定"
        //                                                  otherButtonTitles:nil];
        //
        //        [alertView show];
        //
        //    }
    }
    
    //iOS10新增:处理前台收到通知的代理方法
    -(void)userNotificationCenter:(UNUserNotificationCenter *)center willPresentNotification:(UNNotification *)notification withCompletionHandler:(void (^)(UNNotificationPresentationOptions))completionHandler{
        NSDictionary * userInfo = notification.request.content.userInfo;
        if([notification.request.trigger isKindOfClass:[UNPushNotificationTrigger class]]) {
            //应用处于前台时的远程推送接受
            //关闭U-Push自带的弹出框
            [UMessage setAutoAlert:NO];
            //必须加这句代码
            [UMessage didReceiveRemoteNotification:userInfo];
            
        }else{
            //应用处于前台时的本地推送接受
        }
        //当应用处于前台时提示设置,需要哪个可以设置哪一个
        completionHandler(UNNotificationPresentationOptionSound|UNNotificationPresentationOptionBadge|UNNotificationPresentationOptionAlert);
    }
    
    //iOS10新增:处理后台点击通知的代理方法
    -(void)userNotificationCenter:(UNUserNotificationCenter *)center didReceiveNotificationResponse:(UNNotificationResponse *)response withCompletionHandler:(void (^)())completionHandler{
        NSDictionary * userInfo = response.notification.request.content.userInfo;
        if([response.notification.request.trigger isKindOfClass:[UNPushNotificationTrigger class]]) {
            //应用处于后台时的远程推送接受
            //必须加这句代码
            [UMessage didReceiveRemoteNotification:userInfo];
            
        }else{
            //应用处于后台时的本地推送接受
        }
    }
    
    

    说明
    如需关闭推送,请使用[UMessage unregisterForRemoteNotifications](在iOS10.0、iOS10.1系统上,此功能存在系统bug,建议不要使用。出现的bug会导致关闭推送后无法打开推送。)

    关于iOS如何在接收到推送后打开指定页面,可以看论坛帖子:iOS如何调转跳转到指定页面

    至此,消息推送基本功能的集成已经完成。

    高级功能

     高级功能集成指南

    自定义推送显示按钮

    推送消息被下拉、左划以及3D Touch设备的点击,可以执行预先设定好的操作,如确认、取消、快捷回复等。

    如iOS10以下的系统效果下图所示:

    修改增加

    如iOS10以上的系统分为3D Touch设备和非3D Touch设备,具体的效果如下所示。

    非3D Touch

    3D Touch

    注意:使用此功能,设备的系统版本需在iOS8及以上。

    编写策略代码

    
    iOS10以前的UIUserNotificationAction相关属性
    // 行为标识符,用于调用代理方法时识别是哪种行为。
    @property (nonatomic, copy, readonly) NSString *identifier;
    // 行为名称。
    @property (nonatomic, copy, readonly) NSString *title;
    // 即行为是否打开APP。
    @property (nonatomic, assign, readonly) UIUserNotificationActivationMode activationMode;
    // 是否需要解锁。
    @property (nonatomic, assign, readonly, getter=isAuthenticationRequired) BOOL authenticationRequired;
    // 这个决定按钮显示颜色,YES的话按钮会是红色。
    @property (nonatomic, assign, readonly, getter=isDestructive) BOOL destructive;
    
    
    
    iOS10的UNNotificationAction相关属性
    // The unique identifier for this action.
    @property (NS_NONATOMIC_IOSONLY, copy, readonly) NSString *identifier;
    
    // The title to display for this action.
    @property (NS_NONATOMIC_IOSONLY, copy, readonly) NSString *title;
    
    // The options configured for this action.
    @property (NS_NONATOMIC_IOSONLY, readonly) UNNotificationActionOptions options;
        
    

    调用U-Push的自定义注册方法

    
    //iOS10以前注册category
    NSSet *categories = [NSSet setWithObject:actionCategory1];
    [UMessage registerForRemoteNotifications:categories];
    
    //iOS10注册category
    NSSet *categories_ios10 = [NSSet setWithObjects:category1_ios10, nil];
    [center setNotificationCategories:categories_ios10];
    
    

    添加并运行接收通知代码

    
    //iOS10以前接收的方法
    -(void)application:(UIApplication *)application handleActionWithIdentifier:(NSString *)identifier forRemoteNotification:(NSDictionary *)userInfo completionHandler:(void (^)())completionHandler
    {
    		//这个方法用来做action点击的统计
           [UMessage sendClickReportForRemoteNotification:userInfo];
    		//下面写identifier对各个交互式的按钮进行业务处理
    }
    
    
    //iOS10以后接收的方法
    -(void)userNotificationCenter:(UNUserNotificationCenter *)center didReceiveNotificationResponse:(UNNotificationResponse *)response withCompletionHandler:(void (^)())completionHandler{
        NSDictionary * userInfo = response.notification.request.content.userInfo;
        if([response.notification.request.trigger isKindOfClass:[UNPushNotificationTrigger class]]) {
        	[UMessage didReceiveRemoteNotification:userInfo];
           if([response.actionIdentifier isEqualToString:@"*****你定义的action id****"])
           {
               
           }else
           {
               
               
           }
           //这个方法用来做action点击的统计
           [UMessage sendClickReportForRemoteNotification:userInfo];
           
            
            
        }else{
            //应用处于后台时的本地推送接受
        }
    
    }
    
    

    在U-Push后台添加推送策略

    登录账号并进入U-Push后台后,将提醒方式下方Category ID 设置为需要推送的策略的id,如下图所示:

    设置提醒方式

    使用标签

    添加tag

    示例:将标签“男”绑定至该设备:

    [UMessage addTag:@"男"
                response:^(id responseObject, NSInteger remain, NSError *error) {
             //add your codes
      }];
    
    

    小提示:tag参数既可以是NSString的单个tag,也可以是NSArray,NSSet的tag集合哦!

    删除tag

    示例:将标签"男"从设备绑定中删除:

    [UMessage removeTag:@"男"
               response:^(id responseObject, NSInteger remain, NSError *error) {
             //add your codes            
      }];
    
    

    小提示:tag参数既可以是NSString的单个tag,也可以是NSArray,NSSet的tag集合哦!

    获取tag列表

    示例: 获取tag列表

    [UMessage getTags:^(NSSet *responseTags, NSInteger remain, NSError *error) {
            //add your codes
      }];
    
    

    重置tag列表

    示例: 重置tag列表

    [UMessage removeAllTags:^(id responseObject, NSInteger remain, NSError *error) {
    
      }];
    
    

    注意
    1. 可以为单个tag(NSString)也可以为tag集合(NSArray、NSSet)
    2. 每台设备最多绑定1024个tag,超过1024个,绑定tag不再成功
    3. 单个tag最大允许长度50字节,编码UTF-8,超过长度自动截取

    使用别名

    当需要将设备标记为别名时,可用。例如:账户绑定设备。

    添加别名(addAlias)

    示例: 将新浪微博的某用户绑定至设备,老的绑定的设备还在

    [UMessage addAlias:@"test@test.com" type:kUMessageAliasTypeSina response:^(id responseObject, NSError *error) {
        }];
    
    

    注意:
    1. type的类型已经默认枚举好平台类型,在UMessage.h最上侧,形如:kUMessageAliasTypeSina

    2. type的类型如果默认的满足不了需求,可以自定义这个字段

    设置别名(setAlias)

    示例: 将新浪微博的某用户绑定至设备,覆盖老的,一一对应

    [UMessage setAlias:@"test@test.com" type:kUMessageAliasTypeSina response:^(id responseObject, NSError *error) {
        }];
    
    

    删除别名(removeAlias)

    示例: 将新浪微博的别名绑定删除

    [UMessage removeAlias:@"test@test.com" type:kUMessageAliasTypeSina response:^(id responseObject, NSError *error) {
        }];
    
    

    其他设置

    • 设置地理位置信息

      [UMessage setLocation:location];
      
      
    • 设置是否允许SDK自动清空角标(默认开启)

      [UMessage setBadgeClear:NO];
      
      
    • 设置是否允许SDK当应用在前台运行收到Push时弹出Alert框(默认开启)

      [UMessage setAutoAlert:NO];
      
      
    • 设置当前 App 的发布渠道(默认"App Store")

      [UMessage setChannel:@"App Store"]
      
      
    • 自定义弹出框后,想补发前台的消息的点击统计

      [UMessage sendClickReportForRemoteNotification:userInfo]
      
      

    静默推送

    注意:

    当app没有启动的时候或者被杀掉的时候将无法收到静默推送。

    静默推送必须实现 
    application:didReceiveRemoteNotification:fetchCompletionHandler:

    静默推送除badge及自定义字段外,不应该包含其他字段(如果要badge,建议通过本地通知实现)。

    可以去实现application:didReceiveRemoteNotification:fetchCompletionHandler:方法,在方法里面去实现自己的业务需求。

    静默推送的消息体模板如下:

     {
         "appkey":"your appkey",
         "production_mode":"false",
         "timestamp":1474340669558,
         "device_tokens":"your devicetoken",
         "type":"unicast",
         "payload":{
             "aps":{
                 "content-available" : 1
            }   
        }
    }
    

     应用内消息

    注意:该功能目前需集成v1.5.0a版本SDK方可使用。

     项目设置

    点击Target------>Build Settings------>other Linker Flags中添加一个-ObjC

    注意:-ObjC的大小写。

     开屏消息

    开屏消息就是当APP启动,或者从其他页面跳转到APP时,调用的一个启动页面,即Launchimage。

    开屏消息

     默认图设置

    为了保证项目开屏的美观,请务必添加完整的LaunchImage启动图,或者一个添加一张750*1334的名为Launchplaceholder的图片(否则会显示一个黑屏状态)。

    如果要适配iOS7,请务必添加完整的LaunchImage启动图,或者在LaunchImage添加一张640*1136的图片。

    注意:不支持横屏。

     Status Bar设置

    如果需要屏蔽Status Bar,在Info.plist中增加一个View controller-based status bar appearance参数,并且设置为NO。

     打开开发模式

    addLaunchMessageWithFinishHandler之前调用openDebugMode:YES,不写默认为生产模式。

    [UMessage openDebugMode:YES];
    [UMessage addLaunchMessageWithWindow:self.window finishViewController:ViewController];
    
    

     增加开屏消息

    [UMessage addLaunchMessageWithWindow:self.window finishViewController:ViewController];
    //storyboard的形式可以这样写
    //UIStoryboard *board=[UIStoryboard storyboardWithName:@"Main_iPhone" bundle:nil];
    //[UMessage addLaunchMessageWithWindow:self.window finishViewController:[board instantiateInitialViewController]];
    

    window是指当前的window,一般写self.window就可以了。finishViewController是指launch结束后要显示的ViewController

     插屏消息

    插屏消息就是APP在打开以后弹出的一个插屏页面,或者用户去点击某些活动页面弹出的插屏消息。如下图所示

    插屏消息

     增加插屏消息

    在需要触发的点去调用。

    [UMessage addCardMessageWithLabel:@"这里写标识"];
    

    addCardMessageWithLabel后写插屏通知位置的标识字符串,比如说可以写:homesetting等等

    注意:1,不可同时多点触发。

     后台创建消息

    【设置消息的描述】【设置消息的样式】【设置消息图片】【设置消息的按钮详情】

    开屏消息

    【设置消息的目标人群】【设置消息的展示策略】【设置消息的有效期】

    开屏消息

    【设置消息点击的后续动作】

    开屏消息

    【消息预览】

    开屏消息

     测试与调试

     开启调试模式

    • 打开调试日志 [UMessage setLogEnabled:YES];

     调试步骤

    1. 确认证书设置正确。参见 iOS 证书设置指南
    2. 确认Provisioning Profile配置正确,并已更新
    3. 在【友盟+】消息推送后台上传正确的 Push 证书
    4. 启动应用程序,并在选择接受推送通知
    5. 确认 App 是开启 Push 权限的
    6. 在网站后台选择对应的Device Token进行推送测试

     如何获取设备的 DeviceToken

    开发环境下:

    方法1:在 didRegisterForRemoteNotificationsWithDeviceToken 中添加如下语句

    NSLog(@"%@",[[[[deviceToken description] stringByReplacingOccurrencesOfString: @"<" withString: @""]
                      stringByReplacingOccurrencesOfString: @">" withString: @""]
                     stringByReplacingOccurrencesOfString: @" " withString: @""]);
    
    

    方法2:在 didFinishLaunchingWithOptions:(NSDictionary *)launchOptions中 开启UMessage的Log,然后寻找deviceToken的字段

      //for log
      [UMessage setLogEnabled:YES];
    
    

    以上任一方式都可在控制台获取一个长度为64的测试设备的DeviceToken串

    生产环境下,用户需要用抓包工具、代理工具等自行获取device_token

     集成帮助

    常见问题

    一、IOS为什么获取不到设备的DeviceToken查看帮助

    二、IOS可以自定义App在前台接受到消息的弹出框么查看帮助

    三、为什么集成完SDK后,App运行没有弹出打开通知的对话框查看帮助

    四、为什么集成成功后iOS收不到推送通知查看帮助

    更多常见问题请点击访问:【友盟+】消息推送常见问题索引

    技术支持

    如果还有问题,请把您的问题发邮件至msg-support@umeng.com或者联系官网底部云客服系统(在线时间:工作日10:00~18:00)。

    如果可以附上相关日志,我们可以更好的帮助您解决问题,通过[UMessage setLogEnabled:YES];打开Debug模式,在logcat里查看log,发布应用时请去掉。