【问题标题】:How to send a silent Push Notification payload如何发送静默推送通知有效负载
【发布时间】:2016-07-19 08:18:33
【问题描述】:

我只想知道如何确定在静默推送中执行什么操作:

这是我发给客户的aps

"aps": {
    "content-available": 1
}

我现在的问题是当我添加type: "Order_Update" 以确定静默推送是为了让订单更新显示警报通知时。

【问题讨论】:

    标签: ios swift push-notification apple-push-notifications


    【解决方案1】:

    有几个选项!让我们来了解一下所有不同的有效载荷及其用法。


    简单有效负载

    在通知中心显示:是

    唤醒应用执行后台任务:否

    {
        "aps" : {
            "alert" : "You received simple notification!",
            "badge" : 1,
            "sound" : "default"
        }
    }
    

    带有自定义通知声音的负载

    在通知中心显示:是

    唤醒应用执行后台任务:否

    Step 1 :在您的应用程序包中添加自定义通知声音文件(仅限 .wav 或 .aiff 扩展名。例如 notification.wav)。

    Step 2 :如下所示配置您的有效负载以播放您的自定义声音

    {
        "aps" : {
            "alert" : "It's a custom notification sound!",
            "badge" : 1,
            "sound" : "notification.wav"
        }
    }
    

    带有自定义负载的通知

    在通知中心显示:是

    唤醒应用执行后台任务:否

    {
        "aps" : {
            "alert" : "It's a notification with custom payload!",
            "badge" : 1,
            "content-available" : 0         
        },
        "data" :{
            "title" : "Game Request",
            "body" : "Bob wants to play poker",
            "action-loc-key" : "PLAY"
        },
    
    }
    

    这里的data 字典包含您想要的任何自定义信息。它还将显示为带有警报消息“这是带有自定义有效负载的通知!”的普通通知。


    正常静音通知

    它不会将警报显示为通知栏;它只会通知您的应用有一些新数据可用,提示应用获取新内容。

    在通知中心显示:否

    唤醒应用执行后台任务:是

    {
        "content-available" : 1
    }
    

    带有自定义负载的静默通知

    显示通知警报以及在后台唤醒您的应用程序以执行任务的魔法来了! (注意:仅当它在后台运行并且未被用户明确杀死时。) 只需在您的有效负载中添加额外的参数"content-available" : 1

    在通知中心显示:是

    唤醒应用执行后台任务:是

    {
        "aps" : {
            "alert" : "Notification with custom payload!",
            "badge" : 1,
            "content-available" : 1
        },
         "data" :{
            "title" : "Game Request",
            "body" : "Bob wants to play poker",
            "action-loc-key" : "PLAY"
         }
    }
    

    根据您的应用要求使用任何这些负载。对于background app refresh,请参阅Apple's documentation。我希望这可以为您提供所有必要的信息。快乐编码:)

    【讨论】:

    • 很好的答案,但我认为您错过了带有自定义有效负载部分的通知中的数据参数。
    • 感谢@LiborZapletal 注意到它,我已经更新了答案。
    • 根据 Apple 文档,“content-available”必须在“aps”内。developer.apple.com/library/content/documentation/…为什么在“aps”之外使用它?
    • 我看不出第 3 个示例(带有自定义负载的通知)和第 5 个(带有自定义负载的静默通知)示例推送字典之间有任何区别。为什么它会导致不同的后台执行行为,第 3 次为 NO,第 5 次为 YES?如果启用了某些项目设置,它们都会将应用程序带入后台状态并执行代码。
    • @DipenPanchasara @rach 它确实调用了applicationDidFinishLauchingWithOptions。在我们的例子中,应用程序从应用程序托盘中被杀死。但是当收到带有content-available 1 有效负载的推送通知时。 applicationDidFinishLauchingWithOptions 被调用。另一个参考:stackoverflow.com/a/34728550/1045672
    【解决方案2】:

    据我了解,您需要在有效负载中添加额外数据,以便您可以识别推送通知类型是什么,或者需要处理什么操作。

    为此,将您的有效负载编辑为:

     $body = array(
        'content-available' => 1,
        'sound' => ''
        );  
    
    $payload = array();
    $payload['aps'] = $body;
    $payload['action'] = 'order_update';
    

    然后在你的 iOS 代码中:

    - (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo
    {
    
    
        NSString *action = userInfo["action"];
    
    
        if([userInfo[@"aps"][@"content-available"] intValue]== 1 && [action isEqualToString:@"order_update") //order update notification
        {
            //handle Your Action here
            return;
        }
    
    
    }
    

    希望这能解决您的问题!

    【讨论】:

      【解决方案3】:

      还请检查apns-push-type(watchOS 6 及更高版本需要;推荐用于 macOS、iOS、tvOS 和 iPadOS)此标头的值必须准确反映通知负载的内容。如果不匹配,或者所需系统上缺少标头,APN 可能会返回错误、延迟通知的传递或完全放弃通知。 https://developer.apple.com/documentation/usernotifications/setting_up_a_remote_notification_server/sending_notification_requests_to_apns

      【讨论】:

        猜你喜欢
        • 2018-02-17
        • 2021-04-26
        • 2015-04-10
        • 2015-01-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-05-31
        相关资源
        最近更新 更多