标头 — X-Device-Info header-x-device-info

NOTE
此页面上的内容仅供参考。 使用此API需要来自Adobe的当前许可证。 不允许未经授权使用。

概述 overview

X-Device-Info 请求标头包含与实际流设备相关的客户端信息(设备、连接和应用程序)。

语法 syntax

X — 设备信息: <设备信息>
标题类型
请求标头
标准

指令 directives

<设备信息>

JSON元素的Base64-encoded值,至少包含下表要求标记的属性。

存在
描述
受限
可能值
主要硬件类型
设备的主要硬件类型。
&amp;检查;

值受限制:

  • 相机
  • 数据收集终端
  • 桌面
  • 嵌入式网络模块
  • 电子阅读器
  • 游戏控制台
  • Geolocationtracker
  • 眼镜
  • MediaPlayer
  • 移动电话
  • 支付终端
  • 插件调制解调器
  • 机顶盒
  • TV
  • 平板电脑
  • 无线热点
  • 手表
  • 未知
必填
模型
设备的型号名称。
例如iPhone、SM-G930V、AppleTV等。
必填
版本
设备的版本。
例如2.0.1等。
制造商
设备的制造公司/组织。
例如,三星、LG、ZTE、华为、摩托罗拉、Apple等。
供应商
设备的销售公司/组织。
例如Apple、Samsung、LG、Google等。
必填
操作系统名称
设备的操作系统(OS)名称。
&amp;检查;

值受限制:

  • Android
  • Chrome操作系统
  • Linux
  • Mac操作系统
  • OS X
  • OpenBSD
  • Roku OS
  • Windows
  • iOS
  • tvOS
  • webOS
osFamily
设备的操作系统(OS)组名称。
&amp;检查;

值受限制:

  • Android
  • BSD
  • Linux
  • PlayStation操作系统
  • Roku OS
  • Symbian
  • Tizen
  • Windows
  • iOS
  • tvOS
  • macOS
  • webOS
操作系统供应商
设备的操作系统(OS)供应商。
&amp;检查;

值受限制:

  • Amazon
  • Apple
  • Google
  • LG
  • Microsoft
  • Mozilla
  • 任天堂
  • Nokia
  • Roku
  • Samsung
  • Sony
  • Tizen项目
必填
osVersion
设备的操作系统(OS)版本。
例如10.2、9.0.1等。
browserName
浏览器的名称。
&amp;检查;

值受限制:

  • Android Browser
  • Chrome
  • Edge
  • Firefox
  • Internet Explorer
  • Opera
  • Safari
  • SeaMonke
  • Symbian Browser
browserVendor
浏览器的构建公司/组织。
&amp;检查;

值受限制:

  • Amazon
  • Apple
  • Google
  • Microsoft
  • 摩托罗拉
  • Mozilla
  • Netscape
  • 任天堂
  • Nokia
  • Samsung
  • 索尼·爱立信
browserVersion
设备的浏览器版本。
例如60.0.3112
userAgent
设备的用户代理。
例如,Mozilla/5.0(Macintosh;英特尔Mac OS X 10_12_3) AppleWebKit/602.4.8(KHTML,如Gecko)版本/10.0.3 Safari/602.4.8
显示宽度
设备的物理屏幕宽度。
displayheight
设备的物理屏幕高度。
displayPpi
设备的物理屏幕像素密度。
例如294
对角屏幕大小
设备的物理屏幕对角尺寸(英寸)。
例如5.5、10.1
connectionIp
用于发送HTTP请求的设备的IP。
例如8.8.4.4
connectionPort
用于发送HTTP请求的设备的端口。
例如53124
必填
connectionType
网络连接类型。
例如WiFi、LAN、3G、4G、5G
connectionSecure
网络连接安全状态。
&amp;检查;

值受限制:

  • true — 在安全网络的情况下
  • false — 在公共热点的情况下
applicationId
应用程序的唯一标识符。
例如REF30

示例 examples

// Device information
// {
//  "primaryHardwareType" : "MobilePhone",
//  "model":"SM-S901U",
//  "vendor":"samsung",
//  "version":"r0q",
//  "manufacturer":"samsung",
//  "osName":"Android",
//  "osVersion":"14"
// }

