harry 3 years ago
commit
39ec8f009c
25 changed files with 1188 additions and 0 deletions
  1. 1 0
      .gitignore
  2. 501 0
      Introduce.xcodeproj/project.pbxproj
  3. 7 0
      Introduce.xcodeproj/project.xcworkspace/contents.xcworkspacedata
  4. 8 0
      Introduce.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist
  5. BIN
      Introduce.xcodeproj/project.xcworkspace/xcuserdata/harry.xcuserdatad/UserInterfaceState.xcuserstate
  6. 14 0
      Introduce.xcodeproj/xcuserdata/harry.xcuserdatad/xcschemes/xcschememanagement.plist
  7. 10 0
      Introduce.xcworkspace/contents.xcworkspacedata
  8. 8 0
      Introduce.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist
  9. BIN
      Introduce.xcworkspace/xcuserdata/harry.xcuserdatad/UserInterfaceState.xcuserstate
  10. 29 0
      Introduce/Aarchitecture/AppDelegate.swift
  11. 31 0
      Introduce/Aarchitecture/BFTabbarController.swift
  12. 11 0
      Introduce/Assets.xcassets/AccentColor.colorset/Contents.json
  13. 98 0
      Introduce/Assets.xcassets/AppIcon.appiconset/Contents.json
  14. 6 0
      Introduce/Assets.xcassets/Contents.json
  15. 21 0
      Introduce/Assets.xcassets/add.imageset/Contents.json
  16. BIN
      Introduce/Assets.xcassets/add.imageset/add@3x.png
  17. 6 0
      Introduce/Assets.xcassets/home/Contents.json
  18. 25 0
      Introduce/Base.lproj/LaunchScreen.storyboard
  19. 102 0
      Introduce/Base.lproj/Main.storyboard
  20. 25 0
      Introduce/Info.plist
  21. 38 0
      Introduce/Record/INIntrocudeController.swift
  22. 75 0
      Introduce/Record/INPhotoVideosController.swift
  23. 50 0
      Introduce/Record/INRecorderController.swift
  24. 83 0
      Introduce/Record/INVideoExportController.swift
  25. 39 0
      Podfile

+ 1 - 0
.gitignore

@@ -0,0 +1 @@
+Pods

+ 501 - 0
Introduce.xcodeproj/project.pbxproj

