PHP 的 OneSignal 推送通知
OneSignal push notification with PHP
我是 onesignal 第一次使用。我已经在研发上花费了太多时间。但产量几乎为零。所以我按照我的要求去做。
- 我有一个网站。 iOS 网站的应用程序和 Android 应用程序。就像 whatsapp 或 facebook。
- 当用户登录上述任何一项时,用户应该收到 webpush 通知或 iOS 通知,具体取决于登录的设备。
- 如果用户同时登录网站和 iOS 应用程序,用户应该在两者上都收到通知。
- 如果用户从 iOS 注销,用户在再次登录之前不应在 iOS 设备中收到通知。
- 如果另一个用户登录同一个 iOS 应用程序,他不应收到上次登录用户的通知。他应该只会收到与他相关的通知。
- 网站也一样。
我已经成功开发了onesignal demo。但它是独立于用户的。如果我触发通知,所有设备都会收到通知。所以这是我的问题。
- 我从事过 GCM(我来自 PHP 背景)。因此,据我所知,推送通知适用于设备 ID。那么我应该在我的 mysql 数据库中存储单个用户的多个设备 ID(对于 chrome、iOS、android 等)吗?
- 我将如何获得该设备 ID?请记住,如果用户未登录,我不想发送通知。
- 如何将它存储在我的数据库中?我将通过调用 API 将该设备 ID 传递到我的服务器,我的服务器会将其存储在数据库中。但是我应该什么时候发送?因为如果用户没有登录,那么我怎么知道我必须为哪个用户保存设备 ID?
- 如何检查用户是否在设备上更改或相同或已注销?
如果有人能告诉我基本的例子,我将不胜感激。我来自 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 结构来存储用户详细信息。
一个table存储设备类型(可选)
-id
-device_type
一个用来存储代币和玩家 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;
}
我是 onesignal 第一次使用。我已经在研发上花费了太多时间。但产量几乎为零。所以我按照我的要求去做。
- 我有一个网站。 iOS 网站的应用程序和 Android 应用程序。就像 whatsapp 或 facebook。
- 当用户登录上述任何一项时,用户应该收到 webpush 通知或 iOS 通知,具体取决于登录的设备。
- 如果用户同时登录网站和 iOS 应用程序,用户应该在两者上都收到通知。
- 如果用户从 iOS 注销,用户在再次登录之前不应在 iOS 设备中收到通知。
- 如果另一个用户登录同一个 iOS 应用程序,他不应收到上次登录用户的通知。他应该只会收到与他相关的通知。
- 网站也一样。
我已经成功开发了onesignal demo。但它是独立于用户的。如果我触发通知,所有设备都会收到通知。所以这是我的问题。
- 我从事过 GCM(我来自 PHP 背景)。因此,据我所知,推送通知适用于设备 ID。那么我应该在我的 mysql 数据库中存储单个用户的多个设备 ID(对于 chrome、iOS、android 等)吗?
- 我将如何获得该设备 ID?请记住,如果用户未登录,我不想发送通知。
- 如何将它存储在我的数据库中?我将通过调用 API 将该设备 ID 传递到我的服务器,我的服务器会将其存储在数据库中。但是我应该什么时候发送?因为如果用户没有登录,那么我怎么知道我必须为哪个用户保存设备 ID?
- 如何检查用户是否在设备上更改或相同或已注销?
如果有人能告诉我基本的例子,我将不胜感激。我来自 PHP 一方。如果我从 PHP 开发者的角度得到答案,那对我来说会很好。我已经在 Whosebug 上问过
- 要为单个用户存储多个设备,您必须在 某种方式。您可以打开网络挂钩,当新用户订阅时,您 可以发送他的身份信息(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 结构来存储用户详细信息。
一个table存储设备类型(可选)
-id -device_type
一个用来存储代币和玩家 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;
}