// BASE64-encoded
// ewogICJwcmltYXJ5SGFyZHdhcmVUeXBlIiA6ICJNb2JpbGVQaG9uZSIsCiAgIm1vZGVsIjoiU00tUzkwMVUiLAogICJ2ZW5kb3I
// iOiJzYW1zdW5nIiwKICAidmVyc2lvbiI6InIwcSIsCiAgIm1hbnVmYWN0dXJlciI6InNhbXN1bmciLAogICJvc05hbWUiOiJBbmRyb
// 2lkIiwKICAib3NWZXJzaW9uIjoiMTQiCn0=

X-Device-Info: ewogICJwcmltYXJ5SGFyZHdhcmVUeXBlIiA6ICJNb2JpbGVQaG9uZSIsCiAgIm1vZGVsIjoiU00tUzkwMVUiLAogICJ2ZW5kb3IiOiJzYW1zdW5nIiwKICAidmVyc2lvbiI6InIwcSIsCiAgIm1hbnVmYWN0dXJlciI6InNhbXN1bmciLAogICJvc05hbWUiOiJBbmRyb2lkIiwKICAib3NWZXJzaW9uIjoiMTQiCn0=

指南 cookbooks

IMPORTANT
提供了代码段和文档资源以供参考。
代码片段并非详尽无遗,可能需要进行额外的修改才能在您的项目中正常工作。
无论实际实施如何,X-Device-Info标头都必须包含一个值,其格式如指令部分中所述。

浏览器 browsers

对于在浏览器中运行的客户端应用程序,可以省略X-Device-Info标头,因为浏览器将自动在User-Agent标头中发送所需的最小信息集。

您仍然可以使用X-Device-Info标头提供有关设备、连接和应用程序的附加信息,以防您的客户端应用程序集成了提供设备识别机制的库或服务。

移动设备 mobile-devices

iOS和iPadOS ios-ipados

要为运行iOS或iPadOS的设备构建X-Device-Info标头,您可以参考以下文档及以下代码片段:

+ (NSString *)computeClientInformation {
        struct utsname u;
        uname(&u);

        NSString *hardware = [NSString stringWithCString:u.machine encoding:NSUTF8StringEncoding];

        UIDevice *device = [UIDevice currentDevice];

        NSString *deviceType;

        switch (UI_USER_INTERFACE_IDIOM()) {
            case UIUserInterfaceIdiomPhone:
                deviceType = @"MobilePhone";
                break;
            case UIUserInterfaceIdiomPad:
                deviceType = @"Tablet";
                break;
            case UIUserInterfaceIdiomTV:
                deviceType = @"TV";
                break;
            default:
                deviceType = @"Unknown";
        }

        CGRect screenRect = [[UIScreen mainScreen] bounds];
        NSNumber *screenWidth = @((float) screenRect.size.width);
        NSNumber *screenHeight = @((float) screenRect.size.height);

        Reachability *reachability = [Reachability reachabilityForInternetConnection];
        [reachability startNotifier];

        NetworkStatus status = [reachability currentReachabilityStatus];

        NSString *connectionType;

        if (status == NotReachable) {
            connectionType = @"notConnected";
        } else if (status == ReachableViaWiFi) {
            connectionType = @"WiFi";
        } else if (status == ReachableViaWWAN) {
            connectionType = @"cellular";
        }

        NSMutableDictionary *clientInformation = [@{
                @"type": deviceType,
                @"model": device.model,
                @"vendor": @"Apple",
                @"manufacturer": @"Apple",
                @"version": [hardware stringByReplacingOccurrencesOfString:device.model withString:@""],
                @"osName": device.systemName,
                @"osVersion": device.systemVersion,
                @"displayWidth": screenWidth,
                @"displayHeight": screenHeight,
                @"connectionType": connectionType,
                @"applicationId": @"REF30"
        } mutableCopy];

        NSError *error;
        NSData *jsonData = [NSJSONSerialization dataWithJSONObject:clientInformation options:NSJSONWritingPrettyPrinted error:&error];
        NSString *base64Encoded = [jsonData base64EncodedStringWithOptions:0];

        return base64Encoded;
}

设备信息可通过以下方式构建:

Source
值(示例)
模型
uname.machine
iPhone
供应商
硬编码
Apple
制造商
硬编码
Apple
版本
uname.machine
8,1
显示宽度
UIScreen.mainScreen
320
displayheight
UIScreen.mainScreen
568
操作系统名称
UIDevice.systemName
iOS
osVersion
UIDevice.systemVersion
10.2