@@ -0,0 +1,501 @@
+// !$*UTF8*$!
+{
+	archiveVersion = 1;
+	classes = {
+	};
+	objectVersion = 55;
+	objects = {
+
+/* Begin PBXBuildFile section */
+		4A426DDD275484DF00B3733B /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4A426DDC275484DF00B3733B /* AppDelegate.swift */; };
+		4A426DE4275484DF00B3733B /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 4A426DE2275484DF00B3733B /* Main.storyboard */; };
+		4A426DE6275484E000B3733B /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 4A426DE5275484E000B3733B /* Assets.xcassets */; };
+		4A426DE9275484E000B3733B /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 4A426DE7275484E000B3733B /* LaunchScreen.storyboard */; };
+		4A426DF22754A1E300B3733B /* BFTabbarController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4A426DF12754A1E300B3733B /* BFTabbarController.swift */; };
+		4A426DF52754A27D00B3733B /* INRecorderController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4A426DF42754A27D00B3733B /* INRecorderController.swift */; };
+		4A426DFA2754A47700B3733B /* INPhotoVideosController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4A426DF92754A47700B3733B /* INPhotoVideosController.swift */; };
+		4A426DFC2754A4B200B3733B /* INIntrocudeController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4A426DFB2754A4B200B3733B /* INIntrocudeController.swift */; };
+		4A426DFE2754A4F600B3733B /* INVideoExportController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4A426DFD2754A4F600B3733B /* INVideoExportController.swift */; };
+		BFC6C47BC8163110D4E205C0 /* Pods_Introduce.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3D67E85C017389B87957100F /* Pods_Introduce.framework */; };
+/* End PBXBuildFile section */
+
+/* Begin PBXFileReference section */
+		3051DB0957784182F3E1AAD3 /* Pods-Introduce.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Introduce.release.xcconfig"; path = "Target Support Files/Pods-Introduce/Pods-Introduce.release.xcconfig"; sourceTree = "<group>"; };
+		3D67E85C017389B87957100F /* Pods_Introduce.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Introduce.framework; sourceTree = BUILT_PRODUCTS_DIR; };
+		4A426DD9275484DF00B3733B /* Introduce.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Introduce.app; sourceTree = BUILT_PRODUCTS_DIR; };
+		4A426DDC275484DF00B3733B /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = "<group>"; };
+		4A426DE3275484DF00B3733B /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = "<group>"; };
+		4A426DE5275484E000B3733B /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = "<group>"; };
+		4A426DE8275484E000B3733B /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = "<group>"; };
+		4A426DEA275484E000B3733B /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
+		4A426DF12754A1E300B3733B /* BFTabbarController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BFTabbarController.swift; sourceTree = "<group>"; };
+		4A426DF42754A27D00B3733B /* INRecorderController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = INRecorderController.swift; sourceTree = "<group>"; };
+		4A426DF92754A47700B3733B /* INPhotoVideosController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = INPhotoVideosController.swift; sourceTree = "<group>"; };
+		4A426DFB2754A4B200B3733B /* INIntrocudeController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = INIntrocudeController.swift; sourceTree = "<group>"; };
+		4A426DFD2754A4F600B3733B /* INVideoExportController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = INVideoExportController.swift; sourceTree = "<group>"; };
+		F6FE9FC563C2B8CC6005F8C8 /* Pods-Introduce.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Introduce.debug.xcconfig"; path = "Target Support Files/Pods-Introduce/Pods-Introduce.debug.xcconfig"; sourceTree = "<group>"; };
+/* End PBXFileReference section */
+
+/* Begin PBXFrameworksBuildPhase section */
+		4A426DD6275484DF00B3733B /* Frameworks */ = {
+			isa = PBXFrameworksBuildPhase;
+			buildActionMask = 2147483647;
+			files = (
+				BFC6C47BC8163110D4E205C0 /* Pods_Introduce.framework in Frameworks */,
+			);
+			runOnlyForDeploymentPostprocessing = 0;
+		};
+/* End PBXFrameworksBuildPhase section */
+
+/* Begin PBXGroup section */
+		176FF70F02BBAA82FCAFD349 /* Frameworks */ = {
+			isa = PBXGroup;
+			children = (
+				3D67E85C017389B87957100F /* Pods_Introduce.framework */,
+			);
+			name = Frameworks;
+			sourceTree = "<group>";
+		};
+		4A426DD0275484DF00B3733B = {
+			isa = PBXGroup;
+			children = (
+				4A426DDB275484DF00B3733B /* Introduce */,
+				4A426DDA275484DF00B3733B /* Products */,
+				D026B130A41514D0C394B80E /* Pods */,
+				176FF70F02BBAA82FCAFD349 /* Frameworks */,
+			);
+			sourceTree = "<group>";
+		};
+		4A426DDA275484DF00B3733B /* Products */ = {
+			isa = PBXGroup;
+			children = (
+				4A426DD9275484DF00B3733B /* Introduce.app */,
+			);
+			name = Products;
+			sourceTree = "<group>";
+		};
+		4A426DDB275484DF00B3733B /* Introduce */ = {
+			isa = PBXGroup;
+			children = (
+				4A426DF02754A0D100B3733B /* Aarchitecture */,
+				4A426DF82754A2F700B3733B /* Cloud */,
+				4A426DF72754A2EE00B3733B /* Message */,
+				4A426DF32754A26600B3733B /* Record */,
+				4A426DE2275484DF00B3733B /* Main.storyboard */,
+				4A426DE5275484E000B3733B /* Assets.xcassets */,
+				4A426DE7275484E000B3733B /* LaunchScreen.storyboard */,
+				4A426DEA275484E000B3733B /* Info.plist */,
+			);
+			path = Introduce;
+			sourceTree = "<group>";
+		};
+		4A426DF02754A0D100B3733B /* Aarchitecture */ = {
+			isa = PBXGroup;
+			children = (
+				4A426DDC275484DF00B3733B /* AppDelegate.swift */,
+				4A426DF12754A1E300B3733B /* BFTabbarController.swift */,
+			);
+			path = Aarchitecture;
+			sourceTree = "<group>";
+		};
+		4A426DF32754A26600B3733B /* Record */ = {
+			isa = PBXGroup;
+			children = (
+				4A426DF42754A27D00B3733B /* INRecorderController.swift */,
+				4A426DF92754A47700B3733B /* INPhotoVideosController.swift */,
+				4A426DFB2754A4B200B3733B /* INIntrocudeController.swift */,
+				4A426DFD2754A4F600B3733B /* INVideoExportController.swift */,
+			);
+			path = Record;
+			sourceTree = "<group>";
+		};
+		4A426DF72754A2EE00B3733B /* Message */ = {
+			isa = PBXGroup;
+			children = (
+			);
+			path = Message;
+			sourceTree = "<group>";
+		};
+		4A426DF82754A2F700B3733B /* Cloud */ = {
+			isa = PBXGroup;
+			children = (
+			);
+			path = Cloud;
+			sourceTree = "<group>";
+		};
+		D026B130A41514D0C394B80E /* Pods */ = {
+			isa = PBXGroup;
+			children = (
+				F6FE9FC563C2B8CC6005F8C8 /* Pods-Introduce.debug.xcconfig */,
+				3051DB0957784182F3E1AAD3 /* Pods-Introduce.release.xcconfig */,
+			);
+			path = Pods;
+			sourceTree = "<group>";
+		};
+/* End PBXGroup section */
+
+/* Begin PBXNativeTarget section */
+		4A426DD8275484DF00B3733B /* Introduce */ = {
+			isa = PBXNativeTarget;
+			buildConfigurationList = 4A426DED275484E000B3733B /* Build configuration list for PBXNativeTarget "Introduce" */;
+			buildPhases = (
+				0B6E335E37508327721C79AA /* [CP] Check Pods Manifest.lock */,
+				4A426DD5275484DF00B3733B /* Sources */,
+				4A426DD6275484DF00B3733B /* Frameworks */,
+				4A426DD7275484DF00B3733B /* Resources */,
+				3DFC34400BF4E4EF0317FBD6 /* [CP] Embed Pods Frameworks */,
+				147516E31A270E74CDD9FCDC /* [CP] Copy Pods Resources */,
+			);
+			buildRules = (
+			);
+			dependencies = (
+			);
+			name = Introduce;
+			productName = Introduce;
+			productReference = 4A426DD9275484DF00B3733B /* Introduce.app */;
+			productType = "com.apple.product-type.application";
+		};
+/* End PBXNativeTarget section */
+
+/* Begin PBXProject section */
+		4A426DD1275484DF00B3733B /* Project object */ = {
+			isa = PBXProject;
+			attributes = {
+				BuildIndependentTargetsInParallel = 1;
+				LastSwiftUpdateCheck = 1310;
+				LastUpgradeCheck = 1310;
+				TargetAttributes = {
+					4A426DD8275484DF00B3733B = {
+						CreatedOnToolsVersion = 13.1;
+					};
+				};
+			};
+			buildConfigurationList = 4A426DD4275484DF00B3733B /* Build configuration list for PBXProject "Introduce" */;
+			compatibilityVersion = "Xcode 13.0";
+			developmentRegion = en;
+			hasScannedForEncodings = 0;
+			knownRegions = (
+				en,
+				Base,
+			);
+			mainGroup = 4A426DD0275484DF00B3733B;
+			productRefGroup = 4A426DDA275484DF00B3733B /* Products */;
+			projectDirPath = "";
+			projectRoot = "";
+			targets = (
+				4A426DD8275484DF00B3733B /* Introduce */,
+			);
+		};
+/* End PBXProject section */
+
+/* Begin PBXResourcesBuildPhase section */
+		4A426DD7275484DF00B3733B /* Resources */ = {
+			isa = PBXResourcesBuildPhase;
+			buildActionMask = 2147483647;
+			files = (
+				4A426DE9275484E000B3733B /* LaunchScreen.storyboard in Resources */,
+				4A426DE6275484E000B3733B /* Assets.xcassets in Resources */,
+				4A426DE4275484DF00B3733B /* Main.storyboard in Resources */,
+			);
+			runOnlyForDeploymentPostprocessing = 0;
+		};
+/* End PBXResourcesBuildPhase section */
+
+/* Begin PBXShellScriptBuildPhase section */
+		0B6E335E37508327721C79AA /* [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-Introduce-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;
+		};
+		147516E31A270E74CDD9FCDC /* [CP] Copy Pods Resources */ = {
+			isa = PBXShellScriptBuildPhase;
+			buildActionMask = 2147483647;
+			files = (
+			);
+			inputFileListPaths = (
+				"${PODS_ROOT}/Target Support Files/Pods-Introduce/Pods-Introduce-resources-${CONFIGURATION}-input-files.xcfilelist",
+			);
+			name = "[CP] Copy Pods Resources";
+			outputFileListPaths = (
+				"${PODS_ROOT}/Target Support Files/Pods-Introduce/Pods-Introduce-resources-${CONFIGURATION}-output-files.xcfilelist",
+			);
+			runOnlyForDeploymentPostprocessing = 0;
+			shellPath = /bin/sh;
+			shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Introduce/Pods-Introduce-resources.sh\"\n";
+			showEnvVarsInLog = 0;
+		};
+		3DFC34400BF4E4EF0317FBD6 /* [CP] Embed Pods Frameworks */ = {
+			isa = PBXShellScriptBuildPhase;
+			buildActionMask = 2147483647;
+			files = (
+			);
+			inputFileListPaths = (
+				"${PODS_ROOT}/Target Support Files/Pods-Introduce/Pods-Introduce-frameworks-${CONFIGURATION}-input-files.xcfilelist",
+			);
+			name = "[CP] Embed Pods Frameworks";
+			outputFileListPaths = (
+				"${PODS_ROOT}/Target Support Files/Pods-Introduce/Pods-Introduce-frameworks-${CONFIGURATION}-output-files.xcfilelist",
+			);
+			runOnlyForDeploymentPostprocessing = 0;
+			shellPath = /bin/sh;
+			shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Introduce/Pods-Introduce-frameworks.sh\"\n";
+			showEnvVarsInLog = 0;
+		};
+/* End PBXShellScriptBuildPhase section */
+
+/* Begin PBXSourcesBuildPhase section */
+		4A426DD5275484DF00B3733B /* Sources */ = {
+			isa = PBXSourcesBuildPhase;
+			buildActionMask = 2147483647;
+			files = (
+				4A426DFA2754A47700B3733B /* INPhotoVideosController.swift in Sources */,
+				4A426DDD275484DF00B3733B /* AppDelegate.swift in Sources */,
+				4A426DF52754A27D00B3733B /* INRecorderController.swift in Sources */,
+				4A426DFE2754A4F600B3733B /* INVideoExportController.swift in Sources */,
+				4A426DFC2754A4B200B3733B /* INIntrocudeController.swift in Sources */,
+				4A426DF22754A1E300B3733B /* BFTabbarController.swift in Sources */,
+			);
+			runOnlyForDeploymentPostprocessing = 0;
+		};
+/* End PBXSourcesBuildPhase section */
+
+/* Begin PBXVariantGroup section */
+		4A426DE2275484DF00B3733B /* Main.storyboard */ = {
+			isa = PBXVariantGroup;
+			children = (
+				4A426DE3275484DF00B3733B /* Base */,
+			);
+			name = Main.storyboard;
+			sourceTree = "<group>";
+		};
+		4A426DE7275484E000B3733B /* LaunchScreen.storyboard */ = {
+			isa = PBXVariantGroup;
+			children = (
+				4A426DE8275484E000B3733B /* Base */,
+			);
+			name = LaunchScreen.storyboard;
+			sourceTree = "<group>";
+		};
+/* End PBXVariantGroup section */
+
+/* Begin XCBuildConfiguration section */
+		4A426DEB275484E000B3733B /* Debug */ = {
+			isa = XCBuildConfiguration;
+			buildSettings = {
+				ALWAYS_SEARCH_USER_PATHS = NO;
+				CLANG_ANALYZER_NONNULL = YES;
+				CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
+				CLANG_CXX_LANGUAGE_STANDARD = "gnu++17";
+				CLANG_CXX_LIBRARY = "libc++";
+				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;
+				GCC_C_LANGUAGE_STANDARD = gnu11;
+				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 = 10.0;
+				MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE;
+				MTL_FAST_MATH = YES;
+				ONLY_ACTIVE_ARCH = YES;
+				SDKROOT = iphoneos;
+				SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG;
+				SWIFT_OPTIMIZATION_LEVEL = "-Onone";
+			};
+			name = Debug;
+		};
+		4A426DEC275484E000B3733B /* Release */ = {
+			isa = XCBuildConfiguration;
+			buildSettings = {
+				ALWAYS_SEARCH_USER_PATHS = NO;
+				CLANG_ANALYZER_NONNULL = YES;
+				CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
+				CLANG_CXX_LANGUAGE_STANDARD = "gnu++17";
+				CLANG_CXX_LIBRARY = "libc++";
+				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;
+				GCC_C_LANGUAGE_STANDARD = gnu11;
+				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 = 10.0;
+				MTL_ENABLE_DEBUG_INFO = NO;
+				MTL_FAST_MATH = YES;
+				SDKROOT = iphoneos;
+				SWIFT_COMPILATION_MODE = wholemodule;
+				SWIFT_OPTIMIZATION_LEVEL = "-O";
+				VALIDATE_PRODUCT = YES;
+			};
+			name = Release;
+		};
+		4A426DEE275484E000B3733B /* Debug */ = {
+			isa = XCBuildConfiguration;
+			baseConfigurationReference = F6FE9FC563C2B8CC6005F8C8 /* Pods-Introduce.debug.xcconfig */;
+			buildSettings = {
+				ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
+				ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
+				CODE_SIGN_STYLE = Automatic;
+				CURRENT_PROJECT_VERSION = 1;
+				DEVELOPMENT_TEAM = UH52C8A7SN;
+				ENABLE_BITCODE = NO;
+				GENERATE_INFOPLIST_FILE = YES;
+				INFOPLIST_FILE = Introduce/Info.plist;
+				INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents = YES;
+				INFOPLIST_KEY_UILaunchStoryboardName = LaunchScreen;
+				INFOPLIST_KEY_UIMainStoryboardFile = Main;
+				INFOPLIST_KEY_UISupportedInterfaceOrientations = UIInterfaceOrientationPortrait;
+				INFOPLIST_KEY_UISupportedInterfaceOrientations_iPad = "UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight";
+				INFOPLIST_KEY_UISupportedInterfaceOrientations_iPhone = "UIInterfaceOrientationPortrait UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight";
+				LD_RUNPATH_SEARCH_PATHS = (
+					"$(inherited)",
+					"@executable_path/Frameworks",
+				);
+				MARKETING_VERSION = 1.0;
+				PRODUCT_BUNDLE_IDENTIFIER = com.piaoquan.Introduce;
+				PRODUCT_NAME = "$(TARGET_NAME)";
+				SWIFT_EMIT_LOC_STRINGS = YES;
+				SWIFT_VERSION = 5.0;
+				TARGETED_DEVICE_FAMILY = 1;
+			};
+			name = Debug;
+		};
+		4A426DEF275484E000B3733B /* Release */ = {
+			isa = XCBuildConfiguration;
+			baseConfigurationReference = 3051DB0957784182F3E1AAD3 /* Pods-Introduce.release.xcconfig */;
+			buildSettings = {
+				ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
+				ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
+				CODE_SIGN_STYLE = Automatic;
+				CURRENT_PROJECT_VERSION = 1;
+				DEVELOPMENT_TEAM = UH52C8A7SN;
+				ENABLE_BITCODE = NO;
+				GENERATE_INFOPLIST_FILE = YES;
+				INFOPLIST_FILE = Introduce/Info.plist;
+				INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents = YES;
+				INFOPLIST_KEY_UILaunchStoryboardName = LaunchScreen;
+				INFOPLIST_KEY_UIMainStoryboardFile = Main;
+				INFOPLIST_KEY_UISupportedInterfaceOrientations = UIInterfaceOrientationPortrait;
+				INFOPLIST_KEY_UISupportedInterfaceOrientations_iPad = "UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight";
+				INFOPLIST_KEY_UISupportedInterfaceOrientations_iPhone = "UIInterfaceOrientationPortrait UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight";
+				LD_RUNPATH_SEARCH_PATHS = (
+					"$(inherited)",
+					"@executable_path/Frameworks",
+				);
+				MARKETING_VERSION = 1.0;
+				PRODUCT_BUNDLE_IDENTIFIER = com.piaoquan.Introduce;
+				PRODUCT_NAME = "$(TARGET_NAME)";
+				SWIFT_EMIT_LOC_STRINGS = YES;
+				SWIFT_VERSION = 5.0;
+				TARGETED_DEVICE_FAMILY = 1;
+			};
+			name = Release;
+		};
+/* End XCBuildConfiguration section */
+
+/* Begin XCConfigurationList section */
+		4A426DD4275484DF00B3733B /* Build configuration list for PBXProject "Introduce" */ = {
+			isa = XCConfigurationList;
+			buildConfigurations = (
+				4A426DEB275484E000B3733B /* Debug */,
+				4A426DEC275484E000B3733B /* Release */,
+			);
+			defaultConfigurationIsVisible = 0;
+			defaultConfigurationName = Release;
+		};
+		4A426DED275484E000B3733B /* Build configuration list for PBXNativeTarget "Introduce" */ = {
+			isa = XCConfigurationList;
+			buildConfigurations = (
+				4A426DEE275484E000B3733B /* Debug */,
+				4A426DEF275484E000B3733B /* Release */,
+			);
+			defaultConfigurationIsVisible = 0;
+			defaultConfigurationName = Release;
+		};
+/* End XCConfigurationList section */
+	};
+	rootObject = 4A426DD1275484DF00B3733B /* Project object */;
+}

