diff --git a/cim-boot-server/src/main/java/com/farsunset/cim/component/handler/BindHandler.java b/cim-boot-server/src/main/java/com/farsunset/cim/component/handler/BindHandler.java index b11ed40..d478339 100644 --- a/cim-boot-server/src/main/java/com/farsunset/cim/component/handler/BindHandler.java +++ b/cim-boot-server/src/main/java/com/farsunset/cim/component/handler/BindHandler.java @@ -24,6 +24,7 @@ package com.farsunset.cim.component.handler; import com.farsunset.cim.component.handler.annotation.CIMHandler; import com.farsunset.cim.component.redis.SignalRedisTemplate; import com.farsunset.cim.constant.ChannelAttr; +import com.farsunset.cim.constants.Constants; import com.farsunset.cim.entity.Session; import com.farsunset.cim.group.SessionGroup; import com.farsunset.cim.handler.CIMRequestHandler; @@ -53,6 +54,10 @@ public class BindHandler implements CIMRequestHandler { @Override public void process(Channel channel, SentBody body) { + if (sessionGroup.isManaged(channel)){ + return; + } + ReplyBody reply = new ReplyBody(); reply.setKey(body.getKey()); reply.setCode(HttpStatus.OK.value()); @@ -79,6 +84,8 @@ public class BindHandler implements CIMRequestHandler { */ sessionService.add(session); + channel.attr(Constants.SESSION_ID).set(session.getId()); + /* * 添加到内存管理 */ diff --git a/cim-boot-server/src/main/java/com/farsunset/cim/component/handler/ClosedHandler.java b/cim-boot-server/src/main/java/com/farsunset/cim/component/handler/ClosedHandler.java index 5eda934..80041ba 100644 --- a/cim-boot-server/src/main/java/com/farsunset/cim/component/handler/ClosedHandler.java +++ b/cim-boot-server/src/main/java/com/farsunset/cim/component/handler/ClosedHandler.java @@ -23,6 +23,7 @@ package com.farsunset.cim.component.handler; import com.farsunset.cim.component.handler.annotation.CIMHandler; import com.farsunset.cim.constant.ChannelAttr; +import com.farsunset.cim.constants.Constants; import com.farsunset.cim.entity.Session; import com.farsunset.cim.group.SessionGroup; import com.farsunset.cim.handler.CIMRequestHandler; @@ -42,31 +43,25 @@ public class ClosedHandler implements CIMRequestHandler { @Resource private SessionService sessionService; - @Resource - private SessionGroup sessionGroup; - @Override public void process(Channel channel, SentBody message) { - String uid = channel.attr(ChannelAttr.UID).get(); + Long sessionId = channel.attr(Constants.SESSION_ID).get(); - if (uid == null){ + if (sessionId == null){ return; } - String nid = channel.attr(ChannelAttr.ID).get(); - - sessionGroup.remove(channel); - /* * ios开启了apns也需要显示在线,因此不删记录 */ - if (!Objects.equals(channel.attr(ChannelAttr.CHANNEL).get(), Session.CHANNEL_IOS)){ - sessionService.delete(uid,nid); + if (Objects.equals(channel.attr(ChannelAttr.CHANNEL).get(), Session.CHANNEL_IOS)){ + sessionService.updateState(sessionId, Session.STATE_INACTIVE); return; } - sessionService.updateState(uid,nid, Session.STATE_INACTIVE); + sessionService.delete(sessionId); + } } diff --git a/cim-boot-server/src/main/java/com/farsunset/cim/constants/Constants.java b/cim-boot-server/src/main/java/com/farsunset/cim/constants/Constants.java index fd48eec..3892ee6 100644 --- a/cim-boot-server/src/main/java/com/farsunset/cim/constants/Constants.java +++ b/cim-boot-server/src/main/java/com/farsunset/cim/constants/Constants.java @@ -21,13 +21,16 @@ */ package com.farsunset.cim.constants; +import io.netty.util.AttributeKey; + public interface Constants { String PUSH_MESSAGE_INNER_QUEUE = "signal/channel/PUSH_MESSAGE_INNER_QUEUE"; String BIND_MESSAGE_INNER_QUEUE = "signal/channel/BIND_MESSAGE_INNER_QUEUE"; - String PING_MESSAGE_INNER_QUEUE = "signal/channel/PING_MESSAGE_INNER_QUEUE"; - String APNS_DEVICE_TOKEN = "APNS_OPEN_%s"; + + AttributeKey SESSION_ID = AttributeKey.valueOf("session_id"); + } diff --git a/cim-boot-server/src/main/java/com/farsunset/cim/repository/SessionRepository.java b/cim-boot-server/src/main/java/com/farsunset/cim/repository/SessionRepository.java index 71b43f8..fe57a35 100644 --- a/cim-boot-server/src/main/java/com/farsunset/cim/repository/SessionRepository.java +++ b/cim-boot-server/src/main/java/com/farsunset/cim/repository/SessionRepository.java @@ -33,17 +33,13 @@ import org.springframework.transaction.annotation.Transactional; @Transactional(rollbackFor = Exception.class) public interface SessionRepository extends JpaRepository { - @Modifying - @Query("delete from Session where uid = ?1 and nid = ?2") - void delete(String uid,String nid); - @Modifying @Query("delete from Session where host = ?1 ") void deleteAll(String host); @Modifying - @Query("update Session set state = ?3 where uid = ?1 and nid = ?2") - void updateState(String uid,String nid,int state); + @Query("update Session set state = :state where id = :id") + void updateState(long id,int state); @Modifying @Query("update Session set state = " + Session.STATE_APNS + " where uid = ?1 and channel = ?2") diff --git a/cim-boot-server/src/main/java/com/farsunset/cim/service/SessionService.java b/cim-boot-server/src/main/java/com/farsunset/cim/service/SessionService.java index 44d484d..af8fb98 100644 --- a/cim-boot-server/src/main/java/com/farsunset/cim/service/SessionService.java +++ b/cim-boot-server/src/main/java/com/farsunset/cim/service/SessionService.java @@ -33,14 +33,14 @@ public interface SessionService { void add(Session session); - void delete(String uid,String nid); + void delete(long id); /** * 删除本机的连接记录 */ void deleteLocalhost(); - void updateState(String uid,String nid,int state); + void updateState(long id,int state); void openApns(String uid,String deviceToken); diff --git a/cim-boot-server/src/main/java/com/farsunset/cim/service/impl/SessionServiceImpl.java b/cim-boot-server/src/main/java/com/farsunset/cim/service/impl/SessionServiceImpl.java index d9190e7..c88c9eb 100644 --- a/cim-boot-server/src/main/java/com/farsunset/cim/service/impl/SessionServiceImpl.java +++ b/cim-boot-server/src/main/java/com/farsunset/cim/service/impl/SessionServiceImpl.java @@ -31,6 +31,7 @@ import javax.annotation.Resource; import java.net.InetAddress; import java.net.UnknownHostException; import java.util.List; +import java.util.stream.Collectors; @Service public class SessionServiceImpl implements SessionService { @@ -56,18 +57,19 @@ public class SessionServiceImpl implements SessionService { } @Override - public void delete(String uid, String nid) { - sessionRepository.delete(uid,nid); + public void delete(long id) { + sessionRepository.deleteById(id); } + @Override public void deleteLocalhost() { sessionRepository.deleteAll(host); } @Override - public void updateState(String uid, String nid, int state) { - sessionRepository.updateState(uid,nid,state); + public void updateState(long id, int state) { + sessionRepository.updateState(id,state); } @Override @@ -84,6 +86,9 @@ public class SessionServiceImpl implements SessionService { @Override public List findAll() { - return sessionRepository.findAll(); + return sessionRepository.findAll() + .stream() + .filter(session -> session.getState() == Session.STATE_ACTIVE || session.getState() == Session.STATE_APNS) + .collect(Collectors.toList()); } } diff --git a/cim-client-sdk/cim-android-sdk/pom.xml b/cim-client-sdk/cim-android-sdk/pom.xml index a51bc2b..538e265 100755 --- a/cim-client-sdk/cim-android-sdk/pom.xml +++ b/cim-client-sdk/cim-android-sdk/pom.xml @@ -6,7 +6,7 @@ com.farsunset cim-android-sdk - 4.2.5 + 4.2.6 jar ${project.groupId}:${project.artifactId} diff --git a/cim-client-sdk/cim-android-sdk/src/main/java/com/farsunset/cim/sdk/android/CIMCacheManager.java b/cim-client-sdk/cim-android-sdk/src/main/java/com/farsunset/cim/sdk/android/CIMCacheManager.java index 7dbed94..f4d4473 100644 --- a/cim-client-sdk/cim-android-sdk/src/main/java/com/farsunset/cim/sdk/android/CIMCacheManager.java +++ b/cim-client-sdk/cim-android-sdk/src/main/java/com/farsunset/cim/sdk/android/CIMCacheManager.java @@ -43,6 +43,10 @@ class CIMCacheManager { public static final String KEY_CIM_CONNECTION_STATE = "KEY_CIM_CONNECTION_STATE"; + + public static final String KEY_NTC_CHANNEL_NAME = "KEY_NTC_CHANNEL_NAME"; + + public static final String CONTENT_URI = "content://%s.cim.provider"; diff --git a/cim-client-sdk/cim-android-sdk/src/main/java/com/farsunset/cim/sdk/android/CIMEventBroadcastReceiver.java b/cim-client-sdk/cim-android-sdk/src/main/java/com/farsunset/cim/sdk/android/CIMEventBroadcastReceiver.java index 7ab04e8..67a2ed9 100644 --- a/cim-client-sdk/cim-android-sdk/src/main/java/com/farsunset/cim/sdk/android/CIMEventBroadcastReceiver.java +++ b/cim-client-sdk/cim-android-sdk/src/main/java/com/farsunset/cim/sdk/android/CIMEventBroadcastReceiver.java @@ -119,15 +119,9 @@ public abstract class CIMEventBroadcastReceiver extends BroadcastReceiver { } private void startPushService() { - - try { - Intent intent = new Intent(context, CIMPushService.class); - intent.setAction(ServiceAction.ACTION_ACTIVATE_PUSH_SERVICE); - CIMPushManager.startService(context,intent); - }catch (Exception ignore){ - context.sendBroadcast(new Intent(IntentAction.ACTION_CONNECTION_RECOVERY)); - } - + Intent intent = new Intent(context, CIMPushService.class); + intent.setAction(ServiceAction.ACTION_ACTIVATE_PUSH_SERVICE); + CIMPushManager.startService(context,intent); } private void onInnerConnectionClosed() { diff --git a/cim-client-sdk/cim-android-sdk/src/main/java/com/farsunset/cim/sdk/android/CIMPushManager.java b/cim-client-sdk/cim-android-sdk/src/main/java/com/farsunset/cim/sdk/android/CIMPushManager.java index 970478b..b688b9f 100644 --- a/cim-client-sdk/cim-android-sdk/src/main/java/com/farsunset/cim/sdk/android/CIMPushManager.java +++ b/cim-client-sdk/cim-android-sdk/src/main/java/com/farsunset/cim/sdk/android/CIMPushManager.java @@ -31,6 +31,7 @@ import android.os.Build; import android.os.LocaleList; import android.text.TextUtils; import com.farsunset.cim.sdk.android.constant.BundleKey; +import com.farsunset.cim.sdk.android.constant.IntentAction; import com.farsunset.cim.sdk.android.constant.RequestKey; import com.farsunset.cim.sdk.android.constant.ServiceAction; import com.farsunset.cim.sdk.android.logger.CIMLogger; @@ -314,10 +315,15 @@ public class CIMPushManager { } protected static void startService(Context context, Intent intent) { - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { - context.startForegroundService(intent); - } else { + if (Build.VERSION.SDK_INT < Build.VERSION_CODES.O) { context.startService(intent); + return; + } + + try { + context.startForegroundService(intent); + }catch (Exception ignore){ + context.sendBroadcast(new Intent(IntentAction.ACTION_CONNECTION_RECOVERY)); } } diff --git a/cim-client-sdk/cim-android-sdk/src/main/java/com/farsunset/cim/sdk/android/CIMPushService.java b/cim-client-sdk/cim-android-sdk/src/main/java/com/farsunset/cim/sdk/android/CIMPushService.java index 565e63e..b3ca9fd 100644 --- a/cim-client-sdk/cim-android-sdk/src/main/java/com/farsunset/cim/sdk/android/CIMPushService.java +++ b/cim-client-sdk/cim-android-sdk/src/main/java/com/farsunset/cim/sdk/android/CIMPushService.java @@ -53,8 +53,6 @@ public class CIMPushService extends Service { private static final int NOTIFICATION_ID = Integer.MAX_VALUE; - private static final int PERSIST_NOTIFICATION_ID = Integer.MIN_VALUE; - private CIMConnectorManager connectorManager; private KeepAliveBroadcastReceiver keepAliveReceiver; private ConnectivityManager connectivityManager; @@ -64,7 +62,9 @@ public class CIMPushService extends Service { @Override public void onCreate() { + connectorManager = CIMConnectorManager.getManager(this.getApplicationContext()); + notificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { @@ -118,7 +118,7 @@ public class CIMPushService extends Service { String action = newIntent.getAction(); if (!persistHolder.get()) { - createNotification(); + createTransientNotification(); } if (ServiceAction.ACTION_CREATE_CIM_CONNECTION.equals(action)) { @@ -167,7 +167,7 @@ public class CIMPushService extends Service { notificationHandler.sendEmptyMessageDelayed(0, 200); } - return Service.START_REDELIVER_INTENT; + return super.onStartCommand(intent,flags,startId); } private void prepareConnect(long delayMillis) { @@ -241,12 +241,21 @@ public class CIMPushService extends Service { } } - private void createNotification() { + private void createTransientNotification() { if (Build.VERSION.SDK_INT < Build.VERSION_CODES.O) { return; } + + if (notificationManager.getNotificationChannel(PERSIST_NTC_CHANNEL_ID) != null) { + startForeground(NOTIFICATION_ID, new Notification.Builder(this,PERSIST_NTC_CHANNEL_ID) + .setContentTitle(CIMCacheManager.getString(this,CIMCacheManager.KEY_NTC_CHANNEL_NAME)) + .build()); + return; + } + + if (notificationManager.getNotificationChannel(TRANSIENT_NTC_CHANNEL_ID) == null) { NotificationChannel channel = new NotificationChannel(TRANSIENT_NTC_CHANNEL_ID, getClass().getSimpleName(), NotificationManager.IMPORTANCE_LOW); channel.enableLights(false); @@ -255,16 +264,17 @@ public class CIMPushService extends Service { notificationManager.createNotificationChannel(channel); } - Notification notification = new Notification.Builder(this,TRANSIENT_NTC_CHANNEL_ID) + startForeground(NOTIFICATION_ID, new Notification.Builder(this,TRANSIENT_NTC_CHANNEL_ID) .setContentTitle(CIMPushService.class.getSimpleName()) - .build(); + .build()); - startForeground(NOTIFICATION_ID, notification); } private void createPersistNotification(String channelName ,String message,int icon) { + CIMCacheManager.putString(this,CIMCacheManager.KEY_NTC_CHANNEL_NAME,channelName); + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O && notificationManager.getNotificationChannel(PERSIST_NTC_CHANNEL_ID) == null) { NotificationChannel channel = new NotificationChannel(PERSIST_NTC_CHANNEL_ID,channelName, NotificationManager.IMPORTANCE_DEFAULT); channel.enableLights(false); @@ -272,6 +282,7 @@ public class CIMPushService extends Service { channel.enableVibration(false); channel.setSound(null, null); notificationManager.createNotificationChannel(channel); + notificationManager.deleteNotificationChannel(TRANSIENT_NTC_CHANNEL_ID); } @@ -294,7 +305,7 @@ public class CIMPushService extends Service { .setContentTitle(channelName) .setContentText(message); - startForeground(PERSIST_NOTIFICATION_ID, builder.build()); + startForeground(NOTIFICATION_ID, builder.build()); } private class KeepAliveBroadcastReceiver extends BroadcastReceiver {