连接信息可通过以下方式构建:

Source
值(示例)
connectionType
[可达性currentReachabilityStatus]
connectionSecure

应用程序信息可通过以下方式构建:

Source
值(示例)
applicationId
硬编码
REF30

Android android

要为运行Android的设备生成X-Device-Info标头,您可以参考以下文档以及下面的代码片段:

  • Build类的Android开发人员文档。
private JSONObject computeClientInformation() {
     String LOGGING_TAG = "DefineClass.class";

     JSONObject clientInformation = new JSONObject();

     String connectionType;

     try {
          ConnectivityManager cm = (ConnectivityManager) getContext().getSystemService(CONNECTIVITY_SERVICE);
          NetworkInfo activeNetwork = cm.getActiveNetworkInfo();

          if (activeNetwork != null && activeNetwork.isConnectedOrConnecting()) {
              switch (activeNetwork.getType()) {
                    case ConnectivityManager.TYPE_WIFI: {
                        connectionType = "WIFI";
                        break;
                    }
                    case ConnectivityManager.TYPE_BLUETOOTH: {
                        connectionType = "BLUETOOTH";
                        break;
                    }
                    case ConnectivityManager.TYPE_MOBILE: {
                        connectionType = "MOBILE";
                        break;
                    }
                    case ConnectivityManager.TYPE_ETHERNET: {
                        connectionType = "ETHERNET";
                        break;
                    }
                    case ConnectivityManager.TYPE_VPN: {
                        connectionType = "VPN";
                        break;
                    }
                    case ConnectivityManager.TYPE_DUMMY: {
                        connectionType = "DUMMY";
                        break;
                    }
                    case ConnectivityManager.TYPE_MOBILE_DUN: {
                        connectionType = "MOBILE_DUN";
                        break;
                    }
                    case ConnectivityManager.TYPE_WIMAX: {
                        connectionType = "WIMAX";
                        break;
                    }
                    default:
                       connectionType = ConnectivityManager.EXTRA_OTHER_NETWORK_INFO;
              }
          } else {
                connectionType = ConnectivityManager.EXTRA_NO_CONNECTIVITY;
          }
     } catch (Exception e) {
          connectionType = "notAccessible";
     }

     try {
          clientInformation.put("model", Build.MODEL);
          clientInformation.put("vendor", Build.BRAND);
          clientInformation.put("manufacturer", Build.MANUFACTURER);
          clientInformation.put("version", Build.DEVICE);
          clientInformation.put("osName", "Android");
          clientInformation.put("osVersion", Build.VERSION.RELEASE);
          clientInformation.put("connectionType", connectionType);
          clientInformation.put("applicationId", "REF30");
     } catch (JSONException e) {
          Log.e(LOGGING_TAG, e.getMessage());
     }

     return Base64.encodeToString(clientInformation.toString().getBytes(), Base64.NO_WRAP);
}

设备信息可通过以下方式构建:

Source
值(示例)
模型
Build.MODEL
GT-I9505
供应商
Build.BRAND
三星
制造商
Build.MANUFACTURER
三星
版本
Build.DEVICE
jflte
显示宽度
DisplayMetrics.widthPixels
600
displayheight
DisplayMetrics.heightPixels
800
操作系统名称
硬编码
Android
osVersion
Build.VERSION.RELEASE
5.0.1

连接信息可通过以下方式构建:

Source
值(示例)
connectionType
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/> getSystemService(Context.CONNECTIVITY_SERVICE).getActiveNetworkInfo().getType()
"WIFI","BLUETOOTH","MOBILE","ETHERNET","VPN","DUMMY","MOBILE_DUN","WIMAX","notAccessible"
connectionSecure

应用程序信息可通过以下方式构建:

Source
值(示例)
applicationId
硬编码
REF30

TV连接的设备 tv-connected-devices

tvOS tvos

要为运行tvOS的设备生成X-Device-Info标头,您可以参考以下文档及以下代码片段:

