zwp 3 months ago
commit
cc1a595e03
100 changed files with 2368 additions and 0 deletions
  1. 495 0
      AIIM.xcodeproj/project.pbxproj
  2. 7 0
      AIIM.xcodeproj/project.xcworkspace/contents.xcworkspacedata
  3. 78 0
      AIIM.xcodeproj/xcshareddata/xcschemes/AIIM.xcscheme
  4. 10 0
      AIIM.xcworkspace/contents.xcworkspacedata
  5. 8 0
      AIIM/AIIM.entitlements
  6. 8 0
      AIIM/AIIM.xcdatamodeld/.xccurrentversion
  7. 4 0
      AIIM/AIIM.xcdatamodeld/AIIM.xcdatamodel/contents
  8. 46 0
      AIIM/AppDelegate.h
  9. 1105 0
      AIIM/AppDelegate.m
  10. BIN
      AIIM/Assets.xcassets/AppIcon.appiconset/515.png
  11. BIN
      AIIM/Assets.xcassets/AppIcon.appiconset/525 1.png
  12. BIN
      AIIM/Assets.xcassets/AppIcon.appiconset/525.png
  13. 38 0
      AIIM/Assets.xcassets/AppIcon.appiconset/Contents.json
  14. BIN
      AIIM/Assets.xcassets/Avatar.imageset/Avatar.png
  15. 21 0
      AIIM/Assets.xcassets/Avatar.imageset/Contents.json
  16. BIN
      AIIM/Assets.xcassets/Avatar0.imageset/Avatar0.png
  17. 21 0
      AIIM/Assets.xcassets/Avatar0.imageset/Contents.json
  18. 6 0
      AIIM/Assets.xcassets/Call/Contents.json
  19. 21 0
      AIIM/Assets.xcassets/Call/hangup_icon.imageset/Contents.json
  20. BIN
      AIIM/Assets.xcassets/Call/hangup_icon.imageset/hangup_icon.png
  21. 21 0
      AIIM/Assets.xcassets/Call/hangup_icon_blue.imageset/Contents.json
  22. BIN
      AIIM/Assets.xcassets/Call/hangup_icon_blue.imageset/hangup_icon_blue.png
  23. 23 0
      AIIM/Assets.xcassets/Call/huazhonghua_icon.imageset/Contents.json
  24. BIN
      AIIM/Assets.xcassets/Call/huazhonghua_icon.imageset/huazhonghua 1.png
  25. BIN
      AIIM/Assets.xcassets/Call/huazhonghua_icon.imageset/huazhonghua 2.png
  26. BIN
      AIIM/Assets.xcassets/Call/huazhonghua_icon.imageset/huazhonghua.png
  27. 21 0
      AIIM/Assets.xcassets/Call/mic_off_icon.imageset/Contents.json
  28. BIN
      AIIM/Assets.xcassets/Call/mic_off_icon.imageset/mic_off_icon.png
  29. 21 0
      AIIM/Assets.xcassets/Call/mic_on_icon.imageset/Contents.json
  30. BIN
      AIIM/Assets.xcassets/Call/mic_on_icon.imageset/mic_on_icon.png
  31. 21 0
      AIIM/Assets.xcassets/Call/speaker_off_icon.imageset/Contents.json
  32. BIN
      AIIM/Assets.xcassets/Call/speaker_off_icon.imageset/speaker_off_icon.png
  33. 21 0
      AIIM/Assets.xcassets/Call/speaker_on_icon.imageset/Contents.json
  34. BIN
      AIIM/Assets.xcassets/Call/speaker_on_icon.imageset/speaker_on_icon.png
  35. 23 0
      AIIM/Assets.xcassets/Cdacha.imageset/Contents.json
  36. BIN
      AIIM/Assets.xcassets/Cdacha.imageset/添加 on.png
  37. BIN
      AIIM/Assets.xcassets/Cdacha.imageset/添加 on@2x.png
  38. BIN
      AIIM/Assets.xcassets/Cdacha.imageset/添加 on@3x.png
  39. BIN
      AIIM/Assets.xcassets/Cjiahao.imageset/Cjiahao.png
  40. BIN
      AIIM/Assets.xcassets/Cjiahao.imageset/Cjiahao@2x.png
  41. BIN
      AIIM/Assets.xcassets/Cjiahao.imageset/Cjiahao@3x.png
  42. 23 0
      AIIM/Assets.xcassets/Cjiahao.imageset/Contents.json
  43. BIN
      AIIM/Assets.xcassets/Cjiahao.imageset/添加.png
  44. BIN
      AIIM/Assets.xcassets/Cjiahao.imageset/添加@2x.png
  45. BIN
      AIIM/Assets.xcassets/Cjiahao.imageset/添加@3x.png
  46. 6 0
      AIIM/Assets.xcassets/Contents.json
  47. 23 0
      AIIM/Assets.xcassets/Cpaissc.imageset/Contents.json
  48. BIN
      AIIM/Assets.xcassets/Cpaissc.imageset/拍摄.png
  49. BIN
      AIIM/Assets.xcassets/Cpaissc.imageset/拍摄@2x.png
  50. BIN
      AIIM/Assets.xcassets/Cpaissc.imageset/拍摄@3x.png
  51. 23 0
      AIIM/Assets.xcassets/Cshipin.imageset/Contents.json
  52. BIN
      AIIM/Assets.xcassets/Cshipin.imageset/视频.png
  53. BIN
      AIIM/Assets.xcassets/Cshipin.imageset/视频@2x.png
  54. BIN
      AIIM/Assets.xcassets/Cshipin.imageset/视频@3x.png
  55. 23 0
      AIIM/Assets.xcassets/Cshipinth.imageset/Contents.json
  56. BIN
      AIIM/Assets.xcassets/Cshipinth.imageset/录像.png
  57. BIN
      AIIM/Assets.xcassets/Cshipinth.imageset/录像@2x.png
  58. BIN
      AIIM/Assets.xcassets/Cshipinth.imageset/录像@3x.png
  59. 23 0
      AIIM/Assets.xcassets/Ctupian.imageset/Contents.json
  60. BIN
      AIIM/Assets.xcassets/Ctupian.imageset/图片.png
  61. BIN
      AIIM/Assets.xcassets/Ctupian.imageset/图片@2x.png
  62. BIN
      AIIM/Assets.xcassets/Ctupian.imageset/图片@3x.png
  63. 23 0
      AIIM/Assets.xcassets/Cwenjian.imageset/Contents.json
  64. BIN
      AIIM/Assets.xcassets/Cwenjian.imageset/文件夹.png
  65. BIN
      AIIM/Assets.xcassets/Cwenjian.imageset/文件夹@2x.png
  66. BIN
      AIIM/Assets.xcassets/Cwenjian.imageset/文件夹@3x.png
  67. 23 0
      AIIM/Assets.xcassets/Cyuyinth.imageset/Contents.json
  68. BIN
      AIIM/Assets.xcassets/Cyuyinth.imageset/电话.png
  69. BIN
      AIIM/Assets.xcassets/Cyuyinth.imageset/电话@2x.png
  70. BIN
      AIIM/Assets.xcassets/Cyuyinth.imageset/电话@3x.png
  71. 23 0
      AIIM/Assets.xcassets/allvBG.imageset/Contents.json
  72. BIN
      AIIM/Assets.xcassets/allvBG.imageset/allvBG 1.png
  73. BIN
      AIIM/Assets.xcassets/allvBG.imageset/allvBG 2.png
  74. BIN
      AIIM/Assets.xcassets/allvBG.imageset/allvBG.png
  75. 23 0
      AIIM/Assets.xcassets/announce_group_icon.imageset/Contents.json
  76. BIN
      AIIM/Assets.xcassets/announce_group_icon.imageset/announce_group_icon.png
  77. BIN
      AIIM/Assets.xcassets/announce_group_icon.imageset/announce_group_icon@2x.png
  78. BIN
      AIIM/Assets.xcassets/announce_group_icon.imageset/announce_group_icon@3x.png
  79. 23 0
      AIIM/Assets.xcassets/arrow-right.imageset/Contents.json
  80. BIN
      AIIM/Assets.xcassets/arrow-right.imageset/右箭头.png
  81. BIN
      AIIM/Assets.xcassets/arrow-right.imageset/右箭头@2x.png
  82. BIN
      AIIM/Assets.xcassets/arrow-right.imageset/右箭头@3x.png
  83. 23 0
      AIIM/Assets.xcassets/arrow_down.imageset/Contents.json
  84. BIN
      AIIM/Assets.xcassets/arrow_down.imageset/arrow_down.png
  85. BIN
      AIIM/Assets.xcassets/arrow_down.imageset/arrow_down@2x.png
  86. BIN
      AIIM/Assets.xcassets/arrow_down.imageset/arrow_down@3x.png
  87. 23 0
      AIIM/Assets.xcassets/arrow_up.imageset/Contents.json
  88. BIN
      AIIM/Assets.xcassets/arrow_up.imageset/arrow_up.png
  89. BIN
      AIIM/Assets.xcassets/arrow_up.imageset/arrow_up@2x.png
  90. BIN
      AIIM/Assets.xcassets/arrow_up.imageset/arrow_up@3x.png
  91. 21 0
      AIIM/Assets.xcassets/at_everyone.imageset/Contents.json
  92. BIN
      AIIM/Assets.xcassets/at_everyone.imageset/at_everyone.png
  93. 23 0
      AIIM/Assets.xcassets/audio_call_icon.imageset/Contents.json
  94. BIN
      AIIM/Assets.xcassets/audio_call_icon.imageset/audio_call_icon.png
  95. BIN
      AIIM/Assets.xcassets/audio_call_icon.imageset/audio_call_icon@2x.png
  96. BIN
      AIIM/Assets.xcassets/audio_call_icon.imageset/audio_call_icon@3x.png
  97. 23 0
      AIIM/Assets.xcassets/audio_icon.imageset/Contents.json
  98. BIN
      AIIM/Assets.xcassets/audio_icon.imageset/audio_icon.png
  99. BIN
      AIIM/Assets.xcassets/audio_icon.imageset/audio_icon@2x.png
  100. BIN
      AIIM/Assets.xcassets/audio_icon.imageset/audio_icon@3x.png

+ 495 - 0
AIIM.xcodeproj/project.pbxproj

