Guida per gli sviluppatori di Cloud Anchor per iOS

L'SDK ARCore per iOS si interfaccia con ARKit per fornire le funzionalità di Cloud Anchor e consentirti di condividere gli anchor 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 13.0 o versioni successive
  • Cocoapods 1.4.0 o versioni successive se utilizzi Cocoapods
  • Un dispositivo Apple compatibile con ARKit con iOS 12.0 o versioni successive (target di deployment per iOS 12.0 o versioni successive)

Se non hai mai utilizzato gli ancoraggi Cloud:

Attiva gli ancoraggi cloud nell'app

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

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

Hosting e risoluzione di anchor

Puoi ospitare e risolvere gli ancoraggi cloud con l'API ARCore Cloud Anchor. L'API include metodi di callback per le operazioni completate e gli oggetti futuri di cui è possibile eseguire il polling.

Ospita un ancoraggio

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

Una richiesta host invia dati visivi a un server Google, che mappa la posizione di ARAnchor in un sistema di coordinate che rappresenta lo spazio fisico attuale. Una richiesta host riuscita restituisce un nuovo ID di ancoraggio Cloud, che può essere condiviso e utilizzato per risolvere l'ancoraggio 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 ancoraggio

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

Una richiesta di risoluzione invia a un server Google un ID Cloud anchor insieme ai dati visivi del frame corrente. Il server cercherà di abbinare questi dati visivi alle immagini del punto in cui sono mappati gli ancoraggi Cloud attualmente ospitati. Se la risoluzione ha esito positivo, viene aggiunto un nuovo ancoraggio alla sessione, che viene restituito.

- (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 almeno 30 FPS, usa il seguente pattern per passare ARFrame a 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 prevede le seguenti quote per la larghezza di banda delle richieste:

Tipo di quota Massimo Durata Si applica a
Numero di ancoraggi Schermi illimitati N/A Progetto
Richieste di ancoraggio host 30 minuto Indirizzo IP e progetto
Richieste di ancoraggio resolve 300 minuto Indirizzo IP e progetto

Problemi noti e soluzioni alternative

Esistono alcuni problemi noti che si verificano quando si lavora con l'SDK ARCore per iOS.

Le impostazioni di schema predefinite causano l'arresto anomalo dell'app intermittente

Le impostazioni dello schema di GPU Frame Capture e Metal API Validation 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, controlla l'analisi dello stack. Se nell'analisi dello stack viene visualizzato MTLDebugComputeCommandEncoder, è probabile che questo sia dovuto alle impostazioni dello schema predefinite.

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 GPU Frame Capture e Metal API Validation siano entrambi disattivati.

  5. Crea ed esegui la tua app.

Consulta il CHANGELOG di Cocoapods per ulteriori problemi noti.

Limitazioni

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

Considerazioni sul rendimento

L'utilizzo della memoria aumenta quando abiliti l'API ARCore. È previsto un aumento dell'utilizzo della batteria del dispositivo a causa di un maggiore utilizzo della rete e della CPU.

Passaggi successivi