在 AFNetworking 中设置 User-Agent
Posted
技术标签:
【中文标题】在 AFNetworking 中设置 User-Agent【英文标题】:Setting User-Agent in AFNetworking 【发布时间】:2015-04-06 18:29:27 【问题描述】:我们的 ios 应用最近被 Apple 拒绝,因为它无法与我们的服务器 API 建立有效连接。我们正在使用特殊格式的用户代理来注册设备令牌等。如果用户代理不适合我们的 sheme,则 api 会阻止请求。
在模拟器和真实设备上测试应用程序的效果都很好。用户代理设置正确,api调用正常。
在 Apple 测试该应用程序时,他们拒绝了它,因为该应用程序无法连接到 api。当我们检查服务器日志文件时,我们注意到,Apple 测试人员发出的每个请求都有一个与我们在代码中设置的完全不同的用户代理。
在我们测试应用程序时设置的(正确的)用户代理:
<em>AppName</em>-App/010002 iOS/8.1.2 on Apple iPhone/<em>DeviceToken</em>
我们的日志中出现的(不正确的)用户代理:
<em>AppName</em>/1.0.0.2 (iPad; iOS 8.1.3; Scale/2.00)
该应用使用 AFNetworking 并将其用户代理设置如下:
ConnectionManager.requestSerializer.setValue(IOSREQUESTHEADER, forHTTPHeaderField: "user-agent")
你知道为什么这在 Apple 测试应用程序时不起作用,而当我们测试时它完全没问题?
最好的问候
【问题讨论】:
【参考方案1】:我尝试使用以下代码更改我的 用户代理
[self.requestSerializer setValue:@"VAL" forHTTPHeaderField:@"user-agent"];
但在将 @"user-agent"
重命名为 @"User-Agent"
之前无效
【讨论】:
【参考方案2】:尝试下一步:
NSString *userAgent = [self.manager.requestSerializer valueForHTTPHeaderField:@"User-Agent"];
userAgent = [userAgent stringByAppendingPathComponent:@"CUSTOM_PART"];
[self.manager.requestSerializer setValue:userAgent forHTTPHeaderField:@"User-Agent"];
这将保存由 AFNetworking 生成的数据,并由您自己附加
【讨论】:
【参考方案3】:出现在您的日志中的用户代理是 AFNetworking 的默认用户代理。这意味着您设置标头的代码没有被调用。
也许您的代码是在发布版本中编译出来的?如果您在相关逻辑路径中有 #ifdef DEBUG
或 NSAssert()
之类的内容,则可能会发生这种情况。
如果这还不够信息,请发布附加代码。
【讨论】:
初始化Framework后直接调用setValue
函数。这必须在发布版本中,否则根本不会有任何请求。所以我认为setValue
函数不可能没有被编译
很难说,没有更多的上下文。
代码的哪些部分有助于进一步调查问题?
@MarcoButz 从应用程序启动到该行被调用的所有代码(当然会混淆访问令牌之类的任何内容)
另一种可能性是您有多个请求序列化程序,并且您将用户代理设置在错误的一个上。【参考方案4】:
gbk's solution 在 Swift 4+ 语法中
if var userAgent = self.manager.requestSerializer.value(forHTTPHeaderField: "User-Agent")
userAgent = userAgent.stringByAppendingPathComponent(path: "CUSTOM_PART")
self.manager.requestSerializer.setValue(userAgent, forHTTPHeaderField: "User-Agent")
【讨论】:
以上是关于在 AFNetworking 中设置 User-Agent的主要内容,如果未能解决你的问题,请参考以下文章
在 AFNetworking 2.x 中设置自定义标头后,RESTful API 未接收到参数
如果我在我的 PHP API 脚本中设置 $_SESSION 变量,它们是不是由 AFNetworking 2 自动存储
SSL pinning - 在 AFSecurityPolicy 中设置固定公钥而不是固定证书