@@ -0,0 +1,495 @@
+// !$*UTF8*$!
+{
+	archiveVersion = 1;
+	classes = {
+	};
+	objectVersion = 77;
+	objects = {
+
+/* Begin PBXBuildFile section */
+		32B155BE2D97D7AA0024D87B /* Security.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 32B155BD2D97D7AA0024D87B /* Security.framework */; };
+		32B891722D96B32A00E3680D /* PushKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 32B891712D96B32A00E3680D /* PushKit.framework */; };
+		32B9F55B2D97839A004DF210 /* CallKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 32B9F55A2D97839A004DF210 /* CallKit.framework */; };
+		32D58C382E1A7FD7007BB54F /* AdSupport.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 32D58C372E1A7FD7007BB54F /* AdSupport.framework */; };
+		9F4117AC2E9CEC76006EF67F /* libresolv.tbd in Frameworks */ = {isa = PBXBuildFile; fileRef = 9F4117AB2E9CEC6C006EF67F /* libresolv.tbd */; };
+		F5E73DB196DA7DCA82E20B5F /* Pods_AIIM.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = DE64A2F611A06757D5F4F1DC /* Pods_AIIM.framework */; };
+/* End PBXBuildFile section */
+
+/* Begin PBXCopyFilesBuildPhase section */
+		32BF85DB2DBA2FD1000717B9 /* CopyFiles */ = {
+			isa = PBXCopyFilesBuildPhase;
+			buildActionMask = 12;
+			dstPath = "";
+			dstSubfolderSpec = 16;
+			files = (
+			);
+			runOnlyForDeploymentPostprocessing = 0;
+		};
+/* End PBXCopyFilesBuildPhase section */
+
+/* Begin PBXFileReference section */
+		046B5C37477FB9F61A4779F0 /* Pods-AIIM.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-AIIM.debug.xcconfig"; path = "Target Support Files/Pods-AIIM/Pods-AIIM.debug.xcconfig"; sourceTree = "<group>"; };
+		1F8A15C50ECF727A84568D3A /* Pods-AIIM.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-AIIM.release.xcconfig"; path = "Target Support Files/Pods-AIIM/Pods-AIIM.release.xcconfig"; sourceTree = "<group>"; };
+		3251B18C2D952D1100DE1D2D /* AIIM.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = AIIM.app; sourceTree = BUILT_PRODUCTS_DIR; };
+		32B155BD2D97D7AA0024D87B /* Security.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Security.framework; path = System/Library/Frameworks/Security.framework; sourceTree = SDKROOT; };
+		32B891712D96B32A00E3680D /* PushKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = PushKit.framework; path = System/Library/Frameworks/PushKit.framework; sourceTree = SDKROOT; };
+		32B9F55A2D97839A004DF210 /* CallKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CallKit.framework; path = System/Library/Frameworks/CallKit.framework; sourceTree = SDKROOT; };
+		32BF85DC2DBA31F6000717B9 /* GiphyUISDK.xcframework */ = {isa = PBXFileReference; expectedSignature = "AppleDeveloperProgram:925PGC4MV7:Giphy, Inc."; lastKnownFileType = wrapper.xcframework; name = GiphyUISDK.xcframework; path = Pods/Giphy/GiphySDK/GiphyUISDK.xcframework; sourceTree = "<group>"; };
+		32D58C372E1A7FD7007BB54F /* AdSupport.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AdSupport.framework; path = System/Library/Frameworks/AdSupport.framework; sourceTree = SDKROOT; };
+		9F4117AB2E9CEC6C006EF67F /* libresolv.tbd */ = {isa = PBXFileReference; lastKnownFileType = "sourcecode.text-based-dylib-definition"; name = libresolv.tbd; path = usr/lib/libresolv.tbd; sourceTree = SDKROOT; };
+		DE64A2F611A06757D5F4F1DC /* Pods_AIIM.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_AIIM.framework; sourceTree = BUILT_PRODUCTS_DIR; };
+/* End PBXFileReference section */
+
+/* Begin PBXFileSystemSynchronizedBuildFileExceptionSet section */
+		3251B1A62D952D1100DE1D2D /* Exceptions for "AIIM" folder in "AIIM" target */ = {
+			isa = PBXFileSystemSynchronizedBuildFileExceptionSet;
+			membershipExceptions = (
+				Info.plist,
+			);
+			target = 3251B18B2D952D1100DE1D2D /* AIIM */;
+		};
+/* End PBXFileSystemSynchronizedBuildFileExceptionSet section */
+
+/* Begin PBXFileSystemSynchronizedRootGroup section */
+		3251B18E2D952D1100DE1D2D /* AIIM */ = {
+			isa = PBXFileSystemSynchronizedRootGroup;
+			exceptions = (
+				3251B1A62D952D1100DE1D2D /* Exceptions for "AIIM" folder in "AIIM" target */,
+			);
+			path = AIIM;
+			sourceTree = "<group>";
+		};
+/* End PBXFileSystemSynchronizedRootGroup section */
+
+/* Begin PBXFrameworksBuildPhase section */
+		3251B1892D952D1100DE1D2D /* Frameworks */ = {
+			isa = PBXFrameworksBuildPhase;
+			buildActionMask = 2147483647;
+			files = (
+				32B891722D96B32A00E3680D /* PushKit.framework in Frameworks */,
+				32D58C382E1A7FD7007BB54F /* AdSupport.framework in Frameworks */,
+				32B155BE2D97D7AA0024D87B /* Security.framework in Frameworks */,
+				9F4117AC2E9CEC76006EF67F /* libresolv.tbd in Frameworks */,
+				32B9F55B2D97839A004DF210 /* CallKit.framework in Frameworks */,
+				F5E73DB196DA7DCA82E20B5F /* Pods_AIIM.framework in Frameworks */,
+			);
+			runOnlyForDeploymentPostprocessing = 0;
+		};
+/* End PBXFrameworksBuildPhase section */
+
+/* Begin PBXGroup section */
+		148C18E9E9CD6DF9DD6F0A79 /* Frameworks */ = {
+			isa = PBXGroup;
+			children = (
+				9F4117AB2E9CEC6C006EF67F /* libresolv.tbd */,
+				32D58C372E1A7FD7007BB54F /* AdSupport.framework */,
+				32BF85DC2DBA31F6000717B9 /* GiphyUISDK.xcframework */,
+				32B155BD2D97D7AA0024D87B /* Security.framework */,
+				32B9F55A2D97839A004DF210 /* CallKit.framework */,
+				32B891712D96B32A00E3680D /* PushKit.framework */,
+				DE64A2F611A06757D5F4F1DC /* Pods_AIIM.framework */,
+			);
+			name = Frameworks;
+			sourceTree = "<group>";
+		};
+		3251B1832D952D1100DE1D2D = {
+			isa = PBXGroup;
+			children = (
+				3251B18E2D952D1100DE1D2D /* AIIM */,
+				3251B18D2D952D1100DE1D2D /* Products */,
+				8C26E1DA19539602376D76B7 /* Pods */,
+				148C18E9E9CD6DF9DD6F0A79 /* Frameworks */,
+			);
+			sourceTree = "<group>";
+		};
+		3251B18D2D952D1100DE1D2D /* Products */ = {
+			isa = PBXGroup;
+			children = (
+				3251B18C2D952D1100DE1D2D /* AIIM.app */,
+			);
+			name = Products;
+			sourceTree = "<group>";
+		};
+		8C26E1DA19539602376D76B7 /* Pods */ = {
+			isa = PBXGroup;
+			children = (
+				046B5C37477FB9F61A4779F0 /* Pods-AIIM.debug.xcconfig */,
+				1F8A15C50ECF727A84568D3A /* Pods-AIIM.release.xcconfig */,
+			);
+			path = Pods;
+			sourceTree = "<group>";
+		};
+/* End PBXGroup section */
+
+/* Begin PBXNativeTarget section */
+		3251B18B2D952D1100DE1D2D /* AIIM */ = {
+			isa = PBXNativeTarget;
+			buildConfigurationList = 3251B1A72D952D1100DE1D2D /* Build configuration list for PBXNativeTarget "AIIM" */;
+			buildPhases = (
+				145EDA51BAEDD86B79DF11BB /* [CP] Check Pods Manifest.lock */,
+				3251B1882D952D1100DE1D2D /* Sources */,
+				3251B1892D952D1100DE1D2D /* Frameworks */,
+				3251B18A2D952D1100DE1D2D /* Resources */,
+				32BF85DB2DBA2FD1000717B9 /* CopyFiles */,
+				75FE5486DD25A0A88D7D87D5 /* [CP] Embed Pods Frameworks */,
+			);
+			buildRules = (
+			);
+			dependencies = (
+			);
+			fileSystemSynchronizedGroups = (
+				3251B18E2D952D1100DE1D2D /* AIIM */,
+			);
+			name = AIIM;
+			productName = AIIM;
+			productReference = 3251B18C2D952D1100DE1D2D /* AIIM.app */;
+			productType = "com.apple.product-type.application";
+		};
+/* End PBXNativeTarget section */
+
+/* Begin PBXProject section */
+		3251B1842D952D1100DE1D2D /* Project object */ = {
+			isa = PBXProject;
+			attributes = {
+				BuildIndependentTargetsInParallel = 1;
+				LastUpgradeCheck = 1620;
+				TargetAttributes = {
+					3251B18B2D952D1100DE1D2D = {
+						CreatedOnToolsVersion = 16.2;
+					};
+				};
+			};
+			buildConfigurationList = 3251B1872D952D1100DE1D2D /* Build configuration list for PBXProject "AIIM" */;
+			developmentRegion = en;
+			hasScannedForEncodings = 0;
+			knownRegions = (
+				en,
+				Base,
+				"zh-Hant",
+				"zh-Hans",
+			);
+			mainGroup = 3251B1832D952D1100DE1D2D;
+			minimizedProjectReferenceProxies = 1;
+			preferredProjectObjectVersion = 77;
+			productRefGroup = 3251B18D2D952D1100DE1D2D /* Products */;
+			projectDirPath = "";
+			projectRoot = "";
+			targets = (
+				3251B18B2D952D1100DE1D2D /* AIIM */,
+			);
+		};
+/* End PBXProject section */
+
+/* Begin PBXResourcesBuildPhase section */
+		3251B18A2D952D1100DE1D2D /* Resources */ = {
+			isa = PBXResourcesBuildPhase;
+			buildActionMask = 2147483647;
+			files = (
+			);
+			runOnlyForDeploymentPostprocessing = 0;
+		};
+/* End PBXResourcesBuildPhase section */
+
+/* Begin PBXShellScriptBuildPhase section */
+		145EDA51BAEDD86B79DF11BB /* [CP] Check Pods Manifest.lock */ = {
+			isa = PBXShellScriptBuildPhase;
+			buildActionMask = 2147483647;
+			files = (
+			);
+			inputFileListPaths = (
+			);
+			inputPaths = (
+				"${PODS_PODFILE_DIR_PATH}/Podfile.lock",
+				"${PODS_ROOT}/Manifest.lock",
+			);
+			name = "[CP] Check Pods Manifest.lock";
+			outputFileListPaths = (
+			);
+			outputPaths = (
+				"$(DERIVED_FILE_DIR)/Pods-AIIM-checkManifestLockResult.txt",
+			);
+			runOnlyForDeploymentPostprocessing = 0;
+			shellPath = /bin/sh;
+			shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n    # print error to STDERR\n    echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n    exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n";
+			showEnvVarsInLog = 0;
+		};
+		75FE5486DD25A0A88D7D87D5 /* [CP] Embed Pods Frameworks */ = {
+			isa = PBXShellScriptBuildPhase;
+			buildActionMask = 2147483647;
+			files = (
+			);
+			inputFileListPaths = (
+			);
+			name = "[CP] Embed Pods Frameworks";
+			outputFileListPaths = (
+			);
+			runOnlyForDeploymentPostprocessing = 0;
+			shellPath = /bin/sh;
+			shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-AIIM/Pods-AIIM-frameworks.sh\"\n";
+			showEnvVarsInLog = 0;
+		};
+/* End PBXShellScriptBuildPhase section */
+
+/* Begin PBXSourcesBuildPhase section */
+		3251B1882D952D1100DE1D2D /* Sources */ = {
+			isa = PBXSourcesBuildPhase;
+			buildActionMask = 2147483647;
+			files = (
+			);
+			runOnlyForDeploymentPostprocessing = 0;
+		};
+/* End PBXSourcesBuildPhase section */
+
+/* Begin XCBuildConfiguration section */
+		3251B1A82D952D1100DE1D2D /* Debug */ = {
+			isa = XCBuildConfiguration;
+			baseConfigurationReference = 046B5C37477FB9F61A4779F0 /* Pods-AIIM.debug.xcconfig */;
+			buildSettings = {
+				ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
+				ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
+				ASSETCATALOG_COMPILER_INCLUDE_ALL_APPICON_ASSETS = YES;
+				CODE_SIGN_ENTITLEMENTS = AIIM/AIIM.entitlements;
+				"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
+				CODE_SIGN_STYLE = Manual;
+				CURRENT_PROJECT_VERSION = 20201;
+				DEVELOPMENT_TEAM = "";
+				"DEVELOPMENT_TEAM[sdk=iphoneos*]" = ANJCTZ9L4P;
+				ENABLE_DEBUG_DYLIB = NO;
+				ENABLE_USER_SCRIPT_SANDBOXING = NO;
+				GCC_PREFIX_HEADER = "${SRCROOT}/AIIM/Prefix&Header/PrefixHeader.pch";
+				GENERATE_INFOPLIST_FILE = YES;
+				INFOPLIST_FILE = AIIM/Info.plist;
+				INFOPLIST_KEY_CFBundleDisplayName = 555IM;
+				INFOPLIST_KEY_ITSAppUsesNonExemptEncryption = NO;
+				INFOPLIST_KEY_NSCalendarsUsageDescription = "App需要您的同意,才能访问日历";
+				INFOPLIST_KEY_NSCameraUsageDescription = "App 需要访问您的相机来拍摄照片。";
+				INFOPLIST_KEY_NSMicrophoneUsageDescription = "App 需要您允许视频播放。";
+				INFOPLIST_KEY_NSPhotoLibraryUsageDescription = "App 需要访问您的相册来选择照片。";
+				INFOPLIST_KEY_NSSpeechRecognitionUsageDescription = "需要语音识别权限以进行通话";
+				INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents = YES;
+				INFOPLIST_KEY_UILaunchStoryboardName = LaunchScreen.storyboard;
+				INFOPLIST_KEY_UIMainStoryboardFile = Main;
+				INFOPLIST_KEY_UISupportedInterfaceOrientations = UIInterfaceOrientationPortrait;
+				INFOPLIST_KEY_UISupportedInterfaceOrientations_iPad = "UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown";
+				IPHONEOS_DEPLOYMENT_TARGET = 15.6;
+				LD_RUNPATH_SEARCH_PATHS = (
+					"$(inherited)",
+					"@executable_path/Frameworks",
+				);
+				MARKETING_VERSION = 2.0.2;
+				PRODUCT_BUNDLE_IDENTIFIER = com.qitewei.aiim01;
+				PRODUCT_NAME = "$(TARGET_NAME)";
+				PROVISIONING_PROFILE_SPECIFIER = "";
+				"PROVISIONING_PROFILE_SPECIFIER[sdk=iphoneos*]" = aiimdev;
+				SUPPORTED_PLATFORMS = "iphoneos iphonesimulator";
+				SUPPORTS_MACCATALYST = NO;
+				SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = NO;
+				SUPPORTS_XR_DESIGNED_FOR_IPHONE_IPAD = NO;
+				SWIFT_EMIT_LOC_STRINGS = YES;
+				TARGETED_DEVICE_FAMILY = 1;
+				USER_HEADER_SEARCH_PATHS = (
+					"${SRCROOT}/AIIM/Common",
+					"${SRCROOT}/AIIM/Controller/**",
+				);
+			};
+			name = Debug;
+		};
+		3251B1A92D952D1100DE1D2D /* Release */ = {
+			isa = XCBuildConfiguration;
+			baseConfigurationReference = 1F8A15C50ECF727A84568D3A /* Pods-AIIM.release.xcconfig */;
+			buildSettings = {
+				ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
+				ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
+				ASSETCATALOG_COMPILER_INCLUDE_ALL_APPICON_ASSETS = YES;
+				CODE_SIGN_ENTITLEMENTS = AIIM/AIIM.entitlements;
+				"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
+				CODE_SIGN_STYLE = Manual;
+				CURRENT_PROJECT_VERSION = 20201;
+				DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
+				DEVELOPMENT_TEAM = "";
+				"DEVELOPMENT_TEAM[sdk=iphoneos*]" = ANJCTZ9L4P;
+				ENABLE_DEBUG_DYLIB = NO;
+				ENABLE_USER_SCRIPT_SANDBOXING = NO;
+				GCC_PREFIX_HEADER = "${SRCROOT}/AIIM/Prefix&Header/PrefixHeader.pch";
+				GENERATE_INFOPLIST_FILE = YES;
+				INFOPLIST_FILE = AIIM/Info.plist;
+				INFOPLIST_KEY_CFBundleDisplayName = 555IM;
+				INFOPLIST_KEY_ITSAppUsesNonExemptEncryption = NO;
+				INFOPLIST_KEY_NSCalendarsUsageDescription = "App需要您的同意,才能访问日历";
+				INFOPLIST_KEY_NSCameraUsageDescription = "App 需要访问您的相机来拍摄照片。";
+				INFOPLIST_KEY_NSMicrophoneUsageDescription = "App 需要您允许视频播放。";
+				INFOPLIST_KEY_NSPhotoLibraryUsageDescription = "App 需要访问您的相册来选择照片。";
+				INFOPLIST_KEY_NSSpeechRecognitionUsageDescription = "需要语音识别权限以进行通话";
+				INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents = YES;
+				INFOPLIST_KEY_UILaunchStoryboardName = LaunchScreen.storyboard;
+				INFOPLIST_KEY_UIMainStoryboardFile = Main;
+				INFOPLIST_KEY_UISupportedInterfaceOrientations = UIInterfaceOrientationPortrait;
+				INFOPLIST_KEY_UISupportedInterfaceOrientations_iPad = "UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown";
+				IPHONEOS_DEPLOYMENT_TARGET = 15.6;
+				LD_RUNPATH_SEARCH_PATHS = (
+					"$(inherited)",
+					"@executable_path/Frameworks",
+				);
+				MARKETING_VERSION = 2.0.2;
+				PRODUCT_BUNDLE_IDENTIFIER = com.qitewei.aiim01;
+				PRODUCT_NAME = "$(TARGET_NAME)";
+				PROVISIONING_PROFILE_SPECIFIER = "";
+				"PROVISIONING_PROFILE_SPECIFIER[sdk=iphoneos*]" = aiimdev;
+				SUPPORTED_PLATFORMS = "iphoneos iphonesimulator";
+				SUPPORTS_MACCATALYST = NO;
+				SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = NO;
+				SUPPORTS_XR_DESIGNED_FOR_IPHONE_IPAD = NO;
+				SWIFT_EMIT_LOC_STRINGS = YES;
+				TARGETED_DEVICE_FAMILY = 1;
+				USER_HEADER_SEARCH_PATHS = (
+					"${SRCROOT}/AIIM/Common",
+					"${SRCROOT}/AIIM/Controller/**",
+				);
+			};
+			name = Release;
+		};
+		3251B1AA2D952D1100DE1D2D /* Debug */ = {
+			isa = XCBuildConfiguration;
+			buildSettings = {
+				ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES;
+				ALWAYS_SEARCH_USER_PATHS = NO;
+				ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES;
+				CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES;
+				CLANG_ANALYZER_NONNULL = YES;
+				CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
+				CLANG_CXX_LANGUAGE_STANDARD = "gnu++20";
+				CLANG_ENABLE_MODULES = YES;
+				CLANG_ENABLE_OBJC_ARC = YES;
+				CLANG_ENABLE_OBJC_WEAK = YES;
+				CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
+				CLANG_WARN_BOOL_CONVERSION = YES;
+				CLANG_WARN_COMMA = YES;
+				CLANG_WARN_CONSTANT_CONVERSION = YES;
+				CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
+				CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
+				CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
+				CLANG_WARN_EMPTY_BODY = YES;
+				CLANG_WARN_ENUM_CONVERSION = YES;
+				CLANG_WARN_INFINITE_RECURSION = YES;
+				CLANG_WARN_INT_CONVERSION = YES;
+				CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
+				CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
+				CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
+				CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
+				CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;
+				CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
+				CLANG_WARN_STRICT_PROTOTYPES = YES;
+				CLANG_WARN_SUSPICIOUS_MOVE = YES;
+				CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
+				CLANG_WARN_UNREACHABLE_CODE = YES;
+				CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
+				COPY_PHASE_STRIP = NO;
+				DEBUG_INFORMATION_FORMAT = dwarf;
+				ENABLE_STRICT_OBJC_MSGSEND = YES;
+				ENABLE_TESTABILITY = YES;
+				ENABLE_USER_SCRIPT_SANDBOXING = YES;
+				GCC_C_LANGUAGE_STANDARD = gnu17;
+				GCC_DYNAMIC_NO_PIC = NO;
+				GCC_NO_COMMON_BLOCKS = YES;
+				GCC_OPTIMIZATION_LEVEL = 0;
+				GCC_PREPROCESSOR_DEFINITIONS = (
+					"DEBUG=1",
+					"$(inherited)",
+				);
+				GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
+				GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
+				GCC_WARN_UNDECLARED_SELECTOR = YES;
+				GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
+				GCC_WARN_UNUSED_FUNCTION = YES;
+				GCC_WARN_UNUSED_VARIABLE = YES;
+				IPHONEOS_DEPLOYMENT_TARGET = 18.2;
+				LOCALIZATION_PREFERS_STRING_CATALOGS = YES;
+				MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE;
+				MTL_FAST_MATH = YES;
+				ONLY_ACTIVE_ARCH = NO;
+				SDKROOT = iphoneos;
+			};
+			name = Debug;
+		};
+		3251B1AB2D952D1100DE1D2D /* Release */ = {
+			isa = XCBuildConfiguration;
+			buildSettings = {
+				ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES;
+				ALWAYS_SEARCH_USER_PATHS = NO;
+				ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES;
+				CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES;
+				CLANG_ANALYZER_NONNULL = YES;
+				CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
+				CLANG_CXX_LANGUAGE_STANDARD = "gnu++20";
+				CLANG_ENABLE_MODULES = YES;
+				CLANG_ENABLE_OBJC_ARC = YES;
+				CLANG_ENABLE_OBJC_WEAK = YES;
+				CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
+				CLANG_WARN_BOOL_CONVERSION = YES;
+				CLANG_WARN_COMMA = YES;
+				CLANG_WARN_CONSTANT_CONVERSION = YES;
+				CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
+				CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
+				CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
+				CLANG_WARN_EMPTY_BODY = YES;
+				CLANG_WARN_ENUM_CONVERSION = YES;
+				CLANG_WARN_INFINITE_RECURSION = YES;
+				CLANG_WARN_INT_CONVERSION = YES;
+				CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
+				CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
+				CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
+				CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
+				CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;
+				CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
+				CLANG_WARN_STRICT_PROTOTYPES = YES;
+				CLANG_WARN_SUSPICIOUS_MOVE = YES;
+				CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
+				CLANG_WARN_UNREACHABLE_CODE = YES;
+				CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
+				COPY_PHASE_STRIP = NO;
+				DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
+				ENABLE_NS_ASSERTIONS = NO;
+				ENABLE_STRICT_OBJC_MSGSEND = YES;
+				ENABLE_USER_SCRIPT_SANDBOXING = YES;
+				GCC_C_LANGUAGE_STANDARD = gnu17;
+				GCC_NO_COMMON_BLOCKS = YES;
+				GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
+				GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
+				GCC_WARN_UNDECLARED_SELECTOR = YES;
+				GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
+				GCC_WARN_UNUSED_FUNCTION = YES;
+				GCC_WARN_UNUSED_VARIABLE = YES;
+				IPHONEOS_DEPLOYMENT_TARGET = 18.2;
+				LOCALIZATION_PREFERS_STRING_CATALOGS = YES;
+				MTL_ENABLE_DEBUG_INFO = NO;
+				MTL_FAST_MATH = YES;
+				SDKROOT = iphoneos;
+				VALIDATE_PRODUCT = YES;
+			};
+			name = Release;
+		};
+/* End XCBuildConfiguration section */
+
+/* Begin XCConfigurationList section */
+		3251B1872D952D1100DE1D2D /* Build configuration list for PBXProject "AIIM" */ = {
+			isa = XCConfigurationList;
+			buildConfigurations = (
+				3251B1AA2D952D1100DE1D2D /* Debug */,
+				3251B1AB2D952D1100DE1D2D /* Release */,
+			);
+			defaultConfigurationIsVisible = 0;
+			defaultConfigurationName = Release;
+		};
+		3251B1A72D952D1100DE1D2D /* Build configuration list for PBXNativeTarget "AIIM" */ = {
+			isa = XCConfigurationList;
+			buildConfigurations = (
+				3251B1A82D952D1100DE1D2D /* Debug */,
+				3251B1A92D952D1100DE1D2D /* Release */,
+			);
+			defaultConfigurationIsVisible = 0;
+			defaultConfigurationName = Release;
+		};
+/* End XCConfigurationList section */
+	};
+	rootObject = 3251B1842D952D1100DE1D2D /* Project object */;
+}

