Guida per gli sviluppatori di Cloud Anchor per iOS

L'SDK ARCore per iOS si interfaccia con ARKit per fornire il servizio Cloud Anchor che consentono di condividere gli ancoraggi tra i dispositivi iOS e Android stesso ambiente.

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

Prerequisiti

  • Xcode 13.0 o versioni successive
  • Cocoapods 1.4.0 o versione successiva se utilizzi Cocoapods
  • Un dispositivo Apple compatibile con ARKit con iOS 12.0 o versioni successive (è richiesta la destinazione del deployment di iOS 12.0 o versioni successive)

Se non hai mai utilizzato gli ancoraggi Cloud:

Abilita gli ancoraggi Cloud nella tua app

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

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

Ospita e risolvi gli anchor

Puoi ospitare e risolvere i cloud anchor con l'API ARCore Cloud Anchor. L'API include metodi di callback per le operazioni completate, nonché gli oggetti futuri che possono essere intervistati.

Ospita un ancoraggio

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

Una richiesta di host invia dati visivi a un server Google, che mappa il server ARAnchor posizione in un sistema di coordinate che rappresenta lo spazio fisico attuale. R una richiesta host completata restituisce un nuovo ID di ancoraggio Cloud, che può essere condiviso per risolvere l'anchor 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];
}

Risolvi un ancoraggio

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

Una richiesta di risoluzione invia a un server Google un ID Cloud anchor insieme a dati visivi dal frame corrente. Il server tenterà di trovare una corrispondenza con questi dati visivi con le immagini dei punti in cui sono mappati gli ancoraggi Cloud attualmente ospitati. Quando viene risolto correttamente, viene aggiunto un nuovo ancoraggio alla sessione e 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 usi Metal o ti serve un'opzione di polling e la tua app viene eseguita a un almeno 30 f/s, usa il seguente pattern per passare ARFrame s alla 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 Illimitato N/D Progetto
Ancorare le richieste host 30 minuto Indirizzo IP e progetto
Richieste di risoluzione di ancoraggio 300 minuto Indirizzo IP e progetto

Problemi noti e soluzioni alternative

Esistono alcuni problemi noti relativi all'utilizzo dell'SDK ARCore per iOS.

Le impostazioni dello schema predefinito causano l'arresto anomalo intermittente dell'app

Le impostazioni dello schema GPU Frame Capture e Metal API Validation sono abilitate da che a volte possono 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 vedi MTLDebugComputeCommandEncoder nell'analisi dello stack, probabilmente la causa è alle impostazioni predefinite dello schema.

Soluzione alternativa

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

  2. Apri la scheda Run.

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

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

  5. Crea ed esegui la tua app.

Consulta la pagina CHANGELOG di Cocoapod per conoscere altri problemi noti.

Limitazioni

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

Considerazioni sulle prestazioni

La memoria utilizzata aumenta quando abiliti l'API ARCore. Sono previsti l'utilizzo della batteria da parte del dispositivo potrebbe aumentare a causa di un maggiore utilizzo della rete e della CPU.

Passaggi successivi