+ 7 - 0
Introduce.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>

+ 8 - 0
Introduce.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist

@@ -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>IDEDidComputeMac32BitWarning</key>
+	<true/>
+</dict>
+</plist>

BIN
Introduce.xcodeproj/project.xcworkspace/xcuserdata/harry.xcuserdatad/UserInterfaceState.xcuserstate


+ 14 - 0
Introduce.xcodeproj/xcuserdata/harry.xcuserdatad/xcschemes/xcschememanagement.plist

@@ -0,0 +1,14 @@
+<?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>SchemeUserState</key>
+	<dict>
+		<key>Introduce.xcscheme_^#shared#^_</key>
+		<dict>
+			<key>orderHint</key>
+			<integer>35</integer>
+		</dict>
+	</dict>
+</dict>
+</plist>

+ 10 - 0
Introduce.xcworkspace/contents.xcworkspacedata

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

+ 8 - 0
Introduce.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist

@@ -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>IDEDidComputeMac32BitWarning</key>
+	<true/>
+</dict>
+</plist>

BIN
Introduce.xcworkspace/xcuserdata/harry.xcuserdatad/UserInterfaceState.xcuserstate


+ 29 - 0
Introduce/Aarchitecture/AppDelegate.swift

@@ -0,0 +1,29 @@
+//
+//  AppDelegate.swift
+//  Introduce
+//
+//  Created by 胡志强 on 2021/11/29.
+//
+
+import UIKit
+
+@main
+class AppDelegate: UIResponder, UIApplicationDelegate {
+
+    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
+        // Override point for customization after application launch.
+        return true
+    }
+
+    // MARK: UISceneSession Lifecycle
+
+    func applicationWillResignActive(_ application: UIApplication) {
+        
+    }
+    
+    func applicationDidEnterBackground(_ application: UIApplication) {
+        
+    }
+
+}
+

