Skip to content

xuduo/socket.io-push-android

Repository files navigation

socket.io-push-android Build Status

demo实现了一个聊天室功能, 编译clone后 需要pull submodule

git clone https://github.com/xuduo/socket.io-push-android
git submodule update --recursive --remote
小米,华为,友盟均为可选接入。开启条件为 对应厂商系统&classpath里有对应sdk&androidManifest里有配置
  1. 小米推送(所有MUI) MiPush_SDK_Client_XXX.jar
  2. 华为推送(EMUI5.0以上) HMSSdkBase_XXX.jar HMSSdkPush_XXX.jar
  3. 友盟推送(非小米华为) com.umeng.message_XXX.jar alicloud-android-sdk-httpdns-XXX.jar utdid4all-XXX_proguard.jar libcocklogic-XXX.so libtnet-XXX.so
添加maven/gradle依赖

Maven Central

maven

<dependency>
    <groupId>com.yy</groupId>
    <artifactId>android-push-sdk</artifactId>
    <version>${version}</version>
</dependency>

gradle

compile 'com.yy:android-push-sdk:${versoion}'

AndroidManifest.xml添加receiver,service,permission

参见Demo的AndroidManifest.xml

Proguard

混淆配置

-dontwarn com.yy.httpproxy.thirdparty.**
-dontwarn okio.**

##如接入华为push
-keep class com.huawei.android.pushagent.** {*;}
-keep class com.huawei.android.pushselfshow.** {*;}
-keep class com.huawei.android.microkernel.** {*;}
-keep class com.baidu.mapapi.** {*;}
-dontwarn com.huawei.**
##如接入华为push


初始化ProxyClient

每次UI进程启动需要初始化,初始化后会自动启动push进程.

Proxy proxyClient = new ProxyClient(new Config(this)
                .setHost("http://spush.yy.com")  //连接的服务器地址
                .setConnectCallback(this)  //socket.io通道,连上,断开回调
                .setPushCallback(this)  //push回调,socket.io长连接通道
                .setLogger(MyLogger.class)); //日志回调,可选,这个类会实例化在push进程

注意不要通过其他进程启动,可以用以下代码判断是否ui进程

 private boolean isUiProcess() {
        ActivityManager am = ((ActivityManager) getSystemService(Context.ACTIVITY_SERVICE));
        List<RunningAppProcessInfo> processInfos = am.getRunningAppProcesses();
        String mainProcessName = getPackageName();
        int myPid = Process.myPid();
        for (RunningAppProcessInfo info : processInfos) {
            if (info.pid == myPid && mainProcessName.equals(info.processName)) {
                return true;
            }
        }
        return false;
  }
获取pushId

由客户端自动生成, proxyClient实例化后即可获得

用于服务器对单个设备发push/notification

String pushId = proxyClient.getPushId();

subscribe/unsbuscribe topic

调用不需考虑当时是否连线, 重连也不需要重新sub/unsub,sdk里已经处理

proxyClient.subscribeBroadcast("aTopic"); //对于某个topic的push,需要客户端主动订阅,才能收到.如demo中,需订阅"chatRoom" topic,才能收到聊天消息
proxyClient.subscribeAndReceiveTtlPackets("aTopic"); //同上,这个方法会接收服务器的重传
proxyClient.unsubscribeBroadcast("aTopic");

接收push

public interface PushCallback {

    /**
     *
     * @param data 服务器push下来的字符串
     */
    void onPush(String data);
}

接收notification(使用DefaultNotificationHandler/DelegateToClientNotificationHandler)

sdk默认会弹出系统通知 arrive和click后会调用receiver的方法

public class YYNotificationReceiver extends NotificationReceiver {

    @Override
    public void onNotificationClicked(Context context, PushedNotification notification) {
        Log.d("YYNotificationReceiver", "onNotificationClicked " + notification.id + " values " + notification.values);
        Toast.makeText(context, "YYNotificationReceiver clicked payload: " + notification.values.get("payload"), Toast.LENGTH_SHORT).show();
        Intent intent = new Intent(context, DrawActivity.class);
        intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        context.startActivity(intent);
    }

    /**
     *  如果使用DelegateToClientNotificationHandler ,UI进程存活的时候,会调用此方法,不弹出通知.
     *  UI进程被杀,push进程存活的时候,使用默认的样式弹出
     *  使用小米华为推送时,不会调用
     */
    @Override
    public void onNotificationArrived(Context context, PushedNotification notification) {
        Log.d("YYNotificationReceiver", "onNotificationArrived " + notification.id + " values " + notification.values);
    }

}

启动时的配置,配置使用

config.setNotificationHandler(MyHandlerClass.class); //不能混淆这个类

自定义弹出通知(使用自定义NotificationHandler)

可以用代码根据业务服务器下发的notification中的自定义payload字段,展示不同的效果

注意!NotificationHandler的实例,是在push进程中的!

实现接口

public interface NotificationHandler {
    /**
     *
     * @param context context
     * @param binded UI进程 是否存活
     * @param notification  业务服务器下发的notification
     */
    void handlerNotification(Context context, boolean binded, PushedNotification notification);

}

启动时的配置,设置NotificationHandler

config.setNotificationHandler("yourFullyQualifiedHandlerClassName"); //不能混淆这个类

绑定UID

绑定UID是业务服务器调用push-server接口进行绑定的(pushId - uid)的关系

由于安全性的问题,客户端无法直接绑定

push-server和业务服务器的绑定关系可能会不一致

每次连接到push-sever后, 客户端要根据回调, 判断回调的uid与当前用户uid是否一致, 进行绑定/解绑

public interface ConnectCallback {

    /**
     *  
     * @param uid 连接push-server后,在服务器绑定的uid,如未绑定,uid = ""
     * @param uid 连接push-server后,在服务器绑定的tags
     */
    void onConnect(String uid, Set<String> tags);

    void onDisconnect();

}

解绑Uid,客户端直接调用接口解绑

proxyClient.unbindUid();
添加删除tag
proxyClient.addTag("tag1");
proxyClient.removeTag("tag2");

tag回调同上

集成小米push

华为push官方接入文档

本系统透明集成了小米push,开启方法.

  1. 添加小米push jar依赖
  2. AndroidManifest.xml配置了小米push相关配置,参见demo
  3. 当前手机运行MiUi系统

注意项

  1. SDK会自动上报小米的regId,并不需要业务代码改动
  2. 对于开启的手机,无法使用自定义NotificationHandler控制notification弹出
  3. 可以通过push-server配置,应用在前台的时候,不弹出通知(小米push功能)

集成华为push

华为push官方接入文档

本系统透明集成了华为push,开启方法

  1. 添加华为push jar依赖,拷贝一堆资源文件(华为push自带)
  2. AndroidManifest.xml配置了华为push相关配置,参见demo
  3. 当前手机运行华为系统

注意项

  1. SDK会自动上报华为的token,并不需要业务代码改动
  2. 对于开启的手机,无法使用自定义NotificationHandler控制notification弹出

UI进程单独使用push功能

    String pushId = new RandomPushIdGenerator().generatePushId(pushId); //生成随机pushId
    SocketIOProxyClient client = new SocketIOProxyClient(this.getApplicationContext(), host, null);
    client.setPushId(pushId);   //设置pushId
    client.setPushCallback(this); // push回调
    client.setNotificationCallback(this); //notification回调
    client.setConnectCallback(this); //连接回调

About

android sdk for socket.io-push

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages