使用Flutter + OneSignal发送Player消息的推送通知

时间:2019-03-19 19:49:49

标签: php flutter cakephp-3.0 onesignal

我正在创建一个日历式的推送系统。当我为用户创建时间表时,系统仅向他发送通知,我创建了用于管理此PHP的系统,有人知道如何帮助我吗?

2 个答案:

答案 0 :(得分:0)

我距离移动应用专家还很远,所以应该有人纠正/确认这一点。

要在应用中完成推送通知,您可以使用“实时”连接(例如websocket),也可以使用轮询。

我对websockets不太了解,我不认为CakePHP可以做到这一点(不确定)。编辑:绝对不可能开箱即用,但是存在插件。

使用轮询时,您会经常重复GET请求(每小时一次,每分钟一次,具体取决于需求),并检查是否有新信息。
例如,您的CakePHP页面可以是一个带有lastUpdated参数的操作,该参数从该时间戳开始返回新信息。然后,应用会每x分钟请求此页面,每次设置lastUpdated参数。当有新信息时,响应将不为空,应用程序可以对其进行处理。

这确实意味着该应用程序需要始终在后台运行,并且请求数量可能变得很大(取决于轮询间隔)。

答案 1 :(得分:0)

如果您使用的是OneSignal。您可以使用Playerid将其发送到该单独的设备,但是您必须在服务器端存储Playerid,以便知道要发送到哪个设备。我个人在初始化状态下执行此操作,并对我的api进行了http.post操作,将特定用户的playerid保存到数据库中。

您当然可以通过使用OneSignal的标签来实现相同的功能(如果同一个人在一台设备上具有多个帐户,则很有用)。

要发送通知,请在php中使用curl。

<?php
function sendMessage(){
    $content = array(
        "en" => 'English Message'
        );

    $fields = array(
        'app_id' => "your-app-id",
        'include_player_ids' => array("playerid-you-want-to-send-to"),
        'data' => array("foo" => "bar"),
        'contents' => $content
    );

    $fields = json_encode($fields);
    print("\nJSON sent:\n");
    print($fields);

    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, "https://onesignal.com/api/v1/notifications");
    curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type: application/json; charset=utf-8'));
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
    curl_setopt($ch, CURLOPT_HEADER, FALSE);
    curl_setopt($ch, CURLOPT_POST, TRUE);
    curl_setopt($ch, CURLOPT_POSTFIELDS, $fields);
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);

    $response = curl_exec($ch);
    curl_close($ch);

    return $response;
}

$response = sendMessage();
$return["allresponses"] = $response;
$return = json_encode( $return);

print("\n\nJSON received:\n");
print($return);
print("\n");
?>

在Flutter中,获取软件包,将其导入,然后:

void oneSignal() {
OneSignal.shared.init("app-id");

OneSignal.shared.setNotificationReceivedHandler((OSNotification notification) 

   {
     //do what you need to do with upcoming notification, get title for example
     print(notification.payload.title);
   }
}