Guida per gli sviluppatori di Cloud Anchor per iOS

L'SDK ARCore per iOS si interfaccia con ARKit per fornire funzionalità di Cloud Anchor, consentendoti di condividere ancore tra dispositivi iOS e Android nello stesso ambiente.

Scopri come utilizzare l'API ARCore Cloud Anchor o il servizio ARCore Cloud Anchor nelle tue app.

Prerequisiti

  • Xcode versione 13.0 o successive
  • Cocoapods 1.4.0 o versioni successive se utilizzi Cocoapods
  • Un dispositivo Apple compatibile con ARKit con iOS 12.0 o versioni successive (è necessario un target di deployment di iOS 12.0 o versioni successive)

Se non hai mai utilizzato Cloud Anchors:

Attivare Cloud Anchors nell'app

Per utilizzare l'API Cloud Anchors, devi creare un GARSessionConfiguration e impostarne la proprietà cloudAnchorMode, come descritto in Configurare una sessione ARCore in iOS. Utilizza setConfiguration:error: (GARSession) per impostare la configurazione.

Devi anche attivare l'API ARCore per la tua applicazione.

Gestire e risolvere gli ancoraggi

Puoi ospitare e risolvere gli ancoraggi cloud con l'API ARCore Cloud Anchor. L'API include metodi di callback per le operazioni completate, nonché oggetti Future che possono essere sottoposti a polling.

Ospitare un ancoraggio

L'hosting di un ARAnchor inserisce l'ancora in un sistema di coordinate comune per qualsiasi spazio fisico.

Una richiesta di host invia dati visivi a un server Google, che mappa la posizione del ARAnchor in un sistema di coordinate che rappresenta lo spazio fisico corrente. Una richiesta di hosting riuscita restituisce un nuovo ID Cloud Anchor, che può essere condiviso e utilizzato per risolvere l'ancora in un secondo momento.

- (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];
}

Risolvere un'ancora

La risoluzione di un ARAnchor consente ai dispositivi Android e iOS in un determinato spazio fisico di aggiungere ancore ospitate in precedenza a nuove scene.

Una richiesta di risoluzione invia a un server Google un ID ancoraggio cloud insieme ai dati visivi del frame corrente. Il server tenterà di abbinare questi dati visivi alle immagini della posizione in cui sono mappati gli ancoraggi cloud attualmente ospitati. Se la risoluzione va a buon fine, viene aggiunto e restituito un nuovo ancora alla sessione.

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

Pattern di polling GARSession facoltativo

Se utilizzi Metal o hai bisogno di un'opzione di polling, e la tua app viene eseguita a un minimo di 30 fps, utilizza il seguente pattern per passare i ARFrame al GARSession:

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

Quote API

L'API ARCore ha le seguenti quote per la larghezza di banda delle richieste:

Tipo di quota Massimo Durata Si applica a
Numero di ancore Illimitato N/D Progetto
Richieste di hosting dell'ancora 30 minuto Indirizzo IP e progetto
Richieste di resolve dell'ancora 300 minuto Indirizzo IP e progetto

Problemi noti e soluzioni alternative

Esistono alcuni problemi noti quando si utilizza l'SDK ARCore per iOS.

Le impostazioni predefinite dello schema causano arresti anomali intermittenti dell'app

Le impostazioni dello schema di convalida dell'API Metal e della funzionalità di acquisizione frame della GPU sono attivate per impostazione predefinita, il che a volte può causare l'arresto anomalo dell'app all'interno dell'SDK.

Diagnosticare un arresto anomalo dell'app

Ogni volta che sospetti che si sia verificato un arresto anomalo, dai un'occhiata alla traccia dello stack. Se nella traccia dello stack viene visualizzato MTLDebugComputeCommandEncoder, è probabile che sia dovuto alle impostazioni predefinite dello schema.

Soluzione

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

  2. Apri la scheda Run.

  3. Fai clic su Options per visualizzare le impostazioni correnti.

  4. Assicurati che sia GPU Frame Capture sia Metal API Validation siano disattivati.

  5. Crea ed esegui la tua app.

Per altri problemi noti, consulta la pagina CHANGELOG di Cocoapods.

Limitazioni

L'SDK ARCore per iOS non supporta la chiamata al metodo ARKit setWorldOrigin(relativeTransform:).

Considerazioni sulle prestazioni

L'utilizzo della memoria aumenta quando attivi l'API ARCore. L'utilizzo della batteria del dispositivo dovrebbe aumentare a causa di un maggiore utilizzo della rete e della CPU.

Passaggi successivi