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 versione successiva 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:

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.

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é gli oggetti futuri che possono essere intervistati.

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

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 Cloud anchor insieme a dati visivi dal 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 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 ha 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
Richieste di hosting dell'ancora 30 minuto Indirizzo IP e progetto
Richieste di risoluzione dell'ancora 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 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 vedi MTLDebugComputeCommandEncoder nell'analisi dello stack, probabilmente la causa è 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 GPU Frame Capture e 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