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:
Machen Sie sich mit dem Prozess zum Hosten und Auflösen eines Cloud Anchor vertraut.
In der quickstart finden Sie Informationen zu Systemanforderungen, zur Einrichtung und zur Installation.
Beispiele für Cloud Anchor
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
Öffnen Sie Product > Scheme > Edit Scheme….
Öffnen Sie den Tab Run.
Klicken Sie auf Options, um die aktuellen Einstellungen aufzurufen.
Achten Sie darauf, dass GPU Frame Capture und Metal API Validation deaktiviert sind.
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.