+ 31 - 0
Introduce/Aarchitecture/BFTabbarController.swift

@@ -0,0 +1,31 @@
+//
+//  c.swift
+//  Introduce
+//
+//  Created by 胡志强 on 2021/11/29.
+//
+
+import Foundation
+import UIKit
+import BFUIKit
+import BFCommonKit
+
+class BFTabbarController: UITabBarController {
+    override func viewDidLoad() {
+        super.viewDidLoad()
+     
+        setValue(BFTabBar(), forKey: "tabBar")
+        // 去掉默认的半透明色
+        tabBar.isTranslucent = false
+        tabBar.tintColor = UIColor.white
+        tabBar.backgroundColor = UIColor.black
+        tabBar.barTintColor = UIColor.black
+        UITabBarItem.appearance().setTitleTextAttributes([NSAttributedString.Key.foregroundColor: UIColor.hexColor(hexadecimal: "#666666"), NSAttributedString.Key.font: UIFont.systemFont(ofSize: 10, weight: .semibold)], for: .normal)
+        UITabBarItem.appearance().setTitleTextAttributes([NSAttributedString.Key.foregroundColor: UIColor.white, NSAttributedString.Key.font: UIFont.systemFont(ofSize: 10, weight: .semibold)], for: .selected)
+        selectedIndex = 1
+        tabBar.barTintColor = .black
+        tabBar.backgroundColor = .black
+        tabBar.tintColor = .black
+
+    }
+}

