Skip to content
This repository has been archived by the owner on Apr 1, 2024. It is now read-only.

プッシュ通知登録APIをPHPから叩く方法 #346

Closed
ggj-tanaka opened this issue Jan 22, 2016 · 6 comments
Closed

プッシュ通知登録APIをPHPから叩く方法 #346

ggj-tanaka opened this issue Jan 22, 2016 · 6 comments

Comments

@ggj-tanaka
Copy link

お世話になっております。

質問ではないのですが、同じような境遇の方がいたら…と思い投稿いたします。
表記の通りで、「プッシュ通知登録APIをPHPから叩く方法」をコーディングしてみました。
レビュー等、もっと簡単に書ける方法等ありましたらお願いします。

#271のyskfjさんのコードをほぼそのまま使わせていただきました。
yskfjさん助かりました。
curlで書きたかったのですが挫折しました…org

●installationクラスの、pushFlgという列の値がtrueの端末にプッシュ登録する
というものです。
事前にinstallationクラスにpushFlgという列を追加しておく(※)必要があります。
※NCMB管理画面→データストア→installation→新しいフィールド
 で追加します。

<?php
//プッシュ通知登録用API
$apiApplicationKey = 'アプリケーションキー';
$apiClientKey      = 'クライアントキー';
$scheme      = 'https';
$apiEndpoint = 'mb.api.cloud.nifty.com';
$apiVersion  = '2013-09-01';
$apiClass    = 'push';

date_default_timezone_set("UTC");
$currentDateTime = date('Y-m-d\TH:i:s.000\Z');
$signatureString  = 'POST'."\n".$apiEndpoint."\n".'/'.$apiVersion.'/'.$apiClass."\n".'SignatureMethod=HmacSHA256&SignatureVersion=2&X-NCMB-Application-Key='.$apiApplicationKey.'&X-NCMB-Timestamp='.$currentDateTime;
$signature = base64_encode( hash_hmac('sha256',$signatureString,$apiClientKey,true) );
$url  = $scheme . '://' . $apiEndpoint . '/' . $apiVersion . '/' . $apiClass;

//即時配信、Android、メッセージ、installationクラスのpushFlg列がtrueの端末
$query = '{"immediateDeliveryFlag":true, "target":["android"], "message":"テスト", "searchCondition":{"pushFlg":true}}';

$result = file_get_contents(
    $url,
    false,
    stream_context_create(
        array(
            'http' => array(
                'method' => "POST",
                'header' => array(
                        "\r\n",
                        'X-NCMB-Application-Key:'.$apiApplicationKey,
                        'X-NCMB-Signature:'.$signature,
                        'X-NCMB-Timestamp:'.$currentDateTime,
                        "Content-Type: application/json"
                ),
                'content' => $query
            )
        )
    )
);

var_dump($result);

$queryの行で「target」を指定しないと、プッシュに登録はされるが配信エラーになります。
androidとios両方を指定する方法をご存じの方いらっしゃいましたらご教授願います。

@goofmint
Copy link

👍

targetは ["ios","android"] で良いんじゃないかなと。エラーになりますか?

@ggj-tanaka
Copy link
Author

moongiftさん

すごい早さですねw
コメントありがとうございます。

["ios","android"]

この記述だと、プッシュの登録自体はできていますが、
NCMBの管理画面で確認すると、
ステータス 「配信エラー」
配信数 「0」
となります。

@ggj-tanaka
Copy link
Author

怪しい箇所を見つけました。

NCMBの管理画面
→アプリ設定
→プッシュ通知
→iOSプッシュ通知

まだiOSの証明書の設定を行っていません。
これが原因でしょうか?

@goofmint
Copy link

おそらくそうですね。管理画面からの場合、iOS/Androidのチェックボックス自体が有効になっていないので、入力できません。REST API経由だと設定できてしまいますが、エラーになっているのだと思います。

@ggj-tanaka
Copy link
Author

moongiftさん

コメントありがとうございます。
やはりそうですよね。
iOSの証明書の設定をした後、結果をご報告します。

@ggj-tanaka
Copy link
Author

ご報告です。

["ios","android"]

この件ですが、iOSの証明書の設定を行ったところ、「配信済み」となり正常にプッシュ通知されました。
installationにはiOSのデータは0件ですが問題ありませんでした。

・Androidプッシュ通知
・iOSプッシュ通知

APIで両方を指定するならば、両方とも設定すべし、ということでした。

Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.
Projects
None yet
Development

No branches or pull requests

2 participants