Cloud Anchors-Entwicklerleitfaden für iOS

Das ARCore SDK für iOS-Schnittstellen mit ARKit bietet Cloud Anchor-Funktionen, mit denen Sie Anker zwischen iOS- und Android-Geräten in derselben Umgebung teilen können.

Informationen zur Verwendung der ARCore Cloud Anchor API bzw. des ARCore Cloud Anchor-Dienstes in Ihren eigenen Apps

Voraussetzungen

  • Xcode Version 13.0 oder höher
  • CocoaPods 1.4.0 oder höher, wenn CocoaPods verwendet werden
  • Ein ARKit-kompatibles Apple-Gerät mit iOS 12.0 oder höher (Bereitstellungsziel iOS 12.0 oder höher erforderlich)

Wenn Sie Cloud Anchors noch nicht kennen:

Cloud Anchors in der Anwendung aktivieren

Wenn Sie die Cloud Anchors API verwenden möchten, müssen Sie eine GARSessionConfiguration erstellen und das Attribut cloudAnchorMode dafür festlegen, wie unter ARCore-Sitzung in iOS konfigurieren beschrieben. Verwenden Sie setConfiguration:error: (GARSession), um die Konfiguration festzulegen.

Außerdem müssen Sie die ARCore API für Ihre Anwendung aktivieren.

Anker hosten und auflösen

Sie können Cloud Anchors mit der ARCore Cloud Anchor API hosten und auflösen. Die API enthält Callback-Methoden für abgeschlossene Vorgänge sowie abgefragte Future-Objekte.

Anker hosten

Wenn ein ARAnchor gehostet wird, wird der Anker in einem gemeinsamen Koordinatensystem für einen gegebenen physischen Raum platziert.

Eine Hostanfrage sendet visuelle Daten an einen Google-Server, der die Position von ARAnchor in einem Koordinatensystem abbildet, das den aktuellen physischen Raum darstellt. Eine erfolgreiche Hostanfrage gibt eine neue Cloud-Anker-ID zurück, die freigegeben und später zur Auflösung des Ankers verwendet werden kann.

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

Anker auflösen

Wenn ein ARAnchor aufgelöst wird, können Android- und iOS-Geräte in einem bestimmten physischen Bereich neuen Szenen zuvor gehostete Anker hinzufügen.

Bei einer Auflösungsanfrage wird eine Cloud-Anchor-ID zusammen mit visuellen Daten aus dem aktuellen Frame an einen Google-Server gesendet. Der Server versucht, diese visuellen Daten den Bildern der aktuell gehosteten Cloud-Anker zuzuordnen. Bei erfolgreicher Auflösung wird der Sitzung ein neuer Anker hinzugefügt und zurückgegeben.

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

Optionales GARSession-Abfragemuster

Wenn Sie Metal verwenden oder eine Abfrageoption benötigen und Ihre Anwendung mit mindestens 30 fps ausgeführt wird, verwenden Sie das folgende Muster, um ARFrame-Werte an GARSession zu übergeben:

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

API-Kontingente

Für die ARCore API gelten die folgenden Kontingente für die Anfragebandbreite:

Kontingenttyp Maximum Dauer Gilt für:
Anzahl der Anker Unbegrenzt Projekt
Anchor-Anfragen für host 30 Minute IP-Adresse und Projekt
resolve für Ankeranzeigen 300 Minute IP-Adresse und Projekt

Bekannte Probleme und Behelfslösungen

Bei der Arbeit mit dem ARCore SDK for iOS gibt es einige bekannte Probleme.

Standardschema-Einstellungen verursachen zeitweiligen Absturz der App

Die Einstellungen für das GPU Frame Capture- und das Metal API-Validierungsschema sind standardmäßig aktiviert. Dies kann manchmal zu einem Absturz der App im SDK führen.

App-Absturz diagnostizieren

Prüfen Sie bei jedem Verdacht auf einen Absturz den Stacktrace. Wenn im Stacktrace MTLDebugComputeCommandEncoder angegeben ist, liegt dies wahrscheinlich an den Standardschemaeinstellungen.

Problemumgehung

  1. Öffnen Sie Product > Scheme > Edit Scheme….

  2. Öffnen Sie den Tab Run.

  3. Klicken Sie auf Options, um die aktuellen Einstellungen aufzurufen.

  4. Achten Sie darauf, dass GPU Frame Capture und Metal API Validation deaktiviert sind.

  5. Erstellen Sie Ihre App und führen Sie sie aus.

Weitere bekannte Probleme finden Sie in der CHANGELOG für CocoaPods.

Beschränkungen

Das ARCore SDK for iOS unterstützt nicht den ARKit-Methodenaufruf setWorldOrigin(relativeTransform:).

Hinweise zur Leistung

Die Arbeitsspeichernutzung nimmt zu, wenn du die ARCore API aktivierst. Die Akkunutzung des Geräts wird aufgrund einer höheren Netzwerk- und CPU-Auslastung voraussichtlich steigen.

Nächste Schritte