+ 11 - 0
Introduce/Assets.xcassets/AccentColor.colorset/Contents.json

@@ -0,0 +1,11 @@
+{
+  "colors" : [
+    {
+      "idiom" : "universal"
+    }
+  ],
+  "info" : {
+    "author" : "xcode",
+    "version" : 1
+  }
+}

+ 98 - 0
Introduce/Assets.xcassets/AppIcon.appiconset/Contents.json

@@ -0,0 +1,98 @@
+{
+  "images" : [
+    {
+      "idiom" : "iphone",
+      "scale" : "2x",
+      "size" : "20x20"
+    },
+    {
+      "idiom" : "iphone",
+      "scale" : "3x",
+      "size" : "20x20"
+    },
+    {
+      "idiom" : "iphone",
+      "scale" : "2x",
+      "size" : "29x29"
+    },
+    {
+      "idiom" : "iphone",
+      "scale" : "3x",
+      "size" : "29x29"
+    },
+    {
+      "idiom" : "iphone",
+      "scale" : "2x",
+      "size" : "40x40"
+    },
+    {
+      "idiom" : "iphone",
+      "scale" : "3x",
+      "size" : "40x40"
+    },
+    {
+      "idiom" : "iphone",
+      "scale" : "2x",
+      "size" : "60x60"
+    },
+    {
+      "idiom" : "iphone",
+      "scale" : "3x",
+      "size" : "60x60"
+    },
+    {
+      "idiom" : "ipad",
+      "scale" : "1x",
+      "size" : "20x20"
+    },
+    {
+      "idiom" : "ipad",
+      "scale" : "2x",
+      "size" : "20x20"
+    },
+    {
+      "idiom" : "ipad",
+      "scale" : "1x",
+      "size" : "29x29"
+    },
+    {
+      "idiom" : "ipad",
+      "scale" : "2x",
+      "size" : "29x29"
+    },
+    {
+      "idiom" : "ipad",
+      "scale" : "1x",
+      "size" : "40x40"
+    },
+    {
+      "idiom" : "ipad",
+      "scale" : "2x",
+      "size" : "40x40"
+    },
+    {
+      "idiom" : "ipad",
+      "scale" : "1x",
+      "size" : "76x76"
+    },
+    {
+      "idiom" : "ipad",
+      "scale" : "2x",
+      "size" : "76x76"
+    },
+    {
+      "idiom" : "ipad",
+      "scale" : "2x",
+      "size" : "83.5x83.5"
+    },
+    {
+      "idiom" : "ios-marketing",
+      "scale" : "1x",
+      "size" : "1024x1024"
+    }
+  ],
+  "info" : {
+    "author" : "xcode",
+    "version" : 1
+  }
+}

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

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

+ 21 - 0
Introduce/Assets.xcassets/add.imageset/Contents.json

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

BIN
Introduce/Assets.xcassets/add.imageset/add@3x.png


+ 6 - 0
Introduce/Assets.xcassets/home/Contents.json

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

+ 25 - 0
Introduce/Base.lproj/LaunchScreen.storyboard

@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="13122.16" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" launchScreen="YES" useTraitCollections="YES" useSafeAreas="YES" colorMatched="YES" initialViewController="01J-lp-oVM">
+    <dependencies>
+        <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="13104.12"/>
+        <capability name="Safe area layout guides" minToolsVersion="9.0"/>
+        <capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
+    </dependencies>
+    <scenes>
+        <!--View Controller-->
+        <scene sceneID="EHf-IW-A2E">
+            <objects>
+                <viewController id="01J-lp-oVM" sceneMemberID="viewController">
+                    <view key="view" contentMode="scaleToFill" id="Ze5-6b-2t3">
+                        <rect key="frame" x="0.0" y="0.0" width="375" height="667"/>
+                        <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
+                        <color key="backgroundColor" xcode11CocoaTouchSystemColor="systemBackgroundColor" cocoaTouchSystemColor="whiteColor"/>
+                        <viewLayoutGuide key="safeArea" id="6Tk-OE-BBY"/>
+                    </view>
+                </viewController>
+                <placeholder placeholderIdentifier="IBFirstResponder" id="iYj-Kq-Ea1" userLabel="First Responder" sceneMemberID="firstResponder"/>
+            </objects>
+            <point key="canvasLocation" x="53" y="375"/>
+        </scene>
+    </scenes>
+</document>

