iOS友盟推送

原文出自:http://henishuo.com/archives/208

要获取源代码:请到这里阅读到文章末尾!http://henishuo.com/archives/208


友盟推送官网:http://www.umeng.com/push

友盟推送中,有一个问题,那就是应用处于前台时接收到的推送消息如何显示的问题。

友盟提供了默认的显示框,但是样式不是我们想要的,因此友盟也提供了用户自定义显示框的功能,

但是在用户点击后,友盟要求调用指定的API向友盟反馈。

    // 如果不调用此方法,统计数据会拿不到,但是如果调用此方法,会再弹一次友盟定制的alertview显示推送消息
    // 所以这里根据需要来处理是否屏掉此功能
    [UMessage sendClickReportForRemoteNotification:[HYBUMessageHelper shared].userInfo];

下面是我所封装的友盟推送工具类:

//
//  HYBUMessageHelper.h
//  UMessageDemo
//
//  Created by 黄仪标 on 14/11/20.
//  Copyright (c) 2014年 黄仪标. All rights reserved.
//

#import <Foundation/Foundation.h>
#import <UIKit/UIKit.h>

/*!
 * @brief 友盟消息推送API相关封装类
 * @author huangyibiao
 */
@interface HYBUMessageHelper : NSObject <UIAlertViewDelegate>

/// 在应用启动时调用此方法注册
+ (void)startWithLaunchOptions:(NSDictionary *)launchOptions;

+ (void)registerDeviceToken:(NSData *)deviceToken;
+ (void)didReceiveRemoteNotification:(NSDictionary *)userInfo;
// 关闭接收消息通知
+ (void)unregisterRemoteNotifications;

// default is YES
// 使用友盟提供的默认提示框显示推送信息
+ (void)setAutoAlertView:(BOOL)shouldShow;

// 应用在前台时,使用自定义的alertview弹出框显示信息
+ (void)showCustomAlertViewWithUserInfo:(NSDictionary *)userInfo;

@end

//
//  HYBUMessageHelper.m
//  UMessageDemo
//
//  Created by 黄仪标 on 14/11/20.
//  Copyright (c) 2014年 黄仪标. All rights reserved.
//

#import "HYBUMessageHelper.h"
#import "UMessage.h"
#include <objc/runtime.h>

#define kUMessageAppKey @"546d9a53fd98c533600016bb"

// ios 8.0 以后可用,这个参数要求指定为固定值
#define kCategoryIdentifier @"xiaoyaor"

@interface HYBUMessageHelper ()

@property (nonatomic, strong) NSDictionary *userInfo;

@end

@implementation HYBUMessageHelper

+ (HYBUMessageHelper *)shared {
  static HYBUMessageHelper *sharedObject = nil;

  static dispatch_once_t onceToken;
  dispatch_once(&onceToken, ^{
    if (!sharedObject) {
      sharedObject = [[[self class] alloc] init];
    }
  });

  return sharedObject;
}

+ (void)startWithLaunchOptions:(NSDictionary *)launchOptions {
  // set AppKey and LaunchOptions
  [UMessage startWithAppkey:kUMessageAppKey launchOptions:launchOptions];

#if __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_8_0
  if([[[UIDevice currentDevice] systemVersion] floatValue] >= 8.0) {
    // register remoteNotification types
    UIMutableUserNotificationAction *action1 = [[UIMutableUserNotificationAction alloc] init];
    action1.identifier = @"action1_identifier";
    action1.title=@"Accept";
    action1.activationMode = UIUserNotificationActivationModeForeground;// 当点击的时候启动程序

    UIMutableUserNotificationAction *action2 = [[UIMutableUserNotificationAction alloc] init];  // 第二按钮
    action2.identifier = @"action2_identifier";
    action2.title = @"Reject";
    action2.activationMode = UIUserNotificationActivationModeBackground;// 当点击的时候不启动程序,在后台处理
    // 需要解锁才能处理,如果action.activationMode = UIUserNotificationActivationModeForeground;则这个属性被忽略;
    action2.authenticationRequired = YES;
    action2.destructive = YES;

    UIMutableUserNotificationCategory *categorys = [[UIMutableUserNotificationCategory alloc] init];
    categorys.identifier = kCategoryIdentifier;// 这组动作的唯一标示
    [categorys setActions:@[action1,action2] forContext:(UIUserNotificationActionContextDefault)];

    UIUserNotificationType types = UIUserNotificationTypeBadge
    | UIUserNotificationTypeSound
    | UIUserNotificationTypeAlert;
    UIUserNotificationSettings *userSettings = [UIUserNotificationSettings settingsForTypes:types
                                                                                 categories:[NSSet setWithObject:categorys]];

    [UMessage registerRemoteNotificationAndUserNotificationSettings:userSettings];
  } else {
    // register remoteNotification types
    UIRemoteNotificationType types = UIRemoteNotificationTypeBadge
    | UIRemoteNotificationTypeSound
    | UIRemoteNotificationTypeAlert;

    [UMessage registerForRemoteNotificationTypes:types];
  }
#else
  // iOS8.0之前使用此注册
  // register remoteNotification types
  UIRemoteNotificationType types = UIRemoteNotificationTypeBadge
  | UIRemoteNotificationTypeSound
  | UIRemoteNotificationTypeAlert;

  [UMessage registerForRemoteNotificationTypes:types];
#endif

#if DEBUG
  [UMessage setLogEnabled:YES];
#else
  [UMessage setLogEnabled:NO];
#endif
}

