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!

Aún no tienes acceso a esta clase

Crea una cuenta y continúa viendo este curso

Conexión de la API y Autenticación

25/52
Recursos

Aportes 12

Preguntas 3

Ordenar por:

¿Quieres ver más aportes, preguntas y respuestas de la comunidad? Crea una cuenta o inicia sesión.

  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()
                            }

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!!

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

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
}

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
}

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.

            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()
            }```

¿Por qué no utilizamos Alamofire?