+ 102 - 0
Introduce/Base.lproj/Main.storyboard

@@ -0,0 +1,102 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="19455" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" useSafeAreas="YES" colorMatched="YES" initialViewController="jg0-cF-aQT">
+    <device id="retina6_1" orientation="portrait" appearance="light"/>
+    <dependencies>
+        <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="19454"/>
+        <capability name="Safe area layout guides" minToolsVersion="9.0"/>
+        <capability name="System colors in document resources" minToolsVersion="11.0"/>
+        <capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
+    </dependencies>
+    <scenes>
+        <!--云空间-->
+        <scene sceneID="tne-QT-ifu">
+            <objects>
+                <viewController id="BYZ-38-t0r" customClass="ViewController" customModule="Introduce" customModuleProvider="target" sceneMemberID="viewController">
+                    <view key="view" contentMode="scaleToFill" id="8bC-Xf-vdC">
+                        <rect key="frame" x="0.0" y="0.0" width="414" height="896"/>
+                        <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
+                        <viewLayoutGuide key="safeArea" id="6Tk-OE-BBY"/>
+                        <color key="backgroundColor" systemColor="systemBackgroundColor"/>
+                    </view>
+                    <tabBarItem key="tabBarItem" title="云空间" id="Sq5-q7-WSB"/>
+                </viewController>
+                <placeholder placeholderIdentifier="IBFirstResponder" id="dkx-z0-nzr" sceneMemberID="firstResponder"/>
+            </objects>
+            <point key="canvasLocation" x="170" y="1688"/>
+        </scene>
+        <!--消息-->
+        <scene sceneID="H9l-Tg-y3z">
+            <objects>
+                <viewController id="ERs-3h-ycD" sceneMemberID="viewController">
+                    <view key="view" contentMode="scaleToFill" id="Nu8-0B-cea">
+                        <rect key="frame" x="0.0" y="0.0" width="414" height="896"/>
+                        <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
+                        <viewLayoutGuide key="safeArea" id="ZTy-WF-gTw"/>
+                        <color key="backgroundColor" systemColor="systemBackgroundColor"/>
+                    </view>
+                    <tabBarItem key="tabBarItem" title="消息" id="3sG-lJ-pRE"/>
+                </viewController>
+                <placeholder placeholderIdentifier="IBFirstResponder" id="Fd7-lN-1NQ" userLabel="First Responder" customClass="UIResponder" sceneMemberID="firstResponder"/>
+            </objects>
+            <point key="canvasLocation" x="1051" y="147"/>
+        </scene>
+        <!--开讲-->
+        <scene sceneID="auP-O6-Xsu">
+            <objects>
+                <viewController id="WdP-Bn-0Xo" customClass="INRecorderController" customModule="Introduce" customModuleProvider="target" sceneMemberID="viewController">
+                    <view key="view" contentMode="scaleToFill" id="Wh6-Rj-VPT">
+                        <rect key="frame" x="0.0" y="0.0" width="414" height="896"/>
+                        <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
+                        <viewLayoutGuide key="safeArea" id="Apm-1W-DFM"/>
+                        <color key="backgroundColor" systemColor="systemBackgroundColor"/>
+                    </view>
+                    <tabBarItem key="tabBarItem" title="开讲" id="bmj-6g-rLa"/>
+                    <navigationItem key="navigationItem" id="bbM-NJ-hAm"/>
+                </viewController>
+                <placeholder placeholderIdentifier="IBFirstResponder" id="lCK-3W-RrG" userLabel="First Responder" customClass="UIResponder" sceneMemberID="firstResponder"/>
+            </objects>
+            <point key="canvasLocation" x="1767" y="984"/>
+        </scene>
+        <!--Tabbar Controller-->
+        <scene sceneID="NzL-HE-kkO">
+            <objects>
+                <tabBarController id="jg0-cF-aQT" customClass="BFTabbarController" customModule="Introduce" customModuleProvider="target" sceneMemberID="viewController">
+                    <tabBar key="tabBar" contentMode="scaleToFill" insetsLayoutMarginsFromSafeArea="NO" id="G8J-KX-ePX">
+                        <rect key="frame" x="0.0" y="0.0" width="414" height="49"/>
+                        <autoresizingMask key="autoresizingMask"/>
+                        <color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
+                    </tabBar>
+                    <connections>
+                        <segue destination="ERs-3h-ycD" kind="relationship" relationship="viewControllers" id="Oes-ON-SR6"/>
+                        <segue destination="o84-FX-NYR" kind="relationship" relationship="viewControllers" id="StR-86-vpL"/>
+                        <segue destination="BYZ-38-t0r" kind="relationship" relationship="viewControllers" id="haB-uw-htR"/>
+                    </connections>
+                </tabBarController>
+                <placeholder placeholderIdentifier="IBFirstResponder" id="1I7-xj-hmZ" userLabel="First Responder" customClass="UIResponder" sceneMemberID="firstResponder"/>
+            </objects>
+            <point key="canvasLocation" x="170" y="883"/>
+        </scene>
+        <!--开讲-->
+        <scene sceneID="YqS-xw-Mv8">
+            <objects>
+                <navigationController id="o84-FX-NYR" sceneMemberID="viewController">
+                    <tabBarItem key="tabBarItem" title="开讲" id="0YV-OH-Tw2"/>
+                    <navigationBar key="navigationBar" contentMode="scaleToFill" id="haZ-vC-Br8">
+                        <rect key="frame" x="0.0" y="44" width="414" height="44"/>
+                        <autoresizingMask key="autoresizingMask"/>
+                    </navigationBar>
+                    <connections>
+                        <segue destination="WdP-Bn-0Xo" kind="relationship" relationship="rootViewController" id="6XP-XB-bYG"/>
+                    </connections>
+                </navigationController>
+                <placeholder placeholderIdentifier="IBFirstResponder" id="krN-OB-qNx" userLabel="First Responder" customClass="UIResponder" sceneMemberID="firstResponder"/>
+            </objects>
+            <point key="canvasLocation" x="1051" y="984"/>
+        </scene>
+    </scenes>
+    <resources>
+        <systemColor name="systemBackgroundColor">
+            <color white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
+        </systemColor>
+    </resources>
+</document>

