Przewodnik dla programistów Cloud Anchors dla iOS

Interfejsy ARCore SDK na iOS z ARKit do obsługi usługi Cloud Anchor umożliwia udostępnianie zakotwiczonych elementów między urządzeniami z iOS i Androidem w tym samym środowisku.

Dowiedz się, jak używać ARCore Cloud Anchor API lub ARCore Cloud Anchor we własnych aplikacjach.

Wymagania wstępne

  • Xcode w wersji 13.0 lub nowszej,
  • Cocoapods w wersji 1.4.0 lub nowszej, jeśli używasz Cocoapods,
  • urządzenie Apple z systemem iOS 12.0 lub nowszym zgodne z ARKit, (wymagane jest miejsce docelowe wdrożenia na iOS w wersji 12.0 lub nowszej)
.

Jeśli dopiero zaczynasz korzystać z Cloud Anchors:

Włączanie Cloud Anchors w swojej aplikacji

Aby użyć interfejsu API Cloud Anchors, musisz utworzyć GARSessionConfiguration. i ustawić dla niej właściwość cloudAnchorMode, jak opisano w Skonfiguruj sesję ARCore w iOS. Używaj setConfiguration:error: (GARSession) aby ustawić konfigurację.

Musisz też włączyć ARCore API dla Twojej aplikacji.

Hostowanie i rozwiązywanie reklam zakotwiczonych

Możesz hostować i rozwiązywać kotwice w chmurze za pomocą interfejsu ARCore Cloud Anchor API. Interfejs API obejmuje metody wywołań zwrotnych dla zakończonych operacji oraz obiekty przyszłe które mogą być ankietowane.

Hostowanie kotwicy

Hostowanie elementu ARAnchor powoduje umieszczenie reklamy zakotwiczonej we wspólnym układzie współrzędnych dla w przestrzeni fizycznej.

Żądanie hosta wysyła dane wizualne do serwera Google, który mapuje interfejs ARAnchor położenie w układzie współrzędnych, który reprezentuje bieżącą przestrzeń fizyczną. O pomyślne żądanie hosta zwraca nowy identyfikator Cloud Anchor ID, który można udostępnić oraz i służą do późniejszego rozpoznania kotwicy.

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

Rozwiązywanie kotwicy

Rozwiązanie problemu ARAnchor pozwala urządzeniom z Androidem i iOS w danej przestrzeni fizycznej aby dodać wcześniej hostowane reklamy zakotwiczone do nowych scen.

Żądanie rozwiązania wysyła do serwera Google identyfikator kotwicy w chmurze wraz z danymi wizualnymi od bieżącej klatki. Serwer spróbuje dopasować te dane wizualne wraz ze zdjęciami miejsc, w których są mapowane aktualnie hostowane elementy zakotwiczone Cloud Anchor. Kiedy zostanie rozwiązany, do sesji zostanie dodana nowa kotwica, która zostanie zwrócona.

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

Opcjonalny wzorzec odpytywania GARSession

Jeśli używasz metalu lub potrzebujesz opcji ankiet i Twoja aplikacja działa na minimalnie 30 kl./s, użyj poniższego wzoru, aby przekazać ARFrame w GARSession:

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

Limity interfejsu API

Interfejs ARCore API ma następujące limity przepustowości żądań:

Typ limitu Maksimum Czas trwania Dotyczy:
Liczba reklam zakotwiczonych Bez ograniczeń Nie dotyczy Projekt
Żądania hosta kotwicy 30 minuta Adres IP i projekt
Rozwiązywanie żądań zakotwiczenia 300 minuta Adres IP i projekt

Znane problemy i sposoby ich obejścia

Podczas pracy z pakietem ARCore SDK na iOS występuje kilka znanych problemów.

Ustawienia schematu domyślnego powodują sporadyczną awarię aplikacji

Ustawienia schematu GPU Frame Capture i Metal weryfikacji API są włączone przez co może czasami powodować awarię aplikacji z poziomu pakietu SDK.

Diagnozowanie awarii aplikacji

Gdy podejrzewasz, że wystąpiła awaria, sprawdź zrzut stosu. Jeśli w zrzucie stosu widzisz stan MTLDebugComputeCommandEncoder, prawdopodobnie jest to spowodowane do domyślnych ustawień schematu.

Obejście

  1. Jedź do: Product > Scheme > Edit Scheme….

  2. Otwórz kartę Run.

  3. Kliknij Options, aby wyświetlić bieżące ustawienia.

  4. Upewnij się, że funkcje GPU Frame Capture i Metal API Validation są wyłączone.

  5. Utworzyć i uruchomić aplikację.

Dodatkowe znane problemy znajdziesz w artykule CHANGELOG Cocoapods.

Ograniczenia

Pakiet ARCore SDK na iOS nie obsługuje wywołania metody ARKit setWorldOrigin(relativeTransform:).

Możliwe spowolnienie działania witryny

Wykorzystanie pamięci zwiększy się po włączeniu interfejsu ARCore API. Oczekuj wykorzystanie baterii przez urządzenie wzrośnie z powodu większego wykorzystania sieci i CPU.

Dalsze kroki