頁首 — X-Device-Info
- 主題:
- 驗證
概觀
X-Device-Info 要求標頭包含與實際串流裝置相關的使用者端資訊(裝置、連線和應用程式),用來決定MVPD可能強制執行的平台特定規則。
語法
X-Device-Info: <device_info> | |
頁首型別 | 請求標頭 |
標準 | 否 |
指令
<device_information>
JSON元素的Base64-encoded
值,至少包含下表標示的必要屬性。
是否存在 | 索引鍵 | 說明 | 受限制 | 可能的值 |
---|---|---|---|---|
primaryHardwaretype | 裝置的主要硬體型別。 | &;檢查; |
值受到限制:
| |
必填 | 模型 | 裝置的型號名稱。 | 例如iPhone、SM-G930V、AppleTV等。 | |
必填 | 版本 | 裝置的版本。 | 例如2.0.1等。 | |
製造商 | 裝置的製造公司/組織。 | 例如三星、LG、ZTE、華為、摩托羅拉、Apple等。 | ||
廠商 | 裝置的銷售公司/組織。 | 例如Apple、Samsung、LG、Google等。 | ||
必填 | osName | 裝置的作業系統(OS)名稱。 | &;檢查; |
值受到限制:
|
osFamily | 裝置的作業系統(OS)群組名稱。 | &;檢查; |
值受到限制:
| |
osVendor | 裝置的作業系統(OS)供應商。 | &;檢查; |
值受到限制:
| |
必填 | osVersion | 裝置的作業系統(OS)版本。 | 例如10.2、9.0.1等。 | |
browserName | 瀏覽器的名稱。 | &;檢查; |
值受到限制:
| |
browserVendor | 瀏覽器的建置公司/組織。 | &;檢查; |
值受到限制:
| |
browserVersion | 裝置的瀏覽器版本。 | 例如60.0.3112 | ||
userAgent | 裝置的使用者代理。 | 例如Mozilla/5.0 (Macintosh;Intel Mac OS X 10_12_3) AppleWebKit/602.4.8 (KHTML,如Gecko)版本/10.0.3 Safari/602.4.8 | ||
displaywidth | 裝置的實體熒幕寬度。 | |||
displayheight | 裝置的實體熒幕高度。 | |||
displayPpi | 裝置的實體熒幕畫素密度。 | 例如294 | ||
diagonalScreenSize | 裝置的實體熒幕對角線尺寸(英吋)。 | 例如5.5、10.1 | ||
connectionIp | 用於傳送HTTP要求的裝置IP。 | 例如8.8.4.4 | ||
connectionPort | 用於傳送HTTP要求的裝置連線埠。 | 例如53124 | ||
必填 | connectionType | 網路連線型別。 | 例如WiFi、LAN、3G、4G、5G | |
connectionSecure | 網路連線安全性狀態。 | &;檢查; |
值受到限制:
| |
applicationId | 應用程式的唯一識別碼。 | 例如REF30 |
範例
// 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=
逐步指南
X-Device-Info
標頭都必須包含如指示區段中所述格式化的值。瀏覽器
對於在瀏覽器中執行的使用者端應用程式,可以省略X-Device-Info
標頭,因為瀏覽器會自動在User-Agent
標頭中傳送一組最少的必要資訊。
您仍然可以使用X-Device-Info
標頭來提供裝置、連線和應用程式的額外資訊,以防您的使用者端應用程式整合提供裝置識別機制的程式庫或服務。
行動裝置
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;
}
裝置資訊的建構方式如下:
連線資訊的建構方式如下:
應用程式資訊的建構方式如下:
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);
}
裝置資訊的建構方式如下:
連線資訊的建構方式如下:
<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"
應用程式資訊的建構方式如下:
+ (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;
}
裝置資訊的建構方式如下:
連線資訊的建構方式如下:
應用程式資訊的建構方式如下:
Fire OS
若要為執行Fire OS的裝置建置X-Device-Info
標頭,您可以參考下列檔案:
- Build類別的Android開發人員檔案。
- 識別Fire TV裝置的Amazon開發人員檔案。
裝置資訊的建構方式如下:
連線資訊的建構方式如下:
應用程式資訊的建構方式如下:
Roku OS
若要為執行Roku OS的裝置建置X-Device-Info
標題,您可以參考下列檔案:
- ifDeviceInfo的Roku開發人員檔案。
裝置資訊的建構方式如下:
連線資訊的建構方式如下:
應用程式資訊的建構方式如下:
其他
對於檔案中未涵蓋的裝置平台,使用者端資訊(裝置、連線和應用程式)應連結至任何可用的硬體和作業系統(OS)屬性,通常在裝置的硬體和作業系統手冊中指定。