diff --git a/CHANGELOG.md b/CHANGELOG.md
index b671471..3d92398 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,3 +1,7 @@
+## 3.5.0-rc.1
+
+- [Bug fixes and performance enhancements.](https://github.com/openimsdk/openim-sdk-core/releases/tag/v3.5.0-rc.1)
+
 ## 3.4.0+1
 
 - Adjust some fields and APIs.
diff --git a/android/build.gradle b/android/build.gradle
index 58d9765..8945760 100644
--- a/android/build.gradle
+++ b/android/build.gradle
@@ -52,5 +52,5 @@ android {
 dependencies {
     // 本地依赖,现将aar复制到libs/io/openim/core-sdk/0.0.1/ 下,命名core-sdk-0.0.1.aar
 //    implementation 'io.openim:core-sdk:0.0.1@aar'
-    implementation 'io.openim:core-sdk:3.4.0@aar'
+    implementation 'io.openim:core-sdk:3.5.0-rc1@aar'
 }
\ No newline at end of file
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 631746a..df4797f 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
@@ -196,4 +196,21 @@ public class ConversationManager extends BaseManager {
                 value(methodCall, "operationID")
         );
     }
+
+    public  void searchConversation(MethodCall methodCall, MethodChannel.Result result) {
+        Open_im_sdk.searchConversation(
+                new OnBaseListener(result, methodCall),
+                value(methodCall, "operationID"),
+                value(methodCall, "name")
+        );
+    }
+
+    public void setConversationEx(MethodCall methodCall, MethodChannel.Result result) {
+        Open_im_sdk.setConversationEx(
+                new OnBaseListener(result, methodCall),
+                value(methodCall, "operationID"),
+                value(methodCall, "conversationID"),
+                value(methodCall, "ex")
+        );
+    }
 }
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 5f28deb..01d0ffb 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
@@ -64,7 +64,8 @@ public class FriendshipManager extends BaseManager {
         Open_im_sdk.addBlack(
                 new OnBaseListener(result, methodCall),
                 value(methodCall, "operationID"),
-                value(methodCall, "userID")
+                value(methodCall, "userID"),
+                value(methodCall, "ex")
         );
     }
 
@@ -122,4 +123,13 @@ public class FriendshipManager extends BaseManager {
                 jsonValue(methodCall, "searchParam")
         );
     }
+
+    public void setFriendsEx(MethodCall methodCall, MethodChannel.Result result) {
+        Open_im_sdk.setFriendsEx(
+                new OnBaseListener(result, methodCall),
+                value(methodCall, "operationID"),
+                jsonValue(methodCall, "friendIDs"),
+                value(methodCall, "ex")
+        );
+    }
 }
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
index 3e6f609..5af02ef 100644
--- 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
@@ -92,7 +92,8 @@ public class GroupManager extends BaseManager {
                 value(methodCall, "operationID"),
                 value(methodCall, "groupID"),
                 value(methodCall, "reason"),
-                value(methodCall, "joinSource")
+                value(methodCall, "joinSource"),
+                value(methodCall, "ex")
         );
     }
 
diff --git a/android/src/main/java/io/openim/flutter_openim_sdk/manager/UserManager.java b/android/src/main/java/io/openim/flutter_openim_sdk/manager/UserManager.java
index 4775dc4..7f34df8 100644
--- a/android/src/main/java/io/openim/flutter_openim_sdk/manager/UserManager.java
+++ b/android/src/main/java/io/openim/flutter_openim_sdk/manager/UserManager.java
@@ -69,4 +69,11 @@ public class UserManager extends BaseManager {
                 jsonValue(methodCall, "userIDs"),
                 value(methodCall, "groupID"));
     }
+
+    public void setSelfInfoEx(MethodCall methodCall, MethodChannel.Result result) {
+        Open_im_sdk.setSelfInfoEx(
+                new OnBaseListener(result, methodCall),
+                value(methodCall, "operationID"),
+                jsonValue(methodCall));
+    }
 }
diff --git a/example/android/build.gradle b/example/android/build.gradle
index d2e9080..9131719 100644
--- a/example/android/build.gradle
+++ b/example/android/build.gradle
@@ -30,6 +30,6 @@ subprojects {
     project.evaluationDependsOn(':app')
 }
 
