推送通知
如果尚未安装SDK,请转到Push QuickStart,以配置SDK并运行。
1.介绍
推送通知是让用户获得应用程序通知的好方法。您可以快速有效地覆盖整个用户群。本指南将帮助您完成在Parse中发送推送通知的安装过程和一般用法。
2.设置Push
JavaScript SDK目前不支持接收推送。它只能用于向iOS和Android应用程序发送通知。常见的用例是从Cloud Code中发送推送通知。
使用JavaScript SDK发送推送通知无须设置。如果您尚未配置iOS或Android客户端以使用Push,请使用顶部的平台切换按钮查看各自的设置说明。
3.Installations对象
安装在注册了推送通知的设备上的每个Parse应用程序都具有关联的Installation对象。该Installation对象用于存储你需要的、用于定位推送通知的所有数据。例如,在棒球应用程序中,您可以(在其中)存储某用户感兴趣的球队,以用于向其发送这些球队比赛表现的更新。
请注意,Installation数据只能由客户端SDK、数据浏览器或REST API进行修改。
该类有几个特殊字段可帮助您管理和定位设备。
- badge:iOS应用程序图示徽章的当前值(译者注:应用图标右上角的数字)。对服务器上此值的更改将用于将来的徽标增量式推送通知。
- channels:设备当前订阅的频道数组。
- timeZone:目标设备所在的当前时区。每当从设备上保存Installation对象时,该值都会同步。
- deviceType:设备的类型,“ios”,“android”,“winrt”,“winphone”或“dotnet” (只读)。
- pushType:该字段保留用于将Parse引导到要使用的推送传送网络。如果设备已注册用于接收通过GCM的推送,该字段将被标记为“gcm”。如果此设备不使用GCM,而是使用Parse的推送通知服务,它将为空白(只读)。
- installationId:Parse使用的设备的通用唯一标识符(UUID)。它在所有应用程序的installations中必须是独一无二的。(只读)。
- deviceToken:Apple或Google生成的令牌,用于分别向APN或GCM推送网络发送消息。
- channelUris:微软为Windows设备生成的推送URI。
- appName:此installation所属的客户端应用程序的显示名称。
- appVersion:此installation所属的客户端应用程序的版本字符串。
- parseVersion:此installation使用的Parse SDK版本。
- appIdentifier:此installation的客户端应用程序的唯一标识符。在iOS中,这是Bundle标识符。
4.发送Push
在Parse上有两种方式发送推送通知:频道(channels)和高级定位(advanced targeting)。频道提供了一种简单易行的发送模式,而高级定位提供了更强大、更灵活的模式。两者都是完全兼容的,本节中会详细介绍。
发送通知通常由Parse.com推送控制台、REST API或Cloud Code来完成。由于在Cloud Code中使用了JavaScript SDK,因此如果要从Cloud Code发送推送,则可以从这里开始。但是,如果您决定从Cloud Code或任何其他客户端SDK之外的JavaScript SDK发送通知,则需要在Parse应用的“推送通知”设置中设置“启用客户端推送”功能。
但是,请确保您了解,“启用客户端推送”可能会导致您应用程序中的安全漏洞,如我们博客中所述。我们建议您启用客户端推送仅用于测试目的,并且当应用准备投入生产时,将推送通知逻辑转移到Cloud Code中。
创建推送后,您可以在Parse.com推送控制台上查看长达过去30天的推送通知。对于将来推送的通知,只要还没有发送,也可以在推送控制台上删除。
发送推送后,推送控制台会显示推送分析图。
1.使用频道
发送通知最简单的方法是使用频道。它使用发布者订阅者模型发送推送。设备首先订阅一个或多个频道,然后可以向这些订阅用户发送通知。给定Installation订阅的频道被存储在Installation对象的channels字段中。
2.订阅频道
JavaScript SDK目前不支持订阅iOS和Android设备进行推送。使用顶部的平台切换按钮,查看iOS,Android或REST推送指南。
3.发送Pushes到频道
通过JavaScript SDK,可以使用以下代码来提醒“Giants”和“Mets”频道的所有订阅者有关游戏的结果。这将向iOS用户显示通知中心提醒,并向Android用户显示系统托盘通知。
Parse.Push.send({
channels: [ "Giants", "Mets" ],
data: {
alert: "The Giants won against the Mets 2-3."
}
}, {
success: function() {
// Push was successful
},
error: function(error) {
// Handle error
}
});
4.使用高级定位
虽然频道对许多应用程序来说已经很好了,但有时候您需要更精确的定位您的推送接受者。Parse允许您使用查询API在Installation对象上查询出任何子集,并向其发送推送。
由于Installation对象与Parse中存储的任何其他对象一样,您可以保存所需的任何数据,甚至可以在Installation对象和其他对象之间创建关系。这使您可以向一个高度定制化的、动态的用户群发送推送通知。
5.保存Installation数据
JavaScript SDK目前不支持修改Installation对象。有关此主题的更多信息,请查看iOS,Android或REST推送指南。
6.发送Pushes到查询结果上
将数据存储在Installation对象上后,您可以使用查询来定位这些设备的子集。Parse.Installation查询的工作机制与任何其他Parse查询一样。
var query = new Parse.Query(Parse.Installation);
query.equalTo('injuryReports', true);
Parse.Push.send({
where: query, // Set our Installation query
data: {
alert: "Willie Hayes injured by own pop fly."
}
}, {
success: function() {
// Push was successful
},
error: function(error) {
// Handle error
}
});
我们甚至也可以查询频道。要向“Giants”频道的所有订阅者发送推送,并通过想要得分更新的订阅者过滤,我们可以执行以下操作:
var query = new Parse.Query(Parse.Installation);
query.equalTo('channels', 'Giants'); // Set our channel
query.equalTo('scores', true);
Parse.Push.send({
where: query,
data: {
alert: "Giants scored against the A's! It's now 2-2."
}
}, {
success: function() {
// Push was successful
},
error: function(error) {
// Handle error
}
});
如果我们在Installation类中存储了与其他对象的关系,我们也可以在查询中使用它们。例如,我们可以向给定位置附近的所有用户发送推送通知。
// Find users near a given location
var userQuery = new Parse.Query(Parse.User);
userQuery.withinMiles("location", stadiumLocation, 1.0);
// Find devices associated with these users
var pushQuery = new Parse.Query(Parse.Installation);
pushQuery.matchesQuery('user', userQuery);
// Send push notification to query
Parse.Push.send({
where: pushQuery,
data: {
alert: "Free hotdogs at the Parse concession stand!"
}
}, {
success: function() {
// Push was successful
},
error: function(error) {
// Handle error
}
});
5.发送选项
推送通知可以做的不仅仅是发送消息。在iOS中,还可以推送待播放的音频、要显示的图标徽章数字以及您要发送的任何自定义数据。在Android中,甚至可以在收到通知后触发一个指定的Intent。如果通知对时间敏感,也可以为之设置失效时间。
1.自定义您的通知
如果要发送的不只是一个消息,您可以在data字典中设置其他字段。以下有一些有特殊含义的保留字段:
- alert:通知的消息。
- badge:(仅限iOS)应用图标右上角的值。你可以设置一个值或为了将当前值递增1而Increment。
- sound:(仅限iOS)应用程序包中音频文件的名称。
- content-available:(仅限iOS)如果您正使用iOS7(也称“后台推送”)中引进的远程通知后台模式(Remote Notification Background Mode)编写应用程序,请将此值设置为1以触发后台下载。
- category:(仅限iOS)此推送通知的UNNotification Category标识符。
- uri:(仅限Android)包含URI的可选字段。打开通知后,启动与URI相关联的Activity。
- title:(仅限Android)在Android系统托盘通知中显示的值。
例如,要发送一个将当前图标徽章编号加1的通知,为iOS设备播放自定义声音,并为Android用户显示特定标题,则可以执行以下操作:
Parse.Push.send({
channels: [ "Mets" ],
data: {
alert: "The Mets scored! The game is now tied 1-1.",
badge: "Increment",
sound: "cheering.caf",
title: "Mets Score!"
}
}, {
success: function() {
// Push was successful
},
error: function(error) {
// Handle error
}
});
也可以在这个字典中指定你自己的数据。如iOS和Android的“接收通知”部分所述,只有当用户通过通知打开您的应用程序时,iOS才能访问此数据,而Android将在Intent(如果指定了其值的话)中为您提供此数据。
var query = new Parse.Query(Parse.Installation);
query.equalTo('channels', 'Indians');
query.equalTo('injuryReports', true);
Parse.Push.send({
where: query,
data: {
action: "com.example.UPDATE_STATUS"
alert: "Ricky Vaughn was injured in last night's game!",
name: "Vaughn",
newsItem: "Man bites dog"
}
}, {
success: function() {
// Push was successful
},
error: function(error) {
// Handle error
}
});
2.设定失效时间
当用户的设备关闭或未连接到互联网时,推送通知无法送达。如果您有时间敏感的通知推迟则无用,您可以为该通知设置失效时间。这样可以避免向用户提示不再相关的信息。
Parse为您设置通知的失效时间提供了两个参数。第一是expiration_time,它接受一个给定的Date,当到期时Parse应停止尝试发送通知。要从现在起1周后到期,您可以使用以下代码:
var oneWeekAway = new Date(...);
Parse.Push.send({
where: everyoneQuery,
expiration_time: oneWeekAway,
data: {
alert: "Season tickets on sale until next week!"
}
}, {
success: function() {
// Push was successful
},
error: function(error) {
// Handle error
}
});
或者,您可以使用expiration_interval参数来指定通知到期之前的持续期。此值与用于预定通知(译者注:参见本节“6.预定推送”)的push_time参数相关。这意味着预定在1天内发出、到期间隔为6天的推送通知可以从现在起一个星期内收到。
var oneDayAway = new Date(...);
var sixDaysAwayEpoch = (new Date(...)).getTime();
Parse.Push.send({
push_time: oneDayAway,
expiration_interval: sixDaysAwayEpoch,
data: {
alert: "Season tickets on sale until next week!"
}
}, {
success: function() {
// Push was successful
},
error: function(error) {
// Handle error
}
});
3.按平台定位
如果您构建一个跨平台应用程序,那么您可能只想推送给iOS或Android设备。这里提供了两种方法来过滤目标设备。请注意,默认情况下会同时定位到两个平台。
以下示例将向Android和iOS用户发送不同的通知。
// Notification for Android users
var queryAndroid = new Parse.Query(Parse.Installation);
queryAndroid.equalTo('deviceType', 'android');
Parse.Push.send({
where: queryAndroid,
data: {
alert: "Your suitcase has been filled with tiny robots!"
}
});
// Notification for iOS users
var queryIOS = new Parse.Query(Parse.Installation);
queryIOS.equalTo('deviceType', 'ios');
Parse.Push.send({
where: queryIOS,
data: {
alert: "Your suitcase has been filled with tiny apples!"
}
});
// Notification for Windows 8 users
var queryWindows = new Parse.Query(Parse.Installation);
queryWindows.equalTo('deviceType', 'winrt');
Parse.Push.send({
where: queryWindows,
data: {
alert: "Your suitcase has been filled with tiny glass!"
}
});
// Notification for Windows Phone 8 users
var queryWindowsPhone = new Parse.Query(Parse.Installation);
queryWindowsPhone.equalTo('deviceType', 'winphone');
Parse.Push.send({
where: queryWindowsPhone,
data: {
alert: "Your suitcase is very hip; very metro."
}
});
6.预定推送
您可以通过指定一个push_time提前预定一个推送通知。例如,如果用户为明天中午(UTC时间)的游戏预定了一个提醒,则可以通过以下方式发送预定推送通知:
var tomorrowDate = new Date(...);
var query = new Parse.Query(Parse.Installation);
query.equalTo('user', user);
Parse.Push.send({
where: query,
data: {
alert: "You previously created a reminder for the game today"
},
push_time: tomorrowDate
}, {
success: function() {
// Push was successful
},
error: function(error) {
// Handle error
}
});
如果您还指定了expiration_interval,则将从预定推送的时间开始计算,而不是从推送被提交的时间开始计算。这意味着预定在一周内发送、到期间隔为一天的推送,将在请求发送8天后过期。
预定时间不能是过去的、或长达两个星期后的将来的时间点。它可以是具有日期、时间和时区的ISO 8601日期类型,如上例所示,或者它可以是表示UNIX秒级时间戳(UTC)的数值。要在UTC时间“08/22/2015 中午”预设通知,您可以设置push_time为2015-08-022T12:00:00或1440226800。
7.接收Pushes
JavaScript SDK目前不支持接收推送。要了解有关在iOS或Android中处理收到的通知的更多信息,请使用顶部的平台切换按钮。