我使用Eclipse创建了一个移动应用程序。
服务器通过GCM(在Php中)发送推送通知。
首次安装APK时,它会发送一个推送通知,该通知正常。对于秒时间(同一设备上的相同APP),它发送两次,第三次,三次,依此类推。
我发现问题是由添加更多相同设备的ID引起的。因此,如果我手动删除所有ID并再次安装APK,它将正常工作。
{
"_id" : 0, // auto increment primary key for "Object" collection
club" : 0, // auto increment primary key for "Club" collection
}
Android方
$url = 'https://android.googleapis.com/gcm/send';
$fields = array('registration_ids' => $registatoin_ids,'data' => $message,); $headers = array( 'Authorization: key=' . 'asbjadbdb','Content-Type: application/json');
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
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);
if ($result === FALSE) { die('Curl failed: ' . curl_error($ch));}
curl_close($ch);
echo $result;
答案 0 :(得分:1)
这就是我设法使用PHP通过GCM处理推送通知的方法。
服务器是一个复杂的REST服务器,但是现在你只需要理解它的一小部分。
Push token
您需要Push token
才能确定GCM应向哪个设备发送推送。因此,您需要存储它,但请记住它可能会发生变化,如果发生这种情况,您的应用程序需要将新的服务器发送到服务器,并且需要在数据库中进行更改。
Push notification
要发送推送通知,我从数据库中恢复Push token
,然后使用PushSender
类实际发送push notification
使用push token
服务器中的查询检索MySql
。
使用PushSender
类:
$push = new PushSender('The push title','The message',$push_token]);
$ret = $push->sendToAndroid();
// Check $ret value for errors or success
PushSender
类:
Class PushSender {
private $title;
private $message;
private $pushtoken;
private static $ANDROID_URL = 'https://android.googleapis.com/gcm/send';
private static $ANDROID_API_KEY = 'YOUR-API-KEY';
public function __construct($title, $message, $pushtoken){
$this->title = $title;
$this->message = $message;
$this->pushtoken = $pushtoken;
}
public function sendToAndroid(){
$fields = array(
'registration_ids' => array($this->pushtoken),
'data' => array( "title"=>$this->title, "message" => $this->message ),
);
$headers = array(
'Authorization: key=' . self::$ANDROID_API_KEY,
'Content-Type: application/json'
);
$ch = curl_init();
curl_setopt( $ch, CURLOPT_URL, self::$ANDROID_URL);
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_SSL_VERIFYHOST , false );
curl_setopt( $ch, CURLOPT_POSTFIELDS, json_encode( $fields ) );
$result = curl_exec($ch);
if( curl_errno($ch) ){
curl_close($ch);
return json_encode(array("status"=>"ko","payload"=>"Error: ".curl_error($ch)));
}
curl_close($ch);
return $result;
}
}
push notification
。public class PushListenerService extends GcmListenerService {
@Override
public void onMessageReceived(String from, Bundle data) {
String message = data.getString("message");
// Do whatever you need to do
// Then send the notification
sendNotification(message);
}
private void sendNotification(String message) {
Intent intent = new Intent(this, YourClass.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
PendingIntent pendingIntent = PendingIntent.getActivity(this, 0 /* Request code */, intent,
PendingIntent.FLAG_ONE_SHOT);
Uri defaultSoundUri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(this)
.setSmallIcon(R.drawable.an_icon)
.setContentTitle(getString(R.string.app_name))
.setContentText(Helpers.getString(R.string.push_notification_message))
.setAutoCancel(true)
.setSound(defaultSoundUri)
.setContentIntent(pendingIntent);
try{
notificationBuilder
.setLargeIcon(Bitmap.createBitmap(((BitmapDrawable)getDrawable(R.drawable.your_icon)).getBitmap()));
}catch (NullPointerException e) {
e.printStackTrace();
}
NotificationManager notificationManager =
(NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
notificationManager.notify(0 /* ID of notification */, notificationBuilder.build());
}