Ios 如何使用SwiftUI从Web API为用户登录?

Ios 如何使用SwiftUI从Web API为用户登录?,ios,swift,xcode,authentication,swiftui,Ios,Swift,Xcode,Authentication,Swiftui,我有一个web API测试,就像这样(你不能访问它,因为它需要一个vpn到服务器): 如果我使用正确的电子邮件和密码()打开API,它将提供如下用户详细信息 [ { "USERNAME": "ThisIsTestApp", "EMAIL": "testing@testing.com", "FULL_NAME": "TestingTesting",

我有一个web API测试,就像这样(你不能访问它,因为它需要一个vpn到服务器):

如果我使用正确的电子邮件和密码()打开API,它将提供如下用户详细信息

[   {
    "USERNAME": "ThisIsTestApp",
    "EMAIL": "testing@testing.com",
    "FULL_NAME": "TestingTesting",
    "NO_TELEPON": "0",
    "PASSWORD": "123123",
    "ROLE": null,
    "DEALER_CODE": null,
    "ALAMAT": null,
    "IS_ACTIVATED": "1",
    "USER_TOKEN": "testingTOken",
    "VERSION_APPS": null   } ]
但是如果我在API链接上输入了错误的电子邮件或密码,它将给出一个如下的空数组

[ ]
我的问题是,如何通过使用给定的API检查电子邮件和密码来检查数据库中是否存在用户

第一种情况是,如果数据库中存在用户,则使用给定的API检查电子邮件和密码。然后,应用程序将存储用户信息,并将一直保留,直到用户按下退出按钮

第二种情况是,如果用户不在数据库中或
[]
中,则应用程序将要求用户正确输入电子邮件和密码


我不知道下一步该怎么办。现在我已经尝试登录了好几天,但仍然找不到正确的方法。如果有人能帮我的话,这将对我这个新手非常有帮助,以防我将来想进行另一个登录视图。

不需要
GeometryReader
。您的问题不清楚,因此我假设您正在询问如何确定用户是否登录并相应地显示正确的视图。您可以创建一个JSON或PLIST文件,并将其与用户信息一起存储在应用程序的一个目录中,以便确定它们是否已登录。从那里,您可以更新
SceneDelegate
func场景(场景:UIScene,willConnectTo会话:UISceneSession,选项connectionOptions:UIScene.connectionOptions)
,如下所示:

func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {
    let url = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first!.appendingPathComponent("User.plist")
    //Change this to whatever file URL you want to use

    if FileManager.fileExsists(at: url) {
        let userDetailView = UserDetailView()
        if let windowScene = scene as? UIWindowScene {
            let window = UIWindow(windowScene: windowScene)
            window.rootViewController = UIHostingController(rootView: UserDetailView())
            self.window = window
            window.makeKeyAndVisible()
        }
    }
    else {
        if let windowScene = scene as? UIWindowScene {
            let window = UIWindow(windowScene: windowScene)
            window.rootViewController = UIHostingController(rootView: ContentView())
            self.window = window
            window.makeKeyAndVisible()
        }
    }
}
如果用户已登录,并且已为用户存储了可用于检索其信息的PLIST或JSON文件,则上述代码将打开
UserDetailView
。如果用户未登录,它将打开
ContentView
,这似乎是您的登录页面。我建议将
ContentView
更改为只包含收集电子邮件和密码所需的文本字段,或者您需要收集的任何其他信息

我真的希望这能回答你的问题,如果不能,我很抱歉,因为你的问题有点不清楚它具体在问什么

编辑:

OP澄清后,以下是实际答案:

可以通过URLSession访问数据库。URLSession是一个内置于
Swift.Foundation
中的苹果API

可以使用以下代码执行此操作:

func login(email: String, password: String) {
    let request = URLRequest(url: URL(string: "http://172.16.5.56:8081/User/SpecificUser/\(email)/\(password)")!)
    let task = URLSession.shared.dataTask(with: request) { (data, response, error) in
        if error != nil {
            print(error!)
            return
        }
        if let response = response {
            print(response)
        }
        if let data = data {
            do {
                let user = try JSONDecoder().decode(User.self, from: data)
                //The database has been checked and the user is successfully authenticated. Continue with saving the user data or whatever you need to do.
            }
            catch {
                print("Could not decode the data. Error: \(error)")
            }
        }
    }
    task.resume()
}
首先,最好创建一个符合
Codable
的用户结构:

struct User: Codable {
    //Add necessary variables based on the data returned from the API
}
您需要添加每个变量,并使变量的名称与从Web API数据中获得的标识符完全相同。例如,对于JSON数据的EMAIL字段,您需要在结构中添加一个名为
EMAIL
的变量

然后,您可以使用以下代码检查API并确定用户是否存在:

func login(email: String, password: String) {
    let request = URLRequest(url: URL(string: "http://172.16.5.56:8081/User/SpecificUser/\(email)/\(password)")!)
    let task = URLSession.shared.dataTask(with: request) { (data, response, error) in
        if error != nil {
            print(error!)
            return
        }
        if let response = response {
            print(response)
        }
        if let data = data {
            do {
                let user = try JSONDecoder().decode(User.self, from: data)
                //The database has been checked and the user is successfully authenticated. Continue with saving the user data or whatever you need to do.
            }
            catch {
                print("Could not decode the data. Error: \(error)")
            }
        }
    }
    task.resume()
}
此函数接受电子邮件和密码参数,然后以指定的格式将其添加到URL。然后执行URL请求,代码检查是否有任何错误。如果它确实有错误,它将返回。然后,代码检查接收的数据是否为
nil
。如果它不是
nil
,它将尝试从接收到的JSON数据将其解码到用户结构中。如果没有这样做,可以确定登录信息可能不正确


希望这有帮助,如果需要澄清,请告诉我。

谢谢回答,我的英语很难说,我已经编辑了我的问题,希望任何人都能读清楚。我了解答案,但遗憾的是,这不是我想要的。我的用户数据来自Web API,因此我需要检查该用户是否存在于我们的数据库中。我最大的问题是我不知道如何通过API链接检查用户是否存在“[]”@GuardianKnight谢谢你让我知道。我已经编辑了这个问题。请看一看,看它是否有用。是的!这回答了我的问题,非常感谢你帮助我,朋友。你是我的救世主!还有一个问题,我可以用UserDefaults存储我的用户数据吗?@GuardianKnight我很高兴能帮上忙!是的,从技术上讲你可以,但这样做是一种可怕的做法。UserDefaults应仅用于小数据块,如小字符串、布尔值、数据等。。我建议使用我建议的file方法。这样也很容易使它成为一个快速的物体。