Я исследовал это в Интернете, но ничего не похоже на код, который у меня есть.
Я пытаюсь работать с функциями firebase как в моих приложениях для Android, так и в iOS. Я последовал руководству, и он отлично работал в Android, потому что это было сделано в Android, но я хочу сделать то же самое в iOS.
Мне сказали, что Alamofire, сравнимый с OkHttp в Android, был подходящим вариантом, но я не уверен, как взять код, который у меня есть в Android, и поместить его в код SWIFT, чтобы он делал то же самое.
Будем очень благодарны любой помощи.
Код, который использовался в Android
public static final MediaType MEDIA_TYPE = MediaType.parse("application/json");
ProgressDialog progress;
private void payoutRequest() {
progress = new ProgressDialog(this);
progress.setTitle("Processing your payout ...");
progress.setMessage("Please Wait .....");
progress.setCancelable(false);
progress.show();
// HTTP Request ....
final OkHttpClient client = new OkHttpClient();
// in json - we need variables for the hardcoded uid and Email
JSONObject postData = new JSONObject();
try {
postData.put("uid", FirebaseAuth.getInstance().getCurrentUser().getUid());
postData.put("email", mPayoutEmail.getText().toString());
} catch (JSONException e) {
e.printStackTrace();
}
// Request body ...
RequestBody body = RequestBody.create(MEDIA_TYPE, postData.toString());
// Build Request ...
final Request request = new Request.Builder()
.url("https://us-central1-myapp.cloudfunctions.net/payout")
.post(body)
.addHeader("Content-Type", "application/json")
.addHeader("cache-control", "no-cache")
.addHeader("Authorization", "Your Token")
.build();
client.newCall(request).enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
// something went wrong right off the bat
progress.dismiss();
}
@Override
public void onResponse(Call call, Response response) throws IOException {
// response successful ....
// refers to response.status('200') or ('500')
int responseCode = response.code();
if (response.isSuccessful()) {
switch(responseCode) {
case 200:
Snackbar.make(findViewById(R.id.layout),
"Payout Successful!", Snackbar.LENGTH_LONG)
.show();
break;
case 500:
Snackbar.make(findViewById(R.id.layout),
"Error: no payout available", Snackbar
.LENGTH_LONG).show();
break;
default:
Snackbar.make(findViewById(R.id.layout),
"Error: couldn't complete the transaction",
Snackbar.LENGTH_LONG).show();
break;
}
} else {
Snackbar.make(findViewById(R.id.layout),
"Error: couldn't complete the transaction",
Snackbar.LENGTH_LONG).show();
}
progress.dismiss();
}
});
}
РЕДАКТИРОВАТЬ - Преобразование
Это то, во что я смог преобразовать вместе с кодом, представленным @emrepun:
// HTTP Request .... (firebase functions)
MEDIA_TYPE.setValue("application/jston", forHTTPHeaderField: "Content-Type")
let url = "https://us-central1-myapp.cloudfunctions.net/payout"
let headers: HTTPHeaders = [
"Content-Type": "application/json",
"cache-control": "Your Token"]
Alamofire.request(url, method: .get, headers: headers).validate().responseJSON { (response) in
switch response.result {
case .success(let value):
// you fall here once you get 200 success code, because you use .validate() when you make call.
print(value)
// parse your JSON here.
let parameters : [String: Any] =
["uid": FIRAuth.auth()!.currentUser!.uid,
"email": self.paypalEmailText.text!]
let postData = try! JSONSerialization.data(withJSONObject: parameters, options: [])
case .failure(let error):
if response.response?.statusCode == 500 {
print("Error no payout available")
print(error.localizedDescription)
} else {
print("Error: couldn't complete the transaction")
print(error.localizedDescription)
}
}
}
Вы можете сделать сетевой запрос, аналогичный вашей версии Java, с помощью Alamofire, как указано ниже. Вы также должны узнать, как анализировать JSON с помощью swift. Возможно, вы захотите посмотреть Codable, который упрощает синтаксический анализ JSON. Или вы можете попробовать фреймворк SwiftyJSON, который также удобен для обработки json-запросов.
let url = "https://us-central1-myapp.cloudfunctions.net/payout"
let headers: HTTPHeaders = [
"Content-Type": "application/json",
"cache-control": "Your Token"
]
Alamofire.request(url, method: .get, headers: headers).validate().responseJSON { (response) in
switch response.result {
case .success(let value):
// you fall here once you get 200 success code, because you use .validate() when you make call.
print(value) // parse your JSON here.
case .failure(let error):
if response.response?.statusCode == 500 {
print("Error no payout available")
print(error.localizedDescription)
} else {
print("Error: couldn't complete the transaction")
print(error.localizedDescription)
}
}
}
Это не точный эквивалент вашей версии, да, вам все равно нужно разобрать JSON. Но, боюсь, вы не можете найти здесь кого-нибудь, кто написал бы точный код, который вам нужен для другой платформы. Я бы посоветовал вам проверить учебники по Alamofire, Codable или, может быть, SwiftyJSON.
Я использовал ваш код выше и добавил к нему. Можете ли вы проверить это и посмотреть, правильно ли я понял, как в приведенном выше коде Android - см. Правка - Конверсия. Я что-то пропустил?
Я закрываю этот пост, поскольку @emrepun действительно помог. По какой-то причине не все до конца в том, что я смог сделать ... Я создам другой пост
Итак, с приведенным выше кодом он в значительной степени выполняет то же самое, что и отправленный мной код Android? или мне еще нужно разобрать json? Я установил Alamofire в свой проект, но это для меня впервые, как и json.