+ (void)registerDeviceToken:(NSData *)deviceToken {
  [UMessage registerDeviceToken:deviceToken];
  return;
}

+ (void)unregisterRemoteNotifications {
  [UMessage unregisterForRemoteNotifications];
  return;
}

+ (void)didReceiveRemoteNotification:(NSDictionary *)userInfo {
  [UMessage didReceiveRemoteNotification:userInfo];
  return;
}

+ (void)setAutoAlertView:(BOOL)shouldShow {
  [UMessage setAutoAlert:shouldShow];
  return;
}

+ (void)showCustomAlertViewWithUserInfo:(NSDictionary *)userInfo {
  [HYBUMessageHelper shared].userInfo = userInfo;

  // 应用当前处于前台时,需要手动处理
  if ([UIApplication sharedApplication].applicationState == UIApplicationStateActive) {
    dispatch_async(dispatch_get_main_queue(), ^{
      [UMessage setAutoAlert:NO];
      UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"推送消息"
                                                          message:userInfo[@"aps"][@"alert"]
                                                         delegate:[HYBUMessageHelper shared]
                                                cancelButtonTitle:@"取消"
                                                otherButtonTitles:@"确定", nil];
      [alertView show];
    });
  }
  return;
}

#pragma mark - UIAlertViewDelegate
- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex {
  if (buttonIndex == 1) {
    // 如果不调用此方法,统计数据会拿不到,但是如果调用此方法,会再弹一次友盟定制的alertview显示推送消息
    // 所以这里根据需要来处理是否屏掉此功能
    [UMessage sendClickReportForRemoteNotification:[HYBUMessageHelper shared].userInfo];
  }
  return;
}

@end

下面是测试:

//
//  AppDelegate.m
//  UMessageDemo
//
//  Created by 黄仪标 on 14/11/20.
//  Copyright (c) 2014年 黄仪标. All rights reserved.
//

#import "AppDelegate.h"
#import "HYBUMessageHelper.h"
#import "UMessage_Sdk_1.1.0/UMessage.h"

@interface AppDelegate ()

@end

@implementation AppDelegate

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
  self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
  // Override point for customization after application launch.

  [HYBUMessageHelper startWithLaunchOptions:launchOptions];

  self.window.backgroundColor = [UIColor whiteColor];
  [self.window makeKeyAndVisible];
  return YES;
}

