Hola, Apple

1

Hablemos de iOS

2

Conozcamos XCode

3

¿Necesito un iPhone para ser iOS Developer?

Tu primera app en iOS

4

¡Hola, Mundo Apple!

5

Navegación con UINavigationController

6

Modales en la navegación

7

Utilizando controles en código

8

Autolayout vs SwiftUI

9

Autolayout

10

Listas con UITableView

11

Celdas personalizadas para nuestras listas.

12

Persistencia: UserDefaults

Manejo de dependencias

13

CocoaPods

14

Carthage

Servicios Web

15

Primeros pasos para consumir servicios

16

Afinando detalles para consumir servicios

17

Convirtiendo los JSON a modelos

18

Alamofire

Proyecto: PlatziTweets

19

Bienvenido a PlatziTweets

20

Configurando Proyecto

21

Diseñando vistas iniciales

22

Configuración de vistas iniciales

23

Configuración de registro

24

Descripción de la API de PlatziTweets

25

Conexión de la API y Autenticación

26

Registro de usuarios

27

Diseño del Tweet

28

Obteniendo Tweets

29

Creación de vista para publicar Tweets

30

Publicando Tweets

31

Borrando Tweets

32

Integración de la cámara

33

Conexión con Firebase

34

Configuración de XCode para correr app

35

Subir imagen a Firebase

36

Publicar Tweet con imagen

37

Tomando Videos para el Tweet

38

Publicar Tweet con video

39

Detalles del video

40

Accediendo al GPS

41

Implementando mapas con MapsKit

42

Mostrando todos los estudiantes en el mapa

43

Retos del proyecto

En producción

44

Enviar a pruebas con Firebase Distribution

45

Enviar tu aplicación a APP Store Connect

46

Distribución de tu app con TestFlight

iOS Avanzado

47

Dark Mode

48

SwiftUI

49

Terminando detalles de una vista con SwiftUI

50

Objective-C

Hola, iOS Developer

51

Felicidades

52

Expert Session: ¡nuevo espacio para resolver tus dudas sobre el desarrollo de Apps para iOS!

No tienes acceso a esta clase

¡Continúa aprendiendo! Únete y comienza a potenciar tu carrera

¡Se acaba el precio especial! Aprende Inglés, AI, programación y más.

Antes: $249

Currency
$209
Suscríbete

Termina en:

1 Días
11 Hrs
47 Min
37 Seg

Conexión de la API y Autenticación

25/52
Recursos

Aportes 14

Preguntas 6

Ordenar por:

¿Quieres ver más aportes, preguntas y respuestas de la comunidad?

  switch response {
                        case .success(let user):
                            //todo lo bueno
                            self.performSegue(withIdentifier: "showHome", sender: nil)
                            DispatchQueue.main.async {
                                NotificationBanner(subtitle: "Bienvenido \(user.user.names)", style: .success).show()
                            }

El servicio ya no está disponible.!

Al parecer el servicio que se usaba para el proyecto en heroku ya no está funcionando, seguramente porque heroku pasó a ser de pago.

He estado buscando el repositorio del backend que se utilizó para este proyecto en la cuenta de github de platzi y pues, creo que tampoco existe.

Quizá lo más recomendable sería levantar un proyecto de backend para que responda a los servicios cómo lo hacía el anterior, aunque no cargue nada a la base de datos, yo por mi parte creo que dejo el curso aquí a nivel práctico y sólo lo seguiré tomando a nivel teórico.

Tal vez con más tiempo después cree ese backend y publique el repositorio para que quien pase por aquí lo pueda correr y probar de manera local.

Si se les crashea el app, es por el SVProgressHUD. Tienen que hacer lo siguiente:

En la clase AppDelegate agregar esta variable:

var window: UIWindow?

Y en la primera función de la clase SceneDelegate, agregar esta linea:

(UIApplication.shared.delegate as? AppDelegate)?.self.window = window

Fuente

Usuario: [email protected]
Password: qwerty

Hola Carlos,
Cuando pruebo la aplicación con el email y password me arroja este error:

Error Domain=NSURLErrorDomain Code=-999"cancelled" UserInfo={NSErrorFailingURLStringKey=https://platzi-tweets-backend.herokuapp.com/api/v1/auth, NSLocalizedDescription=cancelled, NSErrorFailingURLKey=https://platzi-tweets-backend.herokuapp.com/api/v1/auth}
custom(error: Optional(Error Domain=NSURLErrorDomain Code=-999"cancelled" UserInfo={NSErrorFailingURLStringKey=https://platzi-tweets-backend.herokuapp.com/api/v1/auth, NSLocalizedDescription=cancelled, NSErrorFailingURLKey=https://platzi-tweets-backend.herokuapp.com/api/v1/auth}))
2020-03-0810:00:12.442863+0100 PlatziTweets[5854:126753] Task <7743DB2C-A343-4C09-962E-F03F051EDA59>.<1> HTTP load failed, 0/0 bytes (errorcode: -999 [1:89])```
Por postman lo he probado y va bien, alguna idea ?
Gracias!!

            switch response {
            case .success(let user):
                // todo lo bueno
                NotificationBanner(subtitle: "Bienvenido \(user.user.names)", style: .success).show()
            
            case .error(let error):
                // todo lo malo
                NotificationBanner(title: "Error", subtitle: "No podemos conectarnos con el servidor", style: .warning).show()
                
            case .errorResult(let entity):
                // error pero no tan malo
                NotificationBanner(title: "Error", subtitle: "Verifique sus credenciales", style: .warning).show()
            }```

me quede un poco estancado porque el servicio siempre me mandaba error, hasta que me di cuenta que trae mas datos del usuario, se los agregue a la clase y ya pude continuar

struct User: Codable {
    let email:String
    let names: String
    let nickname: String
    let createdAt: String
    let id: String
}

Las librerias de iOS tienen una calidad muy buena

En caso de que tubieran problemas con la leccion anterior les dejo como me quedo a mi 👀 no sean tramposos.

import Foundation

struct Api {
    static let domain = "https://platzi-tweets-backend.herokuapp.com/api/v1"
    static let login = Api.domain + "/auth"
    static let register = Api.domain + "/register"
    static let tweets = Api.domain + "/posts"
}

struct User: Codable {
    let email: String
    let names: String
    let nickname: String
}

struct Location: Codable {
    let latitude: Double
    let longitude: Double
}

struct ErrorResponse: Codable {
    let error: String
}

// Login /auth
struct LoginRequest: Codable {
    let email: String
    let password: String
}

struct LoginResponse: Codable {
    let user: User
    let token: String
}

// Register /register
struct RegisterRequest: Codable {
    let email: String
    let names: String
    let password: String
}

struct RegisterResponse: Codable {
    let user: User
    let token: String
}

// Tweets
struct TweetResponse: Codable {
    let id: String
    let author: User
    let imageUrl: String
    let text: String
    let videoUrl: String
    let location: Location
    let hasVideo: Bool
    let hasImage: Bool
    let hasLocation: Bool
    let createdAt: String
}

struct Tweet: Codable {
    let imageUrl: String
    let text: String
    let videoUrl: String
    let location: Location
}

struct DeleteTweetResponse: Codable {
    let isDone: Bool
    let message: String
}

Hola Carlos,

al probar la app con el login, me muestra este error controlado:

es por el mismo motivo que a mi compañero @catscs?

Gracias

Haciendo pruebas me di cuenta de una cosa:

  • Hay que tener mucho cuidado con el nombre que ponemos en nuestros structs porque tienen que hacer un mach perfecto de la respuesta del servidor.

Yo por ejemplo: cambie en el login request password por pwd y en el login response, en el struct user cambie names por name (porque estoy acostumbrado a esa nomenclatura y me gusta personalmente)

Respuesta: Error no controlable como respuesta al SN.post (ya sabéis, de los dos errores el malo malo)

Como conclusión creo que hay que aprender una forma diferente/mejor de hacerlo. No es aceptable que cuando tienes un app en producción esta falle sin posibilidad a manejar el error porque el binding de variables no hace mach.

Aún así dejar claro que no es hate, es lógico y apoyo que cuando le entras nuevo a una materia hay que darle suave al principio. 🚀

Y tu… ¿Sabes como poder llamar a tus variables name (por ejemplo) cuando la respuesta del server es names? Me gustaría mucho saber cómo hacerlo.

¿Por qué no utilizamos Alamofire?