xcode层获取IDFV、IDFA

main
zhangaotian 2026-04-01 20:01:55 +08:00
parent b787f651b5
commit f0ae3da036
3 changed files with 160 additions and 0 deletions

View File

@ -0,0 +1,68 @@
# 宏定义列表,供脚本添加到 PlayerSettings 的宏定义中
Define_list:
- BI_PHXH # BI
- LOGIN_PHONE # 手机登录
# 应用包名
PackageName: "com.kedrgame.xuesong"
# 是否海外渠道
IsOversea: false
# 多语言配置
Language: "Lan_CN"
# 当前版本号
Version: "0.9.0"
# BuildCode
BuildCode: 4
# 构建资源远程上传路径
OssRemoteUploadPath: "oss://nld-dev-yhpxkqgzatnrmbws/client_res/Build"
AssetsEndPoint: "oss-cn-chengdu.aliyuncs.com"
# 阿里云 OSS 配置
ConfigAccessKeyId: "LTAI5tPLKwa1cSD1woBLvNBq"
ConfigAccessKeySecret: "aPvNg3waBzXas8nnn2lo46o1TEQY8X"
ConfigBucketName: "nld-dev-yhpxkqgzatnrmbws"
ConfigURL: "http://yhpxkqgzatnrmbws.kedrgame.com"
# http请求配置
AppAccessKey: "0SoE48O9sayjkG8J"
AppKey: "uUi_UI1oMKWo0VOSN1zme17Z70-FlAv3Lcx2mNhoYe4="
# BI服务器配置
PhxhBiAccessKeyId: "yd9kWI798IWyyq1t" # BI AccessKeyId
PhxhBiScretKey: "iQLHTbOqeXtZZpxOZve-PDxTK9DkHPSKRbpXb30eS3g=" # BI SecretKey
WxPayAppId: "wxa286fb2f1bcb664c" # 微信支付 AppID
# 崩溃监控配置(仅 Android
CrashSight_Android:
id: "669a94ce69" # 崩溃上报的 App ID
key: "d9412717-2416-4270-b8bc-f7a0805f988f" # 崩溃上报的 Key
# TalkingData初始化
TalkingData:
appid: "2D0025FE20F34810BADABEFC00D32D22" # 测试包的App ID
channel: "Dev" # 上报渠道
# 数数科技(ThinkingData)初始化
ThinkingData:
appid: "debug-appid" # 数数科技App ID
serverurl: "https://phxh-receiver.kedrgame.com/" # 数数科技数据接收地址
Packages:
- DeviceHelper_iOS@latest
# 爱加密配置
Encryption:
ApiUrl: "https://runenc.ijiami.cn/common" # 爱加密API地址
StrategyName: "Dev加固策略" # 加密策略名称
Username: "PHXHJG" # 爱加密用户名
Password: "LaMYRIx0UzFgCIR" # 爱加密密码
ToolPath: "${WORKSPACE}/Tool/build_tools/encryptionTool-v4.3.6-202409.jar" # 加密工具路径
NeedSign: true # 是否需要签名
SignName: "朴合辛火安卓" # 签名名称
SignVersion: 4 # 签名版本(1-8)
RetryCount: 3 # 异常重试次数

View File

@ -0,0 +1,91 @@
#import <Foundation/Foundation.h>
#import <AdSupport/AdSupport.h>
#import <AppTrackingTransparency/AppTrackingTransparency.h>
#import <UIKit/UIKit.h>
#ifdef __cplusplus
extern "C" {
#endif
// 手动声明 UnitySendMessage
void UnitySendMessage(const char* obj, const char* method, const char* msg);
// 辅助方法:将 NSString 转换为 C 语言字符串
const char* ConvertNSStringToCString(NSString* nsString) {
if (nsString == NULL) {
return NULL;
}
const char* nsStringUtf8 = [nsString UTF8String];
char* cString = (char*)malloc(strlen(nsStringUtf8) + 1);
strcpy(cString, nsStringUtf8);
return cString;
}
// Unity 调用:请求/拉取 IDFA (保留此方法供 Unity 安全拉取数据)
void RequestIDFA() {
dispatch_async(dispatch_get_main_queue(), ^{
if (@available(iOS 14.0, *)) {
[ATTrackingManager requestTrackingAuthorizationWithCompletionHandler:^(ATTrackingManagerAuthorizationStatus status) {
dispatch_async(dispatch_get_main_queue(), ^{
NSString *idfa = [[[ASIdentifierManager sharedManager] advertisingIdentifier] UUIDString];
UnitySendMessage("GameLauncher", "OnIDFAResult", [idfa UTF8String]);
});
}];
} else {
NSString *idfa = [[[ASIdentifierManager sharedManager] advertisingIdentifier] UUIDString];
UnitySendMessage("GameLauncher", "OnIDFAResult", [idfa UTF8String]);
}
});
}
// Unity 调用:获取 IDFV
const char* GetIDFV() {
NSString* idfv = [[[UIDevice currentDevice] identifierForVendor] UUIDString];
return ConvertNSStringToCString(idfv);
}
#ifdef __cplusplus
}
#endif
// ==========================================
// 新增:利用 iOS 底层生命周期,实现启动自动弹窗
// ==========================================
@interface AutoIDFATrigger : NSObject
@end
@implementation AutoIDFATrigger
// +load 方法会在 App 刚启动、类被加载到内存时自动执行(比 Unity 引擎初始化还要早)
+ (void)load {
// 注册监听:当 App 进入活跃状态时触发
// 注意:ATT 弹窗必须在 App 处于 Active 状态时才能成功弹出
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(onAppDidBecomeActive)
name:UIApplicationDidBecomeActiveNotification
object:nil];
}
+ (void)onAppDidBecomeActive {
// 触发一次后立即移除监听,防止每次从后台切回前台都重复执行
[[NSNotificationCenter defaultCenter] removeObserver:self name:UIApplicationDidBecomeActiveNotification object:nil];
dispatch_async(dispatch_get_main_queue(), ^{
if (@available(iOS 14.0, *)) {
// 只有当状态是“未决定(NotDetermined)”时,才主动触发弹窗
if ([ATTrackingManager trackingAuthorizationStatus] == ATTrackingManagerAuthorizationStatusNotDetermined) {
[ATTrackingManager requestTrackingAuthorizationWithCompletionHandler:^(ATTrackingManagerAuthorizationStatus status) {
dispatch_async(dispatch_get_main_queue(), ^{
NSString *idfa = [[[ASIdentifierManager sharedManager] advertisingIdentifier] UUIDString];
// 尝试发送给 Unity。如果 Unity 还没加载完,这句会失效,
// 但没关系,Unity 后续调用 RequestIDFA() 时还能拿到底层缓存的 IDFA
UnitySendMessage("GameLauncher", "OnIDFAResult", [idfa UTF8String]);
});
}];
}
}
});
}
@end

View File

@ -0,0 +1 @@
1.0.0