Cloud Anchors-Entwicklerleitfaden für iOS

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

Weitere Informationen zur Verwendung der ARCore Cloud Anchor API oder des ARCore Cloud Anchor-Dienstes in Ihren eigenen Apps

Vorbereitung

  • Xcode Version 13.0 oder höher
  • CocoaPods 1.4.0 oder höher, wenn Sie CocoaPods verwenden
  • Ein ARKit-kompatibles Apple-Gerät mit iOS 12.0 oder höher (Bereitstellungsziel muss iOS 12.0 oder höher sein)

Wenn Sie Cloud-Anker noch nicht kennen:

Cloud-Markierungen in Ihrer App aktivieren

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

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

Anker hosten und auflösen

Mit der ARCore Cloud Anchor API können Sie Cloud-Markierungen hosten und auflösen. Die API umfasst Rückrufmethoden für abgeschlossene Vorgänge sowie Future-Objekte, die abgefragt werden können.

Anker hosten

Wenn Sie einen ARAnchor hosten, wird der Anker in ein gemeinsames Koordinatensystem für einen bestimmten physischen Ort gesetzt.

Eine Hostanfrage sendet visuelle Daten an einen Google-Server, der die Position der ARAnchor in einem Koordinatensystem abbildet, das den aktuellen physischen Raum darstellt. Bei einer erfolgreichen Hostanfrage wird eine neue Cloud Anchor-ID zurückgegeben, die freigegeben und später zum Auflösen 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 Sie eine ARAnchor auflösen, können Android- und iOS-Geräte in einem bestimmten physischen Bereich neuen Szenen zuvor gehostete Anker hinzufügen.

Bei einer Auflösungsanfrage wird an einen Google-Server eine Cloud-Anker-ID zusammen mit visuellen Daten aus dem aktuellen Frame gesendet. Der Server versucht, diese visuellen Daten mit den Bildern abzugleichen, an denen derzeit gehostete Cloud-Anchors zugeordnet sind. Wenn die Auflösung erfolgreich war, 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-Polling-Muster

Wenn Sie Metal verwenden oder eine Polling-Option benötigen und Ihre App mit mindestens 30 fps ausgeführt wird, verwenden Sie das folgende Muster, um ARFrames an die 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
Anfragen an Host anpinnen 30 Minute IP-Adresse und Projekt
Anfragen an Anchor resolve 300 Minute IP-Adresse und Projekt

Bekannte Probleme und Problemumgehungen

Bei der Arbeit mit dem ARCore SDK für iOS sind einige Probleme bekannt.

Standardschemaeinstellungen führen zu gelegentlichen App-Abstürzen

Die Einstellungen für die GPU-Frame-Aufnahme und das Metal API-Validierungsschema sind standardmäßig aktiviert. Dies kann manchmal dazu führen, dass die App im SDK abstürzt.

App-Absturz diagnostizieren

Wenn Sie vermuten, dass ein Absturz aufgetreten ist, sehen Sie sich den Stack-Trace an. Wenn im Stack-Trace MTLDebugComputeCommandEncoder angezeigt wird, liegt das wahrscheinlich an den Standardschemaeinstellungen.

Problemumgehung

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

  2. Öffnen Sie den Tab Run.

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

  4. Achten Sie darauf, dass sowohl GPU Frame Capture als auch Metal API Validation deaktiviert sind.

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

Weitere bekannte Probleme finden Sie in der Cocoapods-CHANGELOG.

Beschränkungen

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

Hinweise zur Leistung

Die Speichernutzung erhöht sich, wenn Sie die ARCore API aktivieren. Aufgrund der höheren Netzwerk- und CPU-Auslastung steigt der Akkuverbrauch des Geräts.

Nächste Schritte