Commit cda59edd authored by Wei Han's avatar Wei Han

code update

parent d5fc7ec0
...@@ -8,22 +8,22 @@ ...@@ -8,22 +8,22 @@
/* Begin PBXBuildFile section */ /* Begin PBXBuildFile section */
13B07FBF1A68108700A75B9A /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 13B07FB51A68108700A75B9A /* Images.xcassets */; }; 13B07FBF1A68108700A75B9A /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 13B07FB51A68108700A75B9A /* Images.xcassets */; };
1EE3505D2884B35517284FC0 /* libPods-example.a in Frameworks */ = {isa = PBXBuildFile; fileRef = DA1877716B752590ECD37293 /* libPods-example.a */; };
44006126336D83DB220E7214 /* PrivacyInfo.xcprivacy in Resources */ = {isa = PBXBuildFile; fileRef = 13B07FB81A68108700A75B9A /* PrivacyInfo.xcprivacy */; }; 44006126336D83DB220E7214 /* PrivacyInfo.xcprivacy in Resources */ = {isa = PBXBuildFile; fileRef = 13B07FB81A68108700A75B9A /* PrivacyInfo.xcprivacy */; };
761780ED2CA45674006654EE /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 761780EC2CA45674006654EE /* AppDelegate.swift */; }; 761780ED2CA45674006654EE /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 761780EC2CA45674006654EE /* AppDelegate.swift */; };
81AB9BB82411601600AC10FF /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 81AB9BB72411601600AC10FF /* LaunchScreen.storyboard */; }; 81AB9BB82411601600AC10FF /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 81AB9BB72411601600AC10FF /* LaunchScreen.storyboard */; };
915A61EF3FB0D83A24210E3E /* libPods-example.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 6B30817B782A4551FE77ED4D /* libPods-example.a */; };
/* End PBXBuildFile section */ /* End PBXBuildFile section */
/* Begin PBXFileReference section */ /* Begin PBXFileReference section */
08A8F0EC3E4A7E9111ABA675 /* Pods-example.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-example.release.xcconfig"; path = "Target Support Files/Pods-example/Pods-example.release.xcconfig"; sourceTree = "<group>"; };
13B07F961A680F5B00A75B9A /* example.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = example.app; sourceTree = BUILT_PRODUCTS_DIR; }; 13B07F961A680F5B00A75B9A /* example.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = example.app; sourceTree = BUILT_PRODUCTS_DIR; };
13B07FB51A68108700A75B9A /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; name = Images.xcassets; path = example/Images.xcassets; sourceTree = "<group>"; }; 13B07FB51A68108700A75B9A /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; name = Images.xcassets; path = example/Images.xcassets; sourceTree = "<group>"; };
13B07FB61A68108700A75B9A /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = Info.plist; path = example/Info.plist; sourceTree = "<group>"; }; 13B07FB61A68108700A75B9A /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = Info.plist; path = example/Info.plist; sourceTree = "<group>"; };
13B07FB81A68108700A75B9A /* PrivacyInfo.xcprivacy */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = PrivacyInfo.xcprivacy; path = example/PrivacyInfo.xcprivacy; sourceTree = "<group>"; }; 13B07FB81A68108700A75B9A /* PrivacyInfo.xcprivacy */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = PrivacyInfo.xcprivacy; path = example/PrivacyInfo.xcprivacy; sourceTree = "<group>"; };
378A4C515FDC6061AD68C42E /* Pods-example.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-example.debug.xcconfig"; path = "Target Support Files/Pods-example/Pods-example.debug.xcconfig"; sourceTree = "<group>"; }; 3CEA4A8FA353AAF71956ECAB /* Pods-example.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-example.release.xcconfig"; path = "Target Support Files/Pods-example/Pods-example.release.xcconfig"; sourceTree = "<group>"; };
6224139EF36E532E27122179 /* Pods-example.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-example.debug.xcconfig"; path = "Target Support Files/Pods-example/Pods-example.debug.xcconfig"; sourceTree = "<group>"; };
6B30817B782A4551FE77ED4D /* libPods-example.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-example.a"; sourceTree = BUILT_PRODUCTS_DIR; };
761780EC2CA45674006654EE /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; name = AppDelegate.swift; path = example/AppDelegate.swift; sourceTree = "<group>"; }; 761780EC2CA45674006654EE /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; name = AppDelegate.swift; path = example/AppDelegate.swift; sourceTree = "<group>"; };
81AB9BB72411601600AC10FF /* LaunchScreen.storyboard */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.storyboard; name = LaunchScreen.storyboard; path = example/LaunchScreen.storyboard; sourceTree = "<group>"; }; 81AB9BB72411601600AC10FF /* LaunchScreen.storyboard */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.storyboard; name = LaunchScreen.storyboard; path = example/LaunchScreen.storyboard; sourceTree = "<group>"; };
DA1877716B752590ECD37293 /* libPods-example.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-example.a"; sourceTree = BUILT_PRODUCTS_DIR; };
ED297162215061F000B7C4FE /* JavaScriptCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = JavaScriptCore.framework; path = System/Library/Frameworks/JavaScriptCore.framework; sourceTree = SDKROOT; }; ED297162215061F000B7C4FE /* JavaScriptCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = JavaScriptCore.framework; path = System/Library/Frameworks/JavaScriptCore.framework; sourceTree = SDKROOT; };
/* End PBXFileReference section */ /* End PBXFileReference section */
...@@ -32,7 +32,7 @@ ...@@ -32,7 +32,7 @@
isa = PBXFrameworksBuildPhase; isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647; buildActionMask = 2147483647;
files = ( files = (
1EE3505D2884B35517284FC0 /* libPods-example.a in Frameworks */, 915A61EF3FB0D83A24210E3E /* libPods-example.a in Frameworks */,
); );
runOnlyForDeploymentPostprocessing = 0; runOnlyForDeploymentPostprocessing = 0;
}; };
...@@ -55,7 +55,7 @@ ...@@ -55,7 +55,7 @@
isa = PBXGroup; isa = PBXGroup;
children = ( children = (
ED297162215061F000B7C4FE /* JavaScriptCore.framework */, ED297162215061F000B7C4FE /* JavaScriptCore.framework */,
DA1877716B752590ECD37293 /* libPods-example.a */, 6B30817B782A4551FE77ED4D /* libPods-example.a */,
); );
name = Frameworks; name = Frameworks;
sourceTree = "<group>"; sourceTree = "<group>";
...@@ -92,8 +92,8 @@ ...@@ -92,8 +92,8 @@
BBD78D7AC51CEA395F1C20DB /* Pods */ = { BBD78D7AC51CEA395F1C20DB /* Pods */ = {
isa = PBXGroup; isa = PBXGroup;
children = ( children = (
378A4C515FDC6061AD68C42E /* Pods-example.debug.xcconfig */, 6224139EF36E532E27122179 /* Pods-example.debug.xcconfig */,
08A8F0EC3E4A7E9111ABA675 /* Pods-example.release.xcconfig */, 3CEA4A8FA353AAF71956ECAB /* Pods-example.release.xcconfig */,
); );
path = Pods; path = Pods;
sourceTree = "<group>"; sourceTree = "<group>";
...@@ -105,13 +105,13 @@ ...@@ -105,13 +105,13 @@
isa = PBXNativeTarget; isa = PBXNativeTarget;
buildConfigurationList = 13B07F931A680F5B00A75B9A /* Build configuration list for PBXNativeTarget "example" */; buildConfigurationList = 13B07F931A680F5B00A75B9A /* Build configuration list for PBXNativeTarget "example" */;
buildPhases = ( buildPhases = (
E149C963790203E4728E183B /* [CP] Check Pods Manifest.lock */, AB27DA1BFBF250F3FBDD122A /* [CP] Check Pods Manifest.lock */,
13B07F871A680F5B00A75B9A /* Sources */, 13B07F871A680F5B00A75B9A /* Sources */,
13B07F8C1A680F5B00A75B9A /* Frameworks */, 13B07F8C1A680F5B00A75B9A /* Frameworks */,
13B07F8E1A680F5B00A75B9A /* Resources */, 13B07F8E1A680F5B00A75B9A /* Resources */,
00DD1BFF1BD5951E006B06BC /* Bundle React Native code and images */, 00DD1BFF1BD5951E006B06BC /* Bundle React Native code and images */,
1F9BDF608EDC73376B321887 /* [CP] Embed Pods Frameworks */, ECF4F483E82F128B69448B1F /* [CP] Embed Pods Frameworks */,
ADC23F2AA84D12028019349F /* [CP] Copy Pods Resources */, 3BE667FD28A69559FE50BB89 /* [CP] Copy Pods Resources */,
); );
buildRules = ( buildRules = (
); );
...@@ -183,24 +183,7 @@ ...@@ -183,24 +183,7 @@
shellPath = /bin/sh; shellPath = /bin/sh;
shellScript = "set -e\n\nWITH_ENVIRONMENT=\"$REACT_NATIVE_PATH/scripts/xcode/with-environment.sh\"\nREACT_NATIVE_XCODE=\"$REACT_NATIVE_PATH/scripts/react-native-xcode.sh\"\n\n/bin/sh -c \"$WITH_ENVIRONMENT $REACT_NATIVE_XCODE\"\n"; shellScript = "set -e\n\nWITH_ENVIRONMENT=\"$REACT_NATIVE_PATH/scripts/xcode/with-environment.sh\"\nREACT_NATIVE_XCODE=\"$REACT_NATIVE_PATH/scripts/react-native-xcode.sh\"\n\n/bin/sh -c \"$WITH_ENVIRONMENT $REACT_NATIVE_XCODE\"\n";
}; };
1F9BDF608EDC73376B321887 /* [CP] Embed Pods Frameworks */ = { 3BE667FD28A69559FE50BB89 /* [CP] Copy Pods Resources */ = {
isa = PBXShellScriptBuildPhase;
buildActionMask = 2147483647;
files = (
);
inputFileListPaths = (
"${PODS_ROOT}/Target Support Files/Pods-example/Pods-example-frameworks-${CONFIGURATION}-input-files.xcfilelist",
);
name = "[CP] Embed Pods Frameworks";
outputFileListPaths = (
"${PODS_ROOT}/Target Support Files/Pods-example/Pods-example-frameworks-${CONFIGURATION}-output-files.xcfilelist",
);
runOnlyForDeploymentPostprocessing = 0;
shellPath = /bin/sh;
shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-example/Pods-example-frameworks.sh\"\n";
showEnvVarsInLog = 0;
};
ADC23F2AA84D12028019349F /* [CP] Copy Pods Resources */ = {
isa = PBXShellScriptBuildPhase; isa = PBXShellScriptBuildPhase;
buildActionMask = 2147483647; buildActionMask = 2147483647;
files = ( files = (
...@@ -217,7 +200,7 @@ ...@@ -217,7 +200,7 @@
shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-example/Pods-example-resources.sh\"\n"; shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-example/Pods-example-resources.sh\"\n";
showEnvVarsInLog = 0; showEnvVarsInLog = 0;
}; };
E149C963790203E4728E183B /* [CP] Check Pods Manifest.lock */ = { AB27DA1BFBF250F3FBDD122A /* [CP] Check Pods Manifest.lock */ = {
isa = PBXShellScriptBuildPhase; isa = PBXShellScriptBuildPhase;
buildActionMask = 2147483647; buildActionMask = 2147483647;
files = ( files = (
...@@ -239,6 +222,23 @@ ...@@ -239,6 +222,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"; 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; showEnvVarsInLog = 0;
}; };
ECF4F483E82F128B69448B1F /* [CP] Embed Pods Frameworks */ = {
isa = PBXShellScriptBuildPhase;
buildActionMask = 2147483647;
files = (
);
inputFileListPaths = (
"${PODS_ROOT}/Target Support Files/Pods-example/Pods-example-frameworks-${CONFIGURATION}-input-files.xcfilelist",
);
name = "[CP] Embed Pods Frameworks";
outputFileListPaths = (
"${PODS_ROOT}/Target Support Files/Pods-example/Pods-example-frameworks-${CONFIGURATION}-output-files.xcfilelist",
);
runOnlyForDeploymentPostprocessing = 0;
shellPath = /bin/sh;
shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-example/Pods-example-frameworks.sh\"\n";
showEnvVarsInLog = 0;
};
/* End PBXShellScriptBuildPhase section */ /* End PBXShellScriptBuildPhase section */
/* Begin PBXSourcesBuildPhase section */ /* Begin PBXSourcesBuildPhase section */
...@@ -255,7 +255,7 @@ ...@@ -255,7 +255,7 @@
/* Begin XCBuildConfiguration section */ /* Begin XCBuildConfiguration section */
13B07F941A680F5B00A75B9A /* Debug */ = { 13B07F941A680F5B00A75B9A /* Debug */ = {
isa = XCBuildConfiguration; isa = XCBuildConfiguration;
baseConfigurationReference = 378A4C515FDC6061AD68C42E /* Pods-example.debug.xcconfig */; baseConfigurationReference = 6224139EF36E532E27122179 /* Pods-example.debug.xcconfig */;
buildSettings = { buildSettings = {
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
CLANG_ENABLE_MODULES = YES; CLANG_ENABLE_MODULES = YES;
...@@ -283,7 +283,7 @@ ...@@ -283,7 +283,7 @@
}; };
13B07F951A680F5B00A75B9A /* Release */ = { 13B07F951A680F5B00A75B9A /* Release */ = {
isa = XCBuildConfiguration; isa = XCBuildConfiguration;
baseConfigurationReference = 08A8F0EC3E4A7E9111ABA675 /* Pods-example.release.xcconfig */; baseConfigurationReference = 3CEA4A8FA353AAF71956ECAB /* Pods-example.release.xcconfig */;
buildSettings = { buildSettings = {
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
CLANG_ENABLE_MODULES = YES; CLANG_ENABLE_MODULES = YES;
......
...@@ -8,32 +8,32 @@ ...@@ -8,32 +8,32 @@
<key>BinaryPath</key> <key>BinaryPath</key>
<string>QmsPluginFramework.framework/QmsPluginFramework</string> <string>QmsPluginFramework.framework/QmsPluginFramework</string>
<key>LibraryIdentifier</key> <key>LibraryIdentifier</key>
<string>ios-arm64</string> <string>ios-arm64_x86_64-simulator</string>
<key>LibraryPath</key> <key>LibraryPath</key>
<string>QmsPluginFramework.framework</string> <string>QmsPluginFramework.framework</string>
<key>SupportedArchitectures</key> <key>SupportedArchitectures</key>
<array> <array>
<string>arm64</string> <string>arm64</string>
<string>x86_64</string>
</array> </array>
<key>SupportedPlatform</key> <key>SupportedPlatform</key>
<string>ios</string> <string>ios</string>
<key>SupportedPlatformVariant</key>
<string>simulator</string>
</dict> </dict>
<dict> <dict>
<key>BinaryPath</key> <key>BinaryPath</key>
<string>QmsPluginFramework.framework/QmsPluginFramework</string> <string>QmsPluginFramework.framework/QmsPluginFramework</string>
<key>LibraryIdentifier</key> <key>LibraryIdentifier</key>
<string>ios-arm64_x86_64-simulator</string> <string>ios-arm64</string>
<key>LibraryPath</key> <key>LibraryPath</key>
<string>QmsPluginFramework.framework</string> <string>QmsPluginFramework.framework</string>
<key>SupportedArchitectures</key> <key>SupportedArchitectures</key>
<array> <array>
<string>arm64</string> <string>arm64</string>
<string>x86_64</string>
</array> </array>
<key>SupportedPlatform</key> <key>SupportedPlatform</key>
<string>ios</string> <string>ios</string>
<key>SupportedPlatformVariant</key>
<string>simulator</string>
</dict> </dict>
</array> </array>
<key>CFBundlePackageType</key> <key>CFBundlePackageType</key>
......
...@@ -6,7 +6,7 @@ ...@@ -6,7 +6,7 @@
<dict> <dict>
<key>Assets.car</key> <key>Assets.car</key>
<data> <data>
nz4CVgVrIgti3Z6dGyfqT52lO7E= 4/wVNoFd+WcEg7nmH9Hm5v1nm7s=
</data> </data>
<key>Headers/QmsPlugin.h</key> <key>Headers/QmsPlugin.h</key>
<data> <data>
...@@ -18,7 +18,7 @@ ...@@ -18,7 +18,7 @@
</data> </data>
<key>Info.plist</key> <key>Info.plist</key>
<data> <data>
t43yRjSptMFTXQfSxY21jokBVtU= AaJE9H7xzNyQkDiLPw3sM9LfFjQ=
</data> </data>
<key>Modules/module.modulemap</key> <key>Modules/module.modulemap</key>
<data> <data>
...@@ -31,7 +31,7 @@ ...@@ -31,7 +31,7 @@
<dict> <dict>
<key>hash2</key> <key>hash2</key>
<data> <data>
J60ydBHIUa66OEr3jc21333AHp87l+VEFvKU7h3lu2M= zhv68b8E95A9988/pvXA0JKzn5/KsdixWe45ATxfW3g=
</data> </data>
</dict> </dict>
<key>Headers/QmsPlugin.h</key> <key>Headers/QmsPlugin.h</key>
......
...@@ -6,7 +6,7 @@ ...@@ -6,7 +6,7 @@
<dict> <dict>
<key>Assets.car</key> <key>Assets.car</key>
<data> <data>
nz4CVgVrIgti3Z6dGyfqT52lO7E= 4/wVNoFd+WcEg7nmH9Hm5v1nm7s=
</data> </data>
<key>Headers/QmsPlugin.h</key> <key>Headers/QmsPlugin.h</key>
<data> <data>
...@@ -18,7 +18,7 @@ ...@@ -18,7 +18,7 @@
</data> </data>
<key>Info.plist</key> <key>Info.plist</key>
<data> <data>
CSlwpYePP8U03s3cRC5622W7ESM= RNXd5p+E7NvIdc7OKurgeIO55/s=
</data> </data>
<key>Modules/module.modulemap</key> <key>Modules/module.modulemap</key>
<data> <data>
...@@ -31,7 +31,7 @@ ...@@ -31,7 +31,7 @@
<dict> <dict>
<key>hash2</key> <key>hash2</key>
<data> <data>
J60ydBHIUa66OEr3jc21333AHp87l+VEFvKU7h3lu2M= zhv68b8E95A9988/pvXA0JKzn5/KsdixWe45ATxfW3g=
</data> </data>
</dict> </dict>
<key>Headers/QmsPlugin.h</key> <key>Headers/QmsPlugin.h</key>
......
...@@ -14,6 +14,7 @@ ...@@ -14,6 +14,7 @@
2FB2922A2EAB04F400D9F164 /* AVFoundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 2FB292292EAB04F400D9F164 /* AVFoundation.framework */; }; 2FB2922A2EAB04F400D9F164 /* AVFoundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 2FB292292EAB04F400D9F164 /* AVFoundation.framework */; };
2FB975E02ED7F9AA00E64A87 /* EventKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 2FB975DF2ED7F9AA00E64A87 /* EventKit.framework */; }; 2FB975E02ED7F9AA00E64A87 /* EventKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 2FB975DF2ED7F9AA00E64A87 /* EventKit.framework */; };
2FD1557B2ECAC5CC00233981 /* WebKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 2FD1557A2ECAC5CC00233981 /* WebKit.framework */; }; 2FD1557B2ECAC5CC00233981 /* WebKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 2FD1557A2ECAC5CC00233981 /* WebKit.framework */; };
2FD9A1AE2EF0FA7100A7B53E /* Network.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 2FD9A0B72EF0E85B00A7B53E /* Network.framework */; };
/* End PBXBuildFile section */ /* End PBXBuildFile section */
/* Begin PBXFileReference section */ /* Begin PBXFileReference section */
...@@ -24,11 +25,13 @@ ...@@ -24,11 +25,13 @@
2FAEF09B2E8B7BD40086EDA3 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = Platforms/MacOSX.platform/Developer/SDKs/MacOSX26.0.sdk/System/Library/Frameworks/Foundation.framework; sourceTree = DEVELOPER_DIR; }; 2FAEF09B2E8B7BD40086EDA3 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = Platforms/MacOSX.platform/Developer/SDKs/MacOSX26.0.sdk/System/Library/Frameworks/Foundation.framework; sourceTree = DEVELOPER_DIR; };
2FB292292EAB04F400D9F164 /* AVFoundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AVFoundation.framework; path = Platforms/MacOSX.platform/Developer/SDKs/MacOSX26.0.sdk/System/Library/Frameworks/AVFoundation.framework; sourceTree = DEVELOPER_DIR; }; 2FB292292EAB04F400D9F164 /* AVFoundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AVFoundation.framework; path = Platforms/MacOSX.platform/Developer/SDKs/MacOSX26.0.sdk/System/Library/Frameworks/AVFoundation.framework; sourceTree = DEVELOPER_DIR; };
2FB975DF2ED7F9AA00E64A87 /* EventKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = EventKit.framework; path = Platforms/MacOSX.platform/Developer/SDKs/MacOSX26.1.sdk/System/Library/Frameworks/EventKit.framework; sourceTree = DEVELOPER_DIR; }; 2FB975DF2ED7F9AA00E64A87 /* EventKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = EventKit.framework; path = Platforms/MacOSX.platform/Developer/SDKs/MacOSX26.1.sdk/System/Library/Frameworks/EventKit.framework; sourceTree = DEVELOPER_DIR; };
2FD027B02EEFD25100CF5C33 /* Network.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Network.framework; path = Platforms/MacOSX.platform/Developer/SDKs/MacOSX26.1.sdk/System/Library/Frameworks/Network.framework; sourceTree = DEVELOPER_DIR; };
2FD1557A2ECAC5CC00233981 /* WebKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = WebKit.framework; path = Platforms/MacOSX.platform/Developer/SDKs/MacOSX26.1.sdk/System/iOSSupport/System/Library/PrivateFrameworks/WebKit.framework; sourceTree = DEVELOPER_DIR; }; 2FD1557A2ECAC5CC00233981 /* WebKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = WebKit.framework; path = Platforms/MacOSX.platform/Developer/SDKs/MacOSX26.1.sdk/System/iOSSupport/System/Library/PrivateFrameworks/WebKit.framework; sourceTree = DEVELOPER_DIR; };
2FD9A0B72EF0E85B00A7B53E /* Network.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Network.framework; path = System/Library/Frameworks/Network.framework; sourceTree = SDKROOT; };
/* End PBXFileReference section */ /* End PBXFileReference section */
/* Begin PBXFileSystemSynchronizedBuildFileExceptionSet section */ /* Begin PBXFileSystemSynchronizedBuildFileExceptionSet section */
2F96476C2E86307D002CC7CB /* Exceptions for "QmsPluginFramework" folder in "QmsPluginFramework" target */ = { 2FD9A0B92EF0F7FD00A7B53E /* Exceptions for "QmsPluginFramework" folder in "QmsPluginFramework" target */ = {
isa = PBXFileSystemSynchronizedBuildFileExceptionSet; isa = PBXFileSystemSynchronizedBuildFileExceptionSet;
membershipExceptions = ( membershipExceptions = (
FSCalendar/Info.plist, FSCalendar/Info.plist,
...@@ -45,7 +48,7 @@ ...@@ -45,7 +48,7 @@
2F9647672E86307D002CC7CB /* QmsPluginFramework */ = { 2F9647672E86307D002CC7CB /* QmsPluginFramework */ = {
isa = PBXFileSystemSynchronizedRootGroup; isa = PBXFileSystemSynchronizedRootGroup;
exceptions = ( exceptions = (
2F96476C2E86307D002CC7CB /* Exceptions for "QmsPluginFramework" folder in "QmsPluginFramework" target */, 2FD9A0B92EF0F7FD00A7B53E /* Exceptions for "QmsPluginFramework" folder in "QmsPluginFramework" target */,
); );
path = QmsPluginFramework; path = QmsPluginFramework;
sourceTree = "<group>"; sourceTree = "<group>";
...@@ -57,10 +60,11 @@ ...@@ -57,10 +60,11 @@
isa = PBXFrameworksBuildPhase; isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647; buildActionMask = 2147483647;
files = ( files = (
2FD9A1AE2EF0FA7100A7B53E /* Network.framework in Frameworks */,
2FB975E02ED7F9AA00E64A87 /* EventKit.framework in Frameworks */, 2FB975E02ED7F9AA00E64A87 /* EventKit.framework in Frameworks */,
2FD1557B2ECAC5CC00233981 /* WebKit.framework in Frameworks */,
2FB2922A2EAB04F400D9F164 /* AVFoundation.framework in Frameworks */, 2FB2922A2EAB04F400D9F164 /* AVFoundation.framework in Frameworks */,
2F99420D2EA9C5F000622199 /* QuartzCore.framework in Frameworks */, 2F99420D2EA9C5F000622199 /* QuartzCore.framework in Frameworks */,
2FD1557B2ECAC5CC00233981 /* WebKit.framework in Frameworks */,
2F8D09092E9605E200C764FF /* CoreGraphics.framework in Frameworks */, 2F8D09092E9605E200C764FF /* CoreGraphics.framework in Frameworks */,
2FAEF09C2E8B7BD40086EDA3 /* Foundation.framework in Frameworks */, 2FAEF09C2E8B7BD40086EDA3 /* Foundation.framework in Frameworks */,
2FAEF09A2E8B7BC80086EDA3 /* UIKit.framework in Frameworks */, 2FAEF09A2E8B7BC80086EDA3 /* UIKit.framework in Frameworks */,
...@@ -90,6 +94,8 @@ ...@@ -90,6 +94,8 @@
2FAEF0982E8B7BC80086EDA3 /* Frameworks */ = { 2FAEF0982E8B7BC80086EDA3 /* Frameworks */ = {
isa = PBXGroup; isa = PBXGroup;
children = ( children = (
2FD027B02EEFD25100CF5C33 /* Network.framework */,
2FD9A0B72EF0E85B00A7B53E /* Network.framework */,
2FB975DF2ED7F9AA00E64A87 /* EventKit.framework */, 2FB975DF2ED7F9AA00E64A87 /* EventKit.framework */,
2FD1557A2ECAC5CC00233981 /* WebKit.framework */, 2FD1557A2ECAC5CC00233981 /* WebKit.framework */,
2FB292292EAB04F400D9F164 /* AVFoundation.framework */, 2FB292292EAB04F400D9F164 /* AVFoundation.framework */,
...@@ -201,9 +207,11 @@ ...@@ -201,9 +207,11 @@
DYLIB_CURRENT_VERSION = 1; DYLIB_CURRENT_VERSION = 1;
DYLIB_INSTALL_NAME_BASE = "@rpath"; DYLIB_INSTALL_NAME_BASE = "@rpath";
ENABLE_MODULE_VERIFIER = YES; ENABLE_MODULE_VERIFIER = YES;
FRAMEWORK_SEARCH_PATHS = "$(SDKROOT)/System/Library/Frameworks";
GENERATE_INFOPLIST_FILE = YES; GENERATE_INFOPLIST_FILE = YES;
INFOPLIST_KEY_NSHumanReadableCopyright = ""; INFOPLIST_KEY_NSHumanReadableCopyright = "";
INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
IPHONEOS_DEPLOYMENT_TARGET = 18.6;
LD_RUNPATH_SEARCH_PATHS = ( LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)", "$(inherited)",
"@executable_path/Frameworks", "@executable_path/Frameworks",
...@@ -212,11 +220,17 @@ ...@@ -212,11 +220,17 @@
MARKETING_VERSION = 1.0; MARKETING_VERSION = 1.0;
MODULE_VERIFIER_SUPPORTED_LANGUAGES = "objective-c objective-c++"; MODULE_VERIFIER_SUPPORTED_LANGUAGES = "objective-c objective-c++";
MODULE_VERIFIER_SUPPORTED_LANGUAGE_STANDARDS = "gnu17 gnu++20"; MODULE_VERIFIER_SUPPORTED_LANGUAGE_STANDARDS = "gnu17 gnu++20";
OTHER_LDFLAGS = "";
PRODUCT_BUNDLE_IDENTIFIER = test.QmsPluginFramework; PRODUCT_BUNDLE_IDENTIFIER = test.QmsPluginFramework;
PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)";
SKIP_INSTALL = YES; SKIP_INSTALL = YES;
STRING_CATALOG_GENERATE_SYMBOLS = YES; STRING_CATALOG_GENERATE_SYMBOLS = YES;
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; SWIFT_EMIT_LOC_STRINGS = YES;
SWIFT_VERSION = 4.0;
TARGETED_DEVICE_FAMILY = "1,2"; TARGETED_DEVICE_FAMILY = "1,2";
}; };
name = Debug; name = Debug;
...@@ -233,9 +247,11 @@ ...@@ -233,9 +247,11 @@
DYLIB_CURRENT_VERSION = 1; DYLIB_CURRENT_VERSION = 1;
DYLIB_INSTALL_NAME_BASE = "@rpath"; DYLIB_INSTALL_NAME_BASE = "@rpath";
ENABLE_MODULE_VERIFIER = YES; ENABLE_MODULE_VERIFIER = YES;
FRAMEWORK_SEARCH_PATHS = "$(SDKROOT)/System/Library/Frameworks";
GENERATE_INFOPLIST_FILE = YES; GENERATE_INFOPLIST_FILE = YES;
INFOPLIST_KEY_NSHumanReadableCopyright = ""; INFOPLIST_KEY_NSHumanReadableCopyright = "";
INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
IPHONEOS_DEPLOYMENT_TARGET = 18.6;
LD_RUNPATH_SEARCH_PATHS = ( LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)", "$(inherited)",
"@executable_path/Frameworks", "@executable_path/Frameworks",
...@@ -244,11 +260,17 @@ ...@@ -244,11 +260,17 @@
MARKETING_VERSION = 1.0; MARKETING_VERSION = 1.0;
MODULE_VERIFIER_SUPPORTED_LANGUAGES = "objective-c objective-c++"; MODULE_VERIFIER_SUPPORTED_LANGUAGES = "objective-c objective-c++";
MODULE_VERIFIER_SUPPORTED_LANGUAGE_STANDARDS = "gnu17 gnu++20"; MODULE_VERIFIER_SUPPORTED_LANGUAGE_STANDARDS = "gnu17 gnu++20";
OTHER_LDFLAGS = "";
PRODUCT_BUNDLE_IDENTIFIER = test.QmsPluginFramework; PRODUCT_BUNDLE_IDENTIFIER = test.QmsPluginFramework;
PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)";
SKIP_INSTALL = YES; SKIP_INSTALL = YES;
STRING_CATALOG_GENERATE_SYMBOLS = YES; STRING_CATALOG_GENERATE_SYMBOLS = YES;
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; SWIFT_EMIT_LOC_STRINGS = YES;
SWIFT_VERSION = 4.0;
TARGETED_DEVICE_FAMILY = "1,2"; TARGETED_DEVICE_FAMILY = "1,2";
}; };
name = Release; name = Release;
......
// APIClient.h
#import <Foundation/Foundation.h>
#import <UIKit/UIKit.h>
NS_ASSUME_NONNULL_BEGIN
@interface APIClient : NSObject
+ (void)fetchAccessItem:(NSString *)unitId
completion:(void(^)(BOOL success, NSDictionary * _Nullable response, NSError * _Nullable error))completion;
+ (void)fetchGetUnitPlan:(void (^)(NSDictionary * _Nullable data, NSError * _Nullable error))completion;
+ (void)fetchSettingsByLocation:(NSString * _Nonnull)locationID
projectID:(NSString * _Nonnull)projectID
completion:(void (^)(NSDictionary * _Nullable data, NSError * _Nullable error))completion;
+ (void)submitAddIssue:(NSDictionary * _Nonnull)params
images:(NSArray<UIImage *> * _Nullable)images
completion:(void (^)(NSDictionary * _Nullable data, NSError * _Nullable error))completion;
+ (void)submitUpdateIssue:(NSDictionary * _Nonnull)updateData
images:(NSArray<UIImage *> * _Nullable)images
completion:(void (^)(NSDictionary * _Nullable response, NSError * _Nullable error))completion;
+ (void)fetchAppointment:(void (^)(NSDictionary * _Nullable data, NSError * _Nullable error))completion;
+ (void)fetchGeneralInfo:(void (^)(NSDictionary * _Nullable data, NSError * _Nullable error))completion;
+ (void)submitAppointment:(NSDictionary *)appointmentData
completion:(void(^)(BOOL success, NSDictionary * _Nullable response, NSError * _Nullable error))completion;
+ (void)submitRepresentativeAppointment:(NSDictionary *)repData
completion:(void(^)(BOOL success, NSDictionary * _Nullable response, NSError * _Nullable error))completion;
+ (void)fetchCancelAppointment:(id)appointmentId
reason:(NSString *)reason
completion:(void (^)(NSDictionary * _Nullable data, NSError * _Nullable error))completion;
+ (void)fetchDashboardInfo:(void (^)(NSDictionary *data, NSError *error))completion;
+ (void)fetchAnnouncement:(void (^)(NSDictionary *data, NSError *error))completion;
+ (void)fetchHistory:(NSString *)issueID
completion:(void (^)(NSDictionary *data, NSError *error))completion;
+(void)fetchAddInfo:(NSString *)issueID
remarks:(NSString *)remarks
completion:(void (^)(NSDictionary *data, NSError *error))completion;
+ (void)fetchIssues:(void (^)(NSDictionary *data, NSError *error))completion;
+ (void)fetchVoidIssue:(id)issueID
remarks:(NSString *)remarks
completion:(void (^)(NSDictionary *data, NSError *error))completion;
+ (void)fetchDeleteIssue:(id)issueID
remarks:(NSString *)remarks
completion:(void (^)(NSDictionary *data, NSError *error))completion;
+ (void)fetchCommonArea:(void (^)(NSDictionary * _Nullable data, NSError * _Nullable error))completion;
+ (void)fetchGeneralSettings:(void (^)(NSDictionary * _Nullable data, NSError * _Nullable error))completion;
+ (void)fetchDefectMatrix:(void (^)(NSDictionary * _Nullable data, NSError * _Nullable error))completion;
+ (void)fetchProjectList:(void (^)(NSDictionary * _Nullable data, NSError * _Nullable error))completion;
@end
NS_ASSUME_NONNULL_END
// AccessAppointmentViewController.mm // AccessAppointmentViewController.mm
#import "AccessAppointmentViewController.h" #import "AccessAppointmentViewController.h"
#import <EventKit/EventKit.h> #import <EventKit/EventKit.h>
#import "AppointmentAPIClient.h" #import "APIClient.h"
@interface AccessAppointmentViewController () @interface AccessAppointmentViewController ()
...@@ -512,7 +512,7 @@ ...@@ -512,7 +512,7 @@
return; return;
} }
[AppointmentAPIClient fetchCancelAppointment:self.appointmentData[@"appointment_id"] [APIClient fetchCancelAppointment:self.appointmentData[@"appointment_id"]
reason:remarks reason:remarks
completion:^(NSDictionary *data, NSError *error) completion:^(NSDictionary *data, NSError *error)
{ {
......
// AccessItemAPIClient.h
#import <Foundation/Foundation.h>
#import <UIKit/UIKit.h>
NS_ASSUME_NONNULL_BEGIN
@interface AccessItemAPIClient : NSObject
+ (void)fetchAccessItem:(NSString *)unitId
completion:(void(^)(BOOL success, NSDictionary * _Nullable response, NSError * _Nullable error))completion;
@end
NS_ASSUME_NONNULL_END
// AccessItemAPIClient.mm
#import "AccessItemAPIClient.h"
@implementation AccessItemAPIClient
+ (void)fetchAccessItem:(NSString *)unitId
completion:(void(^)(BOOL success, NSDictionary * _Nullable response, NSError * _Nullable error))completion {
NSString *urlString = @"https://kitadev.commudesk.com/api/owner/plan/getAccessItem?token=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJlbWFpbCI6ImF0aGlyYWh6YWlkaUBjb252ZXAuY29tIiwicGFzc3dvcmQiOiIkMnkkMTAkNU9xYklqMnZ6UHJwckJrcVd5c3I2LmJCc1hVYS9Hd014eUhnL3RhUUhPUkNQcGdmTG8yakciLCJzdWIiOjIxNzAsImlzcyI6Imh0dHBzOi8va2l0YWRldi5jb21tdWRlc2suY29tL2FwaS9vd25lci9hdXRoL3Bhc3N3b3JkbGVzc19sb2dpbiIsImlhdCI6MTc2MDMxNTM1MiwiZXhwIjoyMDc1ODg0ODcyLCJuYmYiOjE3NjAzMTUzNTIsImp0aSI6IktoQmNyQnJEdDVNdDZlWmMifQ.JnxGbZ7hTeoOr6oibIzZMphgyKtTo2Aq9Efx6mrGfFA";
NSURL *url = [NSURL URLWithString:urlString];
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
request.HTTPMethod = @"POST";
[request setValue:@"application/json" forHTTPHeaderField:@"Content-Type"];
NSDictionary *deviceInfo = @{
@"OS": @"AND",
@"IMEI": @"AND:2a2f13ff17b1cbb5",
@"OS_VERSION": @"35",
@"MODEL": @"2306EPN60G",
@"APP_VERSION": @"1.22.26"
};
NSDictionary *jsonBody = @{
@"data": @{
@"os": @"AND",
@"drawing_plan_id": unitId ?: @"",
@"information": deviceInfo,
}
};
NSLog(@"🌍 SUBMIT URL: %@", urlString);
NSLog(@"📦 SUBMIT Body JSON: %@", jsonBody);
NSError *jsonError;
NSData *bodyData = [NSJSONSerialization dataWithJSONObject:jsonBody options:0 error:&jsonError];
if (jsonError) {
NSLog(@"❌ JSON Serialization Error: %@", jsonError);
if (completion) completion(NO, nil, jsonError);
return;
}
request.HTTPBody = bodyData;
NSLog(@"🔄 SUBMIT (NO REP) Request started...");
NSURLSessionDataTask *task = [[NSURLSession sharedSession]
dataTaskWithRequest:request
completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {
if (error) {
NSLog(@"❌ Network Error: %@", error);
dispatch_async(dispatch_get_main_queue(), ^{
completion(NO, nil, error);
});
return;
}
NSError *parseError;
NSDictionary *json = [NSJSONSerialization JSONObjectWithData:data options:0 error:&parseError];
if (parseError) {
NSLog(@"⚠️ JSON Parse Error: %@", parseError);
dispatch_async(dispatch_get_main_queue(), ^{
completion(NO, nil, parseError);
});
return;
}
NSLog(@"✅ SUBMIT (NO REP) API Response:\n%@", json);
dispatch_async(dispatch_get_main_queue(), ^{
completion(YES, json, nil);
});
}];
[task resume];
}
@end
// AccessItemViewController.m // AccessItemViewController.m
#import "AccessItemViewController.h" #import "AccessItemViewController.h"
#import "AccessItemAPIClient.h" #import "APIClient.h"
#import "AppointmentAPIClient.h"
#import <UIKit/UIKit.h> #import <UIKit/UIKit.h>
#import "AccessAppointmentViewController.h" #import "AccessAppointmentViewController.h"
#import "AccessTransactionViewController.h" #import "AccessTransactionViewController.h"
...@@ -371,7 +370,7 @@ ...@@ -371,7 +370,7 @@
#pragma mark - Api #pragma mark - Api
- (void)fetchAccessItem{ - (void)fetchAccessItem{
[AccessItemAPIClient fetchAccessItem:@"135" [APIClient fetchAccessItem:@"135"
completion:^(BOOL success, NSDictionary *data, NSError *error) { completion:^(BOOL success, NSDictionary *data, NSError *error) {
NSLog(@"📦 Received General Info Data: %@", data); NSLog(@"📦 Received General Info Data: %@", data);
......
// AddIssueAPIClient.h
#import <Foundation/Foundation.h>
#import <UIKit/UIKit.h>
NS_ASSUME_NONNULL_BEGIN
@interface AddIssueAPIClient : NSObject
+ (void)fetchGetUnitPlan:(void (^)(NSDictionary * _Nullable data, NSError * _Nullable error))completion;
+ (void)fetchSettingsByLocation:(NSString * _Nonnull)locationID
projectID:(NSString * _Nonnull)projectID
completion:(void (^)(NSDictionary * _Nullable data, NSError * _Nullable error))completion;
+ (void)submitAddIssue:(NSDictionary * _Nonnull)params
images:(NSArray<UIImage *> * _Nullable)images
completion:(void (^)(NSDictionary * _Nullable data, NSError * _Nullable error))completion;
+ (void)submitUpdateIssue:(NSDictionary * _Nonnull)updateData
images:(NSArray<UIImage *> * _Nullable)images
completion:(void (^)(NSDictionary * _Nullable response, NSError * _Nullable error))completion;
@end
NS_ASSUME_NONNULL_END
#import "DetailsViewController.h" #import "DetailsViewController.h"
#import "AddIssueAPIClient.h" #import "APIClient.h"
#import <UIKit/UIKit.h> #import <UIKit/UIKit.h>
#import <Foundation/Foundation.h> #import <Foundation/Foundation.h>
...@@ -912,7 +912,7 @@ didFinishPickingMediaWithInfo:(NSDictionary<UIImagePickerControllerInfoKey,id> * ...@@ -912,7 +912,7 @@ didFinishPickingMediaWithInfo:(NSDictionary<UIImagePickerControllerInfoKey,id> *
NSLog(@"📦 Sending UpdateIssue with data: %@", updateData); NSLog(@"📦 Sending UpdateIssue with data: %@", updateData);
[AddIssueAPIClient submitUpdateIssue:updateData [APIClient submitUpdateIssue:updateData
images:self.addedImages images:self.addedImages
completion:^(NSDictionary * _Nullable response, NSError * _Nullable error) { completion:^(NSDictionary * _Nullable response, NSError * _Nullable error) {
dispatch_async(dispatch_get_main_queue(), ^{ dispatch_async(dispatch_get_main_queue(), ^{
...@@ -971,7 +971,7 @@ didFinishPickingMediaWithInfo:(NSDictionary<UIImagePickerControllerInfoKey,id> * ...@@ -971,7 +971,7 @@ didFinishPickingMediaWithInfo:(NSDictionary<UIImagePickerControllerInfoKey,id> *
@"os": @"AND" @"os": @"AND"
}; };
[AddIssueAPIClient submitAddIssue:issueData [APIClient submitAddIssue:issueData
images:self.uploadedImages images:self.uploadedImages
completion:^(NSDictionary *response, NSError *error) { completion:^(NSDictionary *response, NSError *error) {
dispatch_async(dispatch_get_main_queue(), ^{ dispatch_async(dispatch_get_main_queue(), ^{
......
// PlanViewController.mm // PlanViewController.mm
#import "PlanViewController.h" #import "PlanViewController.h"
#import "DetailsViewController.h" #import "DetailsViewController.h"
#import "AddIssueAPIClient.h" #import "APIClient.h"
#import <AVFoundation/AVFoundation.h> #import <AVFoundation/AVFoundation.h>
@interface PlanViewController () @interface PlanViewController ()
...@@ -69,7 +69,7 @@ ...@@ -69,7 +69,7 @@
- (void)handleGetUnitPlan { - (void)handleGetUnitPlan {
NSLog(@"🌐 Fetching Unit Plan data..."); NSLog(@"🌐 Fetching Unit Plan data...");
[AddIssueAPIClient fetchGetUnitPlan:^(NSDictionary *data, NSError *error) { [APIClient fetchGetUnitPlan:^(NSDictionary *data, NSError *error) {
if (error) { if (error) {
NSLog(@"❌ Unit Plan fetch failed: %@", error.localizedDescription); NSLog(@"❌ Unit Plan fetch failed: %@", error.localizedDescription);
return; return;
...@@ -711,7 +711,7 @@ ...@@ -711,7 +711,7 @@
- (void)handleSettingsByLocation:(NSString *)locationID planID:(NSString *)planID { - (void)handleSettingsByLocation:(NSString *)locationID planID:(NSString *)planID {
[AddIssueAPIClient fetchSettingsByLocation:locationID [APIClient fetchSettingsByLocation:locationID
projectID:@"8" projectID:@"8"
completion:^(NSDictionary *data, NSError *error) { completion:^(NSDictionary *data, NSError *error) {
if (error) { if (error) {
......
#import <Foundation/Foundation.h>
NS_ASSUME_NONNULL_BEGIN
@interface AppointmentAPIClient : NSObject
+ (void)fetchAppointment:(void (^)(NSDictionary * _Nullable data, NSError * _Nullable error))completion;
+ (void)fetchGeneralInfo:(void (^)(NSDictionary * _Nullable data, NSError * _Nullable error))completion;
+ (void)submitAppointment:(NSDictionary *)appointmentData
completion:(void(^)(BOOL success, NSDictionary * _Nullable response, NSError * _Nullable error))completion;
+ (void)submitRepresentativeAppointment:(NSDictionary *)repData
completion:(void(^)(BOOL success, NSDictionary * _Nullable response, NSError * _Nullable error))completion;
+ (void)fetchCancelAppointment:(id)appointmentId
reason:(NSString *)reason
completion:(void (^)(NSDictionary * _Nullable data, NSError * _Nullable error))completion;
@end
NS_ASSUME_NONNULL_END
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
#import "AppointmentConfirmationViewController.h" #import "AppointmentConfirmationViewController.h"
#import <WebKit/WebKit.h> #import <WebKit/WebKit.h>
#import <UIKit/UIKit.h> #import <UIKit/UIKit.h>
#import "AppointmentAPIClient.h" #import "APIClient.h"
@interface AppointmentConfirmationViewController () <WKNavigationDelegate> @interface AppointmentConfirmationViewController () <WKNavigationDelegate>
...@@ -665,7 +665,7 @@ ...@@ -665,7 +665,7 @@
@"data[imei]": @"AND:2a2f13ff17b1cbb5", @"data[imei]": @"AND:2a2f13ff17b1cbb5",
}; };
[AppointmentAPIClient submitRepresentativeAppointment:repData completion:^(BOOL success, NSDictionary * _Nullable response, NSError * _Nullable error) { [APIClient submitRepresentativeAppointment:repData completion:^(BOOL success, NSDictionary * _Nullable response, NSError * _Nullable error) {
dispatch_async(dispatch_get_main_queue(), ^{ dispatch_async(dispatch_get_main_queue(), ^{
if (success) { if (success) {
...@@ -701,7 +701,7 @@ ...@@ -701,7 +701,7 @@
@"drawing_plan_id": @"135", @"drawing_plan_id": @"135",
}; };
[AppointmentAPIClient submitAppointment:appointmentData completion:^(BOOL success, NSDictionary * _Nullable response, NSError * _Nullable error) { [APIClient submitAppointment:appointmentData completion:^(BOOL success, NSDictionary * _Nullable response, NSError * _Nullable error) {
dispatch_async(dispatch_get_main_queue(), ^{ dispatch_async(dispatch_get_main_queue(), ^{
if (success) { if (success) {
......
// AppointmentDetailsViewController.mm // AppointmentDetailsViewController.mm
#import "AppointmentDetailsViewController.h" #import "AppointmentDetailsViewController.h"
#import "AppointmentAPIClient.h" #import "APIClient.h"
#import <WebKit/WebKit.h> #import <WebKit/WebKit.h>
#import <EventKit/EventKit.h> #import <EventKit/EventKit.h>
...@@ -931,7 +931,7 @@ ...@@ -931,7 +931,7 @@
return; return;
} }
[AppointmentAPIClient fetchCancelAppointment:self.appointmentData[@"id"] [APIClient fetchCancelAppointment:self.appointmentData[@"id"]
reason:remarks reason:remarks
completion:^(NSDictionary *data, NSError *error) completion:^(NSDictionary *data, NSError *error)
{ {
...@@ -966,7 +966,7 @@ ...@@ -966,7 +966,7 @@
} }
-(void) fetchGeneralInfo { -(void) fetchGeneralInfo {
[AppointmentAPIClient fetchGeneralInfo:^(NSDictionary *data, NSError *error) { [APIClient fetchGeneralInfo:^(NSDictionary *data, NSError *error) {
if (error) return; if (error) return;
NSDictionary *generalInfo = data[@"Data"]; NSDictionary *generalInfo = data[@"Data"];
self.floorPlanImage = generalInfo[@"image"]; self.floorPlanImage = generalInfo[@"image"];
......
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
#import "AppointmentViewController.h" #import "AppointmentViewController.h"
#import <UIKit/UIKit.h> #import <UIKit/UIKit.h>
#import "AppointmentAPIClient.h" #import "APIClient.h"
#import <WebKit/WebKit.h> #import <WebKit/WebKit.h>
#import "CalendarView.h" #import "CalendarView.h"
#import "NSDate+CalendarHelpers.h" #import "NSDate+CalendarHelpers.h"
...@@ -399,7 +399,7 @@ ...@@ -399,7 +399,7 @@
#pragma mark - api #pragma mark - api
- (void)fetchAppointment { - (void)fetchAppointment {
[AppointmentAPIClient fetchAppointment:^(NSDictionary *data, NSError *error) { [APIClient fetchAppointment:^(NSDictionary *data, NSError *error) {
if (error) return; if (error) return;
if (!data[@"Data"]) return; if (!data[@"Data"]) return;
...@@ -451,7 +451,7 @@ ...@@ -451,7 +451,7 @@
} }
-(void) fetchGeneralInfo { -(void) fetchGeneralInfo {
[AppointmentAPIClient fetchGeneralInfo:^(NSDictionary *data, NSError *error) { [APIClient fetchGeneralInfo:^(NSDictionary *data, NSError *error) {
if (error) return; if (error) return;
NSDictionary *generalInfo = data[@"Data"]; NSDictionary *generalInfo = data[@"Data"];
......
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
#import "AppointmentViewMoreViewController.h" #import "AppointmentViewMoreViewController.h"
#import "FSCalendar.h" #import "FSCalendar.h"
#import "DashboardAPIClient.h" #import "APIClient.h"
#import "AppointmentViewController.h" #import "AppointmentViewController.h"
#import "AppointmentDetailsViewController.h" #import "AppointmentDetailsViewController.h"
...@@ -927,7 +927,7 @@ ...@@ -927,7 +927,7 @@
- (void)fetchDashboardInfo { - (void)fetchDashboardInfo {
[self.loadingView startAnimating]; [self.loadingView startAnimating];
[DashboardAPIClient fetchDashboardInfo:^(NSDictionary *data, NSError *error) { [APIClient fetchDashboardInfo:^(NSDictionary *data, NSError *error) {
[self.loadingView stopAnimating]; [self.loadingView stopAnimating];
......
// DashboardAPIClient.h
#import <Foundation/Foundation.h>
@interface DashboardAPIClient : NSObject
+ (void)fetchDashboardInfo:(void (^)(NSDictionary *data, NSError *error))completion;
+ (void)fetchAnnouncement:(void (^)(NSDictionary *data, NSError *error))completion;
@end
// DashbaordAPIClient.mm
#import "DashboardAPIClient.h"
@implementation DashboardAPIClient
+ (void)fetchDashboardInfo:(void (^)(NSDictionary *data, NSError *error))completion {
NSString *urlString = @"https://kitadev.commudesk.com/api/owner/plan/getIssueUpdateAppointmentInfo";
NSURL *url = [NSURL URLWithString:urlString];
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
request.HTTPMethod = @"POST";
// 🪪 Authorization header
NSString *token = @"eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJlbWFpbCI6ImF0aGlyYWh6YWlkaUBjb252ZXAuY29tIiwicGFzc3dvcmQiOiIkMnkkMTAkNU9xYklqMnZ6UHJwckJrcVd5c3I2LmJCc1hVYS9Hd014eUhnL3RhUUhPUkNQcGdmTG8yakciLCJzdWIiOjIxNzAsImlzcyI6Imh0dHBzOi8va2l0YWRldi5jb21tdWRlc2suY29tL2FwaS9vd25lci9hdXRoL3Bhc3N3b3JkbGVzc19sb2dpbiIsImlhdCI6MTc2MDMxNTM1MiwiZXhwIjoyMDc1ODg0ODcyLCJuYmYiOjE3NjAzMTUzNTIsImp0aSI6IktoQmNyQnJEdDVNdDZlWmMifQ.JnxGbZ7hTeoOr6oibIzZMphgyKtTo2Aq9Efx6mrGfFA";
[request setValue:[NSString stringWithFormat:@"Bearer %@", token] forHTTPHeaderField:@"Authorization"];
// 🧱 Create multipart form-data body
NSString *boundary = [NSString stringWithFormat:@"Boundary-%@", [[NSUUID UUID] UUIDString]];
NSString *contentType = [NSString stringWithFormat:@"multipart/form-data; boundary=%@", boundary];
[request setValue:contentType forHTTPHeaderField:@"Content-Type"];
NSMutableData *body = [NSMutableData data];
// Helper block to append fields
void (^appendFormField)(NSString *, NSString *) = ^(NSString *key, NSString *value) {
[body appendData:[[NSString stringWithFormat:@"--%@\r\n", boundary] dataUsingEncoding:NSUTF8StringEncoding]];
[body appendData:[[NSString stringWithFormat:@"Content-Disposition: form-data; name=\"%@\"\r\n\r\n", key] dataUsingEncoding:NSUTF8StringEncoding]];
[body appendData:[[NSString stringWithFormat:@"%@\r\n", value] dataUsingEncoding:NSUTF8StringEncoding]];
};
// Add form fields
appendFormField(@"data[os]", @"AND");
appendFormField(@"data[drawing_plan_id]", @"135");
NSString *infoJson = @"{\"OS\":\"AND\",\"IMEI\":\"AND:2a2f13ff17b1cbb5\",\"OS_VERSION\":\"35\",\"MODEL\":\"2306EPN60G\",\"APP_VERSION\":\"1.22.26\"}";
appendFormField(@"data[information]", infoJson);
[body appendData:[[NSString stringWithFormat:@"--%@--\r\n", boundary] dataUsingEncoding:NSUTF8StringEncoding]];
request.HTTPBody = body;
// 🌍 Debug logs
NSLog(@"🌍 URL: %@", urlString);
NSLog(@"🪪 Authorization: Bearer %@", token);
NSLog(@"📦 Body:\n%@", [[NSString alloc] initWithData:body encoding:NSUTF8StringEncoding]);
NSURLSessionDataTask *task = [[NSURLSession sharedSession]
dataTaskWithRequest:request
completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {
if (error) {
NSLog(@"❌ Network error: %@", error);
if (completion) completion(nil, error);
return;
}
NSError *jsonErr;
NSDictionary *json = [NSJSONSerialization JSONObjectWithData:data options:0 error:&jsonErr];
NSLog(@"🧩 Dashboard Info response: %@", json);
if (completion) {
dispatch_async(dispatch_get_main_queue(), ^{
completion(json, jsonErr);
});
}
}];
[task resume];
}
+ (void)fetchAnnouncement:(void (^)(NSDictionary *data, NSError *error))completion {
// ✅ Keep token in URL
NSString *urlString = @"https://kitadev.commudesk.com/api/clientAnnouncement?token=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJlbWFpbCI6ImF0aGlyYWh6YWlkaUBjb252ZXAuY29tIiwicGFzc3dvcmQiOiIkMnkkMTAkNU9xYklqMnZ6UHJwckJrcVd5c3I2LmJCc1hVYS9Hd014eUhnL3RhUUhPUkNQcGdmTG8yakciLCJzdWIiOjIxNzAsImlzcyI6Imh0dHBzOi8va2l0YWRldi5jb21tdWRlc2suY29tL2FwaS9vd25lci9hdXRoL3Bhc3N3b3JkbGVzc19sb2dpbiIsImlhdCI6MTc2MDMxNTM1MiwiZXhwIjoyMDc1ODg0ODcyLCJuYmYiOjE3NjAzMTUzNTIsImp0aSI6IktoQmNyQnJEdDVNdDZlWmMifQ.JnxGbZ7hTeoOr6oibIzZMphgyKtTo2Aq9Efx6mrGfFA";
NSURL *url = [NSURL URLWithString:urlString];
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
request.HTTPMethod = @"POST";
// 🧱 multipart/form-data setup
NSString *boundary = [NSString stringWithFormat:@"Boundary-%@", [[NSUUID UUID] UUIDString]];
NSString *contentType = [NSString stringWithFormat:@"multipart/form-data; boundary=%@", boundary];
[request setValue:contentType forHTTPHeaderField:@"Content-Type"];
NSMutableData *body = [NSMutableData data];
void (^appendFormField)(NSString *, NSString *) = ^(NSString *key, NSString *value) {
[body appendData:[[NSString stringWithFormat:@"--%@\r\n", boundary] dataUsingEncoding:NSUTF8StringEncoding]];
[body appendData:[[NSString stringWithFormat:@"Content-Disposition: form-data; name=\"%@\"\r\n\r\n", key] dataUsingEncoding:NSUTF8StringEncoding]];
[body appendData:[[NSString stringWithFormat:@"%@\r\n", value] dataUsingEncoding:NSUTF8StringEncoding]];
};
// Add form fields (same as DashboardInfo)
appendFormField(@"data[os]", @"AND");
appendFormField(@"data[project_id]", @"8");
appendFormField(@"data[client_id]", @"3");
NSString *infoJson = @"{\"OS\":\"AND\",\"IMEI\":\"AND:2a2f13ff17b1cbb5\",\"OS_VERSION\":\"35\",\"MODEL\":\"2306EPN60G\",\"APP_VERSION\":\"1.22.26\"}";
appendFormField(@"data[information]", infoJson);
[body appendData:[[NSString stringWithFormat:@"--%@--\r\n", boundary] dataUsingEncoding:NSUTF8StringEncoding]];
request.HTTPBody = body;
// 🌍 Debug logs
NSLog(@"🌍 URL: %@", urlString);
NSLog(@"📦 Body:\n%@", [[NSString alloc] initWithData:body encoding:NSUTF8StringEncoding]);
NSURLSessionDataTask *task = [[NSURLSession sharedSession]
dataTaskWithRequest:request
completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {
if (error) {
NSLog(@"❌ Network error: %@", error);
if (completion) completion(nil, error);
return;
}
NSError *jsonErr;
NSDictionary *json = [NSJSONSerialization JSONObjectWithData:data options:0 error:&jsonErr];
NSLog(@"✅ Announcement API response:\n%@", json);
NSDictionary *appData = json[@"AppData"];
NSArray *announcements = @[];
if ([appData[@"status"] isEqualToString:@"success"]) {
announcements = json[@"Data"];
NSLog(@"📣 Got %lu announcements", (unsigned long)announcements.count);
} else {
NSLog(@"⚠️ Announcement fetch failed: %@", appData[@"message"]);
}
if (completion) {
dispatch_async(dispatch_get_main_queue(), ^{
completion(json, jsonErr);
});
}
}];
[task resume];
}
@end
...@@ -3,7 +3,7 @@ ...@@ -3,7 +3,7 @@
#import <CoreGraphics/CoreGraphics.h> #import <CoreGraphics/CoreGraphics.h>
#import <objc/runtime.h> #import <objc/runtime.h>
#import "PlanViewController.h" #import "PlanViewController.h"
#import "DashboardAPIClient.h" #import "APIClient.h"
#import "IssueDetailViewController.h" #import "IssueDetailViewController.h"
#import "IssuesViewController.h" #import "IssuesViewController.h"
#import "AppointmentViewController.h" #import "AppointmentViewController.h"
...@@ -105,13 +105,13 @@ ...@@ -105,13 +105,13 @@
__block NSDictionary *announcementData = nil; __block NSDictionary *announcementData = nil;
dispatch_group_enter(group); dispatch_group_enter(group);
[DashboardAPIClient fetchDashboardInfo:^(NSDictionary *data, NSError *error) { [APIClient fetchDashboardInfo:^(NSDictionary *data, NSError *error) {
if (!error) dashboardData = data; if (!error) dashboardData = data;
dispatch_group_leave(group); dispatch_group_leave(group);
}]; }];
dispatch_group_enter(group); dispatch_group_enter(group);
[DashboardAPIClient fetchAnnouncement:^(NSDictionary *data, NSError *error) { [APIClient fetchAnnouncement:^(NSDictionary *data, NSError *error) {
if (!error) announcementData = data; if (!error) announcementData = data;
dispatch_group_leave(group); dispatch_group_leave(group);
}]; }];
...@@ -287,8 +287,8 @@ ...@@ -287,8 +287,8 @@
self.backgroundImageView.image = img; self.backgroundImageView.image = img;
self.overlayImageView.image = [UIImage imageNamed:@"overlay"]; self.overlayImageView.image = [UIImage imageNamed:@"overlay"];
self.projectNameLabel.text = @"Project A"; self.projectNameLabel.text = @"";
self.unitNameLabel.text = @"Unit 3A"; self.unitNameLabel.text = @"";
}); });
}); });
} }
......
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
#import <objc/runtime.h> #import <objc/runtime.h>
#import "GeneralInfoViewController.h" #import "GeneralInfoViewController.h"
#import "AppointmentAPIClient.h" #import "APIClient.h"
@interface GeneralInfoViewController () <UIDocumentInteractionControllerDelegate, UIScrollViewDelegate> @interface GeneralInfoViewController () <UIDocumentInteractionControllerDelegate, UIScrollViewDelegate>
...@@ -541,7 +541,7 @@ typedef struct { ...@@ -541,7 +541,7 @@ typedef struct {
#pragma mark - api #pragma mark - api
- (void)fetchGeneralInfo { - (void)fetchGeneralInfo {
[AppointmentAPIClient fetchGeneralInfo:^(NSDictionary *data, NSError *error) { [APIClient fetchGeneralInfo:^(NSDictionary *data, NSError *error) {
if (error || !data) { if (error || !data) {
NSLog(@"❌ General info error: %@", error.localizedDescription); NSLog(@"❌ General info error: %@", error.localizedDescription);
return; return;
......
// HistoryApiClient.h
#import <Foundation/Foundation.h>
@interface HistoryAPIClient : NSObject
+ (void)fetchHistory:(NSString *)issueID
completion:(void (^)(NSDictionary *data, NSError *error))completion;
@end
// HistoryApiClient.mm
#import "HistoryAPIClient.h"
@implementation HistoryAPIClient
+ (void)fetchHistory:(NSString *)issueID
completion:(void (^)(NSDictionary *data, NSError *error))completion {
// ✅ URL
NSString *urlString = @"https://kitadev.commudesk.com/api/owner/issue/getIssueHistory?token=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJlbWFpbCI6ImF0aGlyYWh6YWlkaUBjb252ZXAuY29tIiwicGFzc3dvcmQiOiIkMnkkMTAkNU9xYklqMnZ6UHJwckJrcVd5c3I2LmJCc1hVYS9Hd014eUhnL3RhUUhPUkNQcGdmTG8yakciLCJzdWIiOjIxNzAsImlzcyI6Imh0dHBzOi8va2l0YWRldi5jb21tdWRlc2suY29tL2FwaS9vd25lci9hdXRoL3Bhc3N3b3JkbGVzc19sb2dpbiIsImlhdCI6MTc2MDMxNTM1MiwiZXhwIjoyMDc1ODg0ODcyLCJuYmYiOjE3NjAzMTUzNTIsImp0aSI6IktoQmNyQnJEdDVNdDZlWmMifQ.JnxGbZ7hTeoOr6oibIzZMphgyKtTo2Aq9Efx6mrGfFA";
NSURL *url = [NSURL URLWithString:urlString];
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
request.HTTPMethod = @"POST";
// ✅ JSON headers
[request setValue:@"application/json" forHTTPHeaderField:@"Content-Type"];
[request setValue:@"application/json" forHTTPHeaderField:@"Accept"];
// ✅ Build JSON body
NSDictionary *deviceInfo = @{
@"OS": @"AND",
@"IMEI": @"AND:2a2f13ff17b1cbb5",
@"OS_VERSION": @"35",
@"MODEL": @"2306EPN60G",
@"APP_VERSION": @"1.22.26"
};
NSDictionary *jsonBody = @{
@"data": @{
@"os": @"AND",
@"issue_id": issueID,
@"information": deviceInfo
}
};
// ✅ Convert dictionary → NSData
NSError *jsonError;
NSData *bodyData = [NSJSONSerialization dataWithJSONObject:jsonBody options:0 error:&jsonError];
if (jsonError) {
NSLog(@"❌ JSON Serialization Error: %@", jsonError);
if (completion) completion(nil, jsonError);
return;
}
request.HTTPBody = bodyData;
// 🧭 Debug logs
NSLog(@"🌍 URL: %@", urlString);
NSLog(@"📦 Body JSON: %@", jsonBody);
// ✅ Make request
NSURLSessionDataTask *task = [[NSURLSession sharedSession]
dataTaskWithRequest:request
completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {
if (error) {
NSLog(@"❌ Network Error: %@", error);
dispatch_async(dispatch_get_main_queue(), ^{
if (completion) completion(nil, error);
});
return;
}
NSError *jsonParseError;
NSDictionary *jsonResponse = [NSJSONSerialization JSONObjectWithData:data options:0 error:&jsonParseError];
if (jsonParseError) {
NSLog(@"⚠️ JSON Parse Error: %@", jsonParseError);
} else {
NSLog(@"✅ Issues API Response:\n%@", jsonResponse);
}
dispatch_async(dispatch_get_main_queue(), ^{
if (completion) completion(jsonResponse, jsonParseError);
});
}];
[task resume];
}
@end
// HistoryViewController.mm // HistoryViewController.mm
#import "HistoryViewController.h" #import "HistoryViewController.h"
#import "HistoryAPIClient.h" #import "APIClient.h"
#import "CalendarView.h" #import "CalendarView.h"
#import "NSDate+CalendarHelpers.h" #import "NSDate+CalendarHelpers.h"
...@@ -78,6 +78,8 @@ ...@@ -78,6 +78,8 @@
self.titleLabel.translatesAutoresizingMaskIntoConstraints = NO; self.titleLabel.translatesAutoresizingMaskIntoConstraints = NO;
[self.headerView addSubview:self.titleLabel]; [self.headerView addSubview:self.titleLabel];
// need to make addInfo eventually
[NSLayoutConstraint activateConstraints:@[ [NSLayoutConstraint activateConstraints:@[
[self.headerView.topAnchor constraintEqualToAnchor:self.view.safeAreaLayoutGuide.topAnchor], [self.headerView.topAnchor constraintEqualToAnchor:self.view.safeAreaLayoutGuide.topAnchor],
[self.headerView.leadingAnchor constraintEqualToAnchor:self.view.leadingAnchor], [self.headerView.leadingAnchor constraintEqualToAnchor:self.view.leadingAnchor],
...@@ -114,7 +116,7 @@ ...@@ -114,7 +116,7 @@
#pragma mark - API request/response #pragma mark - API request/response
- (void)handleIssues { - (void)handleIssues {
[HistoryAPIClient fetchHistory:self.issueID [APIClient fetchHistory:self.issueID
completion:^(NSDictionary *data, NSError *error) { completion:^(NSDictionary *data, NSError *error) {
if (error) { if (error) {
NSLog(@"❌ Error fetching history: %@", error); NSLog(@"❌ Error fetching history: %@", error);
......
// IssueAPIClient.h
#import <Foundation/Foundation.h>
@interface IssueAPIClient : NSObject
+ (void)fetchIssues:(void (^)(NSDictionary *data, NSError *error))completion;
+ (void)fetchVoidIssue:(id)issueID
remarks:(NSString *)remarks
completion:(void (^)(NSDictionary *data, NSError *error))completion;
+ (void)fetchDeleteIssue:(id)issueID
remarks:(NSString *)remarks
completion:(void (^)(NSDictionary *data, NSError *error))completion;
@end
// IssueAPIClient.mm
#import "IssueAPIClient.h"
@implementation IssueAPIClient
+ (void)fetchIssues:(void (^)(NSDictionary *data, NSError *error))completion {
// ✅ URL
NSString *urlString = @"https://kitadev.commudesk.com/api/owner/issue/getIssue?token=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJlbWFpbCI6ImF0aGlyYWh6YWlkaUBjb252ZXAuY29tIiwicGFzc3dvcmQiOiIkMnkkMTAkNU9xYklqMnZ6UHJwckJrcVd5c3I2LmJCc1hVYS9Hd014eUhnL3RhUUhPUkNQcGdmTG8yakciLCJzdWIiOjIxNzAsImlzcyI6Imh0dHBzOi8va2l0YWRldi5jb21tdWRlc2suY29tL2FwaS9vd25lci9hdXRoL3Bhc3N3b3JkbGVzc19sb2dpbiIsImlhdCI6MTc2MDMxNTM1MiwiZXhwIjoyMDc1ODg0ODcyLCJuYmYiOjE3NjAzMTUzNTIsImp0aSI6IktoQmNyQnJEdDVNdDZlWmMifQ.JnxGbZ7hTeoOr6oibIzZMphgyKtTo2Aq9Efx6mrGfFA";
NSURL *url = [NSURL URLWithString:urlString];
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
request.HTTPMethod = @"POST";
// ✅ JSON headers
[request setValue:@"application/json" forHTTPHeaderField:@"Content-Type"];
[request setValue:@"application/json" forHTTPHeaderField:@"Accept"];
// ✅ Build JSON body
NSDictionary *deviceInfo = @{
@"OS": @"AND",
@"IMEI": @"AND:2a2f13ff17b1cbb5",
@"OS_VERSION": @"35",
@"MODEL": @"2306EPN60G",
@"APP_VERSION": @"1.22.26"
};
NSDictionary *jsonBody = @{
@"data": @{
@"os": @"AND",
@"drawing_plan_id": @"135",
@"information": deviceInfo
}
};
// ✅ Convert dictionary → NSData
NSError *jsonError;
NSData *bodyData = [NSJSONSerialization dataWithJSONObject:jsonBody options:0 error:&jsonError];
if (jsonError) {
NSLog(@"❌ JSON Serialization Error: %@", jsonError);
if (completion) completion(nil, jsonError);
return;
}
request.HTTPBody = bodyData;
// 🧭 Debug logs
NSLog(@"🌍 URL: %@", urlString);
NSLog(@"📦 Body JSON: %@", jsonBody);
// ✅ Make request
NSURLSessionDataTask *task = [[NSURLSession sharedSession]
dataTaskWithRequest:request
completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {
if (error) {
NSLog(@"❌ Network Error: %@", error);
dispatch_async(dispatch_get_main_queue(), ^{
if (completion) completion(nil, error);
});
return;
}
NSError *jsonParseError;
NSDictionary *jsonResponse = [NSJSONSerialization JSONObjectWithData:data options:0 error:&jsonParseError];
if (jsonParseError) {
NSLog(@"⚠️ JSON Parse Error: %@", jsonParseError);
} else {
NSLog(@"✅ Issues API Response:\n%@", jsonResponse);
}
dispatch_async(dispatch_get_main_queue(), ^{
if (completion) completion(jsonResponse, jsonParseError);
});
}];
[task resume];
}
+ (void)fetchVoidIssue:(id)issueID
remarks:(NSString *)remarks
completion:(void (^)(NSDictionary *data, NSError *error))completion {
// ✅ URL
NSString *urlString = @"https://kitadev.commudesk.com/api/owner/issue/voidIssue?token=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJlbWFpbCI6ImF0aGlyYWh6YWlkaUBjb252ZXAuY29tIiwicGFzc3dvcmQiOiIkMnkkMTAkNU9xYklqMnZ6UHJwckJrcVd5c3I2LmJCc1hVYS9Hd014eUhnL3RhUUhPUkNQcGdmTG8yakciLCJzdWIiOjIxNzAsImlzcyI6Imh0dHBzOi8va2l0YWRldi5jb21tdWRlc2suY29tL2FwaS9vd25lci9hdXRoL3Bhc3N3b3JkbGVzc19sb2dpbiIsImlhdCI6MTc2MDMxNTM1MiwiZXhwIjoyMDc1ODg0ODcyLCJuYmYiOjE3NjAzMTUzNTIsImp0aSI6IktoQmNyQnJEdDVNdDZlWmMifQ.JnxGbZ7hTeoOr6oibIzZMphgyKtTo2Aq9Efx6mrGfFA";
NSURL *url = [NSURL URLWithString:urlString];
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
request.HTTPMethod = @"POST";
// ✅ JSON headers
[request setValue:@"application/json" forHTTPHeaderField:@"Content-Type"];
[request setValue:@"application/json" forHTTPHeaderField:@"Accept"];
// json checks
NSArray *issueArray = issueID;
if (![issueID isKindOfClass:[NSArray class]]) {
issueArray = @[ issueID ?: @"" ];
}
NSString *remarksSafe = remarks ?: @"";
// ✅ Build JSON body
NSDictionary *jsonBody = @{
@"data": @{
@"os": @"AND",
@"issue_id": issueArray,
@"remarks": remarksSafe
}
};
// ✅ Convert dictionary → NSData
NSError *jsonError;
NSData *bodyData = [NSJSONSerialization dataWithJSONObject:jsonBody options:0 error:&jsonError];
if (jsonError) {
NSLog(@"❌ JSON Serialization Error: %@", jsonError);
if (completion) completion(nil, jsonError);
return;
}
request.HTTPBody = bodyData;
// 🧭 Debug logs
NSLog(@"🌍 URL: %@", urlString);
NSLog(@"📦 Body JSON: %@", jsonBody);
// ✅ Make request
NSURLSessionDataTask *task = [[NSURLSession sharedSession]
dataTaskWithRequest:request
completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {
if (error) {
NSLog(@"❌ Network Error: %@", error);
dispatch_async(dispatch_get_main_queue(), ^{
if (completion) completion(nil, error);
});
return;
}
NSError *jsonParseError;
NSDictionary *jsonResponse = [NSJSONSerialization JSONObjectWithData:data options:0 error:&jsonParseError];
if (jsonParseError) {
NSLog(@"⚠️ JSON Parse Error: %@", jsonParseError);
} else {
NSLog(@"✅ Void Issues API Response:\n%@", jsonResponse);
}
dispatch_async(dispatch_get_main_queue(), ^{
if (completion) completion(jsonResponse, jsonParseError);
});
}];
[task resume];
}
+ (void)fetchDeleteIssue:(NSString *)issueID
remarks:(NSString *)remarks
completion:(void (^)(NSDictionary *data, NSError *error))completion {
// ✅ URL
NSString *urlString = @"https://kitadev.commudesk.com/api/owner/issue/deleteIssue?token=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJlbWFpbCI6ImF0aGlyYWh6YWlkaUBjb252ZXAuY29tIiwicGFzc3dvcmQiOiIkMnkkMTAkNU9xYklqMnZ6UHJwckJrcVd5c3I2LmJCc1hVYS9Hd014eUhnL3RhUUhPUkNQcGdmTG8yakciLCJzdWIiOjIxNzAsImlzcyI6Imh0dHBzOi8va2l0YWRldi5jb21tdWRlc2suY29tL2FwaS9vd25lci9hdXRoL3Bhc3N3b3JkbGVzc19sb2dpbiIsImlhdCI6MTc2MDMxNTM1MiwiZXhwIjoyMDc1ODg0ODcyLCJuYmYiOjE3NjAzMTUzNTIsImp0aSI6IktoQmNyQnJEdDVNdDZlWmMifQ.JnxGbZ7hTeoOr6oibIzZMphgyKtTo2Aq9Efx6mrGfFA";
NSURL *url = [NSURL URLWithString:urlString];
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
request.HTTPMethod = @"POST";
// ✅ JSON headers
[request setValue:@"application/json" forHTTPHeaderField:@"Content-Type"];
[request setValue:@"application/json" forHTTPHeaderField:@"Accept"];
// ✅ Build JSON body
NSDictionary *jsonBody = @{
@"data": @{
@"os": @"AND",
@"issue_id": issueID ?: @"",
@"remarks": remarks ?: @""
}
};
// ✅ Convert dictionary → NSData
NSError *jsonError;
NSData *bodyData = [NSJSONSerialization dataWithJSONObject:jsonBody options:0 error:&jsonError];
if (jsonError) {
NSLog(@"❌ JSON Serialization Error: %@", jsonError);
if (completion) completion(nil, jsonError);
return;
}
request.HTTPBody = bodyData;
// 🧭 Debug logs
NSLog(@"🌍 URL: %@", urlString);
NSLog(@"📦 Body JSON: %@", jsonBody);
// ✅ Make request
NSURLSessionDataTask *task = [[NSURLSession sharedSession]
dataTaskWithRequest:request
completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {
if (error) {
NSLog(@"❌ Network Error: %@", error);
dispatch_async(dispatch_get_main_queue(), ^{
if (completion) completion(nil, error);
});
return;
}
NSError *jsonParseError;
NSDictionary *jsonResponse = [NSJSONSerialization JSONObjectWithData:data options:0 error:&jsonParseError];
if (jsonParseError) {
NSLog(@"⚠️ JSON Parse Error: %@", jsonParseError);
} else {
NSLog(@"✅ Delete Issues API Response:\n%@", jsonResponse);
}
dispatch_async(dispatch_get_main_queue(), ^{
if (completion) completion(jsonResponse, jsonParseError);
});
}];
[task resume];
}
@end
// IssuesViewController.mm // IssuesViewController.mm
#import "IssuesViewController.h" #import "IssuesViewController.h"
#import "IssueAPIClient.h" #import "APIClient.h"
#import "IssueDetailViewController.h" #import "IssueDetailViewController.h"
#import "WithdrawSingleIssueViewController.h" #import "WithdrawSingleIssueViewController.h"
#import "WithdrawIssuesViewController.h" #import "WithdrawIssuesViewController.h"
...@@ -300,7 +300,7 @@ ...@@ -300,7 +300,7 @@
- (void)handleGetIssue { - (void)handleGetIssue {
NSLog(@"🌐 Fetching Issue data..."); NSLog(@"🌐 Fetching Issue data...");
[IssueAPIClient fetchIssues:^(NSDictionary *data, NSError *error) { [APIClient fetchIssues:^(NSDictionary *data, NSError *error) {
if (error) { if (error) {
NSLog(@"❌ Issue fetch failed: %@", error.localizedDescription); NSLog(@"❌ Issue fetch failed: %@", error.localizedDescription);
return; return;
......
// WithdrawIssuesViewController.mm // WithdrawIssuesViewController.mm
#import "WithdrawIssuesViewController.h" #import "WithdrawIssuesViewController.h"
#import "IssueAPIClient.h" #import "APIClient.h"
#import "WithdrawSingleIssueViewController.h" #import "WithdrawSingleIssueViewController.h"
#import "FilterViewController.h" #import "FilterViewController.h"
...@@ -383,7 +383,7 @@ ...@@ -383,7 +383,7 @@
#pragma mark - Data #pragma mark - Data
- (void)fetchIssues { - (void)fetchIssues {
[IssueAPIClient fetchIssues:^(NSDictionary *data, NSError *error) { [APIClient fetchIssues:^(NSDictionary *data, NSError *error) {
if (error) return; if (error) return;
NSArray *allIssues = data[@"Data"] ?: @[]; NSArray *allIssues = data[@"Data"] ?: @[];
......
// WithdrawSingleIssueViewController.mm // WithdrawSingleIssueViewController.mm
#import "WithdrawSingleIssueViewController.h" #import "WithdrawSingleIssueViewController.h"
#import "IssueAPIClient.h" #import "APIClient.h"
#import <UIKit/UIKit.h> #import <UIKit/UIKit.h>
...@@ -264,7 +264,7 @@ ...@@ -264,7 +264,7 @@
- (void)requestDeleteIssue:(NSString *)issueID remarks:(NSString *)remarks { - (void)requestDeleteIssue:(NSString *)issueID remarks:(NSString *)remarks {
NSLog(@"🚀 Sending DELETE ISSUE for ID=%@, remarks=%@", issueID, remarks); NSLog(@"🚀 Sending DELETE ISSUE for ID=%@, remarks=%@", issueID, remarks);
[IssueAPIClient fetchDeleteIssue:issueID remarks:remarks completion:^(NSDictionary *data, NSError *error) { [APIClient fetchDeleteIssue:issueID remarks:remarks completion:^(NSDictionary *data, NSError *error) {
if (error) { if (error) {
NSLog(@"Error %@", error.localizedDescription); NSLog(@"Error %@", error.localizedDescription);
return; return;
...@@ -301,7 +301,7 @@ ...@@ -301,7 +301,7 @@
-(void)requestVoidIssue:(NSArray *)ids remarks:(NSString *)remarks { -(void)requestVoidIssue:(NSArray *)ids remarks:(NSString *)remarks {
NSLog(@"🚀 Sending VOID ISSUE for ID=%@, remarks=%@", self.selectedIssues, remarks); NSLog(@"🚀 Sending VOID ISSUE for ID=%@, remarks=%@", self.selectedIssues, remarks);
[IssueAPIClient fetchVoidIssue:ids [APIClient fetchVoidIssue:ids
remarks:remarks remarks:remarks
completion:^(NSDictionary *data, NSError *error) { completion:^(NSDictionary *data, NSError *error) {
if (error) { if (error) {
......
// NetworkManager.h
#import <Foundation/Foundation.h>
NS_ASSUME_NONNULL_BEGIN
@interface NetworkManager : NSObject
+ (instancetype)sharedManager;
- (BOOL)isConnected; // current connection status
@end
NS_ASSUME_NONNULL_END
// NetworkManager.mm
#import "NetworkManager.h"
#import <Network/Network.h>
@interface NetworkManager()
@property (nonatomic, strong) nw_path_monitor_t monitor;
@property (nonatomic, assign) BOOL connected;
@end
@implementation NetworkManager
+ (instancetype)sharedManager {
static NetworkManager *instance = nil;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
instance = [[NetworkManager alloc] initPrivate];
});
return instance;
}
// Private init to start monitoring immediately
- (instancetype)initPrivate {
self = [super init];
if (self) {
_connected = NO;
[self startMonitoring];
}
return self;
}
// Prevent use of plain init
- (instancetype)init {
@throw [NSException exceptionWithName:@"Singleton"
reason:@"Use +[NetworkManager sharedManager]"
userInfo:nil];
return nil;
}
- (void)startMonitoring {
if (self.monitor) return; // already monitoring
self.monitor = nw_path_monitor_create();
nw_path_monitor_set_queue(self.monitor, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0));
nw_path_monitor_set_update_handler(self.monitor, ^(nw_path_t path) {
self.connected = nw_path_get_status(path) == nw_path_status_satisfied;
NSLog(@"[NetworkManager] Internet connectivity: %@", self.connected ? @"YES" : @"NO");
// Post notification for all listeners
dispatch_async(dispatch_get_main_queue(), ^{
[[NSNotificationCenter defaultCenter] postNotificationName:@"NetworkStatusChanged"
object:nil
userInfo:@{@"connected": @(self.connected)}];
});
});
nw_path_monitor_start(self.monitor);
}
- (BOOL)isConnected {
return self.connected;
}
@end
...@@ -3,36 +3,39 @@ ...@@ -3,36 +3,39 @@
#import "DashboardViewController.h" #import "DashboardViewController.h"
#import "DrawerViewController.h" #import "DrawerViewController.h"
#import "DrawerController.h" #import "DrawerController.h"
#import "NetworkManager.h"
@implementation QmsPluginUI @implementation QmsPluginUI
+ (UIViewController *)makeViewController { + (UIViewController *)makeViewController {
// 0. Start network monitoring immediately
[NetworkManager sharedManager];
// 1. Create main dashboard screen (props will be set via DrawerController) // 1. Create drawer
DrawerViewController *drawer = [[DrawerViewController alloc] init]; DrawerViewController *drawer = [[DrawerViewController alloc] init];
drawer.profileName = @"placeholder"; drawer.profileName = @"placeholder";
drawer.profileEmail = @"placeholder"; drawer.profileEmail = @"placeholder";
// 2. Set client props (replace with actual values from your globals or RN) // 2. Client props
NSString *clientID = @"clientID_loading"; NSString *clientID = @"clientID_loading";
NSString *clientCode = @"clientCode_loading"; NSString *clientCode = @"clientCode_loading";
NSString *userToken = @"userToken_loading"; NSString *userToken = @"userToken_loading";
// 3. Create DrawerController with drawer + props // 3. Root container
DrawerController *drawerController = DrawerController *drawerController =
[[DrawerController alloc] initWithDrawerViewController:drawer [[DrawerController alloc] initWithDrawerViewController:drawer
clientID:clientID clientID:clientID
clientCode:clientCode clientCode:clientCode
userToken:userToken]; userToken:userToken];
// 4. Allow dashboard to call openDrawer() via drawerController.mainViewController // 4. Back-reference
if ([drawerController.mainViewController isKindOfClass:[DashboardViewController class]]) { if ([drawerController.mainViewController isKindOfClass:[DashboardViewController class]]) {
((DashboardViewController *)drawerController.mainViewController).drawerController = drawerController; ((DashboardViewController *)drawerController.mainViewController).drawerController =
drawerController;
} }
NSLog(@"drawerController.mainViewController = %@", drawerController.mainViewController);
return drawerController; return drawerController;
} }
@end @end
//// SyncEngine.h
//
//#import <Foundation/Foundation.h>
//@interface SyncEngine : NSObject
//
//@property (nonatomic, assign) BOOL submitPending;
//@property (nonatomic, assign) BOOL downloadUnits;
//
//- (void)startWithProgress:(SyncProgressBlock)progress
// completion:(SyncCompletionBlock)completion;
//
//@end
//
//// SyncEngine.mm
//
//#import "SyncEngine.h"
//#import "APIClient.h"
//#import "NetworkManager.h"
//
//@interface SyncEngine ()
//
//// Callbacks
//@property (nonatomic, copy) SyncProgressBlock progressBlock;
//@property (nonatomic, copy) SyncCompletionBlock completionBlock;
//
//// Progress tracking
//@property (nonatomic, assign) NSInteger currentStep;
//@property (nonatomic, assign) NSInteger totalSteps;
//
//@end
//
//@implementation SyncEngine
//
//#pragma mark - Public Entry Point
//
//- (void)startWithProgress:(SyncProgressBlock)progress
// completion:(SyncCompletionBlock)completion {
//
// self.progressBlock = progress;
// self.completionBlock = completion;
//
// self.currentStep = 0;
// self.totalSteps = [self calculateTotalSteps];
//
// [self stepCheckNetwork];
//}
//
//#pragma mark - Step Count
//
//- (NSInteger)calculateTotalSteps {
// NSInteger steps = 1; // check network
//
// if (self.submitPending) {
// steps += 1; // submit pending
// }
//
// if (self.downloadUnits) {
// steps += 1; // download data
// }
//
// steps += 1; // finalize
//
// return steps;
//}
//
//#pragma mark - Step 1: Network Check
//
//- (void)stepCheckNetwork {
// [self reportProgress:@"Checking network"];
//
// if (![NetworkManager.sharedManager isConnected]) {
// NSError *error =
// [NSError errorWithDomain:@"Sync"
// code:-1009
// userInfo:@{
// NSLocalizedDescriptionKey :
// @"No internet connection"
// }];
// [self finish:NO error:error];
// return;
// }
//
// if (self.submitPending) {
// [self stepSubmitPending];
// } else if (self.downloadUnits) {
// [self stepDownloadCommonAreas];
// } else {
// [self stepFinalize];
// }
//}
//
//#pragma mark - Step 2: Submit Pending Offline Items
//
//- (void)stepSubmitPending {
// [self reportProgress:@"Submitting pending items"];
//
// __weak typeof(self) weakSelf = self;
//
// [self submitPendingItemsWithCompletion:^(BOOL success, NSError *error) {
// __strong typeof(weakSelf) self = weakSelf;
//
// if (!success) {
// [self finish:NO error:error];
// return;
// }
//
// if (self.downloadUnits) {
// [self stepDownloadCommonAreas];
// } else {
// [self stepFinalize];
// }
// }];
//}
//
//#pragma mark - Step 3: Download Data
//
//- (void)stepDownloadCommonAreas {
// [self reportProgress:@"Downloading common areas"];
//
// __weak typeof(self) weakSelf = self;
//
// [APIClient fetchCommonArea:^(NSDictionary *data, NSError *error) {
// __strong typeof(weakSelf) self = weakSelf;
//
// if (error) {
// [self finish:NO error:error];
// return;
// }
//
// [self persistCommonAreas:data];
// [self stepFinalize];
// }];
//}
//
//#pragma mark - Step 4: Finalize
//
//- (void)stepFinalize {
// [self reportProgress:@"Finalizing sync"];
// [self finalizeSync];
// [self finish:YES error:nil];
//}
//
//#pragma mark - Progress & Completion Helpers
//
//- (void)reportProgress:(NSString *)message {
// self.currentStep++;
//
// if (self.progressBlock) {
// self.progressBlock(self.currentStep,
// self.totalSteps,
// message);
// }
//}
//
//- (void)finish:(BOOL)success error:(NSError *)error {
// if (self.completionBlock) {
// self.completionBlock(success, error);
// }
//
// // Clean up references
// self.progressBlock = nil;
// self.completionBlock = nil;
//}
//
//#pragma mark - Internal Hooks (Implement These)
//
//- (void)submitPendingItemsWithCompletion:(void (^)(BOOL success, NSError *error))completion {
// // TODO:
// // - Query offline table
// // - Upload ONE item at a time
// // - Update local DB on success/failure
// // - Recursively continue until empty
// // - Call completion when done
//}
//
//- (void)persistCommonAreas:(NSDictionary *)data {
// // TODO:
// // Save common areas into local storage / DB
//}
//
//- (void)finalizeSync {
// // TODO:
// // - Update last sync timestamp
// // - Persist sync success state
//}
//
//@end
// SyncHistoryViewController.h
#import <UIKit/UIKit.h>
@interface SyncHistoryViewController : UIViewController
@end
// SyncHistoryViewController.mm
#import "SyncHistoryViewController.h"
@interface SyncHistoryViewController () <UITableViewDelegate, UITableViewDataSource>
@property (nonatomic, strong) UIView *headerView;
@property (nonatomic, strong) UIButton *backButton;
@property (nonatomic, strong) UILabel *titleLabel;
@property (nonatomic, strong) UIView *tabBarView;
@property (nonatomic, strong) UIButton *allTabButton;
@property (nonatomic, strong) UIButton *successTabButton;
@property (nonatomic, strong) UIButton *failedTabButton;
@property (nonatomic, strong) UITableView *tableView;
@property (nonatomic, strong) UIView *emptyStateView;
@property (nonatomic, strong) UIButton *syncAgainButton;
@end
@implementation SyncHistoryViewController
- (void)viewDidLoad {
[super viewDidLoad];
self.view.backgroundColor = [UIColor colorWithWhite:0.95 alpha:1.0];
[self setupHeader];
[self setupTabBar];
[self setupTableView];
[self setupEmptyState];
[self setupBottomButton];
}
#pragma mark - Header
- (void)setupHeader {
self.headerView = [[UIView alloc] init];
self.headerView.backgroundColor = [UIColor colorWithRed:0.0 green:0.5 blue:0.6 alpha:1.0];
self.headerView.translatesAutoresizingMaskIntoConstraints = NO;
[self.view addSubview:self.headerView];
self.backButton = [UIButton buttonWithType:UIButtonTypeCustom];
[self.backButton setImage:[UIImage systemImageNamed:@"chevron.backward"]
forState:UIControlStateNormal];
[self.backButton addTarget:self
action:@selector(onBack)
forControlEvents:UIControlEventTouchUpInside];
self.backButton.translatesAutoresizingMaskIntoConstraints = NO;
self.backButton.tintColor = UIColor.whiteColor;
[self.headerView addSubview:self.backButton];
self.titleLabel = [[UILabel alloc] init];
self.titleLabel.text = @"History";
self.titleLabel.textColor = UIColor.whiteColor;
self.titleLabel.font = [UIFont boldSystemFontOfSize:18];
self.titleLabel.translatesAutoresizingMaskIntoConstraints = NO;
[self.headerView addSubview:self.titleLabel];
// Constraints
[NSLayoutConstraint activateConstraints:@[
[self.headerView.topAnchor constraintEqualToAnchor:self.view.safeAreaLayoutGuide.topAnchor],
[self.headerView.leadingAnchor constraintEqualToAnchor:self.view.leadingAnchor],
[self.headerView.trailingAnchor constraintEqualToAnchor:self.view.trailingAnchor],
[self.headerView.heightAnchor constraintEqualToConstant:48],
[self.backButton.leadingAnchor constraintEqualToAnchor:self.headerView.leadingAnchor constant:8],
[self.backButton.centerYAnchor constraintEqualToAnchor:self.headerView.centerYAnchor],
[self.backButton.widthAnchor constraintEqualToConstant:32],
[self.backButton.heightAnchor constraintEqualToConstant:32],
[self.titleLabel.centerXAnchor constraintEqualToAnchor:self.headerView.centerXAnchor],
[self.titleLabel.centerYAnchor constraintEqualToAnchor:self.headerView.centerYAnchor],
]];
}
#pragma mark - Setup Tabbar
- (void)setupTabBar {
self.tabBarView = [[UIView alloc] init];
self.tabBarView.backgroundColor = self.headerView.backgroundColor;
self.tabBarView.translatesAutoresizingMaskIntoConstraints = NO;
[self.view addSubview:self.tabBarView];
self.allTabButton = [self createTabButton:@"All"];
self.successTabButton = [self createTabButton:@"Success"];
self.failedTabButton = [self createTabButton:@"Failed"];
UIStackView *stack = [[UIStackView alloc] initWithArrangedSubviews:@[
self.allTabButton,
self.successTabButton,
self.failedTabButton
]];
stack.axis = UILayoutConstraintAxisHorizontal;
stack.distribution = UIStackViewDistributionFillEqually;
stack.translatesAutoresizingMaskIntoConstraints = NO;
[self.tabBarView addSubview:stack];
[NSLayoutConstraint activateConstraints:@[
[self.tabBarView.topAnchor constraintEqualToAnchor:self.headerView.bottomAnchor],
[self.tabBarView.leadingAnchor constraintEqualToAnchor:self.view.leadingAnchor],
[self.tabBarView.trailingAnchor constraintEqualToAnchor:self.view.trailingAnchor],
[self.tabBarView.heightAnchor constraintEqualToConstant:50],
[stack.topAnchor constraintEqualToAnchor:self.tabBarView.topAnchor],
[stack.bottomAnchor constraintEqualToAnchor:self.tabBarView.bottomAnchor],
[stack.leadingAnchor constraintEqualToAnchor:self.tabBarView.leadingAnchor],
[stack.trailingAnchor constraintEqualToAnchor:self.tabBarView.trailingAnchor],
]];
}
- (UIButton *)createTabButton:(NSString *)title {
UIButton *btn = [UIButton buttonWithType:UIButtonTypeSystem];
[btn setTitle:title forState:UIControlStateNormal];
[btn setTitleColor:UIColor.whiteColor forState:UIControlStateNormal];
btn.titleLabel.font = [UIFont systemFontOfSize:16];
return btn;
}
#pragma mark - Setup TableView
- (void)setupTableView {
self.tableView = [[UITableView alloc] initWithFrame:CGRectZero style:UITableViewStylePlain];
self.tableView.translatesAutoresizingMaskIntoConstraints = NO;
self.tableView.delegate = self;
self.tableView.dataSource = self;
self.tableView.backgroundColor = UIColor.clearColor;
self.tableView.separatorStyle = UITableViewCellSeparatorStyleNone;
[self.view addSubview:self.tableView];
[NSLayoutConstraint activateConstraints:@[
[self.tableView.topAnchor constraintEqualToAnchor:self.tabBarView.bottomAnchor],
[self.tableView.leadingAnchor constraintEqualToAnchor:self.view.leadingAnchor],
[self.tableView.trailingAnchor constraintEqualToAnchor:self.view.trailingAnchor],
[self.tableView.bottomAnchor constraintEqualToAnchor:self.view.bottomAnchor constant:-60],
]];
}
// Dummy data
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
return 5; // placeholder
}
- (UITableViewCell *)tableView:(UITableView *)tableView
cellForRowAtIndexPath:(NSIndexPath *)indexPath {
static NSString *cellId = @"HistoryCell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellId];
if (!cell) {
cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle
reuseIdentifier:cellId];
cell.selectionStyle = UITableViewCellSelectionStyleNone;
}
cell.textLabel.text = @"Unit A-01";
cell.detailTextLabel.text = @"Created on 12 August 2025\nUploaded on 14 August 2025";
cell.detailTextLabel.numberOfLines = 2;
return cell;
}
- (void)setupEmptyState {
self.emptyStateView = [[UIView alloc] init];
self.emptyStateView.translatesAutoresizingMaskIntoConstraints = NO;
self.emptyStateView.hidden = YES;
UIImageView *imageView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"zerostate_nodata"]];
imageView.translatesAutoresizingMaskIntoConstraints = NO;
UILabel *label = [[UILabel alloc] init];
label.text = @"No history available";
label.textColor = UIColor.grayColor;
label.translatesAutoresizingMaskIntoConstraints = NO;
[self.emptyStateView addSubview:imageView];
[self.emptyStateView addSubview:label];
[self.view addSubview:self.emptyStateView];
[NSLayoutConstraint activateConstraints:@[
[self.emptyStateView.centerXAnchor constraintEqualToAnchor:self.view.centerXAnchor],
[self.emptyStateView.centerYAnchor constraintEqualToAnchor:self.view.centerYAnchor],
[imageView.centerXAnchor constraintEqualToAnchor:self.emptyStateView.centerXAnchor],
[imageView.topAnchor constraintEqualToAnchor:self.emptyStateView.topAnchor],
[label.topAnchor constraintEqualToAnchor:imageView.bottomAnchor constant:12],
[label.centerXAnchor constraintEqualToAnchor:self.emptyStateView.centerXAnchor],
]];
}
#pragma mark - Footer Button
- (void)setupBottomButton {
self.syncAgainButton = [UIButton buttonWithType:UIButtonTypeSystem];
self.syncAgainButton.translatesAutoresizingMaskIntoConstraints = NO;
self.syncAgainButton.backgroundColor = self.headerView.backgroundColor;
[self.syncAgainButton setTitle:@"SYNC AGAIN" forState:UIControlStateNormal];
[self.syncAgainButton setTitleColor:UIColor.whiteColor forState:UIControlStateNormal];
self.syncAgainButton.titleLabel.font = [UIFont boldSystemFontOfSize:16];
[self.view addSubview:self.syncAgainButton];
[NSLayoutConstraint activateConstraints:@[
[self.syncAgainButton.leadingAnchor constraintEqualToAnchor:self.view.leadingAnchor],
[self.syncAgainButton.trailingAnchor constraintEqualToAnchor:self.view.trailingAnchor],
[self.syncAgainButton.bottomAnchor constraintEqualToAnchor:self.view.safeAreaLayoutGuide.bottomAnchor],
[self.syncAgainButton.heightAnchor constraintEqualToConstant:50],
]];
}
#pragma mark - Helpers
- (void)onBack {
[self dismissViewControllerAnimated:YES completion:nil];
}
@end
// SyncPendingViewController.h
#import <UIKit/UIKit.h>
@interface SyncPendingViewController : UIViewController
@end
// SyncPendingViewController.mm
#import "SyncPendingViewController.h"
@interface SyncPendingViewController () <UITableViewDelegate, UITableViewDataSource>
@property (nonatomic, strong) UIView *headerView;
@property (nonatomic, strong) UIButton *backButton;
@property (nonatomic, strong) UILabel *titleLabel;
@property (nonatomic, strong) UIButton *shareButton;
@property (nonatomic, strong) UITableView *tableView;
// Placeholder data
@property (nonatomic, strong) NSArray *sections;
@end
@implementation SyncPendingViewController
- (void)viewDidLoad {
[super viewDidLoad];
self.view.backgroundColor = [UIColor systemGroupedBackgroundColor];
[self setupHeader];
[self setupTableView];
[self setupDummyData];
}
#pragma mark - Header
- (void)setupHeader {
self.headerView = [[UIView alloc] init];
self.headerView.backgroundColor = [UIColor colorWithRed:0.0 green:0.5 blue:0.6 alpha:1.0];
self.headerView.translatesAutoresizingMaskIntoConstraints = NO;
[self.view addSubview:self.headerView];
self.backButton = [UIButton buttonWithType:UIButtonTypeCustom];
[self.backButton setImage:[UIImage systemImageNamed:@"chevron.backward"]
forState:UIControlStateNormal];
self.backButton.tintColor = UIColor.whiteColor;
[self.backButton addTarget:self
action:@selector(onBack)
forControlEvents:UIControlEventTouchUpInside];
self.backButton.translatesAutoresizingMaskIntoConstraints = NO;
[self.headerView addSubview:self.backButton];
self.titleLabel = [[UILabel alloc] init];
self.titleLabel.text = @"Pending Items";
self.titleLabel.textColor = UIColor.whiteColor;
self.titleLabel.font = [UIFont boldSystemFontOfSize:18];
self.titleLabel.translatesAutoresizingMaskIntoConstraints = NO;
[self.headerView addSubview:self.titleLabel];
self.shareButton = [UIButton buttonWithType:UIButtonTypeSystem];
[self.shareButton setTitle:@"Share" forState:UIControlStateNormal];
[self.shareButton setTitleColor:UIColor.whiteColor forState:UIControlStateNormal];
self.shareButton.layer.borderColor = UIColor.whiteColor.CGColor;
self.shareButton.layer.borderWidth = 0.5;
self.shareButton.layer.cornerRadius = 14;
self.shareButton.titleLabel.font = [UIFont systemFontOfSize:14];
self.shareButton.translatesAutoresizingMaskIntoConstraints = NO;
[self.headerView addSubview:self.shareButton];
[NSLayoutConstraint activateConstraints:@[
[self.headerView.topAnchor constraintEqualToAnchor:self.view.safeAreaLayoutGuide.topAnchor],
[self.headerView.leadingAnchor constraintEqualToAnchor:self.view.leadingAnchor],
[self.headerView.trailingAnchor constraintEqualToAnchor:self.view.trailingAnchor],
[self.headerView.heightAnchor constraintEqualToConstant:48],
[self.backButton.leadingAnchor constraintEqualToAnchor:self.headerView.leadingAnchor constant:8],
[self.backButton.centerYAnchor constraintEqualToAnchor:self.headerView.centerYAnchor],
[self.backButton.widthAnchor constraintEqualToConstant:32],
[self.backButton.heightAnchor constraintEqualToConstant:32],
[self.titleLabel.centerXAnchor constraintEqualToAnchor:self.headerView.centerXAnchor],
[self.titleLabel.centerYAnchor constraintEqualToAnchor:self.headerView.centerYAnchor],
[self.shareButton.trailingAnchor constraintEqualToAnchor:self.headerView.trailingAnchor constant:-8],
[self.shareButton.centerYAnchor constraintEqualToAnchor:self.headerView.centerYAnchor],
[self.shareButton.heightAnchor constraintEqualToConstant:28],
[self.shareButton.widthAnchor constraintEqualToConstant:90],
]];
}
#pragma mark - Table View
- (void)setupTableView {
self.tableView = [[UITableView alloc] initWithFrame:CGRectZero
style:UITableViewStyleGrouped];
self.tableView.translatesAutoresizingMaskIntoConstraints = NO;
self.tableView.delegate = self;
self.tableView.dataSource = self;
self.tableView.backgroundColor = UIColor.clearColor;
[self.tableView registerClass:UITableViewCell.class
forCellReuseIdentifier:@"Cell"];
[self.view addSubview:self.tableView];
[NSLayoutConstraint activateConstraints:@[
[self.tableView.topAnchor constraintEqualToAnchor:self.headerView.bottomAnchor],
[self.tableView.leadingAnchor constraintEqualToAnchor:self.view.leadingAnchor],
[self.tableView.trailingAnchor constraintEqualToAnchor:self.view.trailingAnchor],
[self.tableView.bottomAnchor constraintEqualToAnchor:self.view.bottomAnchor],
]];
}
//Dummy Data
- (void)setupDummyData {
self.sections = @[
@{
@"title": @"Project Alpha",
@"items": @[@"Item 1", @"Item 2"]
},
@{
@"title": @"Project Beta",
@"items": @[@"Item A"]
}
];
}
#pragma mark - Table View
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
return self.sections.count;
}
- (NSInteger)tableView:(UITableView *)tableView
numberOfRowsInSection:(NSInteger)section {
return [self.sections[section][@"items"] count];
}
- (NSString *)tableView:(UITableView *)tableView
titleForHeaderInSection:(NSInteger)section {
return self.sections[section][@"title"];
}
- (UITableViewCell *)tableView:(UITableView *)tableView
cellForRowAtIndexPath:(NSIndexPath *)indexPath {
UITableViewCell *cell =
[tableView dequeueReusableCellWithIdentifier:@"Cell"
forIndexPath:indexPath];
cell.textLabel.text =
self.sections[indexPath.section][@"items"][indexPath.row];
cell.backgroundColor = UIColor.whiteColor;
cell.layer.cornerRadius = 10;
cell.layer.masksToBounds = YES;
return cell;
}
#pragma mark - Helpers
- (void)onBack {
[self dismissViewControllerAnimated:YES completion:nil];
}
@end
// SyncProjectViewController.h
#import <UIKit/UIKit.h>
@interface SyncProjectViewController : UIViewController
typedef NS_ENUM(NSInteger, SyncProjectScreenState) {
SyncProjectScreenStateOfflineUnit,
SyncProjectScreenStateSelectProject,
SyncProjectScreenStateSelectUnit
};
@end
// SyncViewController.m
#import "SyncScreenViewController.h"
@interface SyncScreenViewController ()
@property (nonatomic, strong) UIView *headerView;
@property (nonatomic, strong) UIButton *backButton;
@property (nonatomic, strong) UILabel *titleLabel;
@property (nonatomic, strong) UILabel *lastUpdatedLabel;
@property (nonatomic, strong) UIStackView *cardStack;
@property (nonatomic, strong) UIView *offlineUnitCard;
@property (nonatomic, strong) UIView *pendingItemsCard;
@property (nonatomic, strong) UIView *historyCard;
@property (nonatomic, strong) UIButton *syncButton;
@end
@implementation SyncScreenViewController
- (void)viewDidLoad {
[super viewDidLoad];
self.view.backgroundColor = UIColor.whiteColor;
[self setupHeader];
[self setupMainContent];
[self setupSyncButton];
}
#pragma mark - Header
- (void)setupHeader {
self.headerView = [[UIView alloc] init];
self.headerView.backgroundColor = [UIColor colorWithRed:0.0 green:0.5 blue:0.6 alpha:1.0];
self.headerView.translatesAutoresizingMaskIntoConstraints = NO;
[self.view addSubview:self.headerView];
self.backButton = [UIButton buttonWithType:UIButtonTypeCustom];
[self.backButton setImage:[UIImage imageNamed:@"back24"] forState:UIControlStateNormal];
self.backButton.translatesAutoresizingMaskIntoConstraints = NO;
[self.headerView addSubview:self.backButton];
self.titleLabel = [[UILabel alloc] init];
self.titleLabel.text = @"SYNC";
self.titleLabel.textColor = UIColor.whiteColor;
self.titleLabel.font = [UIFont boldSystemFontOfSize:18];
self.titleLabel.translatesAutoresizingMaskIntoConstraints = NO;
[self.headerView addSubview:self.titleLabel];
// Constraints
[NSLayoutConstraint activateConstraints:@[
[self.headerView.topAnchor constraintEqualToAnchor:self.view.safeAreaLayoutGuide.topAnchor],
[self.headerView.leadingAnchor constraintEqualToAnchor:self.view.leadingAnchor],
[self.headerView.trailingAnchor constraintEqualToAnchor:self.view.trailingAnchor],
[self.headerView.heightAnchor constraintEqualToConstant:48],
[self.backButton.leadingAnchor constraintEqualToAnchor:self.headerView.leadingAnchor constant:8],
[self.backButton.centerYAnchor constraintEqualToAnchor:self.headerView.centerYAnchor],
[self.backButton.widthAnchor constraintEqualToConstant:32],
[self.backButton.heightAnchor constraintEqualToConstant:32],
[self.titleLabel.centerXAnchor constraintEqualToAnchor:self.headerView.centerXAnchor],
[self.titleLabel.centerYAnchor constraintEqualToAnchor:self.headerView.centerYAnchor],
]];
}
#pragma mark - Main Content
- (void)setupMainContent {
UIView *content = [[UIView alloc] init];
content.translatesAutoresizingMaskIntoConstraints = NO;
[self.view addSubview:content];
[NSLayoutConstraint activateConstraints:@[
[content.topAnchor constraintEqualToAnchor:self.headerView.bottomAnchor constant:16],
[content.leadingAnchor constraintEqualToAnchor:self.view.leadingAnchor constant:16],
[content.trailingAnchor constraintEqualToAnchor:self.view.trailingAnchor constant:-16],
]];
// Last Updated
self.lastUpdatedLabel = [[UILabel alloc] init];
self.lastUpdatedLabel.numberOfLines = 2;
self.lastUpdatedLabel.text = @"Last Updated:\n--";
self.lastUpdatedLabel.textColor = [UIColor grayColor];
self.lastUpdatedLabel.font = [UIFont boldSystemFontOfSize:16];
self.lastUpdatedLabel.translatesAutoresizingMaskIntoConstraints = NO;
[content addSubview:self.lastUpdatedLabel];
[NSLayoutConstraint activateConstraints:@[
[self.lastUpdatedLabel.topAnchor constraintEqualToAnchor:content.topAnchor],
[self.lastUpdatedLabel.leadingAnchor constraintEqualToAnchor:content.leadingAnchor],
[self.lastUpdatedLabel.trailingAnchor constraintEqualToAnchor:content.trailingAnchor],
]];
// Cards Stack
self.cardStack = [[UIStackView alloc] init];
self.cardStack.axis = UILayoutConstraintAxisVertical;
self.cardStack.spacing = 16;
self.cardStack.translatesAutoresizingMaskIntoConstraints = NO;
[content addSubview:self.cardStack];
[NSLayoutConstraint activateConstraints:@[
[self.cardStack.topAnchor constraintEqualToAnchor:self.lastUpdatedLabel.bottomAnchor constant:16],
[self.cardStack.leadingAnchor constraintEqualToAnchor:content.leadingAnchor],
[self.cardStack.trailingAnchor constraintEqualToAnchor:content.trailingAnchor],
]];
// Add 3 cards
[self.cardStack addArrangedSubview:[self createCardWithTitle:@"Offline Units" count:@"0"]];
[self.cardStack addArrangedSubview:[self createCardWithTitle:@"Pending Items" count:@"0"]];
[self.cardStack addArrangedSubview:[self createCardWithTitle:@"History" count:@"0"]];
}
#pragma mark - Card Factory
- (UIView *)createCardWithTitle:(NSString *)title count:(NSString *)countText {
UIView *card = [[UIView alloc] init];
card.backgroundColor = UIColor.whiteColor;
card.layer.borderWidth = 1;
card.layer.borderColor = [UIColor lightGrayColor].CGColor;
card.layer.cornerRadius = 10;
card.translatesAutoresizingMaskIntoConstraints = NO;
[NSLayoutConstraint activateConstraints:@[
[card.heightAnchor constraintEqualToConstant:120]
]];
UILabel *titleLabel = [[UILabel alloc] init];
titleLabel.text = title;
titleLabel.font = [UIFont boldSystemFontOfSize:20];
titleLabel.textColor = [UIColor colorWithRed:0.0 green:0.5 blue:0.6 alpha:1.0];
titleLabel.translatesAutoresizingMaskIntoConstraints = NO;
UILabel *countLabel = [[UILabel alloc] init];
countLabel.text = countText;
countLabel.font = [UIFont boldSystemFontOfSize:28];
countLabel.textColor = [UIColor colorWithRed:0.0 green:0.5 blue:0.6 alpha:1.0];
countLabel.textAlignment = NSTextAlignmentRight;
countLabel.translatesAutoresizingMaskIntoConstraints = NO;
[card addSubview:titleLabel];
[card addSubview:countLabel];
[NSLayoutConstraint activateConstraints:@[
[titleLabel.leadingAnchor constraintEqualToAnchor:card.leadingAnchor constant:16],
[titleLabel.topAnchor constraintEqualToAnchor:card.topAnchor constant:16],
[countLabel.trailingAnchor constraintEqualToAnchor:card.trailingAnchor constant:-16],
[countLabel.bottomAnchor constraintEqualToAnchor:card.bottomAnchor constant:-16],
]];
return card;
}
#pragma mark - Sync Button
- (void)setupSyncButton {
self.syncButton = [UIButton buttonWithType:UIButtonTypeSystem];
self.syncButton.backgroundColor = [UIColor colorWithRed:0.0 green:0.5 blue:0.6 alpha:1.0];
[self.syncButton setTitle:@"SYNC" forState:UIControlStateNormal];
[self.syncButton setTitleColor:UIColor.whiteColor forState:UIControlStateNormal];
self.syncButton.titleLabel.font = [UIFont boldSystemFontOfSize:16];
self.syncButton.layer.cornerRadius = 8;
self.syncButton.translatesAutoresizingMaskIntoConstraints = NO;
[self.view addSubview:self.syncButton];
[NSLayoutConstraint activateConstraints:@[
[self.syncButton.topAnchor constraintEqualToAnchor:self.cardStack.bottomAnchor constant:16],
[self.syncButton.leadingAnchor constraintEqualToAnchor:self.view.leadingAnchor constant:16],
[self.syncButton.trailingAnchor constraintEqualToAnchor:self.view.trailingAnchor constant:-16],
[self.syncButton.heightAnchor constraintEqualToConstant:50],
[self.syncButton.bottomAnchor constraintEqualToAnchor:self.view.safeAreaLayoutGuide.bottomAnchor constant:-16],
]];
}
@end
...@@ -8,32 +8,32 @@ ...@@ -8,32 +8,32 @@
<key>BinaryPath</key> <key>BinaryPath</key>
<string>QmsPluginFramework.framework/QmsPluginFramework</string> <string>QmsPluginFramework.framework/QmsPluginFramework</string>
<key>LibraryIdentifier</key> <key>LibraryIdentifier</key>
<string>ios-arm64</string> <string>ios-arm64_x86_64-simulator</string>
<key>LibraryPath</key> <key>LibraryPath</key>
<string>QmsPluginFramework.framework</string> <string>QmsPluginFramework.framework</string>
<key>SupportedArchitectures</key> <key>SupportedArchitectures</key>
<array> <array>
<string>arm64</string> <string>arm64</string>
<string>x86_64</string>
</array> </array>
<key>SupportedPlatform</key> <key>SupportedPlatform</key>
<string>ios</string> <string>ios</string>
<key>SupportedPlatformVariant</key>
<string>simulator</string>
</dict> </dict>
<dict> <dict>
<key>BinaryPath</key> <key>BinaryPath</key>
<string>QmsPluginFramework.framework/QmsPluginFramework</string> <string>QmsPluginFramework.framework/QmsPluginFramework</string>
<key>LibraryIdentifier</key> <key>LibraryIdentifier</key>
<string>ios-arm64_x86_64-simulator</string> <string>ios-arm64</string>
<key>LibraryPath</key> <key>LibraryPath</key>
<string>QmsPluginFramework.framework</string> <string>QmsPluginFramework.framework</string>
<key>SupportedArchitectures</key> <key>SupportedArchitectures</key>
<array> <array>
<string>arm64</string> <string>arm64</string>
<string>x86_64</string>
</array> </array>
<key>SupportedPlatform</key> <key>SupportedPlatform</key>
<string>ios</string> <string>ios</string>
<key>SupportedPlatformVariant</key>
<string>simulator</string>
</dict> </dict>
</array> </array>
<key>CFBundlePackageType</key> <key>CFBundlePackageType</key>
......
...@@ -6,7 +6,7 @@ ...@@ -6,7 +6,7 @@
<dict> <dict>
<key>Assets.car</key> <key>Assets.car</key>
<data> <data>
nz4CVgVrIgti3Z6dGyfqT52lO7E= 4/wVNoFd+WcEg7nmH9Hm5v1nm7s=
</data> </data>
<key>Headers/QmsPlugin.h</key> <key>Headers/QmsPlugin.h</key>
<data> <data>
...@@ -18,7 +18,7 @@ ...@@ -18,7 +18,7 @@
</data> </data>
<key>Info.plist</key> <key>Info.plist</key>
<data> <data>
t43yRjSptMFTXQfSxY21jokBVtU= AaJE9H7xzNyQkDiLPw3sM9LfFjQ=
</data> </data>
<key>Modules/module.modulemap</key> <key>Modules/module.modulemap</key>
<data> <data>
...@@ -31,7 +31,7 @@ ...@@ -31,7 +31,7 @@
<dict> <dict>
<key>hash2</key> <key>hash2</key>
<data> <data>
J60ydBHIUa66OEr3jc21333AHp87l+VEFvKU7h3lu2M= zhv68b8E95A9988/pvXA0JKzn5/KsdixWe45ATxfW3g=
</data> </data>
</dict> </dict>
<key>Headers/QmsPlugin.h</key> <key>Headers/QmsPlugin.h</key>
......
...@@ -6,7 +6,7 @@ ...@@ -6,7 +6,7 @@
<dict> <dict>
<key>Assets.car</key> <key>Assets.car</key>
<data> <data>
nz4CVgVrIgti3Z6dGyfqT52lO7E= 4/wVNoFd+WcEg7nmH9Hm5v1nm7s=
</data> </data>
<key>Headers/QmsPlugin.h</key> <key>Headers/QmsPlugin.h</key>
<data> <data>
...@@ -18,7 +18,7 @@ ...@@ -18,7 +18,7 @@
</data> </data>
<key>Info.plist</key> <key>Info.plist</key>
<data> <data>
CSlwpYePP8U03s3cRC5622W7ESM= RNXd5p+E7NvIdc7OKurgeIO55/s=
</data> </data>
<key>Modules/module.modulemap</key> <key>Modules/module.modulemap</key>
<data> <data>
...@@ -31,7 +31,7 @@ ...@@ -31,7 +31,7 @@
<dict> <dict>
<key>hash2</key> <key>hash2</key>
<data> <data>
J60ydBHIUa66OEr3jc21333AHp87l+VEFvKU7h3lu2M= zhv68b8E95A9988/pvXA0JKzn5/KsdixWe45ATxfW3g=
</data> </data>
</dict> </dict>
<key>Headers/QmsPlugin.h</key> <key>Headers/QmsPlugin.h</key>
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment