在 TVML 应用程序中更改 XMLHttpRequest 的用户代理

2024-04-02

我正在使用 TVMLKit 开发 Apple TV 应用程序。我的应用程序的 JavaScript 代码尝试使用以下命令向服务器发送 HTTP 请求XMLHttpRequest。服务器需要特定的用户代理,所以我尝试了以下方法:

var request = new XMLHttpRequest();
request.open("GET", url, true);
request.setRequestHeader("User-Agent", "MyApp");
request.send();

服务器收到不同的 User-Agent 标头:

User-Agent: <Projectname>/1 CFNetwork/758.1.6 Darwin/15.0.0

如果我将标头名称更改为不同的名称,它会显示在请求标头中。我猜苹果正在发送请求之前替换用户代理字段。有办法防止这种情况吗?


在花了两天时间调查这个问题后,我找到了创建原生解决方案GET and POSTswift 中的方法最终将它们暴露给 javascript。这不是最好的解决方案,但我仍然想分享它。也许它可以帮助某人。

这是它的工作原理

首先我们需要安装阿拉莫菲尔 https://github.com/Alamofire/Alamofire图书馆。我们将使用它来创建请求。

github 上的自述文件包含安装它所需的所有说明

安装Alamofire后我们需要将其导入AppDelegate.swift

import Alamofire

然后我们需要在应用程序控制器中创建函数(AppDelegate.swift) 将向 javascript 公开方法

func appController(appController: TVApplicationController, evaluateAppJavaScriptInContext jsContext: JSContext)
{
    let requests = [String : AnyObject]()

    let get: @convention(block) (String, String, [String : String]?) -> Void = { (cId:String, url:String, headers:[String : String]?) in

        Alamofire.request(.GET, url, headers: headers)
            .responseString { response in
                jsContext.evaluateScript("requests." + cId + "(" + response.result.value! + ")")
        }
    }

    let post: @convention(block) (String, String, [String : AnyObject]?, [String : String]?) -> Void = { (cId:String, url:String, parameters:[String : AnyObject]?, headers:[String : String]?) in

        Alamofire.request(.POST, url, parameters: parameters, headers: headers)
            .responseString { response in
                jsContext.evaluateScript("requests." + cId + "(" + response.result.value! + ")")
        }
    }

    jsContext.setObject(requests, forKeyedSubscript: "requests");
    jsContext.setObject(unsafeBitCast(get, AnyObject.self), forKeyedSubscript: "nativeGET");
    jsContext.setObject(unsafeBitCast(post, AnyObject.self), forKeyedSubscript: "nativePOST");
}

完整代码AppDelegate.swift你可以找到here https://github.com/a-ignatov-parc/tvos-soap4.me/blob/f0ae4e25b1aa8748cd4c426f9d8fdacf60fa7d10/tvos/soap4.me/AppDelegate.swift#L120-L143

可以了,好了!现在我们可以访问nativeGET and nativePOST来自 JavaScript 的函数。

最后一件事是发出请求并检索响应。我不明白如何快速执行回调,所以我使用了jsonp使用运行时生成的函数并将其名称传递给本机函数的方法。

这是 JavaScript 中的样子

export function get(url, headers = {}) {
    return new Promise((resolve) => {
        const cId = `get${Date.now()}`;
        requests[cId] = response => {
            delete requests[cId];
            resolve(response);
        }
        nativeGET(cId, url, headers);
    });
}

export function post(url, parameters = {}, headers = {}) {
    return new Promise((resolve) => {
        const cId = `post${Date.now()}`;
        requests[cId] = response => {
            delete requests[cId];
            resolve(response);
        }
        nativePOST(cId, url, parameters, headers);
    });
}

上面的代码是用 ES6 编写的,您需要包含PromiseTVJS 应用程序中的 polifill。

现在我们可以制作GET and POST请求应用我们需要的任何标头

