Swift 无法使用alamofire和DisabledTrustEvaluator向服务器发出请求

Swift 无法使用alamofire和DisabledTrustEvaluator向服务器发出请求,swift,alamofire,Swift,Alamofire,然而,我正试图从使用asp.net core创建的服务器上获取一些数据;当尝试在我的Swift iOS代码中获取数据时,它一直失败,没有显示任何错误。我已经在我的info.plist中完成了所有TSL检查 斯威夫特 import Foundation struct User: Decodable { let name:String let userEmail: String let firebaseId: String let userMode: Int

然而,我正试图从使用asp.net core创建的服务器上获取一些数据;当尝试在我的Swift iOS代码中获取数据时,它一直失败,没有显示任何错误。我已经在我的info.plist中完成了所有TSL检查

斯威夫特

    import Foundation

struct User: Decodable {
    let name:String
    let userEmail: String
    let firebaseId: String
    let userMode: Int
    let profileImg: String
    let loginType: Int?
}
用户控制器.swift

    import UIKit
import ProgressHUD

class LoginViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        removeNavBar()

        
//        UserApiService.shared.makeGetAPICall(user:{users, error in
//         //   ProgressHUD.dismiss()
//            guard let users = users else {return}
//            print(users)
//            guard let errors = error else {return}
//            print(errors)
//        })
    }
    
    @IBAction func googleLogin(_ sender: Any) {
        ProgressHUD.animationType = .circleSpinFade
        ProgressHUD.show()
        UserApiService.init().makeGetAPICall(user: {users, error in
               ProgressHUD.dismiss()
               guard let users = users else {return}
               print(users)
               guard let errors = error else {return}
               print(errors)
           })
    
    }
    private func removeNavBar(){
        navigationController?.navigationBar.setBackgroundImage(UIImage(), for: .default)
        navigationController?.navigationBar.shadowImage = UIImage()
    }

    /*
    // MARK: - Navigation

    // In a storyboard-based application, you will often want to do a little preparation before navigation
    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        // Get the new view controller using segue.destination.
        // Pass the selected object to the new view controller.
    }
    */

}
阿皮斯威夫特

 import Foundation
import Alamofire

class UserApiService{
    
    static let shared =  UserApiService.init()
    
    let session: Session = {
        let manager = ServerTrustManager(allHostsMustBeEvaluated: false,evaluators: ["localhost:5001": DisabledTrustEvaluator()])
        let configuration = URLSessionConfiguration.af.default

        return Session(configuration: configuration, serverTrustManager: manager)
    }()

    //MARK:- GET
    func makeGetAPICall(user completionHandler: @escaping ([User]?,Error?) -> Void) {
        var urlComponent = URLComponents()
        urlComponent.scheme = "https"
        urlComponent.host = "localhost"
        urlComponent.port = 5001
        urlComponent.path = "/api/user"
        print(urlComponent.url!)
        guard let url = urlComponent.url else {
            return
        }
        
        session.request(url, method: .get).validate().responseDecodable(of: [User].self) {(response) in
            switch response.result{
            case .success:
                guard let users = response.value else {
                    return
                }
                print(users)
                completionHandler(users, nil)
                
            case .failure(let error):
                completionHandler(nil, error)
            }
        }
    }
}
info.plist

    <key>NSAppTransportSecurity</key>
<dict>
    <key>NSExceptionDomains</key>
    <dict>
        <key>NSExceptionDomains</key>
        <dict>
            <key>localhost</key>
            <dict>
                <key>NSTemporaryExceptionAllowsInsecureHTTPLoads</key>
                <true/>
                <key>NSIncludesSubdomains</key>
                <true/>
            </dict>
        </dict>
    </dict>
    <key>NSAllowsArbitraryLoadsForMedia</key>
    <true/>
    <key>NSAllowsLocalNetworking</key>
    <true/>
    <key>NSAllowsArbitraryLoadsInWebContent</key>
    <true/>
    <key>NSAllowsArbitraryLoads</key>
    <true/>
</dict>
NSAppTransportSecurity
NSExceptionDomains
NSExceptionDomains
本地服务器
NSTemporary ExceptionalLowsInSecureHttpLoads
n包括多个域
NSAllowsArbilarLoadsFormedia
NSAllowsLocalNetworking
NSAllowsArbilarLoadsInWebContent
NSAllowsArbitraryLoads
我用断点对它进行了调试,得到了
。我很难理解这意味着什么以及我应该如何解决这个问题

另外,我已经更改了我的info.plist,但是它看起来是这样的;我仍然收到同样的问题

<key>NSAppTransportSecurity</key>
    <dict>
        <key>NSAllowsArbitraryLoadsForMedia</key>
        <true/>
        <key>NSAllowsLocalNetworking</key>
        <true/>
        <key>NSAllowsArbitraryLoadsInWebContent</key>
        <true/>
        <key>NSAllowsArbitraryLoads</key>
        <true/>
    </dict>
NSAppTransportSecurity
NSAllowsArbilarLoadsFormedia
NSAllowsLocalNetworking
NSAllowsArbilarLoadsInWebContent
NSAllowsArbitraryLoads

所以我设法解决了我的问题,万岁

我所做的是,我将
计算器:[“localhost:5001”:DisabledTrustEvaluator()
更改为
计算器:[“localhost”:DisabledTrustEvaluator()

另外,当调用我的方法时,我通常是从类中引用,但之后,我不得不将其作为单例调用,然后,嘿,PRESTO,它成功了

 @IBAction func googleLogin(_ sender: Any) {
    ProgressHUD.animationType = .circleSpinFade
    ProgressHUD.show()
    UserApiService.shared.makeGetAPICall(user: {users, error in
           ProgressHUD.dismiss()
           guard let users = users else {return}
           print(users)
           guard let errors = error else {return}
           print(errors)
       })

}

这个链接帮助我找出了问题的部分原因

FYI:“没有任何错误”很难调试。你可以查看一下你的
localhost
的日志,看看是否有请求到达服务器。我在浏览器、我的网站和邮递员中都尝试过,URL得到了数据,只是在iOS应用程序上没有。除非我用错了alamofire,否则我找不到问题是的,我用的是HTTPS,我用的是将其绑定到HTTP,但仍然得到相同的结果。此外,我没有SSL证书,但是它无效;我正在使用firebase和JWT令牌,但所有内容都设置为[AllowAnonymous]因此,即使我还没有在前端实现firebase,我仍然应该获取数据。@omgprogramming:检查我编辑的答案,您的
NSExceptionDomains
的info.plist条目似乎有点混乱,请尝试两种方案1。完全删除
NSExceptionDomains
,只需使用
NSAllowsLocalNetworking
2。修复multi
NSExceptionDomains
标签嵌套,正如我在回答中所建议的那样,除非您尝试SSL固定,否则我看不到真正需要
serverTrustManager
:|