所以基本上我的服务器上有一个登录脚本,它根据用户凭据是正确还是错误返回结果,并且我有一个iOS应用程序将数据发送到该登录脚本以返回正确或错误的结果。
以下是我的登录页面的相关部分,其中显示了返回代码($ userDetails是对正确或错误凭据的TRUE或FALSE检查):
$userDetails = $dao->getUserDetailsWithHashedPassword($email,$password);
if($userDetails===TRUE) {
$returnValue["status"] = "Success";
$returnValue["message"] = "User logged in !";
echo json_encode($returnValue);
} else {
$returnValue["status"] = "error";
$returnValue["message"] = "User not found";
echo json_encode($returnValue);
}
如果有人需要查看getUserDetailsWithHashedPassword()的内容,click here
使用Postman测试HTTP POST,一切正常,发布email@email.com&正文中的testpassword并使用正确的Content-Type(application / x-www-form-urlencoded):
{"status":"error","message":"User not found"}
现在我的iOS应该用这段代码来解释:
@IBAction func loginButtonPressed(_ sender: AnyObject) {
let userEmail = emailLoginField.text
let userPassword = passwordLoginField.text
// Check for empty fields
if((userEmail?.isEmpty)! || (userPassword?.isEmpty)!) {
// Display alert message
displayMyAlertMessage(userMessage: "All fields are required");
return ;
}
// Send user data to server side
let myUrl = URL(string: "https://support.vincentsolutions.ca/userLogin.php");
var request = URLRequest(url:myUrl!);
request.httpMethod = "POST";
request.addValue("application/x-www-form-urlencoded", forHTTPHeaderField: "Content-Type")
let postString = "email=\(userEmail!)&password=\(userPassword!)";
request.httpBody = postString.data(using: String.Encoding.utf8);
URLSession.shared.dataTask(with: request, completionHandler: { (data:Data?, response:URLResponse?, error:Error?) -> Void in
if error != nil {
print ("error=\(error)")
return
}
do {
let json = try JSONSerialization.jsonObject(with: data!, options: .mutableContainers) as? NSDictionary
if let parseJSON = json {
var resultValue = parseJSON["status"] as? String
print("result: \(resultValue)")
var isUserLoggedIn:Bool = false;
if(resultValue=="Success") {
// Login is successful
UserDefaults.standard.set(true, forKey: "isUserLoggedIn");
UserDefaults.standard.synchronize();
self.performSegue(withIdentifier: "loginSuccesful", sender: self)
}
var messageToDisplay:String = parseJSON["message"] as! String!;
if(!isUserLoggedIn) {
messageToDisplay = parseJSON["message"] as! String!;
}
DispatchQueue.main.async(execute: {
// Display alert message with confirmation.
var myAlert = UIAlertController(title: "Alert", message: messageToDisplay, preferredStyle: UIAlertControllerStyle.alert);
let okAction = UIAlertAction(title: "Ok", style: UIAlertActionStyle.default){ action in
self.dismiss(animated: true, completion: nil);
}
myAlert.addAction(okAction);
self.present(myAlert, animated: true, completion: nil);
});
}
} catch let error as NSError {
print("An error occured: \(error)")
}
}).resume()
现在,当我从iOS App运行代码时,我收到此错误:
发生错误:错误域= NSCocoaErrorDomain代码= 3840" JSON文本 没有从数组或对象和选项开始,不允许片段 。组"
有人看到这里有什么问题吗?我曾尝试在SO和互联网上查找该错误,但无法找到与我的情况相关的任何内容。
答案 0 :(得分:0)
这是因为您从URL接收的响应可能不是正确的JSON格式。我建议你做两件事 -
让json =尝试NSJSONSerialization.JSONObjectWithData(data!,options:NSJSONReadingOptions.AllowFragments)!的NSDictionary