Commit dd9033c9 authored by jz's avatar jz

update

parent 1a2a9e6b
...@@ -7,6 +7,7 @@ ...@@ -7,6 +7,7 @@
objects = { objects = {
/* Begin PBXBuildFile section */ /* Begin PBXBuildFile section */
04393781246AA49D00EAE014 /* File.swift in Sources */ = {isa = PBXBuildFile; fileRef = 04393780246AA49D00EAE014 /* File.swift */; };
0AB11836BD16E7A177F2CBDF /* Pods_GMBase_Example.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = A6E1B1FCE1B7696F7DE8B8E9 /* Pods_GMBase_Example.framework */; }; 0AB11836BD16E7A177F2CBDF /* Pods_GMBase_Example.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = A6E1B1FCE1B7696F7DE8B8E9 /* Pods_GMBase_Example.framework */; };
29C10D9EC61CDA2F6F466BD4 /* Pods_GMBase_Tests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 7E15FCB251AFC31B335265AF /* Pods_GMBase_Tests.framework */; }; 29C10D9EC61CDA2F6F466BD4 /* Pods_GMBase_Tests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 7E15FCB251AFC31B335265AF /* Pods_GMBase_Tests.framework */; };
6003F58E195388D20070C39A /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 6003F58D195388D20070C39A /* Foundation.framework */; }; 6003F58E195388D20070C39A /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 6003F58D195388D20070C39A /* Foundation.framework */; };
...@@ -40,6 +41,7 @@ ...@@ -40,6 +41,7 @@
/* End PBXContainerItemProxy section */ /* End PBXContainerItemProxy section */
/* Begin PBXFileReference section */ /* Begin PBXFileReference section */
04393780246AA49D00EAE014 /* File.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = File.swift; sourceTree = "<group>"; };
6003F58A195388D20070C39A /* GMBase_Example.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = GMBase_Example.app; sourceTree = BUILT_PRODUCTS_DIR; }; 6003F58A195388D20070C39A /* GMBase_Example.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = GMBase_Example.app; sourceTree = BUILT_PRODUCTS_DIR; };
6003F58D195388D20070C39A /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; }; 6003F58D195388D20070C39A /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; };
6003F58F195388D20070C39A /* CoreGraphics.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreGraphics.framework; path = System/Library/Frameworks/CoreGraphics.framework; sourceTree = SDKROOT; }; 6003F58F195388D20070C39A /* CoreGraphics.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreGraphics.framework; path = System/Library/Frameworks/CoreGraphics.framework; sourceTree = SDKROOT; };
...@@ -150,6 +152,7 @@ ...@@ -150,6 +152,7 @@
D32ECC461D33946600AEF0D0 /* GMListViewController.h */, D32ECC461D33946600AEF0D0 /* GMListViewController.h */,
D32ECC471D33946600AEF0D0 /* GMListViewController.m */, D32ECC471D33946600AEF0D0 /* GMListViewController.m */,
D3EB0CC21D33968300EEDD8B /* GMListViewModel.h */, D3EB0CC21D33968300EEDD8B /* GMListViewModel.h */,
04393780246AA49D00EAE014 /* File.swift */,
D3EB0CC31D33968300EEDD8B /* GMListViewModel.m */, D3EB0CC31D33968300EEDD8B /* GMListViewModel.m */,
D32ECC411D33840600AEF0D0 /* GMDetailController.h */, D32ECC411D33840600AEF0D0 /* GMDetailController.h */,
D32ECC421D33840600AEF0D0 /* GMDetailController.m */, D32ECC421D33840600AEF0D0 /* GMDetailController.m */,
...@@ -276,6 +279,7 @@ ...@@ -276,6 +279,7 @@
developmentRegion = English; developmentRegion = English;
hasScannedForEncodings = 0; hasScannedForEncodings = 0;
knownRegions = ( knownRegions = (
English,
en, en,
Base, Base,
); );
...@@ -428,6 +432,7 @@ ...@@ -428,6 +432,7 @@
files = ( files = (
D32ECC481D33946600AEF0D0 /* GMListViewController.m in Sources */, D32ECC481D33946600AEF0D0 /* GMListViewController.m in Sources */,
6003F59E195388D20070C39A /* GMAppDelegate.m in Sources */, 6003F59E195388D20070C39A /* GMAppDelegate.m in Sources */,
04393781246AA49D00EAE014 /* File.swift in Sources */,
6003F5A7195388D20070C39A /* GMViewController.m in Sources */, 6003F5A7195388D20070C39A /* GMViewController.m in Sources */,
D32ECC431D33840600AEF0D0 /* GMDetailController.m in Sources */, D32ECC431D33840600AEF0D0 /* GMDetailController.m in Sources */,
D3EB0CC41D33968300EEDD8B /* GMListViewModel.m in Sources */, D3EB0CC41D33968300EEDD8B /* GMListViewModel.m in Sources */,
...@@ -562,6 +567,7 @@ ...@@ -562,6 +567,7 @@
PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.demo.${PRODUCT_NAME:rfc1034identifier}"; PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.demo.${PRODUCT_NAME:rfc1034identifier}";
PRODUCT_NAME = "$(TARGET_NAME)"; PRODUCT_NAME = "$(TARGET_NAME)";
SWIFT_OBJC_BRIDGING_HEADER = "GMBase/GMBase_Example-Bridging-Header.h"; SWIFT_OBJC_BRIDGING_HEADER = "GMBase/GMBase_Example-Bridging-Header.h";
SWIFT_OBJC_INTERFACE_HEADER_NAME = "$GMBase-Swift.h";
SWIFT_OPTIMIZATION_LEVEL = "-Onone"; SWIFT_OPTIMIZATION_LEVEL = "-Onone";
WRAPPER_EXTENSION = app; WRAPPER_EXTENSION = app;
}; };
...@@ -583,6 +589,7 @@ ...@@ -583,6 +589,7 @@
PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.demo.${PRODUCT_NAME:rfc1034identifier}"; PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.demo.${PRODUCT_NAME:rfc1034identifier}";
PRODUCT_NAME = "$(TARGET_NAME)"; PRODUCT_NAME = "$(TARGET_NAME)";
SWIFT_OBJC_BRIDGING_HEADER = "GMBase/GMBase_Example-Bridging-Header.h"; SWIFT_OBJC_BRIDGING_HEADER = "GMBase/GMBase_Example-Bridging-Header.h";
SWIFT_OBJC_INTERFACE_HEADER_NAME = "$GMBase-Swift.h";
WRAPPER_EXTENSION = app; WRAPPER_EXTENSION = app;
}; };
name = Release; name = Release;
...@@ -591,6 +598,7 @@ ...@@ -591,6 +598,7 @@
isa = XCBuildConfiguration; isa = XCBuildConfiguration;
baseConfigurationReference = E10ABE29C983D16788B32755 /* Pods-GMBase_Tests.debug.xcconfig */; baseConfigurationReference = E10ABE29C983D16788B32755 /* Pods-GMBase_Tests.debug.xcconfig */;
buildSettings = { buildSettings = {
ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES;
BUNDLE_LOADER = "$(TEST_HOST)"; BUNDLE_LOADER = "$(TEST_HOST)";
FRAMEWORK_SEARCH_PATHS = ( FRAMEWORK_SEARCH_PATHS = (
"$(SDKROOT)/Developer/Library/Frameworks", "$(SDKROOT)/Developer/Library/Frameworks",
...@@ -615,6 +623,7 @@ ...@@ -615,6 +623,7 @@
isa = XCBuildConfiguration; isa = XCBuildConfiguration;
baseConfigurationReference = 78552CB3DCC72D38AB9DD053 /* Pods-GMBase_Tests.release.xcconfig */; baseConfigurationReference = 78552CB3DCC72D38AB9DD053 /* Pods-GMBase_Tests.release.xcconfig */;
buildSettings = { buildSettings = {
ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES;
BUNDLE_LOADER = "$(TEST_HOST)"; BUNDLE_LOADER = "$(TEST_HOST)";
FRAMEWORK_SEARCH_PATHS = ( FRAMEWORK_SEARCH_PATHS = (
"$(SDKROOT)/Developer/Library/Frameworks", "$(SDKROOT)/Developer/Library/Frameworks",
......
//
// File.swift
// GMBase_Example
//
// Created by Q14 on 2020/5/12.
// Copyright © 2020 wangyang. All rights reserved.
//
import Foundation
...@@ -8,9 +8,10 @@ source 'git@git.wanmeizhensuo.com:gengmeiios/GMSpecs.git' ...@@ -8,9 +8,10 @@ source 'git@git.wanmeizhensuo.com:gengmeiios/GMSpecs.git'
target 'GMBase_Example' do target 'GMBase_Example' do
pod 'GMBase', :path => '../' pod 'GMBase', :path => '../'
pod 'GMShareSDK', :git => 'git@git.wanmeizhensuo.com:gengmeiios/GMShareSDK.git', :commit => '781efd64048ffb9c09099997c97aadb05668568b' # pod 'SnapKit', '4.2.0'
pod 'GMShareSDK', '0.2.1'
pod 'GMFoundation', :path => '../../GMFoundation' pod 'GMFoundation', :path => '../../GMFoundation'
pod 'GMPhobos', :git => 'git@git.wanmeizhensuo.com:gengmeiios/GMPhobos.git', :commit => '7e58199898627699373ad6a9f87b875ab04b0927'
target 'GMBase_Tests' do target 'GMBase_Tests' do
inherit! :search_paths inherit! :search_paths
......
...@@ -84,7 +84,7 @@ PODS: ...@@ -84,7 +84,7 @@ PODS:
- GMRefresh (1.0.4): - GMRefresh (1.0.4):
- GMPhobos - GMPhobos
- MJRefresh - MJRefresh
- GMShareSDK (0.2.0): - GMShareSDK (0.2.1):
- DouyinOpenSDK (= 1.4.1) - DouyinOpenSDK (= 1.4.1)
- GMFoundation - GMFoundation
- GMJSONModel - GMJSONModel
...@@ -113,7 +113,8 @@ PODS: ...@@ -113,7 +113,8 @@ PODS:
DEPENDENCIES: DEPENDENCIES:
- GMBase (from `../`) - GMBase (from `../`)
- GMFoundation (from `../../GMFoundation`) - GMFoundation (from `../../GMFoundation`)
- "GMShareSDK (from `git@git.wanmeizhensuo.com:gengmeiios/GMShareSDK.git`, commit `781efd64048ffb9c09099997c97aadb05668568b`)" - "GMPhobos (from `git@git.wanmeizhensuo.com:gengmeiios/GMPhobos.git`, commit `7e58199898627699373ad6a9f87b875ab04b0927`)"
- GMShareSDK (= 0.2.1)
SPEC REPOS: SPEC REPOS:
"git@git.wanmeizhensuo.com:gengmeiios/GMSpecs.git": "git@git.wanmeizhensuo.com:gengmeiios/GMSpecs.git":
...@@ -122,8 +123,8 @@ SPEC REPOS: ...@@ -122,8 +123,8 @@ SPEC REPOS:
- GMJSONModel - GMJSONModel
- GMKit - GMKit
- GMNetService - GMNetService
- GMPhobos
- GMRefresh - GMRefresh
- GMShareSDK
https://github.com/CocoaPods/Specs.git: https://github.com/CocoaPods/Specs.git:
- AFNetworking - AFNetworking
- BDOpenSDKKit - BDOpenSDKKit
...@@ -145,14 +146,14 @@ EXTERNAL SOURCES: ...@@ -145,14 +146,14 @@ EXTERNAL SOURCES:
:path: "../" :path: "../"
GMFoundation: GMFoundation:
:path: "../../GMFoundation" :path: "../../GMFoundation"
GMShareSDK: GMPhobos:
:commit: 781efd64048ffb9c09099997c97aadb05668568b :commit: 7e58199898627699373ad6a9f87b875ab04b0927
:git: "git@git.wanmeizhensuo.com:gengmeiios/GMShareSDK.git" :git: "git@git.wanmeizhensuo.com:gengmeiios/GMPhobos.git"
CHECKOUT OPTIONS: CHECKOUT OPTIONS:
GMShareSDK: GMPhobos:
:commit: 781efd64048ffb9c09099997c97aadb05668568b :commit: 7e58199898627699373ad6a9f87b875ab04b0927
:git: "git@git.wanmeizhensuo.com:gengmeiios/GMShareSDK.git" :git: "git@git.wanmeizhensuo.com:gengmeiios/GMPhobos.git"
SPEC CHECKSUMS: SPEC CHECKSUMS:
AFNetworking: 5e0e199f73d8626b11e79750991f5d173d1f8b67 AFNetworking: 5e0e199f73d8626b11e79750991f5d173d1f8b67
...@@ -165,9 +166,9 @@ SPEC CHECKSUMS: ...@@ -165,9 +166,9 @@ SPEC CHECKSUMS:
GMJSONModel: 5e81a98de668e9f93cf6ff77869f77b0d1a806be GMJSONModel: 5e81a98de668e9f93cf6ff77869f77b0d1a806be
GMKit: ff2a77a9b85e13b4de333ec5eeb10b1ffef09756 GMKit: ff2a77a9b85e13b4de333ec5eeb10b1ffef09756
GMNetService: 7c69e7981b4fac29657fad5fc86a0c453196b862 GMNetService: 7c69e7981b4fac29657fad5fc86a0c453196b862
GMPhobos: 5748bbc39eb4242931ade197f7a2212ef13f2d28 GMPhobos: c09920b4a726363b902c2f14ba64e1ee1620d0e2
GMRefresh: c01ff8de5ada92e1362602fb6991f99124b7dbe3 GMRefresh: c01ff8de5ada92e1362602fb6991f99124b7dbe3
GMShareSDK: 1d8f739d51083ab5cee25bb978b5e9bfbb206d05 GMShareSDK: a0725e2848d043aec84e787f6d233ac1546c1661
MagicalRecord: 53bed74b4323b930992a725be713e53b37d19755 MagicalRecord: 53bed74b4323b930992a725be713e53b37d19755
Masonry: 678fab65091a9290e40e2832a55e7ab731aad201 Masonry: 678fab65091a9290e40e2832a55e7ab731aad201
MBProgressHUD: 1569cf7ace17a8bac47aabfbb8580a49690386d1 MBProgressHUD: 1569cf7ace17a8bac47aabfbb8580a49690386d1
...@@ -180,6 +181,6 @@ SPEC CHECKSUMS: ...@@ -180,6 +181,6 @@ SPEC CHECKSUMS:
WechatOpenSDK: 8b3ba4239193d1112205c139c94e21934e8f369a WechatOpenSDK: 8b3ba4239193d1112205c139c94e21934e8f369a
Weibo_SDK: 5a4d08f7e1fedbb635435e4585c8c0439c7da089 Weibo_SDK: 5a4d08f7e1fedbb635435e4585c8c0439c7da089
PODFILE CHECKSUM: b70d32325af03093c872ec87f2100f40b8b1e2d8 PODFILE CHECKSUM: 78c2e567604571069245adf06b4c06623adb32cc
COCOAPODS: 1.9.1 COCOAPODS: 1.9.1
...@@ -19,6 +19,9 @@ Pod::Spec.new do |s| ...@@ -19,6 +19,9 @@ Pod::Spec.new do |s|
s.dependency 'GMKit' s.dependency 'GMKit'
s.dependency 'SDWebImage' s.dependency 'SDWebImage'
s.dependency 'GMShareSDK' s.dependency 'GMShareSDK'
# s.dependency 'GMAlbum'
# SnapKit 4.2.0
# s.dependency 'SnapKit', '4.2.0'
s.swift_version = '4.2' s.swift_version = '4.2'
s.static_framework = true s.static_framework = true
......
...@@ -5,14 +5,17 @@ ...@@ -5,14 +5,17 @@
// Created by wangyang on 3/5/19. // Created by wangyang on 3/5/19.
// Copyright (c) 2019 Wanmei Creative. All rights reserved. // Copyright (c) 2019 Wanmei Creative. All rights reserved.
// 后期替代WMBaseViewController&WMBrowserViewController // 后期替代WMBaseViewController&WMBrowserViewController
@import GMShareSDK;
//#import <GMShareSDK/GMShareSDK.h> #import "WMBaseViewController.h"
#import "GMClientH5Object.h"
//@import GMShareSDK;
#import <GMShareSDK/GMShareSDK.h>
#define kWebPhantom @"phantom"// 常用于H5新页面 #define kWebPhantom @"phantom"// 常用于H5新页面
#define kWebHybrid @"hybrid" // 常用于H5老页面 #define kWebHybrid @"hybrid" // 常用于H5老页面
//#import <GMShareSDK/GMShareView.h> #import <GMShareSDK/GMShareView.h>
////#import "GMShareView.h" ////#import "GMShareView.h"
//#import <GMShareSDK/WMShareObject.h> #import <GMShareSDK/WMShareObject.h>
//#import <GMShareSDK/GMDiaryShareView.h> #import <GMShareSDK/GMDiaryShareView.h>
//#import <GMShareSDK/GMClientH5Object.h> //#import <GMShareSDK/GMClientH5Object.h>
#import "GMWebViewModel.h" #import "GMWebViewModel.h"
......
...@@ -5,24 +5,32 @@ ...@@ -5,24 +5,32 @@
// Created by wangyang on 3/5/15. // Created by wangyang on 3/5/15.
// Copyright (c) 2015 Wanmei Creative. All rights reserved. // Copyright (c) 2015 Wanmei Creative. All rights reserved.
// //
#import <MessageUI/MessageUI.h>
#import "GMBaseWebViewController.h" #import "GMBaseWebViewController.h"
//#import "AppDelegate+AppInit.h" //#import "AppDelegate+AppInit.h"
//#import "Gengmei-Swift.h" //#import "Gengmei-Swift.h"
#import "UIViewController+UrlScheme.h" #import "UIViewController+UrlScheme.h"
#import "WMBaseViewController+OCNavigationBar.h" #import "WMBaseViewController+OCNavigationBar.h"
#import <mach/mach_time.h> #import <mach/mach_time.h>
#import "GMCookieManager.h" //#import "GMBase-Swift.h"
#import "GMWebViewUrlProtocol.h" //#import "GMCookieManager.h"
#import "GMWeixinShareView.h" //#import "GMWebViewUrlProtocol.h"
#import "WMShareObject.h" //#import <GMShareSDK/GMWeixinShareView.h>
#import <GMShareSDK/WMShareObject.h>
@interface GMBaseWebViewController ()<MFMessageComposeViewControllerDelegate, GMCommonAlertViewDelegate,GMPhotoPickDismissDelegate,WKWebViewDelegate,GMShareViewDelegate, GMDiaryShareViewDelegate> //#import "GMBase-prefix.pch"
//#import "GMCommonAlertView.swift"
//#import "GMWebViewComponent.swift"
//TODO: 待解决
//GMPhotoPickDismissDelegate
//GMCommonAlertViewDelegate
//MFMessageComposeViewControllerDelegat
@interface GMBaseWebViewController ()<UIWebViewDelegate, GMShareViewDelegate, GMDiaryShareViewDelegate>
{ {
// 是否显示微信快照和朋友圈快照 // 是否显示微信快照和朋友圈快照
BOOL _isShowScreenshot; BOOL _isShowScreenshot;
GMAddressManager *_manager; //TODO: 待思考
// GMAddressManager *_manager;
// 是否需要回调权限打开状态 // 是否需要回调权限打开状态
BOOL _isSettingCallback; BOOL _isSettingCallback;
...@@ -45,7 +53,8 @@ ...@@ -45,7 +53,8 @@
} }
@property (nonatomic, assign) CGFloat animationDistance; @property (nonatomic, assign) CGFloat animationDistance;
@property (nonatomic, strong) GMPlayerView *playBackView; //TODO: 待思考
//@property (nonatomic, strong) GMPlayerView *playBackView;
@property (nonatomic, assign) BOOL goToAppSettingsPage;// 跳转到系统设置页面 @property (nonatomic, assign) BOOL goToAppSettingsPage;// 跳转到系统设置页面
@end @end
...@@ -57,13 +66,14 @@ ...@@ -57,13 +66,14 @@
[super initController]; [super initController];
self.viewModel = [GMWebViewModel new]; self.viewModel = [GMWebViewModel new];
self.goToAppSettingsPage = NO; // self.goToAppSettingsPage = NO;
self.webPageType = GMWebPageTypeNomal; self.webPageType = GMWebPageTypeNomal;
// 短信链接唤起app埋点 @author 李震(WMBrowserViewController) // 短信链接唤起app埋点 @author 李震(WMBrowserViewController)
if ([AppDelegate shareInstance].extraParam.isNonEmpty) { //TODO: 待处理
self.extraParam = [AppDelegate shareInstance].extraParam; // if ([AppDelegate shareInstance].extraParam.isNonEmpty) {
[AppDelegate shareInstance].extraParam = @""; // self.extraParam = [AppDelegate shareInstance].extraParam;
} // [AppDelegate shareInstance].extraParam = @"";
// }
} }
#pragma mark - view lifeCycle #pragma mark - view lifeCycle
...@@ -710,15 +720,16 @@ ...@@ -710,15 +720,16 @@
} }
if (_weixinShareObject != nil) { if (_weixinShareObject != nil) {
GMWeixinShareView * weiXinShareView = [GMWeixinShareView shareView]; //TODO: GMWeixinShareView 待考虑
weiXinShareView.weixinShareObject = _weixinShareObject; // GMWeixinShareView * weiXinShareView = [GMWeixinShareView shareView];
weiXinShareView.sourceController = self; // weiXinShareView.weixinShareObject = _weixinShareObject;
[self.view addSubview:weiXinShareView]; // weiXinShareView.sourceController = self;
[weiXinShareView mas_makeConstraints:^(MASConstraintMaker *make) { // [self.view addSubview:weiXinShareView];
make.edges.equalTo(self.view).insets(UIEdgeInsetsZero); // [weiXinShareView mas_makeConstraints:^(MASConstraintMaker *make) {
}]; // make.edges.equalTo(self.view).insets(UIEdgeInsetsZero);
[weiXinShareView layoutIfNeeded]; // }];
[weiXinShareView showShareView:nil]; // [weiXinShareView layoutIfNeeded];
// [weiXinShareView showShareView:nil];
} }
} }
...@@ -1015,7 +1026,8 @@ ...@@ -1015,7 +1026,8 @@
} }
if (info[@"cookie"] != nil && info[@"domain"] != nil) { if (info[@"cookie"] != nil && info[@"domain"] != nil) {
[GMCookieManager saveSessionId:info[@"cookie"] domain:info[@"domain"]]; //TODO:
// [GMCookieManager saveSessionId:info[@"cookie"] domain:info[@"domain"]];
} }
} }
...@@ -1218,45 +1230,46 @@ ...@@ -1218,45 +1230,46 @@
[self toast:@"复制成功"]; [self toast:@"复制成功"];
} }
//TODO: 代思考
#pragma mark - GMPhotoPickDismissDelegate #pragma mark - GMPhotoPickDismissDelegate
- (void)dismissPhotoPick:(NSArray<GMEditPhotoInfo *> *)infos{ //- (void)dismissPhotoPick:(NSArray<GMEditPhotoInfo *> *)infos{
if (infos.count == 0) { // if (infos.count == 0) {
return ; // return ;
} // }
GMEditPhotoInfo *model = infos.firstObject; // GMEditPhotoInfo *model = infos.firstObject;
UIImage *image = model.finshedImage; // UIImage *image = model.finshedImage;
NSString *remoteUrl = _isPrivatePhoto ? API_UPLOAD_IMAGE_SAFE : API_UPLOAD_IMAGE; // NSString *remoteUrl = _isPrivatePhoto ? API_UPLOAD_IMAGE_SAFE : API_UPLOAD_IMAGE;
WMImageUploadOperation *operation = [[WMImageUploadOperation alloc]initWithImage:image url:remoteUrl withCompressionQuality:0.75]; // WMImageUploadOperation *operation = [[WMImageUploadOperation alloc]initWithImage:image url:remoteUrl withCompressionQuality:0.75];
[operation setImageUploadFinishBlock:^(NSDictionary *JSON) { // [operation setImageUploadFinishBlock:^(NSDictionary *JSON) {
NSString *publicUrl = @""; // NSString *publicUrl = @"";
NSString *jsParam = @""; // NSString *jsParam = @"";
//
if (_isPrivatePhoto) { // if (_isPrivatePhoto) {
publicUrl = JSON[@"data"][@"public_url"]; // publicUrl = JSON[@"data"][@"public_url"];
NSString *privateUrl = JSON[@"data"][@"private_url"]; // NSString *privateUrl = JSON[@"data"][@"private_url"];
if ([publicUrl isNonEmpty] && [privateUrl isNonEmpty]) { // if ([publicUrl isNonEmpty] && [privateUrl isNonEmpty]) {
NSDictionary *data = @{_requestCoder : @{@"private_url": privateUrl, @"public_url" : publicUrl}}; // NSDictionary *data = @{_requestCoder : @{@"private_url": privateUrl, @"public_url" : publicUrl}};
NSData *jsParamData = [NSJSONSerialization dataWithJSONObject:data options:0 error:NULL]; // NSData *jsParamData = [NSJSONSerialization dataWithJSONObject:data options:0 error:NULL];
jsParam = [[NSString alloc] initWithData:jsParamData encoding:NSUTF8StringEncoding]; // jsParam = [[NSString alloc] initWithData:jsParamData encoding:NSUTF8StringEncoding];
} // }
} else { // } else {
publicUrl = JSON[@"data"][@"public_url"]; // publicUrl = JSON[@"data"][@"public_url"];
NSDictionary *data = @{_requestCoder : @{@"public_url" : publicUrl}}; // NSDictionary *data = @{_requestCoder : @{@"public_url" : publicUrl}};
NSData *jsParamData = [NSJSONSerialization dataWithJSONObject:data options:0 error:NULL]; // NSData *jsParamData = [NSJSONSerialization dataWithJSONObject:data options:0 error:NULL];
jsParam = [[NSString alloc] initWithData:jsParamData encoding:NSUTF8StringEncoding]; // jsParam = [[NSString alloc] initWithData:jsParamData encoding:NSUTF8StringEncoding];
} // }
//
NSString *jsString = [NSString stringWithFormat:@"gm.util.setPageData('%@')",jsParam]; // NSString *jsString = [NSString stringWithFormat:@"gm.util.setPageData('%@')",jsParam];
[self.webCompent.webView evaluateJavaScript:jsString completionHandler:nil]; // [self.webCompent.webView evaluateJavaScript:jsString completionHandler:nil];
}]; // }];
[operation startUpload]; // [operation startUpload];
} //}
//
//
// 签到页弹窗提示后,点击不再提醒会调用 //// 签到页弹窗提示后,点击不再提醒会调用
- (void)jsSignNeverNotify { //- (void)jsSignNeverNotify {
[self.navigationController popViewControllerAnimated:YES]; // [self.navigationController popViewControllerAnimated:YES];
} //}
- (int)jsIsUserLogin { - (int)jsIsUserLogin {
...@@ -1372,16 +1385,17 @@ ...@@ -1372,16 +1385,17 @@
} }
- (void)didClickCommonAlertWithButtonIndex:(NSInteger)buttonIndex alertView:(GMCommonAlertView *)alertView { //TODO: 待解决
[alertView dismiss]; //- (void)didClickCommonAlertWithButtonIndex:(NSInteger)buttonIndex alertView:(GMCommonAlertView *)alertView {
if (buttonIndex == 1) { // [alertView dismiss];
//打开 // if (buttonIndex == 1) {
[self goToAppSystemSettings]; // //打开
self.goToAppSettingsPage = YES; // [self goToAppSystemSettings];
} else if (buttonIndex == 2) { // self.goToAppSettingsPage = YES;
[self excuteSettingCallback:NO]; // } else if (buttonIndex == 2) {
} // [self excuteSettingCallback:NO];
} // }
//}
- (void)excuteSettingCallback:(BOOL)setting { - (void)excuteSettingCallback:(BOOL)setting {
......
//
// GMClientH5Object.h
// Gengmei
//
// Created by wangyang on 7/25/15.
// Copyright (c) 2015 Wanmeichuangyi. All rights reserved.
//
#import <Foundation/Foundation.h>
#import <JavaScriptCore/JavaScriptCore.h>
// 设置打开的权限类型
typedef NS_ENUM(NSInteger, GMSettingType) {
// 推送
GMSettingTypePush,
// 位置
GMSettingTypeLocation
};
/**
* @brief 在这里声明js对象所有绑定的方法(名字要和js注册的方法保持一致),命名规范以JS端为准
*/
@protocol GMClientH5Bridge <JSExport>
#pragma mark - 下面这些放到Base里
/*** @brief 返回到上级页面*/
- (void)jsPop:(BOOL)animated;
/*** @brief 返回域名, 这个不需要代理在controller实现*/
- (NSString *)domain;
/*** @brief 弹出loading框*/
- (void)showLoading;
/*** @brief 隐藏loading*/
- (void)hideLoading;
/*** @brief Alert弹窗(只有一个确认按钮)*/
- (void)showAlert:(NSString *)JSONString;
/*** @brief Confirm弹窗(确认和取消按钮*/
- (void)showConfirm:(NSString *)JSONString;
/*** @brief toast弹窗*/
- (void)showToast:(NSString *)JSONString;
/*** @brief 埋点功能 ,js掉native方法方式埋点 */
- (void)trackEvent:(NSString *)JSONString;
/*** @brief 精准曝光 */
- (void)hybridExposure:(NSString *)JSONString;
/*** @brief 回放 */
- (void)playVideo:(NSString *)JSONString;
/*** @brief 获取通讯录 */
- (void)getAddressBook;
/*** 选择一个联系人 */
- (void)chooseOneContactPerson:(NSString *)key;;
- (void)logout;
/*** @brief 打开外部浏览器*/
- (void)openBrowser:(NSString *)url;
/**
* @author wangyang, 16-03-11 15:03:43
*
* @brief 如果目前没有地理位置权限,h5调用该方法跳转到系统的定位功能
* @since 5.9.2
*/
- (void)jumpToLocationSettings;
/**
* @author wangyang, 16-03-11 15:03:43
*
* @brief 如果目前没有地理位置权限,h5调用该方法显示弹窗,要求获取权限
* @since 5.9.2
*/
- (void)locationShowAlertIfNotAllowed;
/*** @brief 显示分享美券页面
邀请好友, 所长发券页在使用。使用了globalObjectLoaded
*/
- (void)jsObjShowShareView:(NSString *)JSONString;
/*** @brief 分享日记
连续签到,补签
*/
- (void)jsObjShowDiaryShareView:(NSString *)JSONString;
/*** @brief 显示小分享(仅微信好友/微信朋友圈)页面
在老版本的支付完成页使用,先弹出一个本地的分享视图,再分享。从6.2.0开始已经不再使用
*/
- (void)showWXShareView:(NSString *)JSONString;
//抛出两个方法让服务器存储使用
- (void)setLocalStorage:(NSString *)key WithBody:(NSString *)value;
- (NSString *)getLocalStorage:(NSString *)key;
//秒杀页面是否展示定位
- (BOOL)isLocationEnable;
/**
* @author wangyang, 16-01-22 18:01:16
*
* @brief H5 主动调用本地分享方法,直接分享到某个平台。在订单详情页发红包弹出的webView里被调用
* @param data JSON
* @param type QZone/QQ/Wechat/WechatMoments/SinaWeibo
* @since 5.9.0
*/
- (void)share:(NSString *)shareDataString withType:(NSString *)type;
/**
* @author wangjun, 16-07-04 12:07:24
*
* 秒杀页面的添加到系统日历的事件的方法
* @param jsonString json字符串
* @since 6.1.0
*/
- (void)remindEvent: (NSString *)jsonString;
///保险回调
- (void)insurancePurchase:(BOOL)hasBought;
///打电话
- (void)callPhone:(NSString *)phone;
///发短信
- (void)sendMessage:(NSString *)phone withBody:(NSString *)body;
//日记本详情打开通知Alert
- (void)diaryDetailShowNotificationAlert;
/**
用来动画导航栏的。参考日记帖详情页PostDetailViewController
@param height 可动画的高度
*/
- (void)setHeaderHeight:(NSInteger)height;
// 从h5登录,保存session及用户信息
- (void)syncSSOInfo:(NSString *)info;
//场景化弹窗
- (void)showTaskAlert:(NSString *)extra;
// 新用户领券是否成功
- (void)newbieCouponGot:(NSInteger)flag;
/**
邀请好友粘贴口令
@param boardText 口令值
*/
- (void)clipboard:(NSString *)boardText;
/**
回复框弹窗
@param jsonString 弹窗内容和回调方法
*/
- (void)showActionSheet:(NSString *)jsonString;
/**
右上角关注按钮
@param json icon_url:关注/未关注图片
*/
- (void)rightbuttonCallBack:(NSString *)json;
/**
机构主页
@param jsonString pageData
*/
- (void)globalDataLoaded:(NSString *)jsonString;
/**
是否登录:1登录 0未登录
*/
- (int)isUserLogin;
/**
获取用户信息
*/
- (NSString *)inflateUserInfo;
/**
机构详情:yes:导航栏显示,no:导航栏隐藏
*/
- (void)controlTitleBarVisible:(NSString *)jsonString;
/**
回复详情:底栏数据
*/
- (void)answerData:(NSString *)jsonString;
/**
问题详情:底栏数据
*/
- (void)questionData:(NSString *)jsonString;
/**
导航栏高度
*/
- (int)navigationbarHeight;
/**
签到提醒开关
*/
- (void)checkAuthority:(NSString *)jsonString;
/**
网络状态 2: 其他 1:wifi 0:无网络
*/
- (NSInteger)checkNetworkState;
- (NSString *)nativeDataLoaded;
/**
签到页弹窗点击不再提醒
*/
- (void)signNeverNotify;
/**
展示空的页面
*/
-(void)showNativeEmptyView;
/**
调起第三方APP
*/
- (void)skipToThirdApp:(NSString *)jsonString;
/**
面孔起源结果页跳转列表页
*/
- (void)jumpToResearchPage:(NSString *)url;
/**
面诊记录报告页面保存图片
*/
- (void)saveImage:(NSString *)url;
/**
调起评论列表
*/
- (void)showCommentList:(NSString *)JSONString;
@end
/*** @brief 在这里声明 js 要调用的方法*/
@protocol GMClientH5BridgeDelegate <NSObject>
@optional
/*** @brief 显示分享美券页面*/
- (void)jsObjShowShareViewWithJSONString:(NSString *)JSONString;
/*** @brief 连续签到,补签分享日记*/
- (void)jsObjShowDiaryShareViewWithJSONString:(NSString *)JSONString;
/*** @brief 显示小分享(仅微信好友/微信朋友圈)页面*/
- (void)jsShowWXShareViewWithJSONString:(NSString *)JSONString;
/*** @brief 返回到上级页面*/
- (void)jsPopViewControllerAnimated:(BOOL)animated;
/*** @brief 弹出loading框*/
- (void)jsShowLoading;
- (void)jsShowNativeEmptyView;
/*** @brief 隐藏loading*/
- (void)jsHideLoading;
/*** @brief Alert弹窗(只有一个确认按钮)*/
- (void)jsShowAlertViewWithJSONString:(NSString *)JSONString;
/*** @brief Confirm弹窗(确认和取消按钮*/
- (void)jsShowConfirmViewWithJSONString:(NSString *)JSONString;
/*** @brief toast弹窗*/
- (void)jsShowToastWithJSONString:(NSString *)JSONString;
/*** @brief 供h5吊起选图上传的方法 */
- (void)jsOpenAlbum:(NSString *)requestCode is_private:(BOOL)isPrivate;
/*** @brief 获取通讯录 */
- (void)jsGetAddressBook;
- (void)jsChooseOneContactPerson:(NSString *)key;
/**
* @author wangyang, 15-10-08 15:10:56
*
* @brief 见 applyForStage 方法
* @since 5.2.0
*/
- (void)jsApplyForStage:(NSString *)url;
/*** @brief 埋点功能 ,js掉native方法方式埋点 */
- (void)jsTrackEvent:(NSString *)JSONString;
/*** @brief 精准曝光 */
- (void)jsHybridExposure:(NSString *)JSONString;
/*** @brief 回放 */
- (void)jsPlayVideo:(NSString *)JSONString;
/**
* @author wangyang, 16-12-31 16:12:05
*
* @brief h5 调用注销方法
* @since 5.8.0
*/
- (void)jsLogout;
/**
* @author wangyang, 16-01-22 18:01:03
*
* @brief 见 share:withType:
* @since 5.9.0
*/
- (void)jsShare:(NSString *)shareDataString withType:(NSString *)type;
//以便H5存储使用
- (void)jsSetLocalStorage:(NSString *)key withStorage:(NSString *)value;
- (NSString *)jsGetLocalStorage:(NSString *)key;
/*** @brief 打开外部浏览器*/
- (void)jsOpenBrowser:(NSString *)url;
/**
* @author wangyang, 16-03-11 15:03:43
*
* @brief 如果目前没有地理位置权限,h5调用该方法跳转到系统的定位功能
* @since 5.9.2
*/
- (void)jsJumpToLocationSettings;
//秒杀页面是否需要展示打开定位
- (BOOL)jsIsLocationEnable;
/**
* @author wangyang, 16-03-11 15:03:43
*
* @brief 如果目前没有地理位置权限,h5调用该方法显示弹窗,要求获取权限
* @since 5.9.2
*/
- (void)jsLocationShowAlertIfNotAllowed;
/**
* @author wangjun, 16-03-17 16:03:12
*
* @brief 赚美分页面的动画效果
*
* @param dict H5调用所传的参数字典
*
* @since 5.9.2
*/
- (void)jsShowBong:(NSString *)jsonString;
/**
* @author wangjun, 16-07-04 12:07:08
*
* 秒杀页面的添加到系统日历的事件的方法
* @param jsonString H5穿来的json字符串
* @since 6.1.0
*/
- (void)jsRemindEvent:(NSString *)jsonString;
/**
* 保险状态返回
* @paramhas_bought: true(确定购买) / false(取消购买)
* @since 6.6.0
*/
- (void)jsInsurancePurchase:(NSDictionary *)dict;
///打电话
- (void)jsCallPhone:(NSString *)phone;
///发短信
- (void)jsSendMessage:(NSString *)phone withBody:(NSString *)body;
- (void)jsSetHeaderHeight:(NSInteger)height;
// 打开通知方法
- (void)jsDiaryDetailShowNotificationAlert;
// 前端登录信息同步到客户端
- (void)jsSyncSSOInfo:(NSString *)info;
//场景化弹窗由JS调用
- (void)jsShowTaskAlert:(NSString *)extra;
// 新用户领券是否成功
- (void)jsNewbieCouponGot:(NSInteger)flag;
/**
邀请好友粘贴口令
@param boardText 口令值
*/
- (void)jsClipboard:(NSString *)boardText;
/**
回复弹窗
@param jsonString 弹窗名称和回调方法
*/
- (void)jsShowActionSheet:(NSString *)jsonString;
/**
右上角关注按钮
@param json icon_url:关注/未关注图片
*/
- (void)jsRightbuttonCallBack:(NSString *)json;
/**
机构主页
@param jsonString pageData
*/
- (void)jsGlobalDataLoaded:(NSString *)jsonString;
/**
是否登录
*/
- (int)jsIsUserLogin;
/**
获取用户信息
*/
- (NSString *)jsInflateUserInfo;
- (NSString *)jsNativeDataLoaded;
/**
机构详情:yes:导航栏显示,no:导航栏隐藏
*/
- (void)jsControlTitleBarVisible:(NSString *)jsonString;
/**
回复详情:底栏数据
*/
- (void)jsAnswerData:(NSString *)jsonString;
/**
问题详情:底栏数据
*/
- (void)jsQuestionData:(NSString *)jsonString;
/**
导航栏高度
*/
- (int)jsNavigationbarHeight;
/**
签到提醒开关
*/
- (void)jsCheckAuthority:(NSString *)jsonString;
/**
网络状态 2: 其他 1:wifi 0:无网络
*/
- (NSInteger)jsCheckNetworkState;
/**
签到页弹窗点击不再提醒
*/
- (void)jsSignNeverNotify;
/**
调起第三方APP
*/
- (void)jsSkipToThirdApp:(NSString *)jsonString;
/// js 直接掉起指定平台分享
/// @param jsonString 分享数据
- (void)jsSharewithType:(NSDictionary *)data;
/// 更新页面上导航数据
/// @param JSONString @param JSONString {"title":"","business_id":""}
- (void)jsScrollSetHeader:(NSDictionary *)data;
/// 弹出l评论列表+评论输入
/// @param data @param JSONString {"title":"","business_id":""}
- (void)jsShowCommentList:(NSDictionary *)data;
/// 弹出回答输入框
/// @param data @param JSONString
- (void)jsShowAnswerInput:(NSDictionary *)data;
/**
面孔起源结果页跳转列表页
*/
- (void)jsJumpToResearchPage:(NSString *)url;
/**
面诊记录报告页面保存图片
*/
- (void)jsSaveImage:(NSString *)url;
/// 查看今日运势( isSaveSocial: 是否保存到社区)
/// @param data @param JSONString {"isSaveSocial":"1"}
- (void)jsShowToDayLuck:(NSDictionary *)data;
@end
@interface GMClientH5Object : NSObject <GMClientH5Bridge>
@property (nonatomic, weak) id<GMClientH5BridgeDelegate> delegate;
@end
//
// GMClientH5Object.m
// Gengmei
//
// Created by wangyang on 7/25/15.
// Copyright (c) 2015 Wanmeichuangyi. All rights reserved.
//
#import "GMClientH5Object.h"
#import <GMFoundation/GMFoundation-umbrella.h>
//#import "GMLaunchManager.h"
#import "GMBaseWebViewController.h"
/**
* @author licong, 15-12-25 15:12:44
*
* JSCore引擎调用OC做UI渲染操作,必须保证是在主线程执行,所以都加了 dispatch_async 以保证主线程工作
*
*/
@implementation GMClientH5Object
- (void)jsObjShowShareView:(NSString *)JSONstring{
if ([self.delegate respondsToSelector:@selector(jsObjShowShareViewWithJSONString:)]) {
dispatch_async(dispatch_get_main_queue(), ^{
[self.delegate jsObjShowShareViewWithJSONString:JSONstring];
});
}
}
- (void)jsObjShowDiaryShareView:(NSString *)JSONString {
if ([self.delegate respondsToSelector:@selector(jsObjShowDiaryShareViewWithJSONString:)]) {
dispatch_async(dispatch_get_main_queue(), ^{
[self.delegate jsObjShowDiaryShareViewWithJSONString:JSONString];
});
}
}
- (void)showWXShareView:(NSString *)JSONstring{
if ([self.delegate respondsToSelector:@selector(jsShowWXShareViewWithJSONString:)]) {
dispatch_async(dispatch_get_main_queue(), ^{
[self.delegate jsShowWXShareViewWithJSONString:JSONstring];
});
}
}
- (void)jsPop:(BOOL)animated{
if ([self.delegate respondsToSelector:@selector(jsPopViewControllerAnimated:)]) {
dispatch_async(dispatch_get_main_queue(), ^{
[self.delegate jsPopViewControllerAnimated:animated];
});
}
}
//TODO: 待修改
- (NSString *)domain{
return @"";
// return APIHOST;
}
- (void)showLoading{
if ([self.delegate respondsToSelector:@selector(jsShowLoading)]) {
dispatch_async(dispatch_get_main_queue(), ^{
[self.delegate jsShowLoading];
});
}
}
- (void)hideLoading{
if ([self.delegate respondsToSelector:@selector(jsHideLoading)]) {
dispatch_async(dispatch_get_main_queue(), ^{
[self.delegate jsHideLoading];
});
}
}
- (void)showAlert:(NSString *)JSONString{
if ([self.delegate respondsToSelector:@selector(jsShowAlertViewWithJSONString:)]) {
dispatch_async(dispatch_get_main_queue(), ^{
[self.delegate jsShowAlertViewWithJSONString:JSONString];
});
}
}
- (void)showConfirm:(NSString *)JSONString{
if ([self.delegate respondsToSelector:@selector(jsShowConfirmViewWithJSONString:)]) {
dispatch_async(dispatch_get_main_queue(), ^{
[self.delegate jsShowConfirmViewWithJSONString:JSONString];
});
}
}
- (void)showToast:(NSString *)JSONString{
if ([self.delegate respondsToSelector:@selector(jsShowToastWithJSONString:)]) {
dispatch_async(dispatch_get_main_queue(), ^{
[self.delegate jsShowToastWithJSONString:JSONString];
});
}
}
- (void)trackEvent:(NSString *)JSONString {
dispatch_async(dispatch_get_main_queue(), ^{
if ([self.delegate respondsToSelector:@selector(jsTrackEvent:)]) {
[self.delegate jsTrackEvent:JSONString];
}
});
}
- (void)playVideo:(NSString *)JSONString {
if ([self.delegate respondsToSelector:@selector(jsPlayVideo:)]) {
[self.delegate jsPlayVideo:JSONString];
}
}
- (void)getAddressBook {
if ([self.delegate respondsToSelector:@selector(jsGetAddressBook)]) {
[self.delegate jsGetAddressBook];
}
}
- (BOOL)isLocationEnable {
if ([self.delegate respondsToSelector:@selector(jsIsLocationEnable)]) {
return [self.delegate jsIsLocationEnable];
} else {
return NO;
}
}
- (void)chooseOneContactPerson:(NSString *)key {
if ([self.delegate respondsToSelector:@selector(jsChooseOneContactPerson:)]) {
[self.delegate jsChooseOneContactPerson:key];
}
}
- (void)logout {
if ([self.delegate respondsToSelector:@selector(jsLogout)]) {
dispatch_async(dispatch_get_main_queue(), ^{
[self.delegate jsLogout];
});
}
}
- (void)share:(NSString *)shareDataString withType:(NSString *)type{
if ([self.delegate respondsToSelector:@selector(jsShare:withType:)]) {
dispatch_async(dispatch_get_main_queue(), ^{
[self.delegate jsShare:shareDataString withType:type];
});
}
}
- (void)openBrowser:(NSString *)url{
if ([self.delegate respondsToSelector:@selector(jsOpenBrowser:)]) {
dispatch_async(dispatch_get_main_queue(), ^{
[self.delegate jsOpenBrowser:url];
});
}
}
- (void)jumpToLocationSettings {
if ([self.delegate respondsToSelector:@selector(jsJumpToLocationSettings)]) {
dispatch_async(dispatch_get_main_queue(), ^{
[self.delegate jsJumpToLocationSettings];
});
}
}
- (void)locationShowAlertIfNotAllowed {
if ([self.delegate respondsToSelector:@selector(jsLocationShowAlertIfNotAllowed)]) {
dispatch_async(dispatch_get_main_queue(), ^{
[self.delegate jsLocationShowAlertIfNotAllowed];
});
}
}
- (void)diaryDetailShowNotificationAlert {
if ([self.delegate respondsToSelector:@selector(jsDiaryDetailShowNotificationAlert)]) {
dispatch_async(dispatch_get_main_queue(), ^{
[self.delegate jsDiaryDetailShowNotificationAlert];
});
}
}
- (void)remindEvent:(NSString *)jsonString {
if ([self.delegate respondsToSelector:@selector(jsRemindEvent:)]) {
dispatch_async(dispatch_get_main_queue(), ^{
[self.delegate jsRemindEvent:jsonString];
});
}
}
- (void)insurancePurchase:(BOOL)hasBought {
if ([self.delegate respondsToSelector:@selector(jsInsurancePurchase:)]) {
NSDictionary *dict = @{@"has_bought": @(hasBought)};
[self.delegate jsInsurancePurchase:dict];
}
}
- (void)callPhone:(NSString *)phone {
if ([self.delegate respondsToSelector:@selector(jsCallPhone:)]) {
[self.delegate jsCallPhone:phone];
}
}
- (void)sendMessage:(NSString *)phone withBody:(NSString *)body {
if ([self.delegate respondsToSelector: @selector(jsSendMessage:withBody:)]) {
dispatch_async(dispatch_get_main_queue(), ^{
[self.delegate jsSendMessage:phone withBody:body];
});
}
}
- (void)setHeaderHeight:(NSInteger)height {
if ([self.delegate respondsToSelector: @selector(jsSetHeaderHeight:)]) {
dispatch_async(dispatch_get_main_queue(), ^{
[self.delegate jsSetHeaderHeight:height];
});
}
}
- (void)setLocalStorage:(NSString *)key WithBody:(NSString *)value {
if ([self.delegate respondsToSelector: @selector(jsSetLocalStorage:withStorage:)]) {
[self.delegate jsSetLocalStorage:key withStorage:value];
}
}
- (NSString *)getLocalStorage:(NSString *)key {
if ([self.delegate respondsToSelector: @selector(jsGetLocalStorage:)]) {
return [self.delegate jsGetLocalStorage:key];
} else {
return @"";
}
}
- (void)syncSSOInfo:(NSString *)info {
if ([self.delegate respondsToSelector:@selector(jsSyncSSOInfo:)]) {
dispatch_async(dispatch_get_main_queue(), ^{
[self.delegate jsSyncSSOInfo:info];
});
}
}
//场景化弹窗
- (void)showTaskAlert:(NSString *)extra {
if ([self.delegate respondsToSelector:@selector(jsShowTaskAlert:)]) {
dispatch_async(dispatch_get_main_queue(), ^{
[self.delegate jsShowTaskAlert:extra];
});
}
}
- (void)newbieCouponGot:(NSInteger)flag {
if ([self.delegate respondsToSelector:@selector(jsNewbieCouponGot:)]) {
dispatch_async(dispatch_get_main_queue(), ^{
[self.delegate jsNewbieCouponGot:flag];
});
}
}
- (void)clipboard:(NSString *)boardText {
if ([self.delegate respondsToSelector:@selector(jsClipboard:)]) {
dispatch_async(dispatch_get_main_queue(), ^{
[self.delegate jsClipboard:boardText];
});
}
}
- (void)showActionSheet:(NSString *)jsonString {
if ([self.delegate respondsToSelector:@selector(jsShowActionSheet:)]) {
dispatch_async(dispatch_get_main_queue(), ^{
[self.delegate jsShowActionSheet:jsonString];
});
}
}
- (void)showNativeEmptyView {
if ([self.delegate respondsToSelector:@selector(jsShowNativeEmptyView)]) {
dispatch_async(dispatch_get_main_queue(), ^{
[self.delegate jsShowNativeEmptyView];
});
}
}
- (void)rightbuttonCallBack:(NSString *)json {
if ([self.delegate respondsToSelector:@selector(jsRightbuttonCallBack:)]) {
dispatch_async(dispatch_get_main_queue(), ^{
[self.delegate jsRightbuttonCallBack:json];
});
}
}
- (void)globalDataLoaded:(NSString *)jsonString {
if ([self.delegate respondsToSelector:@selector(jsGlobalDataLoaded:)]) {
dispatch_async(dispatch_get_main_queue(), ^{
[self.delegate jsGlobalDataLoaded:jsonString];
});
}
}
- (int)isUserLogin {
if ([self.delegate respondsToSelector: @selector(jsIsUserLogin)]) {
return [self.delegate jsIsUserLogin];
} else {
return 0;
}
}
- (NSString *)inflateUserInfo {
if ([self.delegate respondsToSelector: @selector(jsInflateUserInfo)]) {
return [self.delegate jsInflateUserInfo];
} else {
return @"";
}
}
- (void)controlTitleBarVisible:(NSString *)jsonString {
if ([self.delegate respondsToSelector:@selector(jsControlTitleBarVisible:)]) {
dispatch_async(dispatch_get_main_queue(), ^{
[self.delegate jsControlTitleBarVisible:jsonString];
});
}
}
- (void)answerData:(NSString *)jsonString {
if ([self.delegate respondsToSelector:@selector(jsAnswerData:)]) {
dispatch_async(dispatch_get_main_queue(), ^{
[self.delegate jsAnswerData:jsonString];
});
}
}
- (void)questionData:(NSString *)jsonString {
if ([self.delegate respondsToSelector:@selector(jsQuestionData:)]) {
dispatch_async(dispatch_get_main_queue(), ^{
[self.delegate jsQuestionData:jsonString];
});
}
}
- (int)navigationbarHeight {
if ([self.delegate respondsToSelector:@selector(jsNavigationbarHeight)]) {
return [self.delegate jsNavigationbarHeight];
} else {
return 0;
}
}
- (void)checkAuthority:(NSString *)jsonString {
if ([self.delegate respondsToSelector:@selector(jsCheckAuthority:)]) {
dispatch_async(dispatch_get_main_queue(), ^{
[self.delegate jsCheckAuthority:jsonString];
});
}
}
/**
网络状态 2: 其他 1:wifi 0:无网络
*/
- (NSInteger)checkNetworkState {
if ([self.delegate respondsToSelector:@selector(jsCheckNetworkState)]) {
return [self.delegate jsCheckNetworkState];
} else {
return 0;
}
}
//#warning TODO
- (NSString *)nativeDataLoaded {
if ([self.delegate isKindOfClass:[GMBaseWebViewController class]]) {
//如果是GMBaseWebViewController 会与v7.23.0因此这样写 webCompent.webView evaluateJavaScript
NSString *str;
if ([self.delegate respondsToSelector:@selector(jsNativeDataLoaded)]) {
str = [self.delegate jsNativeDataLoaded];
} else {
str = @"";
}
return str;
} else {
__block NSString *str;
dispatch_semaphore_t sem = dispatch_semaphore_create(1);
dispatch_async(dispatch_get_main_queue(), ^{
if ([self.delegate respondsToSelector:@selector(jsNativeDataLoaded)]) {
str = [self.delegate jsNativeDataLoaded];
} else {
str = @"";
}
dispatch_semaphore_signal(sem);
});
dispatch_semaphore_wait(sem, DISPATCH_TIME_FOREVER);
return str;
}
}
- (void)signNeverNotify {
if ([self.delegate respondsToSelector:@selector(jsSignNeverNotify)]) {
return [self.delegate jsSignNeverNotify];
}
}
- (void)skipToThirdApp:(NSString *)jsonString {
if ([self.delegate respondsToSelector:@selector(jsSkipToThirdApp:)]) {
[self.delegate jsSkipToThirdApp:jsonString];
}
}
/// 调起指定分享平台
/// @param JSONString {"share_data":{},"type":"Wechat"}
- (void)sharewithType:(NSString *)JSONString {
if ([self.delegate respondsToSelector:@selector(jsSharewithType:)]) {
dispatch_async(dispatch_get_main_queue(), ^{
[self.delegate jsSharewithType:[NSDictionary dictionaryWithJsonString:JSONString]];
});
}
}
/// 更新页面上导航数据
/// @param JSONString @param JSONString {"title":"","business_id":""}
- (void)scrollSetHeader:(NSString *)JSONString {
if ([self.delegate respondsToSelector:@selector(jsScrollSetHeader:)]) {
dispatch_async(dispatch_get_main_queue(), ^{
[self.delegate jsScrollSetHeader:[NSDictionary dictionaryWithJsonString:JSONString]];
});
}
}
/// 弹出评论列表+评论回复页面
/// @param JSONString JSONString
- (void)showCommentList:(NSString *)JSONString {
if ([self.delegate respondsToSelector:@selector(jsShowCommentList:)]) {
dispatch_async(dispatch_get_main_queue(), ^{
[self.delegate jsShowCommentList:[NSDictionary dictionaryWithJsonString:JSONString]];
});
}
}
/// 弹出回答输入框
/// @param data @param JSONString
- (void)showAnswerInput:(NSString *)JSONString {
if ([self.delegate respondsToSelector:@selector(jsShowAnswerInput:)]) {
dispatch_async(dispatch_get_main_queue(), ^{
[self.delegate jsShowAnswerInput:[NSDictionary dictionaryWithJsonString:JSONString]];
});
}
}
/// 跳转下一个启动项页面
//TODO: - 待修改
- (void)jumpNextLaunchPage {
dispatch_async(dispatch_get_main_queue(), ^{
// [[GMLaunchManager shareManager] jumpToNextLaunchPage];
});
}
- (void)jumpToResearchPage:(NSString *)url {
if ([self.delegate respondsToSelector:@selector(jsJumpToResearchPage:)]) {
[self.delegate jsJumpToResearchPage:url];
}
}
- (void)hybridExposure:(NSString *)JSONString {
if ([self.delegate respondsToSelector:@selector(jsHybridExposure:)]) {
dispatch_async(dispatch_get_main_queue(), ^{
[self.delegate jsHybridExposure:JSONString];
});
}
}
- (void)saveImage:(NSString *)JSONString {
if ([self.delegate respondsToSelector:@selector(jsSaveImage:)]) {
dispatch_async(dispatch_get_main_queue(), ^{
[self.delegate jsSaveImage:JSONString];
});
}
}
/// 查看今日运势( isSaveSocial: 是否保存到社区)
/// @param data @param JSONString {"isSaveSocial":"1"}
- (void)showToDayLuck:(NSString *)JSONString {
if ([self.delegate respondsToSelector:@selector(jsShowToDayLuck:)]) {
dispatch_async(dispatch_get_main_queue(), ^{
[self.delegate jsShowToDayLuck:[NSDictionary dictionaryWithJsonString:JSONString]];
});
}
}
@end
...@@ -9,11 +9,13 @@ ...@@ -9,11 +9,13 @@
import UIKit import UIKit
import GMKit import GMKit
//TODO: 待考虑 SNAPKIT
@objc protocol GMCommonAlertViewDelegate: class { @objc protocol GMCommonAlertViewDelegate: class {
func didClickCommonAlert(buttonIndex: Int, alertView: GMCommonAlertView) func didClickCommonAlert(buttonIndex: Int, alertView: GMCommonAlertView)
} }
@objcMembers
class GMCommonAlertView: GMView { class GMCommonAlertView: GMView {
let alertView = GMView() let alertView = GMView()
...@@ -35,70 +37,70 @@ class GMCommonAlertView: GMView { ...@@ -35,70 +37,70 @@ class GMCommonAlertView: GMView {
alertView.backgroundColor = UIColor.white alertView.backgroundColor = UIColor.white
alertView.layer.cornerRadius = 10 alertView.layer.cornerRadius = 10
alertView.layer.masksToBounds = true alertView.layer.masksToBounds = true
alertView.snp.makeConstraints { (make) in // alertView.snp.makeConstraints { (make) in
make.centerY.equalToSuperview() // make.centerY.equalToSuperview()
make.centerX.equalToSuperview() // make.centerX.equalToSuperview()
make.size.equalTo(CGSize(width: 270, height: 280)) // make.size.equalTo(CGSize(width: 270, height: 280))
} // }
let headerImage = GMImageView(image: UIImage(named: "notify_bell")) let headerImage = GMImageView(image: UIImage(named: "notify_bell"))
addSubview(headerImage) addSubview(headerImage)
headerImage.snp.makeConstraints { (make) in // headerImage.snp.makeConstraints { (make) in
make.centerX.equalToSuperview() // make.centerX.equalToSuperview()
make.top.equalTo(alertView.snp.top).offset(-38) // make.top.equalTo(alertView.snp.top).offset(-38)
} // }
titleLabel.text = "打开推送通知" titleLabel.text = "打开推送通知"
alertView.addSubview(titleLabel) alertView.addSubview(titleLabel)
titleLabel.snp.makeConstraints { (make) in // titleLabel.snp.makeConstraints { (make) in
make.centerX.equalToSuperview() // make.centerX.equalToSuperview()
make.top.equalTo(70) // make.top.equalTo(70)
} // }
subLabel.text = "第一时间接受TA的日记更新?" subLabel.text = "第一时间接受TA的日记更新?"
alertView.addSubview(subLabel) alertView.addSubview(subLabel)
subLabel.snp.makeConstraints { (make) in // subLabel.snp.makeConstraints { (make) in
make.centerX.equalToSuperview() // make.centerX.equalToSuperview()
make.top.equalTo(titleLabel.snp.bottom).offset(5) // make.top.equalTo(titleLabel.snp.bottom).offset(5)
} // }
button1.setTitleColor(UIColor.white, for: UIControlState.normal) button1.setTitleColor(UIColor.white, for: UIControl.State.normal)
button1.setTitle("确定打开", for: UIControlState.normal) button1.setTitle("确定打开", for: UIControl.State.normal)
button1.gradualColor = [UIColor(hex: 0x51D3E7), UIColor(hex: 0x3BE7DA)] button1.gradualColor = [UIColor(hex: 0x51D3E7), UIColor(hex: 0x3BE7DA)]
button1.layer.cornerRadius = 20 button1.layer.cornerRadius = 20
button1.layer.masksToBounds = true button1.layer.masksToBounds = true
button1.titleLabel?.font = UIFont.gmFont(16) button1.titleLabel?.font = UIFont.gmFont(16)
button1.tag = 1001 button1.tag = 1001
button1.addTarget(self, action: #selector(GMCommonAlertView.buttonTapAction(_:)), for: UIControlEvents.touchUpInside) button1.addTarget(self, action: #selector(GMCommonAlertView.buttonTapAction(_:)), for: UIControl.Event.touchUpInside)
alertView.addSubview(button1) alertView.addSubview(button1)
button1.snp.makeConstraints { (make) in // button1.snp.makeConstraints { (make) in
make.centerX.equalToSuperview() // make.centerX.equalToSuperview()
make.top.equalTo(subLabel.snp.bottom).offset(15) // make.top.equalTo(subLabel.snp.bottom).offset(15)
make.size.equalTo(CGSize(width: 200, height: 40)) // make.size.equalTo(CGSize(width: 200, height: 40))
} // }
// button1.setGradualChangeColor(colors: [UIColor(hex: 0x23E3E1), UIColor(hex: 0x2CD7E6)]) // button1.setGradualChangeColor(colors: [UIColor(hex: 0x23E3E1), UIColor(hex: 0x2CD7E6)])
button2 = addButtonWith("不用打开", backgroundColor: UIColor.clear, titleColor: UIColor.mainVisual, borderColor: UIColor.mainVisual) button2 = addButtonWith("不用打开", backgroundColor: UIColor.clear, titleColor: UIColor.mainVisual, borderColor: UIColor.mainVisual)
button2.addTarget(self, action: #selector(GMCommonAlertView.buttonTapAction(_:)), for: UIControlEvents.touchUpInside) button2.addTarget(self, action: #selector(GMCommonAlertView.buttonTapAction(_:)), for: UIControl.Event.touchUpInside)
button2.tag = 1002 button2.tag = 1002
button2.titleLabel?.font = UIFont.gmFont(16) button2.titleLabel?.font = UIFont.gmFont(16)
alertView.addSubview(button2) alertView.addSubview(button2)
button2.snp.makeConstraints { (make) in // button2.snp.makeConstraints { (make) in
make.centerX.equalToSuperview() // make.centerX.equalToSuperview()
make.top.equalTo(button1.snp.bottom).offset(15) // make.top.equalTo(button1.snp.bottom).offset(15)
make.size.equalTo(CGSize(width: 200, height: 40)) // make.size.equalTo(CGSize(width: 200, height: 40))
} // }
button3 = addButtonWith("不再提醒", backgroundColor: UIColor.clear, titleColor: UIColor.auxiliaryTextLight, borderColor: UIColor.clear) button3 = addButtonWith("不再提醒", backgroundColor: UIColor.clear, titleColor: UIColor.auxiliaryTextLight, borderColor: UIColor.clear)
button3.addTarget(self, action: #selector(GMCommonAlertView.buttonTapAction(_:)), for: UIControlEvents.touchUpInside) button3.addTarget(self, action: #selector(GMCommonAlertView.buttonTapAction(_:)), for: UIControl.Event.touchUpInside)
button3.tag = 1003 button3.tag = 1003
alertView.addSubview(button3) alertView.addSubview(button3)
button3.titleLabel?.font = UIFont.gmFont(14) button3.titleLabel?.font = UIFont.gmFont(14)
button3.snp.makeConstraints { (make) in // button3.snp.makeConstraints { (make) in
make.centerX.equalToSuperview() // make.centerX.equalToSuperview()
make.top.equalTo(button2.snp.bottom).offset(10) // make.top.equalTo(button2.snp.bottom).offset(10)
make.size.equalTo(CGSize(width: 200, height: 30)) // make.size.equalTo(CGSize(width: 200, height: 30))
} // }
} }
// MARK: - 添加button // MARK: - 添加button
...@@ -111,16 +113,16 @@ class GMCommonAlertView: GMView { ...@@ -111,16 +113,16 @@ class GMCommonAlertView: GMView {
return button return button
} }
func buttonTapAction(_ sender: GMButton) { @objc func buttonTapAction(_ sender: GMButton) {
let index = sender.tag - 1000 let index = sender.tag - 1000
delegate?.didClickCommonAlert(buttonIndex: index, alertView: self) delegate?.didClickCommonAlert(buttonIndex: index, alertView: self)
} }
@objc func show() { @objc func show() {
UIApplication.shared.keyWindow?.addSubview(self) UIApplication.shared.keyWindow?.addSubview(self)
self.snp.makeConstraints { (make) in // self.snp.makeConstraints { (make) in
make.edges.equalTo(UIEdgeInsets.zero) // make.edges.equalTo(UIEdgeInsets.zero)
} // }
} }
@objc func dismiss() { @objc func dismiss() {
......
//
// GMGradualButton.swift
// Gengmei
//
// Created by Terminator on 2017/7/12.
// Copyright © 2017年 更美互动信息科技有限公司. All rights reserved.
//
import UIKit
@objcMembers
open class GMGradualButton: GMButton {
// 如果gradualColor 和 disableColor同时有值,他们的count要是一样的
var gradualColor = [UIColor]()
var disableColor = [UIColor]()
var intriSize = CGSize.zero
override open var intrinsicContentSize: CGSize {
intriSize = super.intrinsicContentSize
if gradualColor.count > 0 {
setBackgroundImage(setGradualChangeColor(colors: gradualColor), for: .normal)
}
if disableColor.count > 0 {
setBackgroundImage(setGradualChangeColor(colors: disableColor), for: .disabled)
}
return intriSize
}
private func setGradualChangeColor(colors: [UIColor]) -> UIImage? {
let cfColors = colors.map { $0.cgColor }
UIGraphicsBeginImageContextWithOptions(super.intrinsicContentSize, true, 0)
let context = UIGraphicsGetCurrentContext()
let colorSpace = CGColorSpaceCreateDeviceRGB()
let gradient = CGGradient(colorsSpace: colorSpace, colors: cfColors as CFArray, locations: nil)
let start = CGPoint(x: self.intriSize.width, y: 0)
let end = CGPoint(x: 0, y: self.intriSize.height)
context?.drawLinearGradient(gradient!, start: start, end: end, options: [.drawsBeforeStartLocation, .drawsAfterEndLocation])
let image = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()
return image
}
}
//
// GMWebEngine.swift
// GMDoctor
//
// Created by Thierry on 16/6/21.
// Copyright © 2016年 Gengmei. All rights reserved.
//
import Foundation
import WebKit
//import GMUtil
//import EVReflection
class GMWebEngine {
var cookies: [String] = []
weak var webView: WKWebView?
/// WKScriptMessageHandler
/// 添加一个名称,就可以让JS通过这个名称发送消息:valueName自定义名字
/// window.webkit.messageHandlers.valueName.postMessage({body: 'xxx'})
public var scriptMessageHandlerArray: [String] = [String]()
/// 默认最小字体字体
public var minFontSize: CGFloat = 0
/// 显示滚动条
public var isShowScrollIndicator: Bool = true
/// 开启手势交互
public var isAllowsBackForwardGestures: Bool = true
/// 是否允许加载javaScript
public var isjavaScriptEnabled: Bool = true
/// 是否允许JS自动打开窗口的,必须通过用户交互才能打开
public var isAutomaticallyJavaScript: Bool = true
/// 是否影藏进度条
public var isProgressHidden: Bool = false
/// 进度条高度
public var progressHeight: CGFloat = 1
/// 默认颜色
public var progressTrackTintColor: UIColor = UIColor.mainVisual
/// 加载颜色
public var progressTintColor: UIColor = UIColor.mainVisual
init() {
syncCookies()
}
/**
同步Cookie
WKWebView不再和NSURLSession共享Cookie,所以需要手动同步
*/
func syncCookies() {
cookies.removeAll()
for cookie in HTTPCookieStorage.shared.cookies(for: URL(string: GMServerDomains.apiHost)!)! {
let value = "\(cookie.name)=\(cookie.value)"
cookies.append(value)
}
}
/**
构造Ajax Cookie的Script
in 2.3.0
- returns script
*/
func ajaxCookie() -> String {
var source = ""
for cookie in HTTPCookieStorage.shared.cookies(for: URL(string: GMServerDomains.apiHost)!)! {
var string = "\(cookie.name)=\(cookie.value);domain=\(cookie.domain);path=\(cookie.path); expires=\(String(describing: cookie.expiresDate))"
if cookie.isSecure {
string = "\(string);secure=true"
}
source.append("document.cookie='\(string)';")
}
return source
}
func webCookie() -> String {
return cookies.joined(separator: ";")
// let cookieStr = cookies.joined(separator: ";")
// let paraStr = AppDelegate.shareInstance().urlCommonParameters()!.replacingOccurrences(of: "?", with: "")
// return "\(cookieStr);device_info=\(paraStr)"
}
/**
解析全局JS对象
*/
func parseJSPageData(_ complete: @escaping ([String: AnyObject]) -> Void) {
webView?.evaluateJavaScript("window.GLOBAL.pagedata") { (object, error) in
if let data = object as? [String: AnyObject] {
complete(data)
}
debugPrint(error ?? "")
}
}
}
//
// GMWebViewComponent.swift
// Gengmei
//
// Created by Terminator on 2017/11/9.
// Copyright © 2017年 更美互动信息科技有限公司. All rights reserved.
//
import UIKit
import WebKit
import GMBaseSwift
import GMUtil
@objc protocol WKWebViewDelegate: class {
// 这是对外暴露的方法
@objc optional func handleLinkTap(_ url: String, host: String?, params: [String: AnyObject]?)
@objc optional func handleGlobalPageData(_ data: [String: AnyObject])
/// 数据请求成功h5调起
@objc optional func globalPageData(_ data: NSDictionary)
// 机构详情
@objc optional func globalDataLoaded(_ data: NSDictionary)
// 7770 i帖子头部切换
@objc optional func scrollSetHeader(_ data: NSDictionary)
// 导航栏隐藏显示
@objc optional func controlTitleBarVisible(_ show: Bool)
@objc optional func diaryDetailControllerShowNotificationAlert()
/// webView页面点击分享调起(没有share_data包裹)
@objc optional func webViewShareData(_ data: NSDictionary)
// 人脸分析之后点击分享传给客户端图片
@objc optional func shareFaceInfoImageMethod(_ imageString: String)
// 测肤分享图片传给客户端图片
@objc optional func shareSkinInfoImageMethod(_ imageString: String)
// 面孔起源分享图片传给客户端图片
@objc optional func shareResearchInfoImageMethod(_ imageString: String)
// 分享base64图片 {"imageString" : base64_String}
@objc optional func shareBase64ImageMethod(_ imageString: String)
// 工作台-面诊报告列表-投诉弹框
@objc optional func videoDiagnoseComplaint(_ data: NSDictionary)
// 保存视频方法
@objc optional func saveFaceVideo(_ jsonString: String)
// 播放视频方法
@objc optional func playFaceVideo()
// 是否展示空页面
@objc optional func showNativeEmptyView()
@objc optional func insurancePurchase(_ hasBought: Bool)
// 获取native本地公共参数
@objc optional func nativeDataLoaded() -> String
//获取用户信息
@objc optional func inflateUserInfo() -> String
// 实时获取数据返回值
@objc optional func onLineGetData(_ data: NSDictionary)
//修改用户头像
@objc optional func changeAvatar()
// 扫脸结果页获取im链接
@objc optional func consultationUrl(_ data: NSDictionary)
// 判断是否滑动到了底部
@objc optional func jsPageReachBottom(_ isScrollbottom: Bool)
// 测肤返回到首页
@objc optional func jsControlBackToMethod(_ jsonString: String)
// 扫脸页接口请求完成,隐藏loading
@objc optional func closeFaceLoading()
/// H5 指定分享平台
@objc optional func jsSharewithType(_ data: NSDictionary)
/// 回复弹框
@objc optional func jsShowActionSheet(_ data: NSDictionary)
// 面孔起源结果页跳转列表页
@objc optional func jsJumpToResearchPage(_ url: String)
// 精准曝光
@objc optional func hybridExposure(_ data: NSDictionary)
// 相机和麦克风权限
@objc optional func getVideoPermission(_ data: NSDictionary)
// 关闭视频面诊基本信息弹窗
@objc optional func closeCurrentPage()
// 视频面诊基本信息
@objc optional func showVideoBasicInfo(_ jsonString: String)
// 面诊记录列表查看评价与去评价
@objc optional func viewEvaluate(_ jsonString: String)
// 面诊记录列表查看投诉
@objc optional func viewComplaint(_ jsonString: String)
// 面诊订单列表确定订单
@objc optional func viewConfirm(_ jsonString: String)
// 面诊订单详情弹出投诉弹窗
@objc optional func showComplaint(_ jsonString: String)
// 展示评论列表
@objc optional func jsShowCommentList(_ string: String)
// 面诊弹窗
@objc optional func showCounsellorCard(_ string: String)
// 面诊弹窗全部卡片
@objc optional func showAllCard()
// 遮罩
@objc optional func showClientShadow(_ data: NSDictionary)
}
///考虑到要做成一个库不想要那么重的继承任务
@objcMembers
class GMWebViewComponent: UIView {
/// 事件
fileprivate weak var target: AnyObject?
///webcomponet
var webView = WKWebView()
/// 创建一个webiview的配置项
fileprivate let configuretion = WKWebViewConfiguration()
fileprivate let userContent = WKUserContentController()
fileprivate var showInputDic = NSDictionary()
var popupView: GMPopUpView!
var moreQueryParams = ""
var fullUrl = ""
var path = ""
/// 不立即请求
var isImmediateRequest = true
/// WebView配置项
var webEngine = GMWebEngine()
var clientH5Object = GMClientH5Object()
/// 进度条
var progressView: UIProgressView!
// 弹出键盘view
var showInputView = WMPostInputView()
//设置代理
weak var delegate: WKWebViewDelegate?
fileprivate var titleObserve: NSKeyValueObservation!
fileprivate var estimatedProgressObserve: NSKeyValueObservation!
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
configure()
}
override init(frame: CGRect) {
super.init(frame: frame)
configure()
}
fileprivate func configure() {
}
//初始化Preferences
fileprivate func initPreferences() {
configuretion.preferences = WKPreferences()
configuretion.processPool = WKProcessPool.sharedProcessPool()
configuretion.preferences.minimumFontSize = webEngine.minFontSize
configuretion.preferences.javaScriptEnabled = webEngine.isAutomaticallyJavaScript
// 需要WKWebView支持页面内视频播放
configuretion.allowsInlineMediaPlayback = true
if #available(iOS 10.0, *) {
configuretion.mediaTypesRequiringUserActionForPlayback = WKAudiovisualMediaTypes.init(rawValue: 0)
} else {
configuretion.mediaPlaybackRequiresUserAction = false
}
}
/**
初始化userContent
同步Ajax Cookie
*/
fileprivate func initUserContent() {
userContent.add(self, name: "gmclient")
let ajaxCookieScript = WKUserScript(source: webEngine.ajaxCookie(), injectionTime: .atDocumentStart, forMainFrameOnly: false)
userContent.addUserScript(ajaxCookieScript)
configuretion.userContentController = userContent
_ = webEngine.scriptMessageHandlerArray.map { [unowned self] (handlerName) in
self.userContent.add(self, name: handlerName)
}
}
func initProgressView() {
//进度条
progressView = UIProgressView(progressViewStyle: UIProgressViewStyle.bar)
progressView.progressTintColor = UIColor.mainVisual
addSubview(progressView)
progressView.snp.makeConstraints { (make) in
make.top.left.right.equalTo(0)
make.height.equalTo(1)
}
}
func initShowInputView(_ view: UIView) {
// 弹出键盘
showInputView = WMPostInputView()
showInputView.delegate = self
showInputView.isHidden = true
showInputView.removeFromSuperview()
view.addSubview(showInputView)
showInputView.snp.makeConstraints { (make) in
make.left.equalTo(0)
make.right.equalTo(0)
make.bottom.equalTo(0)
make.top.equalTo(OCNavigationBar.barHeight)
}
}
func initPopUpView(_ title: String) {
popupView = GMPopUpView()
popupView.delegate = self.delegate as? GMPopupBgViewDelegate
popupView.title = title
popupView.fullUrl = fullUrl
AppDelegate.visibleController.view.addSubview(popupView)
}
fileprivate func initWebView(_ webEngine: GMWebEngine) {
webView.removeFromSuperview()
webView = WKWebView(frame: CGRect.zero, configuration: configuretion)
webView.uiDelegate = self
webView.navigationDelegate = self
if #available(iOS 11.0, *) {
webView.scrollView.contentInsetAdjustmentBehavior = UIScrollViewContentInsetAdjustmentBehavior.never
}
//开启手势交互
webView.allowsBackForwardNavigationGestures = webEngine.isAllowsBackForwardGestures
//滚动条
webView.scrollView.showsVerticalScrollIndicator = webEngine.isShowScrollIndicator
webEngine.webView = webView
addSubview(webView)
//内容自适应
webView.snp.makeConstraints { (make) in
make.left.top.right.bottom.equalTo(0)
}
}
func wrapUrl() -> String {
var para = AppDelegate.shareInstance().urlCommonParameters()!
if fullUrl.isNonEmpty() {
if !fullUrl.contains("&device_id=") {
if fullUrl.contains("?") {
let startIndex = para.startIndex
let endIndex = para.index(startIndex, offsetBy: 0)
let range = startIndex...endIndex
para.replaceSubrange(range, with: "&")
}
fullUrl = "\(fullUrl)\(para)"
}
if self.moreQueryParams.isNonEmpty() {
fullUrl = "\(fullUrl)\(self.moreQueryParams)"
}
return fullUrl.trimSpace()
} else {
let apihost = GMServerDomains.apiHost!
let url = "\(apihost)/hybrid\(path)\(para)\(self.moreQueryParams)"
return url
}
}
///发送Request
public func sendRequest() {
let urlString = wrapUrl()
if urlString.isEmpty {
return
}
let url = URL(string: urlString)!
let urlHost = url.host ?? ""
let isAllow = GMServerDomains.allowURLHost(urlHost)
if isAllow == false {
#if DEBUG
UIAlertController.showOKAlert(withTitle: "webView需添加白名单")
#endif
return
}
let request = NSMutableURLRequest(url: url, cachePolicy: .reloadRevalidatingCacheData, timeoutInterval: 30)
request.setValue(webEngine.webCookie(), forHTTPHeaderField: "Cookie")
webView.load(request as URLRequest)
}
func webviewLoad(_ target: AnyObject) {
self.target = target
initPreferences()
initUserContent()
initWebView(webEngine)
initProgressView()
initShowInputView(self)
addObserver()
if fullUrl.isNonEmpty() || path.isNonEmpty() {
sendRequest()
}
}
/// 刷新
public func reload() {
//防止 登陆后缓存 修改不同步问题
let ajaxCookieScript = WKUserScript(source: webEngine.ajaxCookie(), injectionTime: .atDocumentStart, forMainFrameOnly: false)
self.userContent.addUserScript(ajaxCookieScript)
webEngine.syncCookies()
sendRequest()
webView.isUserInteractionEnabled = false
}
public func loadJsCode(jsCode: String) {
// 根据JS字符串初始化WKUserScript对象
self.webView.evaluateJavaScript(jsCode) { (value, error) in
debugLog(error)
debugLog(value)
}
}
/// 后退
public func goBack() {
webView.goBack()
}
/// 前进
public func goForward() {
webView.goForward()
}
/// 移除webView
public func removeWebView() {
webView.scrollView.delegate = nil
NotificationCenter.default.removeObserver(self, name: NSNotification.Name(rawValue: LOGIN_SUCCESS_NOTIFICATION), object: nil)
titleObserve?.invalidate()
estimatedProgressObserve?.invalidate()
userContent.removeAllUserScripts()
_ = webEngine.scriptMessageHandlerArray.map { [unowned self] (handlerName) in
self.userContent.removeScriptMessageHandler(forName: handlerName)
}
userContent.removeScriptMessageHandler(forName: "gmclient")
self.webView.navigationDelegate = nil
self.webView.uiDelegate = nil
}
override func willMove(toSuperview newSuperview: UIView?) {
if newSuperview == nil {
removeWebView()
}
}
func addObserver() {
titleObserve = webView.observe(\.title) { [unowned self] (_, _) in
guard let controller = self.target as? WMBaseViewController else {
return
}
controller.navigationBar.title = self.webView.title ?? ""
controller.title = self.webView.title ?? ""
}
estimatedProgressObserve = webView.observe(\.estimatedProgress, options: .new) { [unowned self] (_, change) in
if let currentProgress = change.newValue {
self.progressView.setProgress(Float(currentProgress), animated: true)
if Float(currentProgress) == 1 {
self.webView.isUserInteractionEnabled = true
}
}
}
NotificationCenter.default.addObserver(self, selector: #selector(reload), name: NSNotification.Name(rawValue: LOGIN_SUCCESS_NOTIFICATION), object: nil)
}
}
// MARK: - WKNavigationDelegate
extension GMWebViewComponent: WKNavigationDelegate {
///开始发送Request
func webView(_ webView: WKWebView, didStartProvisionalNavigation navigation: WKNavigation!) {
debugLog("didStartProvisionalNavigation")
progressView.removeFromSuperview()
initProgressView()
progressView.isHidden = false
}
/**
Request请求完毕,内容开始返回
*/
func webView(_ webView: WKWebView, didCommit navigation: WKNavigation!) {
debugLog("didCommitNavigation")
}
/// 页面加载完毕, 不一定及时得到数据
func webView(_ webView: WKWebView, didFinish navigation: WKNavigation!) {
webEngine.parseJSPageData { [weak self] (data: [String: AnyObject]) in
self?.delegate?.handleGlobalPageData?(data)
}
// 从H5中取得全局变量
delay(0.5) {
self.progressView.isHidden = true
}
}
/// URL重定向
func webView(_ webView: WKWebView, decidePolicyFor navigationAction: WKNavigationAction, decisionHandler: @escaping (WKNavigationActionPolicy) -> Void) {
guard let url = navigationAction.request.url else {
decisionHandler(.allow)
return
}
let urlHost = url.host ?? ""
// let dict = AppDelegate.navigation.visibleViewController?.getHostDictionary()
// let selector = dict?[urlHost] as? String ?? ""
if (url.scheme == URL_SCHEME) {
//更美协议
let urlStr = String(describing: url)
let encodeUrlScheme = urlStr.addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed) ?? ""
let encodeUrl = URL(string: encodeUrlScheme)
if encodeUrl == nil { return }
GMRouter.sharedInstance().pushScheme(encodeUrlScheme)
decisionHandler(.cancel)
return
} else if url.scheme == URL_HTTP_SCHEME || url.scheme == URL_HTTPS_SCHEME {
//正常http 请求 或者https请求
decisionHandler(.allow)
return
} else if url.scheme == "tel" {
if #available(iOS 10.0, *) {
UIApplication.shared.open(url, options: [:], completionHandler: nil)
} else {
UIApplication.shared.openURL(url)
}
decisionHandler(.allow)
return
} else {
let urlHost = url.host ?? ""
if !urlHost.isNonEmpty() {
decisionHandler(.allow)
return
}
let params = NSString(string: url.absoluteString).urlQueryToDictionary() ?? [:]
if self.delegate?.handleLinkTap?(url.absoluteString, host: urlHost, params: params as? [String: AnyObject]) != nil {
decisionHandler(.cancel)
return
} else {
decisionHandler(.allow)
return
}
}
}
//跳转失败的时候调用
public func webView(_ webView: WKWebView, didFail navigation: WKNavigation!, withError error: Error) {
progressView.isHidden = true
print(error)
}
// 内容加载失败时候调用
public func webView(_ webView: WKWebView, didFailProvisionalNavigation navigation: WKNavigation!, withError error: Error) {
progressView.isHidden = true
print(error)
}
// 打开新窗口委托
public func webView(_ webView: WKWebView, createWebViewWith configuration: WKWebViewConfiguration, for navigationAction: WKNavigationAction, windowFeatures: WKWindowFeatures) -> WKWebView? {
if navigationAction.targetFrame?.isMainFrame == nil {
webView.load(navigationAction.request)
}
return nil
}
}
// MARK: - WKUIDelegate 不实现该代理方法 网页内调用弹窗时会抛出异常,导致程序崩溃
extension GMWebViewComponent: WKUIDelegate, WMPostInputViewDelegate {
// 获取js 里面的提示
public func webView(_ webView: WKWebView, runJavaScriptAlertPanelWithMessage message: String, initiatedByFrame frame: WKFrameInfo, completionHandler: @escaping () -> Void) {
let alert = UIAlertController(title: "提示", message: message, preferredStyle: .alert)
alert.addAction(UIAlertAction(title: "确定", style: .default, handler: { (_) -> Void in
completionHandler()
}))
alert.addAction(UIAlertAction(title: "取消", style: .cancel, handler: { (_) -> Void in
completionHandler()
}))
AppDelegate.visibleController.present(alert, animated: true, completion: nil)
}
// js 信息的交流
public func webView(_ webView: WKWebView, runJavaScriptConfirmPanelWithMessage message: String, initiatedByFrame frame: WKFrameInfo, completionHandler: @escaping (Bool) -> Void) {
let alert = UIAlertController(title: "提示", message: message, preferredStyle: .alert)
alert.addAction(UIAlertAction(title: "确定", style: .default, handler: { (_) -> Void in
completionHandler(true)
}))
alert.addAction(UIAlertAction(title: "取消", style: .cancel, handler: { (_) -> Void in
completionHandler(false)
}))
AppDelegate.visibleController.present(alert, animated: true, completion: nil)
}
// 交互。可输入的文本。
public func webView(_ webView: WKWebView, runJavaScriptTextInputPanelWithPrompt prompt: String, defaultText: String?, initiatedByFrame frame: WKFrameInfo, completionHandler: @escaping (String?) -> Void) {
let alert = UIAlertController(title: prompt, message: defaultText, preferredStyle: .alert)
alert.addTextField { (textField: UITextField) -> Void in
textField.textColor = UIColor.red
}
alert.addAction(UIAlertAction(title: "确定", style: .default, handler: { (_) -> Void in
completionHandler(alert.textFields![0].text!)
}))
AppDelegate.visibleController.present(alert, animated: true, completion: nil)
}
@objc(callPhone:) func callPhone(phone: String) {
var phoneStr = phone
if phone.contains("tel") {
phoneStr = phone.replacingOccurrences(of: "\"", with: "")
} else {
phoneStr = "tel:\(phone)"
}
if #available(iOS 10.0, *) {
UIApplication.shared.open(URL(string: phoneStr)!, options: [:], completionHandler: nil)
} else {
UIApplication.shared.openURL(URL(string: phoneStr)!)
}
}
@objc(showConfirm:) func showConfirm(jsonStr: String) {
let object = WMAlertParameterObject(string: jsonStr, error: nil)
if object != nil {
let alert = UIAlertController.showCustomAlert(withTitle: object!.title ?? "标题", message: object!.content ?? "内容")
alert.addAction(object?.confirmText ?? "确定") {
self.loadJsCode(jsCode: object?.confirmCallback ?? "")
}
alert.addAction(object?.cancelText ?? "取消") {
self.loadJsCode(jsCode: object?.cancelCallback ?? "")
}
}
}
/**
7715 以后统一弹起键盘事件
@param jsonString 回调方法和占位文字
*/
@objc(showInputView:) func showInputView(param: String) {
let data = param.data(using: String.Encoding.utf8)
if let dict = (try? JSONSerialization.jsonObject(with: data!, options: .mutableContainers)) as? NSDictionary {
self.showInputDic = dict
self.showInputView.isHidden = false
// 帖子详情的全部评论回复需要限制字数
if AppDelegate.visibleController is GMTractateDetailController {
self.showInputView.textMaxCount = 50
}
self.showInputView.clear()
self.showInputView.placeHolder = String(describing: dict["placeholder"]!)
self.showInputView.show()
}
}
/// 弹起美分框
@objc(showTaskAlert:) func showTaskAlert(param: String) {
let data = param.data(using: String.Encoding.utf8)
if let dict = (try? JSONSerialization.jsonObject(with: data!,
options: .mutableContainers)) as? NSDictionary {
if dict.allKeys.count > 0 {
AppDelegate.shareInstance().showPointAlert(dict)
}
}
}
/// 未实名认证的code==70006,发送一个弹出认证页面的通知(前端判断70006时, 直接调用方法)
@objc(realNameAuthentication) func realNameAuthentication() {
NotificationCenter.default.post(name: Notification.Name(rawValue: PHONE_AUTHENTICATION), object: nil)
}
/// 回收键盘弹窗
func inputViewWillCancel(_ inputView: WMPostInputView!) {
self.showInputView.hide()
}
/// 键盘发送事件
///
/// - Parameters:
/// - inputView: 弹窗
/// - text: 发送内容
func inputView(_ inputView: WMPostInputView!, sendText text: String!) {
let a = NSString(string: String(describing: self.showInputDic["callback"]!))
let b = text.trimBothEnd() ?? ""
self.showInputView.hide()
self.showInputView.isHidden = true
let jsonStr = "window.gm.pack.run('\(a)', '\(b)')"
let result = NSString(string: jsonStr)
self.webView.evaluateJavaScript(result as String, completionHandler: nil)
}
/// 弹起全部回复
@objc(showPopupView:) func showPopupView(_ title: String) {
let data = title.data(using: String.Encoding.utf8)
let dict = try? JSONSerialization.jsonObject(with: data!, options: .mutableContainers) as! NSDictionary
fullUrl = NSString(string: String(describing: dict!["fullUrl"] ?? "")) as String
let reply = NSString(string: String(describing: dict!["title"] ?? ""))
initPopUpView(reply as String)
}
/// 全部回复框动画完成
@objc(didCompletedAnimation) func didCompletedAnimation() {
let jsonStr = "window.gm.pack.run('refreshData')"
self.webView.evaluateJavaScript(jsonStr, completionHandler: nil)
}
}
// MARK: - WKScriptMessageHandler 对外暴露的方法
extension GMWebViewComponent: WKScriptMessageHandler {
func userContentController(_ userContentController: WKUserContentController, didReceive message: WKScriptMessage) {
if let dict = message.body as? [String: AnyObject] {
let method: String = dict["method"] as! String
let param = dict["param"]
// 带参数的情况
if param != nil {
let sel = "\(method):"
if clientH5Object.delegate != nil {
if clientH5Object.responds(to: Selector(sel)) {
clientH5Object.perform(Selector(sel), with: param)
} else {
if self.responds(to: Selector(sel)) {
self.perform(Selector(sel), with: param)
}
}
} else {
if self.responds(to: Selector(sel)) {
self.perform(Selector(sel), with: param)
}
}
} else {
let sel = "\(method)"
if (clientH5Object.delegate != nil) {
if clientH5Object.responds(to: Selector(sel)) {
clientH5Object.perform(Selector(sel))
}
} else {
if self.responds(to: Selector(sel)) {
self.perform(Selector(sel))
}
}
}
}
}
func showCommentList(_ string: String) {
self.delegate?.jsShowCommentList?(string)
}
@objc(showCounsellorCard:) func showCounsellorCard(_ string: String) {
self.delegate?.showCounsellorCard?(string)
}
@objc(showAllCard) func showAllCard() {
self.delegate?.showAllCard?()
}
@objc(jsObjShowShareView:) func jsObjShowShareView(with pageData: String) {
if pageData.isEmpty {
return
}
let data = pageData.data(using: String.Encoding.utf8)
let dict = try? JSONSerialization.jsonObject(with: data!, options: .mutableContainers) as! NSDictionary
self.delegate?.webViewShareData!(dict!)
}
/// 数据加载完毕, 前端调用方法, 得到pagedata中数据
@objc(diaryGlobaltLoaded:) func diaryGlobaltLoaded(_ pageData: String) {
let Data = pageData.data(using: String.Encoding.utf8)
let dict = try? JSONSerialization.jsonObject(with: Data!, options: .mutableContainers) as! NSDictionary
self.delegate?.globalPageData!(dict!)
}
// 机构详情
@objc(globalDataLoaded:) func globalDataLoaded(_ pageData: String) {
let Data = pageData.data(using: String.Encoding.utf8)
let dict = try? JSONSerialization.jsonObject(with: Data!, options: .mutableContainers) as! NSDictionary
self.delegate?.globalDataLoaded!(dict!)
}
// 7770 帖子头部切换
@objc(scrollSetHeader:) func scrollSetHeader(_ JSONString: String) {
let Data = JSONString.data(using: String.Encoding.utf8)
let dict = try? JSONSerialization.jsonObject(with: Data!, options: .mutableContainers) as! NSDictionary
self.delegate?.scrollSetHeader!(dict!)
}
// true:导航栏显示 false:导航栏隐藏
@objc(controlTitleBarVisible:) func controlTitleBarVisible(_ pageData: String) {
let Data = pageData.data(using: String.Encoding.utf8)
let dict = try? JSONSerialization.jsonObject(with: Data!, options: .mutableContainers) as! NSDictionary
let show = dict?["show"] as? Bool
self.delegate?.controlTitleBarVisible!(show ?? false)
}
// 是否登录:1登录 0未登录
@objc(isUserLogin) func isUserLogin() -> Int {
let isLogin = GMLoginManager.shareInstance().isVisitor ? 0 : 1
let result = "window.gm.pack.run('isUserLoginCallback', '\(isLogin)')"
self.webView.evaluateJavaScript(result as String, completionHandler: nil)
return isLogin
}
@objc(jsPop:) func jsPop(_ isPop: Bool) {
if isPop {
DispatchQueue.main.async {
_ = AppDelegate.navigation.popViewController(animated: true)
}
}
}
@objc(domain) func domain() -> String {
return GMServerDomains.apiHost
}
@objc(showLoading) func showLoading() {
DispatchQueue.main.async {
AppDelegate.visibleController.showLoading("")
}
}
@objc(hideLoading) func hideLoading() {
DispatchQueue.main.async {
AppDelegate.visibleController.hideLoading()
}
}
@objc(playVideo:) func playVideo(_ JSONString: String) {
//Alert
if !JSONString.isNonEmpty() {
AppDelegate.visibleController.toast("视频无法播放")
return
}
let data = JSONString.data(using: String.Encoding.unicode)
do {
let dict = try JSONSerialization.jsonObject(with: data!, options: .allowFragments) as! JsonType
let playFrom = dict["page_name"] as? String ?? ""
let topicId = dict["topic_id"] as? Int ?? 0
let businessId = dict["business_id"] as? Int ?? 0
let cardType = dict["card_type"] as? String ?? ""
let index = dict["index"] as? Int ?? 0
let currentTime = dict["currentTime"] as? Float ?? 0.0
let state = dict["state"] as? Int ?? 0
let playBackView = GMPlayerView()
playBackView.topicId = "\(topicId)"
playBackView.from = playFrom
playBackView.index = index
playBackView.needSkipSeconds = CGFloat(currentTime)
playBackView.playState = state
// 埋点使用
let video = GMVideoObject()
video.businessId = "\(businessId)"
video.pageName = playFrom
video.cardType = cardType
playBackView.video = video
if let playUrl = dict["url"] as? String {
playBackView.play(playUrl, animationRect: CGRect.zero)
}
} catch {
debugLog("track event error")
}
}
@objc(getAddressBook:) func getAddressBook(_ JSONString: String) {
DispatchQueue.main.async {
let manager = GMAddressManager()
manager.getAddressBookAuthorization()
}
}
@objc(chooseOneContactPerson:) func chooseOneContactPerson(_ key: String) {
let manager = GMAddressManager()
manager.getOneContactPersonBlock = { result in
if result != nil {
if let data = try? JSONSerialization.data(withJSONObject: result!, options: JSONSerialization.WritingOptions.init(rawValue: 0)) {
let jsParam = String(data: data, encoding: String.Encoding.utf8)
let jsonStr = "gm.util.setContactPerson('\(jsParam ?? "")')" //TODO 待调试
self.webView.evaluateJavaScript(jsonStr, completionHandler: nil)
}
}
}
manager.chooseContactPersonAddressBookJsonString()
}
@objc(share:type:) func share(shareDataString: String, type: String) {
// showAle
}
@objc(shareFaceInfoImageMethod:) func shareFaceInfoImageMethod(key: String) {
self.delegate?.shareFaceInfoImageMethod?(key)
}
// 人脸分析之后点击分享传给客户端图片
@objc(shareSkinInfoImageMethod:) func shareSkinInfoImageMethod(key: String) {
self.delegate?.shareSkinInfoImageMethod?(key)
}
// 人脸分析之后点击分享传给客户端图片
@objc(shareResearchInfoImageMethod:) func shareResearchInfoImageMethod(key: String) {
self.delegate?.shareResearchInfoImageMethod?(key)
}
@objc(shareBase64ImageMethod:) func shareBase64ImageMethod(key: String) {
self.delegate?.shareBase64ImageMethod?(key)
}
@objc(videoDiagnoseComplaint:) func videoDiagnoseComplaint(urlData: String) {
let Data = urlData.data(using: String.Encoding.utf8)
guard let dict = try? JSONSerialization.jsonObject(with: Data!, options: .mutableContainers) as! NSDictionary else { return }
self.delegate?.videoDiagnoseComplaint?(dict)
}
@objc(viewEvaluate:) func viewEvaluate(jsonString: String) {
self.delegate?.viewEvaluate?(jsonString)
}
@objc(viewComplaint:) func viewComplaint(jsonString: String) {
self.delegate?.viewComplaint?(jsonString)
}
@objc(viewConfirm:) func viewConfirm(jsonString: String) {
self.delegate?.viewConfirm?(jsonString)
}
@objc(showComplaint:) func showComplaint(jsonString: String) {
self.delegate?.showComplaint?(jsonString)
}
@objc(changeAvatar) func changeAvatar() {
self.delegate?.changeAvatar?()
}
@objc(jsControlBackToMethod:) func jsControlBackToMethod(key: String) {
self.delegate?.jsControlBackToMethod?(key)
}
@objc(jsJumpToResearchPage:) func jsJumpToResearchPage(url: String) {
self.delegate?.jsJumpToResearchPage?(url)
}
@objc(closeFaceLoading) func closeFaceLoading() {
self.delegate?.closeFaceLoading?()
}
@objc(showVideoBasicInfo:) func showVideoBasicInfo(key: String) {
self.delegate?.showVideoBasicInfo?(key)
}
@objc(getVideoPermission:) func getVideoPermission(_ pageData: String) {
let Data = pageData.data(using: String.Encoding.utf8)
let dict = try? JSONSerialization.jsonObject(with: Data!, options: .mutableContainers) as! NSDictionary
self.delegate?.getVideoPermission!(dict!)
}
@objc(showClientShadow:) func showClientShadow(_ pageData: String) {
let Data = pageData.data(using: String.Encoding.utf8)
let dict = try? JSONSerialization.jsonObject(with: Data!, options: .mutableContainers) as! NSDictionary
self.delegate?.showClientShadow?(dict!)
}
@objc(closeCurrentPage) func closeCurrentPage() {
self.delegate?.closeCurrentPage?()
}
@objc(consultationUrl:) func consultationUrl(_ urlData: String) {
let Data = urlData.data(using: String.Encoding.utf8)
guard let dict = try? JSONSerialization.jsonObject(with: Data!, options: .mutableContainers) as! NSDictionary else { return }
self.delegate?.consultationUrl?(dict)
}
@objc(saveFaceVideo:) func saveFaceVideo(key: String) {
self.delegate?.saveFaceVideo?(key)
}
@objc(playFaceVideo) func playFaceVideo() {
self.delegate?.playFaceVideo?()
}
@objc(openBrowser:) func openBrowser(urlStr: String) {
let alert = UIAlertController.showCustomAlert(withTitle: "提示", message: "你访问的网址将以外部浏览器打开,是否继续?")
alert.addAction("否", actionHandler: nil)
alert.addAction("是") {
if let url = URL(string: urlStr) {
if #available(iOS 10, *) {
UIApplication.shared.open(url, options: [:], completionHandler: nil)
} else {
UIApplication.shared.openURL(url)
}
}
}
}
@objc(jumpToLocationSettings) func jumpToLocationSettings() {
GMLocationManager.jumpToSettings()
}
@objc(locationShowAlertIfNotAllowed) func locationShowAlertIfNotAllowed() {
GMLocationManager.showAlertIfNotAllowed()
}
//把所有的js交互 鉴于实现代理 还是放在具体的业务中处理比较好
@objc(diaryDetailShowNotificationAlert) func diaryDetailShowNotificationAlert() {
//弹出通知提示页面
AppDelegate.shareInstance().userIsAllowPush { (status) in
let str = GMCache.fetchObject(atDocumentPathWithkey: kShowNotifyAlert) as? String ?? ""
if !str.isNonEmpty() && !status {
self.delegate?.diaryDetailControllerShowNotificationAlert!()
}
}
}
// 秒杀页面添加到系统日历事件 jsonString H5传来的的美购信息
@objc(remindEvent:) func remindEvent(jsonString: String) {
if let data = jsonString.data(using: String.Encoding.utf8) {
if let json = try? JSONSerialization.jsonObject(with: data, options: JSONSerialization.ReadingOptions.init(rawValue: 1)) as? JsonType {
let beginTime = json!["start_time"] as? Double ?? 0
let endTime = json!["end_time"] as? Double ?? 0
let title = json!["title"] as? String ?? ""
let url = json!["url"] as? String ?? ""
let serviceId = json!["service_id"] as? String ?? ""
let isNotify = json!["notify"] as? Bool ?? false
let manager = GMCalendarEventManager()
manager.authorizationAllowed = { () in
let param = NSMutableDictionary()
param["service_id"] = serviceId
Phobos.track("activity_promotion_seckill_notice", attributes: (param as? JsonType ?? nil)!)
manager.addEvent(title, startDate: beginTime, endDate: endTime, serviceId: serviceId, url: url)
}
if manager.checkAuthorized() {
if isNotify {
let param = NSMutableDictionary()
param["service_id"] = serviceId
Phobos.track("activity_promotion_seckill_notice", attributes: (param as? JsonType ?? nil)!)
} else {
manager.removeEvent(serviceId)
}
}
}
}
}
// 保险回调
@objc(insurancePurchase:) func insurancePurchase(_ hasBought: NSNumber) {
self.delegate?.insurancePurchase!(hasBought.boolValue)
}
// 保险回调
@objc(jsPageReachBottom:) func jsPageReachBottom(_ isScrollbottom: NSNumber) {
self.delegate?.jsPageReachBottom!(isScrollbottom.boolValue)
}
@objc(sendMessage:body:) func sendMessage(phone: String, body: String) {
if GMMessageController.canSendText() {
let messageVC = GMMessageController()
messageVC.recipients = [phone]
messageVC.body = body
messageVC.modalPresentationStyle = UIModalPresentationStyle.fullScreen
AppDelegate.visibleController.present(messageVC, animated: true, completion: nil)
} else {
AppDelegate.navigation.toast("当前设备不支持发短信")
}
}
@objc(setHeaderHeight:) func setHeaderHeight(height: String) {
}
@objc(setLocalStorage:value:) func setLocalStorage(key: String, value: String) {
GMCache.storeObject(atDocumentPathWithkey: key, object: value as NSCoding)
}
@objc(getLocalStorage:) func getLocalStorage(key: String) {
let cacheValue = GMCache.fetchObject(atDocumentPathWithkey: key) as? String ?? ""
let str = "window.gm.pack.run('getLocalStorage','\(cacheValue)')"
self.webView.evaluateJavaScript(str) { (object, error) in
}
}
// 获取native本地公共参数
@objc(nativeDataLoaded) func nativeDataLoaded() {
let param = NSMutableDictionary(dictionary: NSDictionary.trackerPageParam(AppDelegate.visibleController))
param["title_bar_height"] = (OCNavigationBar.barHeight)
param["referrer_tab_name"] = AppDelegate.visibleController.referrerTabName
if let data = try? JSONSerialization.data(withJSONObject: param, options: JSONSerialization.WritingOptions.init(rawValue: 0)) {
if let jsParam = String(data: data, encoding: String.Encoding.utf8) {
self.webView.evaluateJavaScript("window.gm.pack.run('setNativeDataLoaded','\(jsParam)')", completionHandler: nil)
}
}
}
@objc(inflateUserInfo) func inflateUserInfo() {
if let str = self.delegate?.inflateUserInfo?() {
self.webView.evaluateJavaScript("window.gm.pack.run('setInflateUserInfo','\(str)')", completionHandler: nil)
}
}
@objc(logout) func logout() {
GMLoginManager.shareInstance().doLogoutAndShowLoginView()
}
//TODO
@objc(jsOpenAlbum:isPrivate:) func jsOpenAlbum(_ requestCode: String, isPrivate: Bool) {
}
@objc(trackEvent:) func trackEvent(_ JSONString: String) {
let data = JSONString.data(using: String.Encoding.unicode)
do {
let dict = try JSONSerialization.jsonObject(with: data!, options: .allowFragments) as! JsonType
let params = dict["params"]
if params is String {
let objectData = (params as! String).data(using: String.Encoding.unicode)
let json = try JSONSerialization.jsonObject(with: objectData!, options: .mutableContainers)
Phobos.track(dict["type"] as? String ?? "", attributes: json as! JsonType)
} else {
let params = dict["params"] as? JsonType
if params != nil {
Phobos.track(dict["type"] as? String ?? "", attributes: (params ?? nil)! )
}
}
} catch {
debugLog("track event error")
}
}
@objc(showNativeEmptyView) func showNativeEmptyView() {
Phobos.track("on_click_button", attributes: ["page_name": AppDelegate.visibleController.pageName, "button_name": "click_reload",], sendNow: false)
self.delegate?.showNativeEmptyView?()
}
/// h5 实时调取 native 方法
@objc(onLineGetData:) func onLineGetData(_ pageData: String) {
let Data = pageData.data(using: String.Encoding.utf8)
guard let dict = try? JSONSerialization.jsonObject(with: Data!, options: .mutableContainers) as! NSDictionary else { return }
self.delegate?.onLineGetData?(dict)
}
@objc(sharewithType:) func sharewithType(with pageData: String) {
if pageData.isEmpty {
return
}
let data = pageData.data(using: String.Encoding.utf8)
let dict = try? JSONSerialization.jsonObject(with: data!, options: .mutableContainers) as! NSDictionary
self.delegate?.jsSharewithType?(dict!)
}
// 跳转第三方APP
@objc(skipToThirdApp:) func skipToThirdApp(_ JSONString: String) {
let data = JSONString.data(using: String.Encoding.utf8)
guard let dict = try? JSONSerialization.jsonObject(with: data!, options: .mutableContainers) as! NSDictionary else { return }
let urlStr = dict["target_url"] as! String
let url = NSURL.init(string: urlStr)! as URL
if #available(iOS 10.0, *) {
UIApplication.shared.open(url, options: [:], completionHandler: nil)
} else {
UIApplication.shared.openURL(url)
}
}
// 判断是否开启定位
@objc(isLocationEnable) func isLocationEnable() {
// WKWebview不支持直接传值,需要调H5的方法来传值给H5
self.webView.evaluateJavaScript("window.gm.pack.run('isLocationEnableCallback','\(GMLocationManager.hasOpenLocationService())')", completionHandler: nil)
}
// toast 弹窗
@objc(showToast:) func showToast(_ JSONString: String) {
let data = JSONString.data(using: String.Encoding.utf8)
guard let dict = try? JSONSerialization.jsonObject(with: data!, options: .mutableContainers) as! NSDictionary else { return }
let text = dict["text"] as! String
if !text.isEmpty {
AppDelegate.visibleController.toast(text)
}
}
// 精准曝光
@objc(hybridExposure:) func hybridExposure(_ JSONString: String) {
let data = JSONString.data(using: String.Encoding.unicode)
do {
let dict = try JSONSerialization.jsonObject(with: data!, options: .allowFragments) as! JsonType
Phobos.track("page_precise_exposure", attributes: dict, sendNow: true, currentAPI: GMExactExposureApi)
} catch {
debugLog("track event error")
}
}
}
// MARK: - 扩展WKProcessPool,使其变成单例,所有WKWebView共享Cookie数据
extension WKProcessPool {
static var SharedProcessPool: WKProcessPool = {
var sharePool = WKProcessPool()
return sharePool
}()
class func sharedProcessPool() -> WKProcessPool {
return SharedProcessPool
}
}
//
// GMWebViewModel.h
// Gengmei
//
// Created by MoMo on 2019/12/12.
// Copyright © 2019 更美互动信息科技有限公司. All rights reserved.
//
#import "WMFetchDataViewModel.h"
/** webView 相关数据 */
NS_ASSUME_NONNULL_BEGIN
@interface GMWebViewModel : WMFetchDataViewModel
/// 问题页,置顶回答id
@property (nonatomic, copy) NSString *top_answer_id;
/** 回复问题id */
@property (nonatomic, copy) NSString *questionId;
/** 视频Token */
@property (nonatomic, copy) NSString *videoToken;
@end
NS_ASSUME_NONNULL_END
//
// GMWebViewModel.m
// Gengmei
//
// Created by MoMo on 2019/12/12.
// Copyright © 2019 更美互动信息科技有限公司. All rights reserved.
//
#import "GMWebViewModel.h"
@implementation GMWebViewModel
@end
//
// UIViewController+UrlScheme.h
// Gengmei
//
// Created by Thierry on 4/21/15.
// Copyright (c) 2015 Wanmeichuangyi. All rights reserved.
//
#import <UIKit/UIKit.h>
NS_ASSUME_NONNULL_BEGIN
@interface UIViewController (UrlScheme)
/**
区域埋点字段
*/
@property (nonatomic, strong) NSDictionary *referDict;
@end
NS_ASSUME_NONNULL_END
//
// UIViewController+UrlScheme.m
// Gengmei
//
// Created by Thierry on 4/21/15.
// Copyright (c) 2015 Wanmeichuangyi. All rights reserved.
//
#import <objc/runtime.h>
#import "UIViewController+UrlScheme.h"
@implementation UIViewController (UrlScheme)
#pragma mark -------------------
- (void)setReferDict:(NSDictionary *)referDict {
objc_setAssociatedObject(self, @selector(referDict), referDict, OBJC_ASSOCIATION_RETAIN);
}
- (NSDictionary *)referDict {
return objc_getAssociatedObject(self, @selector(referDict));
}
@end
//
// WMBaseViewController+OCNavigationBar.h
// Gengmei
//
// Created by wangyang on 16/7/8.
// Copyright © 2016年 更美互动信息科技有限公司. All rights reserved.
//
/*** @brief 右按钮的 按钮类型 */
typedef NS_ENUM(NSUInteger, OCBarButtonImageType){
/*** @brief 默认没有右按钮*/
OCBarButtonImageTypeDefault = 0,
/*** @brief 图片分享按钮 */
OCBarButtonImageTypeShare = 1,
/*** @brief 写新日记 */
OCBarButtonImageTypeDiary,
/*** @brief 搜索按钮。如果是继承于WMBaseViewController,这个option的action不需要单独实现,在base中已经实现了 */
OCBarButtonImageTypeSearch,
/*** @brief 分享返现,具体方法没有实现,请在子类中实现*/
OCBarButtonImageTypeShareCashback,
/*** @brief 客服,请在子类中实现*/
OCBarButtonImageTypeCustomerServices,
};
@interface WMBaseViewController (OCNavigationBar)
/**
* @brief 设置导航栏 左边默认是返回按钮
*
* @param title 导航tilte
* @param rightTitle 右边文字型的按钮
*/
- (void)setNavigateTitle:(NSString *)title rightButtonTitle:(NSString *)rightButtonTitle;
/**
* @brief 设置导航栏 左边默认是返回按钮
*
* @param title 导航tilte
* @param rightButton 右边是图片型的按钮
*/
- (void)setNavigateTitle:(NSString *)title rightButtonOption:(OCBarButtonImageType)rightButtonOption;
/**
* @brief 当右侧是标题按钮时,设置右侧标题按钮不同状态下的色值
* @param normalColor 常态下色值
* @param highlightColor 高亮下色值
* @param disableColor 失效下色值
*/
- (void)setRightTitleNormalColor:(UIColor *)normalColor highlightColor:(UIColor *)highlightColor disableColor:(UIColor *)disableColor;
/**
* @author wangyang
*
* 通过此方法可以返回一个rightButton图片名,用于navigationBar.rightIcon
*/
- (NSString *)navigationBarIconFromType:(OCBarButtonImageType)type;
@end
//
// WMBaseViewController+OCNavigationBar.m
// Gengmei
//
// Created by wangyang on 16/7/8.
// Copyright © 2016年 更美互动信息科技有限公司. All rights reserved.
//
#import "WMBaseViewController.h"
#import "WMBaseViewController+OCNavigationBar.h"
@implementation WMBaseViewController (OCNavigationBar)
- (void)setNavigateTitle:(NSString *)title rightButtonTitle:(NSString *)rightButtonTitle{
self.navigationBar.title = title;
self.navigationBar.rightTitle = rightButtonTitle;
}
- (void)setNavigateTitle:(NSString *)title rightButtonOption:(OCBarButtonImageType)rightButtonOption{
self.navigationBar.title = title;
self.navigationBar.rightIcon = [self navigationBarIconFromType:rightButtonOption];
}
- (NSString *)navigationBarIconFromType:(OCBarButtonImageType)type {
switch (type) {
case OCBarButtonImageTypeShare:
return @"share";
case OCBarButtonImageTypeDiary:
return @"write";
case OCBarButtonImageTypeSearch:
return @"search_green";
case OCBarButtonImageTypeShareCashback:
return @"share_cashback";
case OCBarButtonImageTypeCustomerServices:
return @"customer_service";
default:
return @"";
}
}
- (void)setRightTitleNormalColor:(UIColor *)normalColor highlightColor:(UIColor *)highlightColor disableColor:(UIColor *)disableColor{
if (normalColor) {
[self.navigationBar.rightButton setTitleColor:normalColor forState:UIControlStateNormal];
}
if (highlightColor) {
[self.navigationBar.rightButton setTitleColor:normalColor forState:UIControlStateHighlighted];
}
if (disableColor) {
[self.navigationBar.rightButton setTitleColor:normalColor forState:UIControlStateDisabled];
}
}
@end
//
// WMBaseViewController+OCNavigationBar.h
// Gengmei
//
// Created by wangyang on 16/7/8.
// Copyright © 2016年 更美互动信息科技有限公司. All rights reserved.
//
/*** @brief 右按钮的 按钮类型 */
typedef NS_ENUM(NSUInteger, OCBarButtonImageType){
/*** @brief 默认没有右按钮*/
OCBarButtonImageTypeDefault = 0,
/*** @brief 图片分享按钮 */
OCBarButtonImageTypeShare = 1,
/*** @brief 写新日记 */
OCBarButtonImageTypeDiary,
/*** @brief 搜索按钮。如果是继承于WMBaseViewController,这个option的action不需要单独实现,在base中已经实现了 */
OCBarButtonImageTypeSearch,
/*** @brief 分享返现,具体方法没有实现,请在子类中实现*/
OCBarButtonImageTypeShareCashback,
/*** @brief 客服,请在子类中实现*/
OCBarButtonImageTypeCustomerServices,
};
@interface WMBaseViewController (OCNavigationBar)
/**
* @brief 设置导航栏 左边默认是返回按钮
*
* @param title 导航tilte
* @param rightTitle 右边文字型的按钮
*/
- (void)setNavigateTitle:(NSString *)title rightButtonTitle:(NSString *)rightButtonTitle;
/**
* @brief 设置导航栏 左边默认是返回按钮
*
* @param title 导航tilte
* @param rightButton 右边是图片型的按钮
*/
- (void)setNavigateTitle:(NSString *)title rightButtonOption:(OCBarButtonImageType)rightButtonOption;
/**
* @brief 当右侧是标题按钮时,设置右侧标题按钮不同状态下的色值
* @param normalColor 常态下色值
* @param highlightColor 高亮下色值
* @param disableColor 失效下色值
*/
- (void)setRightTitleNormalColor:(UIColor *)normalColor highlightColor:(UIColor *)highlightColor disableColor:(UIColor *)disableColor;
/**
* @author wangyang
*
* 通过此方法可以返回一个rightButton图片名,用于navigationBar.rightIcon
*/
- (NSString *)navigationBarIconFromType:(OCBarButtonImageType)type;
@end
//
// WMBaseViewController+OCNavigationBar.m
// Gengmei
//
// Created by wangyang on 16/7/8.
// Copyright © 2016年 更美互动信息科技有限公司. All rights reserved.
//
#import "WMBaseViewController+OCNavigationBar.h"
@implementation WMBaseViewController (OCNavigationBar)
- (void)setNavigateTitle:(NSString *)title rightButtonTitle:(NSString *)rightButtonTitle{
self.navigationBar.title = title;
self.navigationBar.rightTitle = rightButtonTitle;
}
- (void)setNavigateTitle:(NSString *)title rightButtonOption:(OCBarButtonImageType)rightButtonOption{
self.navigationBar.title = title;
self.navigationBar.rightIcon = [self navigationBarIconFromType:rightButtonOption];
}
- (NSString *)navigationBarIconFromType:(OCBarButtonImageType)type {
switch (type) {
case OCBarButtonImageTypeShare:
return @"share";
case OCBarButtonImageTypeDiary:
return @"write";
case OCBarButtonImageTypeSearch:
return @"search_green";
case OCBarButtonImageTypeShareCashback:
return @"share_cashback";
case OCBarButtonImageTypeCustomerServices:
return @"customer_service";
default:
return @"";
}
}
- (void)setRightTitleNormalColor:(UIColor *)normalColor highlightColor:(UIColor *)highlightColor disableColor:(UIColor *)disableColor{
if (normalColor) {
[self.navigationBar.rightButton setTitleColor:normalColor forState:UIControlStateNormal];
}
if (highlightColor) {
[self.navigationBar.rightButton setTitleColor:normalColor forState:UIControlStateHighlighted];
}
if (disableColor) {
[self.navigationBar.rightButton setTitleColor:normalColor forState:UIControlStateDisabled];
}
}
@end
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