post('http://example.com/', {
    login: 'xxx', 
    password: 'yyy'
}, {
    'User-Agent': 'My custom User-Agent'
})
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 TVML 应用程序中更改 XMLHttpRequest 的用户代理 的相关文章

  • 使用 MPMoviePlayerController 禁用 AirPlay

    我有一个实例MPMoviePlayerController它被用来在 iPhone 应用程序上显示一些实时流媒体视频 这工作正常 但我希望删除所有 AirPlay 功能 可以肯定的是 我专门禁用了 AirPlay 如下所示 if self
  • 使 UILabel 可聚焦和可点击 (tvOS)

    我正在尝试实现 6 行高描述标签 并且希望它能够聚焦 理想情况下 这意味着扩展 UILabel 类来制作自定义组件 我尝试通过实施canBecomeFocused and didUpdateFocusInContext但我的 UILabel
  • AVUrlAsset 和 WebVTT

    在 iOS TVOS 上 是否可以从 URL 加载远程 vtt 文件并将其用作字幕轨道 同时还从 URL 加载远程 HLS 视频 而不是在 m3u8 播放列表中指定的 VTT 伪代码 AVAsset video asset AVAsset
  • 按下菜单按钮后如何将 Apple TV 应用置于后台

    我尝试使用私有方法在按下菜单按钮后将应用程序置于后台 并且以下代码可以正常工作 implementation ViewController UITapGestureRecognizer tapRecognizer void viewDidL
  • 在适用于 tvOS 12 的 TVUIKit 中使用 TVPosterImage

    tvOS 12 有一个新框架TVUIKit 它引入了锁定视图 我感兴趣的课程是电视海报视图 基本上是这样设计的 斯威夫特 4 2 open class TVPosterView TVLockupView One may use UICont
  • tvOS UITextField 编辑后为空

    Editing UITextFieldtvOS 中显示了一个新视图 用户可以在其中输入文本 完成文本输入后 用户将返回到之前的视图 但是 我发现当我从文本编辑器返回时 我编辑的文本不会显示在我的文本字段中 这是怎么回事 电视操作系统版本9
  • 如何在 tvOS 中打开 GameCenter

    如何在 tvOS 中打开游戏中心排行榜 我已将此代码用于我的 iPhone 游戏 排行榜标识符 在 tvOS 上不可用 我计划在 AppleTV 上使用相同的排行榜 这将是同一个游戏 非常感谢您的帮助 斯特凡 IBAction func h
  • UIDatePicker 替代 tvOS?

    由于 UIDatePicker 在 tvOS 中不可用 那么使用什么来向用户询问日期 时间呢 是否有一个新的类可以替代UIDatePicker Thanks 由于 Apple 没有为 tvOS 提供日期选择器 因此没有标准解决方案 然而 一
  • 如何在 Swift3 中取消 DispatchQueue.main.asyncAfter(deadline: time) ? [复制]

    这个问题在这里已经有答案了 描述 我当前正在使用以下代码来查看用户是否已停止在搜索栏中输入内容 我想在每次用户立即开始输入后取消它0 5秒 Code DispatchQueue main asyncAfter deadline now 0
  • 当 UIButton 获得焦点时,Siri Remote 的菜单按钮不会退出应用程序

    我凌驾于一切之上pressesBegan接收选择按下 当焦点位于某个对象上时 Siri 远程菜单按钮不会退出我的应用程序UIButton 如果没有 UI 元素获得焦点 菜单按钮将按预期工作 当焦点位于某个位置时 如何接收菜单按钮按下的消息U
  • tvOS 中意外的运动效应振荡

    我使用以下代码遇到运动效果振荡 import UIKit UIApplicationMain class AppDelegate UIResponder UIApplicationDelegate var window UIWindow f
  • 故事板可以用作 tvos 中的启动屏幕吗?

    在 iOS 中 故事板可以代替静态图像用作启动屏幕 我也在寻找一种使用 tvOS 执行此操作的方法 但我没有看到该选项 有办法这样做吗 适用于 tvOS 13 1 及更高版本的解决方案 从 tvOS 13 1 开始 不推荐使用启动图像 将出
  • 有什么方法可以控制 AVSpeechSynthesizer 输出到哪个音频通道?

    我想使用 AVSpeechSynthesizer 在多通道环绕声设置的一个音频通道上输出声音 例如 在 5 1 系统中 我希望它仅在右环绕声道上输出 现在我有 let synthesizer AVSpeechSynthesizer let
  • NavigationLink 内的 tvOS 按钮不起作用

    我已经使用 swift 和 swiftui 构建了一个 iOS 应用程序 现在我正在开发该应用程序的 tvOS 版本 但是 我有几个问题 其中一个问题仍未解决 tvOS 文本字段透明背景 https stackoverflow com qu
  • 如何为 SpriteKit 游戏选择 tvOS 菜单中的按钮

    我正在为 tvOS 扩展我的 iOS 游戏 大多数游戏控制都是由touchesBegan touchesMoved and touchesEnded 我所有的选择按钮都按以下方式处理 if button1 contains location
  • tvos UISegmentedControl 焦点样式不改变

    我想在 tvOS 中突出显示 UISegmentedControl 时更改其背景颜色 Normally Segment display like following When change focus for change selected
  • 将 GCController 与 tvOS 模拟器结合使用

    我没有新的 Apple TV 但正在使用模拟器为其制作游戏原型 不幸的是 我似乎无法让 GCController 将 Siri 遥控器列为可用控制器 正如 tvOS 文档所示 我的控制器列表始终是 0 个元素长 即使我调用startWire
  • tvOS 模拟器是否支持使用 Apple 登录 (SIWA)?

    我已在项目目标中启用 SIWA 的权利 相同的步骤在 iOS 模拟器中运行良好 我在 tvOS 模拟器上尝试使用 Apple SIWA 登录时遇到以下问题 重现问题的步骤 在点击自定义按钮请求 SIWA 时 全屏显示 Apple id 密码
  • 如何使用 tvOS 打开另一个应用程序?

    Does UIApplication openURL work NSString iTunesLink http www youtube com watch v TFFkK2SmPg4 BOOL did UIApplication shar
  • 如何在tvOS上显示GameCenter排行榜?

    I think我按照所有必需的步骤在我的游戏中支持排行榜 它们在 iOS 上运行得很好 但是在 tvOS 上无法配置GKGameCenterViewController要显示特定的排行榜 LeaderboardIdentifier属性只是丢

