Explorar el Código

1. 完成 Apex CRM部分网页事件处理。

Pen Li hace 7 años
padre
commit
8f68a61ad1

+ 196 - 0
RedAnt CRM/APEX CRM/APEX CRM.xcodeproj/project.pbxproj

@@ -7,6 +7,24 @@
 	objects = {
 
 /* Begin PBXBuildFile section */
+		4212AB8E21AD22AB00BE4E45 /* QRCode.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 4212AB8121AD22AA00BE4E45 /* QRCode.storyboard */; };
+		4212AB8F21AD22AB00BE4E45 /* RAQRCodeScannerViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 4212AB8321AD22AA00BE4E45 /* RAQRCodeScannerViewController.m */; };
+		4212AB9021AD22AB00BE4E45 /* Camera.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 4212AB8521AD22AA00BE4E45 /* Camera.storyboard */; };
+		4212AB9121AD22AB00BE4E45 /* camera.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 4212AB8621AD22AA00BE4E45 /* camera.xcassets */; };
+		4212AB9221AD22AB00BE4E45 /* RACameraViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 4212AB8821AD22AA00BE4E45 /* RACameraViewController.m */; };
+		4212AB9321AD22AB00BE4E45 /* RATakePhotoPreviewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 4212AB8A21AD22AA00BE4E45 /* RATakePhotoPreviewController.m */; };
+		4212AB9421AD22AB00BE4E45 /* RAExceptionHandler.m in Sources */ = {isa = PBXBuildFile; fileRef = 4212AB8D21AD22AB00BE4E45 /* RAExceptionHandler.m */; };
+		4212AB9821AD25C800BE4E45 /* RAPreviewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 4212AB9721AD25C800BE4E45 /* RAPreviewController.m */; };
+		4212AB9D21AD2AFE00BE4E45 /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 4212AB9F21AD2AFE00BE4E45 /* InfoPlist.strings */; };
+		4212ABA321AD2B7300BE4E45 /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = 4212ABA521AD2B7300BE4E45 /* Localizable.strings */; };
+		4212ABAA21AD36E600BE4E45 /* RAProgressHUD.m in Sources */ = {isa = PBXBuildFile; fileRef = 4212ABA921AD36E600BE4E45 /* RAProgressHUD.m */; };
+		4212ABBE21AD389200BE4E45 /* NetworkUtils.m in Sources */ = {isa = PBXBuildFile; fileRef = 4212ABB721AD389200BE4E45 /* NetworkUtils.m */; };
+		4212ABBF21AD389200BE4E45 /* RANetworkTaskDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 4212ABB921AD389200BE4E45 /* RANetworkTaskDelegate.m */; };
+		4212ABC021AD389200BE4E45 /* RAReachability.m in Sources */ = {isa = PBXBuildFile; fileRef = 4212ABBB21AD389200BE4E45 /* RAReachability.m */; };
+		4212ABC121AD389200BE4E45 /* Reachability.m in Sources */ = {isa = PBXBuildFile; fileRef = 4212ABBD21AD389200BE4E45 /* Reachability.m */; };
+		4212ABC521AD3C3200BE4E45 /* RADataProvider.m in Sources */ = {isa = PBXBuildFile; fileRef = 4212ABC421AD3C3200BE4E45 /* RADataProvider.m */; };
+		4212ABCB21AD450A00BE4E45 /* RAShareItemProvider.m in Sources */ = {isa = PBXBuildFile; fileRef = 4212ABC821AD450900BE4E45 /* RAShareItemProvider.m */; };
+		4212ABCC21AD450A00BE4E45 /* LPShareActivity.m in Sources */ = {isa = PBXBuildFile; fileRef = 4212ABCA21AD450900BE4E45 /* LPShareActivity.m */; };
 		7106E80A21A684F20056DD20 /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 7106E80921A684F20056DD20 /* AppDelegate.m */; };
 		7106E80D21A684F20056DD20 /* ViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 7106E80C21A684F20056DD20 /* ViewController.m */; };
 		7106E81021A684F20056DD20 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 7106E80E21A684F20056DD20 /* Main.storyboard */; };
@@ -25,6 +43,41 @@
 /* End PBXBuildFile section */
 
 /* Begin PBXFileReference section */
