PubNub Push-уведомление

Я планирую использовать PubNub для отправки push-уведомлений через мобильные Push-шлюзы. Мой план состоит в том, чтобы иметь канал для каждого пользователя, с которым связан идентификатор регистрации. И когда я хочу отправить уведомление, мой PHP-сервер подпишется на уникальный канал пользователя и опубликует на нем сообщение, а затем откажется от подписки на этом канале.

Поддерживает ли PubNub язык PHP для публикации push-уведомлений (PNmessage)? Является ли приведенная выше модель действительной для отправки push-уведомлений через PubNub?

3

Решение

Вам не нужно подписываться на push-уведомления Pubnub. Просто опубликуйте сообщение на канале пользователя pubnub и включите push-уведомления на Android для этого конкретного канала. Вы получите push-уведомление в том же месте, где вы получаете уведомления GCM. Например, пусть канал 410.
Так что на андроидной стороне пиши

Pubnub.enablePushNotificationsForChannel("410");

Внутри вашего GCMListenerService вы можете получать сообщения.

Если вы не используете GCM,

На стороне Android пишите,

public void subscribe() {
String[] channels = {PrefUtils.getUserId(context) + "", ChatUtils.getDeliveryChannel(PrefUtils.getUserId(context)), ChatUtils.getReadChannel(PrefUtils.getUserId(context))};
try {
this.getPubnubInstance().subscribe(channels, new Callback() {
@Override
public void successCallback(String channel, Object message) {
super.successCallback(channel, message);
if (PubnubWrapper.this.onPubnubMessageReceiveListener != null)
PubnubWrapper.this.onPubnubMessageReceiveListener.onMessageReceived(channel, message);
}

@Override
public void connectCallback(String channel, Object message) {
super.connectCallback(channel, message);
}

@Override
public void reconnectCallback(String channel, Object message) {
super.reconnectCallback(channel, message);
}

@Override
public void disconnectCallback(String channel, Object message) {
super.disconnectCallback(channel, message);
}

@Override
public void errorCallback(String channel, PubnubError error) {
super.errorCallback(channel, error);
}
});
} catch (PubnubException e) {
e.printStackTrace();
}
}

Вы можете получить сообщение в методе successCallback обратных вызовов. Но вы должны убедиться, что экземпляр Pubnub продолжает работать, что больно делать в Android.

Я реализовал полноценный модуль чата с использованием Pubnub. Когда приложение находится на переднем плане, я использую метод подписки Pubnub, а не уведомления, поскольку они быстрее. В фоновом режиме я отписываюсь от каналов и включаю push-уведомления. Как это:

public void subscribeAndDisablePush(String gcm_token) {
String[] channels = {PrefUtils.getUserId(context) + "", ChatUtils.getDeliveryChannel(PrefUtils.getUserId(context)), ChatUtils.getReadChannel(PrefUtils.getUserId(context))};
getPubnubInstance().disablePushNotificationsOnChannels(channels, gcm_token);
try {
getPubnubInstance().subscribe(channels, new Callback() {
@Override
public void successCallback(String channel, Object message) {
super.successCallback(channel, message);
}
});
} catch (PubnubException e) {
e.printStackTrace();
}
}

public void unsubscribeAndEnablePush(String gcm_token) {
String[] channels = {PrefUtils.getUserId(context) + "", ChatUtils.getDeliveryChannel(PrefUtils.getUserId(context)), ChatUtils.getReadChannel(PrefUtils.getUserId(context))};
getPubnubInstance().enablePushNotificationsOnChannels(channels, gcm_token, new Callback() {
@Override
public void successCallback(String channel, Object message) {
super.successCallback(channel, message);
Log.e("Subscribed", "YES");
}

@Override
public void errorCallback(String channel, PubnubError error) {
super.errorCallback(channel, error);
Log.e("Subscribed", "No");
}
});
getPubnubInstance().unsubscribe(channels);
}

Внутри моего класса приложения я делаю это:

Foreground.init(this).addListener(new Foreground.Listener() {
@Override
public void onBecameForeground() {
PubnubWrapper.getInstance().subscribeAndDisablePushNotifications();
}

@Override
public void onBecameBackground() {
PubnubWrapper.getInstance().unsubscribeAndEnablePushNotifications();

}
}
});

И да, это Foreground.java:

public class Foreground implements Application.ActivityLifecycleCallbacks {

public static final long CHECK_DELAY = 500;
public static final String TAG = Foreground.class.getName();

public interface Listener {

public void onBecameForeground();

public void onBecameBackground();

}

private static Foreground instance;

private boolean foreground = false, paused = true;
private Handler handler = new Handler();
private List<Listener> listeners = new CopyOnWriteArrayList<Listener>();
private Runnable check;

/**
* Its not strictly necessary to use this method - _usually_ invoking
* get with a Context gives us a path to retrieve the Application and
* initialise, but sometimes (e.g. in test harness) the ApplicationContext
* is != the Application, and the docs make no guarantees.
*
* @param application
* @return an initialised Foreground instance
*/
public static Foreground init(Application application){
if (instance == null) {
instance = new Foreground();
application.registerActivityLifecycleCallbacks(instance);
}
return instance;
}

public static Foreground get(Application application){
if (instance == null) {
init(application);
}
return instance;
}

public static Foreground get(Context ctx){
if (instance == null) {
Context appCtx = ctx.getApplicationContext();
if (appCtx instanceof Application) {
init((Application)appCtx);
}
throw new IllegalStateException(
"Foreground is not initialised and " +
"cannot obtain the Application object");
}
return instance;
}

public static Foreground get(){
if (instance == null) {
throw new IllegalStateException(
"Foreground is not initialised - invoke " +
"at least once with parameterised init/get");
}
return instance;
}

public boolean isForeground(){
return foreground;
}

public boolean isBackground(){
return !foreground;
}

public void addListener(Listener listener){
listeners.add(listener);
}

public void removeListener(Listener listener){
listeners.remove(listener);
}

@Override
public void onActivityResumed(Activity activity) {
paused = false;
boolean wasBackground = !foreground;
foreground = true;

if (check != null)
handler.removeCallbacks(check);

if (wasBackground){
Log.i(TAG, "went foreground");
for (Listener l : listeners) {
try {
l.onBecameForeground();
} catch (Exception exc) {
Log.e(TAG, "Listener threw exception!", exc);
}
}
} else {
Log.i(TAG, "still foreground");
}
}

@Override
public void onActivityPaused(Activity activity) {
paused = true;

if (check != null)
handler.removeCallbacks(check);

handler.postDelayed(check = new Runnable(){
@Override
public void run() {
if (foreground && paused) {
foreground = false;
Log.i(TAG, "went background");
for (Listener l : listeners) {
try {
l.onBecameBackground();
} catch (Exception exc) {
Log.e(TAG, "Listener threw exception!", exc);
}
}
} else {
Log.i(TAG, "still foreground");
}
}
}, CHECK_DELAY);
}

@Override
public void onActivityCreated(Activity activity, Bundle savedInstanceState) {}

@Override
public void onActivityStarted(Activity activity) {}

@Override
public void onActivityStopped(Activity activity) {}

@Override
public void onActivitySaveInstanceState(Activity activity, Bundle outState) {}

@Override
public void onActivityDestroyed(Activity activity) {}

}

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]