Browse Source

add:添加上报锁屏和解锁屏幕的时间。

“HeShaoZe” 4 months ago
parent
commit
3c2492b904

+ 65 - 65
ios/Runner.xcodeproj/project.pbxproj

@@ -8,14 +8,14 @@
 
 /* Begin PBXBuildFile section */
 		1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */ = {isa = PBXBuildFile; fileRef = 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */; };
-		27E46E907725369734A7EE68 /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 92D2DA0C58605FDDA6600F52 /* Pods_Runner.framework */; };
 		331C808B294A63AB00263BE5 /* RunnerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 331C807B294A618700263BE5 /* RunnerTests.swift */; };
 		3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */; };
 		74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74858FAE1ED2DC5600515810 /* AppDelegate.swift */; };
-		85DDAD4C1F713879496C06E0 /* Pods_RunnerTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 0927DA3C94D549E7C5EC0958 /* Pods_RunnerTests.framework */; };
+		92B40AF4EDF44D8A7599A77A /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 300715D2202B4EFB7419B4DD /* Pods_Runner.framework */; };
 		97C146FC1CF9000F007C117D /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FA1CF9000F007C117D /* Main.storyboard */; };
 		97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FD1CF9000F007C117D /* Assets.xcassets */; };
 		97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */; };
+		B6C93FBF46DAEB66D210430D /* Pods_RunnerTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 42FDD72B3D37E1E76FE0BF67 /* Pods_RunnerTests.framework */; };
 /* End PBXBuildFile section */
 
 /* Begin PBXContainerItemProxy section */
@@ -42,21 +42,20 @@
 /* End PBXCopyFilesBuildPhase section */
 
 /* Begin PBXFileReference section */
-		0927DA3C94D549E7C5EC0958 /* Pods_RunnerTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_RunnerTests.framework; sourceTree = BUILT_PRODUCTS_DIR; };
 		1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GeneratedPluginRegistrant.h; sourceTree = "<group>"; };
 		1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GeneratedPluginRegistrant.m; sourceTree = "<group>"; };
-		1826437B41CD439EFAB3E1C1 /* Pods-RunnerTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.debug.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.debug.xcconfig"; sourceTree = "<group>"; };
-		1D9BAB2ACD05F4E34704A073 /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = "<group>"; };
-		1FCA1CD501DE35B46D2B2EC8 /* Pods-RunnerTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.release.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.release.xcconfig"; sourceTree = "<group>"; };
+		300715D2202B4EFB7419B4DD /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; };
 		331C807B294A618700263BE5 /* RunnerTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RunnerTests.swift; sourceTree = "<group>"; };
 		331C8081294A63A400263BE5 /* RunnerTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = RunnerTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; };
+		3B0F46864C117910E6A10161 /* Pods-RunnerTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.release.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.release.xcconfig"; sourceTree = "<group>"; };
 		3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = AppFrameworkInfo.plist; path = Flutter/AppFrameworkInfo.plist; sourceTree = "<group>"; };
+		42FDD72B3D37E1E76FE0BF67 /* Pods_RunnerTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_RunnerTests.framework; sourceTree = BUILT_PRODUCTS_DIR; };
 		58C6B4992DDB237C00B7D33B /* Runner.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = Runner.entitlements; sourceTree = "<group>"; };
+		6242D04867DBAE678644097C /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = "<group>"; };
+		6B11C5BE0FA90678D391E64F /* Pods-RunnerTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.debug.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.debug.xcconfig"; sourceTree = "<group>"; };
 		74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Runner-Bridging-Header.h"; sourceTree = "<group>"; };
 		74858FAE1ED2DC5600515810 /* AppDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = "<group>"; };
 		7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = Release.xcconfig; path = Flutter/Release.xcconfig; sourceTree = "<group>"; };
-		8D0D0C623F365E1BD2034B4E /* Pods-RunnerTests.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.profile.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.profile.xcconfig"; sourceTree = "<group>"; };
-		92D2DA0C58605FDDA6600F52 /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; };
 		9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Debug.xcconfig; path = Flutter/Debug.xcconfig; sourceTree = "<group>"; };
 		9740EEB31CF90195004384FC /* Generated.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Generated.xcconfig; path = Flutter/Generated.xcconfig; sourceTree = "<group>"; };
 		97C146EE1CF9000F007C117D /* Runner.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Runner.app; sourceTree = BUILT_PRODUCTS_DIR; };
@@ -64,8 +63,9 @@
 		97C146FD1CF9000F007C117D /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = "<group>"; };
 		97C147001CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = "<group>"; };
 		97C147021CF9000F007C117D /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
-		A97B5AE46C1D16447C700518 /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = "<group>"; };
-		AA7B5387E0D23F4C81F57252 /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = "<group>"; };
+		9E0B512C107FA23A0CD848AA /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = "<group>"; };
+		BC32EF20481FBA217A34C47D /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = "<group>"; };
+		C70AD320E839F7550153E92D /* Pods-RunnerTests.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.profile.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.profile.xcconfig"; sourceTree = "<group>"; };
 /* End PBXFileReference section */
 
 /* Begin PBXFrameworksBuildPhase section */