+ (NSString *)computeClientInformation {
        struct utsname u;
        uname(&u);

        NSString *hardware = [NSString stringWithCString:u.machine encoding:NSUTF8StringEncoding];

        UIDevice *device = [UIDevice currentDevice];

        NSString *deviceType;

        switch (UI_USER_INTERFACE_IDIOM()) {
            case UIUserInterfaceIdiomPhone:
                deviceType = @"MobilePhone";
                break;
            case UIUserInterfaceIdiomPad:
                deviceType = @"Tablet";
                break;
            case UIUserInterfaceIdiomTV:
                deviceType = @"TV";
                break;
            default:
                deviceType = @"Unknown";
        }

        CGRect screenRect = [[UIScreen mainScreen] bounds];
        NSNumber *screenWidth = @((float) screenRect.size.width);
        NSNumber *screenHeight = @((float) screenRect.size.height);

        Reachability *reachability = [Reachability reachabilityForInternetConnection];
        [reachability startNotifier];

        NetworkStatus status = [reachability currentReachabilityStatus];

        NSString *connectionType;

        if (status == NotReachable) {
            connectionType = @"notConnected";
        } else if (status == ReachableViaWiFi) {
            connectionType = @"WiFi";
        } else if (status == ReachableViaWWAN) {
            connectionType = @"cellular";
        }

        NSMutableDictionary *clientInformation = [@{
                @"type": deviceType,
                @"model": device.model,
                @"vendor": @"Apple",
                @"manufacturer": @"Apple",
                @"version": [hardware stringByReplacingOccurrencesOfString:device.model withString:@""],
                @"osName": device.systemName,
                @"osVersion": device.systemVersion,
                @"displayWidth": screenWidth,
                @"displayHeight": screenHeight,
                @"connectionType": connectionType,
                @"applicationId": @"REF30"
        } mutableCopy];

        NSError *error;
        NSData *jsonData = [NSJSONSerialization dataWithJSONObject:clientInformation options:NSJSONWritingPrettyPrinted error:&error];
        NSString *base64Encoded = [jsonData base64EncodedStringWithOptions:0];

        return base64Encoded;
}

设备信息可通过以下方式构建:

Source
值(示例)
模型
uname.machine
AppleTV
供应商
硬编码
Apple
制造商
硬编码
Apple
版本
uname.machine
8,1
显示宽度
UIScreen.mainScreen
1920
displayheight
UIScreen.mainScreen
1080
操作系统名称
UIDevice.systemName
tvOS
osVersion
UIDevice.systemVersion
10.2

连接信息可通过以下方式构建:

Source
值(示例)
connectionType
[可达性currentReachabilityStatus]
connectionSecure

应用程序信息可通过以下方式构建:

Source
值(示例)
applicationId
硬编码
REF30

Fire操作系统 fireos

要为运行Fire OS的设备生成X-Device-Info标头,您可以参考以下文档:

设备信息可通过以下方式构建:

Source
值(示例)
模型
Build.MODEL
AFTM
供应商
Build.BRAND
Amazon
制造商
Build.MANUFACTURER
Amazon
版本
Build.DEVICE
蒙托亚
显示宽度
DisplayMetrics.widthPixels
displayheight
DisplayMetrics.heightPixels
操作系统名称
硬编码
Android
osVersion
Build.VERSION.RELEASE
5.1.1

连接信息可通过以下方式构建:

Source
值(示例)
connectionType
connectionSecure

应用程序信息可通过以下方式构建:

Source
值(示例)
applicationId
硬编码
REF30

Roku OS rokuos

要为运行Roku OS的设备生成X-Device-Info标头,您可以参考以下文档:

设备信息可通过以下方式构建:

Source
值(示例)
模型
硬编码
“Roku”
供应商
ifDeviceInfo.GetModelDetails().VendorName
“Sharp”、“Roku”
制造商
ifDeviceInfo.GetModelDetails().VendorName
“Sharp”、“Roku”
版本
ifDeviceInfo.GetModelDetails().ModelNumber
“5303X”
显示宽度
ifDeviceInfo.GetDisplaySize().w
1920
displayheight
ifDeviceInfo.GetDisplaySize().h
1080
操作系统名称
硬编码
“Roku”
osVersion
ifDeviceInfo.getVersion()

连接信息可通过以下方式构建:

Source
值(示例)
connectionType
ifDeviceInfo.GetConnectionType()
“WifiConnection”、“WiredConnection”
connectionSecure
硬编码
如果连接是有线的,则为true

应用程序信息可通过以下方式构建:

Source
值(示例)
applicationId
硬编码
REF30
recommendation-more-help
3f5e655c-af63-48cc-9769-2b6803cc5f4b