PHP 的 OneSignal 推送通知

OneSignal push notification with PHP

我是 onesignal 第一次使用。我已经在研发上花费了太多时间。但产量几乎为零。所以我按照我的要求去做。

我已经成功开发了onesignal demo。但它是独立于用户的。如果我触发通知,所有设备都会收到通知。所以这是我的问题。

如果有人能告诉我基本的例子,我将不胜感激。我来自 PHP 一方。如果我从 PHP 开发者的角度得到答案,那对我来说会很好。我已经在 Whosebug 上问过 。但答案来自 Android 观点。但我认为他不知道在服务器端,我们必须管理所有设备。所以我没有从那个答案中得到更多。

  • 要为单个用户存储多个设备,您必须在 某种方式。您可以打开网络挂钩,当新用户订阅时,您 可以发送他的身份信息(id、电子邮件等)。有了这个数据 你会得到他的新设备ID。然后你必须以你想要的方式存储它 像。
  • 要跟踪用户登录与否,可以使用identify 信息:登录和注销时向API发送请求。 请注意,用户可以在一台设备上登录并注销 其他.
  • 这就是为什么我也会成对发送设备 ID 和存储记录的状态,但您可以按照自己喜欢的方式进行。

Onesignal 是一个很好的平台,可以向不同类型的设备发送推送通知。我在我的项目中使用相同的。我正在做的是,无论何时用户登录,我都会从客户端获取设备令牌并使用他们的 API 在 onesignal 中创建一个用户。 (我相信您知道如何使用 google 项目编号和 google API 密钥 android、ios 的 p12 文件等来配置 onesignal... )

Android 视角:

  • 我们必须记住一件事,只要 google 项目编号和 google API 密钥是设备的 gcm 令牌将始终保持不变没有改变。
  • 如果同一个项目有不同的应用程序,如 b2b、b2c 等...(具有相同的数据库和后端),您的 google API 键将改变,gcm 也是如此token 和 onesignal 玩家 id 也是如此。

因此,对于相同的 google API 密钥,onesignal 将始终 return 相同的玩家 ID,即使您再次删除并创建用户也是如此。 在大型项目中,开发人员应该预料到用户可能会登录到不同的设备(android、ios 等)。所以一个用户可以有多个令牌,玩家id也是如此。您的另一个要求是用户不希望在未登录时收到通知。

考虑到您的所有要求,我可以建议您使用一种 MySQL table 结构来存储用户详细信息。

  1. 一个table存储设备类型(可选)

      -id
      -device_type
    
  2. 一个用来存储代币和玩家 ID

      -token_id
      -user_id
      -device_id
      -device_token
      -onesignal_player_id
      -subscription
    

onesignal 需要这两个 table 才能工作。

案例 1:

每当用户尝试登录时,首先检查令牌 table。查找是否有任何其他用户具有相同的给定令牌(这意味着另一个用户使用同一设备登录)。如果有,请删除此类令牌。然后在 onesignal 中创建一个新玩家并将详细信息保存到 token table 中。将订阅标记为1,订阅通知。每当用户登出时,将订阅标记为0,即取消订阅通知。

案例二:

每当用户登录时,检查令牌是否已存在于 table 中。如果是,并且token的拥有者是同一个,那么就把订阅标记为1,这样他就可以收到进一步的通知了。

案例三:

当用户使用另一台设备登录时(一次多台设备),gcm token 肯定会不同。因此,将其另存为同一用户的另一个令牌并将订阅标记为 1。因此,两台设备都会收到通知。

最后,在发送通知之前,获取订阅的特定用户的所有令牌,并一次将通知发送给所有人。这将解决您的问题。

我知道这可能有点令人困惑。不过别担心,我们可以解决它。

$至 - 设备 ID

$title - 通知标题

$message - 通知消息

$img - 全图 link

用法:

sendnotification($to, $title, $message, $img);

具有演示值:

sendnotification("Device_ID","测试通知","测试消息","https://www.google.co.in/images/branding/googleg/1x/googleg_standard_color_128dp.png");

function sendnotification($to, $title, $message, $img)
{
    $msg = $message;
    $content = array(
        "en" => $msg
    );
    $headings = array(
        "en" => $title
    );
    if ($img == '') {
        $fields = array(
            'app_id' => 'YOUR_APP_ID',
            "headings" => $headings,
            'include_player_ids' => array($to),
            'large_icon' => "https://www.google.co.in/images/branding/googleg/1x/googleg_standard_color_128dp.png",
            'content_available' => true,
            'contents' => $content
        );
    } else {
        $ios_img = array(
            "id1" => $img
        );
        $fields = array(
            'app_id' => 'YOUR_APP_ID',
            "headings" => $headings,
            'include_player_ids' => array($to),
            'contents' => $content,
            "big_picture" => $img,
            'large_icon' => "https://www.google.co.in/images/branding/googleg/1x/googleg_standard_color_128dp.png",
            'content_available' => true,
            "ios_attachments" => $ios_img
        );

    }
    $headers = array(
        'Authorization: key=**APP_KEY**',
        'Content-Type: application/json; charset=utf-8'
    );
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, 'https://onesignal.com/api/v1/notifications');
    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);
    return $result;
}