【问题标题】:API network request error on iOS device, not simulatoriOS设备上的API网络请求错误,而不是模拟器
【发布时间】:2020-10-11 00:45:47
【问题描述】:

好的,所以我已经尝试解决这个问题 2 天了,希望有人能提供帮助。

快速背景,我正在对数据进行 api 请求。使用调用我制作的服务功能的功能。现在一切都在第一次加载时运行良好,collectionview 加载正常。在某个时候,我再次调用更多数据。现在接受我得到一个 URL 错误。 这在我的 iPhone 上不起作用,但在模拟器上可以完美运行,所以不确定它可能是什么。 这是发出 api 请求的服务函数:

func fetchYoutubeData(interest: String, maxResult: Int, pageToken: String, completion: @escaping(Result<Youtube, WHError>) -> Void) {
    let urlString = baseYoutubeURL+interest+youtubeAPIKey+"&maxResults=\(maxResult)&pageToken=\(pageToken)"
    guard let url = URL(string: urlString) else {
      completion(.failure(.URLError))
      return
    }
    let session = URLSession.shared
    let task = session.dataTask(with: url) { (data, _, error) in
      if let _ = error {
        completion(.failure(.DataError))
        return
      }
      guard let data = data else { return }
      do {
        let result = try JSONDecoder().decode(Youtube.self, from: data)
        print(result)
        completion(.success(result))
      } catch {
        completion(.failure(.JSONError))
      }
    }
    task.resume()
  }

这是我的控制器函数,它调用服务并在完成时处理数据:

func fetchNewData(maxResult: Int, pageToken: String) {
    guard let interest   = self.interest.text else { return }
    print(pageToken)
    NetworkServices.shared.fetchYoutubeData(interest: interest, maxResult: maxResult, pageToken: pageToken) { [unowned self] (result) in
      switch result {
      case .success(let youtubeGroup):
        let items = youtubeGroup.items
        self.youtubeData.items.append(contentsOf: items)
        DispatchQueue.main.async {
          self.horizontalCollectionView.reloadData()
        }
      case .failure(let error):
        print("DOES GET ERROR")
        print(error)
      }
    }
  }

再次,它在模拟器上完美运行,但在我的设备上,我可以第一次调用工作,但之后,一旦我使用 pageToken 获取更多数据,我得到一个 URL 错误。

任何帮助将不胜感激

【问题讨论】:

  • 如果您能提供您收到的具体错误消息,将会有所帮助。
  • @MikeTaverne,当然这只是一个自定义错误响应。我有一个用于处理网络错误的枚举。从 urlString 创建 URL 时,错误出现在 guard 语句中。响应为:URLError:“端点 URL 错误”操作无法完成。 (Whats_Hunt.WHError 错误 0。) 0 是选定的枚举索引。不确定这是否对您有帮助。我想知道这是否与 Simulator vs my Device 中的 iOS 版本有关?
  • 嗯...这对一些人有帮助。失败时的 URL 字符串是什么?
  • 当我提出第二个请求时,我添加了 pageToken,这就是错误发生的时候。接受我所说的它在模拟器上运行时工作,当我把这个 URL 放在浏览器中时,我得到了我的数据。 googleapis.com/youtube/v3/… Development&key=MY_KEY&maxResults=48&pageToken=CDAQAA 不知道为什么会这样
  • @MikeTaverne 你看 URL 字符串是对的,我忘记在第二次数据调用中正确格式化 q 字符串。不知道如何从评论中给你信用。否则我会

标签: swift api networking youtube-api


【解决方案1】:

我将“App Transport Security Settings”添加到 Info.plist 文件中,然后选择“Allow Arbitrary Loads”并将该值设置为“YES”,这样就可以了。我的假设是客户端开发环境中的安全证书存在问题,导致应用无法通过 HTTPS 进行调用。

永远不要害怕,我只允许在 dev 和 qa 环境中进行任意加载。

【讨论】:

    【解决方案2】:

    当然,就像很多事情一样,这是我错过的一些小事。我会把这个问题留在这里,以防有人发现自己处于类似情况。 问题出在第一个请求中,我重新格式化“兴趣”以从字符串中删除空格并用 + 替换它们。您需要为您提供的 Youtube API 查询字符串执行此操作。 我在第一个请求中这样做了,但是为了查询其他数据,我忘记在单独的调用中重新格式化请求。 幸好容易修复

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-06-20
      • 2021-03-17
      • 2015-06-08
      • 2012-07-10
      • 2019-04-06
      • 2015-08-14
      • 2021-11-18
      • 1970-01-01
      相关资源
      最近更新 更多