@@ -73,7 +73,7 @@
 			isa = PBXFrameworksBuildPhase;
 			buildActionMask = 2147483647;
 			files = (
-				85DDAD4C1F713879496C06E0 /* Pods_RunnerTests.framework in Frameworks */,
+				B6C93FBF46DAEB66D210430D /* Pods_RunnerTests.framework in Frameworks */,
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 		};
@@ -81,7 +81,7 @@
 			isa = PBXFrameworksBuildPhase;
 			buildActionMask = 2147483647;
 			files = (
-				27E46E907725369734A7EE68 /* Pods_Runner.framework in Frameworks */,
+				92B40AF4EDF44D8A7599A77A /* Pods_Runner.framework in Frameworks */,
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 		};
@@ -91,12 +91,12 @@
 		16DCD684832953174E92ED56 /* Pods */ = {
 			isa = PBXGroup;
 			children = (
-				A97B5AE46C1D16447C700518 /* Pods-Runner.debug.xcconfig */,
-				AA7B5387E0D23F4C81F57252 /* Pods-Runner.release.xcconfig */,
-				1D9BAB2ACD05F4E34704A073 /* Pods-Runner.profile.xcconfig */,
-				1826437B41CD439EFAB3E1C1 /* Pods-RunnerTests.debug.xcconfig */,
-				1FCA1CD501DE35B46D2B2EC8 /* Pods-RunnerTests.release.xcconfig */,
-				8D0D0C623F365E1BD2034B4E /* Pods-RunnerTests.profile.xcconfig */,
+				6242D04867DBAE678644097C /* Pods-Runner.debug.xcconfig */,
+				BC32EF20481FBA217A34C47D /* Pods-Runner.release.xcconfig */,
+				9E0B512C107FA23A0CD848AA /* Pods-Runner.profile.xcconfig */,
+				6B11C5BE0FA90678D391E64F /* Pods-RunnerTests.debug.xcconfig */,
+				3B0F46864C117910E6A10161 /* Pods-RunnerTests.release.xcconfig */,
+				C70AD320E839F7550153E92D /* Pods-RunnerTests.profile.xcconfig */,
 			);
 			path = Pods;
 			sourceTree = "<group>";
@@ -109,15 +109,6 @@
 			path = RunnerTests;
 			sourceTree = "<group>";
 		};
-		6520DE7C2A6C7ADBEE742B07 /* Frameworks */ = {
-			isa = PBXGroup;
-			children = (
-				92D2DA0C58605FDDA6600F52 /* Pods_Runner.framework */,
-				0927DA3C94D549E7C5EC0958 /* Pods_RunnerTests.framework */,
-			);
-			name = Frameworks;
-			sourceTree = "<group>";
-		};
 		9740EEB11CF90186004384FC /* Flutter */ = {
 			isa = PBXGroup;
 			children = (
@@ -137,7 +128,7 @@
 				97C146EF1CF9000F007C117D /* Products */,
 				331C8082294A63A400263BE5 /* RunnerTests */,
 				16DCD684832953174E92ED56 /* Pods */,
-				6520DE7C2A6C7ADBEE742B07 /* Frameworks */,
+				EB0A25748438F5A5D11C34DD /* Frameworks */,
 			);
 			sourceTree = "<group>";
 		};
@@ -166,6 +157,15 @@
 			path = Runner;
 			sourceTree = "<group>";
 		};
+		EB0A25748438F5A5D11C34DD /* Frameworks */ = {
+			isa = PBXGroup;
+			children = (
+				300715D2202B4EFB7419B4DD /* Pods_Runner.framework */,
+				42FDD72B3D37E1E76FE0BF67 /* Pods_RunnerTests.framework */,
+			);
+			name = Frameworks;
+			sourceTree = "<group>";
+		};
 /* End PBXGroup section */
 
 /* Begin PBXNativeTarget section */