+		4212AB8121AD22AA00BE4E45 /* QRCode.storyboard */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.storyboard; path = QRCode.storyboard; sourceTree = "<group>"; };
+		4212AB8221AD22AA00BE4E45 /* RAQRCodeScannerViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RAQRCodeScannerViewController.h; sourceTree = "<group>"; };
+		4212AB8321AD22AA00BE4E45 /* RAQRCodeScannerViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = RAQRCodeScannerViewController.m; sourceTree = "<group>"; };
+		4212AB8521AD22AA00BE4E45 /* Camera.storyboard */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.storyboard; path = Camera.storyboard; sourceTree = "<group>"; };
+		4212AB8621AD22AA00BE4E45 /* camera.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = camera.xcassets; sourceTree = "<group>"; };
+		4212AB8721AD22AA00BE4E45 /* RACameraViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RACameraViewController.h; sourceTree = "<group>"; };
+		4212AB8821AD22AA00BE4E45 /* RACameraViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = RACameraViewController.m; sourceTree = "<group>"; };
+		4212AB8921AD22AA00BE4E45 /* RATakePhotoPreviewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RATakePhotoPreviewController.h; sourceTree = "<group>"; };
+		4212AB8A21AD22AA00BE4E45 /* RATakePhotoPreviewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = RATakePhotoPreviewController.m; sourceTree = "<group>"; };
+		4212AB8C21AD22AB00BE4E45 /* RAExceptionHandler.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RAExceptionHandler.h; sourceTree = "<group>"; };
+		4212AB8D21AD22AB00BE4E45 /* RAExceptionHandler.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = RAExceptionHandler.m; sourceTree = "<group>"; };
+		4212AB9621AD25C800BE4E45 /* RAPreviewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = RAPreviewController.h; sourceTree = "<group>"; };
+		4212AB9721AD25C800BE4E45 /* RAPreviewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = RAPreviewController.m; sourceTree = "<group>"; };
+		4212AB9921AD2A7100BE4E45 /* zh-Hans */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "zh-Hans"; path = "zh-Hans.lproj/Main.strings"; sourceTree = "<group>"; };
+		4212AB9A21AD2A7100BE4E45 /* zh-Hans */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "zh-Hans"; path = "zh-Hans.lproj/LaunchScreen.strings"; sourceTree = "<group>"; };
+		4212AB9E21AD2AFE00BE4E45 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/InfoPlist.strings; sourceTree = "<group>"; };
+		4212ABA021AD2B0000BE4E45 /* zh-Hans */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "zh-Hans"; path = "zh-Hans.lproj/InfoPlist.strings"; sourceTree = "<group>"; };
+		4212ABA421AD2B7300BE4E45 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/Localizable.strings; sourceTree = "<group>"; };
+		4212ABA621AD2B7700BE4E45 /* zh-Hans */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "zh-Hans"; path = "zh-Hans.lproj/Localizable.strings"; sourceTree = "<group>"; };
+		4212ABA821AD36E600BE4E45 /* RAProgressHUD.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RAProgressHUD.h; sourceTree = "<group>"; };
+		4212ABA921AD36E600BE4E45 /* RAProgressHUD.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = RAProgressHUD.m; sourceTree = "<group>"; };
+		4212ABB621AD389200BE4E45 /* NetworkUtils.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = NetworkUtils.h; sourceTree = "<group>"; };
+		4212ABB721AD389200BE4E45 /* NetworkUtils.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = NetworkUtils.m; sourceTree = "<group>"; };
+		4212ABB821AD389200BE4E45 /* RANetworkTaskDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RANetworkTaskDelegate.h; sourceTree = "<group>"; };
+		4212ABB921AD389200BE4E45 /* RANetworkTaskDelegate.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = RANetworkTaskDelegate.m; sourceTree = "<group>"; };
+		4212ABBA21AD389200BE4E45 /* RAReachability.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RAReachability.h; sourceTree = "<group>"; };
+		4212ABBB21AD389200BE4E45 /* RAReachability.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = RAReachability.m; sourceTree = "<group>"; };
+		4212ABBC21AD389200BE4E45 /* Reachability.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Reachability.h; sourceTree = "<group>"; };
+		4212ABBD21AD389200BE4E45 /* Reachability.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = Reachability.m; sourceTree = "<group>"; };
+		4212ABC321AD3C3200BE4E45 /* RADataProvider.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = RADataProvider.h; sourceTree = "<group>"; };
+		4212ABC421AD3C3200BE4E45 /* RADataProvider.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = RADataProvider.m; sourceTree = "<group>"; };
+		4212ABC721AD450900BE4E45 /* RAShareItemProvider.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RAShareItemProvider.h; sourceTree = "<group>"; };
+		4212ABC821AD450900BE4E45 /* RAShareItemProvider.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = RAShareItemProvider.m; sourceTree = "<group>"; };
+		4212ABC921AD450900BE4E45 /* LPShareActivity.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = LPShareActivity.h; sourceTree = "<group>"; };
+		4212ABCA21AD450900BE4E45 /* LPShareActivity.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = LPShareActivity.m; sourceTree = "<group>"; };
 		7106E80521A684F20056DD20 /* APEX CRM.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "APEX CRM.app"; sourceTree = BUILT_PRODUCTS_DIR; };
 		7106E80821A684F20056DD20 /* AppDelegate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = AppDelegate.h; sourceTree = "<group>"; };
 		7106E80921A684F20056DD20 /* AppDelegate.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = AppDelegate.m; sourceTree = "<group>"; };
@@ -69,6 +122,98 @@
 /* End PBXFrameworksBuildPhase section */
 
 /* Begin PBXGroup section */