+ 7 - 0
AIIM.xcodeproj/project.xcworkspace/contents.xcworkspacedata

@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<Workspace
+   version = "1.0">
+   <FileRef
+      location = "self:">
+   </FileRef>
+</Workspace>

+ 78 - 0
AIIM.xcodeproj/xcshareddata/xcschemes/AIIM.xcscheme

@@ -0,0 +1,78 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<Scheme
+   LastUpgradeVersion = "1630"
+   version = "1.7">
+   <BuildAction
+      parallelizeBuildables = "YES"
+      buildImplicitDependencies = "YES"
+      buildArchitectures = "Automatic">
+      <BuildActionEntries>
+         <BuildActionEntry
+            buildForTesting = "YES"
+            buildForRunning = "YES"
+            buildForProfiling = "YES"
+            buildForArchiving = "YES"
+            buildForAnalyzing = "YES">
+            <BuildableReference
+               BuildableIdentifier = "primary"
+               BlueprintIdentifier = "3251B18B2D952D1100DE1D2D"
+               BuildableName = "AIIM.app"
+               BlueprintName = "AIIM"
+               ReferencedContainer = "container:AIIM.xcodeproj">
+            </BuildableReference>
+         </BuildActionEntry>
+      </BuildActionEntries>
+   </BuildAction>
+   <TestAction
+      buildConfiguration = "Debug"
+      selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
+      selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
+      shouldUseLaunchSchemeArgsEnv = "YES"
+      shouldAutocreateTestPlan = "YES">
+   </TestAction>
+   <LaunchAction
+      buildConfiguration = "Debug"
+      selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
+      selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
+      launchStyle = "0"
+      useCustomWorkingDirectory = "NO"
+      ignoresPersistentStateOnLaunch = "NO"
+      debugDocumentVersioning = "YES"
+      debugServiceExtension = "internal"
+      allowLocationSimulation = "YES">
+      <BuildableProductRunnable
+         runnableDebuggingMode = "0">
+         <BuildableReference
+            BuildableIdentifier = "primary"
+            BlueprintIdentifier = "3251B18B2D952D1100DE1D2D"
+            BuildableName = "AIIM.app"
+            BlueprintName = "AIIM"
+            ReferencedContainer = "container:AIIM.xcodeproj">
+         </BuildableReference>
+      </BuildableProductRunnable>
+   </LaunchAction>
+   <ProfileAction
+      buildConfiguration = "Release"
+      shouldUseLaunchSchemeArgsEnv = "YES"
+      savedToolIdentifier = ""
+      useCustomWorkingDirectory = "NO"
+      debugDocumentVersioning = "YES">
+      <BuildableProductRunnable
+         runnableDebuggingMode = "0">
+         <BuildableReference
+            BuildableIdentifier = "primary"
+            BlueprintIdentifier = "3251B18B2D952D1100DE1D2D"
+            BuildableName = "AIIM.app"
+            BlueprintName = "AIIM"
+            ReferencedContainer = "container:AIIM.xcodeproj">
+         </BuildableReference>
+      </BuildableProductRunnable>
+   </ProfileAction>
+   <AnalyzeAction
+      buildConfiguration = "Debug">
+   </AnalyzeAction>
+   <ArchiveAction
+      buildConfiguration = "Release"
+      revealArchiveInOrganizer = "YES">
+   </ArchiveAction>
+</Scheme>

+ 10 - 0
AIIM.xcworkspace/contents.xcworkspacedata

@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<Workspace
+   version = "1.0">
+   <FileRef
+      location = "group:AIIM.xcodeproj">
+   </FileRef>
+   <FileRef
+      location = "group:Pods/Pods.xcodeproj">
+   </FileRef>
+</Workspace>

+ 8 - 0
AIIM/AIIM.entitlements

@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
+<plist version="1.0">
+<dict>
+	<key>aps-environment</key>
+	<string>development</string>
+</dict>
+</plist>

+ 8 - 0
AIIM/AIIM.xcdatamodeld/.xccurrentversion

@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
+<plist version="1.0">
+<dict>
+	<key>_XCCurrentVersionName</key>
+	<string>AIIM.xcdatamodel</string>
+</dict>
+</plist>

+ 4 - 0
AIIM/AIIM.xcdatamodeld/AIIM.xcdatamodel/contents

@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
+<model type="com.apple.IDECoreDataModeler.DataModel" documentVersion="1.0" lastSavedToolsVersion="1" systemVersion="11A491" minimumToolsVersion="Automatic" sourceLanguage="Objective-C" usedWithCloudKit="false" userDefinedModelVersionIdentifier="">
+    <elements/>
+</model>

+ 46 - 0
AIIM/AppDelegate.h

@@ -0,0 +1,46 @@
+//
+//  AppDelegate.h
+//  aiim
+//
+//  Created by gan on 2025/2/27.
+//
+
+#import <UIKit/UIKit.h>
+#import <CoreData/CoreData.h>
+#import "Controller/login/GLoginController.h"
+
+@class AppDelegate;
+static AppDelegate * _Nullable app = nil;
+
+@interface AppDelegate : UIResponder <UIApplicationDelegate>
+
+@property (readonly, strong) NSPersistentContainer * _Nullable persistentContainer;
+@property (nonatomic, strong) UIWindow * _Nullable window;
+@property (nonatomic) BOOL isLogin;
+@property (nonatomic, assign) BOOL shouldShowLock; // 是否需要显示锁屏
+@property (nonatomic, assign) BOOL isLock; // 标记是否为应用启动
+@property (nonatomic) BOOL NetReachable;
+
+
+@property (nonatomic) BOOL isJitsiMeet;
+
++ (id _Nullable )sharedInstance;
+
+-(BOOL)NetReachableState;
+
+-(void)startJSCall:(NSString *_Nonnull)chatId room:(NSString *_Nonnull)roomId isCaller:(BOOL)isCaller audioOnly:(BOOL)audioOnly;
+
+-(void)floadinSmWindow:(NSInteger )type;
+
+- (void)saveContext;
+
++(void)closeVoip;
+
++(void)JitsiMeetState:(BOOL)state;
+
++(void)unlockAPP;
+
++(void)changeFloadViewState:(BOOL)state;
+
+@end
+

+ 1105 - 0
AIIM/AppDelegate.m