随机推荐

  • 在 Play 2.0 视图中转义 JavaScript 字符串?

    有没有一种简单的方法可以转义字符串以用作 Play 2 0 视图中的 JavaScript 字符串 例如 下面是一个简单的视图 它在 onclick 中创建带有确认框的链接 text String link Call message Str
  • 指数位数

    是否可以设置用于打印浮点数指数的位数 我想将其设置为3 现在 f 0 0000870927939438012 gt gt gt 14e f 8 70927939438012e 05 gt gt gt 0 14e f 8 709279e 00
  • 页面刷新而不是 Ajax Load 无需

    在表单提交时 我想加载一个带有 mysql 表的更新列表的 div 我将表单变量发送到 php 并将它们发布到 mysql 表中 同一页面显示完整的表数据 我想将数据加载到与表单相同的 div 标签中 因此 信息似乎正在表单上方加载 我的
  • 类型 '' 不能用作泛型类型或方法 '' 中的类型参数 'T'。没有从 '' 到 '' 的隐式引用转换

    我从数据库生成了 Linq 到实体模型并对其进行了修改 我制作了接口 public interface IValid byte Valid get set 并使一些生成的类继承该接口 我编写了通用类来访问数据库中的表 public List
  • 在绘图中向堆积条形图添加计数百分比

    Given the following chart created in plotly 我想添加每个块内 M 和 F 类别的每个计数的百分比值 用于生成该图的代码 arr np array Dog M Dog M Dog F Dog F C
  • 计算查询中活动时间戳之间的时间差

    我对 Access 相当陌生 无法解决 我希望 一个简单的问题 我想我可能是通过 Excel 护目镜来查看它 我有一个名为importedData我每天 并不奇怪 导入一个日志文件 该日志文件来自某些采矿设备上的简单数据记录应用程序 本质上
  • 为什么我无法将工作簿定义为对象?

    为什么我不能用这两种方式定义工作簿 我在那里有范围位只是为了快速测试 我该如何修复它 这会产生一个 Compile Error Type Mismatch Sub Setwbk Dim wbk As Workbook Set wbk F Q
  • 将查询数据保存为 csv 文件

    我有一个应用程序 可以打开 csv 文件并将所有内容显示到格式化的 datagridview 中 从那里我有一个按钮可以打开另一个包含一系列复选框的表单 复选框具有我们之前打开的csv文件的所有属性 用户应该能够根据他们想要的属性查询文件
  • 卸载 Visual Studio 2013 update 1 rc

    害怕听起来像个菜鸟 我在卸载 Visual Studio 2013 update 1 时遇到问题 我怎么做 转到 控制面板 gt 程序 gt 程序和功能 gt 左侧栏上的 查看已安装的更新 然后向下滚动到 Microsoft Visual
  • 某些表的动态数据库备份

    我只需要备份主数据库中的一些表 其他表是参考表并且是静态的 因此不需要备份 我在 SD 卡上创建了一个新的空白数据库 我可以直接访问SD卡上的数据库还是需要在备份完成后复制它 真正的问题是我是否可以循环遍历每个记录中的字段或其他内容 这样我
  • 如何使用boost多精度生成正态随机数?

    我正在尝试使用 boost 的多精度从正态分布生成随机数 我可以从均匀分布生成随机数 但是当我尝试从标准正态分布生成随机数时 它报告错误 这是代码 以下来自来自 boost 的示例 http www boost org doc libs 1
  • Django 使用整数字段作为外键字段

    为了支持旧的 遗留 数据库 我们必须创建一个使用的表整数字段 as a 外键 to User表 这就是我们的模型的样子 class UserHistory user id models IntegerField null True blan
  • FusedLocationProviderClient requestLocationUpdates 不会触发上述 API 23 的 LocationCallBack

    我已经用尽了所有可能的方法来解决这个问题 在对我的应用程序进行调整之前 从技术上讲 我使用的是在 API 23 及更高版本中运行的相同代码 回调 在请求位置更新中 不在手机中触发 棉花糖及以上 但它在模拟器中运行良好 使用 Pixel 2
  • 有按钮栏的视图吗? (描述视图的图像链接)

    我正在寻找有关 Android 默认应用程序中底部栏的视图或某种信息 例如电子邮件或解锁图案 如下图所示 我在 Android 网站或 Google 搜索中找不到任何有关此内容的信息 Image http img11 imageshack
  • 使用Python编写Parquet文件的方法?

    我无法找到允许使用 Python 编写 Parquet 文件的库 如果我可以结合使用 Snappy 或类似的压缩机制 那就加分了 到目前为止 我发现的唯一方法是将 Spark 与pyspark sql DataFrame镶木地板支持 我有一
  • MVC 操作被调用两次

    我有一个MVC Action Method如果请求需要时间才能完成 则会被点击两次 在检查 chrome 控制台网络日志和 fiddler 时 该请求仅从 JS 发送一次 在下图中 我面临这个问题Approach 1 但是 如果我这样做的话
  • Django“DecimalFields 必须定义“decimal_places”属性。”

    我的模型字段之一如下 aaf 1kg all models DecimalField blank True null True 当我正常使用我的模型时 一切都很好 当我在一个ready hook https docs djangoproje
  • java中的虚方法调用是什么?

    我在一些计算机科学测试中看到了下一段 我希望我能在这里得到它的含义的一个很好的解释 因为我用谷歌搜索了一个小时 但找不到任何东西 当我们说 Java 语言有虚方法调用我们的意思是 在java应用程序中 执行的方法是由运行时的对象类型决定的
  • 获取console.log()显示自定义对象描述

    我有一个自定义的 JS 对象来表示网格 对于这个例子来说 它看起来像这样 function Grid c r var layout var contentPointer 0 this getCell function c r Return
  • 在 TVML 应用程序中更改 XMLHttpRequest 的用户代理

    我正在使用 TVMLKit 开发 Apple TV 应用程序 我的应用程序的 JavaScript 代码尝试使用以下命令向服务器发送 HTTP 请求XMLHttpRequest 服务器需要特定的用户代理 所以我尝试了以下方法 var req