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:
Sie sollten mit dem Prozess zum Hosten und Auflösen eines Cloud-Anker vertraut sein.
In der Kurzanleitung finden Sie Informationen zu den Systemanforderungen sowie zur Einrichtung und Installation.
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 ARFrame
s 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
Öffnen Sie Product > Scheme > Edit Scheme….
Öffnen Sie den Tab Run.
Klicken Sie auf Options, um Ihre aktuellen Einstellungen aufzurufen.
Achten Sie darauf, dass sowohl GPU Frame Capture als auch Metal API Validation deaktiviert sind.
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.