章鱼移动广告平台流量方 API 接入文档
版本历史
版本 | 日期 | 备注 |
---|---|---|
1.0 | 2018-01-28 | 初版 |
1.0 | 2018-01-31 | 1.0 版本完成 |
1.1 | 2020-03-29 | 参数修改:安卓传 oaid;视频广告修改;下载广告增加 |
1.2 | 2020-06-05 | 参数增加: device 增加 ssid、rom_version、sys_compiling_time; |
1.3 | 2021-04-12 | 增加: hms、ag、maker、ppi; |
1.4 | 2021-07-21 | 参数修改:imei 格式问题; |
1.5 | 2021-09-09 | 增加 os 参数值 |
1.6 | 2021-10-26 | 增加 ad_type, 增加 imeimd5、macmd5 |
1.7 | 2022-01-14 | 参数添加:device 增加 boot_mark; update_mark aaid_ios 响应添加:wx_mini_user、wx_mini_path |
1.8 | 2022-03-07 | 更新错误响应代码 |
1.9 | 2022-04-08 | 添加设备唯一 id 规范过滤和操作系统版本过低过滤 |
1.9.1 | 2022-04-11 | 新添字段 androidid_md5 |
2.0 | 2022-04-20 | 添加广协 CAID 方案所需参数 |
2.0.1 | 2022-07-14 | 添加请求底价 bidfloor 并添加曝光结算价格宏替换 |
2.0.2 | 2022-10-08 | 添加点击坐标宏替换 |
2.1 | 2022-10-03 | 添加上报时间戳宏替换 |
3.0 | 2022-11-17 | 修改 api 文档格式更新响应示例并添加新宏替换参数{TS_S}、{TS_M} |
3.1 | 2022-12-05 | 添加 app 包名列表:app_list |
3.2 | 2023-01-12 | 添加是否支持视频素材: is_video |
3.3 | 2023-03-08 | vendor 字段更新 |
3.4 | 2023-05-06 | 新增 post 请求方式 |
3.5 | 2023-05-22 | 优化点击坐标宏替换 |
3.5.1 | 2023-06-15 | 新增 paid 参数 |
3.5.2 | 2023-12-08 | 新增下载类参数详情参见 download 对象 |
3.5.3 | 2024-2-01 | 新增 oaid_md5 |
3.5.4 | 2024-2-28 | 新增 mac 参数格式校验 |
3.5.5 | 2024-3-22 | 新增竞价失败上报 |
广告请求
接口使用 HTTP 协议,参数通过 POST 方式传递,支持长链接。
注意:请求为 post 请求时需在请求地址后添加技术分配的关键字(例如:http://test.s.adintl.cn/t/s2s/ZYYD)
正式接口地址需在测试环境测试没问题后向我方申请
测试接口地址: http://test.s.adintl.cn/t/s2s/技术分配关键字
请求参数:
BidRequest
名称 | 类型 | 是否必填 | 描述 |
---|---|---|---|
version | string | 是 | api 版本。形如 major.minor,当前版本取值:2.1 |
id | string | 是 | 请求唯一标识 |
imp | array of ImpObject | 是 | imp 对象 |
slot_id | string | 是 | 广告位 ID-由章鱼移动广告平台生成 |
bidfloor | double | 可选 | 请求底价(RTB 必填 单位为分) |
is_video | String | 可选 | 是否支持视频素材 “1”:支持视频素材 “0”:不支持视频素材, 默认为 0 |
ip | string | 是 | 手机终端的 ip |
app | AppObject | 是 | app 信息 |
device | DeviceoObject | 是 | 设备相关信息 |
gps | GpsObject | 选填 | 地理位置信息 |
ImpObject
名称 | 类型 | 是否必填 | 描述 |
---|---|---|---|
id | string | 是 | 请求唯一标识与 bidRequest 中 id 相同 |
bidfloor | double | 可选 | 请求底价(RTB 必填 单位为分) |
AppObject
名称 | 类型 | 是否必填 | 描述 |
---|---|---|---|
name | string | 是 | app name |
version | string | 是 | app 版本 |
bundle | string | 是 | app 包名。对于 Android,是应用的 packageName;对于 iOS,是 Bundle identifier |
DeviceoObject
名称 | 类型 | 是否必填 | 描述 |
---|---|---|---|
os | string | 是 | 操作系统类型 1:android;2:ios; 3: ott 终端 (最终请求数据传 1 2 3) |
os_version | string | 是 | 操作系统版本 |
connectiontype | int | 否 | 联网方式 0: 其它 1: WIFI, 2: 2G, 3: 3G, 4: 4G, 5: 5G |
ua | string | 是 | 设备的 user-agent,若没有该字段则需要在 http header 中填充设备的 ua |
width | int | 选填 | 屏幕宽。取设备物理像素 |
height | int | 选填 | 屏幕高。取设备物理像素 |
imei | string | 否 | Android 必填。手机设备的 IMEI,格式要求 [0-9]15 |
imeimd5 | string | 否 | imei 的 md5 值,32 位小写 |
boot_mark | string | 选填 | 设备相关标识 |
update_mark | string | 选填 | 设备相关标识 |
aaid_ios | string | 选填 | 阿里设备标识 |
oaid | string | 是 | Android 必填。安卓必填,因 andoridQ 版本无法获取 imei |
oaid_md5 | string | 是 | - |
paid | string | 选填 | 拼多多 IOS 设备标识 |
idfa | string | 是 | iOS 必填。iOS 设备的 IDFA,格式要求 [0-9a-fA-F]8-[0-9a-fA-F]4-[0-9a-fA-F]4-[0-9a-fA-F]4-[0-9a-fA-F]12 |
openudid | string | 是 | iOS 必填。iOS 设备唯一标志码,idfa 关闭时使用 |
caid | string | 是 | iOS 需要 中广协 CAID |
caidVer | string | 是 | iOS 需要 caid 对应的版本号 |
carrier | int | 选填 | 运营商 0: 其它,1: 移动,2:联通,3: 电信 |
ext | ExtObject | 是 | 配置信息拓展 |
ssid | string | 否 | ⽆线⽹ SSID 名称,如获取不到可传空,例如:wifi ssid MGSSID |
rom_version | string | 否 | ⼿机 ROM 的版本,如获取不到可传空 |
androidid_md5 | string | 否 | android 用户终端的 AndroidID MD5 值 |
aaid | string | 否 | Android Advertising ID |
model | string | 必填 | 设备型号 |
hms | string | 选填 | 华为应用市场的版本号(华为必填) |
ag | string | 选填 | 华为 AG 的版本号(华为必填) |
make | string | 必填 | 手机硬件制造商/ 设备品牌 |
ppi | int | 必填 | 屏幕像素密度 |
hardware_machine | string | 选填 | 设备 machine _ caid 必传参数 _ |
startup_time | string | 选填 | 设备启动时间 _ caid 必传参数 _ |
mb_time | string | 选填 | 系统版本更新时间 _ caid 必传参数 _ |
country_code | string | 选填 | 国家 _ caid 必传参数 _ |
carrier_name | string | 选填 | 运营商名称 _ caid 必传参数 _ |
mem_total | int | 选填 | 内存空间,字节 _ caid 必传参数 _ |
disk_total | int | 选填 | 磁盘总空间,字节 _ caid 必传参数 _ |
local_tz_name | string | 选填 | 时区 _ caid 必传参数 _ |
hardware_model | string | 选填 | 设备 model _ caid 必传参数 _ |
ios_os_version | string | 选填 | 系统版本 _ caid 必传参数 _ |
language | string | 选填 | 语言 _ caid 必传参数 _ |
phone_name | string | 选填 | 设备名称(小写 MD5) _ caid 必传参数 _ |
auth_status | string | 选填 | 广告授权情况 |
cpu_num | string | 选填 | cpu 数目 |
app_list | string | 选填 | app 包名列表 (多个以逗号分割例如:"com.xxx,com.xxx,com.xxx") |
geo | GpsObject | 选填 | 地理位置信息 |
ExtObject
名称 | 类型 | 是否必填 | 描述 |
---|---|---|---|
mac | string | 必填 | 设备 WiFi 网卡 MAC 地址 |
macmd5 | string | 选填 | mac 的 md5 值, 32 位小写 |
androidId | string | 必填 | android 用户终端的 AndroidID |
aaid | string | 否 | Android Advertising ID |
GpsObject
名称 | 类型 | 是否必填 | 描述 |
---|---|---|---|
lat | float | 选填 | 纬度 |
lng | float | 选填 | 经度 |
timestamp | float | 选填 | 获取经纬度的时间。其值为从 GMT 1970-01-01 00:00:00 至今的秒值 |
请求示例:
post 请求:
{
"app": {
"bundle": "com.test",
"name": "test",
"version": "1.6.0"
},
"bidfloor": 0.0,
"device": {
"androidid_md5": "22",
"carrier": 0,
"connectiontype": 4,
"country_code": "CN",
"cpu_num": "8",
"disk_total": 116641464320,
"ext": {
"androidId": "1111111111111111",
"mac": "20:00:00:00:00:00",
"macmd5": "macmd5"
},
"hardware_machine": "PD2057",
"hardware_model": "V2057A",
"height": 2216,
"hms": "39920",
"ios_os_version": "10",
"language": "zh",
"local_tz_name": "中国标准时间",
"make": "vivo",
"mem_total": 7920685056,
"model": "V2057A",
"oaid": "00000-00000-0000",
"paid": "adada",
"imei": "000001000001000",
"imeimd5": "00000000000000000000000000000000",
"os": "1",
"os_version": "10",
"ppi": 480,
"ua": "ua",
"width": 1080
},
"id": "1659035906721587200",
"imp": [
{
"bidfloor": 1.0,
"id": "1659035906721587200",
"secure": 1
}
],
"ip": "127.0.0.1",
"is_video": "0",
"slot_id": "10001",
"version": "2.1"
}
广告响应
BidResponse
属性 | 类型 | 描述 |
---|---|---|
code | Int | 响应编码。详情查看 3.2 响应状态码解释 |
resp_id | String | 响应唯一标识 |
data | BidDataObject | 响应的广告内容 |
BidDataObject
属性 | 类型 | 描述 |
---|---|---|
ads | array of AdsObject; optional | 广告列表 |
AdsObject
属性 | 类型 | 描述 |
---|---|---|
ad_type | int; optional | 落地页类型 1:普通跳转类 2:下载类 3:小程序 |
price | int; optional | 价格(单位分) |
adid | String; optional | 广告主 id |
native | NativeObject; optional | Native 对象 |
NativeObject
属性 | 类型 | 描述 |
---|---|---|
assets | array of AssetObject; required | asset 列表, 根据 request 里的 asset id, 填充相应的物料。 |
link | LinkObject; required | Native 广告点击目标地址 |
download | DownloadObject; optional | 下载类对象 |
imptrackers | array; optional | impression 跟踪列表, 当广告发生展示时触发,通常返回 204 或者 1*1 的跟踪图片。(RTB 模式需要价格宏替换 详细参考 3.1 支持的宏替换) |
lurl | string | 竞价失败上报 需支持宏替换 详情参考 3.1 支持的宏替换 |
wx_mini_user | string; optional | 微信小程序原始 id |
wx_mini_path | string; optional | 微信小程序路径 |
download_track_urls | array; optional | 下载行为上报地址集合,当通过广告开始下载时,需要向该集合中所有的 url 发送请求。 |
downloaded_track_urls | array; optional | 下载完成上报地址集合,当通过广告下载完成时,需要向该集合中所有的 url 发送请求 |
installed_track_urls | array; optional | 安装完成上报地址集合,当通过广告下载后并安装完成时,需要向该集合中所有的 url 发送请求 |
open_track_urls | array; optional | 安装完成后打开 app 上报 |
deeplinktrackers | array of DeeplinkImp; optional | deeplink 相关上报 |
DownloadObject
属性 | 类型 | 描述 |
---|---|---|
app_name | string; optional | APP 名称 |
package_name | string; optional | APP 包名 |
app_desc | string; optional | app 描述 |
app_version | string; optional | APP 版本号 |
developer_name | string; optional | 开发者信息 |
privacy_url | string; optional | 隐私协议链接 |
permissions_url | string; optional | 用户权限链接 |
app_download_url | string; optional | 下载地址 |
app_icon_url | string; optional | app icon 图片地址 |
app_size | int; optional | 下载包大小,单位 B |
file_md5 | string; optional | 文件 md5 |
DeeplinkImp
属性 | 类型 | 描述 |
---|---|---|
event | int; required | deeplink 相关事件类型,⻅附录 deeplink 事件 |
imp | string array; optional | deeplink 相关事件的监控地址 |
deeplink 事件
值 | 描述 |
---|---|
101 | deeplink 检测到已安装 |
102 | deeplink 检测未安装(未安装调起失败) |
103 | deeplink 安装调起成功 |
104 | deeplink 安装调起失败 |
AssetObject
属性 | 类型 | 描述 |
---|---|---|
id | int; required | 章鱼内部使用 |
title | TitleObject; optional | title 对象 |
img | ImageObject; optional | image 对象 |
video | VideoObject; optional | video 对象 |
data | DataObject; optional | data 对象 |
DataObject
属性 | 类型 | 描述 |
---|---|---|
value | string; required | 描述信息 |
TitleObject
属性 | 类型 | 描述 |
---|---|---|
text | string; required | title 文本 |
ImageObject
属性 | 类型 | 描述 |
---|---|---|
url | string; required | 图片 url |
w | int; | 图片宽度, 单位象素 |
wmin | int; recommended | 图片最小宽度, 单位象素 |
h | int; | 图片高度, 单位象素 |
hmin | int; recommended | 图片最小高度, 单位象素 |
type | int; | 图片类型 1. ICON 表示 logo 等小图标 3. MAIN 素材的图片 (如信息流广告中的广告主 LOGO,三图, 则 1 代表 LOGO,3 代表其他三图) |
VideoObject
属性 | 类型 | 描述 |
---|---|---|
video_url | string; required | 视频 url |
cover_url | string; required | 封面图 url |
duration | int;recommended | 广告时长,单位为秒 |
cover_width | int; recommended | 封面图片宽度, 单位象素 |
cover_height | int; recommended | 封面图片高度, 单位象素 |
event_imp | array of EventImp | 视频播放相关监控 |
EventImpObject
属性 | 类型 | 描述 |
---|---|---|
event | int; required | 视频播放相关事件类型,见附录视频播放事件 |
imp | string array; optional | 视频播放相关事件的监控地址 |
视频播放事件
值 | 描述 |
---|---|
0 | 播放开始 |
1 | 四分之一 |
2 | 二分之一 |
3 | 四分之三 |
4 | 播放完成 |
5 | 用户暂停播放 |
6 | 用户退出播放 |
LinkObject
属性 | 类型 | 描述 |
---|---|---|
url | string; required | 广告目标地址 |
clicktrackers | string array; optional | 第三方的跟踪 tURLs, 当用户发生广告点击时触发(部分需支持点击坐标宏替换 详情查看 3.1) |
fallback | string; optional | 用于 deeplink 广告,如果存在该字段,且不为空,则会认为广告需要做 deeplink 跳转; url 字段是 deep link, 当用户没有对应的 App, 则使用 fallback 里的 url |
响应示例:
{
"code": 0, // 0:成功 非 0:失败 (详细参考3.2响应状态码解释响)
"resp_id": "87850d203e314ca78bef4235d95dbf1c", // 响应 id,定位唯一的响应
"data": {
"ads": [
{
"id": "648d8ec2642c4febb902682a02925627", // 标识唯一 ID
"ad_type": 1, // 1:普通跳转类 2:下载类 3:小程序
"native": {
"assets": [
{
"id": 0, // 无实际意义
"img": { //图片素材
"url": "https://x.xxxxx.xx/creatives-assets/prod/feupload/user/3qok7/f8132c80-fcad-11eb-b627-030776f72f2f.jpg",
"w": 640,
"h": 960,
"type": 3
}
},
{
"id": 1,
"title": {
"text": "标题信息"
}
},
{
"id": 2,
"data": {
"text": "描述信息"
}
},
{
"id": 6,
"video": { //视频素材
"duration": 22,
"cover_url": "https://xxx.jpg",
"video_url": "https://xxx.mp4",
//视频检测链接
"event_imp": [
{
"event": 4,
"imp": [
"http://127.0.0.1:20009/video/complete"
]
},
{
"event": 1,
"imp": [
"http://127.0.0.1:20009/video/quarter"
]
},
{
"event": 2,
"imp": [
"http://127.0.0.1:20009/video/half"
]
},
{
"event": 3,
"imp": [
"http://127.0.0.1:20009/video/treequarter"
]
},
{
"event": 5,
"imp": [
"http://127.0.0.1:20009/video/paused"
]
},
{
"event": 6,
"imp": [
"http://127.0.0.1:20009/video/quit"
]
}
],
"cover_width": 640,
"cover_height": 960
},
"required": 1
}
],
"download":{
"app_name":"xx",
"app_version":"1.1.0",
"app_size":1024,
"file_md5":"xx",
"package_name":"xx",
"developer_name":"xx",
"privacy_url":"xx",
"app_icon_url":"xx",
"app_desc":"xx",
"app_download_url":"xx",
"permissions_url":"xx"
},
"link": {
"url": "https://x.xxxxx.xx/stage/download.html?url=xxxxxx",
"fallback": "https://x.xxxxx.xx/stage/download.html?url=xxxxxx",
"clicktrackers": [
"http://127.0.0.1:20009/clk?ex=xxxxxx"
]
},
"imptrackers": [
"http://127.0.0.1:20009/win?ads=s2s&ex=xxxxxx"
],
"wx_mini_user": "setWx_mini_user test",
"wx_mini_path": "setWx_mini_path test",
"download_track_urls": [
"https://x.xxxxx.xx/dd1?code=0&rid=87850d203e314ca78bef4235d95dbf1c"
],
"downloaded_track_urls": [
"https://x.xxxxx.xx/dd2?code=0&rid=87850d203e314ca78bef4235d95dbf1c"
],
"installed_track_urls": [
"https://x.xxxxx.xx/i1?code=0&rid=87850d203e314ca78bef4235d95dbf1c"
],
"open_track_urls": [
"https://x.xxxxx.xx/o1?code=0&rid=87850d203e314ca78bef4235d95dbf1c"
],
"deeplinktrackers": [
{
"event": 103,
"imp": [
"http://127.0.0.1:20009/deepLink?ex=xxxxxx",
"https://x.xxxxx.xx/dp?code=103&rid=87850d203e314ca78bef4235d95dbf1c"
]
}
]
},
"price": 5013, //出价(单位为分)
"adid": "10698"
}
]
}
}
参数获取方式参考
//获取 AG 版本号
private static String directGetAgVersionCode(Context context) {
String version;
version = getVersionCode(context, Constants.AG_PACKAGE); if (version == null)
{
version = Constants.NOT_FOUND;
}
return version;
}
其中 Constants.AG_PACKAGE 为华为应用市场,如 com.huawei.appmarket
// 获取 HMS 版本号
public static String directGetHmsVersionCode(Context context) {
String version;
version = getVersionCode(context, Constants.HMS_PACKAGE);
if (version == null) {
version = Constants.NOT_FOUND;
}
return version;
}
// 根据包名获取应用版本号
public static String getVersionCode(Context context, String pkgName) {
try {
PackageInfo pkgInfo = ApkUtil.getPackageInfo(context, pkgName);
return pkgInfo == null ? null : String.valueOf(pkgInfo.versionCode);
} catch (AndroidRuntimeException e) {
HiAdLog.w(TAG, "getVersionCode fail");
} catch (Exception e) {
HiAdLog.w(TAG, "getVersionCode fail");
}
return null;
}
其中 Constants.HMS_PACKAGE 为 HMS core 包名,如 com.huawei.hwid
设备启动时间
static time_t bootSecTime(){
struct timeval boottime;
size_t len = sizeof(boottime);
int mib[2] = { CTL KERN, KERN BOOTTIME };
if( sysctl(mib, 2, &boottime, &len, NULL, 0) < 0 ) {
return 0;
}
return boottime.tv sec;
}
+(NSString *)bootTimeInSec
{
return [NSString stringWithFormat:@"%ld",bootSecTime()];
}
国家
+(NSString *)countryCode
{
NSLocale *locale = [NSLocale currentLocale];
NSString *countryCode = [locale objectForKey:NSLocaleCountryCode];
return countryCode;
}
语言
+(NSString *)language {
NSString *language;
NSLocale *locale = [NSLocale currentLocale];
if ([[NSLocale preferredLanguages] count] > 0) {
language = [[NSLocale preferredLanguages]objectAtIndex:0];
}else {
language = [locale objectForKey:NSLocaleLanguageCode];
}
return language;
}
设备名称
+(NSString *)deviceName
{
if ([[[UIDevice currentDevice] name] length] == 0)
{
return nil;
}
return [CAIDMD5Util md5HexDigest:[[UIDevice currentDevice] name]];
}
系统版本
+(NSString *)systemVersion
{
return [[UIDevice currentDevice] systemVersion];
}
设备Machine
+(NSString *)machine
{
NSString *machine = getSystemHardwareByName(SIDFAMachine);
return machine == nil ? @"" : machine;
}
static const char *SIDFAMachine = "hw.machine";
static NSString *getSystemHardwareByName(const char *typeSpecifier) {
size_t size;
sysctlbyname(typeSpecifier, NULL, &size, NULL, 0);
char *answer = malloc(size);
sysctlbyname(typeSpecifier, answer, &size, NULL, 0);
NSString *results = [NSString stringWithUTF8String:answer];
free(answer);
return results;
}
运营商
此部分代码需映射 {{string1}} =中国移动 {{string2 }}=中国联通 {{string3 }}=中国电信 {{string4 }}=中国卫通 {{string5 }}=中国铁通
+(NSString* )carrierInfo {
#if TARGET_IPHONE_SIMULATOR
return @"SIMULATOR";
#else
static dispatch_queue_t_queue;
static dispatch_once_t once;
dispatch_once(&once, ^{
_queue = dispatch_queue_create([[NSString stringWithFormat:@com.carr.%@
, self] UTF8String], NULL);
});
block NSString * carr = nil;
dispatch_semaphore_t semaphore = dispatch_semaphore_create(0);
dispatch_async(_queue, ^(){
CTTelephonyNetworkInfo *info = [[CTTelephonyNetworkInfo alloc] init];
CTCarrier *carrier = nil;
if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 12.1)
{ if ([info respondsToSelector:@selector
(serviceSubscriberCellularProviders)]) {
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wunguarded-availability-new"
NSArray *carrierKeysArray = [info.serviceSubscriberCellularProvide
rs
.allKeys sortedArrayUsingSelector:@selector(compare:)];
carrier = info.serviceSubscriberCellularProviders
[carrierKeysArray.firstObject];
if (!carrier.mobileNetworkCode) {
carrier = info.serviceSubscriberCellularProviders
[carrierKeysArray.lastObject];
}
#pragma clang diagnostic pop
}
}
if(!carrier) {
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wdeprecated
declarations" carrier =
info.subscriberCellularProvider;
#pragma clang diagnostic pop
}
if (carrier != nil) {
NSString *networkCode = [carrier mobileNetworkCode];
NSString *countryCode = [carrier mobileCountryCode];
if (countryCode && [countryCode isEqualToString:@"460"] && networkCode)
{
if ([networkCode isEqualToString:@"00"] ||
[networkCode isEqualToString:@"02"] ||
[networkCode isEqualToString:@"07"] ||
[networkCode isEqualToString:@"08"]) {
carr= @"{{string1}}";
}
if ([networkCode isEqualToString:@"01"]
|| [networkCode isEqualToString:@"06"]
|| [networkCode isEqualToString:@"09"])
{
carr= @"{{string2}}";
}
if ([networkCode isEqualToString:@"03"]
|| [networkCode isEqualToString:@"05"]
|| [networkCode isEqualToString:@"11"])
{
carr= @"{{string3}}";
}
if ([networkCode isEqualToString:@"04"])
{
carr= @"{{string4}}";
}
if ([networkCode isEqualToString:@"20"])
{
carr= @"{{string5}}";
}
}else {
carr = [carrier.carrierName copy];
}
}
if (carr.length <= 0);
{
carr =@"unknown";
}
dispatch_semaphore_signal(semaphore);
});
dispatch_time_t t = dispatch_time(DISPATCH_TIME_NOW, 0.5* NSEC_PER_SEC);
dispatch_semaphore_wait(semaphore, t);
return [carr copy];
#endif
物理内存容量
+ (NSString *) memory
{
return [NSString stringWithFormat:@"%lld", [NSProcessInfo processInfo]
.physicalMemory];
}
硬盘容量
+(NSString *)disk
{
int64_t space = -1;
NSError *error = nil;
NSDictionary *attrs = [[NSFileManager defaultManager]
attributesOfFileSystemForPath:NSHomeDirectory() error:&error];
if (!error) {
space = [[attrs objectForKey:NSFileSystemSize] longLongValue];
}
if(space < 0)
{
space = -1;
}
return [NSString stringWithFormat:@"%lld",space];
}
系统更新时间
+(NSString *)sysFileTime
{ NSString *result = nil;
NSString *information = @"L3Zhci9tb2JpbGUvTGlicmFyeS9Vc2VyQ29uZmlndXJhdGlvblBy
b2ZpbGVzL1B1YmxpY0luZm8vTUNNZXRhLnBsaXN0";
NSData *data=[[NSData alloc]initWithBase64EncodedString:information options:0]
;
NSString *dataString = [[NSString alloc]initWithData:data encoding:NSUTF8Strin
gEncoding];
NSError *error = nil;
NSDictionary *fileAttributes = [[NSFileManager defaultManager]
attributesOfItemAtPath:dataString error:&error];
if (fileAttributes) {
id singleAttibute = [fileAttributes
objectForKey:NSFileCreationDate];
if ([singleAttibuteisKindOfClass:[NSDate class]]) {
NSDate *dataDate = singleAttibute;
result = [NSString stringWithFormat:@"%f",[dataDate timeIntervalSince1
970]];
}
}
return result;
}
设备Model
+(NSString *)model
{
NSString *model = getSystemHardwareByName(SIDFAModel);
return model == nil ? @"" : model;
}
时区
+ (NSString *) timeZone
{
NSInteger offset = [NSTimeZone systemTimeZone].secondsFromGMT;
return [NSString stringWithFormat:@"%ld",(long)offset];
}
支持的宏替换
宏 | 描述 |
---|---|
PRICE | 曝光的最终拍卖价(RTB 模式需要在曝光链接中替换,目前支持明文 单位分) |
{DOWN_X} | 相对于广告位,用户手指按下时的横坐标 如无法获取请填“-999” 单位逻辑像素 (仅用于点击上报链接) |
{DOWN_Y} | 相对于广告位,用户手指按下时的纵坐标 如无法获取请填“-999” 单位逻辑像素 (仅用于点击上报链接) |
{UP_X} | 相对于广告位,用户手指抬起时的横坐标 如无法获取请填“-999” 单位逻辑像素 (仅用于点击上报链接) |
{UP_Y} | 相对于广告位,用户手指抬起时的纵坐标 如无法获取请填“-999” 单位逻辑像素 (仅用于点击上报链接) |
DP_DOWN_X | 相对于广告位,用户手指按下时的横坐标 如无法获取请填“-999” 单位逻辑像素 (仅用于点击上报链接) |
DP_DOWN_Y | 相对于广告位,用户手指按下时的纵坐标 如无法获取请填“-999” 单位逻辑像素 (仅用于点击上报链接) |
DP_UP_X | 相对于广告位,用户手指抬起时的横坐标 如无法获取请填“-999” 单位逻辑像素 (仅用于点击上报链接) |
DP_UP_Y | 相对于广告位,用户手指抬起时的纵坐标 如无法获取请填“-999” 单位逻辑像素 (仅用于点击上报链接) |
{TS_S} | 事件发生时间戳 单位:秒 |
{TS_M} | 事件发生当前时间戳 单位:毫秒(13 位) |
END_TS | 事件结束时时间戳,单位毫秒 |
END_SECONDS | 事件结束时间戳,单位秒 |
IP | 设备内网 IP |
DP_WIDTH | 实际广告位的宽(完整广告位区域,不只是素材展示区域) 单位逻辑像素 (仅用于点击上报链接) |
DP_HEIGHT | 实际广告位的高(完整广告位区域,不只是素材展示区域) 单位逻辑像素 (仅用于点击上报链接) |
CLICKAREA | 点击区域:1-广告素材;2-按钮 (仅用于点击上报链接) |
WIDTH | 实际广告位的宽 完整广告位区域,不只是素材展示区域) 单位像素 (仅用于点击上报链接) |
HEIGHT | 实际广告位的高(完整广告位区域,不只是素材展示区域)单位像素 (仅用于点击上报链接) |
S_DOWN_X | 相对于屏幕,用户手指按下去的 X 坐标 如无法获取请填“-999” 单位像素 (仅用于点击上报链接) |
S_DOWN_Y | 相对于屏幕,用户手指按下去的 Y 坐标 如无法获取请填“-999” 单位像素 (仅用于点击上报链接) |
S_UP_X | 相对于屏幕,用户手指离开时的 X 坐标 如无法获取请填“-999” 单位像素 (仅用于点击上报链接) |
S_UP_Y | 相对于屏幕,用户手指离开时的 Y 坐标 如无法获取请填“-999” 单位像素 (仅用于点击上报链接) |
IMP_AREA | 广告展示区域(涵盖按钮区域)像素坐标,含左上角坐标 (X1Y1)、右下角坐标(X2Y2),需替换为:X1_Y1_X2_Y2 (仅用于点击上报链接) |
BUTTON_AREA | 广告按钮区域像素坐标,含左上角坐标(X1Y1)、 右下角坐标(X2Y2),需替换为:X1_Y1_X2_Y2 (仅用于点击上报链接) |
CLICK_XY | 广告点击行为后上报广告点击的像素坐标(XY),需替换 为:X_Y (仅用于点击上报链接) |
AD_LT_X | 广告左上角坐标 x,相对于广告位左上角 如无法获取请填“-999” (仅用于曝光上报链接) |
AD_LT_Y | 广告左上角坐标 y,相对于广告位左上角 如无法获取请填“-999” (仅用于曝光上报链接) |
AD_RB_X | 广告右下角坐标 x,相对于广告位左上角 如无法获取请填“-999” (仅用于曝光上报链接) |
AD_RB_Y | 广告右下角坐标 y,相对于广告位左上角 如无法获取请填“-999” (仅用于曝光上报链接) |
LOSS_REASON | 失败原因 (仅用于竞价失败上报链接) 10101:响应超时 10102:广告价格低 |
LOSS_PRICE | 竞胜者结算价 (仅用于竞价失败上报链接) |
响应状态码解释
code | 响应状态码详细介绍 |
---|---|
101 | 缺少 ip |
102 | 缺少 device 对象 |
1021 | 缺少 make/model |
103 | 缺少 os(设备操作系统类型) |
104 | 唯一设备信息与操作系统类型不符例: os:ios,imei:“1234567890”,idfa:“” |
1041 | 非法唯一设备 id 例如:00000000-0000-0000-0000-000000000000 |
1042 | ext 对象为 null/设备唯一 ID 异常(安卓 id 位 16 位或者 32 位 imei_md5 为 32 位 imei 为 15 位数字 oaid 16 位或者 64 位或者 36 位 ) |
1043 | 安卓版本号过低(版本 8.0.0 以下) |
1044 | mac 参数格式异常 |
105 | 缺少 app 对象 |
1051 | 缺少 app name |
1052 | 缺少 app version |
1053 | 缺少 app 包名 |
0 | 正常 |