+ 25 - 0
Introduce/Info.plist

@@ -0,0 +1,25 @@
+<?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>UIApplicationSceneManifest</key>
+	<dict>
+		<key>UIApplicationSupportsMultipleScenes</key>
+		<false/>
+		<key>UISceneConfigurations</key>
+		<dict>
+			<key>UIWindowSceneSessionRoleApplication</key>
+			<array>
+				<dict>
+					<key>UISceneConfigurationName</key>
+					<string>Default Configuration</string>
+					<key>UISceneDelegateClassName</key>
+					<string>$(PRODUCT_MODULE_NAME).SceneDelegate</string>
+					<key>UISceneStoryboardFile</key>
+					<string>Main</string>
+				</dict>
+			</array>
+		</dict>
+	</dict>
+</dict>
+</plist>

+ 38 - 0
Introduce/Record/INIntrocudeController.swift

@@ -0,0 +1,38 @@
+//
+//  INIntrocudeController.swift
+//  Introduce
+//
+//  Created by 胡志强 on 2021/11/29.
+//
+
+import Foundation
+import BFUIKit
+import Photos
+import BFRecordScreenKit
+
+class INIntrocudeController: BFBaseViewController {
+    
+    var asset:PHAsset?
+
+    override func viewDidLoad() {
+        super.viewDidLoad()
+        
+        let vc = BFRecordScreenController()
+        vc.asset = asset
+        vc.nextActionHandle = {
+            DispatchQueue.main.async { [weak self] in
+                let controller = INVideoExportController()
+                controller.export.voiceList = vc.recordList
+                controller.export.asset = vc.avasset
+                self?.navigationController?.pushViewController(controller, animated: true)
+            }
+        }
+        vc.closeActionHandle = {
+            self.backBtnClick()
+        }
+        vc.view.frame = self.view.frame
+        addChild(vc)
+        view.addSubview(vc.view)
+    }
+    
+}

+ 75 - 0
Introduce/Record/INPhotoVideosController.swift

