iOS
Send Push Notifications
通过云代码和Swift在iOS中发送推送通知
24 分
使用 swift 通过云代码发送推送通知 介绍 本节解释如何通过 back4app 使用云代码发送推送通知。 它的外观如下 在任何时候,您都可以访问我们教程中构建的完整项目,位于我们的 https //github com/templates back4app/ios install sdk 要完成此快速入门,您需要: https //developer apple com/xcode/ 在 back4app 创建的应用程序。 请遵循 https //www back4app com/docs/get started/new parse app 以了解如何在 back4app 创建 parse 应用程序。 一个连接到 back4app 的 ios 应用程序。 注意: 请遵循 https //www back4app com/docs/ios/parse swift sdk 以创建一个连接到 back4app 的 xcode 项目。 一个通过 https //www back4app com/docs/ios/push notifications/best ios push notification service 设置的 ios 应用程序。 一台运行 ios 10 或更高版本的 ios 设备,iphone 或 ipad。 一个付费的 apple 开发者账户。 1 设置您的 ios 应用程序以接收推送 每个安装在注册接收推送通知的设备上的 parse 应用程序都有一个相关的 安装 安装 对象。该 安装 安装 对象是您存储所有需要的推送通知目标数据的地方。例如,在您的应用程序中,您可以存储您的用户感兴趣的团队,以便发送有关其表现的更新。保存 安装 安装 对象也是跟踪与推送相关的应用打开事件所必需的。 开始发送通知的最简单方法是使用频道。这允许您使用发布 订阅模型发送推送。设备首先订阅一个或多个频道,通知可以稍后发送给这些订阅者。给定的 安装 安装 存储在 频道 频道 字段的 安装 安装 对象。 之后,我们将讨论如何根据查询向单个用户或一组用户发送定向推送通知。 接下来我们将假设您已完成所有步骤的 https //www back4app com/docs/ios/push notifications/best ios push notification service , 即使您使用的是我们在 https //github com/mpc20001/ios objc push cloud code 您应该已经能够基本使用推送通知,并且能够通过管理控制台发送推送。 2 订阅您的设备到新闻频道 首先,我们将向您的安装对象添加一个频道。我们将通过更改我们应用程序委托文件中的方法来实现这一点, createinstallationonparse createinstallationonparse 。打开您项目的 appdelegate m 文件 appdelegate m 文件 , 并确保您的 createinstallationonparse createinstallationonparse 版本与下面的代码相同。 appdelegate swift 1 func createinstallationonparse(devicetokendata\ data){ 2 if let installation = pfinstallation current(){ 3 installation setdevicetokenfrom(devicetokendata) 4 installation setobject(\["news"], forkey "channels") 5 installation saveinbackground { 6 (success bool, error error?) in 7 if (success) { 8 print("you have successfully saved your push installation to back4app!") 9 } else { 10 if let myerror = error{ 11 print("error saving parse installation \\(myerror localizeddescription)") 12 }else{ 13 print("uknown error") 14 } 15 } 16 } 17 } 18 } 我们添加了一行新代码 ‘installation setobject(\[“news”], forkey “channels”)’ 这将设置安装对象的频道数组以包含一个名为‘news’的频道。 这将允许我们通过云代码向所有订阅名为 news news 的频道发送消息。 2\ 通过在物理设备上运行您的应用程序进行测试 您不能在模拟器上运行此程序。 您需要一个实际的推送令牌来更新您的安装记录,因此必须使用物理设备。 3\ 成功运行后,您应该在您的仪表板的 安装 安装 部分看到类似下面的图像。您可以通过访问您的应用程序仪表板 https //www back4app com/ 然后检查安装表。您应该在渠道列下看到 新闻 新闻 , 这表明您现在已订阅 新闻 新闻 推送频道。 3 创建您的云代码 要了解如何开始使用 cloud code 请查看 https //www back4app com/docs 创建一个 js js 文件来放置你的 cloud code。你需要将其命名为 main js main js 以便 back4app 知道这是你存储云代码的地方。 定义一个云函数,使用 parse cloud define parse cloud define , 来调用推送通知。在函数内部,我们将调用 parse push send parse push send 来向 ‘ news news ’ 频道发送推送。 在此操作中需要使用 主密钥 。 以下代码执行这些步骤 parse server 3 x // main js 1 parse cloud define("pushsample", (request) => { 2 3 return parse push send({ 4 channels \["news"], 5 data { 6 title "hello from the cloud code", 7 alert "back4app rocks!", 8 } 9 }, { usemasterkey true }); 10 }); parse server 2 x //main js 1 parse cloud define("pushsample", function (request, response) { 2 parse push send({ 3 channels \["news"], 4 data { 5 title "hello from the cloud code", 6 alert "back4app rocks!", 7 } 8 }, { 9 success function () { 10 // push was successful 11 response success("push sent"); 12 console log("success push sent"); 13 }, 14 error function (error) { 15 // push was unsucessful 16 response error("error with push " + error); 17 console log("error " + error); 18 }, 19 usemasterkey true 20 }); 21 }) 4 上传到云代码 前往您的应用程序, https //www back4app com/ ,然后点击 仪表板 仪表板 找到 云代码 云代码 ,然后点击 函数与网络托管 函数与网络托管 。它看起来像这样 3\ 上传或创建一个新文件(您也可以直接在浏览器中编辑当前的 main js main js 文件)。然后,点击 部署 部署 ,如图所示 5 从您的 ios 应用调用云代码 现在,我们将编写一些代码,从您的应用调用这个云函数。 您需要模拟器和一台物理设备来完成此任务。 您将从在模拟器中运行的应用调用云函数,并且您将看到推送出现在您的物理设备上。 您的物理设备实际上应该关闭并锁定屏幕,以便看到推送。 如果您在接收推送时正在发送推送的应用内,则不会在屏幕上出现推送。 2\ 打开您项目的 viewcontroller swift viewcontroller swift 文件。我们需要通过在文件顶部添加以下代码 ‘import parse’ 来在视图控制器中包含 parse。 viewcontroller swift https //github com/mpc20001/ios swift push cloud code/blob/master/addingparsesdk/viewcontroller swift#l10 1 导入 uikit 2 导入 parse 3\ 接下来在 viewcontroller swift viewcontroller swift 文件中,我们将从 viewdidappear 方法调用一个警报函数。该警报将允许您触发云代码,这将向您的设备发送推送。请确保在 之后 viewdidload viewdidload 函数中包含以下代码块。 viewcontroller swift viewcontroller swift 1 override func viewdidappear( animated bool) { 2 asktosendpushnotifications() 3 } 4 5 func asktosendpushnotifications() { 6 let alertview = uialertcontroller(title "send a push to the news channel", message nil, preferredstyle alert) 7 let okaction = uialertaction(title "ok", style default) { (action\ uialertaction) in 8 self sendpushnotifications() 9 } 10 alertview\ addaction(okaction) 11 let cancelaction = uialertaction(title "cancel", style cancel) { (action\ uialertaction) in 12 } 13 alertview\ addaction(cancelaction) 14 if let presenter = alertview\ popoverpresentationcontroller { 15 presenter sourceview = self view 16 presenter sourcerect = self view\ bounds 17 } 18 self present(alertview, animated true, completion\ nil) 19 } 20 21 func sendpushnotifications() { 22 let cloudparams \[anyhashable\ string] = \[ ] 23 pfcloud callfunction(inbackground "pushsample", withparameters cloudparams, block { 24 (result any?, error error?) > void in 25 if error != nil { 26 if let descrip = error? localizeddescription{ 27 print(descrip) 28 } 29 }else{ 30 print(result as! string) 31 } 32 }) 33 } 4\ 在模拟器中运行您的应用程序,当警报询问是否发送推送时,点击“确定”。在您的物理设备上,您应该在锁屏上看到推送出现,如下所示 6 从 rest api 调用云代码 rest api 提供了一种快速简便的方法来测试您的云函数是否正常工作。 只需在终端或命令提示符中使用以下代码 点击了解如何在 https //www digitalocean com/community/tutorials/an introduction to the linux terminal , https //blog teamtreehouse com/introduction to the mac os x command line 或 https //www bleepingcomputer com/tutorials/windows command prompt introduction/ curl x post h "x parse application id your app id here" \\ h "x parse rest api key your rest api key here" \\ h "content type application/json" \\ d ‘{ // 在此处以 json 格式放置函数参数 }’ \\ https //parseapi back4app com/functions/pushsample 要测试推送通知,只需在设备关闭时使用rest代码。 7 使用用户对象发送定向推送通知 今后我们将使用一个不同的ios项目,该项目已经构建了基本的注册和登录功能。我们将使用这个ios项目,向您展示如何检测用户是否已登录,如果已登录,则将其安装保存到与其对象id链接的内容,以便在云代码中查询。您可以在我们的 https //github com/mpc20001/ios objc targeted push cloud code 下载本节教程构建的完整ios项目,但您仍然需要完成之前教程中的所有设置,该教程解释了如何从back4app仪表板发送推送。 您可以在我们的 https //github com/mpc20001/ios swift targeted push cloud code 下载本节教程构建的完整ios项目,但您仍然需要完成之前教程中的所有设置,该教程解释了如何从back4app仪表板发送推送。 获取新版本的应用程序并注册或登录到应用程序。首先确保您从我们的 https //github com/mpc20001/ios swift targeted push cloud code 下载工作模板。我们不会逐步讲解构建此应用程序的所有步骤,而是将重点放在设置云代码及其工作原理上。一旦您打开这个新应用,请确保在appdelegate swift文件中放入您自己应用的凭据。 appdelegate swift 1 func application( application uiapplication, didfinishlaunchingwithoptions launchoptions \[uiapplicationlaunchoptionskey any]?) > bool { 2 let configuration = parseclientconfiguration { 3 $0 applicationid = "paste your application id here" 4 $0 clientkey = "paste your client id here" 5 $0 server = "https //parseapi back4app com" 6 } 7 parse initialize(with configuration) 8 return true 9 } 2\ 这个应用程序与之前的应用程序有一些重大区别。它有两个部分,一个是登录到您的应用程序,另一个是在您未登录到应用程序时的部分。下一个重大变化是appdelegate swift文件中的函数‘createinstallationonparse’。我们添加了一行,将用户的对象id作为安装对象的一部分进行存储。这样我们就可以知道哪个用户与哪个安装对象相关联,并可以单独针对他们进行推送。 appdelegate swift 1 func createinstallationonparse(devicetokendata\ data){ 2 if let installation = pfinstallation current(){ 3 installation setdevicetokenfrom(devicetokendata) 4 installation setobject(\["news"], forkey "channels") 5 if let userid = pfuser current()? objectid { 6 installation setobject(userid, forkey "userid") 7 } 8 installation saveinbackground { 9 (success bool, error error?) in 10 if (success) { 11 print("you have successfully saved your push installation to back4app!") 12 } else { 13 if let myerror = error{ 14 print("error saving parse installation \\(myerror localizeddescription)") 15 }else{ 16 print("uknown error") 17 } 18 } 19 } 20 } 21 } 3\ 由于我们现在将用户的对象id作为安装对象的一部分进行存储,因此我们不想在用户登录之前请求新的推送令牌。我们不想直接从appdelegate swift文件的函数‘application didfinishlaunchingwithoptions’请求令牌,而是希望从loggedinviewcontroller的函数‘viewdidappear’中调用它。在‘viewdidappear’中,我们调用appdelegate上的一个函数,以请求apple的推送通知令牌的访问权限。由于您只能在登录后查看此部分,因此我们可以假设在创建安装对象时用户已登录,但为了安全起见,我们使用了‘if let语句’来解包parse currentuser()对象并检索对象id。 loggedinviewcontroller swift 1 override func viewdidappear( animated bool) { 2 appdelegate? startpushnotifications() 3 } appdelegate swift 1 if let userid = pfuser current()? objectid { 2 installation setobject(userid, forkey "userid") 3 } 4\ 好的,现在,注册或登录。在你的物理设备上 (iphone 或 ipad)启动应用程序。你应该看到下面的图像。你应该注册以创建一个新用户,或者如果你已经在应用程序上创建了用户,则登录。 这将是它的样子: 你现在应该能够看到 loggedinviewcontroller。它应该是这样的。 如果你尝试向自己发送推送,它将无法工作,因为我们还没有将这些方法添加到云代码中。所以这就是我们接下来要做的。 8 将目标推送方法添加到云代码 打开你之前创建的 main js main js 文件,并添加以下函数以通过用户 id 进行目标安装。 在此操作中需要使用 主密钥 。 parse server 3 x // main js 1 parse cloud define('sendpushtoyourself', (request) => { 2 let userid = request user id; 3 4 let query = new parse query(parse installation); 5 query equalto("userid", userid); 6 query descending("updatedat"); 7 return parse push send({ 8 where query, 9 data { 10 title "hello from the cloud code", 11 alert "back4app rocks! single message!", 12 } 13 }, { usemasterkey true }); 14 }); 15 16 parse cloud define('sendpushtoallusers', (request) => { 17 let currentuser = request user; 18 let userids = \[currentuser id]; 19 20 let query = new parse query(parse installation); 21 query containedin('userid', userids); 22 return parse push send({ 23 where query, 24 data { 25 title "hello from the cloud code", 26 alert "back4app rocks! group message!", 27 } 28 }, { usemasterkey true }); 29 }); parse server 2 x //main js 1 parse cloud define('sendpushtoyourself', function (request, response) { 2 var currentuser = request user; 3 var userid = currentuser id; 4 5 var query = new parse query("installation"); 6 query equalto("userid", userid); 7 query descending("updatedat"); 8 parse push send({ 9 where query, 10 data { 11 title "hello from the cloud code", 12 alert "back4app rocks! single message!", 13 } 14 }, { 15 usemasterkey true, 16 success function () { 17 response success("success sending a single push!"); 18 }, 19 error function (error) { 20 response error(error code + " " + error description); 21 } 22 }); 23 }); 24 25 parse cloud define('sendpushtoallusers', function (request, response) { 26 var currentuser = request user; 27 var userids = \[currentuser id]; 28 29 var query = new parse query(parse installation); 30 query containedin('userid', userids); 31 parse push send({ 32 where query, 33 data { 34 title "hello from the cloud code", 35 alert "back4app rocks! group message!", 36 } 37 }, { 38 usemasterkey true, 39 success function () { 40 response success('success sending a group push!'); 41 }, 42 error function (message) { 43 response error(error code + " " + error description); 44 } 45 }); 46 }); 9 上传到云代码 前往您的应用程序,点击 https //www back4app com/ ,然后点击 仪表板 仪表板 找到 云代码 云代码 ,然后点击 函数与网络托管 函数与网络托管 。它看起来像这样 3\ 上传或创建一个新文件(您也可以直接在浏览器中编辑当前的 main js main js 文件)。然后,点击 部署 部署 ,如图所示 10 测试您是否可以向自己发送定向推送通知 在模拟器中打开您的应用程序,同时保持您的物理设备关闭并锁定屏幕。 您可以通过按下“向自己发送推送”按钮和“向一组人发送推送”按钮来测试这两个推送功能是否正常工作。您应该在设备的锁定屏幕上看到推送通知。 最后的想法 现在,您应该对如何根据用户的频道、用户的对象 id 或任何其他涉及获取用户对象 id 的查询来发送推送有了清晰的理解。 请记住,为了存储用户的对象 id,您必须将其添加到推送安装中,并且仅在用户登录时请求推送令牌。通过查询发送推送时,请注意默认情况下结果限制为 100 个,某些用户可能有多个安装对象。 此外,不建议向超过 100 个结果的安装对象数组发送推送。这可能导致某些推送未被发送。如果您处理的是大群体,最好使用频道或分批发送推送。 完成了! 在这个阶段,您可以通过 back4app 使用云代码发送推送通知!恭喜!