http://www.jianshu.com/p/803bfaae989e

iOS8自定义推送显示按钮及推送优化

字数1435 阅读473 评论0 喜欢2
导语

在iOS8中,推送消息不再只是简单地点击打开客户端,对推送消息下拉时还可以执行预先设定好的操作,接下来我们来介绍如何自定义推送信息显示按钮和对推送的一些优化策略。

注册推送

在iOS8中,我们使用新的函数来注册通知,如下:

- (void)registerForRemoteNotifications NS_AVAILABLE_IOS(8_0);

该函数的作用是向苹果服务器注册该设备,注册成功过后会回调

- (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken NS_AVAILABLE_IOS(3_0);

注册失败则回调

- (void)application:(UIApplication *)application didFailToRegisterForRemoteNotificationsWithError:(NSError *)error NS_AVAILABLE_IOS(3_0);

执行registerForRemoteNotifications只是完成了与APNS的注册交互,接下来还要设置推送的类型和策略。如果没有设置则接收到的消息都是以静默的方式接收。

设置推送类型

- (void)registerUserNotificationSettings:(UIUserNotificationSettings *)notificationSettings NS_AVAILABLE_IOS(8_0);

在这里我们用到了UIUserNotificationSettings这个新类,苹果对其解释是这样的。

A UIUserNotificationSettings object encapsulates the types of notifications that can be displayed to the user by your app. Apps that use visible or audible alerts in conjunction with a local or push notification must register the types of alerts they employ. UIKit correlates the information you provide with the user’s preferences to determine what types of alerts your app is allowed to employ.

简单来说就是我们可以自行注册推送的提醒类型。再来看看UIUserNotificationSettings为我们提供了那些函数。查看API,我们只找到了

+ (instancetype)settingsForTypes:(UIUserNotificationType)types
categories:(NSSet *)categories;

UIUserNotificationType就是以往我们设定的推送声音、推送数量Badge和是否Alter的参数组合。因为它们是NS_OPTIONS类型,所以是可以多选的。

我们重点放在categories上。可以看到,categories的类型是一个集合(NSSet *),也就是说我们可以设置多个推送策略。继续查找API,我们找到了UIUserNotificationCategory。苹果的说明是这样的

A UIUserNotificationCategory object encapsulates information about custom actions that your app can perform in response to a local or push notification. Each instance of this class represents a group of actions to display in conjunction with a single notification. The title of each action is uses as the title of a button in the alert displayed to the user. When the user taps a button, the system reports the selected action to your app delegate.

就是说我们对每一条推送信息可以设置一组行为,行为以按钮方式显示。当我们点击按钮时会调用app delegate的代理方法。
查看UIUserNotificationCategory相关属性

@property (nonatomic, copy, readonly) NSString *identifier;
  • identifier:策略标识,在推送时用来决定客户端显示哪种推送策略,稍后会介绍。

看到该属性是只读的,我们在自定义策略时使用的是UIMutableUserNotificationCategory来设置,设置方法如下:

- (void)setActions:(NSArray *)actions forContext:(UIUserNotificationActionContext)context;

对一个策略我们可以设置多个行为,使用的是UIUserNotificationAction。

查看UIUserNotificationAction相关属性

// The unique identifier for this action.
@property (nonatomic, copy, readonly) NSString *identifier;
// The localized title to display for this action.
@property (nonatomic, copy, readonly) NSString *title;
// How the application should be activated in response to the action.
@property (nonatomic, assign, readonly) UIUserNotificationActivationMode activationMode;
// Whether this action is secure and should require unlocking before being performed. If the activation mode is UIUserNotificationActivationModeForeground, then the action is considered secure and this property is ignored.
@property (nonatomic, assign, readonly, getter=isAuthenticationRequired) BOOL authenticationRequired;
// Whether this action should be indicated as destructive when displayed.
@property (nonatomic, assign, readonly, getter=isDestructive) BOOL destructive;
  • identifier:行为标识符,用于调用代理方法时识别是哪种行为。
  • title:行为名称。
  • UIUserNotificationActivationMode:即行为是否打开APP。
  • authenticationRequired:是否需要解锁。
  • destructive:这个决定按钮显示颜色,YES的话按钮会是红色。

同样由于这些属性都是只读的,我们使用UIMutableUserNotificationAction来生成自定义行为。

编码

我们设置两种推送策略,每种策略分别设置两种行为。代码如下:

if(8.0 <= [UIDevice currentDevice].systemVersion.doubleValue)
{
[[UIApplication sharedApplication] registerForRemoteNotifications]; UIMutableUserNotificationAction * action1 = [[UIMutableUserNotificationAction alloc] init];
action1.identifier = @"action1";
action1.title=@"策略1行为1";
action1.activationMode = UIUserNotificationActivationModeForeground;
action1.destructive = YES; UIMutableUserNotificationAction * action2 = [[UIMutableUserNotificationAction alloc] init];
action2.identifier = @"action2";
action2.title=@"策略1行为2";
action2.activationMode = UIUserNotificationActivationModeBackground;
action2.authenticationRequired = NO;
action2.destructive = NO; UIMutableUserNotificationCategory * category1 = [[UIMutableUserNotificationCategory alloc] init];
category1.identifier = @"Category1";
[category1 setActions:@[action2,action1] forContext:(UIUserNotificationActionContextDefault)]; UIMutableUserNotificationAction * action3 = [[UIMutableUserNotificationAction alloc] init];
action3.identifier = @"action3";
action3.title=@"策略2行为1";
action3.activationMode = UIUserNotificationActivationModeForeground;
action3.destructive = YES; UIMutableUserNotificationAction * action4 = [[UIMutableUserNotificationAction alloc] init];
action4.identifier = @"action4";
action4.title=@"策略2行为2";
action4.activationMode = UIUserNotificationActivationModeBackground;
action4.authenticationRequired = NO;
action4.destructive = NO; UIMutableUserNotificationCategory * category2 = [[UIMutableUserNotificationCategory alloc] init];
category2.identifier = @"Category2";
[category2 setActions:@[action4,action3] forContext:(UIUserNotificationActionContextDefault)]; UIUserNotificationSettings *uns = [UIUserNotificationSettings settingsForTypes:(UIUserNotificationTypeAlert|UIUserNotificationTypeBadge|UIUserNotificationTypeSound) categories:[NSSet setWithObjects: category1,category2, nil]]; [[UIApplication sharedApplication] registerUserNotificationSettings: uns];
}

关于推送证书制作请百度,这里推荐一个推送测试工具

  • 推送策略一

      {
    "aps":{
    "alert":"推送内容",
    "sound":"default",
    "badge":0,
    "category":"Category1"
    }
    }

    显示结果:

    策略一
  • 推送策略二
      {
    "aps":{
    "alert":"推送内容",
    "sound":"default",
    "badge":0,
    "category":"Category2"
    }
    }

    显示结果:

    策略二

点击相应按钮会激活代理方法

- (void)application:(UIApplication *)application handleActionWithIdentifier:(NSString *)identifier forRemoteNotification:(NSDictionary *)userInfo completionHandler:(void(^)())completionHandler NS_AVAILABLE_IOS(8_0);

这里我们根据传过来的identifier确定点击了哪个按钮,并执行相应操作。

推送优化

苹果APNS对推送内容大小限制不能超过256个字节(现在这个限制好像放宽了)。如果推送消息内容过多,不仅会造成推送延迟,还会消耗流量。对于推送信息中重复的文本内容,我们可以在本地字符串strings中自定义键值动态设定参数来完成推送。

Localizable.strings中添加:

"pushkey" = "%@ 的iOS8自定义推送显示按钮及推送优化教程 %@是一名iOS开发者,正在前行。";

设置推送信息

{
"aps":{
"alert":{"loc-args":["Arms","Arms"],"loc-key":"pushkey"},
"sound":"default",
"badge":0,
"category":"Category2"
}
}

显示结果:

本地字符串推送

iOS8自定义推送显示按钮及推送优化的更多相关文章

  1. C# ASP.NET MVC 之 SignalR 学习 实时数据推送显示 配合 Echarts 推送实时图表

    本文主要是我在刚开始学习 SignalR 的技术总结,网上找的学习方法和例子大多只是翻译了官方给的一个例子,并没有给出其他一些经典情况的示例,所以才有了本文总结,我在实现推送简单的数据后,就想到了如何 ...

  2. 【Android应用开发】 推送原理解析 极光推送使用详解 (零基础精通推送)

    作者 : octopus_truth 转载请注明出处 : http://blog.csdn.net/shulianghan/article/details/45046283 推送技术产生场景 : -- ...

  3. 与众不同 windows phone (10) - Push Notification(推送通知)之推送 Tile 通知, 推送自定义信息

    原文:与众不同 windows phone (10) - Push Notification(推送通知)之推送 Tile 通知, 推送自定义信息 [索引页][源码下载] 与众不同 windows ph ...

  4. 将网站固定到开始菜单,自定义图标、颜色和Windows推送通知

    Windows 8.1——将网站固定到开始菜单,自定义图标.颜色和Windows推送通知 记得在IE 9和Windows 7刚出来那会儿我写过一篇文章来介绍如何自定义网站将其固定到Windows的任务 ...

  5. Android推送服务——百度云推送

    一.推送服务简介 消息推送,顾名思义,是由一方主动发起,而另一方与发起方以某一种方式建立连接并接收消息.在Android开发中,这里的发起方我们把它叫做推送服务器(Push Server),接收方叫做 ...

  6. Android之使用个推实现三方应用的推送功能

    PS:用了一下个推.感觉实现第三方应用的推送功能还是比较简单的.官方文档写的也非常的明确. 学习内容: 1.使用个推实现第三方应用的推送.      所有的配置我最后会给一个源代码,内部有相关的配置和 ...

  7. 左右推拽显示对比图 - jQyery封装 - 附源文件

    闲来无事,做了一个模块效果 左右拖拽显示对比图,是用jq封装的 利用鼠标距离左侧(0,0)坐标的横坐标位移来控制绝对定位的left值 再配合背景图fixed属性,来制作视觉差效果 代码如下 <! ...

  8. PhoneGap 的消息推送插件JPush极光推送

    一. 什么是极光推送 极光推送,使得开发者可以即时地向其应用程序的用户推送通知或者消息,与用户保持互动, 从而有效地提高留存率,提升用户体验.平台提供整合了 Android 推送.iOS 推送的统一推 ...

  9. php 微信客服信息推送失败 微信重复推送客服消息 40001 45047

    /*** * 微信客服发送信息 * 微信客服信息推送失败 微信重复推送客服消息 40001 45047 * 递归提交到微信 直到提交成功 * @param $openid * @param int $ ...

随机推荐

  1. [LeetCode]无重复字符的最长子串

    给定一个字符串,找出不含有重复字符的最长子串的长度. 示例 1: 输入: "abcabcbb" 输出: 3 解释: 无重复字符的最长子串是 "abc",其长度为 ...

  2. 采用太平洋AI集装箱箱号识别接口实现集装箱箱号识别

    识别 示例图片 1 太平洋AI集装箱箱号识别接口(文档下方有详细操作指南) 1.1 接口一:提交base64格式的图片 地址:http://218.1.125.60:88/container_num_ ...

  3. hdu5745--La Vie en rose (DP+bitset)

    好题,学到新姿势! 题意:给两个字符串 a 和 b ,b可以进行变换,规则是可以任意交换相邻两个字符的位置,但是不可以有交叉(例如3和4交换,5和6交换 互不影响,但是2和3,3和4就不可以).求a中 ...

  4. Microsoft SQL Server on Linux 踩坑指南

    微软用 SQL Server 在 2016 年的时候搞了一个大新闻,宣传 Microsoft ❤️ Linux 打得一众软粉措手不及.但是这还是好事情,Linux 上也有好用的 SQL Server ...

  5. (转载)Centos下Elasticsearch安装详细教程

    原文地址:http://www.cnblogs.com/sunny1009/articles/7874251.html Centos下Elasticsearch安装详细教程 1.Elasticsear ...

  6. 学会四招让你在linux下安装程序变得简单

    一.背景 由于最近想自己摸索一些linux下的东西,开始玩起了Linux系统,在安装软件的过程中有诸多的不解和困惑,现在终于搞明白了具体是怎么样的安装步骤和过程,先分享给你们同时也方便自己复习查阅. ...

  7. idea terminal 修改为git bash 不支持中文

    1.idea terminal 修改为git bash 由于IDEA自带的Terminal工具是Windows命令窗口cmd,在开发过程中需要用到一些常用的命令操作时要不断的在IDEA和git bas ...

  8. [java初探06]__排序算法的简单认识

    今天,准备填完昨天没填的坑,将排序算法方面的知识系统的学习一下,但是在简单的了解了一下后,有些不知如何组织学习了,因为排序算法的种类,实在是太多了,各有优略,各有适用的场景.有些不知所措,从何开始. ...

  9. linux文件命令汇总

    查看文件内容命令 cat 直接输出在命令行,适用于很少内容时候的输出, vim .vi  通过 编辑命令的只读模式进行文件内容的查看(翻页快捷键好像是 ctrl + F 下一页, ctrl + B 上 ...

  10. Async异步编程入门示例

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...