From 073b91ba99a663ce4e1f1c11fcf9d8dda87ecc5d Mon Sep 17 00:00:00 2001 From: hrxiang Date: Tue, 6 Jul 2021 11:39:31 +0800 Subject: [PATCH 1/2] new add ios support --- android/build.gradle | 7 +- .../FlutterOpenimSdkPlugin.java | 20 +- .../listener/AdvancedMsgListenerImpl.java | 11 +- .../flutter_openim_sdk/listener/BaseImpl.java | 5 +- .../listener/ConversationListenerImpl.java | 17 +- .../listener/FriendshipListenerImpl.java | 24 +- .../listener/MsgSendProgressListener.java | 15 +- .../listener/SDKListenerImpl.java | 18 +- .../manager/ConversationManager.java | 7 +- .../manager/FriendshipManager.java | 7 +- .../manager/GroupManager.java | 6 + .../flutter_openim_sdk/manager/IMManager.java | 8 +- .../manager/MessageManager.java | 12 +- .../flutter_openim_sdk/util/CommonUtil.java | 9 +- .../flutter_openim_sdk/util/JsonUtil.java | 71 +- ios/Classes/CommonUtil.swift | 344 +++++++ ios/Classes/JsonUtil.swift | 27 + ios/Classes/Module/ConversationManager.swift | 88 ++ ios/Classes/Module/FriendshipManager.swift | 126 +++ ios/Classes/Module/GroupManager.swift | 74 ++ ios/Classes/Module/IMManager.swift | 101 ++ ios/Classes/Module/MessageManager.swift | 187 ++++ ios/Classes/SwiftFlutterOpenimSdkPlugin.swift | 196 +++- .../OpenIMCore.framework/Headers/OpenIMCore.h | 13 + .../Headers/Open_im_sdk.objc.h | 882 ++++++++++++++++++ .../Headers/Universe.objc.h | 29 + .../OpenIMCore.framework/Headers/ref.h | 35 + .../Modules/module.modulemap | 8 + ios/Framework/OpenIMCore.framework/OpenIMCore | Bin 0 -> 30052400 bytes .../OpenIMCore.framework/Resources/Info.plist | 6 + .../Versions/A/Headers/OpenIMCore.h | 13 + .../Versions/A/Headers/Open_im_sdk.objc.h | 882 ++++++++++++++++++ .../Versions/A/Headers/Universe.objc.h | 29 + .../Versions/A/Headers/ref.h | 35 + .../Versions/A/Modules/module.modulemap | 8 + .../Versions/A/OpenIMCore | Bin 0 -> 30052400 bytes .../Versions/A/Resources/Info.plist | 6 + .../Versions/Current/Headers/OpenIMCore.h | 13 + .../Current/Headers/Open_im_sdk.objc.h | 882 ++++++++++++++++++ .../Versions/Current/Headers/Universe.objc.h | 29 + .../Versions/Current/Headers/ref.h | 35 + .../Versions/Current/Modules/module.modulemap | 8 + .../Versions/Current/OpenIMCore | Bin 0 -> 30052400 bytes .../Versions/Current/Resources/Info.plist | 6 + ios/flutter_openim_sdk.podspec | 1 + lib/src/manager/im_group_manager.dart | 198 +++- lib/src/models/group_info.dart | 226 +++++ 47 files changed, 4554 insertions(+), 170 deletions(-) create mode 100644 android/src/main/java/io/openim/flutter_openim_sdk/manager/GroupManager.java create mode 100644 ios/Classes/CommonUtil.swift create mode 100644 ios/Classes/JsonUtil.swift create mode 100644 ios/Classes/Module/ConversationManager.swift create mode 100644 ios/Classes/Module/FriendshipManager.swift create mode 100644 ios/Classes/Module/GroupManager.swift create mode 100644 ios/Classes/Module/IMManager.swift create mode 100644 ios/Classes/Module/MessageManager.swift create mode 100644 ios/Framework/OpenIMCore.framework/Headers/OpenIMCore.h create mode 100644 ios/Framework/OpenIMCore.framework/Headers/Open_im_sdk.objc.h create mode 100644 ios/Framework/OpenIMCore.framework/Headers/Universe.objc.h create mode 100644 ios/Framework/OpenIMCore.framework/Headers/ref.h create mode 100644 ios/Framework/OpenIMCore.framework/Modules/module.modulemap create mode 100644 ios/Framework/OpenIMCore.framework/OpenIMCore create mode 100644 ios/Framework/OpenIMCore.framework/Resources/Info.plist create mode 100644 ios/Framework/OpenIMCore.framework/Versions/A/Headers/OpenIMCore.h create mode 100644 ios/Framework/OpenIMCore.framework/Versions/A/Headers/Open_im_sdk.objc.h create mode 100644 ios/Framework/OpenIMCore.framework/Versions/A/Headers/Universe.objc.h create mode 100644 ios/Framework/OpenIMCore.framework/Versions/A/Headers/ref.h create mode 100644 ios/Framework/OpenIMCore.framework/Versions/A/Modules/module.modulemap create mode 100644 ios/Framework/OpenIMCore.framework/Versions/A/OpenIMCore create mode 100644 ios/Framework/OpenIMCore.framework/Versions/A/Resources/Info.plist create mode 100644 ios/Framework/OpenIMCore.framework/Versions/Current/Headers/OpenIMCore.h create mode 100644 ios/Framework/OpenIMCore.framework/Versions/Current/Headers/Open_im_sdk.objc.h create mode 100644 ios/Framework/OpenIMCore.framework/Versions/Current/Headers/Universe.objc.h create mode 100644 ios/Framework/OpenIMCore.framework/Versions/Current/Headers/ref.h create mode 100644 ios/Framework/OpenIMCore.framework/Versions/Current/Modules/module.modulemap create mode 100644 ios/Framework/OpenIMCore.framework/Versions/Current/OpenIMCore create mode 100644 ios/Framework/OpenIMCore.framework/Versions/Current/Resources/Info.plist create mode 100644 lib/src/models/group_info.dart diff --git a/android/build.gradle b/android/build.gradle index 34ff708..3c06a4d 100644 --- a/android/build.gradle +++ b/android/build.gradle @@ -9,7 +9,7 @@ buildscript { maven { url 'http://maven.aliyun.com/nexus/content/repositories/gradle-plugin' } google() maven { - url 'http://127.0.0.1:8081/repository/maven-releases/' //这个路径就是Browse下maven-release右边有一个copy按钮,复制出来的。 + url 'http://127.0.0.1:8081/repository/maven-releases/' } mavenCentral() } @@ -27,7 +27,7 @@ rootProject.allprojects { maven { url 'http://maven.aliyun.com/nexus/content/repositories/gradle-plugin' } google() maven { - url 'http://127.0.0.1:8081/repository/maven-releases' //这个路径就是Browse下maven-release右边有一个copy按钮,复制出来的。 + url 'http://127.0.0.1:8081/repository/maven-releases' } mavenCentral() } @@ -47,6 +47,5 @@ android { } } dependencies { - implementation 'com.alibaba:fastjson:1.1.72.android' - implementation 'io.openim:localsdk:1.1.4@aar'//graoupId:artifactId:version@aar + implementation 'io.openim:localsdk:1.2.6@aar'//graoupId:artifactId:version@aar } \ No newline at end of file diff --git a/android/src/main/java/io/openim/flutter_openim_sdk/FlutterOpenimSdkPlugin.java b/android/src/main/java/io/openim/flutter_openim_sdk/FlutterOpenimSdkPlugin.java index 2a6d900..c8fea9f 100644 --- a/android/src/main/java/io/openim/flutter_openim_sdk/FlutterOpenimSdkPlugin.java +++ b/android/src/main/java/io/openim/flutter_openim_sdk/FlutterOpenimSdkPlugin.java @@ -8,6 +8,7 @@ import java.lang.reflect.Field; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; +import io.flutter.Log; import io.flutter.embedding.engine.plugins.FlutterPlugin; import io.flutter.plugin.common.MethodCall; import io.flutter.plugin.common.MethodChannel; @@ -28,6 +29,7 @@ public class FlutterOpenimSdkPlugin implements FlutterPlugin, MethodCallHandler /// /// This local reference serves to register the plugin with the Flutter Engine and unregister it /// when the Flutter Engine is detached from the Activity + public static MethodChannel channel; private static IMManager imManager; private static FriendshipManager friendshipManager; @@ -37,17 +39,17 @@ public class FlutterOpenimSdkPlugin implements FlutterPlugin, MethodCallHandler public FlutterOpenimSdkPlugin() { } - private FlutterOpenimSdkPlugin(Context context, MethodChannel channel) { - FlutterOpenimSdkPlugin.imManager = new IMManager(channel); - FlutterOpenimSdkPlugin.friendshipManager = new FriendshipManager(channel); - FlutterOpenimSdkPlugin.messageManager = new MessageManager(channel); - FlutterOpenimSdkPlugin.conversationManager = new ConversationManager(channel); + private FlutterOpenimSdkPlugin(Context context) { + FlutterOpenimSdkPlugin.imManager = new IMManager(); + FlutterOpenimSdkPlugin.friendshipManager = new FriendshipManager(); + FlutterOpenimSdkPlugin.messageManager = new MessageManager(); + FlutterOpenimSdkPlugin.conversationManager = new ConversationManager(); } @Override public void onAttachedToEngine(@NonNull FlutterPluginBinding flutterPluginBinding) { - channel = new MethodChannel(flutterPluginBinding.getBinaryMessenger(), "flutter_openim_sdk"); - channel.setMethodCallHandler(new FlutterOpenimSdkPlugin(flutterPluginBinding.getApplicationContext(), channel)); + FlutterOpenimSdkPlugin.channel = new MethodChannel(flutterPluginBinding.getBinaryMessenger(), "flutter_openim_sdk"); + FlutterOpenimSdkPlugin.channel.setMethodCallHandler(new FlutterOpenimSdkPlugin(flutterPluginBinding.getApplicationContext())); // channel.setMethodCallHandler(this); } @@ -58,7 +60,7 @@ public class FlutterOpenimSdkPlugin implements FlutterPlugin, MethodCallHandler @Override public void onDetachedFromEngine(@NonNull FlutterPluginBinding binding) { - channel.setMethodCallHandler(null); + FlutterOpenimSdkPlugin.channel.setMethodCallHandler(null); } void parse(@NonNull MethodCall call, @NonNull Result result) { @@ -66,7 +68,7 @@ public class FlutterOpenimSdkPlugin implements FlutterPlugin, MethodCallHandler String managerName = CommonUtil.getParamValue(call, "ManagerName"); Field field = FlutterOpenimSdkPlugin.class.getDeclaredField(managerName); Method method = field.get(new Object()).getClass().getDeclaredMethod(call.method, MethodCall.class, Result.class); - System.out.println("flutter call native { class:" + managerName + ", method:" + method.getName() + " }"); + Log.i("F-OpenIMSDK(flutter call native)", "{ class:" + managerName + ", method:" + method.getName() + " }"); method.invoke(field.get(new Object()), call, result); } catch (NoSuchFieldException e) { e.printStackTrace(); diff --git a/android/src/main/java/io/openim/flutter_openim_sdk/listener/AdvancedMsgListenerImpl.java b/android/src/main/java/io/openim/flutter_openim_sdk/listener/AdvancedMsgListenerImpl.java index 1da3f3e..cb8acea 100644 --- a/android/src/main/java/io/openim/flutter_openim_sdk/listener/AdvancedMsgListenerImpl.java +++ b/android/src/main/java/io/openim/flutter_openim_sdk/listener/AdvancedMsgListenerImpl.java @@ -3,34 +3,31 @@ package io.openim.flutter_openim_sdk.listener; import java.util.HashMap; import java.util.Map; -import io.flutter.plugin.common.MethodChannel; import io.openim.flutter_openim_sdk.util.CommonUtil; import open_im_sdk.OnAdvancedMsgListener; public class AdvancedMsgListenerImpl implements OnAdvancedMsgListener { - final MethodChannel channel; final Map values = new HashMap<>(); - public AdvancedMsgListenerImpl(MethodChannel channel, String listenerId) { - this.channel = channel; + public AdvancedMsgListenerImpl(String listenerId) { this.values.put("id", listenerId); } @Override public void onRecvC2CReadReceipt(String s) { values.put("message", s); - CommonUtil.emitEvent(channel, "advancedMsgListener", "onRecvC2CReadReceipt", values); + CommonUtil.emitEvent("advancedMsgListener", "onRecvC2CReadReceipt", values); } @Override public void onRecvMessageRevoked(String s) { values.put("message", s); - CommonUtil.emitEvent(channel, "advancedMsgListener", "onRecvMessageRevoked", values); + CommonUtil.emitEvent("advancedMsgListener", "onRecvMessageRevoked", values); } @Override public void onRecvNewMessage(String s) { values.put("message", s); - CommonUtil.emitEvent(channel, "advancedMsgListener", "onRecvNewMessage", values); + CommonUtil.emitEvent("advancedMsgListener", "onRecvNewMessage", values); } } diff --git a/android/src/main/java/io/openim/flutter_openim_sdk/listener/BaseImpl.java b/android/src/main/java/io/openim/flutter_openim_sdk/listener/BaseImpl.java index f3a8f15..ac7be97 100644 --- a/android/src/main/java/io/openim/flutter_openim_sdk/listener/BaseImpl.java +++ b/android/src/main/java/io/openim/flutter_openim_sdk/listener/BaseImpl.java @@ -1,6 +1,7 @@ package io.openim.flutter_openim_sdk.listener; +import io.flutter.Log; import io.flutter.plugin.common.MethodChannel; import io.openim.flutter_openim_sdk.util.CommonUtil; import open_im_sdk.Base; @@ -15,13 +16,13 @@ public class BaseImpl implements Base { @Override public void onError(long l, String s) { - System.out.println("BaseImpl:" + s); + Log.e("F-OpenIMSD(callback)", s); CommonUtil.runMainThreadReturnError(result, l, s, null); } @Override public void onSuccess(String s) { - System.out.println("BaseImpl:" + s); + Log.i("F-OpenIMSDK(callback)", s); CommonUtil.runMainThreadReturn(result, s); } } diff --git a/android/src/main/java/io/openim/flutter_openim_sdk/listener/ConversationListenerImpl.java b/android/src/main/java/io/openim/flutter_openim_sdk/listener/ConversationListenerImpl.java index fea99c6..fdc41e0 100644 --- a/android/src/main/java/io/openim/flutter_openim_sdk/listener/ConversationListenerImpl.java +++ b/android/src/main/java/io/openim/flutter_openim_sdk/listener/ConversationListenerImpl.java @@ -1,43 +1,38 @@ package io.openim.flutter_openim_sdk.listener; -import io.flutter.plugin.common.MethodChannel; import io.openim.flutter_openim_sdk.util.CommonUtil; import open_im_sdk.OnConversationListener; public class ConversationListenerImpl implements OnConversationListener { - private final MethodChannel channel; - public ConversationListenerImpl(MethodChannel channel) { - this.channel = channel; - } @Override public void onConversationChanged(String s) { - CommonUtil.emitEvent(channel, "conversationListener", "onConversationChanged", s); + CommonUtil.emitEvent("conversationListener", "onConversationChanged", s); } @Override public void onNewConversation(String s) { - CommonUtil.emitEvent(channel, "conversationListener", "onNewConversation", s); + CommonUtil.emitEvent("conversationListener", "onNewConversation", s); } @Override public void onSyncServerFailed() { - CommonUtil.emitEvent(channel, "conversationListener", "onSyncServerFailed", null); + CommonUtil.emitEvent("conversationListener", "onSyncServerFailed", null); } @Override public void onSyncServerFinish() { - CommonUtil.emitEvent(channel, "conversationListener", "onSyncServerFinish", null); + CommonUtil.emitEvent("conversationListener", "onSyncServerFinish", null); } @Override public void onSyncServerStart() { - CommonUtil.emitEvent(channel, "conversationListener", "onSyncServerStart", null); + CommonUtil.emitEvent("conversationListener", "onSyncServerStart", null); } @Override public void onTotalUnreadMessageCountChanged(int i) { - CommonUtil.emitEvent(channel, "conversationListener", "onTotalUnreadMessageCountChanged", i); + CommonUtil.emitEvent("conversationListener", "onTotalUnreadMessageCountChanged", i); } } diff --git a/android/src/main/java/io/openim/flutter_openim_sdk/listener/FriendshipListenerImpl.java b/android/src/main/java/io/openim/flutter_openim_sdk/listener/FriendshipListenerImpl.java index cca93b6..0ce7ad9 100644 --- a/android/src/main/java/io/openim/flutter_openim_sdk/listener/FriendshipListenerImpl.java +++ b/android/src/main/java/io/openim/flutter_openim_sdk/listener/FriendshipListenerImpl.java @@ -1,58 +1,52 @@ package io.openim.flutter_openim_sdk.listener; -import io.flutter.plugin.common.MethodChannel; import io.openim.flutter_openim_sdk.util.CommonUtil; import open_im_sdk.OnFriendshipListener; public class FriendshipListenerImpl implements OnFriendshipListener { - private final MethodChannel channel; - - public FriendshipListenerImpl(MethodChannel channel) { - this.channel = channel; - } @Override public void onBlackListAdd(String s) { - CommonUtil.emitEvent(channel, "friendListener", "onBlackListAdd", s); + CommonUtil.emitEvent("friendListener", "onBlackListAdd", s); } @Override public void onBlackListDeleted(String s) { - CommonUtil.emitEvent(channel, "friendListener", "onBlackListDeleted", s); + CommonUtil.emitEvent("friendListener", "onBlackListDeleted", s); } @Override public void onFriendApplicationListAccept(String s) { - CommonUtil.emitEvent(channel, "friendListener", "onFriendApplicationListAccept", s); + CommonUtil.emitEvent("friendListener", "onFriendApplicationListAccept", s); } @Override public void onFriendApplicationListAdded(String s) { - CommonUtil.emitEvent(channel, "friendListener", "onFriendApplicationListAdded", s); + CommonUtil.emitEvent("friendListener", "onFriendApplicationListAdded", s); } @Override public void onFriendApplicationListDeleted(String s) { - CommonUtil.emitEvent(channel, "friendListener", "onFriendApplicationListDeleted", s); + CommonUtil.emitEvent("friendListener", "onFriendApplicationListDeleted", s); } @Override public void onFriendApplicationListReject(String s) { - CommonUtil.emitEvent(channel, "friendListener", "onFriendApplicationListReject", s); + CommonUtil.emitEvent("friendListener", "onFriendApplicationListReject", s); } @Override public void onFriendInfoChanged(String s) { - CommonUtil.emitEvent(channel, "friendListener", "onFriendInfoChanged", s); + CommonUtil.emitEvent("friendListener", "onFriendInfoChanged", s); } @Override public void onFriendListAdded(String s) { - CommonUtil.emitEvent(channel, "friendListener", "onFriendListAdded", s); + CommonUtil.emitEvent("friendListener", "onFriendListAdded", s); } @Override public void onFriendListDeleted(String s) { - CommonUtil.emitEvent(channel, "friendListener", "onFriendListDeleted", s); + CommonUtil.emitEvent("friendListener", "onFriendListDeleted", s); } } diff --git a/android/src/main/java/io/openim/flutter_openim_sdk/listener/MsgSendProgressListener.java b/android/src/main/java/io/openim/flutter_openim_sdk/listener/MsgSendProgressListener.java index b3177e6..6a5882a 100644 --- a/android/src/main/java/io/openim/flutter_openim_sdk/listener/MsgSendProgressListener.java +++ b/android/src/main/java/io/openim/flutter_openim_sdk/listener/MsgSendProgressListener.java @@ -9,19 +9,14 @@ import io.openim.flutter_openim_sdk.util.CommonUtil; import open_im_sdk.SendMsgCallBack; public class MsgSendProgressListener implements SendMsgCallBack { - - - public MsgSendProgressListener(MethodChannel.Result result, MethodChannel channel, MethodCall call) { - this.result = result; - this.channel = channel; - this.call = call; - } - final private MethodChannel.Result result; - final private MethodChannel channel; final private MethodCall call; final Map values = new HashMap<>(); + public MsgSendProgressListener(MethodChannel.Result result, MethodCall call) { + this.result = result; + this.call = call; + } @Override public void onError(long l, String s) { @@ -32,7 +27,7 @@ public class MsgSendProgressListener implements SendMsgCallBack { public void onProgress(long l) { values.put("clientMsgID", CommonUtil.getSendMessageClientMsgID(call)); values.put("progress", l); - CommonUtil.emitEvent(channel, "messageProgressListener", "onProgress", values); + CommonUtil.emitEvent("msgSendProgressListener", "onProgress", values); } @Override diff --git a/android/src/main/java/io/openim/flutter_openim_sdk/listener/SDKListenerImpl.java b/android/src/main/java/io/openim/flutter_openim_sdk/listener/SDKListenerImpl.java index fc775e7..f2ea706 100644 --- a/android/src/main/java/io/openim/flutter_openim_sdk/listener/SDKListenerImpl.java +++ b/android/src/main/java/io/openim/flutter_openim_sdk/listener/SDKListenerImpl.java @@ -1,44 +1,38 @@ package io.openim.flutter_openim_sdk.listener; -import io.flutter.plugin.common.MethodChannel; import io.openim.flutter_openim_sdk.util.CommonUtil; import open_im_sdk.IMSDKListener; public class SDKListenerImpl implements IMSDKListener { - final private MethodChannel channel; - - public SDKListenerImpl(MethodChannel channel) { - this.channel = channel; - } @Override public void onConnectFailed(long l, String s) { - CommonUtil.emitEvent(channel, "initSDKListener", "onConnectFailed", l, s, null); + CommonUtil.emitEvent("initSDKListener", "onConnectFailed", l, s, null); } @Override public void onConnectSuccess() { - CommonUtil.emitEvent(channel, "initSDKListener", "onConnectSuccess", null); + CommonUtil.emitEvent("initSDKListener", "onConnectSuccess", null); } @Override public void onConnecting() { - CommonUtil.emitEvent(channel, "initSDKListener", "onConnecting", null); + CommonUtil.emitEvent("initSDKListener", "onConnecting", null); } @Override public void onKickedOffline() { - CommonUtil.emitEvent(channel, "initSDKListener", "onKickedOffline", null); + CommonUtil.emitEvent("initSDKListener", "onKickedOffline", null); } @Override public void onSelfInfoUpdated(String s) { - CommonUtil.emitEvent(channel, "initSDKListener", "onSelfInfoUpdated", s); + CommonUtil.emitEvent("initSDKListener", "onSelfInfoUpdated", s); } @Override public void onUserTokenExpired() { - CommonUtil.emitEvent(channel, "initSDKListener", "onUserTokenExpired", null); + CommonUtil.emitEvent("initSDKListener", "onUserTokenExpired", null); } } diff --git a/android/src/main/java/io/openim/flutter_openim_sdk/manager/ConversationManager.java b/android/src/main/java/io/openim/flutter_openim_sdk/manager/ConversationManager.java index 56c15b1..abdf4e5 100644 --- a/android/src/main/java/io/openim/flutter_openim_sdk/manager/ConversationManager.java +++ b/android/src/main/java/io/openim/flutter_openim_sdk/manager/ConversationManager.java @@ -8,14 +8,9 @@ import io.openim.flutter_openim_sdk.util.CommonUtil; import open_im_sdk.Open_im_sdk; public class ConversationManager { - final private MethodChannel channel; - - public ConversationManager(MethodChannel channel) { - this.channel = channel; - } public void setConversationListener(MethodCall methodCall, MethodChannel.Result result) { - Open_im_sdk.setConversationListener(new ConversationListenerImpl(channel)); + Open_im_sdk.setConversationListener(new ConversationListenerImpl()); } public void getAllConversationList(MethodCall methodCall, MethodChannel.Result result) { diff --git a/android/src/main/java/io/openim/flutter_openim_sdk/manager/FriendshipManager.java b/android/src/main/java/io/openim/flutter_openim_sdk/manager/FriendshipManager.java index 5c00f36..5626042 100644 --- a/android/src/main/java/io/openim/flutter_openim_sdk/manager/FriendshipManager.java +++ b/android/src/main/java/io/openim/flutter_openim_sdk/manager/FriendshipManager.java @@ -9,14 +9,9 @@ import open_im_sdk.Open_im_sdk; public class FriendshipManager { - final private MethodChannel channel; - - public FriendshipManager(MethodChannel channel) { - this.channel = channel; - } public void setFriendListener(MethodCall methodCall, MethodChannel.Result result) { - Open_im_sdk.setFriendListener(new FriendshipListenerImpl(channel)); + Open_im_sdk.setFriendListener(new FriendshipListenerImpl()); } public void getFriendsInfo(MethodCall methodCall, MethodChannel.Result result) { diff --git a/android/src/main/java/io/openim/flutter_openim_sdk/manager/GroupManager.java b/android/src/main/java/io/openim/flutter_openim_sdk/manager/GroupManager.java new file mode 100644 index 0000000..01e169f --- /dev/null +++ b/android/src/main/java/io/openim/flutter_openim_sdk/manager/GroupManager.java @@ -0,0 +1,6 @@ +package io.openim.flutter_openim_sdk.manager; + +public class GroupManager { + + +} diff --git a/android/src/main/java/io/openim/flutter_openim_sdk/manager/IMManager.java b/android/src/main/java/io/openim/flutter_openim_sdk/manager/IMManager.java index 7aca1c4..dd9f223 100644 --- a/android/src/main/java/io/openim/flutter_openim_sdk/manager/IMManager.java +++ b/android/src/main/java/io/openim/flutter_openim_sdk/manager/IMManager.java @@ -9,14 +9,8 @@ import open_im_sdk.Open_im_sdk; public class IMManager { - final private MethodChannel channel; - - public IMManager(MethodChannel channel) { - this.channel = channel; - } - public void initSDK(MethodCall methodCall, MethodChannel.Result result) { - Open_im_sdk.initSDK(CommonUtil.getSDKJsonParam(methodCall), new SDKListenerImpl(channel)); + Open_im_sdk.initSDK(CommonUtil.getSDKJsonParam(methodCall), new SDKListenerImpl()); CommonUtil.runMainThreadReturn(result, null); } diff --git a/android/src/main/java/io/openim/flutter_openim_sdk/manager/MessageManager.java b/android/src/main/java/io/openim/flutter_openim_sdk/manager/MessageManager.java index 45e9369..143e289 100644 --- a/android/src/main/java/io/openim/flutter_openim_sdk/manager/MessageManager.java +++ b/android/src/main/java/io/openim/flutter_openim_sdk/manager/MessageManager.java @@ -1,5 +1,7 @@ package io.openim.flutter_openim_sdk.manager; +import android.content.Context; + import java.util.HashMap; import java.util.Map; @@ -15,18 +17,12 @@ import open_im_sdk.Open_im_sdk; public class MessageManager { private final static String KEY_ID = "id"; - private final MethodChannel channel; private final static Map listeners = new HashMap<>(); - - public MessageManager(MethodChannel channel) { - this.channel = channel; - } - public void addAdvancedMsgListener(MethodCall methodCall, MethodChannel.Result result) { String key = methodCall.argument(KEY_ID); if (!listeners.containsKey(key)) { - AdvancedMsgListenerImpl listener = new AdvancedMsgListenerImpl(channel, key); + AdvancedMsgListenerImpl listener = new AdvancedMsgListenerImpl(key); listeners.put(methodCall.argument(KEY_ID), listener); Open_im_sdk.addAdvancedMsgListener(listener); } @@ -39,7 +35,7 @@ public class MessageManager { } public void sendMessage(MethodCall methodCall, MethodChannel.Result result) { - MsgSendProgressListener listener = new MsgSendProgressListener(result, channel, methodCall); + MsgSendProgressListener listener = new MsgSendProgressListener(result, methodCall); Open_im_sdk.sendMessage(listener, CommonUtil.getSendMessageContent(methodCall), CommonUtil.getSendMessageReceiver(methodCall), CommonUtil.geSendMessageGroupId(methodCall), CommonUtil.getSendMessageOnlineOnly(methodCall)); } diff --git a/android/src/main/java/io/openim/flutter_openim_sdk/util/CommonUtil.java b/android/src/main/java/io/openim/flutter_openim_sdk/util/CommonUtil.java index 32617f6..dbff4bb 100644 --- a/android/src/main/java/io/openim/flutter_openim_sdk/util/CommonUtil.java +++ b/android/src/main/java/io/openim/flutter_openim_sdk/util/CommonUtil.java @@ -6,6 +6,7 @@ import android.os.Looper; import java.util.HashMap; import java.util.Map; +import io.flutter.Log; import io.flutter.plugin.common.MethodCall; import io.flutter.plugin.common.MethodChannel; import io.openim.flutter_openim_sdk.FlutterOpenimSdkPlugin; @@ -53,7 +54,7 @@ public class CommonUtil { runMainThreadReturnError(result, String.valueOf(errorCode), errorMessage, errorDetails); } - public static void emitEvent(MethodChannel channel, String method, String type, Long errCode, String errMsg, T data) { + public static void emitEvent(String method, String type, Long errCode, String errMsg, T data) { runMainThread(new Runnable() { @Override public void run() { @@ -70,14 +71,14 @@ public class CommonUtil { if (null != errMsg) { res.put("errMsg", errMsg); } - System.out.println("native call flutter { method:" + method + ", type:" + type + " }"); + Log.i("F-OpenIMSDK(native call flutter)", "{ method:" + method + ", type:" + type + " }"); FlutterOpenimSdkPlugin.channel.invokeMethod(method, res); } }); } - public static void emitEvent(MethodChannel channel, String method, String type, T data) { - emitEvent(channel, method, type, null, null, data); + public static void emitEvent(String method, String type, T data) { + emitEvent(method, type, null, null, data); } diff --git a/android/src/main/java/io/openim/flutter_openim_sdk/util/JsonUtil.java b/android/src/main/java/io/openim/flutter_openim_sdk/util/JsonUtil.java index 498ad9d..853220d 100644 --- a/android/src/main/java/io/openim/flutter_openim_sdk/util/JsonUtil.java +++ b/android/src/main/java/io/openim/flutter_openim_sdk/util/JsonUtil.java @@ -1,70 +1,13 @@ package io.openim.flutter_openim_sdk.util; - -import android.text.TextUtils; - -import com.alibaba.fastjson.JSON; -import com.alibaba.fastjson.TypeReference; - -import java.util.List; -import java.util.Map; - -import static com.alibaba.fastjson.JSON.parseObject; +import org.json.JSONObject; public class JsonUtil { - - public static String toString(Object object) { - if (object == null) { - return ""; + public static String toString(Object o) { + Object obj = JSONObject.wrap(o); + if (null != obj) { + return obj.toString(); } - try { - return JSON.toJSONString(object); - } catch (Exception e) { - e.printStackTrace(); - } - return ""; + return null; } - - - public static T toObj(String jsonData, Class clazz) { - T t = null; - if (TextUtils.isEmpty(jsonData)) { - return null; - } - try { - t = parseObject(jsonData, clazz); - } catch (Exception e) { - e.printStackTrace(); - } - return t; - } - - - public static List toList(String jsonData, Class clazz) { - List list = null; - try { - list = JSON.parseArray(jsonData, clazz); - } catch (Exception e) { - e.printStackTrace(); - } - return list; - } - - - /** - * json转化为Map fastjson 使用方式 - */ - public static Map toMap(String jsonData) { - if (TextUtils.isEmpty(jsonData)) { - return null; - } - Map map = null; - try { - map = parseObject(jsonData, new TypeReference() { - }); - } catch (Exception e) { - e.printStackTrace(); - } - return map; - } -} \ No newline at end of file +} diff --git a/ios/Classes/CommonUtil.swift b/ios/Classes/CommonUtil.swift new file mode 100644 index 0000000..20f30f1 --- /dev/null +++ b/ios/Classes/CommonUtil.swift @@ -0,0 +1,344 @@ +// +// CommonUtil.swift +// Runner +// +// Created by z1u24 on 2021/6/28. +// + +import Foundation + + +public class CommonUtil { + + public static func getParamValue(methodCall:FlutterMethodCall, param: String)->Any? { + let argument = methodCall.arguments as! NSDictionary + let arg = argument.value(forKey: param) + return arg; + } + + public static func getSDKJsonParam(methodCall: FlutterMethodCall, key: String) -> String{ + let argument = methodCall.arguments as! NSDictionary + let arg = argument.value(forKey: key) as AnyObject + return JsonUtil.toString(object: arg); + } + + public static func getSDKJsonParam(methodCall: FlutterMethodCall) -> String{ + let argument = methodCall.arguments as AnyObject + let s = JsonUtil.toString(object: argument) + return s + } + + public static func emitEvent(channel: FlutterMethodChannel, method: String, type: String, errCode: Int?, errMsg: String?, data: Any?){ + DispatchQueue.main.async { + let res: NSMutableDictionary = NSMutableDictionary(capacity: 0) + res.setValue(type, forKey: "type") + if (data != nil) { + res.setValue(data, forKey: "data"); + } + if (nil != errCode) { + res.setValue(errCode, forKey: "errCode"); + } + if (nil != errMsg) { + res.setValue(errMsg, forKey: "errMsg"); + } + print("native call flutter { method: \(method) type: \(type) }") + channel.invokeMethod(method, arguments: res) + } + } + + public static func getUid(methodCall: FlutterMethodCall)->String{ + let result: String = getParamValue(methodCall: methodCall, param: KEY_LOGIN_UID) as! String + return result + } + + public static func getToken(methodCall: FlutterMethodCall)->String{ + let result: String = getParamValue(methodCall: methodCall, param: KEY_LOGIN_TOKEN) as! String + return result + } + + public static func getUidList(methodCall: FlutterMethodCall)->String{ + let result = getParamValue(methodCall: methodCall, param: KEY_UID_LIST) as AnyObject + let r = JsonUtil.toString(object: result) + return r + } + + public static func getUserUid(methodCall: FlutterMethodCall)->String{ + let result = getParamValue(methodCall: methodCall, param: KEY_LOGIN_UID) as AnyObject + let r = JsonUtil.toString(object: result) + return r + } + + public static func getDeleteUid(methodCall: FlutterMethodCall)->String{ + let result = getParamValue(methodCall: methodCall, param: KEY_DELETE_UID) as AnyObject + let r = JsonUtil.toString(object: result) + return r + } + + public static func getMessageText(methodCall: FlutterMethodCall)->String{ + let result: String = getParamValue(methodCall: methodCall, param: KEY_TEXT) as! String + return result + } + + public static func getAtUserList(methodCall: FlutterMethodCall)->String{ + let result: String = getParamValue(methodCall: methodCall, param: KEY_AT_USER_LIST) as! String + return result + } + + public static func getImagePath(methodCall: FlutterMethodCall)->String{ + let result: String = getParamValue(methodCall: methodCall, param: KEY_IMAGE_PATH) as! String + return result + } + + public static func getSoundPath(methodCall: FlutterMethodCall)->String{ + let result: String = getParamValue(methodCall: methodCall, param: KEY_SOUND_PATH) as! String + return result + } + + public static func getSoundDuration(methodCall: FlutterMethodCall)->Int64{ + let result: Int64 = getParamValue(methodCall: methodCall, param: KEY_SOUND_DURATION) as! Int64 + return result + } + + public static func getVideoPath(methodCall: FlutterMethodCall)->String{ + let result: String = getParamValue(methodCall: methodCall, param: KEY_VIDEO_PATH) as! String + return result + } + + public static func getVideoType(methodCall: FlutterMethodCall)->String{ + let result: String = getParamValue(methodCall: methodCall, param: KEY_VIDEO_TYPE) as! String + return result + } + + public static func getVideoDuration(methodCall: FlutterMethodCall)->Int64{ + let result: Int64 = getParamValue(methodCall: methodCall, param: KEY_VIDEO_DURATION) as! Int64 + return result + } + + public static func getVideoSnapshotPath(methodCall: FlutterMethodCall)->String{ + let result: String = getParamValue(methodCall: methodCall, param: KEY_VIDEO_SNAPSHOT_PATH) as! String + return result + } + + public static func getFilePath(methodCall: FlutterMethodCall)->String{ + let result: String = getParamValue(methodCall: methodCall, param: KEY_FILE_PATH) as! String + return result + } + + public static func getFileName(methodCall: FlutterMethodCall)->String{ + let result: String = getParamValue(methodCall: methodCall, param: KEY_FILE_NAME) as! String + return result + } + + public static func getMergerMessageList(methodCall: FlutterMethodCall)->String{ + let result: String = getParamValue(methodCall: methodCall, param: KEY_MERGER_MESSAGE_LIST) as! String + return result + } + + public static func getMergerMessageTitle(methodCall: FlutterMethodCall)->String{ + let result: String = getParamValue(methodCall: methodCall, param: KEY_MERGER_MESSAGE_TITLE) as! String + return result + } + + public static func getSummaryList(methodCall: FlutterMethodCall)->String{ + let result: String = getParamValue(methodCall: methodCall, param: KEY_SUMMARY_LIST) as! String + return result + } + + public static func getForwardMessage(methodCall: FlutterMethodCall)->String{ + let result: String = getParamValue(methodCall: methodCall, param: KEY_FORWARD_MESSAGE) as! String + return result + } + + public static func getSendMessageContent(methodCall: FlutterMethodCall)->String{ + let result = getParamValue(methodCall: methodCall, param: KEY_SEND_MESSAGE_CONTENT) + if result is NSDictionary && result != nil { + return JsonUtil.toString(object: result as? NSDictionary) + } + return result as! String + } + + public static func getSendMessageClientMsgID(methodCall: FlutterMethodCall)->String{ + let r = getParamValue(methodCall: methodCall, param: KEY_SEND_MESSAGE_CONTENT) as! NSDictionary + let result = r.value(forKey: KEY_SEND_MESSAGE_CONTENT_CLIENT_ID) + return result as! String + } + + public static func getSendMessageReceiver(methodCall: FlutterMethodCall)->String{ + let result: String = getParamValue(methodCall: methodCall, param: KEY_SEND_MESSAGE_RECEIVER) as! String + return result + } + + public static func getSendMessageGroupId(methodCall: FlutterMethodCall)->String{ + let result: String = getParamValue(methodCall: methodCall, param: KEY_SEND_MESSAGE_GROUP_ID) as! String + return result + } + + public static func getSendMessageOnlineOnly(methodCall: FlutterMethodCall)->Bool{ + let result: Int = getParamValue(methodCall: methodCall, param: KEY_SEND_MESSAGE_ONLINE_ONLY) as! Int + return (result != 0) + } + + public static func getSingleMessageContent(methodCall: FlutterMethodCall)->String{ + let result: String = getParamValue(methodCall: methodCall, param: KEY_SINGLE_MESSAGE_CONTENT) as! String + return result + } + + public static func getSingleMessageUserid(methodCall: FlutterMethodCall)->String{ + let result: String = getParamValue(methodCall: methodCall, param: KEY_SINGLE_MESSAGE_USERID) as! String + return result + } + + public static func getSingleMessageSender(methodCall: FlutterMethodCall)->String{ + let result: String = getParamValue(methodCall: methodCall, param: KEY_SINGLE_MESSAGE_SENDER) as! String + return result + } + + public static func getFindMessageIds(methodCall: FlutterMethodCall)->String{ + let result: String = getParamValue(methodCall: methodCall, param: KEY_FIND_MESSAGE_IDS) as! String + return result + } + + public static func getConversationId(methodCall: FlutterMethodCall)->String{ + let result: String = getParamValue(methodCall: methodCall, param: KEY_CONVERSATION_ID) as! String + return result + } + + public static func getConversationIds(methodCall: FlutterMethodCall)->String{ + let result: String = getParamValue(methodCall: methodCall, param: KEY_CONVERSATION_IDS) as! String + return result + } + + public static func getConversationDraft(methodCall: FlutterMethodCall)->String{ + let result: String = getParamValue(methodCall: methodCall, param: KEY_CONVERSATION_DRAFT) as! String + return result + } + + public static func isPinnedConversation(methodCall: FlutterMethodCall)->Bool{ + let result: Int = getParamValue(methodCall: methodCall, param: KEY_SINGLE_MESSAGE_USERID) as! Int + return (result != 0) + } + + public static func getSessionType(methodCall: FlutterMethodCall)->Int{ + let result: Int = getParamValue(methodCall: methodCall, param: KEY_CONVERSATION_SESSION) as! Int + return result + } + + /** + * group + */ + public static func getGroupId(methodCall: FlutterMethodCall)->String{ + let result: String = getParamValue(methodCall: methodCall, param: KEY_GROUP_ID) as! String + return result + } + + public static func getGroupReason(methodCall: FlutterMethodCall)->String{ + let result: String = getParamValue(methodCall: methodCall, param: KEY_GROUP_REASON) as! String + return result + } + + public static func getGroupUserList(methodCall: FlutterMethodCall)->String{ + let result: String = getParamValue(methodCall: methodCall, param: KEY_GROUP_USERLIST) as! String + return result + } + + public static func getGroupFilter(methodCall: FlutterMethodCall)->Int32{ + let result: Int32 = getParamValue(methodCall: methodCall, param: KEY_GROUP_FILTER) as! Int32 + return result + } + + public static func getGroupNext(methodCall: FlutterMethodCall)->Int32{ + let result: Int32 = getParamValue(methodCall: methodCall, param: KEY_GROUP_NEXT) as! Int32 + return result + } + + public static func getGroupInfo(methodCall: FlutterMethodCall)->String{ + let result: String = getParamValue(methodCall: methodCall, param: KEY_GROUP_INFO) as! String + return result + } + + public static func getGroupMemberList(methodCall: FlutterMethodCall)->String{ + let result: String = getParamValue(methodCall: methodCall, param: KEY_GROUP_MEMBERLIST) as! String + return result + } + + public static func getGroupJsonInfo(methodCall: FlutterMethodCall)->String{ + let result: String = getParamValue(methodCall: methodCall, param: KEY_GROUP_JSONINFO) as! String + return result + } + + public static func getGroupIdList(methodCall: FlutterMethodCall)->String{ + let result: String = getParamValue(methodCall: methodCall, param: KEY_GROUP_IDLIST) as! String + return result + } + + public static func getGroupMessage(methodCall: FlutterMethodCall)->String{ + let result: String = getParamValue(methodCall: methodCall, param: KEY_GROUP_MESSAGE) as! String + return result + } + + public static func getGroupUserId(methodCall: FlutterMethodCall)->String{ + let result: String = getParamValue(methodCall: methodCall, param: KEY_USER_ID) as! String + return result + } + + public static func getGroupApplication(methodCall: FlutterMethodCall)->String{ + let result: String = getParamValue(methodCall: methodCall, param: KEY_GROUP_APPLICATION) as! String + return result + } + + + //login + private static let KEY_LOGIN_UID: String = "uid"; + private static let KEY_LOGIN_TOKEN: String = "token"; + //userinfo + private static let KEY_UID_LIST: String = "uidList"; + private static let KEY_DELETE_UID: String = "deleteUid"; + //create message body + private static let KEY_TEXT: String = "text"; + private static let KEY_AT_USER_LIST: String = "atUserList"; + private static let KEY_IMAGE_PATH: String = "imagePath"; + private static let KEY_SOUND_PATH: String = "soundPath"; + private static let KEY_SOUND_DURATION: String = "duration"; + private static let KEY_VIDEO_PATH: String = "videoPath"; + private static let KEY_VIDEO_TYPE: String = "videoType"; + private static let KEY_VIDEO_DURATION: String = "duration"; + private static let KEY_VIDEO_SNAPSHOT_PATH: String = "snapshotPath"; + private static let KEY_FILE_PATH: String = "filePath"; + private static let KEY_FILE_NAME: String = "fileName"; + private static let KEY_MERGER_MESSAGE_LIST: String = "messageList"; + private static let KEY_MERGER_MESSAGE_TITLE: String = "title"; + private static let KEY_SUMMARY_LIST: String = "summaryList"; + private static let KEY_FORWARD_MESSAGE: String = "message"; + //send message + private static let KEY_SEND_MESSAGE_CONTENT: String = "message"; + private static let KEY_SEND_MESSAGE_CONTENT_CLIENT_ID: String = "clientMsgID"; + private static let KEY_SEND_MESSAGE_RECEIVER: String = "receiver"; + private static let KEY_SEND_MESSAGE_GROUP_ID: String = "groupID"; + private static let KEY_SEND_MESSAGE_ONLINE_ONLY: String = "onlineUserOnly"; + //single chat + private static let KEY_SINGLE_MESSAGE_CONTENT: String = "message"; + private static let KEY_SINGLE_MESSAGE_USERID: String = "userID"; + private static let KEY_SINGLE_MESSAGE_SENDER: String = "sender"; + // find message + private static let KEY_FIND_MESSAGE_IDS: String = "messageIDList"; + // conversation + private static let KEY_CONVERSATION_ID: String = "conversationID"; + private static let KEY_CONVERSATION_IDS: String = "conversationIDList"; + private static let KEY_CONVERSATION_DRAFT: String = "draftText"; + private static let KEY_CONVERSATION_PINNED: String = "isPinned"; + private static let KEY_CONVERSATION_SESSION: String = "sessionType"; + + //group + private static let KEY_GROUP_ID: String = "groupid"; + private static let KEY_GROUP_USERLIST: String = "userList"; + private static let KEY_GROUP_REASON: String = "reason"; + private static let KEY_GROUP_FILTER: String = "filter"; + private static let KEY_GROUP_NEXT: String = "next"; + private static let KEY_GROUP_INFO: String = "gInfo"; + private static let KEY_GROUP_MEMBERLIST: String = "memberList"; + private static let KEY_GROUP_JSONINFO: String = "jsonGroupInfo"; + private static let KEY_GROUP_IDLIST: String = "groupIdList"; + private static let KEY_GROUP_MESSAGE: String = "message"; + private static let KEY_USER_ID: String = "userId"; + private static let KEY_GROUP_APPLICATION: String = "application"; +} diff --git a/ios/Classes/JsonUtil.swift b/ios/Classes/JsonUtil.swift new file mode 100644 index 0000000..1f6615c --- /dev/null +++ b/ios/Classes/JsonUtil.swift @@ -0,0 +1,27 @@ +// +// JsonUtil.swift +// Runner +// +// Created by z1u24 on 2021/6/28. +// + +import Foundation + +public class JsonUtil { + + public static func toString(object: AnyObject?)->String{ + if object == nil { + return ""; + } + if object is String{ + let s = object as! String + let b = s.replacingOccurrences(of: "\"", with: "\\\"") + let a = "\"\(b)\"" + return a + } + let data = try? JSONSerialization.data(withJSONObject: object!, options: JSONSerialization.WritingOptions.init(rawValue: 0)) + let jsonStr = NSString(data: data!, encoding: String.Encoding.utf8.rawValue) + return jsonStr! as String + } + +} diff --git a/ios/Classes/Module/ConversationManager.swift b/ios/Classes/Module/ConversationManager.swift new file mode 100644 index 0000000..9e3d96f --- /dev/null +++ b/ios/Classes/Module/ConversationManager.swift @@ -0,0 +1,88 @@ +// +// ConversationManager.swift +// Runner +// +// Created by z1u24 on 2021/6/29. +// + +import Foundation +import OpenIMCore + +public class ConversationManager:NSObject{ + private let channel:FlutterMethodChannel + + init(channel:FlutterMethodChannel) { + self.channel = channel + } + + func setConversationListener(methodCall: FlutterMethodCall, result: FlutterResult){ + Open_im_sdkSetConversationListener(ConversationListenerImpl(channel: channel)) + } + + func getAllConversationList(methodCall: FlutterMethodCall, result: @escaping FlutterResult){ + Open_im_sdkGetAllConversationList(BaseImpl(result: result)) + } + + func getOneConversation(methodCall: FlutterMethodCall, result: @escaping FlutterResult){ + Open_im_sdkGetOneConversation(CommonUtil.getConversationId(methodCall: methodCall), CommonUtil.getSessionType(methodCall: methodCall), BaseImpl(result: result)) + } + + func getMultipleConversation(methodCall: FlutterMethodCall, result: @escaping FlutterResult){ + Open_im_sdkGetMultipleConversation(CommonUtil.getConversationIds(methodCall: methodCall), BaseImpl(result: result)) + } + + func deleteConversation(methodCall: FlutterMethodCall, result: @escaping FlutterResult){ + Open_im_sdkDeleteConversation(CommonUtil.getConversationId(methodCall: methodCall), BaseImpl(result: result)) + } + + func setConversationDraft(methodCall: FlutterMethodCall, result: @escaping FlutterResult){ + Open_im_sdkSetConversationDraft(CommonUtil.getConversationId(methodCall: methodCall), CommonUtil.getConversationDraft(methodCall: methodCall), BaseImpl(result: result)) + } + + func pinConversation(methodCall: FlutterMethodCall, result: @escaping FlutterResult){ + Open_im_sdkPinConversation(CommonUtil.getConversationId(methodCall: methodCall), CommonUtil.isPinnedConversation(methodCall: methodCall), BaseImpl(result: result)) + } + + func getTotalUnreadMsgCount(methodCall: FlutterMethodCall, result: @escaping FlutterResult){ + Open_im_sdkGetTotalUnreadMsgCount(BaseImpl(result: result)) + } + +} + + +public class ConversationListenerImpl:NSObject,Open_im_sdkOnConversationListenerProtocol { + + private let channel:FlutterMethodChannel + + init(channel:FlutterMethodChannel) { + self.channel = channel + } + + public func onConversationChanged(_ conversationList: String?) { + CommonUtil.emitEvent(channel: channel, method: "conversationListener", type: "onConversationChanged", errCode: nil, errMsg: nil, data: conversationList) + } + + public func onNewConversation(_ conversationList: String?) { + CommonUtil.emitEvent(channel: channel, method: "conversationListener", type: "onNewConversation", errCode: nil, errMsg: nil, data: conversationList) + } + + public func onSyncServerFailed() { + CommonUtil.emitEvent(channel: channel, method: "conversationListener", type: "onSyncServerFailed", errCode: nil, errMsg: nil, data: nil) + } + + public func onSyncServerFinish() { + CommonUtil.emitEvent(channel: channel, method: "conversationListener", type: "onSyncServerFinish", errCode: nil, errMsg: nil, data: nil) + } + + public func onSyncServerStart() { + CommonUtil.emitEvent(channel: channel, method: "conversationListener", type: "onSyncServerStart", errCode: nil, errMsg: nil, data: nil) + } + + public func onTotalUnreadMessageCountChanged(_ totalUnreadCount: Int32) { + CommonUtil.emitEvent(channel: channel, method: "conversationListener", type: "onTotalUnreadMessageCountChanged", errCode: nil, errMsg: nil, data: totalUnreadCount) + } + + + +} + diff --git a/ios/Classes/Module/FriendshipManager.swift b/ios/Classes/Module/FriendshipManager.swift new file mode 100644 index 0000000..d79badb --- /dev/null +++ b/ios/Classes/Module/FriendshipManager.swift @@ -0,0 +1,126 @@ +// +// FriendshipManager.swift +// Runner +// +// Created by z1u24 on 2021/6/29. +// + +import Foundation +import OpenIMCore + +public class FriendshipManager:NSObject{ + private let channel:FlutterMethodChannel + + init(channel:FlutterMethodChannel) { + self.channel = channel + } + + func setFriendListener(methodCall: FlutterMethodCall, result: FlutterResult){ + Open_im_sdkSetFriendListener(FriendshipListenerImpl(channel: channel)) + } + + func getFriendsInfo(methodCall: FlutterMethodCall, result: @escaping FlutterResult){ + Open_im_sdkGetFriendsInfo(BaseImpl(result: result), CommonUtil.getUidList(methodCall: methodCall)) + } + + func addFriend(methodCall: FlutterMethodCall, result: @escaping FlutterResult){ + Open_im_sdkAddFriend(BaseImpl(result: result), CommonUtil.getSDKJsonParam(methodCall: methodCall)) + } + + func getFriendApplicationList(methodCall: FlutterMethodCall, result: @escaping FlutterResult){ + Open_im_sdkGetFriendApplicationList(BaseImpl(result: result)) + } + + func getFriendList(methodCall: FlutterMethodCall, result: @escaping FlutterResult){ + Open_im_sdkGetFriendList(BaseImpl(result: result)) + } + + func setFriendInfo(methodCall: FlutterMethodCall, result: @escaping FlutterResult){ + Open_im_sdkSetFriendInfo(CommonUtil.getSDKJsonParam(methodCall: methodCall), BaseImpl(result: result)) + } + + func addToBlackList(methodCall: FlutterMethodCall, result: @escaping FlutterResult){ + Open_im_sdkAddToBlackList(BaseImpl(result: result), CommonUtil.getUserUid(methodCall: methodCall)) + } + + func getBlackList(methodCall: FlutterMethodCall, result: @escaping FlutterResult){ + Open_im_sdkGetBlackList(BaseImpl(result: result)) + } + + func deleteFromBlackList(methodCall: FlutterMethodCall, result: @escaping FlutterResult){ + Open_im_sdkDeleteFromBlackList(BaseImpl(result: result), CommonUtil.getUserUid(methodCall: methodCall)) + } + + func checkFriend(methodCall: FlutterMethodCall, result: @escaping FlutterResult){ + Open_im_sdkCheckFriend(BaseImpl(result: result), CommonUtil.getUidList(methodCall: methodCall)) + } + + func deleteFromFriendList(methodCall: FlutterMethodCall, result: @escaping FlutterResult){ + Open_im_sdkDeleteFromFriendList(CommonUtil.getDeleteUid(methodCall: methodCall), BaseImpl(result: result)) + } + + func acceptFriendApplication(methodCall: FlutterMethodCall, result: @escaping FlutterResult){ + Open_im_sdkAcceptFriendApplication(BaseImpl(result: result), CommonUtil.getUid(methodCall: methodCall)) + } + + func refuseFriendApplication(methodCall: FlutterMethodCall, result: @escaping FlutterResult){ + Open_im_sdkRefuseFriendApplication(BaseImpl(result: result), CommonUtil.getUid(methodCall: methodCall)) + } + + func forceSyncFriendApplication(methodCall: FlutterMethodCall, result: FlutterResult){ + Open_im_sdkForceSyncFriendApplication(); + } + + func forceSyncFriend(methodCall: FlutterMethodCall, result: FlutterResult){ + Open_im_sdkForceSyncFriend() + } + + func forceSyncBlackList(methodCall: FlutterMethodCall, result: FlutterResult){ + Open_im_sdkForceSyncBlackList() + } +} + +public class FriendshipListenerImpl:NSObject,Open_im_sdkOnFriendshipListenerProtocol { + private let channel:FlutterMethodChannel + + init(channel:FlutterMethodChannel) { + self.channel = channel + } + + public func onBlackListAdd(_ userInfo: String?) { + CommonUtil.emitEvent(channel: channel, method: "friendListener", type: "onBlackListAdd", errCode: nil, errMsg: nil, data: userInfo) + } + + public func onBlackListDeleted(_ userInfo: String?) { + CommonUtil.emitEvent(channel: channel, method: "friendListener", type: "onBlackListDeleted", errCode: nil, errMsg: nil, data: userInfo) + } + + public func onFriendApplicationListAccept(_ applyUserInfo: String?) { + CommonUtil.emitEvent(channel: channel, method: "friendListener", type: "onFriendApplicationListAccept", errCode: nil, errMsg: nil, data: applyUserInfo) + } + + public func onFriendApplicationListAdded(_ applyUserInfo: String?) { + CommonUtil.emitEvent(channel: channel, method: "friendListener", type: "onFriendApplicationListAdded", errCode: nil, errMsg: nil, data: applyUserInfo) + } + + public func onFriendApplicationListDeleted(_ applyUserInfo: String?) { + CommonUtil.emitEvent(channel: channel, method: "friendListener", type: "onFriendApplicationListDeleted", errCode: nil, errMsg: nil, data: applyUserInfo) + } + + public func onFriendApplicationListReject(_ applyUserInfo: String?) { + CommonUtil.emitEvent(channel: channel, method: "friendListener", type: "onFriendApplicationListReject", errCode: nil, errMsg: nil, data: applyUserInfo) + } + + public func onFriendInfoChanged(_ friendInfo: String?) { + CommonUtil.emitEvent(channel: channel, method: "friendListener", type: "onFriendInfoChanged", errCode: nil, errMsg: nil, data: friendInfo) + } + + public func onFriendListAdded(_ friendInfo: String?) { + CommonUtil.emitEvent(channel: channel, method: "friendListener", type: "onFriendListAdded", errCode: nil, errMsg: nil, data: friendInfo) + } + + public func onFriendListDeleted(_ friendInfo: String?) { + CommonUtil.emitEvent(channel: channel, method: "friendListener", type: "onFriendListDeleted", errCode: nil, errMsg: nil, data: friendInfo) + } + +} diff --git a/ios/Classes/Module/GroupManager.swift b/ios/Classes/Module/GroupManager.swift new file mode 100644 index 0000000..a92bb40 --- /dev/null +++ b/ios/Classes/Module/GroupManager.swift @@ -0,0 +1,74 @@ +// +// GroupManager.swift +// flutter_openim_sdk +// +// Created by z1u24 on 2021/7/5. +// + +import Foundation +import OpenIMCore + +public class GroupManager:NSObject{ + private let channel:FlutterMethodChannel + + init(channel:FlutterMethodChannel) { + self.channel = channel + } + + func inviteUserToGroup(methodCall: FlutterMethodCall, result: @escaping FlutterResult){ + Open_im_sdkInviteUserToGroup(CommonUtil.getGroupId(methodCall: methodCall), CommonUtil.getGroupReason(methodCall: methodCall), CommonUtil.getGroupUserList(methodCall: methodCall), BaseImpl(result: result)) + } + + func kickGroupMember(methodCall: FlutterMethodCall, result: @escaping FlutterResult){ + Open_im_sdkKickGroupMember(CommonUtil.getGroupId(methodCall: methodCall), CommonUtil.getGroupUserList(methodCall: methodCall), CommonUtil.getGroupReason(methodCall: methodCall), BaseImpl(result: result)) + } + + func getGroupMembersInfo(methodCall: FlutterMethodCall, result: @escaping FlutterResult){ + Open_im_sdkGetGroupMembersInfo(CommonUtil.getGroupId(methodCall: methodCall), CommonUtil.getGroupUserList(methodCall: methodCall), BaseImpl(result: result)) + } + + func getGroupMemberList(methodCall: FlutterMethodCall, result: @escaping FlutterResult){ + Open_im_sdkGetGroupMemberList(CommonUtil.getGroupId(methodCall: methodCall), CommonUtil.getGroupFilter(methodCall: methodCall), CommonUtil.getGroupNext(methodCall: methodCall), BaseImpl(result: result)) + } + + func getJoinedGroupList(methodCall: FlutterMethodCall, result: @escaping FlutterResult){ + Open_im_sdkGetJoinedGroupList(BaseImpl(result: result)) + } + + func createGroup(methodCall: FlutterMethodCall, result: @escaping FlutterResult){ + Open_im_sdkCreateGroup(CommonUtil.getGroupInfo(methodCall: methodCall), CommonUtil.getGroupMemberList(methodCall: methodCall), BaseImpl(result: result)) + } + + func setGroupInfo(methodCall: FlutterMethodCall, result: @escaping FlutterResult){ + Open_im_sdkSetGroupInfo(CommonUtil.getGroupJsonInfo(methodCall: methodCall), BaseImpl(result: result)) + } + + func getGroupsInfo(methodCall: FlutterMethodCall, result: @escaping FlutterResult){ + Open_im_sdkGetGroupsInfo(CommonUtil.getGroupIdList(methodCall: methodCall), BaseImpl(result: result)) + } + + func joinGroup(methodCall: FlutterMethodCall, result: @escaping FlutterResult){ + Open_im_sdkJoinGroup(CommonUtil.getGroupId(methodCall: methodCall), CommonUtil.getGroupMessage(methodCall: methodCall), BaseImpl(result: result)) + } + + func quitGroup(methodCall: FlutterMethodCall, result: @escaping FlutterResult){ + Open_im_sdkQuitGroup(CommonUtil.getGroupId(methodCall: methodCall), BaseImpl(result: result)) + } + + func transferGroupOwner(methodCall: FlutterMethodCall, result: @escaping FlutterResult){ + Open_im_sdkTransferGroupOwner(CommonUtil.getGroupId(methodCall: methodCall), CommonUtil.getGroupUserId(methodCall: methodCall), BaseImpl(result: result)) + } + + func getGroupApplicationList(methodCall: FlutterMethodCall, result: @escaping FlutterResult){ + Open_im_sdkGetGroupApplicationList(BaseImpl(result: result)) + } + + func acceptGroupApplication(methodCall: FlutterMethodCall, result: @escaping FlutterResult){ + Open_im_sdkAcceptGroupApplication(CommonUtil.getGroupApplication(methodCall: methodCall), CommonUtil.getGroupReason(methodCall: methodCall), BaseImpl(result: result)) + } + + func refuseGroupApplication(methodCall: FlutterMethodCall, result: @escaping FlutterResult){ + Open_im_sdkRefuseGroupApplication(CommonUtil.getGroupApplication(methodCall: methodCall), CommonUtil.getGroupReason(methodCall: methodCall), BaseImpl(result: result)) + } + +} diff --git a/ios/Classes/Module/IMManager.swift b/ios/Classes/Module/IMManager.swift new file mode 100644 index 0000000..bb9a4a7 --- /dev/null +++ b/ios/Classes/Module/IMManager.swift @@ -0,0 +1,101 @@ +// +// IMManager.swift +// Runner +// +// Created by z1u24 on 2021/6/28. +// + +import Foundation +import OpenIMCore + +public class IMMananger:NSObject{ + + private let channel:FlutterMethodChannel + + init(channel:FlutterMethodChannel) { + self.channel = channel + } + + func initSDK(methodCall: FlutterMethodCall, result: FlutterResult){ + Open_im_sdkInitSDK(CommonUtil.getSDKJsonParam(methodCall: methodCall), SDKListenerImpl(channel: self.channel)) + } + + func login(methodCall: FlutterMethodCall, result: @escaping FlutterResult) { + Open_im_sdkLogin(CommonUtil.getUid(methodCall: methodCall), CommonUtil.getToken(methodCall: methodCall), BaseImpl(result: result)) + } + + func logout(methodCall: FlutterMethodCall, result: @escaping FlutterResult) { + Open_im_sdkLogout(BaseImpl(result: result)) + } + + func getLoginStatus(methodCall: FlutterMethodCall, result: @escaping FlutterResult) { + DispatchQueue.main.async { result(Open_im_sdkGetLoginStatus()) } + } + + func getLoginUid(methodCall: FlutterMethodCall, result: @escaping FlutterResult) { + DispatchQueue.main.async { result(Open_im_sdkGetLoginUser()) } + } + + func getUsersInfo(methodCall: FlutterMethodCall, result: @escaping FlutterResult) { + Open_im_sdkGetUsersInfo(CommonUtil.getUidList(methodCall: methodCall), BaseImpl(result: result)) + } + + func setSelfInfo(methodCall: FlutterMethodCall, result: @escaping FlutterResult) { + Open_im_sdkSetSelfInfo(CommonUtil.getSDKJsonParam(methodCall: methodCall), BaseImpl(result: result)) + } + + func forceSyncLoginUerInfo(methodCall: FlutterMethodCall, result: @escaping FlutterResult) { + Open_im_sdkForceSyncLoginUerInfo() + } +} + +public class SDKListenerImpl:NSObject,Open_im_sdkIMSDKListenerProtocol { + private let channel:FlutterMethodChannel + + init(channel:FlutterMethodChannel) { + self.channel = channel + } + + public func onConnectFailed(_ errCode: Int, errMsg: String?) { + CommonUtil.emitEvent(channel: self.channel, method: "initSDKListener", type: "onConnectFailed", errCode: errCode, errMsg: errMsg, data: nil) + } + + public func onConnectSuccess() { + CommonUtil.emitEvent(channel: self.channel, method: "initSDKListener", type: "onConnectSuccess", errCode: nil, errMsg: nil, data: nil); + } + + public func onConnecting() { + CommonUtil.emitEvent(channel: self.channel, method: "initSDKListener", type: "onConnecting", errCode: nil, errMsg: nil, data: nil); + } + + public func onKickedOffline() { + CommonUtil.emitEvent(channel: self.channel, method: "initSDKListener", type: "onKickedOffline", errCode: nil, errMsg: nil, data: nil); + } + + public func onSelfInfoUpdated(_ userInfo: String?) { + CommonUtil.emitEvent(channel: self.channel, method: "initSDKListener", type: "onSelfInfoUpdated", errCode: nil, errMsg: nil, data: userInfo); + } + + public func onUserTokenExpired() { + CommonUtil.emitEvent(channel: self.channel, method: "initSDKListener", type: "onUserTokenExpired", errCode: nil, errMsg: nil, data: nil); + } +} + +public class BaseImpl:NSObject,Open_im_sdkBaseProtocol { + + private let result:FlutterResult + + init(result:@escaping FlutterResult) { + self.result = result + } + + public func onError(_ errCode: Int, errMsg: String?) { + print("BaseImpl: " + errMsg!) + DispatchQueue.main.async { self.result(FlutterError(code: "\(errCode)", message: errMsg, details: nil)) } + } + + public func onSuccess(_ data: String?) { + DispatchQueue.main.async { self.result(data) } + } + +} diff --git a/ios/Classes/Module/MessageManager.swift b/ios/Classes/Module/MessageManager.swift new file mode 100644 index 0000000..164fa6c --- /dev/null +++ b/ios/Classes/Module/MessageManager.swift @@ -0,0 +1,187 @@ +// +// MessageManager.swift +// Runner +// +// Created by z1u24 on 2021/6/29. +// + +import Foundation +import OpenIMCore + +public class MessageManager:NSObject{ + private let KEY_ID: String = "id" + private let channel:FlutterMethodChannel + private let listeners: NSMutableDictionary = NSMutableDictionary(capacity: 0) + private var sendMsgProgressListener: SendMsgProgressListener? + + init(channel:FlutterMethodChannel) { + self.channel = channel + } + + func addAdvancedMsgListener(methodCall: FlutterMethodCall, result: FlutterResult){ + if sendMsgProgressListener == nil { + sendMsgProgressListener = SendMsgProgressListener(channel: channel) + } + let d = methodCall.arguments as! NSDictionary + let key = d.value(forKey: KEY_ID) as! String + if !listeners.allKeys.contains(where: {($0 as! String).compare(key) == .orderedSame}) { + let lis = AdvancedMsgListenerImpl(channel: channel, id: key) + let k = methodCall.arguments as! NSDictionary + let s = k.value(forKey: KEY_ID) as! String + listeners.setValue(lis, forKey: s) + Open_im_sdkAddAdvancedMsgListener(lis) + print("=================add msg listener======\n\(lis)"); + } + } + + func removeAdvancedMsgListener(methodCall: FlutterMethodCall, result: FlutterResult){ + let k = methodCall.arguments as! NSDictionary + let s = k.value(forKey: KEY_ID) as! String + if listeners.allKeys.contains(where: {($0 as! String).compare(s) == .orderedSame}) { + let lis = listeners.value(forKey: s) as! AdvancedMsgListenerImpl + listeners.removeObject(forKey: s) + Open_im_sdkRemoveAdvancedMsgListener(lis) + } + } + + func sendMessage(methodCall: FlutterMethodCall, result: @escaping FlutterResult){ + sendMsgProgressListener?.setCall(methodCall: methodCall) + sendMsgProgressListener?.setResult(result: result) + print("===============sendMessage===============") + Open_im_sdkSendMessage(sendMsgProgressListener, CommonUtil.getSendMessageContent(methodCall: methodCall), CommonUtil.getSendMessageReceiver(methodCall: methodCall), CommonUtil.getSendMessageGroupId(methodCall: methodCall), CommonUtil.getSendMessageOnlineOnly(methodCall: methodCall)) + } + + func getHistoryMessageList(methodCall: FlutterMethodCall, result: @escaping FlutterResult){ + Open_im_sdkGetHistoryMessageList(BaseImpl(result: result), CommonUtil.getSDKJsonParam(methodCall: methodCall)) + } + + func revokeMessage(methodCall: FlutterMethodCall, result: @escaping FlutterResult){ + Open_im_sdkRevokeMessage(BaseImpl(result: result), CommonUtil.getSDKJsonParam(methodCall: methodCall)) + } + + func deleteMessageFromLocalStorage(methodCall: FlutterMethodCall, result: @escaping FlutterResult){ + Open_im_sdkDeleteMessageFromLocalStorage(BaseImpl(result: result), CommonUtil.getSDKJsonParam(methodCall: methodCall)) + } + + func deleteMessages(methodCall: FlutterMethodCall, result: FlutterResult){ + + } + + func insertSingleMessageToLocalStorage(methodCall: FlutterMethodCall, result: @escaping FlutterResult){ + Open_im_sdkInsertSingleMessageToLocalStorage(BaseImpl(result: result), CommonUtil.getSingleMessageContent(methodCall: methodCall), CommonUtil.getSingleMessageUserid(methodCall: methodCall), CommonUtil.getSingleMessageSender(methodCall: methodCall)) + } + + func findMessages(methodCall: FlutterMethodCall, result: @escaping FlutterResult){ + Open_im_sdkFindMessages(BaseImpl(result: result), CommonUtil.getFindMessageIds(methodCall: methodCall)) + } + + func markSingleMessageHasRead(methodCall: FlutterMethodCall, result: @escaping FlutterResult){ + Open_im_sdkMarkSingleMessageHasRead(BaseImpl(result: result), CommonUtil.getSingleMessageUserid(methodCall: methodCall)) + } + + func createTextMessage(methodCall: FlutterMethodCall, result: @escaping FlutterResult){ + let prama = Open_im_sdkCreateTextMessage(CommonUtil.getMessageText(methodCall: methodCall)) + DispatchQueue.main.async { result(prama) } + } + + func createTextAtMessage(methodCall: FlutterMethodCall, result: @escaping FlutterResult){ + let prama = Open_im_sdkCreateTextAtMessage(CommonUtil.getMessageText(methodCall: methodCall), CommonUtil.getAtUserList(methodCall: methodCall)) + DispatchQueue.main.async { result(prama) } + } + + func createImageMessage(methodCall: FlutterMethodCall, result: @escaping FlutterResult){ + let prama = Open_im_sdkCreateImageMessage(CommonUtil.getImagePath(methodCall: methodCall)) + DispatchQueue.main.async { result(prama) } + } + + func createSoundMessage(methodCall: FlutterMethodCall, result: @escaping FlutterResult){ + let prama = Open_im_sdkCreateSoundMessage(CommonUtil.getSoundPath(methodCall: methodCall),CommonUtil.getSoundDuration(methodCall: methodCall)) + DispatchQueue.main.async { result(prama) } + } + + func createVideoMessage(methodCall: FlutterMethodCall, result: @escaping FlutterResult){ + let prama = Open_im_sdkCreateVideoMessage(CommonUtil.getVideoPath(methodCall: methodCall), CommonUtil.getVideoType(methodCall: methodCall), CommonUtil.getVideoDuration(methodCall: methodCall), CommonUtil.getVideoSnapshotPath(methodCall: methodCall)) + DispatchQueue.main.async { result(prama) } + } + + func createFileMessage(methodCall: FlutterMethodCall, result: @escaping FlutterResult){ + let prama = Open_im_sdkCreateFileMessage(CommonUtil.getFilePath(methodCall: methodCall), CommonUtil.getFileName(methodCall: methodCall)) + DispatchQueue.main.async { result(prama) } + } + + func createMergerMessage(methodCall: FlutterMethodCall, result: @escaping FlutterResult){ + let prama = Open_im_sdkCreateMergerMessage(CommonUtil.getMergerMessageList(methodCall: methodCall), CommonUtil.getMergerMessageTitle(methodCall: methodCall), CommonUtil.getSummaryList(methodCall: methodCall)) + DispatchQueue.main.async { result(prama) } + } + + func createForwardMessage(methodCall: FlutterMethodCall, result: @escaping FlutterResult){ + let prama = Open_im_sdkCreateForwardMessage(CommonUtil.getForwardMessage(methodCall: methodCall)) + DispatchQueue.main.async { result(prama) } + } + +} + +public class SendMsgProgressListener:NSObject, Open_im_sdkSendMsgCallBackProtocol { + + private let channel: FlutterMethodChannel + private var result: FlutterResult? + private var call: FlutterMethodCall? + private let values: NSMutableDictionary = NSMutableDictionary(capacity: 0) + + init(channel: FlutterMethodChannel) { + self.channel = channel + } + + func setResult(result: @escaping FlutterResult){ + self.result = result + } + + func setCall(methodCall: FlutterMethodCall){ + self.call = methodCall + } + + public func onError(_ errCode: Int, errMsg: String?) { + print("=================onError============\nerrcode:\(errCode),errMsg:\(errMsg!)"); + DispatchQueue.main.async { self.result!(FlutterError(code: "\(errCode)", message: errMsg, details: nil)) } + } + + public func onProgress(_ progress: Int) { + print("=================onProgress============\nprogress:\(progress)"); + values.setValue(CommonUtil.getSendMessageClientMsgID(methodCall: self.call!), forKey: "clientMsgID") + values.setValue(progress, forKey: "progress") + CommonUtil.emitEvent(channel: channel, method: "messageProgressListener", type: "onProgress", errCode: nil, errMsg: nil, data: values) + } + + public func onSuccess(_ data: String?) { + print("=================onSuccess============\nsuccess:\(data!)"); + DispatchQueue.main.async { self.result!(data) } + } + +} + +public class AdvancedMsgListenerImpl: NSObject, Open_im_sdkOnAdvancedMsgListenerProtocol { + private let channel: FlutterMethodChannel + private let values: NSMutableDictionary = NSMutableDictionary(capacity: 0) + + init(channel: FlutterMethodChannel, id: String) { + self.channel = channel + values.setValue(id, forKey: "id") + } + + public func onRecvC2CReadReceipt(_ msgReceiptList: String?) { + values.setValue(msgReceiptList, forKey: "message") + CommonUtil.emitEvent(channel: channel, method: "advancedMsgListener", type: "onRecvC2CReadReceipt", errCode: nil, errMsg: nil, data: values) + } + + public func onRecvMessageRevoked(_ msgId: String?) { + values.setValue(msgId, forKey: "message") + CommonUtil.emitEvent(channel: channel, method: "advancedMsgListener", type: "onRecvMessageRevoked", errCode: nil, errMsg: nil, data: values) + } + + public func onRecvNewMessage(_ message: String?) { + values.setValue(message, forKey: "message") + CommonUtil.emitEvent(channel: channel, method: "advancedMsgListener", type: "onRecvNewMessage", errCode: nil, errMsg: nil, data: values) + } + + +} diff --git a/ios/Classes/SwiftFlutterOpenimSdkPlugin.swift b/ios/Classes/SwiftFlutterOpenimSdkPlugin.swift index c71358a..33f298b 100644 --- a/ios/Classes/SwiftFlutterOpenimSdkPlugin.swift +++ b/ios/Classes/SwiftFlutterOpenimSdkPlugin.swift @@ -2,13 +2,205 @@ import Flutter import UIKit public class SwiftFlutterOpenimSdkPlugin: NSObject, FlutterPlugin { + + let imManager: IMMananger + let conversationManager: ConversationManager + let friendshipManager: FriendshipManager + let messageManager: MessageManager + let groupManager: GroupManager + + init(channel: FlutterMethodChannel) { + self.imManager = IMMananger(channel: channel) + self.conversationManager = ConversationManager(channel: channel) + self.friendshipManager = FriendshipManager(channel: channel) + self.messageManager = MessageManager(channel: channel) + self.groupManager = GroupManager(channel: channel) + } + public static func register(with registrar: FlutterPluginRegistrar) { let channel = FlutterMethodChannel(name: "flutter_openim_sdk", binaryMessenger: registrar.messenger()) - let instance = SwiftFlutterOpenimSdkPlugin() + let instance = SwiftFlutterOpenimSdkPlugin(channel: channel) registrar.addMethodCallDelegate(instance, channel: channel) } public func handle(_ call: FlutterMethodCall, result: @escaping FlutterResult) { - result("iOS " + UIDevice.current.systemVersion) + let managerName: String = CommonUtil.getParamValue(methodCall: call, param: "ManagerName") as! String + if managerName == "imManager" { + handleIMManager(call: call, result: result) + }else if managerName == "conversationManager"{ + handleConversationManager(call: call, result: result) + }else if managerName == "friendshipManager"{ + handleFriendshipManager(call: call, result: result) + }else if managerName == "messageManager"{ + handleMessageManager(call: call, result: result) + }else if managerName == "groupManager"{ + handleGroupManager(call: call, result: result) + }else{ + print("Handle ManagerName Error: \(managerName) not found") + } } + + private func handleIMManager(call: FlutterMethodCall, result: @escaping FlutterResult){ + let method: String = call.method + if method == "initSDK" { + imManager.initSDK(methodCall: call, result: result) + }else if method == "login" { + imManager.login(methodCall: call, result: result) + }else if method == "logout" { + imManager.logout(methodCall: call, result: result) + }else if method == "getLoginStatus" { + imManager.getLoginStatus(methodCall: call, result: result) + }else if method == "getLoginUid" { + imManager.getLoginUid(methodCall: call, result: result) + }else if method == "getUsersInfo" { + imManager.getUsersInfo(methodCall: call, result: result) + }else if method == "setSelfInfo" { + imManager.setSelfInfo(methodCall: call, result: result) + }else if method == "forceSyncLoginUerInfo" { + imManager.forceSyncLoginUerInfo(methodCall: call, result: result) + }else{ + print("Handle MethodName Error: IMManager method: \(method) not found") + } + } + + private func handleConversationManager(call: FlutterMethodCall, result: @escaping FlutterResult){ + let method: String = call.method + if method == "setConversationListener" { + conversationManager.setConversationListener(methodCall: call, result: result) + }else if method == "getAllConversationList" { + conversationManager.getAllConversationList(methodCall: call, result: result) + }else if method == "getOneConversation" { + conversationManager.getOneConversation(methodCall: call, result: result) + }else if method == "getMultipleConversation" { + conversationManager.getMultipleConversation(methodCall: call, result: result) + }else if method == "deleteConversation" { + conversationManager.deleteConversation(methodCall: call, result: result) + }else if method == "setConversationDraft" { + conversationManager.setConversationDraft(methodCall: call, result: result) + }else if method == "pinConversation" { + conversationManager.pinConversation(methodCall: call, result: result) + }else if method == "getTotalUnreadMsgCount" { + conversationManager.getTotalUnreadMsgCount(methodCall: call, result: result) + }else{ + print("Handle MethodName Error: ConversationManager method: \(method) not found") + } + } + + private func handleFriendshipManager(call: FlutterMethodCall, result: @escaping FlutterResult){ + let method: String = call.method + if method == "setFriendListener" { + friendshipManager.setFriendListener(methodCall: call, result: result) + }else if method == "getFriendsInfo" { + friendshipManager.getFriendsInfo(methodCall: call, result: result) + }else if method == "addFriend" { + friendshipManager.addFriend(methodCall: call, result: result) + }else if method == "getFriendApplicationList" { + friendshipManager.getFriendApplicationList(methodCall: call, result: result) + }else if method == "getFriendList" { + friendshipManager.getFriendList(methodCall: call, result: result) + }else if method == "setFriendInfo" { + friendshipManager.setFriendInfo(methodCall: call, result: result) + }else if method == "addToBlackList" { + friendshipManager.addToBlackList(methodCall: call, result: result) + }else if method == "getBlackList" { + friendshipManager.getBlackList(methodCall: call, result: result) + }else if method == "deleteFromBlackList" { + friendshipManager.deleteFromBlackList(methodCall: call, result: result) + }else if method == "checkFriend" { + friendshipManager.checkFriend(methodCall: call, result: result) + }else if method == "deleteFromFriendList" { + friendshipManager.deleteFromFriendList(methodCall: call, result: result) + }else if method == "acceptFriendApplication" { + friendshipManager.acceptFriendApplication(methodCall: call, result: result) + }else if method == "refuseFriendApplication" { + friendshipManager.refuseFriendApplication(methodCall: call, result: result) + }else if method == "forceSyncFriendApplication" { + friendshipManager.forceSyncFriendApplication(methodCall: call, result: result) + }else if method == "forceSyncFriend" { + friendshipManager.forceSyncFriend(methodCall: call, result: result) + }else if method == "forceSyncBlackList" { + friendshipManager.forceSyncBlackList(methodCall: call, result: result) + }else{ + print("Handle MethodName Error: FriendshipManager method: \(method) not found") + } + } + + private func handleMessageManager(call: FlutterMethodCall, result: @escaping FlutterResult){ + let method: String = call.method + if method == "addAdvancedMsgListener" { + messageManager.addAdvancedMsgListener(methodCall: call, result: result) + }else if method == "removeAdvancedMsgListener" { + messageManager.removeAdvancedMsgListener(methodCall: call, result: result) + }else if method == "sendMessage" { + messageManager.sendMessage(methodCall: call, result: result) + }else if method == "getHistoryMessageList" { + messageManager.getHistoryMessageList(methodCall: call, result: result) + }else if method == "revokeMessage" { + messageManager.revokeMessage(methodCall: call, result: result) + }else if method == "deleteMessageFromLocalStorage" { + messageManager.deleteMessageFromLocalStorage(methodCall: call, result: result) + }else if method == "deleteMessages" { + messageManager.deleteMessages(methodCall: call, result: result) + }else if method == "insertSingleMessageToLocalStorage" { + messageManager.insertSingleMessageToLocalStorage(methodCall: call, result: result) + }else if method == "findMessages" { + messageManager.findMessages(methodCall: call, result: result) + }else if method == "markSingleMessageHasRead" { + messageManager.markSingleMessageHasRead(methodCall: call, result: result) + }else if method == "createTextMessage" { + messageManager.createTextMessage(methodCall: call, result: result) + }else if method == "createTextAtMessage" { + messageManager.createTextAtMessage(methodCall: call, result: result) + }else if method == "createImageMessage" { + messageManager.createImageMessage(methodCall: call, result: result) + }else if method == "createSoundMessage" { + messageManager.createSoundMessage(methodCall: call, result: result) + }else if method == "createVideoMessage" { + messageManager.createVideoMessage(methodCall: call, result: result) + }else if method == "createFileMessage" { + messageManager.createFileMessage(methodCall: call, result: result) + }else if method == "createMergerMessage" { + messageManager.createMergerMessage(methodCall: call, result: result) + }else if method == "createForwardMessage" { + messageManager.createForwardMessage(methodCall: call, result: result) + }else{ + print("Handle MethodName Error: MessageManager method: \(method) not found") + } + } + + private func handleGroupManager(call: FlutterMethodCall, result: @escaping FlutterResult){ + let method: String = call.method + if method == "inviteUserToGroup" { + groupManager.inviteUserToGroup(methodCall: call, result: result) + }else if method == "kickGroupMember" { + groupManager.kickGroupMember(methodCall: call, result: result) + }else if method == "getGroupMembersInfo" { + groupManager.getGroupMembersInfo(methodCall: call, result: result) + }else if method == "getGroupMemberList" { + groupManager.getGroupMemberList(methodCall: call, result: result) + }else if method == "getJoinedGroupList" { + groupManager.getJoinedGroupList(methodCall: call, result: result) + }else if method == "createGroup" { + groupManager.createGroup(methodCall: call, result: result) + }else if method == "setGroupInfo" { + groupManager.setGroupInfo(methodCall: call, result: result) + }else if method == "getGroupsInfo" { + groupManager.getGroupsInfo(methodCall: call, result: result) + }else if method == "joinGroup" { + groupManager.joinGroup(methodCall: call, result: result) + }else if method == "quitGroup" { + groupManager.quitGroup(methodCall: call, result: result) + }else if method == "transferGroupOwner" { + groupManager.transferGroupOwner(methodCall: call, result: result) + }else if method == "getGroupApplicationList" { + groupManager.getGroupApplicationList(methodCall: call, result: result) + }else if method == "acceptGroupApplication" { + groupManager.acceptGroupApplication(methodCall: call, result: result) + }else if method == "refuseGroupApplication" { + groupManager.refuseGroupApplication(methodCall: call, result: result) + }else{ + print("Handle MethodName Error: MessageManager method: \(method) not found") + } + } + } diff --git a/ios/Framework/OpenIMCore.framework/Headers/OpenIMCore.h b/ios/Framework/OpenIMCore.framework/Headers/OpenIMCore.h new file mode 100644 index 0000000..577bdd8 --- /dev/null +++ b/ios/Framework/OpenIMCore.framework/Headers/OpenIMCore.h @@ -0,0 +1,13 @@ + +// Objective-C API for talking to the following Go packages +// +// open_im_sdk/open_im_sdk +// +// File is generated by gomobile bind. Do not edit. +#ifndef __OpenIMCore_FRAMEWORK_H__ +#define __OpenIMCore_FRAMEWORK_H__ + +#include "Open_im_sdk.objc.h" +#include "Universe.objc.h" + +#endif diff --git a/ios/Framework/OpenIMCore.framework/Headers/Open_im_sdk.objc.h b/ios/Framework/OpenIMCore.framework/Headers/Open_im_sdk.objc.h new file mode 100644 index 0000000..84cc504 --- /dev/null +++ b/ios/Framework/OpenIMCore.framework/Headers/Open_im_sdk.objc.h @@ -0,0 +1,882 @@ +// Objective-C API for talking to open_im_sdk/open_im_sdk Go package. +// gobind -lang=objc open_im_sdk/open_im_sdk +// +// File is generated by gobind. Do not edit. + +#ifndef __Open_im_sdk_H__ +#define __Open_im_sdk_H__ + +@import Foundation; +#include "ref.h" +#include "Universe.objc.h" + + +@class Open_im_sdkAgreeOrRejectGroupMember; +@class Open_im_sdkArrMsg; +@class Open_im_sdkChatLog; +@class Open_im_sdkConversationListener; +@class Open_im_sdkConversationStruct; +@class Open_im_sdkFriend; +@class Open_im_sdkGroupApplicationResponseReq; +@class Open_im_sdkGroupReqListInfo; +@class Open_im_sdkIMConfig; +@class Open_im_sdkIMManager; +@class Open_im_sdkInviteUserToGroupReq; +@class Open_im_sdkKickGroupMemberReq; +@class Open_im_sdkLogInfo; +@class Open_im_sdkMessageReceipt; +@class Open_im_sdkMsg; +@class Open_im_sdkMsgData; +@class Open_im_sdkMsgStruct; +@class Open_im_sdkPictureBaseInfo; +@class Open_im_sdkPullMsgReq; +@class Open_im_sdkPullUserMsgResp; +@class Open_im_sdkSendMsgRespFromServer; +@class Open_im_sdkSoundElem; +@class Open_im_sdkTransferGroupOwnerReq; +@class Open_im_sdkUid2Flag; +@protocol Open_im_sdkBase; +@class Open_im_sdkBase; +@protocol Open_im_sdkIMSDKListener; +@class Open_im_sdkIMSDKListener; +@protocol Open_im_sdkOnAdvancedMsgListener; +@class Open_im_sdkOnAdvancedMsgListener; +@protocol Open_im_sdkOnConversationListener; +@class Open_im_sdkOnConversationListener; +@protocol Open_im_sdkOnFriendshipListener; +@class Open_im_sdkOnFriendshipListener; +@protocol Open_im_sdkOnGroupListener; +@class Open_im_sdkOnGroupListener; +@protocol Open_im_sdkSendMsgCallBack; +@class Open_im_sdkSendMsgCallBack; + +@protocol Open_im_sdkBase +- (void)onError:(long)errCode errMsg:(NSString* _Nullable)errMsg; +- (void)onSuccess:(NSString* _Nullable)data; +@end + +@protocol Open_im_sdkIMSDKListener +- (void)onConnectFailed:(long)ErrCode ErrMsg:(NSString* _Nullable)ErrMsg; +- (void)onConnectSuccess; +- (void)onConnecting; +- (void)onKickedOffline; +- (void)onSelfInfoUpdated:(NSString* _Nullable)userInfo; +- (void)onUserTokenExpired; +@end + +@protocol Open_im_sdkOnAdvancedMsgListener +- (void)onRecvC2CReadReceipt:(NSString* _Nullable)msgReceiptList; +- (void)onRecvMessageRevoked:(NSString* _Nullable)msgId; +- (void)onRecvNewMessage:(NSString* _Nullable)message; +@end + +@protocol Open_im_sdkOnConversationListener +- (void)onConversationChanged:(NSString* _Nullable)conversationList; +- (void)onNewConversation:(NSString* _Nullable)conversationList; +- (void)onSyncServerFailed; +- (void)onSyncServerFinish; +- (void)onSyncServerStart; +- (void)onTotalUnreadMessageCountChanged:(int32_t)totalUnreadCount; +@end + +@protocol Open_im_sdkOnFriendshipListener +- (void)onBlackListAdd:(NSString* _Nullable)userInfo; +- (void)onBlackListDeleted:(NSString* _Nullable)userInfo; +- (void)onFriendApplicationListAccept:(NSString* _Nullable)applyUserInfo; +- (void)onFriendApplicationListAdded:(NSString* _Nullable)applyUserInfo; +- (void)onFriendApplicationListDeleted:(NSString* _Nullable)applyUserInfo; +- (void)onFriendApplicationListReject:(NSString* _Nullable)applyUserInfo; +- (void)onFriendInfoChanged:(NSString* _Nullable)friendInfo; +- (void)onFriendListAdded:(NSString* _Nullable)friendInfo; +- (void)onFriendListDeleted:(NSString* _Nullable)friendInfo; +@end + +@protocol Open_im_sdkOnGroupListener +- (void)onApplicationProcessed:(NSString* _Nullable)groupId opUser:(NSString* _Nullable)opUser AgreeOrReject:(int32_t)AgreeOrReject opReason:(NSString* _Nullable)opReason; +- (void)onGroupCreated:(NSString* _Nullable)groupId; +- (void)onGroupInfoChanged:(NSString* _Nullable)groupId groupInfo:(NSString* _Nullable)groupInfo; +- (void)onMemberEnter:(NSString* _Nullable)groupId memberList:(NSString* _Nullable)memberList; +- (void)onMemberInvited:(NSString* _Nullable)groupId opUser:(NSString* _Nullable)opUser memberList:(NSString* _Nullable)memberList; +- (void)onMemberKicked:(NSString* _Nullable)groupId opUser:(NSString* _Nullable)opUser memberList:(NSString* _Nullable)memberList; +- (void)onMemberLeave:(NSString* _Nullable)groupId member:(NSString* _Nullable)member; +- (void)onReceiveJoinApplication:(NSString* _Nullable)groupId member:(NSString* _Nullable)member opReason:(NSString* _Nullable)opReason; +@end + +@protocol Open_im_sdkSendMsgCallBack +- (void)onError:(long)errCode errMsg:(NSString* _Nullable)errMsg; +- (void)onProgress:(long)progress; +- (void)onSuccess:(NSString* _Nullable)data; +@end + +@interface Open_im_sdkAgreeOrRejectGroupMember : NSObject { +} +@property(strong, readonly) _Nonnull id _ref; + +- (nonnull instancetype)initWithRef:(_Nonnull id)ref; +- (nonnull instancetype)init; +@property (nonatomic) NSString* _Nonnull groupId; +@property (nonatomic) NSString* _Nonnull userId; +@property (nonatomic) long role; +// skipped field AgreeOrRejectGroupMember.JoinTime with unsupported type: uint64 + +@property (nonatomic) NSString* _Nonnull nickName; +@property (nonatomic) NSString* _Nonnull faceUrl; +@property (nonatomic) NSString* _Nonnull reason; +@end + +@interface Open_im_sdkArrMsg : NSObject { +} +@property(strong, readonly) _Nonnull id _ref; + +- (nonnull instancetype)initWithRef:(_Nonnull id)ref; +- (nonnull instancetype)init; +// skipped field ArrMsg.Data with unsupported type: []open_im_sdk/open_im_sdk.MsgData + +@end + +@interface Open_im_sdkChatLog : NSObject { +} +@property(strong, readonly) _Nonnull id _ref; + +- (nonnull instancetype)initWithRef:(_Nonnull id)ref; +- (nonnull instancetype)init; +@property (nonatomic) NSString* _Nonnull msgId; +@property (nonatomic) NSString* _Nonnull sendID; +@property (nonatomic) int32_t isRead; +@property (nonatomic) int64_t seq; +@property (nonatomic) int32_t status; +@property (nonatomic) int32_t sessionType; +@property (nonatomic) NSString* _Nonnull recvID; +@property (nonatomic) int32_t contentType; +@property (nonatomic) int32_t msgFrom; +@property (nonatomic) NSString* _Nonnull content; +// skipped field ChatLog.Remark with unsupported type: database/sql.NullString + +@property (nonatomic) int32_t senderPlatformID; +@property (nonatomic) int64_t sendTime; +@property (nonatomic) int64_t createTime; +@end + +@interface Open_im_sdkConversationListener : NSObject { +} +@property(strong, readonly) _Nonnull id _ref; + +- (nonnull instancetype)initWithRef:(_Nonnull id)ref; +- (nonnull instancetype)init; +@property (nonatomic) id _Nullable conversationListener; +// skipped field ConversationListener.MsgListenerList with unsupported type: []open_im_sdk/open_im_sdk.OnAdvancedMsgListener + +@end + +@interface Open_im_sdkConversationStruct : NSObject { +} +@property(strong, readonly) _Nonnull id _ref; + +- (nonnull instancetype)initWithRef:(_Nonnull id)ref; +- (nonnull instancetype)init; +@property (nonatomic) NSString* _Nonnull conversationID; +@property (nonatomic) long conversationType; +@property (nonatomic) NSString* _Nonnull userID; +@property (nonatomic) NSString* _Nonnull groupID; +@property (nonatomic) NSString* _Nonnull showName; +@property (nonatomic) NSString* _Nonnull faceURL; +@property (nonatomic) long recvMsgOpt; +@property (nonatomic) long unreadCount; +@property (nonatomic) NSString* _Nonnull latestMsg; +@property (nonatomic) int64_t latestMsgSendTime; +@property (nonatomic) NSString* _Nonnull draftText; +@property (nonatomic) int64_t draftTimestamp; +@property (nonatomic) long isPinned; +@end + +@interface Open_im_sdkFriend : NSObject { +} +@property(strong, readonly) _Nonnull id _ref; + +- (nonnull instancetype)initWithRef:(_Nonnull id)ref; +- (nonnull instancetype)init; +@end + +@interface Open_im_sdkGroupApplicationResponseReq : NSObject { +} +@property(strong, readonly) _Nonnull id _ref; + +- (nonnull instancetype)initWithRef:(_Nonnull id)ref; +- (nonnull instancetype)init; +@property (nonatomic) NSString* _Nonnull operationID; +@property (nonatomic) NSString* _Nonnull ownerID; +@property (nonatomic) NSString* _Nonnull groupID; +@property (nonatomic) NSString* _Nonnull fromUserID; +@property (nonatomic) NSString* _Nonnull fromUserNickName; +@property (nonatomic) NSString* _Nonnull fromUserFaceUrl; +@property (nonatomic) NSString* _Nonnull toUserID; +@property (nonatomic) NSString* _Nonnull toUserNickName; +@property (nonatomic) NSString* _Nonnull toUserFaceUrl; +@property (nonatomic) int64_t addTime; +@property (nonatomic) NSString* _Nonnull requestMsg; +@property (nonatomic) NSString* _Nonnull handledMsg; +@property (nonatomic) int32_t type; +@property (nonatomic) int32_t handleStatus; +@property (nonatomic) int32_t handleResult; +@end + +@interface Open_im_sdkGroupReqListInfo : NSObject { +} +@property(strong, readonly) _Nonnull id _ref; + +- (nonnull instancetype)initWithRef:(_Nonnull id)ref; +- (nonnull instancetype)init; +@property (nonatomic) NSString* _Nonnull id_; +@property (nonatomic) NSString* _Nonnull groupID; +@property (nonatomic) NSString* _Nonnull fromUserID; +@property (nonatomic) NSString* _Nonnull toUserID; +@property (nonatomic) int32_t flag; +@property (nonatomic) NSString* _Nonnull requestMsg; +@property (nonatomic) NSString* _Nonnull handledMsg; +@property (nonatomic) int64_t addTime; +@property (nonatomic) NSString* _Nonnull fromUserNickname; +@property (nonatomic) NSString* _Nonnull toUserNickname; +@property (nonatomic) NSString* _Nonnull fromUserFaceUrl; +@property (nonatomic) NSString* _Nonnull toUserFaceUrl; +@property (nonatomic) NSString* _Nonnull handledUser; +@property (nonatomic) int32_t type; +@property (nonatomic) int32_t handleStatus; +@property (nonatomic) int32_t handleResult; +@property (nonatomic) int32_t isRead; +@end + +@interface Open_im_sdkIMConfig : NSObject { +} +@property(strong, readonly) _Nonnull id _ref; + +- (nonnull instancetype)initWithRef:(_Nonnull id)ref; +- (nonnull instancetype)init; +@property (nonatomic) int32_t platform; +@property (nonatomic) NSString* _Nonnull ipApiAddr; +@property (nonatomic) NSString* _Nonnull ipWsAddr; +@property (nonatomic) NSString* _Nonnull dbDir; +@end + +@interface Open_im_sdkIMManager : NSObject { +} +@property(strong, readonly) _Nonnull id _ref; + +- (nonnull instancetype)initWithRef:(_Nonnull id)ref; +- (nonnull instancetype)init; +@property (nonatomic) long loginState; +@end + +@interface Open_im_sdkInviteUserToGroupReq : NSObject { +} +@property(strong, readonly) _Nonnull id _ref; + +- (nonnull instancetype)initWithRef:(_Nonnull id)ref; +- (nonnull instancetype)init; +@property (nonatomic) NSString* _Nonnull op; +@property (nonatomic) NSString* _Nonnull groupID; +@property (nonatomic) NSString* _Nonnull reason; +// skipped field InviteUserToGroupReq.UidList with unsupported type: []string + +@end + +@interface Open_im_sdkKickGroupMemberReq : NSObject { +} +@property(strong, readonly) _Nonnull id _ref; + +- (nonnull instancetype)initWithRef:(_Nonnull id)ref; +- (nonnull instancetype)init; +@property (nonatomic) NSString* _Nonnull op; +@property (nonatomic) NSString* _Nonnull groupID; +@property (nonatomic) NSString* _Nonnull reason; +// skipped field KickGroupMemberReq.UidList with unsupported type: []string + +@end + +@interface Open_im_sdkLogInfo : NSObject { +} +@property(strong, readonly) _Nonnull id _ref; + +- (nonnull instancetype)initWithRef:(_Nonnull id)ref; +- (nonnull instancetype)init; +@property (nonatomic) NSString* _Nonnull info; +@end + +@interface Open_im_sdkMessageReceipt : NSObject { +} +@property(strong, readonly) _Nonnull id _ref; + +- (nonnull instancetype)initWithRef:(_Nonnull id)ref; +- (nonnull instancetype)init; +@property (nonatomic) NSString* _Nonnull userID; +// skipped field MessageReceipt.MsgIdList with unsupported type: []string + +@property (nonatomic) int64_t readTime; +@property (nonatomic) int32_t msgFrom; +@property (nonatomic) int32_t contentType; +@property (nonatomic) int32_t sessionType; +@end + +@interface Open_im_sdkMsg : NSObject { +} +@property(strong, readonly) _Nonnull id _ref; + +- (nonnull instancetype)initWithRef:(_Nonnull id)ref; +- (nonnull instancetype)init; +@property (nonatomic) long reqIdentifier; +@property (nonatomic) long errCode; +@property (nonatomic) NSString* _Nonnull errMsg; +// skipped field Msg.Data with unsupported type: open_im_sdk/open_im_sdk.MsgData + +@end + +@interface Open_im_sdkMsgData : NSObject { +} +@property(strong, readonly) _Nonnull id _ref; + +- (nonnull instancetype)initWithRef:(_Nonnull id)ref; +- (nonnull instancetype)init; +@property (nonatomic) NSString* _Nonnull sendID; +@property (nonatomic) NSString* _Nonnull recvID; +@property (nonatomic) int32_t sessionType; +@property (nonatomic) int32_t msgFrom; +@property (nonatomic) int32_t contentType; +@property (nonatomic) NSString* _Nonnull serverMsgID; +@property (nonatomic) NSString* _Nonnull content; +@property (nonatomic) int64_t sendTime; +@property (nonatomic) int64_t seq; +@property (nonatomic) int32_t senderPlatformID; +@property (nonatomic) NSString* _Nonnull senderNickName; +@property (nonatomic) NSString* _Nonnull senderFaceURL; +@property (nonatomic) NSString* _Nonnull clientMsgID; +@end + +@interface Open_im_sdkMsgStruct : NSObject { +} +@property(strong, readonly) _Nonnull id _ref; + +- (nonnull instancetype)initWithRef:(_Nonnull id)ref; +- (nonnull instancetype)init; +@property (nonatomic) NSString* _Nonnull clientMsgID; +@property (nonatomic) NSString* _Nonnull serverMsgID; +@property (nonatomic) int64_t createTime; +@property (nonatomic) int64_t sendTime; +@property (nonatomic) int32_t sessionType; +@property (nonatomic) NSString* _Nonnull sendID; +@property (nonatomic) NSString* _Nonnull recvID; +@property (nonatomic) int32_t msgFrom; +@property (nonatomic) int32_t contentType; +@property (nonatomic) int32_t platformID; +// skipped field MsgStruct.ForceList with unsupported type: []string + +@property (nonatomic) NSString* _Nonnull senderNickName; +@property (nonatomic) NSString* _Nonnull senderFaceURL; +@property (nonatomic) NSString* _Nonnull groupID; +@property (nonatomic) NSString* _Nonnull content; +@property (nonatomic) int64_t seq; +@property (nonatomic) BOOL isRead; +@property (nonatomic) int32_t status; +@property (nonatomic) NSString* _Nonnull remark; +// skipped field MsgStruct.PictureElem with unsupported type: struct{SourcePath string "json:\"sourcePath\""; SourcePicture open_im_sdk/open_im_sdk.PictureBaseInfo "json:\"sourcePicture\""; BigPicture open_im_sdk/open_im_sdk.PictureBaseInfo "json:\"bigPicture\""; SnapshotPicture open_im_sdk/open_im_sdk.PictureBaseInfo "json:\"snapshotPicture\""} + +// skipped field MsgStruct.SoundElem with unsupported type: struct{UUID string "json:\"uuid\""; SoundPath string "json:\"soundPath\""; SourceURL string "json:\"sourceUrl\""; DataSize int64 "json:\"dataSize\""; Duration int64 "json:\"duration\""} + +// skipped field MsgStruct.VideoElem with unsupported type: struct{VideoPath string "json:\"videoPath\""; VideoUUID string "json:\"videoUUID\""; VideoURL string "json:\"videoUrl\""; VideoType string "json:\"videoType\""; VideoSize int64 "json:\"videoSize\""; Duration int64 "json:\"duration\""; SnapshotPath string "json:\"snapshotPath\""; SnapshotUUID string "json:\"snapshotUUID\""; SnapshotSize int64 "json:\"snapshotSize\""; SnapshotURL string "json:\"snapshotUrl\""; SnapshotWidth int32 "json:\"snapshotWidth\""; SnapshotHeight int32 "json:\"snapshotHeight\""} + +// skipped field MsgStruct.FileElem with unsupported type: struct{FilePath string "json:\"filePath\""; UUID string "json:\"uuid\""; SourceURL string "json:\"sourceUrl\""; FileName string "json:\"fileName\""; FileSize int64 "json:\"fileSize\""} + +// skipped field MsgStruct.MergeElem with unsupported type: struct{Title string "json:\"title\""; AbstractList []string "json:\"abstractList\""; MultiMessage []*open_im_sdk/open_im_sdk.MsgStruct "json:\"multiMessage\""} + +// skipped field MsgStruct.RevokeMessage with unsupported type: struct{ServerMsgID string "json:\"serverMsgID\""; SendID string "json:\"sendID\""; SenderNickname string "json:\"senderNickname\""; RecvID string "json:\"recvID\""; GroupID string "json:\"groupID\""; ContentType int32 "json:\"contentType\""; SendTime int64 "json:\"sendTime\""} + +@end + +@interface Open_im_sdkPictureBaseInfo : NSObject { +} +@property(strong, readonly) _Nonnull id _ref; + +- (nonnull instancetype)initWithRef:(_Nonnull id)ref; +- (nonnull instancetype)init; +@property (nonatomic) NSString* _Nonnull uuid; +@property (nonatomic) NSString* _Nonnull type; +@property (nonatomic) int64_t size; +@property (nonatomic) int32_t width; +@property (nonatomic) int32_t height; +@property (nonatomic) NSString* _Nonnull url; +@end + +/** + * //////////////////////// message///////////////////////// + */ +@interface Open_im_sdkPullMsgReq : NSObject { +} +@property(strong, readonly) _Nonnull id _ref; + +- (nonnull instancetype)initWithRef:(_Nonnull id)ref; +- (nonnull instancetype)init; +@property (nonatomic) NSString* _Nonnull userID; +@property (nonatomic) NSString* _Nonnull groupID; +@property (nonatomic) Open_im_sdkMsgStruct* _Nullable startMsg; +@property (nonatomic) long count; +@end + +@interface Open_im_sdkPullUserMsgResp : NSObject { +} +@property(strong, readonly) _Nonnull id _ref; + +- (nonnull instancetype)initWithRef:(_Nonnull id)ref; +- (nonnull instancetype)init; +@property (nonatomic) long errCode; +@property (nonatomic) NSString* _Nonnull errMsg; +@property (nonatomic) long reqIdentifier; +@property (nonatomic) long msgIncr; +// skipped field PullUserMsgResp.Data with unsupported type: open_im_sdk/open_im_sdk.paramsPullUserMsgDataResp + +@end + +@interface Open_im_sdkSendMsgRespFromServer : NSObject { +} +@property(strong, readonly) _Nonnull id _ref; + +- (nonnull instancetype)initWithRef:(_Nonnull id)ref; +- (nonnull instancetype)init; +@property (nonatomic) long errCode; +@property (nonatomic) NSString* _Nonnull errMsg; +@property (nonatomic) long reqIdentifier; +// skipped field SendMsgRespFromServer.Data with unsupported type: struct{ServerMsgID string "json:\"serverMsgID\""; ClientMsgID string "json:\"clientMsgID\""; SendTime int64 "json:\"sendTime\""} + +@end + +@interface Open_im_sdkSoundElem : NSObject { +} +@property(strong, readonly) _Nonnull id _ref; + +- (nonnull instancetype)initWithRef:(_Nonnull id)ref; +- (nonnull instancetype)init; +@property (nonatomic) NSString* _Nonnull uuid; +@property (nonatomic) NSString* _Nonnull soundPath; +@property (nonatomic) NSString* _Nonnull sourceURL; +@property (nonatomic) int64_t dataSize; +@property (nonatomic) int64_t duration; +@end + +@interface Open_im_sdkTransferGroupOwnerReq : NSObject { +} +@property(strong, readonly) _Nonnull id _ref; + +- (nonnull instancetype)initWithRef:(_Nonnull id)ref; +- (nonnull instancetype)init; +@property (nonatomic) NSString* _Nonnull groupID; +@property (nonatomic) NSString* _Nonnull oldOwner; +@property (nonatomic) NSString* _Nonnull newOwner; +@property (nonatomic) NSString* _Nonnull operationID; +@end + +@interface Open_im_sdkUid2Flag : NSObject { +} +@property(strong, readonly) _Nonnull id _ref; + +- (nonnull instancetype)initWithRef:(_Nonnull id)ref; +- (nonnull instancetype)init; +@property (nonatomic) NSString* _Nonnull uid; +@property (nonatomic) int32_t flag; +@end + +FOUNDATION_EXPORT const int64_t Open_im_sdkAcceptFriendApplicationTip; +FOUNDATION_EXPORT const int64_t Open_im_sdkAcceptGroupApplicationResultTip; +FOUNDATION_EXPORT const int64_t Open_im_sdkAcceptGroupApplicationTip; +FOUNDATION_EXPORT const int64_t Open_im_sdkAddConOrUpLatMsg; +FOUNDATION_EXPORT const int64_t Open_im_sdkAddFriendTip; +FOUNDATION_EXPORT const int64_t Open_im_sdkAtText; +FOUNDATION_EXPORT const int64_t Open_im_sdkC2CMessageAsRead; +FOUNDATION_EXPORT NSString* _Nonnull const Open_im_sdkCmdAcceptFriend; +FOUNDATION_EXPORT NSString* _Nonnull const Open_im_sdkCmdAddFriend; +FOUNDATION_EXPORT NSString* _Nonnull const Open_im_sdkCmdBlackList; +FOUNDATION_EXPORT NSString* _Nonnull const Open_im_sdkCmdDeleteConversation; +FOUNDATION_EXPORT NSString* _Nonnull const Open_im_sdkCmdForceSyncFriend; +FOUNDATION_EXPORT NSString* _Nonnull const Open_im_sdkCmdForceSyncFriendApplication; +FOUNDATION_EXPORT NSString* _Nonnull const Open_im_sdkCmdForceSyncLoginUerInfo; +FOUNDATION_EXPORT NSString* _Nonnull const Open_im_sdkCmdForceSyncMsg; +FOUNDATION_EXPORT NSString* _Nonnull const Open_im_sdkCmdFriend; +FOUNDATION_EXPORT NSString* _Nonnull const Open_im_sdkCmdFriendApplication; +FOUNDATION_EXPORT NSString* _Nonnull const Open_im_sdkCmdFroceSyncBlackList; +FOUNDATION_EXPORT NSString* _Nonnull const Open_im_sdkCmdGeyLoginUserInfo; +FOUNDATION_EXPORT NSString* _Nonnull const Open_im_sdkCmdNewMsgCome; +FOUNDATION_EXPORT NSString* _Nonnull const Open_im_sdkCmdReLogin; +FOUNDATION_EXPORT NSString* _Nonnull const Open_im_sdkCmdRefuseFriend; +FOUNDATION_EXPORT NSString* _Nonnull const Open_im_sdkCmdUnInit; +FOUNDATION_EXPORT NSString* _Nonnull const Open_im_sdkCmdUpdateConversation; +FOUNDATION_EXPORT const int64_t Open_im_sdkConAndUnreadChange; +FOUNDATION_EXPORT const int64_t Open_im_sdkConChange; +FOUNDATION_EXPORT const int64_t Open_im_sdkCreateGroupTip; +FOUNDATION_EXPORT NSString* _Nonnull const Open_im_sdkDeFaultSuccessMsg; +FOUNDATION_EXPORT const int64_t Open_im_sdkErrCodeConversation; +FOUNDATION_EXPORT const int64_t Open_im_sdkErrCodeFriend; +FOUNDATION_EXPORT const int64_t Open_im_sdkErrCodeGroup; +FOUNDATION_EXPORT const int64_t Open_im_sdkErrCodeInitLogin; +FOUNDATION_EXPORT const int64_t Open_im_sdkErrCodeUserInfo; +FOUNDATION_EXPORT const int64_t Open_im_sdkFile; +FOUNDATION_EXPORT NSString* _Nonnull const Open_im_sdkFriendAcceptTip; +FOUNDATION_EXPORT const int64_t Open_im_sdkGroupActionAcceptGroupApplication; +FOUNDATION_EXPORT const int64_t Open_im_sdkGroupActionApplyJoinGroup; +FOUNDATION_EXPORT const int64_t Open_im_sdkGroupActionCreateGroup; +FOUNDATION_EXPORT const int64_t Open_im_sdkGroupActionInviteUserToGroup; +FOUNDATION_EXPORT const int64_t Open_im_sdkGroupActionKickGroupMember; +FOUNDATION_EXPORT const int64_t Open_im_sdkGroupActionQuitGroup; +FOUNDATION_EXPORT const int64_t Open_im_sdkGroupActionRefuseGroupApplication; +FOUNDATION_EXPORT const int64_t Open_im_sdkGroupActionSetGroupInfo; +FOUNDATION_EXPORT const int64_t Open_im_sdkGroupActionTransferGroupOwner; +FOUNDATION_EXPORT const int64_t Open_im_sdkGroupApplicationResponseTip; +FOUNDATION_EXPORT const int64_t Open_im_sdkGroupChatType; +FOUNDATION_EXPORT const int64_t Open_im_sdkHasRead; +FOUNDATION_EXPORT const int64_t Open_im_sdkIncrUnread; +FOUNDATION_EXPORT const int64_t Open_im_sdkInviteUserToGroupTip; +FOUNDATION_EXPORT const int64_t Open_im_sdkJoinGroupTip; +FOUNDATION_EXPORT const int64_t Open_im_sdkKickGroupMemberTip; +FOUNDATION_EXPORT const int64_t Open_im_sdkKickOnlineTip; +FOUNDATION_EXPORT const int64_t Open_im_sdkLoginFailed; +FOUNDATION_EXPORT const int64_t Open_im_sdkLoginSuccess; +FOUNDATION_EXPORT const int64_t Open_im_sdkLogining; +FOUNDATION_EXPORT const int64_t Open_im_sdkLogoutCmd; +FOUNDATION_EXPORT const int64_t Open_im_sdkMerger; +FOUNDATION_EXPORT const int64_t Open_im_sdkMessageHasNotRead; +FOUNDATION_EXPORT const int64_t Open_im_sdkMessageHasRead; +FOUNDATION_EXPORT const int64_t Open_im_sdkMsgStatusHasDeleted; +FOUNDATION_EXPORT const int64_t Open_im_sdkMsgStatusSendFailed; +FOUNDATION_EXPORT const int64_t Open_im_sdkMsgStatusSendSuccess; +/** + * MsgStatus + */ +FOUNDATION_EXPORT const int64_t Open_im_sdkMsgStatusSending; +FOUNDATION_EXPORT const int64_t Open_im_sdkNotRead; +FOUNDATION_EXPORT const int64_t Open_im_sdkPicture; +FOUNDATION_EXPORT const int64_t Open_im_sdkQuitGroupTip; +FOUNDATION_EXPORT const int64_t Open_im_sdkRefuseFriendApplicationTip; +FOUNDATION_EXPORT const int64_t Open_im_sdkRefuseGroupApplicationResultTip; +FOUNDATION_EXPORT const int64_t Open_im_sdkRefuseGroupApplicationTip; +FOUNDATION_EXPORT const int64_t Open_im_sdkRevokeMessageTip; +FOUNDATION_EXPORT const int64_t Open_im_sdkSetGroupInfoTip; +FOUNDATION_EXPORT const int64_t Open_im_sdkSetSelfInfoTip; +/** + * /////////////////////////////////// +SessionType + */ +FOUNDATION_EXPORT const int64_t Open_im_sdkSingleChatType; +FOUNDATION_EXPORT const int64_t Open_im_sdkSound; +FOUNDATION_EXPORT const int64_t Open_im_sdkSyncSenderMsg; +FOUNDATION_EXPORT const int64_t Open_im_sdkSysMsgType; +/** + * ContentType + */ +FOUNDATION_EXPORT const int64_t Open_im_sdkText; +FOUNDATION_EXPORT const int64_t Open_im_sdkTimeOffset; +FOUNDATION_EXPORT const int64_t Open_im_sdkTotalUnreadMessageChanged; +FOUNDATION_EXPORT const int64_t Open_im_sdkTransferGroupOwnerTip; +FOUNDATION_EXPORT const int64_t Open_im_sdkUnreadCountSetZero; +FOUNDATION_EXPORT const int64_t Open_im_sdkUpdateFaceUrlAndNickName; +/** + * ////////////////////////////////////// +MsgFrom + */ +FOUNDATION_EXPORT const int64_t Open_im_sdkUserMsgType; +FOUNDATION_EXPORT const int64_t Open_im_sdkVideo; +FOUNDATION_EXPORT NSString* _Nonnull const Open_im_sdkZoomScale; + +@interface Open_im_sdk : NSObject +// skipped variable ConListener with unsupported type: open_im_sdk/open_im_sdk.ConversationListener + +// skipped variable ConversationCh with unsupported type: chan open_im_sdk/open_im_sdk.cmd2Value + +// skipped variable FriendObj with unsupported type: open_im_sdk/open_im_sdk.Friend + ++ (NSString* _Nonnull) loginUid; ++ (void) setLoginUid:(NSString* _Nonnull)v; + +// skipped variable SdkInitManager with unsupported type: open_im_sdk/open_im_sdk.IMManager + +// skipped variable SvrConf with unsupported type: open_im_sdk/open_im_sdk.IMConfig + +@end + +FOUNDATION_EXPORT void Open_im_sdkAcceptFriendApplication(id _Nullable callback, NSString* _Nullable uid); + +FOUNDATION_EXPORT void Open_im_sdkAcceptGroupApplication(NSString* _Nullable application, NSString* _Nullable reason, id _Nullable callback); + +FOUNDATION_EXPORT void Open_im_sdkAddAdvancedMsgListener(id _Nullable listener); + +FOUNDATION_EXPORT void Open_im_sdkAddFriend(id _Nullable callback, NSString* _Nullable paramsReq); + +FOUNDATION_EXPORT void Open_im_sdkAddToBlackList(id _Nullable callback, NSString* _Nullable blackUid); + +FOUNDATION_EXPORT void Open_im_sdkCheckFriend(id _Nullable callback, NSString* _Nullable uidList); + +FOUNDATION_EXPORT NSString* _Nonnull Open_im_sdkCreateFileMessage(NSString* _Nullable filePath, NSString* _Nullable fileName); + +FOUNDATION_EXPORT NSString* _Nonnull Open_im_sdkCreateForwardMessage(NSString* _Nullable m); + +FOUNDATION_EXPORT void Open_im_sdkCreateGroup(NSString* _Nullable gInfo, NSString* _Nullable memberList, id _Nullable callback); + +FOUNDATION_EXPORT NSString* _Nonnull Open_im_sdkCreateImageMessage(NSString* _Nullable imagePath); + +FOUNDATION_EXPORT NSString* _Nonnull Open_im_sdkCreateImageMessageFromFullPath(NSString* _Nullable imageFullPath); + +FOUNDATION_EXPORT NSString* _Nonnull Open_im_sdkCreateMergerMessage(NSString* _Nullable messageList, NSString* _Nullable title, NSString* _Nullable summaryList); + +FOUNDATION_EXPORT NSString* _Nonnull Open_im_sdkCreateSoundMessage(NSString* _Nullable soundPath, int64_t duration); + +FOUNDATION_EXPORT NSString* _Nonnull Open_im_sdkCreateTextAtMessage(NSString* _Nullable text, NSString* _Nullable atUserList); + +FOUNDATION_EXPORT NSString* _Nonnull Open_im_sdkCreateTextMessage(NSString* _Nullable text); + +FOUNDATION_EXPORT NSString* _Nonnull Open_im_sdkCreateTextSystemMessage(NSString* _Nullable text, int32_t textType); + +FOUNDATION_EXPORT NSString* _Nonnull Open_im_sdkCreateVideoMessage(NSString* _Nullable videoPath, NSString* _Nullable videoType, int64_t duration, NSString* _Nullable snapshotPath); + +FOUNDATION_EXPORT NSString* _Nonnull Open_im_sdkCreateVideoMessageFromFullPath(NSString* _Nullable videoFullPath, NSString* _Nullable videoType, int64_t duration, NSString* _Nullable snapshotFullPath); + +FOUNDATION_EXPORT void Open_im_sdkDeleteConversation(NSString* _Nullable conversationID, id _Nullable callback); + +FOUNDATION_EXPORT void Open_im_sdkDeleteFromBlackList(id _Nullable callback, NSString* _Nullable deleteUid); + +FOUNDATION_EXPORT void Open_im_sdkDeleteFromFriendList(NSString* _Nullable deleteUid, id _Nullable callback); + +FOUNDATION_EXPORT void Open_im_sdkDeleteMessageFromLocalStorage(id _Nullable callback, NSString* _Nullable message); + +FOUNDATION_EXPORT void Open_im_sdkDoCreateGroup(void); + +FOUNDATION_EXPORT void Open_im_sdkDoGetGroupsInfo(void); + +FOUNDATION_EXPORT void Open_im_sdkDoJoinGroup(void); + +FOUNDATION_EXPORT void Open_im_sdkDoQuitGroup(void); + +FOUNDATION_EXPORT void Open_im_sdkDoSetGroupInfo(void); + +FOUNDATION_EXPORT void Open_im_sdkDotestGetGroupMemberList(void); + +FOUNDATION_EXPORT void Open_im_sdkDotestGetGroupMembersInfo(void); + +FOUNDATION_EXPORT void Open_im_sdkDotestGetJoinedGroupList(void); + +FOUNDATION_EXPORT void Open_im_sdkDotestKickGroupMember(void); + +FOUNDATION_EXPORT void Open_im_sdkDotesttestInviteUserToGroup(void); + +FOUNDATION_EXPORT void Open_im_sdkFindMessages(id _Nullable callback, NSString* _Nullable messageIDList); + +FOUNDATION_EXPORT void Open_im_sdkForceSyncBlackList(void); + +FOUNDATION_EXPORT void Open_im_sdkForceSyncFriend(void); + +FOUNDATION_EXPORT void Open_im_sdkForceSyncFriendApplication(void); + +FOUNDATION_EXPORT void Open_im_sdkForceSyncLoginUerInfo(void); + +FOUNDATION_EXPORT void Open_im_sdkForceSyncMsg(void); + +FOUNDATION_EXPORT void Open_im_sdkFriendApplication(id _Nullable callback, NSString* _Nullable uid, long flag); + +FOUNDATION_EXPORT void Open_im_sdkGetAllConversationList(id _Nullable callback); + +FOUNDATION_EXPORT void Open_im_sdkGetBlackList(id _Nullable callback); + +FOUNDATION_EXPORT NSString* _Nonnull Open_im_sdkGetConversationIDBySessionType(NSString* _Nullable sourceID, long sessionType); + +FOUNDATION_EXPORT void Open_im_sdkGetFriendApplicationList(id _Nullable callback); + +FOUNDATION_EXPORT void Open_im_sdkGetFriendList(id _Nullable callback); + +FOUNDATION_EXPORT void Open_im_sdkGetFriendsInfo(id _Nullable callback, NSString* _Nullable uidList); + +FOUNDATION_EXPORT void Open_im_sdkGetGroupApplicationList(id _Nullable callback); + +FOUNDATION_EXPORT void Open_im_sdkGetGroupMemberList(NSString* _Nullable groupId, int32_t filter, int32_t next, id _Nullable callback); + +FOUNDATION_EXPORT void Open_im_sdkGetGroupMembersInfo(NSString* _Nullable groupId, NSString* _Nullable userList, id _Nullable callback); + +FOUNDATION_EXPORT void Open_im_sdkGetGroupsInfo(NSString* _Nullable groupIdList, id _Nullable callback); + +FOUNDATION_EXPORT void Open_im_sdkGetHistoryMessageList(id _Nullable callback, NSString* _Nullable getMessageOptions); + +FOUNDATION_EXPORT void Open_im_sdkGetJoinedGroupList(id _Nullable callback); + +FOUNDATION_EXPORT long Open_im_sdkGetLoginStatus(void); + +FOUNDATION_EXPORT NSString* _Nonnull Open_im_sdkGetLoginUser(void); + +FOUNDATION_EXPORT void Open_im_sdkGetMultipleConversation(NSString* _Nullable conversationIDList, id _Nullable callback); + +FOUNDATION_EXPORT void Open_im_sdkGetOneConversation(NSString* _Nullable sourceID, long sessionType, id _Nullable callback); + +FOUNDATION_EXPORT void Open_im_sdkGetTotalUnreadMsgCount(id _Nullable callback); + +FOUNDATION_EXPORT void Open_im_sdkGetUsersInfo(NSString* _Nullable uIDList, id _Nullable cb); + +FOUNDATION_EXPORT BOOL Open_im_sdkInitSDK(NSString* _Nullable config, id _Nullable cb); + +FOUNDATION_EXPORT NSString* _Nonnull Open_im_sdkInsertSingleMessageToLocalStorage(id _Nullable callback, NSString* _Nullable message, NSString* _Nullable userID, NSString* _Nullable sender); + +FOUNDATION_EXPORT void Open_im_sdkInviteUserToGroup(NSString* _Nullable groupId, NSString* _Nullable reason, NSString* _Nullable userList, id _Nullable callback); + +FOUNDATION_EXPORT void Open_im_sdkJoinGroup(NSString* _Nullable groupId, NSString* _Nullable message, id _Nullable callback); + +FOUNDATION_EXPORT void Open_im_sdkKickGroupMember(NSString* _Nullable groupId, NSString* _Nullable userList, NSString* _Nullable reason, id _Nullable callback); + +FOUNDATION_EXPORT void Open_im_sdkLogin(NSString* _Nullable uid, NSString* _Nullable tk, id _Nullable callback); + +FOUNDATION_EXPORT void Open_im_sdkLogout(id _Nullable callback); + +FOUNDATION_EXPORT void Open_im_sdkMarkC2CMessageAsRead(id _Nullable callback, NSString* _Nullable receiver, NSString* _Nullable msgList); + +FOUNDATION_EXPORT void Open_im_sdkMarkSingleMessageHasRead(id _Nullable callback, NSString* _Nullable userID); + +FOUNDATION_EXPORT NSString* _Nonnull Open_im_sdkMd5(NSString* _Nullable s); + +FOUNDATION_EXPORT void Open_im_sdkPinConversation(NSString* _Nullable conversationID, BOOL isPinned, id _Nullable callback); + +FOUNDATION_EXPORT void Open_im_sdkQuitGroup(NSString* _Nullable groupId, id _Nullable callback); + +FOUNDATION_EXPORT void Open_im_sdkRefuseFriendApplication(id _Nullable callback, NSString* _Nullable uid); + +FOUNDATION_EXPORT void Open_im_sdkRefuseGroupApplication(NSString* _Nullable application, NSString* _Nullable reason, id _Nullable callback); + +FOUNDATION_EXPORT void Open_im_sdkRemoveAdvancedMsgListener(id _Nullable listener); + +FOUNDATION_EXPORT BOOL Open_im_sdkResetConversation(NSString* _Nullable conversationID, NSError* _Nullable* _Nullable error); + +FOUNDATION_EXPORT void Open_im_sdkRevokeMessage(id _Nullable callback, NSString* _Nullable message); + +FOUNDATION_EXPORT NSString* _Nonnull Open_im_sdkSendMessage(id _Nullable callback, NSString* _Nullable message, NSString* _Nullable receiver, NSString* _Nullable groupID, BOOL onlineUserOnly); + +FOUNDATION_EXPORT void Open_im_sdkSetConversationDraft(NSString* _Nullable conversationID, NSString* _Nullable draftText, id _Nullable callback); + +FOUNDATION_EXPORT void Open_im_sdkSetConversationListener(id _Nullable listener); + +FOUNDATION_EXPORT void Open_im_sdkSetFriendInfo(NSString* _Nullable comment, id _Nullable callback); + +FOUNDATION_EXPORT BOOL Open_im_sdkSetFriendListener(id _Nullable listener); + +FOUNDATION_EXPORT void Open_im_sdkSetGroupInfo(NSString* _Nullable jsonGroupInfo, id _Nullable callback); + +FOUNDATION_EXPORT void Open_im_sdkSetGroupListener(id _Nullable callback); + +FOUNDATION_EXPORT void Open_im_sdkSetSelfInfo(NSString* _Nullable info, id _Nullable cb); + +FOUNDATION_EXPORT void Open_im_sdkTencentOssCredentials(id _Nullable cb); + +FOUNDATION_EXPORT void Open_im_sdkTransferGroupOwner(NSString* _Nullable groupId, NSString* _Nullable userId, id _Nullable callback); + +FOUNDATION_EXPORT void Open_im_sdkUnInitSDK(void); + +// skipped function UnixSecondToTime with unsupported parameter or return types + + +@class Open_im_sdkBase; + +@class Open_im_sdkIMSDKListener; + +@class Open_im_sdkOnAdvancedMsgListener; + +@class Open_im_sdkOnConversationListener; + +@class Open_im_sdkOnFriendshipListener; + +@class Open_im_sdkOnGroupListener; + +@class Open_im_sdkSendMsgCallBack; + +@interface Open_im_sdkBase : NSObject { +} +@property(strong, readonly) _Nonnull id _ref; + +- (nonnull instancetype)initWithRef:(_Nonnull id)ref; +- (void)onError:(long)errCode errMsg:(NSString* _Nullable)errMsg; +- (void)onSuccess:(NSString* _Nullable)data; +@end + +@interface Open_im_sdkIMSDKListener : NSObject { +} +@property(strong, readonly) _Nonnull id _ref; + +- (nonnull instancetype)initWithRef:(_Nonnull id)ref; +- (void)onConnectFailed:(long)ErrCode ErrMsg:(NSString* _Nullable)ErrMsg; +- (void)onConnectSuccess; +- (void)onConnecting; +- (void)onKickedOffline; +- (void)onSelfInfoUpdated:(NSString* _Nullable)userInfo; +- (void)onUserTokenExpired; +@end + +@interface Open_im_sdkOnAdvancedMsgListener : NSObject { +} +@property(strong, readonly) _Nonnull id _ref; + +- (nonnull instancetype)initWithRef:(_Nonnull id)ref; +- (void)onRecvC2CReadReceipt:(NSString* _Nullable)msgReceiptList; +- (void)onRecvMessageRevoked:(NSString* _Nullable)msgId; +- (void)onRecvNewMessage:(NSString* _Nullable)message; +@end + +@interface Open_im_sdkOnConversationListener : NSObject { +} +@property(strong, readonly) _Nonnull id _ref; + +- (nonnull instancetype)initWithRef:(_Nonnull id)ref; +- (void)onConversationChanged:(NSString* _Nullable)conversationList; +- (void)onNewConversation:(NSString* _Nullable)conversationList; +- (void)onSyncServerFailed; +- (void)onSyncServerFinish; +- (void)onSyncServerStart; +- (void)onTotalUnreadMessageCountChanged:(int32_t)totalUnreadCount; +@end + +@interface Open_im_sdkOnFriendshipListener : NSObject { +} +@property(strong, readonly) _Nonnull id _ref; + +- (nonnull instancetype)initWithRef:(_Nonnull id)ref; +- (void)onBlackListAdd:(NSString* _Nullable)userInfo; +- (void)onBlackListDeleted:(NSString* _Nullable)userInfo; +- (void)onFriendApplicationListAccept:(NSString* _Nullable)applyUserInfo; +- (void)onFriendApplicationListAdded:(NSString* _Nullable)applyUserInfo; +- (void)onFriendApplicationListDeleted:(NSString* _Nullable)applyUserInfo; +- (void)onFriendApplicationListReject:(NSString* _Nullable)applyUserInfo; +- (void)onFriendInfoChanged:(NSString* _Nullable)friendInfo; +- (void)onFriendListAdded:(NSString* _Nullable)friendInfo; +- (void)onFriendListDeleted:(NSString* _Nullable)friendInfo; +@end + +@interface Open_im_sdkOnGroupListener : NSObject { +} +@property(strong, readonly) _Nonnull id _ref; + +- (nonnull instancetype)initWithRef:(_Nonnull id)ref; +- (void)onApplicationProcessed:(NSString* _Nullable)groupId opUser:(NSString* _Nullable)opUser AgreeOrReject:(int32_t)AgreeOrReject opReason:(NSString* _Nullable)opReason; +- (void)onGroupCreated:(NSString* _Nullable)groupId; +- (void)onGroupInfoChanged:(NSString* _Nullable)groupId groupInfo:(NSString* _Nullable)groupInfo; +/** + * list->group + */ +- (void)onMemberEnter:(NSString* _Nullable)groupId memberList:(NSString* _Nullable)memberList; +/** + * list->opUser->groupId + */ +- (void)onMemberInvited:(NSString* _Nullable)groupId opUser:(NSString* _Nullable)opUser memberList:(NSString* _Nullable)memberList; +- (void)onMemberKicked:(NSString* _Nullable)groupId opUser:(NSString* _Nullable)opUser memberList:(NSString* _Nullable)memberList; +/** + * group->one + */ +- (void)onMemberLeave:(NSString* _Nullable)groupId member:(NSString* _Nullable)member; +- (void)onReceiveJoinApplication:(NSString* _Nullable)groupId member:(NSString* _Nullable)member opReason:(NSString* _Nullable)opReason; +@end + +@interface Open_im_sdkSendMsgCallBack : NSObject { +} +@property(strong, readonly) _Nonnull id _ref; + +- (nonnull instancetype)initWithRef:(_Nonnull id)ref; +- (void)onError:(long)errCode errMsg:(NSString* _Nullable)errMsg; +- (void)onProgress:(long)progress; +- (void)onSuccess:(NSString* _Nullable)data; +@end + +#endif diff --git a/ios/Framework/OpenIMCore.framework/Headers/Universe.objc.h b/ios/Framework/OpenIMCore.framework/Headers/Universe.objc.h new file mode 100644 index 0000000..019e750 --- /dev/null +++ b/ios/Framework/OpenIMCore.framework/Headers/Universe.objc.h @@ -0,0 +1,29 @@ +// Objective-C API for talking to Go package. +// gobind -lang=objc +// +// File is generated by gobind. Do not edit. + +#ifndef __Universe_H__ +#define __Universe_H__ + +@import Foundation; +#include "ref.h" + +@protocol Universeerror; +@class Universeerror; + +@protocol Universeerror +- (NSString* _Nonnull)error; +@end + +@class Universeerror; + +@interface Universeerror : NSError { +} +@property(strong, readonly) _Nonnull id _ref; + +- (nonnull instancetype)initWithRef:(_Nonnull id)ref; +- (NSString* _Nonnull)error; +@end + +#endif diff --git a/ios/Framework/OpenIMCore.framework/Headers/ref.h b/ios/Framework/OpenIMCore.framework/Headers/ref.h new file mode 100644 index 0000000..b8036a4 --- /dev/null +++ b/ios/Framework/OpenIMCore.framework/Headers/ref.h @@ -0,0 +1,35 @@ +// Copyright 2015 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +#ifndef __GO_REF_HDR__ +#define __GO_REF_HDR__ + +#include + +// GoSeqRef is an object tagged with an integer for passing back and +// forth across the language boundary. A GoSeqRef may represent either +// an instance of a Go object, or an Objective-C object passed to Go. +// The explicit allocation of a GoSeqRef is used to pin a Go object +// when it is passed to Objective-C. The Go seq package maintains a +// reference to the Go object in a map keyed by the refnum along with +// a reference count. When the reference count reaches zero, the Go +// seq package will clear the corresponding entry in the map. +@interface GoSeqRef : NSObject { +} +@property(readonly) int32_t refnum; +@property(strong) id obj; // NULL when representing a Go object. + +// new GoSeqRef object to proxy a Go object. The refnum must be +// provided from Go side. +- (instancetype)initWithRefnum:(int32_t)refnum obj:(id)obj; + +- (int32_t)incNum; + +@end + +@protocol goSeqRefInterface +-(GoSeqRef*) _ref; +@end + +#endif diff --git a/ios/Framework/OpenIMCore.framework/Modules/module.modulemap b/ios/Framework/OpenIMCore.framework/Modules/module.modulemap new file mode 100644 index 0000000..af98221 --- /dev/null +++ b/ios/Framework/OpenIMCore.framework/Modules/module.modulemap @@ -0,0 +1,8 @@ +framework module "OpenIMCore" { + header "ref.h" + header "Open_im_sdk.objc.h" + header "Universe.objc.h" + header "OpenIMCore.h" + + export * +} \ No newline at end of file diff --git a/ios/Framework/OpenIMCore.framework/OpenIMCore b/ios/Framework/OpenIMCore.framework/OpenIMCore new file mode 100644 index 0000000000000000000000000000000000000000..58ede0b792f73dcb2e5142d82fca6615aac26663 GIT binary patch literal 30052400 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
  • ?lG_B*rnYu`dm{*X!5j*SG{vj%@Ox$hG)Cnrd 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