现在我正在 Swift 4 中开发一个 iOS 应用程序。这里我使用 Alamofire 来集成 API 调用。我需要集成正确的方法来自动刷新身份验证令牌并重试之前的 API 调用。成功登录后,我将存储身份验证令牌。因此,登录后,在每个 API 中,我都会在标头部分附加令牌。如果令牌过期,我将收到 401。那时我需要自动刷新身份验证令牌并再次调用相同的 API。我怎样才能做到这一点?我检查了 Stackoverflow,但没有得到任何解决方案。
这是我的 API 调用,
import Foundation
import Alamofire
import SwiftyJSON
class LoveltyAPI {
let loveltyURL = Bundle.main.object(forInfoDictionaryKey: "APIUrlString") as! String // Main URL
let buildVersion = Bundle.main.object(forInfoDictionaryKey: "CFBundleShortVersionString") as! String //infoDictionary?["CFBundleShortVersionString"] as AnyObject
weak var delegate:LoveltyProtocol?
func get_profile(app_user_id:String, token:String) {
let urlString = "\(loveltyURL)\(get_profile_string)?app_user_id=\(app_user_id)"
let headers = ["Content-Type":"application/json","X-Requested-With":"XMLHttpRequest", "Authentication":"Token \(token)"]
Alamofire.request(urlString, method: .get, encoding: JSONEncoding.default, headers: headers).responseJSON { response in
switch response.result {
case …Run Code Online (Sandbox Code Playgroud) 我有当前有效的功能。我将它与完成处理程序一起使用:
func getTokenBalances(completion: @escaping (Bool) -> Void) {
guard let url = URL(string: "someApiUrlFromLostandFound") else {
print("Invalid URL")
completion(false)
return
}
AF.request(url, method: .get).validate().responseData(completionHandler: { data in
do {
guard let data = data.data else {
print("Response Error:", data.error as Any)
completion(false)
return
}
let apiJsonData = try JSONDecoder().decode(TokenBalanceClassAModel.self, from: data)
DispatchQueue.main.async {
self.getTokenBalancesModel = apiJsonData.data.items
completion(true)
}
} catch {
print("ERROR:", error)
completion(false)
}
})
}
Run Code Online (Sandbox Code Playgroud)
如何将其转换为 swift 5.5 的新 async/await 功能?
这是我尝试过的:
func getTokenBalances3() async {
let url …Run Code Online (Sandbox Code Playgroud) 更新到 Alamofire 4.5 破坏了语法。我应该如何重新格式化我的代码以使其正常工作?
我拥有的:
func getAllBeacons(completionHandler: @escaping ([BeaconModel]) -> ()) {
let URL = "https://testwebapi.knowe.net/Knowe.Beacon.WebApi/beacon/GetAllByLanguage"
let preferredLanguage = NSLocale.preferredLanguages[0]
print(UIDevice.current.modelName)
AF.request(URL, method: .post, parameters: ["SearchValue": preferredLanguage, "IosModelName": UIDevice.current.modelName]).responseArray { (response: DataResponse<[BeaconModel]>) in
let beaconArray = response.result.value
completionHandler(beaconArray!)
}
}
Run Code Online (Sandbox Code Playgroud)
我有什么:
func getAllBeacons(completionHandler: @escaping ([BeaconModel]) -> ()) {
let URL = "https://testwebapi.knowe.net/Knowe.Beacon.WebApi/beacon/GetAllByLanguage"
let preferredLanguage = NSLocale.preferredLanguages[0]
print(UIDevice.current.modelName)
Alamofire.request(URL, method: .post, parameters: ["SearchValue": preferredLanguage, "IosModelName": UIDevice.current.modelName]).responseArray { (response: DataResponse<[BeaconModel]>) in
let beaconArray = response.result.value
completionHandler(beaconArray!)
}
}
Run Code Online (Sandbox Code Playgroud)
奇怪的是,当我在模拟器上运行该代码时,该代码有效,但在我的物理 iPhone 上却无效。后者给了我一个错误:模块“Alamofire”没有名为“请求”的成员
这个项目是分配给我的,不知道用的是什么版本的Alamofire和Alamofireobjectmapper。最好的情况是降级到以前的版本,但我不知道哪些版本将与以前的语法兼容。 …
我正在构建一个 iOS 应用程序,我需要运行 HTTP 请求并处理响应正文。
问题是,当我在 Postman / Alamofire (swift) 与 Browser / Postman-chrome-extension 中进行测试时,我的 request-url 没有给出相同的响应正文。我需要知道为什么!?
这是网址:
当在浏览器中测试时,它给我一个谷歌搜索结果,其中包含视觉上相似的图像。
当在 POSTMAN 或我的 swift 代码中测试时,它返回默认的空白谷歌屏幕。
非常感谢任何帮助!
networking postman alamofire postman-native-app alamofire-request
在没有连接的情况下,我将失败的请求附加到队列管理器(包含数组)
我正在呈现一个带有重试按钮的自定义弹出窗口。当按下重试按钮时,我想重试在无连接状态下无法发送的请求。可能有多个请求。
当我尝试retryRequestAlamofireSession类中的方法时,请求的任务状态保持在 initilazed 或 finish 状态,但必须恢复才能成功发送请求,我该如何解决这种情况?
拦截器接口.swift
public func didGetNoInternetConnection() {
let viewModel = AppPopupViewModel(title: L10n.AppPopUp.areYouOffline, description: L10n.AppPopUp.checkInternetConnection, image: Images.noInternetConnection.image, firstButtonTitle: L10n.General.tryAgain, secondButtonTitle: nil, firstButtonAction: { [weak self] in
guard let self = self else { return }
DispatchQueue.main.async {
self.retry()
}
}, secondButtonAction: nil, dismissCompletion: nil, dimColor: Colors.appGray.color.withAlphaComponent(0.8), showCloseButton: true, customView: nil)
DispatchQueue.main.async {
AppPopupManager.show(with: viewModel, completion: nil)
}
}
private func retry() {
guard let head = NetworkRequestStorage.shared.head else {
return
}
let …Run Code Online (Sandbox Code Playgroud) alamofire ×5
swift ×4
alamofire5 ×2
ios ×2
cocoapods ×1
networking ×1
postman ×1
swiftui ×1
xcode ×1