悄悄地从我的服务器发送推送通知到我的应用程序

Posted

技术标签:

【中文标题】悄悄地从我的服务器发送推送通知到我的应用程序【英文标题】:Silently send push notifications from my server to my app 【发布时间】:2014-02-08 18:54:57 【问题描述】:

设置:我已经成功地在我的服务器上部署了一个推送通知系统!话虽如此,我可以向我的 ios 设备发送通知,这些设备可以在网络服务器上发生某些事情时发送警报消息,例如:当新客户添加到系统时。

这样会显示一个很好的消息

您有一个新客户。更多的钱宝贝!

当我的应用程序打开时,通知当然是静默的,只是自动为我更新客户表,因此我不必手动刷新我的表。

问题:从那时起系统已经扩大规模,现在我的设备一直收到这样的消息,至少每小时都会收到几条消息,这让我很困扰。

我提出的解决方案是只在每次添加新用户时更新我的​​表,因此这需要为每个创建的新用户发送推送通知,这很完美,但对于它不会像以前那样在我的通知中心显示消息。

问题:有没有办法静默发送推送通知,这样我的设备上就不会收到类似的消息,但是当应用程序运行时推送通知仍然弹出这样我就可以更新 UI 而无需手动刷新客户的表格? 是否只是将我的服务器发送的 json 推送通知的正文参数留空的情况?

我不想要的:我不想解决必须从我自己的应用程序中隐藏通知的问题:')

【问题讨论】:

你能不能不修改服务器使其发送的内容不那么激进? @Wain 感谢您的评论。我仍然需要服务器在每次添加用户时更新我,以便在有新数据可用时更新客户表。我提出的这个案例只是其他重要事情的一个例子。因此,一旦在另一台设备上修改了数据,就需要立即更新 UI,因此会出现aggressive 通知。 @Wain 在我以前的系统中,当我没有实现通知时,我为我的表设置了一个计时器,以按设定的时间间隔更新。这显然是低效的,因为向服务器发出盲目的 API 请求,询问是否有任何更新的数据需要在客户端显示。 如***.com/questions/14427512/… 的回答中所建议的那样,仅发送带有徽章计数的通知,不发送警报消息或声音怎么样。 啊,所以它们被称为警报消息!您能否显示它@MartinR 的 json 表示?然后我可以继续并立即标记答案!太好了,所以我必须留意警报推送通知。 【参考方案1】:

您可以使用 iOS 7+ 的静默推送通知。

如果在您从服务器发送的负载中添加值为 1 的键“content-available”并删除键“alert”,您将收到推送,但不会在屏幕上收到消息。

当您收到此类推送时,您将有 30 秒的执行时间*,该时间足以刷新您的用户表,并且在您下次打开应用程序时,您将获得最新的表数据。

系统会唤醒你的应用并调用方法

- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult result))handler

在 AppDelegate.m 上

格式负载应该是:

"aps":"content-available":1

如果你想像徽章或额外的字典数据来使用它,你也可以添加更多字段,是可选的。

"aps":"content-available":1, "sound":"", "badge":1

如果由于某种原因您没有收到推送,请尝试添加“声音”:“”,这似乎是无声推送的错误。

*不要忘记,如果您或用户向上滑动应用程序并终止它,则不会发生由于静默推送而导致的执行时间。

我希望这对你有用! :)

【讨论】:

静默推送可以随身携带数据,这样应用之后就不用再去取数据了吗?即 "aps":"content-available":1, "sound":"", "badge":1, "data": "...." 嗨罗纳德维达。是的,您可以将 json 数据添加到有效负载中,但这不是一个好主意。 developer.apple.com/library/ios/documentation/…【参考方案2】:

根据"Local and Push Notification Programming Guide",aps 字典包含一个或多个属性,它们指定以下操作:

向用户显示的警报消息 用于标记应用程序图标的数字 播放声音

因此,您可以发送仅包含徽章计数的通知。有效载荷将 看起来像


    "aps" : 
        "badge" : 9
    

【讨论】:

【参考方案3】:

这里是格式

/*
 aps =   
 
 Name = "";
 alert = "Testing";
 price = 0;
 //sound = default;//do not send it from server
 type = add;
 ;
 */

【讨论】:

【参考方案4】:

在应用打开时快速获取远程通知

     func application(application: UIApplication, didReceiveRemoteNotification userInfo: [NSObject : AnyObject])
     

        if let aps = userInfo["aps"] as? NSDictionary  
        var message = aps["alert"]
        println("my messages : \(message)")

        
     

【讨论】:

以上是关于悄悄地从我的服务器发送推送通知到我的应用程序的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Firebase 从我的服务器发送 iOS 推送通知?

Azure 移动应用程序:无法从我的 nodeJS 后端发送推送通知

来自服务器的 Apple 推送通知

当我的应用在 fg 上时,我的应用如何发送推送通知?

推送通知不仅从我的设备发送 - 解析

接收 PushKit VoIP 通知 iOS