+		4212AB8021AD22AA00BE4E45 /* QRCode */ = {
+			isa = PBXGroup;
+			children = (
+				4212AB8121AD22AA00BE4E45 /* QRCode.storyboard */,
+				4212AB8221AD22AA00BE4E45 /* RAQRCodeScannerViewController.h */,
+				4212AB8321AD22AA00BE4E45 /* RAQRCodeScannerViewController.m */,
+			);
+			name = QRCode;
+			path = ../../../common/QRCode;
+			sourceTree = "<group>";
+		};
+		4212AB8421AD22AA00BE4E45 /* Camera */ = {
+			isa = PBXGroup;
+			children = (
+				4212AB8521AD22AA00BE4E45 /* Camera.storyboard */,
+				4212AB8621AD22AA00BE4E45 /* camera.xcassets */,
+				4212AB8721AD22AA00BE4E45 /* RACameraViewController.h */,
+				4212AB8821AD22AA00BE4E45 /* RACameraViewController.m */,
+				4212AB8921AD22AA00BE4E45 /* RATakePhotoPreviewController.h */,
+				4212AB8A21AD22AA00BE4E45 /* RATakePhotoPreviewController.m */,
+			);
+			name = Camera;
+			path = ../../../common/Camera;
+			sourceTree = "<group>";
+		};
+		4212AB8B21AD22AB00BE4E45 /* ExceptionHandler */ = {
+			isa = PBXGroup;
+			children = (
+				4212AB8C21AD22AB00BE4E45 /* RAExceptionHandler.h */,
+				4212AB8D21AD22AB00BE4E45 /* RAExceptionHandler.m */,
+			);
+			name = ExceptionHandler;
+			path = ../../../common/ExceptionHandler;
+			sourceTree = "<group>";
+		};
+		4212AB9521AD259900BE4E45 /* QuickLook */ = {
+			isa = PBXGroup;
+			children = (
+				4212AB9621AD25C800BE4E45 /* RAPreviewController.h */,
+				4212AB9721AD25C800BE4E45 /* RAPreviewController.m */,
+			);
+			name = QuickLook;
+			path = ../../../common/QuickLook;
+			sourceTree = "<group>";
+		};
+		4212ABA721AD36E600BE4E45 /* HUD */ = {
+			isa = PBXGroup;
+			children = (
+				4212ABA821AD36E600BE4E45 /* RAProgressHUD.h */,
+				4212ABA921AD36E600BE4E45 /* RAProgressHUD.m */,
+			);
+			name = HUD;
+			path = ../../../common/HUD;
+			sourceTree = "<group>";
+		};
+		4212ABB521AD389200BE4E45 /* Network */ = {
+			isa = PBXGroup;
+			children = (
+				4212ABB621AD389200BE4E45 /* NetworkUtils.h */,
+				4212ABB721AD389200BE4E45 /* NetworkUtils.m */,
+				4212ABB821AD389200BE4E45 /* RANetworkTaskDelegate.h */,
+				4212ABB921AD389200BE4E45 /* RANetworkTaskDelegate.m */,
+				4212ABBA21AD389200BE4E45 /* RAReachability.h */,
+				4212ABBB21AD389200BE4E45 /* RAReachability.m */,
+				4212ABBC21AD389200BE4E45 /* Reachability.h */,
+				4212ABBD21AD389200BE4E45 /* Reachability.m */,
+			);
+			name = Network;
+			path = ../../../common/Network;
+			sourceTree = "<group>";
+		};
+		4212ABC221AD3C0300BE4E45 /* DataProvider */ = {
+			isa = PBXGroup;
+			children = (
+				4212ABC321AD3C3200BE4E45 /* RADataProvider.h */,
+				4212ABC421AD3C3200BE4E45 /* RADataProvider.m */,
+			);
+			path = DataProvider;
+			sourceTree = "<group>";
+		};
+		4212ABC621AD450900BE4E45 /* Share */ = {
+			isa = PBXGroup;
+			children = (
+				4212ABC721AD450900BE4E45 /* RAShareItemProvider.h */,
+				4212ABC821AD450900BE4E45 /* RAShareItemProvider.m */,
+				4212ABC921AD450900BE4E45 /* LPShareActivity.h */,
+				4212ABCA21AD450900BE4E45 /* LPShareActivity.m */,
+			);
+			name = Share;
+			path = ../../../common/Share;
+			sourceTree = "<group>";
+		};
 		7106E7FC21A684F20056DD20 = {
 			isa = PBXGroup;
 			children = (
@@ -88,8 +233,16 @@
 		7106E80721A684F20056DD20 /* APEX CRM */ = {
 			isa = PBXGroup;
 			children = (
+				4212ABC621AD450900BE4E45 /* Share */,
+				4212ABB521AD389200BE4E45 /* Network */,
+				4212ABA721AD36E600BE4E45 /* HUD */,
+				4212AB9521AD259900BE4E45 /* QuickLook */,
+				4212AB8421AD22AA00BE4E45 /* Camera */,
+				4212AB8B21AD22AB00BE4E45 /* ExceptionHandler */,
+				4212AB8021AD22AA00BE4E45 /* QRCode */,
 				7106E82B21ABF26C0056DD20 /* config */,
 				7106E82721ABF1F90056DD20 /* utils */,
+				4212ABC221AD3C0300BE4E45 /* DataProvider */,
 				7106E80821A684F20056DD20 /* AppDelegate.h */,
 				7106E80921A684F20056DD20 /* AppDelegate.m */,
 				7106E82121A6856E0056DD20 /* WKWebTestViewController.h */,
@@ -102,7 +255,9 @@
 				7106E81121A684F50056DD20 /* Assets.xcassets */,
 				7106E81321A684F50056DD20 /* LaunchScreen.storyboard */,
 				7106E81621A684F50056DD20 /* Info.plist */,
+				4212AB9F21AD2AFE00BE4E45 /* InfoPlist.strings */,
 				7106E81721A684F50056DD20 /* main.m */,
+				4212ABA521AD2B7300BE4E45 /* Localizable.strings */,
 			);
 			path = "APEX CRM";
 			sourceTree = "<group>";
@@ -187,6 +342,7 @@
 			knownRegions = (
 				en,
 				Base,
+				"zh-Hans",
 			);
 			mainGroup = 7106E7FC21A684F20056DD20;
 			productRefGroup = 7106E80621A684F20056DD20 /* Products */;
@@ -204,8 +360,13 @@
 			buildActionMask = 2147483647;
 			files = (
 				7106E81521A684F50056DD20 /* LaunchScreen.storyboard in Resources */,
+				4212AB9D21AD2AFE00BE4E45 /* InfoPlist.strings in Resources */,
 				7106E81221A684F50056DD20 /* Assets.xcassets in Resources */,
+				4212AB8E21AD22AB00BE4E45 /* QRCode.storyboard in Resources */,
 				7106E81021A684F20056DD20 /* Main.storyboard in Resources */,
+				4212ABA321AD2B7300BE4E45 /* Localizable.strings in Resources */,
+				4212AB9121AD22AB00BE4E45 /* camera.xcassets in Resources */,
+				4212AB9021AD22AB00BE4E45 /* Camera.storyboard in Resources */,
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 		};
@@ -216,28 +377,60 @@
 			isa = PBXSourcesBuildPhase;
 			buildActionMask = 2147483647;
 			files = (
+				4212ABCC21AD450A00BE4E45 /* LPShareActivity.m in Sources */,
+				4212AB9821AD25C800BE4E45 /* RAPreviewController.m in Sources */,
+				4212ABC521AD3C3200BE4E45 /* RADataProvider.m in Sources */,
 				7106E83D21AD1B070056DD20 /* zip.c in Sources */,
 				7106E83B21AD1B070056DD20 /* unzip.c in Sources */,
+				4212ABCB21AD450A00BE4E45 /* RAShareItemProvider.m in Sources */,
+				4212ABBE21AD389200BE4E45 /* NetworkUtils.m in Sources */,
 				7106E82221A6856E0056DD20 /* WKWebTestViewController.m in Sources */,
+				4212ABBF21AD389200BE4E45 /* RANetworkTaskDelegate.m in Sources */,
 				7106E82A21ABF2190056DD20 /* RAConvertor.m in Sources */,
 				7106E83A21AD1B070056DD20 /* mztools.c in Sources */,
+				4212AB8F21AD22AB00BE4E45 /* RAQRCodeScannerViewController.m in Sources */,
+				4212ABAA21AD36E600BE4E45 /* RAProgressHUD.m in Sources */,
+				4212AB9221AD22AB00BE4E45 /* RACameraViewController.m in Sources */,
 				7106E83C21AD1B070056DD20 /* ioapi.c in Sources */,
 				7106E80D21A684F20056DD20 /* ViewController.m in Sources */,
+				4212ABC021AD389200BE4E45 /* RAReachability.m in Sources */,
+				4212ABC121AD389200BE4E45 /* Reachability.m in Sources */,
 				7106E81821A684F50056DD20 /* main.m in Sources */,
 				7106E82F21AD1ACD0056DD20 /* RAUtils.m in Sources */,
 				7106E80A21A684F20056DD20 /* AppDelegate.m in Sources */,
+				4212AB9321AD22AB00BE4E45 /* RATakePhotoPreviewController.m in Sources */,
 				7106E84021AD1B0D0056DD20 /* ZipArchive.mm in Sources */,
 				7106E82621A698D20056DD20 /* RAWKWebView.m in Sources */,
+				4212AB9421AD22AB00BE4E45 /* RAExceptionHandler.m in Sources */,
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 		};
 /* End PBXSourcesBuildPhase section */
 
 /* Begin PBXVariantGroup section */
+		4212AB9F21AD2AFE00BE4E45 /* InfoPlist.strings */ = {
+			isa = PBXVariantGroup;
+			children = (
+				4212AB9E21AD2AFE00BE4E45 /* en */,
+				4212ABA021AD2B0000BE4E45 /* zh-Hans */,
+			);
+			name = InfoPlist.strings;
+			sourceTree = "<group>";
+		};
+		4212ABA521AD2B7300BE4E45 /* Localizable.strings */ = {
+			isa = PBXVariantGroup;
+			children = (
+				4212ABA421AD2B7300BE4E45 /* en */,
+				4212ABA621AD2B7700BE4E45 /* zh-Hans */,
+			);
+			name = Localizable.strings;
+			sourceTree = "<group>";
+		};
 		7106E80E21A684F20056DD20 /* Main.storyboard */ = {
 			isa = PBXVariantGroup;
 			children = (
 				7106E80F21A684F20056DD20 /* Base */,
+				4212AB9921AD2A7100BE4E45 /* zh-Hans */,
 			);
 			name = Main.storyboard;
 			sourceTree = "<group>";
@@ -246,6 +439,7 @@
 			isa = PBXVariantGroup;
 			children = (
 				7106E81421A684F50056DD20 /* Base */,
+				4212AB9A21AD2A7100BE4E45 /* zh-Hans */,
 			);
 			name = LaunchScreen.storyboard;
 			sourceTree = "<group>";
@@ -257,6 +451,7 @@
 			isa = XCBuildConfiguration;
 			buildSettings = {
 				ALWAYS_SEARCH_USER_PATHS = NO;
+				CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES;
 				CLANG_ANALYZER_NONNULL = YES;
 				CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
 				CLANG_CXX_LANGUAGE_STANDARD = "gnu++14";
@@ -316,6 +511,7 @@
 			isa = XCBuildConfiguration;
 			buildSettings = {
 				ALWAYS_SEARCH_USER_PATHS = NO;
+				CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES;
 				CLANG_ANALYZER_NONNULL = YES;
 				CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
 				CLANG_CXX_LANGUAGE_STANDARD = "gnu++14";

+ 14 - 0
RedAnt CRM/APEX CRM/APEX CRM.xcodeproj/xcuserdata/macmini1.xcuserdatad/xcschemes/xcschememanagement.plist

@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
+<plist version="1.0">
+<dict>
+	<key>SchemeUserState</key>
+	<dict>
+		<key>APEX CRM.xcscheme_^#shared#^_</key>
+		<dict>
+			<key>orderHint</key>
+			<integer>0</integer>
+		</dict>
+	</dict>
+</dict>
+</plist>

+ 17 - 0
RedAnt CRM/APEX CRM/APEX CRM/DataProvider/RADataProvider.h

@@ -0,0 +1,17 @@
+//
+//  RADataProvider.h
+//  APEX CRM
+//
+//  Created by Jack on 2018/11/27.
+//  Copyright © 2018年 USAI. All rights reserved.
+//
+
+#import <Foundation/Foundation.h>
+#import "NetworkUtils.h"
+
+@interface RADataProvider : NSObject
+
++ (void)GET_DownloadFile:(NSString *)url toFolder:(NSString *)dir progressHandler:(progressHandler)progressHandler completionHandler:(resultHandler)resultHandler;
+
+@end
+

+ 80 - 0
RedAnt CRM/APEX CRM/APEX CRM/DataProvider/RADataProvider.m

@@ -0,0 +1,80 @@
+//
+//  RADataProvider.m
+//  APEX CRM
+//
+//  Created by Jack on 2018/11/27.
+//  Copyright © 2018年 USAI. All rights reserved.
+//
+
+#import "RADataProvider.h"
+#import "RAUtils.h"
+
+@implementation RADataProvider
+
++ (void)GET_DownloadFile:(NSString *)url toFolder:(NSString *)dir progressHandler:(progressHandler)progressHandler completionHandler:(resultHandler)resultHandler {
+    
+    if (!url) {
+        
+        if (resultHandler) {
+            NSMutableDictionary *resutlDic = [@{
+                                                @"result" : @0,
+                                                @"msg"    : @"url is null"
+                                                } mutableCopy];
+            resultHandler(resutlDic);
+        }
+        
+        return;
+    }
+    
+    NSString *md5 = [RAUtils md5:url];
+    if (!dir) {
+        dir = NSTemporaryDirectory();
+    }
+    
+    NSString *filePath = [dir stringByAppendingPathComponent:[NSString stringWithFormat:@"%@_%@",md5,url.lastPathComponent]];
+    if ([[NSFileManager defaultManager] fileExistsAtPath:filePath]) {
+        
+        if (progressHandler) {
+            progressHandler(nil, 1.0f);
+        }
+        
+        if (resultHandler) {
+            
+            NSMutableDictionary *resutlDic = [@{
+                                                @"result" : @2,
+                                                @"path"   : filePath,
+                                                @"msg"    : @"finish download"
+                                                } mutableCopy];
+            resultHandler(resutlDic);
+        }
+        
+    } else {
+        
+        
+        [NetworkUtils downloadFileOffset:0 Param:nil from:url method:@"GET" toPath:dir progressHandler:^(NSURLSessionTask *task, double progress) {
+            
+            if (progressHandler) {
+                progressHandler(task, progress);
+            }
+            
+        } completionHandler:^(NSMutableDictionary *result) {
+            
+            int resultCode = [[result objectForKey:@"result"] intValue];
+            if (resultCode == RESULT_TRUE) {
+                
+                NSString *path = [result objectForKey:@"path"];
+                if (path && ![path isEqualToString:filePath] && [[NSFileManager defaultManager] fileExistsAtPath:path]) {
+                    [[NSFileManager defaultManager] moveItemAtPath:path toPath:filePath error:nil];
+                    [result setObject:filePath forKey:@"path"];
+                }
+                
+            }
+            
+            if (resultHandler) {
+                resultHandler(result);
+            }
+        }];
+    }
+}
+
+@end

+ 4 - 0
RedAnt CRM/APEX CRM/APEX CRM/Info.plist

@@ -41,5 +41,9 @@
 		<string>UIInterfaceOrientationLandscapeLeft</string>
 		<string>UIInterfaceOrientationLandscapeRight</string>
 	</array>
+	<key>NSCameraUsageDescription</key>
+	<string>使用相机拍照</string>
+	<key>NSPhotoLibraryUsageDescription</key>
+	<string>访问相册</string>
 </dict>
 </plist>

+ 274 - 4
RedAnt CRM/APEX CRM/APEX CRM/RAWKWebView.m

@@ -9,8 +9,15 @@
 #import "RAWKWebView.h"
 #import "RAConvertor.h"
 #import "RAUtils.h"
+#import "RACameraViewController.h"
+#import "RAPreviewController.h"
+#import "RAQRCodeScannerViewController.h"
+#import "RADataProvider.h"
+#import "RAProgressHUD.h"
+#import <MessageUI/MessageUI.h>
+#import "LPShareActivity.h"
 
-@interface RAWKWebView ()
+@interface RAWKWebView () <UINavigationControllerDelegate,UIImagePickerControllerDelegate,MFMailComposeViewControllerDelegate>
 @property (strong, nonatomic)   WKWebView                   *wkwebView;
 @end
 
@@ -71,8 +78,6 @@
     [self.wkwebView loadRequest:request];
 }
 
-
-
 -(void) initMessageHandler
 {
     [self.wkwebView.configuration.userContentController addScriptMessageHandler:self name:@"CamScan"];
@@ -112,6 +117,238 @@
 
 }
 
+#pragma mark - Private
+
+- (UIViewController *)ra_viewController {
+    return [RAUtils getViewController:self];
+}
+
+- (void)ra_openPhotoLibrary:(NSDictionary *)params {
+    
+    UIImagePickerController *imagePicker = [[UIImagePickerController alloc] init];
+    imagePicker.delegate = self;
+    imagePicker.sourceType = UIImagePickerControllerSourceTypePhotoLibrary;
+    imagePicker.modalTransitionStyle = UIModalTransitionStyleCoverVertical;
+    imagePicker.allowsEditing = YES;
+    [self.ra_viewController presentViewController:imagePicker animated:YES completion:nil];
+}
+
+- (void)ra_openCamera:(NSDictionary *)params {
+    
+    RACameraViewController *cameraVC = [RACameraViewController viewControllerFromStoryboard];
+    cameraVC.completion = ^(UIImage *image) {
+
+    };
+    
+    cameraVC.fromVC = self.ra_viewController;
+    [self.ra_viewController.navigationController pushViewController:cameraVC animated:YES];
+}
+
+- (void)ra_openQRCodeScanner:(NSDictionary *)params {
+    
+    RAQRCodeScannerViewController *scanVC = [RAQRCodeScannerViewController viewControllerFromStoryboard];
+    
+    scanVC.completion = ^(NSString *value) {
+        
+    };
+    
+    [self.ra_viewController.navigationController pushViewController:scanVC animated:YES];
+}
+
+- (void)ra_previewDocument:(NSDictionary *)params {
+    /**
+     cc = "test1@abc.com,test2@abc.com";
+     content = content;
+     receipt = "test@abc.com";
+     subject = "email subject";
+     url = "http://10.0.0.4:8080/backend_test/test.pdf";
+     */
+    
+    NSString *urlStr = [params objectForKey:@"url"];
+    urlStr = @"http://192.168.0.130/ios.pdf";
+    if (urlStr) {
+        
+        RAProgressHUD *hud = [RAProgressHUD showHUDOnView:self.ra_viewController.view];
+        
+        // 先下载下来,否则QuickLook分享要崩溃
+        dispatch_async(dispatch_get_global_queue(0, 0), ^{
+            
+            NSString *tmpDir = NSTemporaryDirectory();
+            
+            [RADataProvider GET_DownloadFile:urlStr toFolder:tmpDir progressHandler:^(NSURLSessionTask *task, double progress) {
+                
+                NSLog(@"download %@ progress %f", urlStr.lastPathComponent, progress);
+                
+            } completionHandler:^(NSMutableDictionary *result) {
+                
+                dispatch_async(dispatch_get_main_queue(), ^{
+                    
+                    [hud dismiss:^{
+                        
+                        int resultCode = [[result objectForKey:@"result"] intValue];
+                        if (resultCode == RESULT_TRUE) {
+                            
+                            NSString *path = [result objectForKey:@"path"];
+                            
+                            RAPreviewController *vc = [RAPreviewController ra_previewControllerWithURL:[NSURL fileURLWithPath:path]];
+                            [self.ra_viewController presentViewController:vc animated:YES completion:nil];
+                            
+                        } else {
+                            
+                            NSString *msg = [result objectForKey:@"msg"];
+                            [RAUtils message_alert:msg title:NSLocalizedString(@"warning_title", nil) controller:self.ra_viewController];
+                            
+                        }
+                        
+                    }];
+                    
+                });
+                
+            }];
+        });
+        
+    }
+}
+
+- (void)ra_mail:(NSDictionary *)params {
+ 
+    /**
+     
+     cc = "test1@abc.com,test2@abc.com";
+     content = content;
+     receipt = "test@abc.com";
+     subject = "email subject";
+     
+     */
+
+    MFMailComposeViewController *mc = [[MFMailComposeViewController alloc] init];
+    
+    if(mc==nil)
+    {
+        return;
+    }
+    
+    NSString *subject = [params objectForKey:@"subject"];
+    NSString *receipt = [params objectForKey:@"receipt"];
+    NSString *content = [params objectForKey:@"content"];
+    NSString *cc = [params objectForKey:@"cc"];
+    
+    mc.mailComposeDelegate = self;
+    [mc setSubject:subject];
+    
+    
+    [mc setToRecipients:[receipt componentsSeparatedByString:@";"]];
+    [mc setCcRecipients:[cc componentsSeparatedByString:@";"]];
+    
+    if(!content)
+        content=@"";
+    
+    NSString* htmlbody = [NSString stringWithFormat:@"<html><p>%@</p></html>",content];
+    
+    [mc setMessageBody:htmlbody isHTML:YES];
+    
+    
+//    NSString* filename =self.filename;
+//
+//    NSString *filePath = self.url;
+//    NSData *data = [NSData dataWithContentsOfFile:filePath];
+//
+//    //    if(self.attachment_name.length>0)
+//    //        filename = self.attachment_name;
+//    [mc addAttachmentData:data mimeType:@"application/pdf" fileName:filename];
+    
+    [self.ra_viewController presentViewController:mc animated:YES completion:nil];
+    
+}
+
+- (void)ra_share:(NSDictionary *)params {
+    
+    // 设置分享内容
+    
+    NSString *filePath = nil;
+    NSString *subject = [params objectForKey:@"subject"];
+    NSString *receipt = [params objectForKey:@"receipt"];
+    NSString *content = [params objectForKey:@"content"];
+    NSString *cc = [params objectForKey:@"cc"];
+    
+    NSURL *url = [NSURL fileURLWithPath:filePath];
+    
+    NSArray *activityItems = @[url];
+    
+    LPShareActivity *share = [[LPShareActivity alloc] init];
+    share.to = [receipt componentsSeparatedByString:@";"];
+    share.subject = subject;
+    share.body = content;
+    share.filePath = filePath;
+    share.handle = ^(UIViewController *vc) {
+        [self.ra_viewController presentViewController:vc animated:YES completion:^{
+            // ...
+        }];
+    };
+    
+    // 服务类型控制器
+    UIActivityViewController *activityViewController = [[UIActivityViewController alloc] initWithActivityItems:activityItems applicationActivities:@[share]];
+    //    _activityViewController = activityViewController;
+    //    activityViewController.excludedActivityTypes = @[UIActivityTypeMail];
+    activityViewController.modalInPopover = true;
+    
+    // 选中分享类型
+    [activityViewController setCompletionWithItemsHandler:^(NSString * __nullable activityType, BOOL completed, NSArray * __nullable returnedItems, NSError * __nullable activityError){
+        
+        // 显示选中的分享类型
+        NSLog(@"act type %@",activityType);
+        
+        if (completed) {
+            NSLog(@"ok");
+        }else {
+            NSLog(@"not ok");
+        }
+        
+    }];
+    
+    [self.ra_viewController presentViewController:activityViewController animated:YES completion:nil];
+}
+
+#pragma mark -MFMailComposeViewControllerDelegate delegate
+
+- (void)mailComposeController:(MFMailComposeViewController*)controller didFinishWithResult:(MFMailComposeResult)result error:(NSError*)error {
+    switch (result)
+    {
+        case MFMailComposeResultCancelled:
+            DebugLog(@"Mail send canceled...");
+            break;
+        case MFMailComposeResultSaved:
+            DebugLog(@"Mail saved...");
+            break;
+        case MFMailComposeResultSent:
+            DebugLog(@"Mail sent...");
+            break;
+        case MFMailComposeResultFailed:
+            DebugLog(@"Mail send errored: %@...", [error localizedDescription]);
+            break;
+        default:
+            break;
+    }
+}
+
+
+#pragma mark - UIImagePickerControllerDelegate
+
+- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary<UIImagePickerControllerInfoKey,id> *)info {
+    
+    if (picker.sourceType == UIImagePickerControllerSourceTypePhotoLibrary) {
+        
+        UIImage *image = [info objectForKey:UIImagePickerControllerOriginalImage];
+        [picker dismissViewControllerAnimated:YES completion:nil];
+        NSLog(@"select image %@", image);
+    }
+    
+}
+
+- (void)imagePickerControllerDidCancel:(UIImagePickerController *)picker {
+    [picker dismissViewControllerAnimated:YES completion:nil];
+}
+
 #pragma mark - WKUIDelegate
 - (void)webView:(WKWebView *)webView runJavaScriptAlertPanelWithMessage:(NSString *)message initiatedByFrame:(WKFrameInfo *)frame completionHandler:(void (^)(void))completionHandler
 {
@@ -140,7 +377,7 @@
 - (void)userContentController:(WKUserContentController *)userContentController didReceiveScriptMessage:(WKScriptMessage *)message
 {
     //    message.body  --  Allowed types are NSNumber, NSString, NSDate, NSArray,NSDictionary, and NSNull.
-    NSLog(message.name);
+    NSLog(@"%@",message.name);
     NSLog(@"body:%@",message.body);
     
     NSDictionary* params=[RAConvertor string2dict:message.body];
@@ -194,16 +431,23 @@
 }
 - (void)handleCamScan:(NSDictionary *)params
 {
+    [self ra_openQRCodeScanner:params];
 }
 - (void)handleLocation:(NSDictionary *)params
 {
+    
 }
+
 - (void)handleShare:(NSDictionary *)params
 {
+    [self ra_share:params];
 }
+
 - (void)handleViewImage:(NSDictionary *)params
 {
+    
 }
+
 - (void)handlePostDialog:(NSDictionary *)params
 {
     UIAlertController *alert = [UIAlertController alertControllerWithTitle:params[@"title"] message:params[@"message"] preferredStyle:UIAlertControllerStyleAlert];
@@ -223,18 +467,44 @@
         [vc presentViewController:alert animated:YES completion:nil];
     
 }
+
 - (void)handlePhoto:(NSDictionary *)params
 {
+    
+    UIAlertController *alertVC = [UIAlertController alertControllerWithTitle:nil message:nil preferredStyle:UIAlertControllerStyleActionSheet];
+    UIAlertAction *photoLibraryAction = [UIAlertAction actionWithTitle:NSLocalizedString(@"wb_photo_libray_action", nil) style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) {
+        [self ra_openPhotoLibrary:params];
+    }];
+    [alertVC addAction:photoLibraryAction];
+    
+    UIAlertAction *cameraAction = [UIAlertAction actionWithTitle:NSLocalizedString(@"wb_camera_action", nil) style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) {
+        [self ra_openCamera:params];
+    }];
+    [alertVC addAction:cameraAction];
+    
+    UIAlertAction *cancelAction = [UIAlertAction actionWithTitle:NSLocalizedString(@"btn_cancel", nil) style:UIAlertActionStyleCancel handler:^(UIAlertAction * _Nonnull action) {
+        
+    }];
+    [alertVC addAction:cancelAction];
+    
+    [self.ra_viewController presentViewController:alertVC animated:YES completion:nil];
 }
+
 - (void)handleEmail:(NSDictionary *)params
 {
+    [self ra_mail:params];
 }
+
 - (void)handlePreview:(NSDictionary *)params
 {
+    [self ra_previewDocument:params];
 }
+
 - (void)handleNavigation:(NSDictionary *)params
 {
+    
 }
+
 - (void)handleJumpTo:(NSDictionary *)params
 {
     

+ 1 - 1
RedAnt CRM/APEX CRM/APEX CRM/ViewController.m

@@ -22,7 +22,7 @@
     
     
     WKWebTestViewController *vc = [self.storyboard instantiateViewControllerWithIdentifier:@"WKWebTestViewController"];
-    vc.url=@"http://10.0.0.4:8080/backend_test/index.html";
+    vc.url=@"http://192.168.0.138:8080/backend_test/index.html";
     [self.navigationController pushViewController:vc animated:YES];
     
     

+ 13 - 0
RedAnt CRM/APEX CRM/APEX CRM/en.lproj/InfoPlist.strings

@@ -0,0 +1,13 @@
+/* 
+  InfoPlist.strings
+  APEX CRM
+
+  Created by Jack on 2018/11/27.
+  Copyright © 2018年 USAI. All rights reserved.
+*/
+CFBundleDisplayName = "Apex & Drivers";
+NSCameraUsageDescription = "Take process evidence";
+NSLocationAlwaysAndWhenInUseUsageDescription = "Display location on map and navigation, report cargo location";
+NSLocationAlwaysUsageDescription = "Report cargo location";
+NSLocationUsageDescription = "Display location on map and navigation";
+NSLocationWhenInUseUsageDescription = "Display location on map and navigation";

+ 19 - 0
RedAnt CRM/APEX CRM/APEX CRM/en.lproj/Localizable.strings

@@ -0,0 +1,19 @@
+/* 
+  Localizable.strings
+  APEX CRM
+
+  Created by Jack on 2018/11/27.
+  Copyright © 2018年 USAI. All rights reserved.
+*/
+/**
+ Common
+ */
+"btn_cancel" = "Cancel";
+"warning_title" = "Warning";
+
+/**
+ WebView
+ */
+"wb_select_photo" = "Select Photo";
+"wb_photo_libray_action" = "Photo Library";
+"wb_camera_action" = "Camera";

+ 13 - 0
RedAnt CRM/APEX CRM/APEX CRM/zh-Hans.lproj/InfoPlist.strings

@@ -0,0 +1,13 @@
+/* 
+  InfoPlist.strings
+  APEX CRM
+
+  Created by Jack on 2018/11/27.
+  Copyright © 2018年 USAI. All rights reserved.
+*/
+CFBundleDisplayName = "Apex & Drivers";
+NSCameraUsageDescription = "采取过程证据";
+NSLocationAlwaysAndWhenInUseUsageDescription = "在地图和导航上显示位置,报告货物位置";
+NSLocationAlwaysUsageDescription = "报告货物位置";
+NSLocationUsageDescription = "在地图和导航上显示位置";
+NSLocationWhenInUseUsageDescription = "在地图和导航上显示位置";

+ 1 - 0
RedAnt CRM/APEX CRM/APEX CRM/zh-Hans.lproj/LaunchScreen.strings

@@ -0,0 +1 @@
+

+ 20 - 0
RedAnt CRM/APEX CRM/APEX CRM/zh-Hans.lproj/Localizable.strings

@@ -0,0 +1,20 @@
+/* 
+  Localizable.strings
+  APEX CRM
+
+  Created by Jack on 2018/11/27.
+  Copyright © 2018年 USAI. All rights reserved.
+*/
+
+/**
+ Common
+ */
+"btn_cancel" = "取消";
+"warning_title" = "警告";
+
+/**
+ WebView
+ */
+"wb_select_photo" = "选择照片";
+"wb_photo_libray_action" = "相册";
+"wb_camera_action" = "相机";

+ 3 - 0
RedAnt CRM/APEX CRM/APEX CRM/zh-Hans.lproj/Main.strings

@@ -0,0 +1,3 @@
+
+/* Class = "UIButton"; normalTitle = "test"; ObjectID = "Kfy-n6-Izt"; */
+"Kfy-n6-Izt.normalTitle" = "test";

BIN
RedAnt CRM/RedAnt CRM.xcworkspace/xcuserdata/macmini1.xcuserdatad/UserInterfaceState.xcuserstate


+ 5 - 0
RedAnt CRM/RedAnt CRM.xcworkspace/xcuserdata/macmini1.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist

@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<Bucket
+   type = "0"
+   version = "2.0">
+</Bucket>