-task clean(type: Delete) {
+tasks.register("clean", Delete) {
     delete rootProject.buildDir
 }
diff --git a/example/ios/Podfile.lock b/example/ios/Podfile.lock
new file mode 100644
index 0000000..6a68a1e
--- /dev/null
+++ b/example/ios/Podfile.lock
@@ -0,0 +1,29 @@
+PODS:
+  - Flutter (1.0.0)
+  - flutter_openim_sdk (0.0.1):
+    - Flutter
+    - OpenIMSDKCore (= 3.4.0)
+  - OpenIMSDKCore (3.4.0)
+
+DEPENDENCIES:
+  - Flutter (from `Flutter`)
+  - flutter_openim_sdk (from `.symlinks/plugins/flutter_openim_sdk/ios`)
+
+SPEC REPOS:
+  trunk:
+    - OpenIMSDKCore
+
+EXTERNAL SOURCES:
+  Flutter:
+    :path: Flutter
+  flutter_openim_sdk:
+    :path: ".symlinks/plugins/flutter_openim_sdk/ios"
+
+SPEC CHECKSUMS:
+  Flutter: f04841e97a9d0b0a8025694d0796dd46242b2854
+  flutter_openim_sdk: 54d1c836ff60ebb5b99d246521ef0cb1d834fb13
+  OpenIMSDKCore: 47e0e830afe0d2dd905ad3dda255e6a6d26a555c
+
+PODFILE CHECKSUM: 7368163408c647b7eb699d0d788ba6718e18fb8d
+
+COCOAPODS: 1.13.0
diff --git a/example/pubspec.lock b/example/pubspec.lock
index d233bc1..1dcb969 100644
--- a/example/pubspec.lock
+++ b/example/pubspec.lock
@@ -5,10 +5,10 @@ packages:
     dependency: transitive
     description:
       name: async
-      sha256: bfe67ef28df125b7dddcea62755991f807aa39a2492a23e1550161692950bbe0
+      sha256: "947bfcf187f74dbc5e146c9eb9c0f10c9f8b30743e341481c1e2ed3ecc18c20c"
       url: "https://pub.flutter-io.cn"
     source: hosted
-    version: "2.10.0"
+    version: "2.11.0"
   boolean_selector:
     dependency: transitive
     description:
@@ -21,10 +21,10 @@ packages:
     dependency: transitive
     description:
       name: characters
-      sha256: e6a326c8af69605aec75ed6c187d06b349707a27fbff8222ca9cc2cff167975c
+      sha256: "04a925763edad70e8443c99234dc3328f442e811f1d8fd1a72f1c8ad0f69a605"
       url: "https://pub.flutter-io.cn"
     source: hosted
-    version: "1.2.1"
+    version: "1.3.0"
   clock:
     dependency: transitive
     description:
@@ -37,10 +37,10 @@ packages:
     dependency: transitive
     description:
       name: collection
-      sha256: cfc915e6923fe5ce6e153b0723c753045de46de1b4d63771530504004a45fae0
+      sha256: ee67cb0715911d28db6bf4af1026078bd6f0128b07a5f66fb2ed94ec6783c09a
       url: "https://pub.flutter-io.cn"
     source: hosted
-    version: "1.17.0"
+    version: "1.18.0"
   cupertino_icons:
     dependency: "direct main"
     description:
@@ -68,52 +68,44 @@ packages:
       path: ".."
       relative: true
     source: path
-    version: "3.4.0"
+    version: "3.5.0-rc.1"
   flutter_test:
     dependency: "direct dev"
     description: flutter
     source: sdk
     version: "0.0.0"
-  js:
-    dependency: transitive
-    description:
-      name: js
-      sha256: "5528c2f391ededb7775ec1daa69e65a2d61276f7552de2b5f7b8d34ee9fd4ab7"
-      url: "https://pub.flutter-io.cn"
-    source: hosted
-    version: "0.6.5"
   matcher:
     dependency: transitive
     description:
       name: matcher
-      sha256: "16db949ceee371e9b99d22f88fa3a73c4e59fd0afed0bd25fc336eb76c198b72"
+      sha256: "1803e76e6653768d64ed8ff2e1e67bea3ad4b923eb5c56a295c3e634bad5960e"
       url: "https://pub.flutter-io.cn"
     source: hosted
-    version: "0.12.13"
+    version: "0.12.16"
   material_color_utilities:
     dependency: transitive
     description:
       name: material_color_utilities
-      sha256: d92141dc6fe1dad30722f9aa826c7fbc896d021d792f80678280601aff8cf724
+      sha256: "9528f2f296073ff54cb9fee677df673ace1218163c3bc7628093e7eed5203d41"
       url: "https://pub.flutter-io.cn"
     source: hosted
-    version: "0.2.0"
+    version: "0.5.0"
   meta:
     dependency: transitive
     description:
       name: meta
-      sha256: "6c268b42ed578a53088d834796959e4a1814b5e9e164f147f580a386e5decf42"
+      sha256: a6e590c838b18133bb482a2745ad77c5bb7715fb0451209e1a7567d416678b8e
       url: "https://pub.flutter-io.cn"
     source: hosted
-    version: "1.8.0"
+    version: "1.10.0"
   path:
     dependency: transitive
     description:
       name: path
-      sha256: db9d4f58c908a4ba5953fcee2ae317c94889433e5024c27ce74a37f94267945b
+      sha256: "8829d8a55c13fc0e37127c29fedf290c102f4e40ae94ada574091fe0ff96c917"
       url: "https://pub.flutter-io.cn"
     source: hosted
-    version: "1.8.2"
+    version: "1.8.3"
   sky_engine:
     dependency: transitive
     description: flutter
@@ -123,26 +115,26 @@ packages:
     dependency: transitive
     description:
       name: source_span
-      sha256: dd904f795d4b4f3b870833847c461801f6750a9fa8e61ea5ac53f9422b31f250
+      sha256: "53e943d4206a5e30df338fd4c6e7a077e02254531b138a15aec3bd143c1a8b3c"
       url: "https://pub.flutter-io.cn"
     source: hosted
-    version: "1.9.1"
+    version: "1.10.0"
   stack_trace:
     dependency: transitive
     description:
       name: stack_trace
-      sha256: c3c7d8edb15bee7f0f74debd4b9c5f3c2ea86766fe4178eb2a18eb30a0bdaed5
+      sha256: "73713990125a6d93122541237550ee3352a2d84baad52d375a4cad2eb9b7ce0b"
       url: "https://pub.flutter-io.cn"
     source: hosted
-    version: "1.11.0"
+    version: "1.11.1"
   stream_channel:
     dependency: transitive
     description:
       name: stream_channel
-      sha256: "83615bee9045c1d322bbbd1ba209b7a749c2cbcdcb3fdd1df8eb488b3279c1c8"
+      sha256: ba2aa5d8cc609d96bbb2899c28934f9e1af5cddbd60a827822ea467161eb54e7
       url: "https://pub.flutter-io.cn"
     source: hosted
-    version: "2.1.1"
+    version: "2.1.2"
   string_scanner:
     dependency: transitive
     description:
@@ -163,10 +155,10 @@ packages:
     dependency: transitive
     description:
       name: test_api
-      sha256: ad540f65f92caa91bf21dfc8ffb8c589d6e4dc0c2267818b4cc2792857706206
+      sha256: "5c2f730018264d276c20e4f1503fd1308dfbbae39ec8ee63c5236311ac06954b"
       url: "https://pub.flutter-io.cn"
     source: hosted
-    version: "0.4.16"
+    version: "0.6.1"
   vector_math:
     dependency: transitive
     description:
@@ -175,6 +167,14 @@ packages:
       url: "https://pub.flutter-io.cn"
     source: hosted
     version: "2.1.4"
+  web:
+    dependency: transitive
+    description:
+      name: web
+      sha256: afe077240a270dcfd2aafe77602b4113645af95d0ad31128cc02bce5ac5d5152
+      url: "https://pub.flutter-io.cn"
+    source: hosted
+    version: "0.3.0"
 sdks:
-  dart: ">=2.18.0 <3.0.0"
+  dart: ">=3.2.0-194.0.dev <4.0.0"
   flutter: ">=1.20.0"
diff --git a/ios/.gitignore b/ios/.gitignore
deleted file mode 100644
index 0c88507..0000000
--- a/ios/.gitignore
+++ /dev/null
@@ -1,38 +0,0 @@
-.idea/
-.vagrant/
-.sconsign.dblite
-.svn/
-
-.DS_Store
-*.swp
-profile
-
-DerivedData/
-build/
-GeneratedPluginRegistrant.h
-GeneratedPluginRegistrant.m
-
-.generated/
-
-*.pbxuser
-*.mode1v3
-*.mode2v3
-*.perspectivev3
-
-!default.pbxuser
-!default.mode1v3
-!default.mode2v3
-!default.perspectivev3
-
-xcuserdata
-
-*.moved-aside
-
-*.pyc
-*sync/
-Icon?
-.tags*
-
-/Flutter/Generated.xcconfig
-/Flutter/ephemeral/
-/Flutter/flutter_export_environment.sh
\ No newline at end of file
diff --git a/ios/Assets/.gitkeep b/ios/Assets/.gitkeep
deleted file mode 100644
index e69de29..0000000
diff --git a/ios/Classes/Module/ConversationManager.swift b/ios/Classes/Module/ConversationManager.swift
index 37f9512..59390be 100644
--- a/ios/Classes/Module/ConversationManager.swift
+++ b/ios/Classes/Module/ConversationManager.swift
@@ -27,6 +27,8 @@ public class ConversationManager: BaseServiceManager {
         self["setGlobalRecvMessageOpt"] = setGlobalRecvMessageOpt
         self["setConversationBurnDuration"] = setConversationBurnDuration
         self["hideAllConversations"] = hideAllConversations
+        self["searchConversation"] = searchConversation
+        self["setConversationEx"] = setConversationEx
     }
     
     func setConversationListener(methodCall: FlutterMethodCall, result: @escaping FlutterResult){
@@ -117,6 +119,14 @@ public class ConversationManager: BaseServiceManager {
     func hideAllConversations(methodCall: FlutterMethodCall, result: @escaping FlutterResult){
             Open_im_sdkHideAllConversations(BaseCallback(result: result), methodCall[string: "operationID"])
     }
+
+    func searchConversation(methodCall: FlutterMethodCall, result: @escaping FlutterResult){
+        Open_im_sdkSearchConversation(BaseCallback(result: result), methodCall[string: "operationID"], methodCall[string: "name"])
+    }
+
+    func setConversationEx(methodCall: FlutterMethodCall, result: @escaping FlutterResult){
+        Open_im_sdkSetConversationEx(BaseCallback(result: result), methodCall[string: "operationID"], methodCall[string: "conversationID"], methodCall[jsonString: "ex"])
+    }
 }
 
 
diff --git a/ios/Classes/Module/FriendshipManager.swift b/ios/Classes/Module/FriendshipManager.swift
index 88b6a4b..13b43b4 100644
--- a/ios/Classes/Module/FriendshipManager.swift
+++ b/ios/Classes/Module/FriendshipManager.swift
@@ -20,6 +20,7 @@ public class FriendshipManager: BaseServiceManager {
         self["acceptFriendApplication"] = acceptFriendApplication
         self["refuseFriendApplication"] = refuseFriendApplication
         self["searchFriends"] = searchFriends
+        self["setFriendsEx"] = setFriendsEx
     }
     
     func setFriendListener(methodCall: FlutterMethodCall, result: @escaping FlutterResult){
@@ -52,7 +53,7 @@ public class FriendshipManager: BaseServiceManager {
     }
     
     func addBlacklist(methodCall: FlutterMethodCall, result: @escaping FlutterResult){
-        Open_im_sdkAddBlack(BaseCallback(result: result), methodCall[string: "operationID"], methodCall[string: "userID"])
+        Open_im_sdkAddBlack(BaseCallback(result: result), methodCall[string: "operationID"], methodCall[string: "userID"], methodCall[string: "ex"])
     }
     
     func getBlacklist(methodCall: FlutterMethodCall, result: @escaping FlutterResult){
@@ -82,6 +83,10 @@ public class FriendshipManager: BaseServiceManager {
     func searchFriends(methodCall: FlutterMethodCall, result: @escaping FlutterResult){
         Open_im_sdkSearchFriends(BaseCallback(result: result), methodCall[string: "operationID"], methodCall[jsonString: "searchParam"])
     }
+
+    func setFriendsEx(methodCall: FlutterMethodCall, result: @escaping FlutterResult){
+        Open_im_sdkSetFriendsEx(BaseCallback(result: result), methodCall[string: "operationID"], methodCall[jsonString: "friendIDs"], methodCall[string: "ex"])
+    }
 }
 
 public class FriendshipListener: NSObject, Open_im_sdk_callbackOnFriendshipListenerProtocol {
diff --git a/ios/Classes/Module/GroupManager.swift b/ios/Classes/Module/GroupManager.swift
index 276b10d..a1a903b 100644
--- a/ios/Classes/Module/GroupManager.swift
+++ b/ios/Classes/Module/GroupManager.swift
@@ -78,7 +78,8 @@ public class GroupManager: BaseServiceManager {
     }
     
     func joinGroup(methodCall: FlutterMethodCall, result: @escaping FlutterResult){
-        Open_im_sdkJoinGroup(BaseCallback(result: result), methodCall[string: "operationID"], methodCall[string: "groupID"], methodCall[string: "reason"], methodCall[int32: "joinSource"])
+        Open_im_sdkJoinGroup(BaseCallback(result: result), methodCall[string: "operationID"], methodCall[string: "groupID"], methodCall[string:
+        "reason"], methodCall[int32: "joinSource"], methodCall[jsonString: "ex"])
     }
     
     func quitGroup(methodCall: FlutterMethodCall, result: @escaping FlutterResult){
diff --git a/ios/Classes/Module/UserManager.swift b/ios/Classes/Module/UserManager.swift
index 194f6ac..e64b616 100644
--- a/ios/Classes/Module/UserManager.swift
+++ b/ios/Classes/Module/UserManager.swift
@@ -14,6 +14,7 @@ public class UserManager: BaseServiceManager {
         self["getSubscribeUsersStatus"] = getSubscribeUsersStatus
         self["getUserStatus"] = getUserStatus
         self["getUsersInfoWithCache"] = getUsersInfoWithCache
+        self["setSelfInfoEx"] = setSelfInfoEx
     }
 
     func setUserListener(methodCall: FlutterMethodCall, result: @escaping FlutterResult){
@@ -53,6 +54,10 @@ public class UserManager: BaseServiceManager {
         Open_im_sdkGetUsersInfoWithCache(BaseCallback(result: result), methodCall[string: "operationID"], methodCall[jsonString: "userIDs"],
         methodCall[string: "groupID"])
     }
+
+    func setSelfInfoEx(methodCall: FlutterMethodCall, result: @escaping FlutterResult){
+        Open_im_sdkSetSelfInfoEx(BaseCallback(result: result), methodCall[string: "operationID"], methodCall.toJsonString())
+    }
 }
 
 public class UserListener: NSObject, Open_im_sdk_callbackOnUserListenerProtocol {
diff --git a/ios/flutter_openim_sdk.podspec b/ios/flutter_openim_sdk.podspec
index dcd25fa..cc7e03e 100644
--- a/ios/flutter_openim_sdk.podspec
+++ b/ios/flutter_openim_sdk.podspec
@@ -17,7 +17,7 @@ A new Flutter project.
   s.dependency 'Flutter'
   s.platform = :ios, '11.0'
 
-  s.dependency 'OpenIMSDKCore','3.4.0'
+  s.dependency 'OpenIMSDKCore','3.5.0-rc1'
   s.static_framework = true
   # s.vendored_frameworks = 'Framework/*.framework'
   # Flutter.framework does not contain a i386 slice.
diff --git a/lib/.DS_Store b/lib/.DS_Store
index 84ae108..7954306 100644
Binary files a/lib/.DS_Store and b/lib/.DS_Store differ
diff --git a/lib/src/manager/im_conversation_manager.dart b/lib/src/manager/im_conversation_manager.dart
index de3cd6a..8fb23d4 100644
--- a/lib/src/manager/im_conversation_manager.dart
+++ b/lib/src/manager/im_conversation_manager.dart
@@ -341,6 +341,37 @@ class ConversationManager {
             "operationID": Utils.checkOperationID(operationID),
           }));
 
+  /// search Conversations
+  Future<List<ConversationInfo>> searchConversations(
+    String name, {
+    String? operationID,
+  }) {
+    return _channel
+        .invokeMethod(
+            'searchConversations',
+            _buildParam({
+              'name': name,
+              "operationID": Utils.checkOperationID(operationID),
+            }))
+        .then((value) => Utils.toList(value, (map) => ConversationInfo.fromJson(map)));
+  }
+
+  Future<List<ConversationInfo>> setConversationEx(
+    String conversationID, {
+    String? ex,
+    String? operationID,
+  }) {
+    return _channel
+        .invokeMethod(
+            'setConversationEx',
+            _buildParam({
+              'conversationID': conversationID,
+              'ex': ex,
+              "operationID": Utils.checkOperationID(operationID),
+            }))
+        .then((value) => Utils.toList(value, (map) => ConversationInfo.fromJson(map)));
+  }
+
   /// Custom Sort for Conversation List
   List<ConversationInfo> simpleSort(List<ConversationInfo> list) => list
     ..sort((a, b) {
diff --git a/lib/src/manager/im_friendship_manager.dart b/lib/src/manager/im_friendship_manager.dart
index 722490e..25bf902 100644
--- a/lib/src/manager/im_friendship_manager.dart
+++ b/lib/src/manager/im_friendship_manager.dart
@@ -100,12 +100,14 @@ class FriendshipManager {
   /// [userID] Friend's ID to be added to the blacklist
   Future<dynamic> addBlacklist({
     required String userID,
+    String? ex,
     String? operationID,
   }) =>
       _channel.invokeMethod(
           'addBlacklist',
           _buildParam({
             "userID": userID,
+            "ex": ex,
             "operationID": Utils.checkOperationID(operationID),
           }));
 
@@ -217,6 +219,20 @@ class FriendshipManager {
               }))
           .then((value) => Utils.toList(value, (map) => SearchFriendsInfo.fromJson(map)));
 
+  Future<String?> setFriendsEx(
+    List<String> friendIDs, {
+    String? ex,
+    String? operationID,
+  }) {
+    return _channel.invokeMethod(
+        'setFriendsEx',
+        _buildParam({
+          "friendIDs": friendIDs,
+          "ex": ex,
+          "operationID": Utils.checkOperationID(operationID),
+        }));
+  }
+
   static Map _buildParam(Map param) {
     param["ManagerName"] = "friendshipManager";
     return param;
diff --git a/lib/src/manager/im_group_manager.dart b/lib/src/manager/im_group_manager.dart
index 84a873c..4e6a3dc 100644
--- a/lib/src/manager/im_group_manager.dart
+++ b/lib/src/manager/im_group_manager.dart
@@ -207,20 +207,15 @@ class GroupManager {
 
   /// Apply to join a group, requiring approval from an administrator or the group.
   /// [joinSource] 2: Invited, 3: Searched, 4: Using a QR code
-  Future<dynamic> joinGroup({
-    required String groupID,
-    String? reason,
-    String? operationID,
-    int joinSource = 3,
-  }) =>
-      _channel.invokeMethod(
-          'joinGroup',
-          _buildParam({
-            'groupID': groupID,
-            'reason': reason,
-            'joinSource': joinSource,
-            'operationID': Utils.checkOperationID(operationID),
-          }));
+  Future<dynamic> joinGroup({required String groupID, String? reason, String? operationID, int joinSource = 3, String? ex}) => _channel.invokeMethod(
+      'joinGroup',
+      _buildParam({
+        'groupID': groupID,
+        'reason': reason,
+        'joinSource': joinSource,
+        'ex': ex,
+        'operationID': Utils.checkOperationID(operationID),
+      }));
 
   /// Exit a group
   Future<dynamic> quitGroup({
diff --git a/lib/src/manager/im_user_manager.dart b/lib/src/manager/im_user_manager.dart
index 66dbe3e..cf31d02 100644
--- a/lib/src/manager/im_user_manager.dart
+++ b/lib/src/manager/im_user_manager.dart
@@ -131,6 +131,18 @@ class UserManager {
         .then((value) => Utils.toList(value, (map) => FullUserInfo.fromJson(map)));
   }
 
+  Future<String?> setSelfUserInfoEx(
+    UserInfo userInfo, {
+    String? operationID,
+  }) {
+    return _channel.invokeMethod(
+        'setSelfUserInfoEx',
+        _buildParam({
+          ...userInfo.toJson(),
+          'operationID': Utils.checkOperationID(operationID),
+        }));
+  }
+
   static Map _buildParam(Map param) {
     param["ManagerName"] = "userManager";
     return param;
diff --git a/lib/src/openim.dart b/lib/src/openim.dart
index eeae2df..38790e0 100644
--- a/lib/src/openim.dart
+++ b/lib/src/openim.dart
@@ -2,7 +2,7 @@ import 'package:flutter/services.dart';
 import 'package:flutter_openim_sdk/flutter_openim_sdk.dart';
 
 class OpenIM {
-  static const version = '3.4.0+2';
+  static const version = '3.5.0-rc.1';
 
   static const _channel = const MethodChannel('flutter_openim_sdk');
 
diff --git a/pubspec.yaml b/pubspec.yaml
index 0070c90..5535f0c 100644
--- a/pubspec.yaml
+++ b/pubspec.yaml
@@ -1,6 +1,6 @@
 name: flutter_openim_sdk
 description: An instant messaging plug-in that supports Android and IOS. And the server is also all open source.
-version: 3.4.0+2
+version: 3.5.0-rc.1
 homepage: https://www.openim.io
 repository: https://github.com/openimsdk/open-im-sdk-flutter