- (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken {
  [HYBUMessageHelper registerDeviceToken:deviceToken];

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

- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo {
  [HYBUMessageHelper didReceiveRemoteNotification:userInfo];

  [HYBUMessageHelper setAutoAlertView:NO];
  return;
}

- (void)application:(UIApplication *)application didReceiveRemoteNotification
                   :(NSDictionary *)userInfo fetchCompletionHandler
                   :(void (^)(UIBackgroundFetchResult))completionHandler {
  [HYBUMessageHelper didReceiveRemoteNotification:userInfo];

  [HYBUMessageHelper setAutoAlertView:NO];
  completionHandler(UIBackgroundFetchResultNewData);
  return;
}

@end

接下来就需要去官网发通知测试一下,在发通知之前,需要先注册设备,否则在开发环境下,是不会有设备收到信息的。

Good luck!

时间: 2024-10-22 19:37:48

iOS友盟推送的相关文章

友盟推送 测试报错java.lang.NoClassDefFoundError

问题描述 友盟推送 测试报错java.lang.NoClassDefFoundError 12-25 19:05:07.605: E/AndroidRuntime(3206): FATAL EXCEPTION: main12-25 19:05:07.605: E/AndroidRuntime(3206): Process: com.umeng.message.example PID: 320612-25 19:05:07.605: E/AndroidRuntime(3206): java.lan

友盟推送 在手机端一个用户提交一个信息,其中包含一个“受理人”,让指定的受理人 收到一条推送消息

问题描述 友盟推送 在手机端一个用户提交一个信息,其中包含一个"受理人",让指定的受理人 收到一条推送消息 友盟推送 在手机端一个用户提交一个信息,其中包含一个"受理人",让指定的受理人 收到一条推送消息 怎么实现? 解决方案 首先针对某一个用户推送,必须知道对方的token(信鸽产生的token,每个手机不一样),所以你要有一个后台接口,你提交信息后,接口从数据库中查找这用户的token,然后调用信鸽的接口发推送

友盟推送发送消息的接口是哪个?

问题描述 友盟推送发送消息的接口是哪个? 我用这个一直报500 http://msg.umeng.com/api/send?sign=mysign 应该怎么写呢 求大神指导啊

iOS - Push 通知推送

1.UserNotifications 通知是 App 用来和用户交流的一种方式,特别是当 App 并没有在前台运行的时候.通知,正如它的名称所强调的,被用作向用户'通知'一个事件,或者仅仅向用户提示一条重要信息.总而言之,通知在提示类型的 App 当中非常有用,甚至在一些别的类型的 App 当中也是如此.比如,当用户进入一个指定区域(这是 iOS8 的新特性),一个下载任务完成,或者当朋友给你发送一条信息的时候,一条通知就可以被显示出来.无论如何,通知的目的就是获得用户的关注,然后他们就能处理

eclipse-友盟推送自带demo导入报错问题

问题描述 友盟推送自带demo导入报错问题 将友盟推送自带的demo导入进eclipse之后就报红色感叹号,有两个错误提示: Project 'PushExample4Eclipse' is missing required Java project: 'com.umeng.message.lib' The project cannot be built until build path errors are resolved这两个错误提示,翻译之后说是路径有错误,但是不知道该怎么找.. 解决方

分分钟搞定IOS远程消息推送

分分钟搞定IOS远程消息推送 一.引言 IOS中消息的推送有两种方式,分别是本地推送和远程推送,本地推送在http://my.oschina.net/u/2340880/blog/405491这篇博客中有详细的介绍,这里主要讨论远程推送的流程与配置过程. 二.远程推送机制的原理 1.从一张很火的图说起 搜索IOS远程推送,你总能看到一张如下的流程示意图,因为这张图确实很火,所以我也将它引用在此: 这张图示意的很清晰,大致意思是这样:你的应用服务端将消息发送到apple的APNS服务器,APNS服

iOS实现远程推送原理及过程_IOS

推送通知,是现在的应用必不可少的功能.那么在 iOS 中,我们是如何实现远程推送的呢?iOS 的远程推送原理又是什么呢?在做 iOS 远程推送时,我们会遇到各种各样的问题.那么首先让我们准备一些做推送需要的东西.我们需要一个付费的苹果开发者账号(免费的不可以做远程推送),有了开发者账号,我们可以去苹果开发者网站,配置自己所需要的推送的相关证书.然后下载证书,供我们后面使用,详细的证书配置过程,我们下面再说. 首先我们要说说iOS推送通知的基本原理: 苹果的推送服务通知是由自己专门的推送服务器AP

应用-iOS开发信鸽推送问题, 获取不到服务器推送内容,很急,谢谢大家!

问题描述 iOS开发信鸽推送问题, 获取不到服务器推送内容,很急,谢谢大家! 最近应用中要做到推送功能,看官方SDK, 有一步是设置账户,之后我在网页中输入内容,跟这个账户对应上,已经可以收到内容.但是我现在要收到从服务器发送的消息,这有身份登录,不同的身份收到的是不同的内容, 现在却收不到了,我把账号已经取消了,这是什么原因,我们是php后台,需要和注意什么,请大家解答,谢谢了!! 非常急!谢谢 解决方案 http://bbs.csdn.net/topics/391886150

ios接收到推送的消息后如何进行选择性的提醒?

问题描述 ios接收到推送的消息后如何进行选择性的提醒? 本人新手,刚接触到ios的推送,现在看推送的代码,发现是注册的时候就已经设置好了UIRemoteNotificationTypeAlert之类的提醒类型. 但是,假如有的消息不需要提醒,有的消息又需要提醒,那样的话在服务端推送消息过来后,我该如何先去判断然后再决定提不提醒用户? 解决方案 貌似不行吧,服务端在推送的时候就决定哪些推送,哪些不推送. 解决方案二: 不提醒的推送不设置badgeNumber与声音就可以了,不过既然用到了推送,应