Xamarin中的后台推送通知

时间:2018-01-09 11:03:00

标签: android ios xamarin push-notification firebase-cloud-messaging

请考虑以下问题:

我正在使用以下插件为Xamarin执行推送通知,我试图让它在iOS和Androids上运行。

https://github.com/CrossGeeks/FirebasePushNotificationPlugin

我还使用以下PHP代码从网站向设备发送推送通知。

$fields = array
(
    'to' => $ID->notification_token,
    "content_available" => true,
    'priority'=>10,
    'notification' => array('title' => 'You have a new message', 'body' => 'Hooray', 'sound'=>'default', 'vibration'=>'default'),
);

$headers = array
(
    'Authorization: key=' . PUSH_NOTIFICATION_API_ACCESS_KEY,
    'Content-Type: application/json',
);

$ch = curl_init();
curl_setopt( $ch,CURLOPT_URL, 'https://android.googleapis.com/gcm/send' );
curl_setopt( $ch,CURLOPT_POST, true );
curl_setopt( $ch,CURLOPT_HTTPHEADER, $headers );
curl_setopt( $ch,CURLOPT_RETURNTRANSFER, true );
curl_setopt( $ch,CURLOPT_SSL_VERIFYPEER, false );
curl_setopt( $ch,CURLOPT_POSTFIELDS, json_encode( $fields ) );
$result = curl_exec($ch );
curl_close( $ch );
echo $result;

现在问题出现在iOS上我发现推送通知是可靠的并且在应用程序处于前台时运行良好,但是一旦我将它背景(或锁定屏幕),它们就会停止通过直到我再次前景,然后在后台发送的所有通知都会立即通过。

根据插件“使用入门”指南,我在info.plist启用了后台处理。

我尝试将content_availiable更改为content-availiable,同时将其移至通知数组中,同时将其值设置为true'true',{{1} }和1

我还尝试将'1'添加到通知和整体有效负载中,但是在前景未锁定状态之外我仍然无法使其工作。

我还注意到实际通知列表中没有任何内容触发(从屏幕顶部拉下来),我知道正在接收通知的唯一方法是播放某个声音文件,因为它是通过写入在调试日志中。

感谢您的支持,感谢您的帮助。

3 个答案:

答案 0 :(得分:5)

如果您希望它在不在后台运行时显示在iOS上,请确保您的消息Json具有{"content-available" : "1", "alert" : ""}属性。

对于Android,推送通知确实不是100%可靠,有特定设备的障碍可能会阻止您的通知显示。

可能会有"测试发送" Firebase上的功能(到目前为止我只使用过Azure Push Hub),因此您可以尝试查看您的消息Json是否配置正确。

答案 1 :(得分:3)

我会尝试发送数据消息

$fields = array
(
    'to' => $ID->notification_token,
    "content_available" => true,
    'priority'=>10,
    'data' => array('title' => 'You have a new message', 'body' => 'Hooray', 'sound'=>'default', 'vibration'=>'default'),
);

答案 2 :(得分:0)

当应用程序在后台时,使用 ApnsConfig 在 iOS 中显示警报。这对我有用。

var pushMessage = new FcmMessage
        {
            Data = new Dictionary<string, string>
                    {
                        { Constants.PushMessages.MessageId, $"{message.MessageId}" },
                        { Constants.PushMessages.TopicId, $"{message.TopicId}" },
                        { Constants.PushMessages.Type, $"{message.Type}" },
                        { Constants.PushMessages.Title, message.Title },
                        { Constants.PushMessages.Content, message.Content },
                        { Constants.PushMessages.CreatedBy, message.CreatedBy },
                        { Constants.PushMessages.CreatedOn, $"{message.CreatedOn}" }
                    },
            Token = registrationToken,
            Apns = new ApnsConfig
            {
                Aps = new Aps
                {
                    Alert = new ApsAlert
                    {
                        Title = message.Title,
                        Body = message.Content
                    }
                }
            }
        };
        await FirebaseMessaging.DefaultInstance.SendAsync(pushMessage);