@@ -0,0 +1,1105 @@
+//
+//  AppDelegate.m
+//  aiim
+//
+//  Created by gan on 2025/2/27.
+//
+
+#import "AppDelegate.h"
+#import "UDManager.h"
+#import <UserNotifications/UserNotifications.h>
+#import <PushKit/PushKit.h>
+#import "CallKit/CallKit.h"
+#import <netinet/in.h>
+#import <SystemConfiguration/SystemConfiguration.h>
+#import "UserNetApi.h"
+#import "CryptoAES.h"
+#import "GWebSocket.h"
+#import "GDBManager.h"
+#import "APPLocker.h"
+#import "JSGController.h"
+#import "LoginStateManager.h"
+
+#import "FloatingWindow.h"
+#import "ChatIndexController.h"
+#import "ChatController.h"
+#import "ChatListStore.h"
+#import "ChatsStore.h"
+
+#import "OSSManager.h"
+
+#import <Bugly/Bugly.h>
+
+
+@import JitsiMeetSDK;
+
+@interface AppDelegate ()<UNUserNotificationCenterDelegate,PKPushRegistryDelegate,CXProviderDelegate>
+@property (nonatomic, strong) CXProvider *callProvider;
+@property (nonatomic) NSUUID *uuid;
+@property (nonatomic) NSDictionary *msg;
+@property (strong, nonatomic) NSTimer *timer;
+@property (nonatomic) NSInteger timerActCount;
+@property (strong, nonatomic) NSString *bgMark;
+
+@property (nonatomic) BOOL isTokenCleared;
+
+@property (strong, nonatomic) FloatingWindow *floatWindow;
+@property (nonatomic, strong) JSGController * _Nullable jsyuyinctr;
+
+
+
+
+@property (nonatomic) BOOL isNotification;
+
+@end
+
+@implementation AppDelegate
+
+
+- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
+    // Override point for customization after application launch.
+    app = self;
+    BuglyConfig *config = [[BuglyConfig alloc] init];
+    config.reportLogLevel = BuglyLogLevelVerbose;
+    [Bugly startWithAppId:@"1d9e6b546a" config:config];
+    self.isJitsiMeet=false;
+    _isNotification=false;
+    self.shouldShowLock = YES;
+    self.bgMark=@"";
+    
+    
+    [self initJSMSDK];
+    [self setupListener];
+    [self checkLoginState:launchOptions];
+    [self registerPushright];
+    [self setupCallProvider];
+    [self initAliyunOss];
+    
+    _isTokenCleared=YES;
+    
+    _floatWindow = [[FloatingWindow alloc] initWithFrame:self.window.bounds];
+    [_floatWindow hide];
+    self.bgMark = @"";
+    
+    NSLog(@"didFinishLaunchingWithOptions------");
+    
+    
+    AVAudioSession *session = [AVAudioSession sharedInstance];
+    [session setCategory:AVAudioSessionCategoryPlayAndRecord mode:AVAudioSessionModeVoiceChat options:AVAudioSessionCategoryOptionAllowBluetooth | AVAudioSessionCategoryOptionAllowBluetoothA2DP | AVAudioSessionCategoryOptionAllowAirPlay error:nil];
+    [session setActive:YES error:nil];
+    
+    return YES;
+}
+
+
+
+
+-(void)applicationDidBecomeActive:(UIApplication *)application{
+    NSLog(@"applicationDidBecomeActive");
+   
+    if(self.isLogin){
+        [self sartWebsocket];
+        if(self.isJitsiMeet){
+            [_floatWindow viewInFload:0];
+        }
+        [self showLockScreen];
+        if(!_isNotification){
+            if ([[self.window jk_currentViewController] isKindOfClass:UITabBarController.class]){
+                UITabBarController * tabbarVc= (UITabBarController *)[self.window jk_currentViewController];
+                if (tabbarVc.selectedIndex==0) {
+                    ChatIndexController * chatListVc = tabbarVc.viewControllers[0];
+                    if (chatListVc) {
+                        [chatListVc reloadList];
+                    }
+                }
+            }
+            else{
+                [Bugly reportException:[NSException exceptionWithName:@"applicationDidBecomeActive1" reason:@"1" userInfo:nil]];
+                if ([[self.window jk_currentViewController] isKindOfClass:ChatController.class]) {
+                    ChatController * currentChatVc = (ChatController *)[self.window jk_currentViewController];
+                    [currentChatVc reloadAllData];
+                    [Bugly reportException:[NSException exceptionWithName:@"applicationDidBecomeActive2" reason:@"2" userInfo:nil]];
+                }
+            }
+        }
+    }
+    [self startTimer];
+    // 应用从后台返回前台时检查是否需要显示锁屏
+}
+-(void)applicationDidEnterBackground:(UIApplication *)application{
+    NSLog(@"applicationDidEnterBackground");
+    _isNotification=false;
+//    [self endWebsocket];
+    __block UIBackgroundTaskIdentifier bgTask = [application beginBackgroundTaskWithExpirationHandler:^{
+            [application endBackgroundTask:bgTask];
+            bgTask = UIBackgroundTaskInvalid;
+        }];
+        dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
+            // 在这里保持任务运行或等待事件,例如等待来电等。
+            [application endBackgroundTask:bgTask];
+            bgTask = UIBackgroundTaskInvalid;
+        });
+    // 应用进入后台时标记需要显示锁屏
+    
+    if(self.isJitsiMeet == YES){
+        [self.window endEditing:YES];
+    }
+    else{
+        if ([[APPLocker sharedLocker] isPasswordSet] && [[APPLocker sharedLocker] isLockEnabled]) {
+            self.shouldShowLock = YES;
+        }
+    }
+    [self endTimer];
+}
+
++ (instancetype)sharedInstance {
+    return app;
+}
+
+-(void)initJSMSDK{
+    
+    JitsiMeetConferenceOptions *defaultOptions
+        = [JitsiMeetConferenceOptions fromBuilder:^(JitsiMeetConferenceOptionsBuilder *builder) {
+            builder.serverURL = [NSURL URLWithString:JitsiMeetSV];
+            [builder setFeatureFlag:@"welcomepage.enabled" withBoolean:NO];
+            [builder setFeatureFlag:@"prejoinPage.enabled" withBoolean:NO];
+            //媒体流优化
+            builder.audioMuted = NO;  // 提前初始化音频模块
+            builder.videoMuted = NO;  // 提前初始化视频模块
+            //禁用非必要功能(减少初始化负载)
+            [builder setFeatureFlag:@"add-people.enabled" withBoolean:NO];
+            [builder setFeatureFlag:@"invite.enabled" withBoolean:NO];
+            [builder setFeatureFlag:@"live-streaming.enabled" withBoolean:NO];
+            [builder setFeatureFlag:@"video-share.enabled" withBoolean:NO];
+            [builder setFeatureFlag:@"call-integration.enabled" withBoolean:NO];
+            [builder setFeatureFlag:@"startWithAudioMuted" withBoolean:NO];
+            [builder setFeatureFlag:@"recording.enabled" withBoolean:NO];
+            [builder setFeatureFlag:@"kick-out.enabled" withBoolean:NO];
+            [builder setFeatureFlag:@"security-options.enabled" withBoolean:NO];
+            
+
+//
+//            //网络传输层加速
+//            [builder setConfigOverride:@"disableSimulcast" withBoolean:YES];
+//            [builder setFeatureFlag:@"reconnect.enabled" withBoolean:YES];
+//            [builder setFeatureFlag:@"websocket-keep-alive.enabled" withBoolean:YES];
+//            [builder setFeatureFlag:@"network-monitor.enabled" withBoolean:YES];
+//            [builder setConfigOverride:@"iceTransportPolicy" withValue:@"relay"];
+//            // 界面渲染加速
+//            [builder setFeatureFlag:@"filmstrip.enabled" withBoolean:NO];
+//            [builder setFeatureFlag:@"tile-view.enabled" withBoolean:NO];
+//            
+//            [builder setFeatureFlag:@"pip.enabled" withBoolean:NO];
+//            [builder setFeatureFlag:@"chat.enabled" withBoolean:NO];
+            [builder setConfigOverride:@"toolbarButtons" withArray:@[@"microphone",@"camera"]];
+        }];
+    [JitsiMeet sharedInstance].defaultConferenceOptions = defaultOptions;
+    UIStoryboard *board = [UIStoryboard storyboardWithName:@"Main" bundle:[NSBundle mainBundle]];
+    _jsyuyinctr = [board instantiateViewControllerWithIdentifier:@"JSGController"];
+    _jsyuyinctr.modalPresentationStyle = UIModalPresentationFullScreen;
+}
+
+-(void)setupListener{
+    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(onLoginSucc) name:nkonLoginSucc object:nil];
+    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(onLogoutSucc) name:nkonLogoutSucc object:nil];
+    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(addFriend) name:nkonAddFriendNote object:nil];;
+}
+
+- (void)application:(UIApplication *)application didFailToRegisterForRemoteNotificationsWithError:(NSError *)error {
+    NSLog(@"Failed to get token, error: %@", error);
+}
+
+//阿里云oss:https://abtimoss.oss-ap-southeast-1.aliyuncs.com
+//AccessKey ID
+//LTAI5tNoRjDRMuvnKBcop3hL
+//AccessKey Secret
+//kUoR7zqLafRYpcz3vJk1JHTvkRaaSl
+-(void)initAliyunOss{
+    [[OSSManager sharedManager] getOSSInfo];
+}
+
+
+
+#pragma mark push token voip token
+
+-(void)registerPushright{
+    // 请求推送权限
+    if (@available(iOS 10.0, *)) {
+            UNUserNotificationCenter *center = [UNUserNotificationCenter currentNotificationCenter];
+            center.delegate = self; // 设置代理以处理通知相关事件
+            [center requestAuthorizationWithOptions:(UNAuthorizationOptionBadge | UNAuthorizationOptionSound | UNAuthorizationOptionAlert | UNAuthorizationOptionProvidesAppNotificationSettings) completionHandler:^(BOOL granted, NSError * _Nullable error) {
+                if (granted) {
+                    // 用户授权成功
+                    dispatch_async(dispatch_get_main_queue(), ^{
+                        [[UIApplication sharedApplication] registerForRemoteNotifications];
+                    });
+                } else {
+                    // 用户授权失败
+                }
+            }];
+        } else {
+            // Fallback on earlier versions
+            [[UIApplication sharedApplication] registerUserNotificationSettings:[UIUserNotificationSettings settingsForTypes:(UIUserNotificationTypeSound | UIUserNotificationTypeAlert | UIUserNotificationTypeBadge) categories:nil]];
+            [[UIApplication sharedApplication] registerForRemoteNotifications];
+        }
+        PKPushRegistry *registry = [[PKPushRegistry alloc] initWithQueue:dispatch_get_main_queue()];
+        registry.delegate = self;
+        registry.desiredPushTypes = [NSSet setWithObject:PKPushTypeVoIP];
+    
+}
+
+
+- (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken {
+    // 将NSData转换为NSString以便于传输或存储
+   
+    NSRange range = NSMakeRange(0, 16); // 例如,从索引0开始,获取前10个字节
+    NSData *subData1 = [deviceToken subdataWithRange:range];
+    range = NSMakeRange(16, 16);
+    NSData *subData2 = [deviceToken subdataWithRange:range];
+    range = NSMakeRange(24, 32);
+    NSString *token1=[[subData1 description] substringWithRange:range];
+    NSString *token2=[[subData2 description] substringWithRange:range];
+    NSString *token = [NSString stringWithFormat:@"%@%@",token1,token2];
+    NSLog(@"%@",token);
+    // 将token发送到你的服务器或其他需要的地方
+    [UDManager.shareInstance setSDManager:token key:dkpushtoken];
+    NSString *bgMark = [NSString stringWithFormat:@"推送token:%ld",token.length];
+    [Bugly reportException:[NSException exceptionWithName:bgMark reason:@"" userInfo:nil]];
+    if(self.isLogin){
+        [self updivicetoken];
+    }
+}
+
+#pragma mark login sttate
+- (void)checkLoginState:(NSDictionary *)launchOptions{
+    [[LoginStateManager sharedManager] getUserInfo];
+    [LoginStateManager sharedManager].checkLoginState = ^(BOOL isLogin) {
+        if (isLogin) {
+            self.isLogin =TRUE;
+            
+            [self updivicetoken];
+            [self updiviceVoIPtoken];
+            [self sartWebsocket];
+            [self openFMDB];
+            [self openMainController];
+            // 检查是否需要显示启动锁屏
+            if ([[APPLocker sharedLocker] isPasswordSet] && [[APPLocker sharedLocker] isLockEnabled]) {
+                [self showLockScreen];
+            }
+            else{
+                self.shouldShowLock = NO;
+            }
+        }else{
+            [self openLoginController];
+        }
+    };
+}
+
+-(void)updivicetoken{
+    NSString *token =[UDManager.shareInstance getSDManager:dkpushtoken];
+    NSDictionary *usinfo = [UDManager.shareInstance getDDManager:dkuserinfo];
+    NSLog(@"dkpushtoken:%@",token);
+    NSDictionary *ud=@{
+        @"registrationId": token?:@"",
+        @"userId":usinfo[@"id"]?:@"",
+        @"platformType":@"i"
+    };
+    NSString *bgMark = [NSString stringWithFormat:@"上传推送token:%ld",token.length];
+    [Bugly reportException:[NSException exceptionWithName:bgMark reason:@"" userInfo:nil]];
+    [UserNetApi setUserinfo:ud succ:^(int code, NSDictionary * res) {
+        self->_isTokenCleared=NO;
+        NSData *jsonData = [NSJSONSerialization dataWithJSONObject:res options:0 error:nil];
+        if (!jsonData) {
+            NSLog(@"Got an error:");
+        } else {
+            NSString *jsonString = [[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding];
+            NSLog(@"%@", jsonString); // 输出:{"name":"John","age":25}
+        }
+    } fail:^(NSError * _Nonnull error) {
+        NSLog(@"--%@",error);
+    }];
+}
+-(void)updiviceVoIPtoken{
+    NSString *token =[UDManager.shareInstance getSDManager:dkvoiptoken];
+    NSDictionary *usinfo = [UDManager.shareInstance getDDManager:dkuserinfo];
+    NSLog(@"dkvoiptoken:%@",token);
+    NSString *bgMark = [NSString stringWithFormat:@"上传 voip 推送token:%ld",token.length];
+    [Bugly reportException:[NSException exceptionWithName:bgMark reason:@"" userInfo:nil]];
+    if([token isKindOfClass:[NSNull class]]){
+        return;
+    }
+    NSDictionary *ud=@{
+        @"voipTk": token?:@"",
+        @"userId":usinfo[@"id"]?:@"",
+        @"platformType":@"i"
+    };
+    
+    [UserNetApi setUserinfo:ud succ:^(int code, NSDictionary * res) {
+        NSLog(@"updiviceVoIPtoken:%@",[res description]);
+        self->_isTokenCleared=NO;
+    } fail:^(NSError * _Nonnull error) {
+        NSLog(@"--%@",error);
+    }];
+}
+
+- (void)addFriend{
+    NSLog(@"addFriend------------");
+    UITabBarController * tabbarVc = (UITabBarController *)self.window.rootViewController;
+    UITabBarItem *tabBarItem = tabbarVc.tabBar.items[1];
+    tabBarItem.badgeValue = @"";
+}
+
+- (void)exGroup{
+    NSLog(@"exGroup------------");
+    UITabBarController * tabbarVc = (UITabBarController *)self.window.rootViewController;
+    UITabBarItem *tabBarItem = tabbarVc.tabBar.items[2];
+    tabBarItem.badgeValue = @"";
+}
+
+- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler {
+    NSLog(@"Received notification: %@", userInfo);
+    
+    NSDictionary *temp =userInfo[@"imMsg"];
+    if(temp){
+        if ([temp jk_hasKey:@"addFriend"]) {
+            [self addFriend];
+        }
+        NSDictionary *msg =temp[@"message"];
+        NSString *msgtype=msg[@"msgtype"];
+        if([msgtype isEqualToString:@"close"]){
+            if(self.uuid!=nil){
+                NSString *fromId = self.msg[@"fromId"];
+                if ( [fromId isEqualToString:msg[@"fromId"]]) {
+                    
+                    [self.callProvider reportCallWithUUID:self.uuid endedAtDate:nil reason:CXCallEndedReasonDeclinedElsewhere];
+                    self.uuid = nil;
+                    self.msg =nil;
+                }
+            }
+        }
+    }
+    
+    // 处理推送消息,例如更新UI或处理数据等
+    completionHandler(UIBackgroundFetchResultNewData);
+}
+
+#pragma mark - PKPushRegistryDelegate
+- (void)pushRegistry:(PKPushRegistry *)registry didUpdatePushCredentials:(PKPushCredentials *)credentials forType:(NSString *)type {
+    // 处理推送凭证更新,例如保存 token 到服务器
+    NSLog(@"Credentials updated: %@", credentials.token);
+    NSData *deviceToken = (NSData *)credentials.token;
+    NSRange range = NSMakeRange(0, 16); // 例如,从索引0开始,获取前10个字节
+    NSData *subData1 = [deviceToken subdataWithRange:range];
+    range = NSMakeRange(16, 16);
+    NSData *subData2 = [deviceToken subdataWithRange:range];
+    range = NSMakeRange(24, 32);
+    //NSLog(@"subData1: %@",subData1);
+    //NSLog(@"subData2: %@",subData2);
+    NSString *token1=[[subData1 description] substringWithRange:range];
+    NSString *token2=[[subData2 description] substringWithRange:range];
+    NSString *token = [NSString stringWithFormat:@"%@%@",token1,token2];
+    NSLog(@"%@",token);
+     //将token发送到你的服务器或其他需要的地方
+    NSString *bgMark = [NSString stringWithFormat:@"voip token:%ld",token.length];
+    [Bugly reportException:[NSException exceptionWithName:bgMark reason:@"" userInfo:nil]];
+    [UDManager.shareInstance setSDManager:token key:dkvoiptoken];
+    if(self.isLogin){
+        [self updiviceVoIPtoken];
+    }
+}
+ 
+- (void)pushRegistry:(PKPushRegistry *)registry didReceiveIncomingPushWithPayload:(PKPushPayload *)payload forType:(PKPushType)type withCompletionHandler:(void (^)(void))completion{
+    
+    
+    
+    NSDictionary * temp =payload.dictionaryPayload;
+    temp =temp[@"business"];
+    temp=temp[@"incomingCallParams"];
+    NSString *name =temp[@"localizedCallerName"];
+    NSLog(@"name:%@",name);
+    
+    temp =payload.dictionaryPayload;
+    temp =temp[@"imMsg"];
+    if(self.uuid!=nil||self.isJitsiMeet){//通知对方正忙,功能需要补上
+        [self isBUSYNow:temp[@"message"]];
+        return;
+    }
+    self.msg = temp[@"message"];
+    NSLog(@"self.msg-----:%@",self.msg);
+    CXCallUpdate * callUpdate = [[CXCallUpdate alloc]init];
+    callUpdate.supportsGrouping = YES;
+    callUpdate.supportsDTMF = YES;
+    callUpdate.hasVideo = YES;
+    callUpdate.supportsHolding = YES;
+    [callUpdate setLocalizedCallerName:name];
+    CXHandle * handle = [[CXHandle alloc]initWithType:CXHandleTypePhoneNumber value:@""];
+    callUpdate.remoteHandle = handle;
+    self.uuid = [NSUUID UUID];
+    
+    [self.callProvider reportNewIncomingCallWithUUID:self.uuid update:callUpdate completion:^(NSError * _Nullable error) {
+        NSLog(@"%@",error);
+    }];
+    
+    completion();
+}
+
+-(void)isBUSYNow:(NSDictionary *)msg{
+    
+    NSDate *now = [NSDate date];
+    NSTimeInterval trt = [now timeIntervalSince1970];
+    NSInteger time = trt*1000;
+    NSString *strtime = [NSString stringWithFormat:@"%ld",(long)time];
+    NSDictionary *callMsg = @{
+        @"code":SendCode_WEBRTC_DFBUSY,
+        @"message": @{
+            @"chatId":msg[@"fromId"],
+            @"fromId":msg[@"chatId"],
+            @"type":@"0",
+            @"messageType":MessageType_DFBUSY,
+            @"timestamp":strtime,
+            @"payload":@""
+        }
+    };
+    NSError *error;
+    NSData *jsonData = [NSJSONSerialization dataWithJSONObject:callMsg options:0 error:&error];
+    if (!jsonData) {
+        NSLog(@"Got an error: %@", error);
+    } else {
+        NSString *jsonString = [[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding];
+        NSLog(@"%@", jsonString); // 输出: {"name":"John","age":25}
+        [GWebSocket.shareInstance sendMsg:jsonString];
+    }
+}
+
+#pragma mark - CXProviderDelegate Methods
+
+- (void)setupCallProvider {
+    
+    // 创建配置对象
+    CXProviderConfiguration *config = [[CXProviderConfiguration alloc] init];
+    config.supportsVideo = YES; // 是否支持视频通话
+    config.maximumCallGroups = 1; // 最大通话组数
+    config.maximumCallsPerCallGroup = 1; // 每个通话组的最大通话数
+    config.supportedHandleTypes = [[NSSet alloc] initWithObjects:[NSNumber numberWithInt:CXHandleTypeGeneric],[NSNumber numberWithInt:CXHandleTypePhoneNumber], nil];//[NSSet setWithArray:@[CXHandleTypePhoneNumber]]; // 支持的号码类型
+    config.iconTemplateImageData = UIImagePNGRepresentation([UIImage imageNamed:@"AppIcon"]); // 应用图标
+    config.ringtoneSound = @"ringtone.aiff"; // 铃声文件(可选)
+    
+    // 创建CXProvider实例
+    self.callProvider = [[CXProvider alloc] initWithConfiguration:config];
+    [self.callProvider setDelegate:self queue:nil];
+    //self.callRoomMap = [NSMutableDictionary dictionary];
+    
+    
+}
+
+- (void)providerDidReset:(CXProvider *)provider {
+    NSLog(@"Provider reset");
+}
+ 
+- (void)provider:(CXProvider *)provider performStartCallAction:(CXStartCallAction *)action {
+    // 开始通话的逻辑,如连接服务器等
+    NSLog(@"performStartCallAction:%@",action);
+    [action fulfill]; // 当通话开始时调用此方法完成action
+}
+
+-(void)provider:(CXProvider *)provider performAnswerCallAction:(CXAnswerCallAction *)action{
+    
+    
+    [self reciveVoip];
+    
+    //使用GCD创建一个在3秒后执行的定时器
+    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(2.0 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
+        NSLog(@"performAnswerCallAction:%@",action);
+        if ([UIApplication sharedApplication].applicationState == UIApplicationStateActive) {
+            // 应用已经解锁并且在前台
+            if(self.uuid){
+                
+                [self.callProvider reportCallWithUUID:self.uuid endedAtDate:nil reason:CXCallEndedReasonDeclinedElsewhere];
+                self.msg = nil;
+                self.uuid = nil;
+            }
+        }
+    });
+
+}
+-(void)provider:(CXProvider *)provider timedOutPerformingAction:(CXAction *)action{
+    
+    if (!self.uuid) {
+        return;
+    }
+    
+    [self.callProvider reportCallWithUUID:self.uuid endedAtDate:nil reason:CXCallEndedReasonDeclinedElsewhere];
+    self.msg = nil;
+    self.uuid = nil;
+    NSLog(@"timedOutPerformingAction:%@",action);
+}
+- (void)provider:(CXProvider *)provider performEndCallAction:(CXEndCallAction *)action {
+    // 挂断电话的逻辑,如断开服务器连接等
+    NSLog(@"performEndCallAction:%@",action);
+    NSDate *now = [NSDate date];
+    NSTimeInterval trt = [now timeIntervalSince1970];
+    NSInteger time = trt*1000;
+    NSString *strtime = [NSString stringWithFormat:@"%ld",(long)time];
+    NSDictionary *callMsg = @{
+        @"code":@"9",
+        @"message": @{
+            @"chatId":self.msg[@"fromId"],
+            @"fromId":self.msg[@"chatId"],
+            @"type":@"0",
+            @"msgtype":@"close",
+            @"timestamp":strtime,
+            @"payload":self.msg[@"payload"]
+        }
+    };
+    NSError *error;
+    NSData *jsonData = [NSJSONSerialization dataWithJSONObject:callMsg options:0 error:&error];
+    if (!jsonData) {
+        NSLog(@"Got an error: %@", error);
+    } else {
+        NSString *jsonString = [[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding];
+        NSLog(@"%@", jsonString); // 输出: {"name":"John","age":25}
+        [GWebSocket.shareInstance sendMsg:jsonString];
+    }
+    self.uuid = nil;
+    self.msg =nil;
+    
+    [action fulfill]; // 当通话结束时调用此方法完成action
+}
+
+-(void)reciveVoip{
+    NSLog(@"reciveVoip-------------1");
+    if(self.msg){
+        NSNumber *conetType = self.msg[@"conetType"];
+        NSLog(@"vidio:%@",self.msg[@"payload"]);
+        BOOL audioOnly = YES;
+        if(conetType.boolValue){
+            audioOnly = NO;
+        }
+        else{
+            audioOnly = YES;
+        }
+        
+        [self startJSCall:self.msg[@"fromId"] room:self.msg[@"payload"] isCaller:NO audioOnly:audioOnly];
+    }
+}
+
+//开启悬浮窗拨打方式
+-(void)startJSCall:(NSString *_Nonnull)chatId room:(NSString *_Nonnull)roomId isCaller:(BOOL)isCaller audioOnly:(BOOL)audioOnly{
+    
+    self.isJitsiMeet = YES;
+    if(_jsyuyinctr){
+        _jsyuyinctr.chatId = chatId.copy;
+        _jsyuyinctr.room = roomId.copy;
+        _jsyuyinctr.audioOnly = audioOnly;
+        _jsyuyinctr.isCaller = isCaller;
+    }
+    else{
+        UIStoryboard *board = [UIStoryboard storyboardWithName:@"Main" bundle:[NSBundle mainBundle]];
+        _jsyuyinctr = [board instantiateViewControllerWithIdentifier:@"JSGController"];
+        _jsyuyinctr.modalPresentationStyle = UIModalPresentationFullScreen;
+        _jsyuyinctr.chatId = chatId.copy;
+        _jsyuyinctr.room = roomId.copy;
+        _jsyuyinctr.audioOnly = audioOnly;
+        _jsyuyinctr.isCaller = isCaller;
+    }
+    NSLog(@"startJSCall roomId:%@",roomId);
+    [_floatWindow showView:_jsyuyinctr.view];
+    [_jsyuyinctr startJitsiMeetCall];
+    [[UIApplication sharedApplication] sendAction:@selector(resignFirstResponder) to:nil from:nil forEvent:nil];
+}
+
+-(void)floadinSmWindow:(NSInteger )type{
+    if(type!=0){
+        [_floatWindow viewInFload:type];
+    }
+    
+}
+
++(void)closeVoip{
+    if(app.uuid!=nil){
+        [app.callProvider reportCallWithUUID:app.uuid endedAtDate:nil reason:CXCallEndedReasonDeclinedElsewhere];
+        app.uuid = nil;
+        app.msg =nil;
+    }
+}
+
++(void)JitsiMeetState:(BOOL)state{
+    app.isJitsiMeet=state;
+    if(!state){
+        if(app.shouldShowLock){
+            [app showLockScreen];
+        }
+        else{
+            [app.floatWindow hide];
+        }
+    }
+}
++(void)unlockAPP{
+    app.shouldShowLock=NO;
+}
+
++(void)changeFloadViewState:(BOOL)state{
+    if (state) {
+        [app.floatWindow hide];
+    }
+    else{
+        if ([[APPLocker sharedLocker] isPasswordSet] && [[APPLocker sharedLocker] isLockEnabled]) {
+            [app.floatWindow show:1];
+        }
+    }
+}
+
+#pragma mark 用户点击消息推送或滑动
+- (void)userNotificationCenter:(UNUserNotificationCenter *)center didReceiveNotificationResponse:(UNNotificationResponse *)response withCompletionHandler:(void(^)(void))completionHandler {
+    
+    // 处理用户对通知的响应(点击、滑动等)
+    if ([response.actionIdentifier isEqualToString:UNNotificationDefaultActionIdentifier]) {
+        // 用户点击了通知
+        NSDictionary *userInfo = response.notification.request.content.userInfo;
+        [self handleNotification:userInfo];
+        NSLog(@"userInfo: %@", userInfo);
+    } else if ([response.actionIdentifier isEqualToString:@"customActionIdentifier"]) {
+        // 处理自定义动作(如果有的话)
+    }
+    completionHandler(); // 调用完成处理程序以结束操作
+}
+
+
+- (void)handleNotification:(NSDictionary *)userInfo {
+    NSDictionary * tempDict = userInfo[@"imMsg"];
+    NSDictionary * imMsg = tempDict[@"message"];
+    _isNotification=true;
+    NSMutableDictionary * mutablemsg = imMsg.mutableCopy;
+    NSLog(@"------mutablemsg:%@",mutablemsg);
+    NSDictionary * user = [UDManager.shareInstance getDDManager:dkuserinfo];
+    if([user[@"id"] isEqual:imMsg[@"fromId"]]){
+        [mutablemsg setObject:@"true" forKey:@"mine"];
+    }else{
+        if([Friendchat isEqual:imMsg[@"type"]]){
+            [mutablemsg setObject:imMsg[@"fromId"] forKey:@"chatId"];
+        }
+    }
+    
+    if (imMsg) {
+        if (![LoginStateManager sharedManager].isLoggedIn) {
+            return;
+        }
+        
+        if ([imMsg jk_hasKey:@"addFriend"]) {
+            return;
+        }
+        
+        
+        NSString *strtype = mutablemsg[@"type"];
+        NSInteger type = [strtype integerValue];
+        NSString *chatId = mutablemsg[@"chatId"];
+        NSString *titlename = mutablemsg[@"fromName"]?:@"";
+        NSString *avatar = mutablemsg[@"fromAvatar"]?:@"";
+        
+        
+//        NSLog(@"top className:%@",[[self.window jk_topMostController] class]);
+//        NSLog(@"current className:%@",[[self.window jk_currentViewController] class]);
+        if ([[self.window jk_currentViewController] isKindOfClass:ChatController.class]) {
+            ChatController * currentChatVc = (ChatController *)[self.window jk_currentViewController];
+            if (![currentChatVc.chatId isEqualToString:mutablemsg[@"chatId"]]) {
+                currentChatVc.chatId = chatId;
+                currentChatVc.type = type;
+                currentChatVc.titlename = titlename;
+                currentChatVc.avatar = avatar;
+                [currentChatVc reloadAllData];
+                return;
+            }
+            else{
+                currentChatVc.chatId = chatId;
+                currentChatVc.type = type;
+                currentChatVc.titlename = titlename;
+                currentChatVc.avatar = avatar;
+                [currentChatVc reloadAllData];
+                return;
+            }
+        }
+        
+        UIStoryboard *board = [UIStoryboard storyboardWithName:@"Main" bundle:[NSBundle mainBundle]];
+        ChatController *chatctr = [board instantiateViewControllerWithIdentifier:@"ChatController"];
+        UINavigationController *uiNavC = [[UINavigationController alloc] initWithRootViewController:chatctr];
+        uiNavC.modalPresentationStyle = UIModalPresentationFullScreen;
+        chatctr.chatId = chatId;
+        chatctr.type = type;
+        chatctr.titlename = titlename;
+        chatctr.avatar = avatar;
+        UITabBarController * tabbarVc = (UITabBarController *)self.window.rootViewController;
+        ChatIndexController * chatListVc = tabbarVc.viewControllers[0];
+        if (chatListVc) {
+            [chatListVc presentViewController:uiNavC animated:YES completion:nil];
+        }
+    }
+}
+
+#pragma mark -user state and note
+
+-(void)onLoginSucc{
+    self.isLogin =TRUE;
+    [self openFMDB];
+    [self openMainController];
+    [self updivicetoken];
+    [self updiviceVoIPtoken];
+    [self sartWebsocket];
+}
+-(void)onLogoutSucc{
+    self.isLogin =false;
+    NSLog(@"1-----------------1");
+//        [GDBManager.shareInstance delLocalmsglistTable:userid];
+//        [GDBManager.shareInstance delchatlistTable:nil fail:nil];
+//        [GDBManager.shareInstance deleteDB];
+    [UDManager.shareInstance removeUDManager:gkeytoken];
+    [UDManager.shareInstance removeUDManager:dkuserloginId];
+    [UDManager.shareInstance removeUDManager:dkuserinfo];
+    [UDManager.shareInstance removeUDManager:dkuserId];
+    [self clearVoipToken];
+    [self openLoginController];
+    [self endWebsocket];
+}
+
+-(void)clearVoipToken{
+    
+    NSString *voiptoken = [UDManager.shareInstance getSDManager:dkvoiptoken];
+    NSLog(@"voiptoken:%@",voiptoken);
+    if([voiptoken isKindOfClass:[NSString class]]&&voiptoken.length>10){
+        NSDictionary *dic = @{
+            @"voipTk":voiptoken
+        };
+        [UserNetApi clearVoipTk:dic succ:^(int code, NSDictionary * res) {
+            NSLog(@"clearVoipTk:%@",res);
+            self->_isTokenCleared=YES;
+        } fail:^(NSError * _Nonnull error) {
+            
+        }];
+    }
+    
+    NSString *pushtoken = [UDManager.shareInstance getSDManager:dkpushtoken];
+    NSLog(@"voiptoken:%@",pushtoken);
+    if([pushtoken isKindOfClass:[NSString class]]&&pushtoken.length>10){
+        NSDictionary *dic = @{
+            @"registrationId":pushtoken
+        };
+        [UserNetApi clearRegistrationId:dic succ:^(int code, NSDictionary * res) {
+            NSLog(@"clearRegistrationId:%@",res);
+            self->_isTokenCleared=YES;
+        } fail:^(NSError * _Nonnull error) {
+            
+        }];
+    }
+}
+
+
+
+#pragma mark mainControllor Manager
+-(void)openMainController{
+    NSLog(@"openMainController");
+    UIStoryboard *board = [UIStoryboard storyboardWithName:@"Main" bundle:[NSBundle mainBundle]];
+    UITabBarController *tbc = [board instantiateViewControllerWithIdentifier:@"GTabBarController"];
+    //UINavigationController *nav = [[UINavigationController alloc] initWithRootViewController:tbc];
+    NSArray *ctrs = tbc.viewControllers;
+    //------------1
+    UIViewController *time = ctrs[0];
+    // 创建一个新的 UITabBarItem
+    UIImage *index = [[UIImage imageNamed:@"index"] imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal];
+    UIImage *index_cur = [[UIImage imageNamed:@"index_cur"] imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal];
+    UITabBarItem *tabBarItem = [[UITabBarItem alloc] initWithTitle:NSLocalizedString(@"TabBarItem1", @"")
+                                                             image:index
+                                                     selectedImage:index_cur];
+    // 设置标签文本
+    tabBarItem.title = NSLocalizedString(@"TabBarItem1", @"");
+     
+    // 设置标签的文本颜色
+    [tabBarItem setTitleTextAttributes:@{NSForegroundColorAttributeName : [UIColor whiteColor]} forState:UIControlStateNormal];
+    [tabBarItem setTitleTextAttributes:@{NSForegroundColorAttributeName : [UIColor whiteColor]} forState:UIControlStateSelected];
+    [time setTabBarItem:tabBarItem];
+    //----------------2
+    time = ctrs[1];
+    // 创建一个新的 UITabBarItem
+    UIImage *index1 = [[UIImage imageNamed:@"txl"] imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal];
+    UIImage *index_cur1 = [[UIImage imageNamed:@"txl_cur"] imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal];
+    UITabBarItem *tabBarItem1 = [[UITabBarItem alloc] initWithTitle:NSLocalizedString(@"TabBarItem2", @"")
+                                                             image:index1
+                                                     selectedImage:index_cur1];
+    // 设置标签文本
+    tabBarItem1.title = NSLocalizedString(@"TabBarItem2", @"");
+     
+    // 设置标签的文本颜色
+    [tabBarItem1 setTitleTextAttributes:@{NSForegroundColorAttributeName : [UIColor whiteColor]} forState:UIControlStateNormal];
+    [tabBarItem1 setTitleTextAttributes:@{NSForegroundColorAttributeName : [UIColor whiteColor]} forState:UIControlStateSelected];
+    [time setTabBarItem:tabBarItem1];
+    //------------------3
+    time = ctrs[2];
+    // 创建一个新的 UITabBarItem
+    UIImage *index2 = [[UIImage imageNamed:@"qunzu"] imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal];
+    UIImage *index_cur2 = [[UIImage imageNamed:@"qunzu_cur"] imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal];
+    UITabBarItem *tabBarItem2 = [[UITabBarItem alloc] initWithTitle:NSLocalizedString(@"TabBarItem3", @"")
+                                                             image:index2
+                                                     selectedImage:index_cur2];
+    // 设置标签文本
+    tabBarItem2.title = NSLocalizedString(@"TabBarItem3", @"");
+     
+    // 设置标签的文本颜色
+    [tabBarItem2 setTitleTextAttributes:@{NSForegroundColorAttributeName : [UIColor whiteColor]} forState:UIControlStateNormal];
+    [tabBarItem2 setTitleTextAttributes:@{NSForegroundColorAttributeName : [UIColor whiteColor]} forState:UIControlStateSelected];
+    [time setTabBarItem:tabBarItem2];
+    //------------------4
+    time = ctrs[3];
+    // 创建一个新的 UITabBarItem
+    UIImage *index3 = [[UIImage imageNamed:@"wode"] imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal];
+    UIImage *index_cur3 = [[UIImage imageNamed:@"wode_cur"] imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal];
+    UITabBarItem *tabBarItem3 = [[UITabBarItem alloc] initWithTitle:NSLocalizedString(@"TabBarItem4", @"")
+                                                             image:index3
+                                                     selectedImage:index_cur3];
+    // 设置标签文本
+    tabBarItem3.title = NSLocalizedString(@"TabBarItem4", @"");
+     
+    // 设置标签的文本颜色
+    [tabBarItem3 setTitleTextAttributes:@{NSForegroundColorAttributeName : [UIColor whiteColor]} forState:UIControlStateNormal];
+    [tabBarItem3 setTitleTextAttributes:@{NSForegroundColorAttributeName : [UIColor whiteColor]} forState:UIControlStateSelected];
+    [time setTabBarItem:tabBarItem3];
+    
+    
+    self.window.rootViewController = tbc;
+}
+-(void)openLoginController{
+    UIStoryboard *board = [UIStoryboard storyboardWithName:@"Main" bundle:[NSBundle mainBundle]];
+    GLoginController *login = [board instantiateViewControllerWithIdentifier:@"LoginController"];
+    UINavigationController *nav = [[UINavigationController alloc] initWithRootViewController:login];
+    self.window.rootViewController = nav;
+}
+
+
+#pragma mark openSocket
+
+-(void)sartWebsocket{
+    NSLog(@"----------------sartWebsocket");
+    [[GWebSocket shareInstance] connectWebSocket];
+}
+
+-(void)endWebsocket{
+    [[GWebSocket shareInstance] closeWebSocket];
+}
+
+#pragma mark init DB
+-(void)openFMDB{
+    [GDBManager.shareInstance createDatabase:^(NSArray * _Nullable array) {
+        [GDBManager.shareInstance createLocalMSGtable:^(NSArray * _Nullable array) {
+        } fail:^(NSString * _Nullable error) {
+        }];
+        [GDBManager.shareInstance createChattable:^(NSArray * _Nullable array) {
+        } fail:^(NSString * _Nullable error) {
+        }];
+        [GDBManager.shareInstance createLastreadtimetable:^(NSArray * _Nullable array) {
+        } fail:^(NSString * _Nullable error) {
+        }];
+    } fail:^(NSString * _Nullable error) {
+        
+    }];
+}
+
+
+#pragma mark - UISceneSession lifecycle
+
+
+//- (UISceneConfiguration *)application:(UIApplication *)application configurationForConnectingSceneSession:(UISceneSession *)connectingSceneSession options:(UISceneConnectionOptions *)options {
+//    // Called when a new scene session is being created.
+//    // Use this method to select a configuration to create the new scene with.
+//    return [[UISceneConfiguration alloc] initWithName:@"Default Configuration" sessionRole:connectingSceneSession.role];
+//}
+//
+//
+//- (void)application:(UIApplication *)application didDiscardSceneSessions:(NSSet<UISceneSession *> *)sceneSessions {
+//    // Called when the user discards a scene session.
+//    // If any sessions were discarded while the application was not running, this will be called shortly after application:didFinishLaunchingWithOptions.
+//    // Use this method to release any resources that were specific to the discarded scenes, as they will not return.
+//}
+
+
+#pragma mark - Core Data stack
+
+@synthesize persistentContainer = _persistentContainer;
+
+- (NSPersistentContainer *)persistentContainer {
+    // The persistent container for the application. This implementation creates and returns a container, having loaded the store for the application to it.
+    @synchronized (self) {
+        if (_persistentContainer == nil) {
+            _persistentContainer = [[NSPersistentContainer alloc] initWithName:@"555IM"];
+            [_persistentContainer loadPersistentStoresWithCompletionHandler:^(NSPersistentStoreDescription *storeDescription, NSError *error) {
+                if (error != nil) {
+                    // Replace this implementation with code to handle the error appropriately.
+                    // abort() causes the application to generate a crash log and terminate. You should not use this function in a shipping application, although it may be useful during development.
+                    
+                    /*
+                     Typical reasons for an error here include:
+                     * The parent directory does not exist, cannot be created, or disallows writing.
+                     * The persistent store is not accessible, due to permissions or data protection when the device is locked.
+                     * The device is out of space.
+                     * The store could not be migrated to the current model version.
+                     Check the error message to determine what the actual problem was.
+                    */
+                    NSLog(@"Unresolved error %@, %@", error, error.userInfo);
+                    abort();
+                }
+            }];
+        }
+    }
+    
+    return _persistentContainer;
+}
+
+#pragma mark - Core Data Saving support
+
+- (void)saveContext {
+    NSManagedObjectContext *context = self.persistentContainer.viewContext;
+    NSError *error = nil;
+    if ([context hasChanges] && ![context save:&error]) {
+        // Replace this implementation with code to handle the error appropriately.
+        // abort() causes the application to generate a crash log and terminate. You should not use this function in a shipping application, although it may be useful during development.
+        NSLog(@"Unresolved error %@, %@", error, error.userInfo);
+        abort();
+    }
+}
+
+#pragma mark 检测网络状态
+
+#pragma mark 定时服务
+-(void)startTimer{
+    _timerActCount=0;
+    if(self.timer){
+        return;
+    }
+    self.timer = [NSTimer scheduledTimerWithTimeInterval:10 target:self selector:@selector(TimerAction) userInfo:nil repeats:YES];
+    [self.timer setFireDate:[NSDate distantPast]];
+    [[NSRunLoop currentRunLoop] addTimer:_timer forMode:NSRunLoopCommonModes];
+}
+
+-(void)endTimer{
+    [self.timer invalidate];
+    self.timer = nil;
+}
+
+-(void)TimerAction{
+    _timerActCount=_timerActCount+1;
+    if(_timerActCount<3){
+        return;
+    }
+    _timerActCount=0;
+//    NSLog(@"111222222");
+    if(![self isNetworkAvailable]){
+        if(self.isLogin){
+            [self onLogoutSucc];
+        }
+    }
+    else{
+        if(!self.isLogin){
+            if (!_isTokenCleared) {
+                [self clearVoipToken];
+            }
+        }
+    }
+}
+
+
+-(BOOL)isNetworkAvailable{
+    struct sockaddr_in zeroAddress;
+    bzero(&zeroAddress, sizeof(zeroAddress));
+    zeroAddress.sin_len = sizeof(zeroAddress);
+    zeroAddress.sin_family = AF_INET;
+    SCNetworkReachabilityRef reachability = SCNetworkReachabilityCreateWithAddress(kCFAllocatorDefault, (const struct sockaddr *)&zeroAddress);
+    if (reachability != NULL) {
+        SCNetworkReachabilityFlags flags;
+        
+        if (SCNetworkReachabilityGetFlags(reachability, &flags)) {
+            BOOL isReachable = ((flags & kSCNetworkFlagsReachable) != 0);
+            BOOL needsConnection = ((flags & kSCNetworkFlagsConnectionRequired) != 0);
+            
+            BOOL isWWAN = (flags & kSCNetworkReachabilityFlagsIsWWAN) != 0;
+            if(isWWAN){
+                NSLog(@"isWWAN:1----------");
+            }
+            else{
+                NSLog(@"isWWAN:2----------");
+            }
+            
+            
+            if ((isReachable && !needsConnection)) {
+                // 网络是可用的,无需连接
+//                NSLog(@"网络是可用的,无需连接");
+                _NetReachable=YES;
+                return YES;
+            } else if ((isReachable && needsConnection)) {
+                // 网络是可用的,需要连接(例如蜂窝数据或WiFi)
+//                NSLog(@"网络是可用的,需要连接(例如蜂窝数据或WiFi)");
+                _NetReachable=YES;
+                return YES; // 根据实际需求决定是否返回YES或NO,这里仅为示例返回YES
+            } else {
+                // 网络不可用或无法确定状态
+//                NSLog(@"网络不可用或无法确定状态");
+                _NetReachable=NO;
+                return NO;
+            }
+        } else {
+            // 无法获取网络状态标志
+//            NSLog(@"无法获取网络状态标志");
+            _NetReachable=NO;
+            return NO; // 根据实际需求处理错误情况
+        }
+    } else {
+        // 无法创建reachability对象,可能是因为参数错误等
+//        NSLog(@"无法创建reachability对象,可能是因为参数错误等");
+        _NetReachable=NO;
+        return NO; // 根据实际需求处理错误情况
+    }
+}
+
+-(BOOL)NetReachableState{
+    return _NetReachable;
+}
+
+#pragma mark applock
+- (void)showLockScreen {
+    // 确保在主线程执行
+    if (self.shouldShowLock && [[APPLocker sharedLocker] isPasswordSet] && [[APPLocker sharedLocker] isLockEnabled]) {
+        NSLog(@"showLockScreen--------------1");
+        if (self.isJitsiMeet) {
+            [_floatWindow viewInFload:0];
+            return;
+        }
+        else{
+            [_floatWindow show:1];
+        }
+        return;
+    }
+    
+    if (!self.isJitsiMeet) {
+        [_floatWindow hide];
+    }
+}
+
+- (void)continueAppInitializationAfterUnlock {
+    // 这里可以添加解锁后需要执行的初始化代码
+    NSLog(@"应用锁验证通过,继续应用初始化");
+    
+    // 例如:加载主界面数据、初始化服务等
+    [self openMainController];
+}
+
+- (void)continueWithSecurity{
+    NSLog(@"-----安全登录成功-----");
+    [self onLoginSucc];
+}
+
+
+- (void)clearApplicationBadge {
+    dispatch_async(dispatch_get_main_queue(), ^{
+        [UIApplication sharedApplication].applicationIconBadgeNumber = 1; // 先设置为1
+        [UIApplication sharedApplication].applicationIconBadgeNumber = 0; // 再设置为0
+        // 这个技巧可以确保某些情况下角标被正确清除
+    });
+}
+
+
+@end

BIN
AIIM/Assets.xcassets/AppIcon.appiconset/515.png


BIN
AIIM/Assets.xcassets/AppIcon.appiconset/525 1.png


BIN
AIIM/Assets.xcassets/AppIcon.appiconset/525.png


+ 38 - 0
AIIM/Assets.xcassets/AppIcon.appiconset/Contents.json

@@ -0,0 +1,38 @@
+{
+  "images" : [
+    {
+      "filename" : "525.png",
+      "idiom" : "universal",
+      "platform" : "ios",
+      "size" : "1024x1024"
+    },
+    {
+      "appearances" : [
+        {
+          "appearance" : "luminosity",
+          "value" : "dark"
+        }
+      ],
+      "filename" : "525 1.png",
+      "idiom" : "universal",
+      "platform" : "ios",
+      "size" : "1024x1024"
+    },
+    {
+      "appearances" : [
+        {
+          "appearance" : "luminosity",
+          "value" : "tinted"
+        }
+      ],
+      "filename" : "515.png",
+      "idiom" : "universal",
+      "platform" : "ios",
+      "size" : "1024x1024"
+    }
+  ],
+  "info" : {
+    "author" : "xcode",
+    "version" : 1
+  }
+}

BIN
AIIM/Assets.xcassets/Avatar.imageset/Avatar.png


+ 21 - 0
AIIM/Assets.xcassets/Avatar.imageset/Contents.json

@@ -0,0 +1,21 @@
+{
+  "images" : [
+    {
+      "filename" : "Avatar.png",
+      "idiom" : "universal",
+      "scale" : "1x"
+    },
+    {
+      "idiom" : "universal",
+      "scale" : "2x"
+    },
+    {
+      "idiom" : "universal",
+      "scale" : "3x"
+    }
+  ],
+  "info" : {
+    "author" : "xcode",
+    "version" : 1
+  }
+}

BIN
AIIM/Assets.xcassets/Avatar0.imageset/Avatar0.png


+ 21 - 0
AIIM/Assets.xcassets/Avatar0.imageset/Contents.json

@@ -0,0 +1,21 @@
+{
+  "images" : [
+    {
+      "filename" : "Avatar0.png",
+      "idiom" : "universal",
+      "scale" : "1x"
+    },
+    {
+      "idiom" : "universal",
+      "scale" : "2x"
+    },
+    {
+      "idiom" : "universal",
+      "scale" : "3x"
+    }
+  ],
+  "info" : {
+    "author" : "xcode",
+    "version" : 1
+  }
+}

+ 6 - 0
AIIM/Assets.xcassets/Call/Contents.json

@@ -0,0 +1,6 @@
+{
+  "info" : {
+    "author" : "xcode",
+    "version" : 1
+  }
+}

+ 21 - 0
AIIM/Assets.xcassets/Call/hangup_icon.imageset/Contents.json

@@ -0,0 +1,21 @@
+{
+  "images" : [
+    {
+      "filename" : "hangup_icon.png",
+      "idiom" : "universal",
+      "scale" : "1x"
+    },
+    {
+      "idiom" : "universal",
+      "scale" : "2x"
+    },
+    {
+      "idiom" : "universal",
+      "scale" : "3x"
+    }
+  ],
+  "info" : {
+    "author" : "xcode",
+    "version" : 1
+  }
+}

BIN
AIIM/Assets.xcassets/Call/hangup_icon.imageset/hangup_icon.png


+ 21 - 0
AIIM/Assets.xcassets/Call/hangup_icon_blue.imageset/Contents.json

@@ -0,0 +1,21 @@
+{
+  "images" : [
+    {
+      "filename" : "hangup_icon_blue.png",
+      "idiom" : "universal",
+      "scale" : "1x"
+    },
+    {
+      "idiom" : "universal",
+      "scale" : "2x"
+    },
+    {
+      "idiom" : "universal",
+      "scale" : "3x"
+    }
+  ],
+  "info" : {
+    "author" : "xcode",
+    "version" : 1
+  }
+}

BIN
AIIM/Assets.xcassets/Call/hangup_icon_blue.imageset/hangup_icon_blue.png


+ 23 - 0
AIIM/Assets.xcassets/Call/huazhonghua_icon.imageset/Contents.json

@@ -0,0 +1,23 @@
+{
+  "images" : [
+    {
+      "filename" : "huazhonghua 1.png",
+      "idiom" : "universal",
+      "scale" : "1x"
+    },
+    {
+      "filename" : "huazhonghua.png",
+      "idiom" : "universal",
+      "scale" : "2x"
+    },
+    {
+      "filename" : "huazhonghua 2.png",
+      "idiom" : "universal",
+      "scale" : "3x"
+    }
+  ],
+  "info" : {
+    "author" : "xcode",
+    "version" : 1
+  }
+}

BIN
AIIM/Assets.xcassets/Call/huazhonghua_icon.imageset/huazhonghua 1.png


BIN
AIIM/Assets.xcassets/Call/huazhonghua_icon.imageset/huazhonghua 2.png


BIN
AIIM/Assets.xcassets/Call/huazhonghua_icon.imageset/huazhonghua.png


+ 21 - 0
AIIM/Assets.xcassets/Call/mic_off_icon.imageset/Contents.json

@@ -0,0 +1,21 @@
+{
+  "images" : [
+    {
+      "filename" : "mic_off_icon.png",
+      "idiom" : "universal",
+      "scale" : "1x"
+    },
+    {
+      "idiom" : "universal",
+      "scale" : "2x"
+    },
+    {
+      "idiom" : "universal",
+      "scale" : "3x"
+    }
+  ],
+  "info" : {
+    "author" : "xcode",
+    "version" : 1
+  }
+}

BIN
AIIM/Assets.xcassets/Call/mic_off_icon.imageset/mic_off_icon.png


+ 21 - 0
AIIM/Assets.xcassets/Call/mic_on_icon.imageset/Contents.json

@@ -0,0 +1,21 @@
+{
+  "images" : [
+    {
+      "filename" : "mic_on_icon.png",
+      "idiom" : "universal",
+      "scale" : "1x"
+    },
+    {
+      "idiom" : "universal",
+      "scale" : "2x"
+    },
+    {
+      "idiom" : "universal",
+      "scale" : "3x"
+    }
+  ],
+  "info" : {
+    "author" : "xcode",
+    "version" : 1
+  }
+}

BIN
AIIM/Assets.xcassets/Call/mic_on_icon.imageset/mic_on_icon.png


+ 21 - 0
AIIM/Assets.xcassets/Call/speaker_off_icon.imageset/Contents.json

@@ -0,0 +1,21 @@
+{
+  "images" : [
+    {
+      "filename" : "speaker_off_icon.png",
+      "idiom" : "universal",
+      "scale" : "1x"
+    },
+    {
+      "idiom" : "universal",
+      "scale" : "2x"
+    },
+    {
+      "idiom" : "universal",
+      "scale" : "3x"
+    }
+  ],
+  "info" : {
+    "author" : "xcode",
+    "version" : 1
+  }
+}

BIN
AIIM/Assets.xcassets/Call/speaker_off_icon.imageset/speaker_off_icon.png


+ 21 - 0
AIIM/Assets.xcassets/Call/speaker_on_icon.imageset/Contents.json

@@ -0,0 +1,21 @@
+{
+  "images" : [
+    {
+      "filename" : "speaker_on_icon.png",
+      "idiom" : "universal",
+      "scale" : "1x"
+    },
+    {
+      "idiom" : "universal",
+      "scale" : "2x"
+    },
+    {
+      "idiom" : "universal",
+      "scale" : "3x"
+    }
+  ],
+  "info" : {
+    "author" : "xcode",
+    "version" : 1
+  }
+}

BIN
AIIM/Assets.xcassets/Call/speaker_on_icon.imageset/speaker_on_icon.png


+ 23 - 0
AIIM/Assets.xcassets/Cdacha.imageset/Contents.json

@@ -0,0 +1,23 @@
+{
+  "images" : [
+    {
+      "filename" : "添加 on.png",
+      "idiom" : "universal",
+      "scale" : "1x"
+    },
+    {
+      "filename" : "添加 on@2x.png",
+      "idiom" : "universal",
+      "scale" : "2x"
+    },
+    {
+      "filename" : "添加 on@3x.png",
+      "idiom" : "universal",
+      "scale" : "3x"
+    }
+  ],
+  "info" : {
+    "author" : "xcode",
+    "version" : 1
+  }
+}

BIN
AIIM/Assets.xcassets/Cdacha.imageset/添加 on.png


BIN
AIIM/Assets.xcassets/Cdacha.imageset/添加 on@2x.png


BIN
AIIM/Assets.xcassets/Cdacha.imageset/添加 on@3x.png


BIN
AIIM/Assets.xcassets/Cjiahao.imageset/Cjiahao.png


BIN
AIIM/Assets.xcassets/Cjiahao.imageset/Cjiahao@2x.png


BIN
AIIM/Assets.xcassets/Cjiahao.imageset/Cjiahao@3x.png


+ 23 - 0
AIIM/Assets.xcassets/Cjiahao.imageset/Contents.json

@@ -0,0 +1,23 @@
+{
+  "images" : [
+    {
+      "filename" : "Cjiahao.png",
+      "idiom" : "universal",
+      "scale" : "1x"
+    },
+    {
+      "filename" : "Cjiahao@2x.png",
+      "idiom" : "universal",
+      "scale" : "2x"
+    },
+    {
+      "filename" : "Cjiahao@3x.png",
+      "idiom" : "universal",
+      "scale" : "3x"
+    }
+  ],
+  "info" : {
+    "author" : "xcode",
+    "version" : 1
+  }
+}

BIN
AIIM/Assets.xcassets/Cjiahao.imageset/添加.png


BIN
AIIM/Assets.xcassets/Cjiahao.imageset/添加@2x.png


BIN
AIIM/Assets.xcassets/Cjiahao.imageset/添加@3x.png


+ 6 - 0
AIIM/Assets.xcassets/Contents.json

@@ -0,0 +1,6 @@
+{
+  "info" : {
+    "author" : "xcode",
+    "version" : 1
+  }
+}

+ 23 - 0
AIIM/Assets.xcassets/Cpaissc.imageset/Contents.json

@@ -0,0 +1,23 @@
+{
+  "images" : [
+    {
+      "filename" : "拍摄.png",
+      "idiom" : "universal",
+      "scale" : "1x"
+    },
+    {
+      "filename" : "拍摄@2x.png",
+      "idiom" : "universal",
+      "scale" : "2x"
+    },
+    {
+      "filename" : "拍摄@3x.png",
+      "idiom" : "universal",
+      "scale" : "3x"
+    }
+  ],
+  "info" : {
+    "author" : "xcode",
+    "version" : 1
+  }
+}

BIN
AIIM/Assets.xcassets/Cpaissc.imageset/拍摄.png


BIN
AIIM/Assets.xcassets/Cpaissc.imageset/拍摄@2x.png


BIN
AIIM/Assets.xcassets/Cpaissc.imageset/拍摄@3x.png


+ 23 - 0
AIIM/Assets.xcassets/Cshipin.imageset/Contents.json

@@ -0,0 +1,23 @@
+{
+  "images" : [
+    {
+      "filename" : "视频.png",
+      "idiom" : "universal",
+      "scale" : "1x"
+    },
+    {
+      "filename" : "视频@2x.png",
+      "idiom" : "universal",
+      "scale" : "2x"
+    },
+    {
+      "filename" : "视频@3x.png",
+      "idiom" : "universal",
+      "scale" : "3x"
+    }
+  ],
+  "info" : {
+    "author" : "xcode",
+    "version" : 1
+  }
+}

BIN
AIIM/Assets.xcassets/Cshipin.imageset/视频.png


BIN
AIIM/Assets.xcassets/Cshipin.imageset/视频@2x.png


BIN
AIIM/Assets.xcassets/Cshipin.imageset/视频@3x.png


+ 23 - 0
AIIM/Assets.xcassets/Cshipinth.imageset/Contents.json

@@ -0,0 +1,23 @@
+{
+  "images" : [
+    {
+      "filename" : "录像.png",
+      "idiom" : "universal",
+      "scale" : "1x"
+    },
+    {
+      "filename" : "录像@2x.png",
+      "idiom" : "universal",
+      "scale" : "2x"
+    },
+    {
+      "filename" : "录像@3x.png",
+      "idiom" : "universal",
+      "scale" : "3x"
+    }
+  ],
+  "info" : {
+    "author" : "xcode",
+    "version" : 1
+  }
+}

BIN
AIIM/Assets.xcassets/Cshipinth.imageset/录像.png


BIN
AIIM/Assets.xcassets/Cshipinth.imageset/录像@2x.png


BIN
AIIM/Assets.xcassets/Cshipinth.imageset/录像@3x.png


+ 23 - 0
AIIM/Assets.xcassets/Ctupian.imageset/Contents.json

@@ -0,0 +1,23 @@
+{
+  "images" : [
+    {
+      "filename" : "图片.png",
+      "idiom" : "universal",
+      "scale" : "1x"
+    },
+    {
+      "filename" : "图片@2x.png",
+      "idiom" : "universal",
+      "scale" : "2x"
+    },
+    {
+      "filename" : "图片@3x.png",
+      "idiom" : "universal",
+      "scale" : "3x"
+    }
+  ],
+  "info" : {
+    "author" : "xcode",
+    "version" : 1
+  }
+}

BIN
AIIM/Assets.xcassets/Ctupian.imageset/图片.png


BIN
AIIM/Assets.xcassets/Ctupian.imageset/图片@2x.png


BIN
AIIM/Assets.xcassets/Ctupian.imageset/图片@3x.png


+ 23 - 0
AIIM/Assets.xcassets/Cwenjian.imageset/Contents.json

@@ -0,0 +1,23 @@
+{
+  "images" : [
+    {
+      "filename" : "文件夹.png",
+      "idiom" : "universal",
+      "scale" : "1x"
+    },
+    {
+      "filename" : "文件夹@2x.png",
+      "idiom" : "universal",
+      "scale" : "2x"
+    },
+    {
+      "filename" : "文件夹@3x.png",
+      "idiom" : "universal",
+      "scale" : "3x"
+    }
+  ],
+  "info" : {
+    "author" : "xcode",
+    "version" : 1
+  }
+}

BIN
AIIM/Assets.xcassets/Cwenjian.imageset/文件夹.png


BIN
AIIM/Assets.xcassets/Cwenjian.imageset/文件夹@2x.png


BIN
AIIM/Assets.xcassets/Cwenjian.imageset/文件夹@3x.png


+ 23 - 0
AIIM/Assets.xcassets/Cyuyinth.imageset/Contents.json

@@ -0,0 +1,23 @@
+{
+  "images" : [
+    {
+      "filename" : "电话.png",
+      "idiom" : "universal",
+      "scale" : "1x"
+    },
+    {
+      "filename" : "电话@2x.png",
+      "idiom" : "universal",
+      "scale" : "2x"
+    },
+    {
+      "filename" : "电话@3x.png",
+      "idiom" : "universal",
+      "scale" : "3x"
+    }
+  ],
+  "info" : {
+    "author" : "xcode",
+    "version" : 1
+  }
+}

BIN
AIIM/Assets.xcassets/Cyuyinth.imageset/电话.png


BIN
AIIM/Assets.xcassets/Cyuyinth.imageset/电话@2x.png


BIN
AIIM/Assets.xcassets/Cyuyinth.imageset/电话@3x.png


+ 23 - 0
AIIM/Assets.xcassets/allvBG.imageset/Contents.json

@@ -0,0 +1,23 @@
+{
+  "images" : [
+    {
+      "filename" : "allvBG 2.png",
+      "idiom" : "universal",
+      "scale" : "1x"
+    },
+    {
+      "filename" : "allvBG 1.png",
+      "idiom" : "universal",
+      "scale" : "2x"
+    },
+    {
+      "filename" : "allvBG.png",
+      "idiom" : "universal",
+      "scale" : "3x"
+    }
+  ],
+  "info" : {
+    "author" : "xcode",
+    "version" : 1
+  }
+}

BIN
AIIM/Assets.xcassets/allvBG.imageset/allvBG 1.png


BIN
AIIM/Assets.xcassets/allvBG.imageset/allvBG 2.png


BIN
AIIM/Assets.xcassets/allvBG.imageset/allvBG.png


+ 23 - 0
AIIM/Assets.xcassets/announce_group_icon.imageset/Contents.json

@@ -0,0 +1,23 @@
+{
+  "images" : [
+    {
+      "filename" : "announce_group_icon.png",
+      "idiom" : "universal",
+      "scale" : "1x"
+    },
+    {
+      "filename" : "announce_group_icon@2x.png",
+      "idiom" : "universal",
+      "scale" : "2x"
+    },
+    {
+      "filename" : "announce_group_icon@3x.png",
+      "idiom" : "universal",
+      "scale" : "3x"
+    }
+  ],
+  "info" : {
+    "author" : "xcode",
+    "version" : 1
+  }
+}

BIN
AIIM/Assets.xcassets/announce_group_icon.imageset/announce_group_icon.png


BIN
AIIM/Assets.xcassets/announce_group_icon.imageset/announce_group_icon@2x.png


BIN
AIIM/Assets.xcassets/announce_group_icon.imageset/announce_group_icon@3x.png


+ 23 - 0
AIIM/Assets.xcassets/arrow-right.imageset/Contents.json

@@ -0,0 +1,23 @@
+{
+  "images" : [
+    {
+      "filename" : "右箭头.png",
+      "idiom" : "universal",
+      "scale" : "1x"
+    },
+    {
+      "filename" : "右箭头@2x.png",
+      "idiom" : "universal",
+      "scale" : "2x"
+    },
+    {
+      "filename" : "右箭头@3x.png",
+      "idiom" : "universal",
+      "scale" : "3x"
+    }
+  ],
+  "info" : {
+    "author" : "xcode",
+    "version" : 1
+  }
+}

BIN
AIIM/Assets.xcassets/arrow-right.imageset/右箭头.png


BIN
AIIM/Assets.xcassets/arrow-right.imageset/右箭头@2x.png


BIN
AIIM/Assets.xcassets/arrow-right.imageset/右箭头@3x.png


+ 23 - 0
AIIM/Assets.xcassets/arrow_down.imageset/Contents.json

@@ -0,0 +1,23 @@
+{
+  "images" : [
+    {
+      "filename" : "arrow_down.png",
+      "idiom" : "universal",
+      "scale" : "1x"
+    },
+    {
+      "filename" : "arrow_down@2x.png",
+      "idiom" : "universal",
+      "scale" : "2x"
+    },
+    {
+      "filename" : "arrow_down@3x.png",
+      "idiom" : "universal",
+      "scale" : "3x"
+    }
+  ],
+  "info" : {
+    "author" : "xcode",
+    "version" : 1
+  }
+}

BIN
AIIM/Assets.xcassets/arrow_down.imageset/arrow_down.png


BIN
AIIM/Assets.xcassets/arrow_down.imageset/arrow_down@2x.png


BIN
AIIM/Assets.xcassets/arrow_down.imageset/arrow_down@3x.png


+ 23 - 0
AIIM/Assets.xcassets/arrow_up.imageset/Contents.json

@@ -0,0 +1,23 @@
+{
+  "images" : [
+    {
+      "filename" : "arrow_up.png",
+      "idiom" : "universal",
+      "scale" : "1x"
+    },
+    {
+      "filename" : "arrow_up@2x.png",
+      "idiom" : "universal",
+      "scale" : "2x"
+    },
+    {
+      "filename" : "arrow_up@3x.png",
+      "idiom" : "universal",
+      "scale" : "3x"
+    }
+  ],
+  "info" : {
+    "author" : "xcode",
+    "version" : 1
+  }
+}

BIN
AIIM/Assets.xcassets/arrow_up.imageset/arrow_up.png


BIN
AIIM/Assets.xcassets/arrow_up.imageset/arrow_up@2x.png


BIN
AIIM/Assets.xcassets/arrow_up.imageset/arrow_up@3x.png


+ 21 - 0
AIIM/Assets.xcassets/at_everyone.imageset/Contents.json

@@ -0,0 +1,21 @@
+{
+  "images" : [
+    {
+      "filename" : "at_everyone.png",
+      "idiom" : "universal",
+      "scale" : "1x"
+    },
+    {
+      "idiom" : "universal",
+      "scale" : "2x"
+    },
+    {
+      "idiom" : "universal",
+      "scale" : "3x"
+    }
+  ],
+  "info" : {
+    "author" : "xcode",
+    "version" : 1
+  }
+}

BIN
AIIM/Assets.xcassets/at_everyone.imageset/at_everyone.png


+ 23 - 0
AIIM/Assets.xcassets/audio_call_icon.imageset/Contents.json

@@ -0,0 +1,23 @@
+{
+  "images" : [
+    {
+      "filename" : "audio_call_icon.png",
+      "idiom" : "universal",
+      "scale" : "1x"
+    },
+    {
+      "filename" : "audio_call_icon@2x.png",
+      "idiom" : "universal",
+      "scale" : "2x"
+    },
+    {
+      "filename" : "audio_call_icon@3x.png",
+      "idiom" : "universal",
+      "scale" : "3x"
+    }
+  ],
+  "info" : {
+    "author" : "xcode",
+    "version" : 1
+  }
+}

BIN
AIIM/Assets.xcassets/audio_call_icon.imageset/audio_call_icon.png


BIN
AIIM/Assets.xcassets/audio_call_icon.imageset/audio_call_icon@2x.png


BIN
AIIM/Assets.xcassets/audio_call_icon.imageset/audio_call_icon@3x.png


+ 23 - 0
AIIM/Assets.xcassets/audio_icon.imageset/Contents.json

@@ -0,0 +1,23 @@
+{
+  "images" : [
+    {
+      "filename" : "audio_icon.png",
+      "idiom" : "universal",
+      "scale" : "1x"
+    },
+    {
+      "filename" : "audio_icon@2x.png",
+      "idiom" : "universal",
+      "scale" : "2x"
+    },
+    {
+      "filename" : "audio_icon@3x.png",
+      "idiom" : "universal",
+      "scale" : "3x"
+    }
+  ],
+  "info" : {
+    "author" : "xcode",
+    "version" : 1
+  }
+}

BIN
AIIM/Assets.xcassets/audio_icon.imageset/audio_icon.png


BIN
AIIM/Assets.xcassets/audio_icon.imageset/audio_icon@2x.png


BIN
AIIM/Assets.xcassets/audio_icon.imageset/audio_icon@3x.png


Some files were not shown because too many files changed in this diff