ios-unity/Classes_cocos/WebPageViewController.mm
2024-01-25 13:05:35 +08:00

252 lines
11 KiB
Plaintext

//
// WebPageViewController.m
// Unity-iPhone
//
// Created by Hl Zhang on 2023/3/14.
//
#import "WebPageViewController.h"
#import <WebKit/WebKit.h>
#include "cocos/scripting/js-bindings/manual/jsb_global.h"
#include "JcWallet.h"
#define SCREENWIDTH [UIScreen mainScreen].bounds.size.width
#define SCREENHEIGHT [UIScreen mainScreen].bounds.size.height
#import "NSDictionary+Customer.h"
#import "UIViewController+Wallet.h"
#import "UIViewController+QR.h"
#import "UIViewController+Purchase.h"
#include "cocos/scripting/js-bindings/manual/jsb_global.h"
#import "GlobalData.h"
#import "QRCodeReaderViewController.h"
#import "QRCodeReader.h"
#import "QRCodeReaderDelegate.h"
#import "SimpleQRViewController.h"
#import "LBXPermission.h"
#import "LBXPermissionSetting.h"
@interface WebPageViewController ()<WKScriptMessageHandler>
@property (nonatomic, strong) WKWebView *webView;
@end
static QRCodeReaderViewController *qrcodeReaderVC = nil;
static SimpleQRViewController *sqrVC = nil;
@implementation WebPageViewController
- (void)viewDidLoad {
[super viewDidLoad];
WKWebViewConfiguration *config = [[WKWebViewConfiguration alloc] init];
config.preferences.minimumFontSize = 10;
config.preferences.javaScriptEnabled = YES;
//不通过用户交互,是否可以打开窗口
config.preferences.javaScriptCanOpenWindowsAutomatically = NO;
// custom user agent
config.applicationNameForUserAgent = @"ios_game_web";
// [config.preferences setValue:@TRUE forKey:@"allowFileAccessFromFileURLs"];
// [config setValue:@TRUE forKey:@"allowUniversalAccessFromFileURLs"];
// Create the WKWebView
self.webView = [[WKWebView alloc] initWithFrame:self.view.bounds configuration:config];
[self.view addSubview:self.webView];
// load from local
// NSString *filePath = [[NSBundle mainBundle] pathForResource:@"index" ofType:@"html" inDirectory:@"html"];
// NSURL *baseURL = [[NSBundle mainBundle] bundleURL];
// [self.webView loadHTMLString:[NSString stringWithContentsOfFile:filePath encoding:NSUTF8StringEncoding error:nil] baseURL:baseURL];
// NSURL *fileUrl = [[NSBundle mainBundle] URLForResource:@"index" withExtension:@"html" subdirectory:@"html"];
// [self.webView loadFileURL:fileUrl allowingReadAccessToURL:fileUrl];
// NSURLRequest *request = [NSURLRequest requestWithURL:fileUrl];
// [self.webView loadRequest:request];
// Load the URL
// NSURL *url = [NSURL URLWithString:self.url];
// NSURL *url = [NSURL URLWithString: @"http://192.168.1.16/web-wallet/index.html?t=1"];
// NSURL *url = [NSURL URLWithString: @"http://192.168.100.185/web-wallet/index.html?t=3"];
// NSURL *url = [NSURL URLWithString: @"https://test.kingsome.cn/html/wallet/web-wallet/index.html?t=3"];
//
NSURL *url = [NSURL URLWithString: @"https://doc.kingsome.cn/game2006web/data/web-mobile/index.html"];
NSURLRequest *request = [NSURLRequest requestWithURL:url];
[self.webView loadRequest:request];
WKUserContentController *userCC = config.userContentController;
//JS调用OC 添加处理脚本
[userCC addScriptMessageHandler:self name:@"pageCall"];
NSString *gameData = [[GlobalData shareInstance] getGameData];
NSString *jSString = [NSString stringWithFormat:@"window.platform='ios_game_web'; window.gameData='%@';", gameData];
//用于进行JavaScript注入
WKUserScript *wkUScript = [[WKUserScript alloc] initWithSource:jSString injectionTime:WKUserScriptInjectionTimeAtDocumentEnd forMainFrameOnly:YES];
[config.userContentController addUserScript:wkUScript];
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(receiveProxyCBNotification:)
name:@"ProxyCBNotification"
object:nil];
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(receiveCallPageNotification:)
name:@"CallPageNotification"
object:nil];
}
- (void)dealloc {
[[NSNotificationCenter defaultCenter] removeObserver:self];
[self removeAllScriptMsgHandle];
}
-(void)removeAllScriptMsgHandle{
WKUserContentController *controller = self.webView.configuration.userContentController;
[controller removeScriptMessageHandlerForName:@"pageCall"];
}
#pragma mark - WKScriptMessageHandler
- (void)userContentController:(WKUserContentController *)userContentController didReceiveScriptMessage:(WKScriptMessage *)message {
NSLog(@"%@",NSStringFromSelector(_cmd));
NSLog(@"%@",message.body);
if ([message.name isEqualToString:@"pageCall"]) {
// [self showMsg: message.body];
NSDictionary *params = [NSDictionary parseJSONString:message.body];
NSString *action = params[@"action"];
NSString *funid = [NSString stringWithFormat:@"webpage_%@", params[@"funid"]];
NSDictionary *subData = params[@"data"];
if ([action isEqualToString:@"closepage"]) {
[self dismissSelf:nil];
} else if ([action isEqualToString:@"scanQRCode"]) {
NSString *title = params[@"title"];
[self scanQRCode:funid title:title];
} else if ([action isEqualToString:@"showQRCode"]) {
NSString *title = params[@"title"];
[self showQRCode:title];
} else if ([action isEqualToString:@"authGetStoragePass"]) {
UIWindow* window = [[[UIApplication sharedApplication] delegate] window];
NSString *key = params[@"key"];
[window.rootViewController authGetStoragePass:funid account:key];
} else if ([action isEqualToString:@"passStorageState"]) {
UIWindow* window = [[[UIApplication sharedApplication] delegate] window];
NSString *key = params[@"key"];
[window.rootViewController passStorageState:funid account:key];
} else if ([action isEqualToString:@"storagePass"]) {
UIWindow* window = [[[UIApplication sharedApplication] delegate] window];
NSString *key = params[@"key"];
NSString *pass = params[@"pass"];
[window.rootViewController storagePass:funid account:key pass:pass];
} else if ([action isEqualToString:@"proxyMethod"]) {
NSString *methodNmae = params[@"methodname"];
NSArray *paramsArr = params[@"params"];
std::vector<std::string> sparams;
for (int i = 0; i < paramsArr.count; i++) {
NSString *param = paramsArr[i];
sparams.push_back(std::string([param UTF8String], [param lengthOfBytesUsingEncoding:NSUTF8StringEncoding]));
}
std::string sMethdoName = std::string([methodNmae UTF8String], [methodNmae lengthOfBytesUsingEncoding:NSUTF8StringEncoding]);
std::string sfunid = std::string([funid UTF8String], [funid lengthOfBytesUsingEncoding:NSUTF8StringEncoding]);
cocos2d::nativeCallJS(sfunid, sMethdoName, sparams);
} else {
NSLog(@"unknown action: %@, data: %@", action, subData);
}
}
}
- (void) callPageJS:(NSString *) script {
NSLog(@"call page script: %@", script);
[self.webView evaluateJavaScript:script completionHandler:^(id _Nullable response, NSError * _Nullable error) {
//JS 返回结果
NSLog(@"%@ %@",response,error);
}];
}
-(void)dismissSelf:(UIButton *)button{
[self dismissViewControllerAnimated:YES completion:nil];
}
- (void)showMsg:(NSString *)msg {
[[[UIAlertView alloc] initWithTitle:nil message:msg delegate:nil cancelButtonTitle:nil otherButtonTitles:@"OK", nil] show];
}
- (void) receiveProxyCBNotification: (NSNotification *) notification {
if ([[notification name] isEqualToString:@"ProxyCBNotification"]) {
NSDictionary *userInfo = notification.userInfo;
NSString *funid = userInfo[@"funid"];
if ([funid hasPrefix:@"webpage_"]) {
funid = [funid substringFromIndex:8];
}
NSString *data = userInfo[@"data"];
NSLog (@"received ProxyCBNotification::funid: %@, data: %@", funid, data);
NSString *jscode = [NSString stringWithFormat:@"proxyCallback('%@', '%@');", funid, data];
[self callPageJS: jscode];
}
}
- (void) receiveCallPageNotification: (NSNotification *) notification {
if ([[notification name] isEqualToString:@"CallPageNotification"]) {
NSDictionary *userInfo = notification.userInfo;
NSString *funid = userInfo[@"funid"];
if ([funid hasPrefix:@"webpage_"]) {
funid = [funid substringFromIndex:8];
}
NSString *data = userInfo[@"data"];
NSLog (@"received CallPageNotification::funid: %@, data: %@", funid, data);
NSString *jscode = [NSString stringWithFormat:@"nativeCall('%@', '%@');", funid, data];
[self callPageJS: jscode];
}
}
#pragma mark -- qrcode
-(void)showQRCode:(NSString *)content {
if (qrcodeReaderVC == nil) {
sqrVC = [SimpleQRViewController new];
}
sqrVC.content = content;
// next three code set transparent for simple qr view
self.definesPresentationContext = YES;
sqrVC.modalPresentationStyle = UIModalPresentationOverCurrentContext;
sqrVC.view.backgroundColor = [UIColor colorWithRed: 0.0/255.0 green: 0.0/255.0 blue: 0.0/255.0 alpha: 100.0/255.0];
[self presentViewController:sqrVC animated:YES completion:nil];
}
-(void)beginScanQRCode:(NSString *)funid title:(NSString *) title{
std::string sfunid = std::string([funid UTF8String], [funid lengthOfBytesUsingEncoding:NSUTF8StringEncoding]);
// __weak __typeof(self) weakSelf = self;
if ([QRCodeReader supportsMetadataObjectTypes:@[AVMetadataObjectTypeQRCode]]) {
// static dispatch_once_t onceToken;
dispatch_async(dispatch_get_main_queue(), ^{
// if we are active again, we don't need to do this anymore
if (qrcodeReaderVC == nil) {
QRCodeReader *reader = [QRCodeReader readerWithMetadataObjectTypes:@[AVMetadataObjectTypeQRCode]];
qrcodeReaderVC = [QRCodeReaderViewController readerWithCancelButtonTitle:@"Cancel" codeReader:reader startScanningAtLoad:YES showSwitchCameraButton:YES showTorchButton:YES];
qrcodeReaderVC.modalPresentationStyle = UIModalPresentationFormSheet;
}
[qrcodeReaderVC setCompletionWithBlock:^(NSString *resultAsString, NSError *error){
if (error != nil) {
[self nativeCb:funid hasErr:YES dataStr: error.localizedDescription];
} else {
NSLog(@"scan result: %@", resultAsString);
[self nativeCb:funid hasErr:NO dataStr: resultAsString];
}
}];
[self presentViewController:qrcodeReaderVC animated:YES completion:NULL];
});
}
}
-(void)scanQRCode:(NSString *)funid title:(NSString *) title{
NSLog(@"scanQRCode:: funId: %@ title: %@", funid, title);
__weak __typeof(self) weakSelf = self;
[LBXPermission authorizeWithType:LBXPermissionType_Camera completion:^(BOOL granted, BOOL firstTime) {
if (granted) {
[weakSelf beginScanQRCode:funid title:title];
}
else if(!firstTime) {
[LBXPermissionSetting showAlertToDislayPrivacySettingWithTitle:@"Error" msg:@"The camera is need to scan QR codes" cancel:@"Cancel" setting:@"Setting" completion:^{
[weakSelf nativeCb:funid hasErr:YES dataStr: @"no permission, need resend"];
}];
}
}];
}
@end