@@ -173,7 +173,7 @@
 			isa = PBXNativeTarget;
 			buildConfigurationList = 331C8087294A63A400263BE5 /* Build configuration list for PBXNativeTarget "RunnerTests" */;
 			buildPhases = (
-				E9579EDFD1CEA45AEC51FB36 /* [CP] Check Pods Manifest.lock */,
+				A51FDB33AFA7209CBBD1D566 /* [CP] Check Pods Manifest.lock */,
 				331C807D294A63A400263BE5 /* Sources */,
 				331C807F294A63A400263BE5 /* Resources */,
 				7ACCDC8B09D672B8F500CBE3 /* Frameworks */,
@@ -192,15 +192,15 @@
 			isa = PBXNativeTarget;
 			buildConfigurationList = 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */;
 			buildPhases = (
-				B14DFDA38AC31F8F2B22E107 /* [CP] Check Pods Manifest.lock */,
+				89FF2B1B4E742965844CDF60 /* [CP] Check Pods Manifest.lock */,
 				9740EEB61CF901F6004384FC /* Run Script */,
 				97C146EA1CF9000F007C117D /* Sources */,
 				97C146EB1CF9000F007C117D /* Frameworks */,
 				97C146EC1CF9000F007C117D /* Resources */,
 				9705A1C41CF9048500538489 /* Embed Frameworks */,
 				3B06AD1E1E4923F5004D2608 /* Thin Binary */,
-				62A200EC4C96F3CED7A67E38 /* [CP] Embed Pods Frameworks */,
-				C857831E004A50F7D4270CF0 /* [CP] Copy Pods Resources */,
+				1E808EF7667A66CFC4B9F80D /* [CP] Embed Pods Frameworks */,
+				AD41E8F8F575131C6B483AC9 /* [CP] Copy Pods Resources */,
 			);
 			buildRules = (
 			);
@@ -272,23 +272,7 @@
 /* End PBXResourcesBuildPhase section */
 
 /* Begin PBXShellScriptBuildPhase section */
-		3B06AD1E1E4923F5004D2608 /* Thin Binary */ = {
-			isa = PBXShellScriptBuildPhase;
-			alwaysOutOfDate = 1;
-			buildActionMask = 2147483647;
-			files = (
-			);
-			inputPaths = (
-				"${TARGET_BUILD_DIR}/${INFOPLIST_PATH}",
-			);
-			name = "Thin Binary";
-			outputPaths = (
-			);
-			runOnlyForDeploymentPostprocessing = 0;
-			shellPath = /bin/sh;
-			shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" embed_and_thin";
-		};
-		62A200EC4C96F3CED7A67E38 /* [CP] Embed Pods Frameworks */ = {
+		1E808EF7667A66CFC4B9F80D /* [CP] Embed Pods Frameworks */ = {
 			isa = PBXShellScriptBuildPhase;
 			buildActionMask = 2147483647;
 			files = (
@@ -305,22 +289,23 @@
 			shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n";
 			showEnvVarsInLog = 0;
 		};
-		9740EEB61CF901F6004384FC /* Run Script */ = {
+		3B06AD1E1E4923F5004D2608 /* Thin Binary */ = {
 			isa = PBXShellScriptBuildPhase;
 			alwaysOutOfDate = 1;
 			buildActionMask = 2147483647;
 			files = (
 			);
 			inputPaths = (
+				"${TARGET_BUILD_DIR}/${INFOPLIST_PATH}",
 			);
-			name = "Run Script";
+			name = "Thin Binary";
 			outputPaths = (
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 			shellPath = /bin/sh;
-			shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" build";
+			shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" embed_and_thin";
 		};
-		B14DFDA38AC31F8F2B22E107 /* [CP] Check Pods Manifest.lock */ = {
+		89FF2B1B4E742965844CDF60 /* [CP] Check Pods Manifest.lock */ = {
 			isa = PBXShellScriptBuildPhase;
 			buildActionMask = 2147483647;
 			files = (
@@ -342,24 +327,22 @@
 			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;
 		};
-		C857831E004A50F7D4270CF0 /* [CP] Copy Pods Resources */ = {
+		9740EEB61CF901F6004384FC /* Run Script */ = {
 			isa = PBXShellScriptBuildPhase;
+			alwaysOutOfDate = 1;
 			buildActionMask = 2147483647;
 			files = (
 			);
-			inputFileListPaths = (
-				"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-resources-${CONFIGURATION}-input-files.xcfilelist",
+			inputPaths = (
 			);
-			name = "[CP] Copy Pods Resources";
-			outputFileListPaths = (
-				"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-resources-${CONFIGURATION}-output-files.xcfilelist",
+			name = "Run Script";
+			outputPaths = (
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 			shellPath = /bin/sh;
-			shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-resources.sh\"\n";
-			showEnvVarsInLog = 0;
+			shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" build";
 		};
-		E9579EDFD1CEA45AEC51FB36 /* [CP] Check Pods Manifest.lock */ = {
+		A51FDB33AFA7209CBBD1D566 /* [CP] Check Pods Manifest.lock */ = {
 			isa = PBXShellScriptBuildPhase;
 			buildActionMask = 2147483647;
 			files = (
@@ -381,6 +364,23 @@
 			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;
 		};
+		AD41E8F8F575131C6B483AC9 /* [CP] Copy Pods Resources */ = {
+			isa = PBXShellScriptBuildPhase;
+			buildActionMask = 2147483647;
+			files = (
+			);
+			inputFileListPaths = (
+				"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-resources-${CONFIGURATION}-input-files.xcfilelist",
+			);
+			name = "[CP] Copy Pods Resources";
+			outputFileListPaths = (
+				"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-resources-${CONFIGURATION}-output-files.xcfilelist",
+			);
+			runOnlyForDeploymentPostprocessing = 0;
+			shellPath = /bin/sh;
+			shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-resources.sh\"\n";
+			showEnvVarsInLog = 0;
+		};
 /* End PBXShellScriptBuildPhase section */
 
 /* Begin PBXSourcesBuildPhase section */
@@ -514,7 +514,7 @@
 		};
 		331C8088294A63A400263BE5 /* Debug */ = {
 			isa = XCBuildConfiguration;
-			baseConfigurationReference = 1826437B41CD439EFAB3E1C1 /* Pods-RunnerTests.debug.xcconfig */;
+			baseConfigurationReference = 6B11C5BE0FA90678D391E64F /* Pods-RunnerTests.debug.xcconfig */;
 			buildSettings = {
 				BUNDLE_LOADER = "$(TEST_HOST)";
 				CODE_SIGN_STYLE = Automatic;
@@ -532,7 +532,7 @@
 		};
 		331C8089294A63A400263BE5 /* Release */ = {
 			isa = XCBuildConfiguration;
-			baseConfigurationReference = 1FCA1CD501DE35B46D2B2EC8 /* Pods-RunnerTests.release.xcconfig */;
+			baseConfigurationReference = 3B0F46864C117910E6A10161 /* Pods-RunnerTests.release.xcconfig */;
 			buildSettings = {
 				BUNDLE_LOADER = "$(TEST_HOST)";
 				CODE_SIGN_STYLE = Automatic;
@@ -548,7 +548,7 @@
 		};
 		331C808A294A63A400263BE5 /* Profile */ = {
 			isa = XCBuildConfiguration;
-			baseConfigurationReference = 8D0D0C623F365E1BD2034B4E /* Pods-RunnerTests.profile.xcconfig */;
+			baseConfigurationReference = C70AD320E839F7550153E92D /* Pods-RunnerTests.profile.xcconfig */;
 			buildSettings = {
 				BUNDLE_LOADER = "$(TEST_HOST)";
 				CODE_SIGN_STYLE = Automatic;

+ 2 - 0
ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme

@@ -26,6 +26,7 @@
       buildConfiguration = "Debug"
       selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
       selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
+      customLLDBInitFile = "$(SRCROOT)/Flutter/ephemeral/flutter_lldbinit"
       shouldUseLaunchSchemeArgsEnv = "YES">
       <MacroExpansion>
          <BuildableReference
@@ -54,6 +55,7 @@
       buildConfiguration = "Debug"
       selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
       selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
+      customLLDBInitFile = "$(SRCROOT)/Flutter/ephemeral/flutter_lldbinit"
       launchStyle = "0"
       useCustomWorkingDirectory = "NO"
       ignoresPersistentStateOnLaunch = "NO"

+ 10 - 0
ios/Runner/AppDelegate.swift

@@ -19,9 +19,19 @@ import UserNotifications
         }
         ///设置推送
         setupPushNotifications();
+        
+        ///通知flutter打开了应用
+        DispatchQueue.main.asyncAfter(deadline: .now() + 2.0) { [weak self] in
+            print("applicationDidFinishLaunchingWithOptionssfsdfsdfsd-f---");
+            self?.pushChannel?.invokeMethod("applicationDidFinishLaunchingWithOptions", arguments: "")
+        }
         return super.application(application, didFinishLaunchingWithOptions: launchOptions)
     }
     
+    override func applicationDidEnterBackground(_ application: UIApplication) {
+        pushChannel?.invokeMethod("applicationDidEnterBackground", arguments: "")
+    }
+    
     /// 设置推送通知
     func setupPushNotifications() {
         let controller = window?.rootViewController as! FlutterViewController

+ 1 - 0
lib/module/member/member_controller.dart

@@ -27,6 +27,7 @@ import '../../data/bean/wechat_payment_sign_bean.dart';
 import '../../data/consts/error_code.dart';
 import '../../data/consts/payment_type.dart';
 import '../../data/consts/web_url.dart';
+import '../../data/repositories/phone_event_repository.dart';
 import '../../dialog/common_confirm_dialog_impl.dart';
 import '../../dialog/loading_dialog.dart';
 import '../../dialog/member_retain_dialog.dart';

+ 10 - 0
lib/push_notification/ios_push_notification_service.dart

@@ -1,8 +1,10 @@
 import 'package:flutter/services.dart';
+import 'package:mobile_use_statistics/flutter_mobile_statistics.dart';
 
 
 import '../data/bean/user_info.dart';
 import '../data/repositories/account_repository.dart';
+import '../data/repositories/phone_event_repository.dart';
 import '../data/repositories/track_repository.dart';
 import '../dialog/common_alert_dialog_impl.dart';
 import '../dialog/common_confirm_dialog_impl.dart';
@@ -44,6 +46,14 @@ class IosPushNotificationService {
             onNotificationTapped?.call(Map<String, dynamic>.from(call.arguments));
           }
           break;
+        case 'applicationDidFinishLaunchingWithOptions':
+          ///第一次打开app
+          MobileUseStatistics.appLaunchAnActivation();
+          break;
+        case 'applicationDidEnterBackground':
+        //进入后台通知
+          MobileUseStatistics.appEntersTheBacken();
+          break;
         default:
           throw PlatformException(
             code: 'UNIMPLEMENTED',

+ 339 - 0
plugins/mobile_use_statistics/ios/Classes/BackgroundTasks.swift

@@ -0,0 +1,339 @@
+//
+//  BackgroundTasks.swift
+//  map_mapkit_ios
+//
+//  Created by 诺诺诺的言 on 2025/7/14.
+//
+
+import BackgroundTasks
+import Combine
+
+@available(iOS 13.0, *)
+class BackgroundTaskManager {
+    static let shared = BackgroundTaskManager()
+    private let backgroundTaskIdentifier = "com.your.app.screenlock.monitor"
+    
+    func registerBackgroundTask() {
+        BGTaskScheduler.shared.register(
+            forTaskWithIdentifier: backgroundTaskIdentifier,
+            using: nil
+        ) { task in
+            self.handleBackgroundTask(task: task as! BGProcessingTask)
+        }
+    }
+    
+    func scheduleBackgroundTask() {
+        let request = BGProcessingTaskRequest(identifier: backgroundTaskIdentifier)
+        request.requiresNetworkConnectivity = false
+        request.requiresExternalPower = false
+        request.earliestBeginDate = Date(timeIntervalSinceNow: 60) // 1分钟后
+        
+        do {
+            try BGTaskScheduler.shared.submit(request)
+        } catch {
+            print("无法提交后台任务: \(error.localizedDescription)")
+        }
+    }
+    
+    private func handleBackgroundTask(task: BGProcessingTask) {
+        // 设置任务过期处理
+        task.expirationHandler = {
+            task.setTaskCompleted(success: false)
+        }
+        
+        // 开始监测
+        ScreenLockMonitor.shared.startMonitoringInBackground()
+        
+        // 安排下一个任务
+        self.scheduleBackgroundTask()
+        
+        task.setTaskCompleted(success: true)
+    }
+}
+
+
+import Foundation
+
+// 定义屏幕事件类型
+struct ScreenEvent: Codable {
+    let timestamp: Date
+    let eventType: EventType
+    
+    enum EventType: String, Codable {
+        case lock = "锁屏"
+        case unlock = "解锁"
+    }
+}
+
+
+
+@available(iOS 13.0, *)
+class ScreenLockMonitor {
+    static let shared = ScreenLockMonitor()
+    private var lastState: Bool?
+    private let stateChangeSubject = PassthroughSubject<ScreenEvent, Never>()
+    
+    var stateChangePublisher: AnyPublisher<ScreenEvent, Never> {
+        stateChangeSubject.eraseToAnyPublisher()
+    }
+    
+    func startMonitoringInBackground() {
+        NotificationCenter.default.addObserver(
+            self,
+            selector: #selector(protectedDataWillBecomeUnavailable),
+            name: UIApplication.protectedDataWillBecomeUnavailableNotification,
+            object: nil
+        )
+        
+        NotificationCenter.default.addObserver(
+            self,
+            selector: #selector(protectedDataDidBecomeAvailable),
+            name: UIApplication.protectedDataDidBecomeAvailableNotification,
+            object: nil
+        )
+        
+        // 启动时检查当前状态
+        checkInitialState()
+    }
+    
+    private func checkInitialState() {
+        let isProtectedDataAvailable = UIApplication.shared.isProtectedDataAvailable
+        if lastState != isProtectedDataAvailable {
+            lastState = isProtectedDataAvailable
+            let event = ScreenEvent(
+                timestamp: Date(),
+                eventType: isProtectedDataAvailable ? .unlock : .lock
+            )
+            persistEvent(event: event)
+        }
+    }
+    
+    @objc private func protectedDataWillBecomeUnavailable() {
+        recordEvent(eventType: .lock)
+    }
+    
+    @objc private func protectedDataDidBecomeAvailable() {
+        recordEvent(eventType: .unlock)
+    }
+    
+    private func recordEvent(eventType: ScreenEvent.EventType) {
+        let event = ScreenEvent(
+            timestamp: Date(),
+            eventType: eventType
+        )
+        persistEvent(event: event)
+        stateChangeSubject.send(event)
+    }
+    
+    private func persistEvent(event: ScreenEvent) {
+        // 使用CoreData持久化存储
+        //CoreDataManager.shared.saveScreenEvent(event)
+        print("eventsfsfdsd---\(event.timestamp)---\(event.eventType)")
+        
+        // 同时写入文件备份
+        FileStorageManager.shared.saveEvent(event)
+    }
+}
+
+
+import CoreData
+
+class CoreDataManager {
+    static let shared = CoreDataManager()
+    private let persistentContainer: NSPersistentContainer
+    
+    private init() {
+        persistentContainer = NSPersistentContainer(name: "ScreenEventsModel")
+        persistentContainer.loadPersistentStores { description, error in
+            if let error = error {
+                fatalError("无法加载CoreData存储: \(error)")
+            }
+        }
+    }
+    
+    func getEventsBetween(startDate: Date, endDate: Date) -> [ScreenEvent] {
+        let request: NSFetchRequest<ScreenEventEntity> = ScreenEventEntity.fetchRequest()
+        
+        // 设置时间范围谓词
+        request.predicate = NSPredicate(
+            format: "timestamp >= %@ AND timestamp <= %@",
+            startDate as NSDate,
+            endDate as NSDate
+        )
+        
+        // 按时间升序排列
+        request.sortDescriptors = [NSSortDescriptor(key: "timestamp", ascending: true)]
+        
+        do {
+            let results = try persistentContainer.viewContext.fetch(request)
+            return results.compactMap {
+                guard let timestamp = $0.timestamp else { return nil }
+                return ScreenEvent(
+                    timestamp: timestamp,
+                    eventType: ScreenEvent.EventType(rawValue: $0.eventType ?? "lock") ?? .lock
+                )
+            }
+        } catch {
+            print("查询事件失败: \(error)")
+            return []
+        }
+    }
+    
+    func saveScreenEvent(_ event: ScreenEvent) {
+        let context = persistentContainer.viewContext
+        let entity = ScreenEventEntity(context: context)
+        entity.timestamp = event.timestamp
+        entity.eventType = event.eventType.rawValue
+        
+        do {
+            try context.save()
+        } catch {
+            print("保存事件失败: \(error)")
+        }
+    }
+    
+    func getAllEvents() -> [ScreenEvent] {
+        let request: NSFetchRequest<ScreenEventEntity> = ScreenEventEntity.fetchRequest()
+        request.sortDescriptors = [NSSortDescriptor(key: "timestamp", ascending: false)]
+        
+        do {
+            let results = try persistentContainer.viewContext.fetch(request)
+            return results.map {
+                ScreenEvent(
+                    timestamp: $0.timestamp ?? Date(),
+                    eventType: ScreenEvent.EventType(rawValue: $0.eventType ?? "lock") ?? .lock
+                )
+            }
+        } catch {
+            print("获取事件失败: \(error)")
+            return []
+        }
+    }
+}
+
+// CoreData实体
+public class ScreenEventEntity: NSManagedObject {
+    @NSManaged public var timestamp: Date?
+    @NSManaged public var eventType: String?
+}
+
+extension ScreenEventEntity {
+    @nonobjc public class func fetchRequest() -> NSFetchRequest<ScreenEventEntity> {
+        return NSFetchRequest<ScreenEventEntity>(entityName: "ScreenEventEntity")
+    }
+}
+
+
+
+
+class FileStorageManager {
+    static let shared = FileStorageManager()
+    private let fileURL = FileManager.default
+        .urls(for: .documentDirectory, in: .userDomainMask)[0]
+        .appendingPathComponent("screenEventsBackup.json")
+    
+    func saveEvent(_ event: ScreenEvent) {
+        var existingEvents = loadEvents()
+        existingEvents.append(event)
+        
+        do {
+            let data = try JSONEncoder().encode(existingEvents)
+            try data.write(to: fileURL)
+        } catch {
+            print("文件存储失败: \(error)")
+        }
+    }
+    
+    func loadEvents() -> [ScreenEvent] {
+        do {
+            let data = try Data(contentsOf: fileURL)
+            return try JSONDecoder().decode([ScreenEvent].self, from: data)
+        } catch {
+            return []
+        }
+    }
+        
+    /// 从JSON文件中获取时间范围内的事件
+      func getEventsBetween(startDate: Date, endDate: Date) -> [ScreenEvent] {
+          let allEvents = loadEvents()
+          return allEvents.filter {
+              $0.timestamp >= startDate && $0.timestamp <= endDate
+          }.sorted {
+              $0.timestamp < $1.timestamp
+          }
+      }
+}
+
+
+class EventQueryService {
+    static let shared = EventQueryService()
+    
+    /// 获取时间范围内的事件并转换为字典列表
+    func getEventPairsBetween(startDate: Date, endDate: Date) -> [[String: Any]] {
+        // 获取原始事件(已按时间排序)
+        let events = getOrderedEventsBetween(startDate: startDate, endDate: endDate)
+        var result = [[String: Any]]()
+        var currentLockEvent: ScreenEvent?
+        
+        for event in events {
+            switch event.eventType {
+            case .lock:
+                // 如果遇到新的锁屏事件而前一个未配对,则保存前一个不完整记录
+                if let lockEvent = currentLockEvent {
+                    result.append([
+                        "startTime": lockEvent.timestamp,
+                        "endTime": event.timestamp // 异常情况:两个锁屏事件之间没有解锁
+                    ])
+                }
+                currentLockEvent = event
+                
+            case .unlock:
+                if let lockEvent = currentLockEvent {
+                    // 正常情况:锁屏-解锁配对
+                    result.append([
+                        "startTime": lockEvent.timestamp,
+                        "endTime": event.timestamp
+                    ])
+                    currentLockEvent = nil
+                } else {
+                    // 异常情况:第一个事件是解锁事件
+                    result.append([
+                        "startTime": startDate, // 用查询开始时间作为默认值
+                        "endTime": event.timestamp
+                    ])
+                }
+            }
+        }
+        
+        // 处理最后一个未配对的锁屏事件
+        if let lockEvent = currentLockEvent {
+            result.append([
+                "startTime": lockEvent.timestamp,
+                "endTime": 0 // 用查询结束时间作为默认值
+            ])
+        }
+        
+        return result
+    }
+    
+    /// 私有方法:获取排序后的事件列表
+    private func getOrderedEventsBetween(startDate: Date, endDate: Date) -> [ScreenEvent] {
+        // 从CoreData获取
+//        let coreDataEvents = CoreDataManager.shared.getEventsBetween(
+//            startDate: startDate,
+//            endDate: endDate
+//        )
+        
+        // 从文件备份获取
+        let fileEvents = FileStorageManager.shared.getEventsBetween(
+            startDate: startDate,
+            endDate: endDate
+        )
+        
+        // 合并、去重并排序
+        var allEvents = fileEvents;//Array<Any>(Set.init(from: fileEvents)) // 去重
+        allEvents.sort { $0.timestamp < $1.timestamp } // 按时间升序
+        
+        return allEvents
+    }
+}

+ 87 - 13
plugins/mobile_use_statistics/ios/Classes/MobileUseStatisticsPlugin.swift

@@ -1,19 +1,93 @@
 import Flutter
-import UIKit
+import Foundation
 
+@available(iOS 13.0, *)
 public class MobileUseStatisticsPlugin: NSObject, FlutterPlugin {
-  public static func register(with registrar: FlutterPluginRegistrar) {
-    let channel = FlutterMethodChannel(name: "mobile_use_statistics", binaryMessenger: registrar.messenger())
-    let instance = MobileUseStatisticsPlugin()
-    registrar.addMethodCallDelegate(instance, channel: channel)
-  }
+    
+    public static func register(with registrar: FlutterPluginRegistrar) {
+        let channel = FlutterMethodChannel(
+            name: "mobile_use_statistics",
+            binaryMessenger: registrar.messenger()
+        )
+        let instance = MobileUseStatisticsPlugin()
+        registrar.addMethodCallDelegate(instance, channel: channel)
+    }
+    
+    public func handle(_ call: FlutterMethodCall, result: @escaping FlutterResult) {
+        switch call.method {
+        case "getLockScreenStatistics":
+            handleGetLockScreenStatistics(call: call, result: result)
+            
+        case "hasUseStatisticsPermission":
+            result(true)
+            
+        case "requestUseStatisticsPermission":
+            result(nil)
+            
+        case "appLaunchAnActivationPermission":
+            BackgroundTaskManager.shared.registerBackgroundTask()
+            ScreenLockMonitor.shared.startMonitoringInBackground()
+            result(nil)
+            
+        case "appEntersTheBackenPermission":
+            BackgroundTaskManager.shared.scheduleBackgroundTask()
+            result(nil)
+            
+        default:
+            result(FlutterMethodNotImplemented)
+        }
+    }
+    
+    private func handleGetLockScreenStatistics(call: FlutterMethodCall, result: @escaping FlutterResult) {
+        do {
+            guard let args = call.arguments as? [String: Any],
+                  let startTime = args["startTime"] as? Int,
+                  let endTime = args["endTime"] as? Int else {
+                throw FlutterError(code: "INVALID_ARGUMENTS",
+                                 message: "Required parameters: startTime(Int), endTime(Int)",
+                                   details: nil) as! any Error
+            }
+            
+            // 时间戳转换(秒级→Date)
+            let startDate = Date(timeIntervalSince1970: TimeInterval(startTime))
+            let endDate = Date(timeIntervalSince1970: TimeInterval(endTime))
+            
+            print("查询时间范围: \(startDate) - \(endDate)")
+            
+            // 获取事件对
+            let eventPairs = EventQueryService.shared.getEventPairsBetween(
+                startDate: startDate,
+                endDate: endDate
+            )
+            
+            // 转换为Flutter可接收的格式
+            let response = eventPairs.map { pair in
+                return [
+                    "startTime": Int((pair["startTime"]! as AnyObject).timeIntervalSince1970),
+                    "endTime": Int((pair["endTime"]! as AnyObject).timeIntervalSince1970)
+                ]
+            }
+            print("responsesfsdfs--A-\(response)")
+            result(response)
+            
+        } catch let error as FlutterError {
+            result(error)
+        } catch {
+            result(FlutterError(code: "UNKNOWN_ERROR",
+                              message: error.localizedDescription,
+                              details: nil))
+        }
+    }
+}
 
-  public func handle(_ call: FlutterMethodCall, result: @escaping FlutterResult) {
-    switch call.method {
-    case "getPlatformVersion":
-      result("iOS " + UIDevice.current.systemVersion)
-    default:
-      result(FlutterMethodNotImplemented)
+extension Date {
+    /// Flutter时间戳(秒级)
+    var flutterTimestamp: Int {
+        return Int(timeIntervalSince1970)
+    }
+    
+    /// 从Flutter时间戳初始化
+    static func fromFlutterTimestamp(_ timestamp: Int) -> Date {
+        return Date(timeIntervalSince1970: TimeInterval(timestamp))
     }
-  }
 }

+ 10 - 0
plugins/mobile_use_statistics/lib/src/mobile_use_statistics.dart

@@ -21,4 +21,14 @@ class MobileUseStatistics {
     return MobileUseStatisticsPlatform.instance
         .requestUseStatisticsPermission();
   }
+
+  ///app启动开启
+  static Future<void>appLaunchAnActivation() async {
+    return MobileUseStatisticsPlatform.instance.appLaunchAnActivationPermission();
+  }
+
+  ///app进入后台
+  static Future<void>appEntersTheBacken() async {
+    return MobileUseStatisticsPlatform.instance.appEntersTheBacken();
+  }
 }

+ 15 - 1
plugins/mobile_use_statistics/lib/src/mobile_use_statistics_method_channel.dart

@@ -19,7 +19,6 @@ class MethodChannelMobileUseStatistics extends MobileUseStatisticsPlatform {
       'getLockScreenStatistics',
       <String, dynamic>{'startTime': startTime, 'endTime': endTime},
     );
-
     return result
         ?.map((e) => Event.fromJson(Map<String, dynamic>.from(e as Map)))
         .toList();
@@ -40,4 +39,19 @@ class MethodChannelMobileUseStatistics extends MobileUseStatisticsPlatform {
     );
     return hasPermission ?? false;
   }
+
+  ///app启动开启
+  @override
+  Future<void>appLaunchAnActivationPermission() async {
+    await methodChannel.invokeMethod<bool>(
+      'appLaunchAnActivationPermission',
+    );
+  }
+
+  ///app进入后台
+  Future<void>appEntersTheBacken() async {
+    await methodChannel.invokeMethod<bool>(
+      'appEntersTheBackenPermission',
+    );
+  }
 }

+ 14 - 0
plugins/mobile_use_statistics/lib/src/mobile_use_statistics_platform_interface.dart

@@ -42,4 +42,18 @@ abstract class MobileUseStatisticsPlatform extends PlatformInterface {
       'requestUseStatisticsPermission() has not been implemented.',
     );
   }
+
+  ///app启动开启
+  Future<void>appLaunchAnActivationPermission() async {
+    throw UnimplementedError(
+      'appLaunchAnActivationPermission() has not been implemented.',
+    );
+  }
+
+  ///app进入后台
+  Future<void>appEntersTheBacken() async {
+    throw UnimplementedError(
+      'appEntersTheBacken() has not been implemented.',
+    );
+  }
 }