Guía para desarrolladores de Cloud Anchors en iOS

El SDK de ARCore para iOS se comunica con ARKit para proporcionar capacidades de Cloud Anchors, lo que te permite compartir anclas entre dispositivos iOS y Android en el mismo entorno.

Aprende a usar la API de Cloud Anchors de ARCore o el servicio de Cloud Anchors de ARCore en tus propias apps.

Requisitos previos

  • Xcode versión 13.0 o posterior
  • Cocoapods 1.4.0 o una versión posterior si usas Cocoapods
  • Un dispositivo Apple compatible con ARKit que ejecute iOS 12.0 o versiones posteriores (se requiere un objetivo de implementación de iOS 12.0 o versiones posteriores)

Si es la primera vez que usas los anclas de Cloud, haz lo siguiente:

Habilita los anclajes de Cloud en tu app

Para usar la API de Cloud Anchors, debes crear un objeto GARSessionConfiguration y establecer la propiedad cloudAnchorMode para él, como se describe en Configura una sesión de ARCore en iOS. Usa setConfiguration:error: (GARSession) para establecer la configuración.

También debes habilitar la API de ARCore para tu aplicación.

Aloja y resuelve anclas

Puedes alojar y resolver Cloud Anchors con la API de Cloud Anchors de ARCore. La API incluye métodos de devolución de llamada para operaciones completadas, así como objetos Future que se pueden sondear.

Aloja un ancla

Al alojar un ARAnchor, se coloca el ancla en un sistema de coordenadas común para cualquier espacio físico determinado.

Una solicitud de host envía datos visuales a un servidor de Google, que asigna la posición de ARAnchor en un sistema de coordenadas que representa el espacio físico actual. Una solicitud de host correcta muestra un nuevo ID de Cloud Anchor, que se puede compartir y usar para resolver el ancla más adelante.

- (void)addAnchorWithTransform:(matrix_float4x4)transform {
  self.arAnchor = [[ARAnchor alloc] initWithTransform:transform];
  [self.sceneView.session addAnchor:self.arAnchor];

  __weak ExampleViewController *weakSelf = self;
  self.hostFuture = [self.cloudAnchorManager
      hostCloudAnchor:self.arAnchor
           completion:^(NSString *anchorId, GARCloudAnchorState cloudState) {
             [weakSelf handleHostAnchor:anchorId cloudState:cloudState];
           }
                error:nil];
  [self enterState:HelloARStateHosting];
}

Resuelve un ancla

La resolución de un ARAnchor permite que los dispositivos iOS y Android en un espacio físico determinado agreguen anclas alojadas anteriormente a escenas nuevas.

Una solicitud de resolución envía un ID de ancla de nube a un servidor de Google junto con datos visuales del fotograma actual. El servidor intentará hacer coincidir estos datos visuales con las imágenes de los lugares donde se asignan los anclas de Cloud alojadas actualmente. Cuando la resolución se realiza correctamente, se agrega un nuevo ancla a la sesión y se muestra.

- (void)resolveAnchorWithIdentifier:(NSString *)identifier {
  GARResolveCloudAnchorFuture *garFuture =
      [self.gSession resolveCloudAnchorWithIdentifier:identifier
                                    completionHandler:completion
                                                error:&error];
}

// Pass the ARFRame to the ARCore session every time there is a frame update.
// This returns a GARFrame that contains a list of updated anchors. If your
// anchor's pose or tracking state changed, your anchor will be in the list.
- (void)cloudAnchorManager:(CloudAnchorManager *)manager didUpdateFrame:(GARFrame *)garFrame {
  for (GARAnchor *garAnchor in garFrame.updatedAnchors) {
    if ([garAnchor isEqual:self.garAnchor] && self.resolvedAnchorNode) {
      self.resolvedAnchorNode.simdTransform = garAnchor.transform;
      self.resolvedAnchorNode.hidden = !garAnchor.hasValidTransform;
    }
  }
}

Patrón de sondeo GARSession opcional

Si usas Metal o necesitas una opción de sondeo, y tu app se ejecuta a un mínimo de 30 fps, usa el siguiente patrón para pasar ARFrame a GARSession:

-(void)myOwnPersonalUpdateMethod {
  ARFrame *arFrame = arSession.currentFrame;
  NSError *error = nil;
  GARFrame *garFrame = [garSession update:arFrame error:&error];
  // your update code here
}

Cuotas de la API

La API de ARCore tiene las siguientes cuotas para el ancho de banda de solicitudes:

Tipo de cuota Máximo Duración Se aplica a
Cantidad de anclas Ilimitado N/A Proyecto
Solicitudes de host de ancla 30 minuto Dirección IP y proyecto
Cómo fijar solicitudes de resolve 300 minuto Dirección IP y proyecto

Problemas conocidos y soluciones

Hay algunos problemas conocidos cuando se trabaja con el SDK de ARCore para iOS.

La configuración predeterminada del esquema causa fallas intermitentes en la app.

La configuración del esquema de validación de la API de Metal y la captura de fotogramas de la GPU están habilitadas de forma predeterminada, lo que, a veces, puede provocar que la app falle dentro del SDK.

Cómo diagnosticar una falla de la app

Cuando sospeches que se produjo una falla, observa el seguimiento de pila. Si ves MTLDebugComputeCommandEncoder en el seguimiento de pila, es probable que se deba a la configuración predeterminada del esquema.

Solución alternativa

  1. Ve a Product > Scheme > Edit Scheme….

  2. Abre la pestaña Run.

  3. Haz clic en Options para ver la configuración actual.

  4. Asegúrate de que GPU Frame Capture y Metal API Validation estén inhabilitados.

  5. Compila y ejecuta tu app.

Consulta CHANGELOG de Cocoapods para obtener más problemas conocidos.

Limitaciones

El SDK de ARCore para iOS no admite la llamada al método setWorldOrigin(relativeTransform:) de ARKit.

Consideraciones de rendimiento

El uso de memoria aumenta cuando habilitas la API de ARCore. Es posible que el uso de batería del dispositivo aumente debido al mayor uso de red y CPU.

Próximos pasos