Nos complace anunciar el lanzamiento de una aplicación de muestra para iOS que demuestra cómo integrar el SDK de anuncios para móviles de Google en una aplicación basada en SwiftUI. Esta publicación cubre cómo implementamos formatos de anuncios de pantalla completa (intersticial, recompensado, intersticial recompensado) en SwiftUI.

El SDK de Google Cellular Advertisements se basa en gran medida en UIKit Framework, según UIView o UIViewController para cada formato de anuncio. Por ejemplo, el SDK actualmente presenta anuncios a pantalla completa utilizando el siguiente método:

presente (fromRootViewController rootViewController: UIViewController)

En UIKit, los anuncios generalmente se implementan en un UIViewController, por lo que es bastante trivial pasar un valor de rootViewController simplemente invocándose a sí mismo. Sin embargo, SwiftUI requiere que nos apartemos de este enfoque, ya que no se puede hacer referencia directa a UIViewController en SwiftUI. Dado que no podemos simplemente pasarnos como el controlador de vista raíz, necesitábamos lograr un resultado comparable utilizando un enfoque nativo de SwiftUI.

Creamos una implementación del protocolo UIViewControllerRepresentable con una propiedad UIViewController. Su único trabajo es proporcionar acceso a la referencia de UIViewController en SwiftUI.

estructura privada AdViewControllerRepresentable: UIViewControllerRepresentable { let viewController = UIViewController() func makeUIViewController(context: Context) -> some UIViewController { return viewController } func updateUIViewController(_ uiViewController: UIViewControllerType, context: Context) {} }

AdViewControllerRepresentable debe incluirse como parte de la jerarquía de vistas aunque no tenga importancia para el contenido en pantalla. Esto se debe a que canPresent(fromRootViewController:) requiere que el valor de la ventana del controlador de vista de presentación no sea nulo.

personal let adViewControllerRepresentable = AdViewControllerRepresentable() var physique: some View { Textual content(«hola, amigo») .font(.largeTitle) // Agregue adViewControllerRepresentable al fondo para que // no influya en la ubicación de otras vistas en el ver la jerarquía. .background { adViewControllerRepresentable .body(ancho: .cero, alto: .cero) } }

Para presentar los anuncios de pantalla completa en nuestra aplicación de muestra, aprovechamos los eventos de acción en SwiftUI.

Button(«¡Mira un anuncio!») { coordinador.presentAd(from: adViewControllerRepresentable.viewController) }

Y nuestra clase AdCoordinator hace el honor de presentarla desde nuestro controlador de vista.

clase privada AdCoordinator: NSObject { anuncio var privado: GADInterstitialAd? … func presentAd(from viewController: UIViewController) { guard let advert = advert else { return print(«El anuncio no estaba listo») } advert.current(fromRootViewController: viewController) } }

¡Y voilá!

En lugar de crear un UIViewControllerRepresentable, siempre existía la opción de consultar la propiedad rootViewController desde UIWindow.

UIApplication.shared.home windows.first?.rootViewController

Decidimos en contra de esta opción por las siguientes razones:

  1. Existe el riesgo de nulabilidad inherente a la consulta de un índice de matriz opcional.
  2. El valor predeterminado de rootViewController es nil.
  3. Si su aplicación utiliza más de una ventana, la matriz de ventanas tendrá varios elementos y, por lo tanto, hará que la consulta del objeto de la «primera» ventana no sea confiable.
  4. home windows en el objeto UIApplication está obsoleto en iOS 15 y UIWindowScene ahora contiene la referencia a esta propiedad.

Sabemos que hay más de una forma de cocinar un huevo cuando se trata de escribir código en SwiftUI. Para nuestro caso de uso, elegimos la opción más amigable con el código bajo. Si tiene alguna pregunta, comuníquese con nuestro foro de desarrolladores.

¡Pruébalo!

DEJA UNA RESPUESTA

Por favor ingrese su comentario!
Por favor ingrese su nombre aquí