Hola, Apple

1

Desarrollo de Apps para iOS: Historia y Oportunidades

2

Instalación y configuración inicial de Xcode para iOS

3

Requisitos para Desarrollar Apps iOS Sin iPhone

Tu primera app en iOS

4

Creación de la primera app iOS con Xcode: Login de Facebook

5

Navegación entre pantallas en iOS con UI Navigation Controller

6

Creación y conexión de múltiples storyboards en iOS

7

Conexiones IBOutlets y IBActions en iOS con Storyboards

8

Comparativa: Auto Layout vs SwiftUI en Desarrollo iOS

9

Auto Layout en iOS: Diseño Responsivo con Constraints y StackViews

10

Creación y configuración de tablas en iOS con Swift

11

Creación de celdas personalizadas en TableView de iOS

12

Persistencia de Datos en iOS con UserDefaults

Manejo de dependencias

13

Gestión de Dependencias en iOS con CocoaPods

14

Manejo de dependencias en iOS con Kardash y CocoaPods

Servicios Web

15

Consumo de Servicios Web en iOS con URL Session

16

Consumo de Servicios Web en iOS con URLSession

17

Serialización de JSON a Modelos en Swift 5 con Codable

18

Uso de Alamofire para Networking en iOS

Proyecto: PlatziTweets

19

Desarrollo de "Platzi Tweets": Red Social iOS Realista

20

Configuración Inicial de Proyecto iOS con CocoaPods

21

Diseño de Pantallas de Bienvenida, Inicio de Sesión y Registro en iOS

22

Controladores y validaciones en pantallas de registro y login

23

Validación y Conexiones en Login y Registro iOS

24

Modelado de Endpoints y JSON para API de PlatziTweets

25

Integración de Autenticación con API de Platzi Tweets

26

Desarrollo de Registro y Autenticación en Aplicaciones iOS

27

Diseño de Interfaces para Aplicaciones iOS: Creación de Celdas Personalizadas

28

Consumo de API para mostrar tweets en iOS

29

Diseño de Pantalla para Crear y Publicar Tweets en iOS

30

Conexión de Pantalla de Publicación con Servicios de Platzi Tweets

31

Borrado de Tweets Propios en iOS usando Swipe en UITableView

32

Uso de la Cámara del iPhone para Adjuntar Fotos en Posts

33

Conexión de Aplicaciones iOS con Firebase paso a paso

34

Configuración de iPhone y X-Code para ejecución de apps

35

Subida de Fotos a Firebase y Publicación en Twitter

36

Configuración de Post con Imagen en Firebase

37

Captura y Publicación de Videos en iOS con Firebase

38

Subida de Videos a Firebase e Integración en Posts de iOS

39

Configuración de Celdas para Reproducción de Videos en iOS

40

Acceso al GPS y almacenamiento de coordenadas en iOS

41

Integración de Mapas en iOS con Coordenadas de Usuario

42

Marcadores y Configuración de Mapas en iOS con Swift

43

Mejoras avanzadas en UI y UX para iOS Developer

En producción

44

Distribución de Aplicaciones con Firebase App Distribution

45

Distribución de aplicaciones iOS con TestFlight de Apple

46

Publicación de Apps en TestFlight y App Store con Apple

iOS Avanzado

47

Implementación de Dark Mode en Aplicaciones iOS

48

Creación de Interfaces Básicas con SwiftUI en iOS

49

Reutilización de Componentes en SwiftUI: Creación de un Login Personalizado

50

Desarrollo de Apps iOS con Objective-C: Proyecto Básico de Tabla

Hola, iOS Developer

51

Desarrollo de Aplicaciones iOS con Proyecto Final

52

Desarrollo de Aplicaciones en iOS: Sesión Avanzada

No tienes acceso a esta clase

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

Integración de Autenticación con API de Platzi Tweets

25/52
Recursos

¿Cómo integrar el login con los servicios de Platzi Tweets?

Integrar el login de nuestra aplicación con los servicios de Platzi Tweets es un paso esencial para implementar la autenticación real. Debemos familiarizarnos con el API de Platzi Tweets y las entidades necesarias. Si no has completado el reto previo, te proporcionamos el material descargable para que puedas seguir adelante.

¿Qué entidades y endpoints se necesitan crear?

Es crucial definir las entidades que interactuarán con el API, como LoginResponse y Error. Estas entidades deben estar organizadas en un directorio de modelos, asegurando que cada estructura representa correctamente las entidades del API. Además, es fundamental identificar los endpoints, es decir, las URLs a las que apuntaremos para las diferentes operaciones como autenticación y registro.

¿Cómo se realizan las validaciones y configuraciones iniciales?

Primero, importa las librerías necesarias: SimpleNetworking para manejar las peticiones de red y una librería de indicadores de carga para mejorar la experiencia del usuario.

import SimpleNetworking
import MyLoadingIndicatorLibrary

Asegúrate de que las validaciones de los campos de email y password son correctas. Estos datos ya estan disponibles y verificamos que no estén vacíos antes de proseguir.

¿Cómo configurar y manejar la peticion de login?

Sigue los pasos de la documentación de SimpleNetworking para realizar una petición POST:

let loginRequest = LoginRequest(email: userEmail, password: userPassword)
SN.request.post(endpoint: Endpoints.login, model: loginRequest) { (response: Response<LoginResponse, ErrorResponse>) in 
    switch response {
    case .success(let user):
        // Maneja el éxito
    case .error:
        // Maneja un error desconocido
    case .errorWithResponse(let error):
        // Maneja los errores controlados
    }
}
  • loginRequest utiliza los datos validados.
  • Configura el endpoint y el modelo que utilizaremos.
  • Utiliza un switch para manejar los diferentes casos de respuesta del API.

¿Cómo mostrar al usuario que la petición está en proceso?

Utiliza una librería de indicadores de carga para notificar al usuario y optimizar la usabilidad:

LoadingIndicator.show()

Al completar la petición, asegúrate de realizar la siguiente acción:

LoadingIndicator.dismiss()

¿Cómo responder al usuario tras el login?

Una vez controlados los diferentes escenarios del switch, muestra un banner de notificación al usuario:

NotificationBanner.show(style: .success, message: "Bienvenido, \(user.name)")

Este banner le indica al usuario que ha iniciado sesión exitosamente. También puedes gestionar errores desconocidos o conocidos mostrando banners con estilos y colores apropiados según el tipo de error.

Ahora, es tu turno. Desafíate a implementar banners para cada caso de error y lleva al usuario a la pantalla principal de la aplicación si el login es exitoso. ¡Continúa aprendiendo y mejorando tus habilidades de desarrollo!

Aportes 14

Preguntas 7

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?