@@ -0,0 +1,75 @@
+//
+//  INPhotoVideosController.swift
+//  Introduce
+//
+//  Created by 胡志强 on 2021/11/29.
+//
+
+import Foundation
+import UIKit
+import BFUIKit
+import BFMaterialKit
+import BFRecordScreenKit
+import Photos
+
+class INPhotoVideosController: BFBaseViewController {
+    var chosedAsset:PHAsset?
+    
+    lazy var photoMaterialVc: BFPhotosMaterialController = {
+        let vc = BFPhotosMaterialController()
+        vc.view.frame = CGRect(x: 0, y: cDevice_iPhoneNavBarAndStatusBarHei, width: cScreenWidth, height: cScreenHeigth - cDevice_iPhoneNavBarAndStatusBarHei - cDevice_iPhoneTabBarHei)
+        vc.view.backgroundColor = .black
+        vc.selectedMaterialHandle = { [weak self] currentMaterialData, selectedPhotoData, _, _ in
+            if currentMaterialData?.isSelected ?? false{
+                self?.chosedAsset = currentMaterialData
+                if selectedPhotoData.count == 2 {
+                    cShowHUB(superView: nil, msg: "临时:最新选择的视频是有效的视频")
+                }
+            }else{
+                self?.chosedAsset = selectedPhotoData.first
+            }
+            
+        }
+        return vc
+    }()
+    
+    override func viewWillAppear(_ animated: Bool) {
+        super.viewWillAppear(animated)
+        showNavigation()
+        photoMaterialVc.hiddenNavigation()
+
+    }
+    
+    override func viewDidLoad() {
+        super.viewDidLoad()
+
+        leftButton(image: nil, imageName: nil, tintColor: .white)
+        navHeadImageView?.backgroundColor = .black
+        
+        addChild(photoMaterialVc)
+        view.addSubview(photoMaterialVc.view)
+        
+        let bottomV = UIView(frame: CGRect(x: 0, y: cScreenHeigth - cDevice_iPhoneTabBarHei, width: cScreenWidth, height: cDevice_iPhoneTabBarHei))
+        bottomV.backgroundColor = .black
+        view.addSubview(bottomV)
+        
+        let nextBtn = UIButton(type: .custom)
+        nextBtn.frame = CGRect(x: cScreenWidth - 80, y: 10, width: 70, height: 29)
+        nextBtn.backgroundColor = UIColor.hexColor(hexadecimal: "#28BE67")
+        nextBtn.setTitle("下一步", for: .normal)
+        nextBtn.layer.cornerRadius = 4
+        nextBtn.addTarget(self, action: #selector(rightBtnClick(sender:)), for: .touchUpInside)
+        bottomV.addSubview(nextBtn)
+        
+    }
+    
+    override func rightBtnClick(sender _: UIButton) {
+        if let asset = self.chosedAsset{
+            let vc = INIntrocudeController()
+            vc.asset = asset
+            navigationController?.pushViewController(vc, animated: true)
+        }else{
+            cShowHUB(superView: nil, msg: "需要选择一个视频")
+        }
+    }
+}

+ 50 - 0
Introduce/Record/INRecorderController.swift

@@ -0,0 +1,50 @@
+//
+//  INRecorderController.swift
+//  Introduce
+//
+//  Created by 胡志强 on 2021/11/29.
+//
+
+import Foundation
+import BFUIKit
+import BFFramework
+import BFRecordScreenKit
+import BFMaterialKit
+
+class INRecorderController: BFBaseViewController {
+    
+    lazy var addVideoBtn:UIButton = {
+        let btn = UIButton(type: .custom)
+//        btn.setTitle("Add", for: .normal)
+        btn.setImage(UIImage(named: "add"), for: .normal)
+        btn.addTarget(self, action: #selector(addVideo), for: .touchUpInside)
+        return btn
+    }()
+    
+    override func viewWillAppear(_ animated: Bool) {
+        super.viewWillAppear(animated)
+        hiddenNavigation()
+    }
+    
+    override func viewDidLoad() {
+        super.viewDidLoad()
+        view.backgroundColor = .black
+        view.addSubview(addVideoBtn)
+        addVideoBtn.snp.makeConstraints { make in
+            make.width.height.equalTo(170)
+            make.center.equalToSuperview()
+        }
+    }
+
+    override func didReceiveMemoryWarning() {
+        super.didReceiveMemoryWarning()
+        // Dispose of any resources that can be recreated.
+    }
+    
+    @objc func addVideo(){
+        let vc = INPhotoVideosController()
+        vc.hidesBottomBarWhenPushed = true
+        self.navigationController?.pushViewController(vc, animated: true)
+    }
+    
+}

+ 83 - 0
Introduce/Record/INVideoExportController.swift

@@ -0,0 +1,83 @@
+//
+//  INVideoExportController.swift
+//  Introduce
+//
+//  Created by 胡志强 on 2021/11/29.
+//
+
+import Foundation
+import BFUIKit
+import Photos
+import BFRecordScreenKit
+
+
+class INVideoExportController: BFBaseViewController {
+    
+    var videoAsset : AVURLAsset?
+    
+    lazy var progressView : UIView = {
+        let v = UIView(frame: CGRect(x: 0, y: navHeadImageView!.bottomY, width: 0, height: 10))
+        v.backgroundColor = .red
+        return v
+    }()
+    
+    lazy var progressL : UILabel = {
+        let la = UILabel(frame: CGRect(x: 0, y: navHeadImageView!.bottomY, width: cScreenWidth, height: 10))
+        la.textColor = .white
+        la.textAlignment = .center
+        la.text = "0%"
+        la.font = UIFont.systemFont(ofSize: 8)
+        return la
+    }()
+    
+    lazy var export : BFRecordExport = {
+        let export = BFRecordExport()
+        
+        export.progress = {[weak self] progress in
+            self?.progressView.frame = CGRect(x: 0, y: self?.navHeadImageView?.bottomY ?? 0, width: (cScreenWidth) * CGFloat(progress), height: 10)
+            self?.progressL.text = String(format: "%d%%", Int(progress*100))
+        }
+        export.exportCompletion = {[weak self] (error, url) in
+            guard let strongSelf = self else {
+                return
+            }
+            
+            if let fileUrl = url {
+                DispatchQueue.main.async {
+                    let item = AVPlayerItem(url: fileUrl)
+                    let avplayer = AVPlayer(playerItem: item)
+                    let playerLayer = AVPlayerLayer(player: avplayer)
+                    playerLayer.frame = CGRect(x: 10, y: strongSelf.progressView.bottomY, width: cScreenWidth - 20, height: cScreenHeigth - strongSelf.progressView.bottomY - 10)
+                    strongSelf.view.layer.addSublayer(playerLayer)
+                    avplayer.play()
+                }
+            }
+        }
+        return export
+    }()
+    
+    override func viewWillAppear(_ animated: Bool) {
+        super.viewWillAppear(animated)
+        showNavigation()
+    }
+    
+    override func backBtnClick() {
+        export.cancelExport()
+        super.backBtnClick()
+    }
+
+    override func viewDidLoad() {
+        super.viewDidLoad()
+        view.backgroundColor = .black
+        navHeadImageView?.backgroundColor = .black
+        leftButton(image: nil, imageName: nil, tintColor: UIColor.white)
+        
+        let backV = UIView(frame: CGRect(x: 0, y: navHeadImageView!.bottomY, width: cScreenWidth, height: 10))
+        backV.backgroundColor = .gray
+        view.addSubview(backV)
+        view.addSubview(progressView)
+        view.addSubview(progressL)
+
+        export.startExprot()
+    }
+}

+ 39 - 0
Podfile

@@ -0,0 +1,39 @@
+# Uncomment the next line to define a global platform for your project
+
+use_frameworks!
+platform :ios, '10.0'
+
+source 'https://github.com/CocoaPods/Specs.git'
+source 'https://git.yishihui.com/iOS/BFSpecs.git'
+
+target 'Introduce' do
+  pod 'BFMaterialKit',         :path => '../BFMaterialKit/'
+  pod 'BFCommonKit',           :path => '../BFCommonKit/'
+  pod 'BFNetRequestKit',       :path => '../BFNetRequestKit/'
+  pod 'BFFramework',           :path => '../BFFramework/'
+  pod 'BFUIKit',               :path => '../BFUIKit/'
+  pod 'BFVideoEditKit',        :path => '../BFVideoEditKit/'
+  pod 'BFAliyunNlsSDK-Swift',  :path => '../BFAliyunNlsSDK-Swift/'
+  pod 'BFRecordScreenKit',     :path => '../BFRecordScreenKit'
+
+#  pod "BFFramework",          :git => 'https://git.yishihui.com/iOS/BFFramework.git'
+#  pod "BFMaterialKit",        :git => 'https://git.yishihui.com/iOS/BFMaterialKit.git'
+#  pod "BFCommonKit",          :git => 'https://git.yishihui.com/iOS/BFCommonKit.git'
+#  pod "BFNetRequestKit",      :git => 'https://git.yishihui.com/iOS/BFNetRequestKit.git'
+#  pod "BFUIKit",              :git => 'https://git.yishihui.com/iOS/BFUIKit.git'
+#  pod "BFAliyunNlsSDK-Swift", :git => 'https://git.yishihui.com/iOS/BFAliyunNlsSDK-Swift.git'
+#  pod "BFVideoEditKit",       :git => 'https://git.yishihui.com/iOS/BFVideoEditKit.git'
+
+
+  
+  post_install do |installer|
+    installer.pods_project.targets.each do |target|
+      #if target.name =="App" || target.name =="App1"
+      target.build_configurations.each do |config|
+        config.build_settings['IPHONEOS_DEPLOYMENT_TARGET'] = '10.0'
+      end
+      #end
+    end
+  end
+  
+end