11.推送通知Push Notifications

推送通知

如果尚未安装SDK,请转到Push QuickStart,以配置SDK并运行。

1.介绍

推送通知是让用户获得应用程序通知的好方法。您可以快速有效地覆盖整个用户群。本指南将帮助您完成在Parse中发送推送通知的安装过程和一般用法。

2.设置Push

JavaScript SDK目前不支持接收推送。它只能用于向iOS和Android应用程序发送通知。常见的用例是从Cloud Code中发送推送通知。

使用JavaScript SDK发送推送通知无须设置。如果您尚未配置iOSAndroid客户端以使用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中。

client_push_settings.png

创建推送后,您可以在Parse.com推送控制台上查看长达过去30天的推送通知。对于将来推送的通知,只要还没有发送,也可以在推送控制台上删除。

发送推送后,推送控制台会显示推送分析图。

1.使用频道

发送通知最简单的方法是使用频道。它使用发布者订阅者模型发送推送。设备首先订阅一个或多个频道,然后可以向这些订阅用户发送通知。给定Installation订阅的频道被存储在Installation对象的channels字段中。

2.订阅频道

JavaScript SDK目前不支持订阅iOS和Android设备进行推送。使用顶部的平台切换按钮,查看iOSAndroidREST推送指南。

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对象。有关此主题的更多信息,请查看iOSAndroidREST推送指南。

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
  }
});

也可以在这个字典中指定你自己的数据。如iOSAndroid的“接收通知”部分所述,只有当用户通过通知打开您的应用程序时,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目前不支持接收推送。要了解有关在iOSAndroid中处理收到的通知的更多信息,请使用顶部的平台切换按钮。

8.故障排除

有关排除推送通知故障的提示,请查看iOSAndroid.NET的故障排除部分。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,386评论 6 479
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,939评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,851评论 0 341
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,953评论 1 278
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,971评论 5 369
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,784评论 1 283
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,126评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,765评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,148评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,744评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,858评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,479评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,080评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,053评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,278评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,245评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,590评论 2 343

推荐阅读更多精彩内容