Integrar Google Drive en una app iOS

En Fossil, tuve la oportunidad de experimentar con la integración de Google Drive, como almacenamiento basado en la nube. La principal ventaja de usar Google Drive es compartir con otros miembros fácilmente, con una buena interfaz web para modificar los contenidos de las carpetas, y es gratis. Sin embargo, tuve dificultades al intentar hacer funcionar Google Drive debido a la falta de documentación y artículos relacionados con las APIs de Google Drive, especialmente en Swift. Además, el código y los ejemplos en los sitios de Google están desactualizados. Por lo tanto, decidí escribir este artículo con la esperanza de ahorrarte tiempo cuando quieras integrar Google Drive a tus apps. Comencemos.
Crear tu app y acceso a la API de Google
Para usar las APIs de Google, primero debemos ir a Google Console Dashboard para crear un proyecto. Así que dirígete a Google cloud console, haz clic en el menú desplegable para crear un nuevo proyecto.
Tu API de Google Drive está deshabilitada por defecto cuando creas nuevos proyectos. Para habilitar la API de Google Drive manualmente, haz clic en el elemento “APIs & Services” en la barra lateral izquierda, te llevará a otra página donde puedes habilitar los servicios de Google para tus apps.
Haz clic en el botón “Enable APIs and services”, luego escribe para buscar “Google drive”, después selecciona Google Drive de los resultados, finalmente haz clic en “Enable” para activar la app.

Eso es todo lo que necesitas para crear una app usando la API de Google.
Agregar credenciales para tu app iOS
Las credenciales permiten que tu iOS acceda a tus APIs habilitadas. Haz clic en el botón “Credentials” en la barra lateral izquierda para agregar tu app iOS. Luego, ingresa la información de tu app incluyendo el nombre de tu app y el bundle id, por favor ten en cuenta que necesitas escribir exactamente el bundle id, de lo contrario no funcionará.
Después de crear las nuevas credenciales exitosamente, deberías poder descargar el archivo plist que contendrá las claves necesarias para configurar tu proyecto Xcode. Guarda este archivo en un lugar seguro, lo usaremos en el siguiente paso.
1 | <?xml version="1.0" encoding="UTF-8"?> |
Configuración del proyecto
Google APIs Client Library es una biblioteca escrita por Google para acceder a las APIs de Google. Adelante y agrega la siguiente biblioteca a tu archivo Pod.
1 | pod 'GoogleAPIClientForREST/Drive', '~> 1.2.1' |
Encontrarás YOUR_REVERSED_CLIENT_ID y YOUR_CLIENT_ID en el archivo plist de configuración del cliente que descargaste previamente. Selecciona tu proyecto objetivo, ve a la pestaña “Info”, agrega un nuevo elemento en la sección “URL Types”, luego ingresa YOUR_REVERSED_CLIENT_ID en el cuadro “URL Schemes”.
En caso de que no sepas para qué sirven los URL Schemes, cada elemento en la sección URL Schemes te permite definir un esquema de URL personalizado para tu app. Por ejemplo, tu app podría permitir a los usuarios tocar una URL personalizada en un correo electrónico para lanzar tu app en un contexto específico. Por defecto, Apple soporta esquemas comunes asociados con apps del sistema como mail, sms, facetime, etc. Para más información, por favor consulta Defining a Custom URL Scheme for Your App
Si no agregas YOUR_REVERSED_CLIENT_ID como un esquema de URL personalizado, tu app tendrá el siguiente crash al intentar autorizar con la API de Google. Así que asegúrate de no omitir este paso importante.
Luego, abre el archivo AppDelegate.swift, agrega tu client id a la instancia de Google Sign In.
1 | func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool { |
Después, abre tu ViewController donde permites al usuario iniciar sesión con su cuenta de Google e implementa los dos delegados GIDSignInUIDelegate y GIDSignInDelegate de Google Sign in.
1 | extension ViewController: GIDSignInDelegate { |
Finalmente, asigna el delegado de Google sign in a tu view controller.
1 | private func setupGoogleSignIn() { |
Podrías notar la línea de código GIDSignIn.sharedInstance().scopes. Esta línea de código define qué permisos otorga el usuario a tu app para acceder a sus datos al autenticarse. En este caso, usamos el scope kGTLRAuthScopeDrive que permite a nuestra app ver y administrar todos los archivos en el Google Drive del usuario, incluyendo team drive. El método signInSilently intentará iniciar sesión silenciosamente con un usuario previamente autenticado.
Si realizas todos los pasos anteriores correctamente, deberías poder autenticar tu app con la API de Google.
APIs comunes
Trabajar con “My Drive”
Búsqueda
1 | public func search(_ name: String, onCompleted: @escaping (GTLRDrive_File?, Error?) -> ()) { |
Listado
1 | public func listFiles(_ folderID: String, onCompleted: @escaping (GTLRDrive_FileList?, Error?) -> ()) { |
Subida
1 | private func upload(_ folderID: String, fileName: String, data: Data, MIMEType: String, onCompleted: ((String?, Error?) -> ())?) { |
Descarga
1 | public func download(_ fileItem: GTLRDrive_File, onCompleted: @escaping (Data?, Error?) -> ()) { |
Eliminación
1 | public func delete(_ fileItem: GTLRDrive_File, onCompleted: @escaping ((Error?) -> ())) { |
Trabajar con “Team Drive”
Lo único que necesitamos hacer para trabajar con “Team Drive” es establecer el parámetro corpora de la consulta a teamDrive. Por defecto, se aplica el corpora user. Eso significa que la consulta solo se aplica a las carpetas propiedad del usuario. Al establecerlo en teamDrive, indicamos que la consulta afectará al team drive del usuario. Podemos combinar múltiples corpora en una sola consulta si necesitas hacerlo.
Reflexiones finales
Google Drive es un almacenamiento ideal para integrar con nuestras aplicaciones. En este artículo, cubrimos cómo configurar la API de Google Drive y cómo ejecutar APIs comunes. Espero que hayas aprendido algo hoy.
Puedes encontrar todo el código fuente de demostración en mi Github
Referencias
[1] Google Developer https://developers.google.com/drive/api/v3/about-sdk