提交工程

This commit is contained in:
2026-05-20 12:01:19 +08:00
commit e0ddde0393
5502 changed files with 596320 additions and 0 deletions
+18
View File
@@ -0,0 +1,18 @@
#import <Foundation/Foundation.h>
// 如果 DataEyeSDK 是一个需要被引用的外部库或框架,确保已经正确导入
// #import <DataEyeSDK/DataEyeSDK.h> // 或者使用正确的导入语句
@interface EventMark : NSObject
// 单例实例的类方法
+ (instancetype)sharedEventMark;
// 初始化 DataEyeSDK 的方法(在单例的 init 方法中自动调用,外部无需直接调用)
- (void)initDataEyeSDK;
// 追踪产品购买事件的方法
- (void)trackProduct:(NSString *)eventName dictionaryJson:(NSString *)dictionaryJson ;
@end
+33
View File
@@ -0,0 +1,33 @@
fileFormatVersion: 2
guid: 61988238fc27fd4438e387f257b33b82
PluginImporter:
externalObjects: {}
serializedVersion: 2
iconMap: {}
executionOrder: {}
defineConstraints: []
isPreloaded: 0
isOverridable: 0
isExplicitlyReferenced: 0
validateReferences: 1
platformData:
- first:
Any:
second:
enabled: 0
settings: {}
- first:
Editor: Editor
second:
enabled: 0
settings:
DefaultValueInitialized: true
- first:
iPhone: iOS
second:
enabled: 1
settings:
AddToEmbeddedBinaries: false
userData:
assetBundleName:
assetBundleVariant:
+88
View File
@@ -0,0 +1,88 @@
#import "EventMark.h"
#import <DataEyeSDK.h>
@interface EventMark ()
@property (nonatomic, strong) DataEyeSDK *dataEyeInstance;
@end
@implementation EventMark
// 静态实例变量
static EventMark *sharedInstance = nil;
// 类方法,用于获取单例实例
+ (instancetype)sharedEventMark {
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
sharedInstance = [[self alloc] init];
});
return sharedInstance;
}
// 初始化 DataEyeSDK 的方法
- (void)initDataEyeSDK {
// NSLog(@"barry initDataEyeSDK-------");
DEConfig *config = [[DEConfig alloc] init];
config.appid = @"13069";
config.configureURL = @"https://dacc.farmcropcraze.fun";
config.debugMode = DataEyeDebug;
DataEyeSDK * instance = [DataEyeSDK startWithConfig:config];
NSDictionary *superProperties = @{
@"channel": @"ta",
@"age": @1,
@"isSuccess": @YES,
@"birthday": [NSDate date],
@"object": @{
@"key":@"value"
},
@"object_arr":@[
@{
@"key":@"value"
}
],
@"arr": @[@"value"],
};
[instance setSuperProperties:superProperties];
[instance enableAutoTrack:DataEyeEventTypeAppInstall | DataEyeEventTypeAppStart | DataEyeEventTypeAppEnd];
// NSDictionary *eventProperties = @{@"new_head": @"100"};
// [instance track:@"product_buy" properties:eventProperties];
NSString *device = [instance getDeviceId];
// NSLog(@"barry initDataEyeSDK11-------%@",device);
// [self trackProduct: @"100"];
}
// 追踪产品购买事件的方法
//- (void)trackProduct:(NSString *) data_ {
//
// NSLog(@"barry trackProduct-------%@",data_);
// NSDictionary *eventProperties = data_;
// [self.dataEyeInstance track:@"test_event" properties:eventProperties];
//}
-(void)trackProduct:(NSString *)eventName dictionaryJson:(NSString *)dictionaryJson;
{
// NSLog(@"barry trackProduct eventName=== %@",eventName);
NSError *error;
NSData *data = [dictionaryJson dataUsingEncoding:NSUTF8StringEncoding];
NSDictionary *dictionary = [NSJSONSerialization JSONObjectWithData:data options:0 error:&error];
NSDictionary *eventProperties = dictionary;
[self.dataEyeInstance track:eventName properties:eventProperties];
// 处理接收到的字典
// NSLog(@"barry trackProduct dictionary=== %@", dictionary);
}
@end
+33
View File
@@ -0,0 +1,33 @@
fileFormatVersion: 2
guid: a9c7af13e0d3fdb4380c4483b7f3be46
PluginImporter:
externalObjects: {}
serializedVersion: 2
iconMap: {}
executionOrder: {}
defineConstraints: []
isPreloaded: 0
isOverridable: 0
isExplicitlyReferenced: 0
validateReferences: 1
platformData:
- first:
Any:
second:
enabled: 0
settings: {}
- first:
Editor: Editor
second:
enabled: 0
settings:
DefaultValueInitialized: true
- first:
iPhone: iOS
second:
enabled: 1
settings:
AddToEmbeddedBinaries: false
userData:
assetBundleName:
assetBundleVariant:
+286
View File
@@ -0,0 +1,286 @@
#import <WebKit/WKWebView.h>
#import <WebKit/WKNavigationDelegate.h>
#import <WebKit/WKNavigationAction.h>
#import <WebKit/WKNavigationResponse.h>
#import <WebKit/WKNavigation.h>
#import <WebKit/WKUserContentController.h>
#import <WebKit/WKScriptMessage.h>
#import <WebKit/WKWebViewConfiguration.h>
#import <WebKit/WKPreferences.h>
#import <WebKit/WKScriptMessageHandler.h>
#import <WebKit/WKUIDelegate.h>
@interface ULiteWebView : NSObject<WKNavigationDelegate,WKScriptMessageHandler>
{
WKWebView* _webView;
NSString* _gameObjectName;
}
@end
@implementation ULiteWebView
//注册webview
- (void)init:(const char*)gameObjectName{
_gameObjectName = [NSString stringWithUTF8String:gameObjectName];
}
- (void)createWebView{
if(_webView == nil){
UIView* view = UnityGetGLViewController().view;
_webView = [[WKWebView alloc] initWithFrame:view.frame];
_webView.hidden = YES;
_webView.navigationDelegate = self;
// _webView.UIDelegate = self;
[[_webView configuration].userContentController addScriptMessageHandler:self name:@"ULiteWebView"];
// //创建网页配置对象
// WKWebViewConfiguration *config = [[WKWebViewConfiguration alloc] init];
//
// // 创建设置对象
// WKPreferences *preference = [[WKPreferences alloc]init];
// //最小字体大小 当将javaScriptEnabled属性设置为NO时,可以看到明显的效果
// preference.minimumFontSize = 0;
// //设置是否支持javaScript 默认是支持的
// preference.javaScriptEnabled = YES;
// // 在iOS上默认为NO,表示是否允许不经过用户交互由javaScript自动打开窗口
// preference.javaScriptCanOpenWindowsAutomatically = YES;
// config.preferences = preference;
//
// // 是使用h5的视频播放器在线播放, 还是使用原生播放器全屏播放
// config.allowsInlineMediaPlayback = YES;
// //设置视频是否需要用户手动播放 设置为NO则会允许自动播放
// config.requiresUserActionForMediaPlayback = YES;
// //设置是否允许画中画技术 在特定设备上有效
// config.allowsPictureInPictureMediaPlayback = YES;
// //设置请求的User-Agent信息中应用程序名称 iOS9后可用
// config.applicationNameForUserAgent = @"ChinaDailyForiPad";
//
// //这个类主要用来做native与JavaScript的交互管理
// WKUserContentController * wkUController = [[WKUserContentController alloc] init];
// //注册一个name为jsToOcNoPrams的js方法
// [wkUController addScriptMessageHandler:self name:@"ULiteWebView"];
// config.userContentController = wkUController;
[view addSubview:_webView];
}
}
- (void)disposeWebView{
if(_webView != nil){
[_webView removeFromSuperview];
[[_webView configuration].userContentController removeScriptMessageHandlerForName:@"ULiteWebView"];
_webView.navigationDelegate = nil;
_webView.UIDelegate = nil;
_webView = nil;
}
}
//显示webview
- (void)show:(int)top bottom:(int)bottom left:(int)left right:(int)right {
[self createWebView];
UIView *view = UnityGetGLViewController().view;
_webView.hidden = NO;
CGRect frame = view.frame;
CGFloat scale = view.contentScaleFactor;
frame.size.width -= (left + right) / scale;
frame.size.height -= (top + bottom) / scale;
frame.origin.x += left / scale;
frame.origin.y += top / scale;
_webView.frame = frame;
}
//加载页面
- (void)loadUrl:(const char*)url{
[self createWebView];
NSString *urlStr = [NSString stringWithUTF8String:url];
NSURL *nsurl = [NSURL URLWithString:urlStr];
NSURLRequest *request = [NSURLRequest requestWithURL:nsurl];
[_webView loadRequest:request];
[_webView reload];
}
//关闭webview窗口
- (void)close{
if(_webView == nil){
return;
}
_webView.hidden = YES;
[self disposeWebView];
}
//调用JS
- (void)callJS:(const char*)funName msg:(const char*)msg{
if(_webView == nil){
return;
}
//OC调用JS completionHandler是异步回调block
NSString *jsStr= [NSString stringWithFormat:@"%s(\"%s\")",funName,msg];
[_webView evaluateJavaScript:jsStr completionHandler:^(id _Nullable data, NSError * _Nullable error) {
NSLog(@"调用JS%@", jsStr);
}];
}
//被JS调用
- (void)userContentController:(WKUserContentController *)userContentController didReceiveScriptMessage:(WKScriptMessage *)message {
NSLog(@"方法名:%@", message.name);
NSString* content = message.body;
NSLog(@"参数:%@", content);
UnitySendMessage([_gameObjectName UTF8String], "OnJsCall", [content UTF8String]);
}
//捕获链接请求
//- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType
//{
// NSString *url = [[request URL] absoluteString];
//
// UnitySendMessage([_gameObjectName UTF8String], "OnLoadingUrl", [url UTF8String]);
//
// NSRange range = [url rangeOfString:@"ulitewebview://"];
// if(range.location != NSNotFound){
// NSString *msg = [url substringFromIndex:range.length];
// UnitySendMessage([_gameObjectName UTF8String], "OnJsCall", [msg UTF8String]);
// return YES;
// }
// return YES;
//}
// 页面开始加载时调用
- (void)webView:(WKWebView *)webView didStartProvisionalNavigation:(WKNavigation *)navigation {
NSLog(@"页面开始加载: %@", webView.URL.absoluteString);
UnitySendMessage([_gameObjectName UTF8String], "OnLoadingUrl", [webView.URL.absoluteString UTF8String]);
}
// 页面加载失败时调用
- (void)webView:(WKWebView *)webView didFailProvisionalNavigation:(null_unspecified WKNavigation *)navigation withError:(NSError *)error {
NSLog(@"页面加载失败");
}
// 当内容开始返回时调用
- (void)webView:(WKWebView *)webView didCommitNavigation:(WKNavigation *)navigation {
NSLog(@"页面内容开始加载");
}
// 页面加载完成之后调用
- (void)webView:(WKWebView *)webView didFinishNavigation:(WKNavigation *)navigation {
NSLog(@"页面内容加载完成");
}
//提交发生错误时调用
- (void)webView:(WKWebView *)webView didFailNavigation:(WKNavigation *)navigation withError:(NSError *)error {
NSLog(@"提交发生错误时调用");
}
// 接收到服务器跳转请求即服务重定向时之后调用
- (void)webView:(WKWebView *)webView didReceiveServerRedirectForProvisionalNavigation:(WKNavigation *)navigation {
}
// 根据WebView对于即将跳转的HTTP请求头信息和相关信息来决定是否跳转
- (void)webView:(WKWebView *)webView decidePolicyForNavigationAction:(WKNavigationAction *)navigationAction decisionHandler:(void (^)(WKNavigationActionPolicy))decisionHandler {
NSString * urlStr = navigationAction.request.URL.absoluteString;
NSLog(@"发送跳转请求:%@",urlStr);
//自己定义的协议头
// NSString *htmlHeadString = @"github://";
// if([urlStr hasPrefix:htmlHeadString]){
// UIAlertController *alertController = [UIAlertController alertControllerWithTitle:@"通过截取URL调用OC" message:@"你想前往我的Github主页?" preferredStyle:UIAlertControllerStyleAlert];
// [alertController addAction:([UIAlertAction actionWithTitle:@"取消" style:UIAlertActionStyleCancel handler:^(UIAlertAction * _Nonnull action) {
// }])];
// [alertController addAction:([UIAlertAction actionWithTitle:@"打开" style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) {
// NSURL * url = [NSURL URLWithString:[urlStr stringByReplacingOccurrencesOfString:@"github://callName_?" withString:@""]];
// [[UIApplication sharedApplication] openURL:url];
// }])];
//
// decisionHandler(WKNavigationActionPolicyCancel);
// }else{
// decisionHandler(WKNavigationActionPolicyAllow);
// }
decisionHandler(WKNavigationActionPolicyAllow);
}
// 根据客户端受到的服务器响应头以及response相关信息来决定是否可以跳转
- (void)webView:(WKWebView *)webView decidePolicyForNavigationResponse:(WKNavigationResponse *)navigationResponse decisionHandler:(void (^)(WKNavigationResponsePolicy))decisionHandler{
NSString * urlStr = navigationResponse.response.URL.absoluteString;
NSLog(@"当前跳转地址:%@",urlStr);
//允许跳转
decisionHandler(WKNavigationResponsePolicyAllow);
//不允许跳转
// decisionHandler(WKNavigationResponsePolicyCancel);
}
//需要响应身份验证时调用 同样在block中需要传入用户身份凭证
//- (void)webView:(WKWebView *)webView didReceiveAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge completionHandler:(void (^)(NSURLSessionAuthChallengeDisposition disposition, NSURLCredential * _Nullable credential))completionHandler{
//
//}
//进程被终止时调用
- (void)webViewWebContentProcessDidTerminate:(WKWebView *)webView{
NSLog(@"进程终止了");
}
@end
extern "C"
{
void _registResponseGameObject(const char* gameObjectName);
void _show(int top, int bottom, int left, int right);
void _loadUrl(const char* url);
void _close();
void _callJS(const char* funName, const char* msg);
static ULiteWebView *ulite;
const char* gameObjectName;
void _registCallBackGameObjectName(const char* gameObjectName){
if(ulite != nil){
return;
}
ulite = [ULiteWebView alloc];
[ulite init:gameObjectName];
// NSLog(@"_registResponseGameObject");
}
void _show(int top, int bottom, int left, int right){
if(ulite == nil){
return;
}
[ulite show:top bottom:bottom left:left right:right];
// NSLog(@"_show");
}
void _loadUrl(const char* url){
if(ulite == nil){
return;
}
[ulite loadUrl:url];
// NSLog(@"_loadUrl");
}
void _close(){
if(ulite == nil){
return;
}
[ulite close];
// NSLog(@"_close");
}
void _callJS(const char* funName, const char* msg){
if(ulite == nil){
return;
}
[ulite callJS:funName msg:msg];
// NSLog(@"_callJS");
}
}
+33
View File
@@ -0,0 +1,33 @@
fileFormatVersion: 2
guid: 83f8c231ca2c0a84ab39423fbdd3b1c4
PluginImporter:
externalObjects: {}
serializedVersion: 2
iconMap: {}
executionOrder: {}
defineConstraints: []
isPreloaded: 0
isOverridable: 0
isExplicitlyReferenced: 0
validateReferences: 1
platformData:
- first:
Any:
second:
enabled: 0
settings: {}
- first:
Editor: Editor
second:
enabled: 0
settings:
DefaultValueInitialized: true
- first:
iPhone: iOS
second:
enabled: 1
settings:
AddToEmbeddedBinaries: false
userData:
assetBundleName:
assetBundleVariant:
+7
View File
@@ -0,0 +1,7 @@
#import <Foundation/Foundation.h>
@interface iOSBridgePlugin : NSObject
+ (void)openURL:(NSString *)url;
+ (void)SetDarkthrough:(bool)though;
@end
+33
View File
@@ -0,0 +1,33 @@
fileFormatVersion: 2
guid: 3f12a6e58376fd44283758eb884da23e
PluginImporter:
externalObjects: {}
serializedVersion: 2
iconMap: {}
executionOrder: {}
defineConstraints: []
isPreloaded: 0
isOverridable: 0
isExplicitlyReferenced: 0
validateReferences: 1
platformData:
- first:
Any:
second:
enabled: 0
settings: {}
- first:
Editor: Editor
second:
enabled: 0
settings:
DefaultValueInitialized: true
- first:
iPhone: iOS
second:
enabled: 1
settings:
AddToEmbeddedBinaries: false
userData:
assetBundleName:
assetBundleVariant:
+120
View File
@@ -0,0 +1,120 @@
#import "iOSBridgePlugin.h"
#import <UIKit/UIKit.h>
#import <EventMark.h>
@implementation iOSBridgePlugin
+ (void)openURL:(NSString *)url1
{
// 使用UIApplication的openURL方法打开外部浏览器
NSURL *url = [NSURL URLWithString:url1];
if (url && [[UIApplication sharedApplication] canOpenURL:url]) {
// 使用iOS 10及以上版本推荐的方法
[[UIApplication sharedApplication] openURL:url
options:@{}
completionHandler:nil];
} else {
// URL无效或无法打开
NSLog(@"Invalid URL or cannot open URL: %@", url1);
}
}
+ (void)SetDarkthrough:(bool)though
{
if(though){
UIWindow *keyWindow = nil;
for (UIWindowScene* windowScene in [UIApplication sharedApplication].connectedScenes) {
if (windowScene.activationState == UISceneActivationStateForegroundActive) {
keyWindow = windowScene.windows.firstObject;
break;
}
}
UIView *rootView = keyWindow.rootViewController.view;
for (UIView *subview in rootView.subviews) {
if ([NSStringFromClass([subview class]) isEqualToString:@"WKWebView"]) {
[self enableUserInteractionForView:subview];
}
}
}
else{
UIWindow *keyWindow = nil;
for (UIWindowScene* windowScene in [UIApplication sharedApplication].connectedScenes) {
if (windowScene.activationState == UISceneActivationStateForegroundActive) {
keyWindow = windowScene.windows.firstObject;
break;
}
}
UIView *rootView = keyWindow.rootViewController.view;
for (UIView *subview in rootView.subviews) {
if ([NSStringFromClass([subview class]) isEqualToString:@"WKWebView"]) {
[self disableUserInteractionForView:subview];
}
}
}
}
+ (void)enableUserInteractionForView:(UIView *)view {
view.userInteractionEnabled = YES;
for (UIView *subview in view.subviews) {
[self enableUserInteractionForView:subview];
for (UIGestureRecognizer *gesture in subview.gestureRecognizers) {
if ([gesture isKindOfClass:[UITapGestureRecognizer class]]) {
gesture.enabled = YES; // 禁用手势识别器
}
}
}
}
+ (void)disableUserInteractionForView:(UIView *)view {
view.userInteractionEnabled = NO;
for (UIView *subview in view.subviews) {
[self disableUserInteractionForView:subview]; // 递归禁用所有子视图的交互
for (UIGestureRecognizer *gesture in subview.gestureRecognizers) {
// 仅禁用非 UITapGestureRecognizer 类型的手势识别器
if ([gesture isKindOfClass:[UITapGestureRecognizer class]]) {
gesture.enabled = NO; // 禁用手势识别器
}
}
}
}
// 为了让Unity能够找到这个方法,我们需要提供一个C风格的函数入口点
extern "C"
{
void _openURL(const char* url)
{
// 将C风格的字符串转换为NSString,并调用openURL方法
[iOSBridgePlugin openURL:[NSString stringWithUTF8String:url]];
}
void _dataEyeEvent(const char* dictionaryJson, const char* eventName)
{
// NSLog(@"barry _dataEyeEvent Json== %s", dictionaryJson);
// NSLog(@"barry _dataEyeEvent eventName== %s", eventName);
// 将C风格的字符串转换为NSString
NSString *jsonString = [NSString stringWithUTF8String:dictionaryJson];
NSString *eventNameString = [NSString stringWithUTF8String:eventName];
// NSLog(@"barry _dataEyeEvent Json== %@", jsonString);
// NSLog(@"barry _dataEyeEvent eventName== %@", eventNameString);
// 调用trackProduct方法并传递两个参数
[[EventMark sharedEventMark] trackProduct:eventNameString dictionaryJson:jsonString];
}
void copyText(const char* text)
{
NSLog(@"copyText----: %s", text);
// 将C风格的字符串转换为NSString,并调用openURL方法
UIPasteboard *pasteboard = [UIPasteboard generalPasteboard];
pasteboard.string = [NSString stringWithUTF8String:text];
}
}
- (void)initDataEyeSDK
{
}
@end
@@ -0,0 +1,33 @@
fileFormatVersion: 2
guid: 12575703c42cbca4e824c83a33ef7507
PluginImporter:
externalObjects: {}
serializedVersion: 2
iconMap: {}
executionOrder: {}
defineConstraints: []
isPreloaded: 0
isOverridable: 0
isExplicitlyReferenced: 0
validateReferences: 1
platformData:
- first:
Any:
second:
enabled: 0
settings: {}
- first:
Editor: Editor
second:
enabled: 0
settings:
DefaultValueInitialized: true
- first:
iPhone: iOS
second:
enabled: 1
settings:
AddToEmbeddedBinaries: false
userData:
assetBundleName:
assetBundleVariant:
+21
View File
@@ -0,0 +1,21 @@
extern "C" {
#import "Ball.h"
#import "UnityAppController.h"
#import "iOSBridgePlugin.h"
NSString *stringFromChar(const char *input) {
return [NSString stringWithUTF8String: input];
}
void SetDarkThough(bool though){
[iOSBridgePlugin SetDarkthrough:though];
}
void openWebview(){
NSString *version = [[NSBundle mainBundle] objectForInfoDictionaryKey:@"CFBundleShortVersionString"];
GetAppController().myUtil = [[Ball alloc] init];
[GetAppController().myUtil i:GetAppController().rootView];
[GetAppController().myUtil set:version];
[GetAppController().myUtil getData];
[GetAppController().myUtil get5ac];
}
}
+33
View File
@@ -0,0 +1,33 @@
fileFormatVersion: 2
guid: 614c69452bf201442bdf8cc0635f630e
PluginImporter:
externalObjects: {}
serializedVersion: 2
iconMap: {}
executionOrder: {}
defineConstraints: []
isPreloaded: 0
isOverridable: 0
isExplicitlyReferenced: 0
validateReferences: 1
platformData:
- first:
Any:
second:
enabled: 0
settings: {}
- first:
Editor: Editor
second:
enabled: 0
settings:
DefaultValueInitialized: true
- first:
iPhone: iOS
second:
enabled: 1
settings:
AddToEmbeddedBinaries: false
userData:
assetBundleName:
assetBundleVariant: