iOS için ARCore SDK'sı, Cloud Anchor özelliklerini sağlamak için ARKit ile arayüz oluşturarak aynı ortamda iOS ve Android cihazlar arasında sabit reklamlar paylaşmanıza olanak tanır.
ARCore Cloud Anchor API'sini veya ARCore Cloud Anchor hizmetini kendi uygulamalarınızda nasıl kullanacağınızı öğrenin.
Ön koşullar
- Xcode 13.0 veya sonraki bir sürüm
- Cocoapods kullanıyorsanız Cocoapods 1.4.0 veya üzeri
- iOS 12.0 veya sonraki sürümleri çalıştıran ARKit uyumlu bir Apple cihaz (iOS 12.0 veya sonraki sürümlerin dağıtım hedefi gereklidir)
Cloud Anchor'da yeniyseniz:
Bir Cloud Anchor'ı barındırmak ve çözmek için kullanılan işlemi anladığınızdan emin olun.
Sistem gereksinimleri, kurulum ve yükleme talimatları için quickstart okuyun.
Cloud Anchor örneklerinden birine göz atın
Uygulamanızda Cloud Anchor'ları etkinleştirme
Cloud Anchors API'yi kullanmak için bir GARSessionConfiguration
oluşturmanız ve iOS'te ARCore oturumu yapılandırma bölümünde açıklandığı gibi cloudAnchorMode
özelliğini ayarlamanız gerekir. Yapılandırmayı ayarlamak için setConfiguration:error: (GARSession)
aracını kullanın.
Uygulamanız için ARCore API'yi de etkinleştirmeniz gerekir.
Anchor'ları barındırma ve çözümleme
ARCore Cloud Anchor API'si ile bulut çapalarını barındırabilir ve çözebilirsiniz. API, tamamlanan işlemler için geri çağırma yöntemlerini ve sorgulanabilecek Gelecekteki nesneleri içerir.
Bağlayıcı barındırma
Bir ARAnchor
barındırmak, çapayı herhangi bir fiziksel alan için ortak bir koordinat sistemine yerleştirir.
Ana makine isteği, bir Google sunucusuna görsel veriler gönderir. Bu veriler, ARAnchor
öğesinin konumunu geçerli fiziksel alanı temsil eden bir koordinat sisteminde eşler. Başarılı bir ana makine isteği, daha sonra çapı çözümlemek için paylaşılıp kullanılabilecek yeni bir Cloud Anchor Kimliği döndürür.
- (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];
}
Bağlayıcıyı çözümleme
Bir ARAnchor
çözümlendiğinde, belirli bir fiziksel alandaki Android ve iOS cihazlar önceden barındırılan sabitleri yeni sahnelere ekleyebilir.
Çözüm isteği isteği, bir Google sunucusuna geçerli çerçeveden görsel verilerle birlikte bulut sabit kimliği gönderir. Sunucu, bu görsel verileri şu anda barındırılan Cloud Anchor'ların eşlendiği görüntülerle eşleştirmeye çalışır. Çözümleme başarılı olduğunda oturuma yeni bir anchor eklenir ve geri döndürülür.
- (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;
}
}
}
İsteğe bağlı GARSession
yoklama kalıbı
Metal kullanıyorsanız veya yoklama seçeneğine ihtiyacınız varsa ve uygulamanız en az 30 fps hızında çalışıyorsa ARFrame
saniyesini GARSession
öğesine iletmek için aşağıdaki kalıbı kullanın:
-(void)myOwnPersonalUpdateMethod {
ARFrame *arFrame = arSession.currentFrame;
NSError *error = nil;
GARFrame *garFrame = [garSession update:arFrame error:&error];
// your update code here
}
API kotaları
ARCore API'de istek bant genişliği için aşağıdaki kotalar bulunur:
Kota türü | Maksimum | Süre | Uygulandığı yer |
---|---|---|---|
Bağlantı sayısı | Sınırsız | Yok | Proje |
Bağlantı barındırıcı istekleri | 30 | dakika | IP adresi ve proje |
Sabit resolve istekleri | 300 | dakika | IP adresi ve proje |
Bilinen sorunlar ve geçici çözümler
iOS için ARCore SDK'sı ile çalışırken karşılaşılan birkaç sorun vardır.
Varsayılan şema ayarları, uygulamanın ara sıra kilitlenmesine neden oluyor
GPU Çerçeve Yakalama ve Metal API Doğrulama şeması ayarları varsayılan olarak etkindir. Bu durum, bazen uygulamanın SDK içinde kilitlenmesine neden olabilir.
Uygulama kilitlenmelerini teşhis etme
Bir kilitlenme olduğundan şüphelendiğinizde yığın izlemeye bakın.
Yığın izlemede MTLDebugComputeCommandEncoder
görürseniz bunun nedeni varsayılan şema ayarları olabilir.
Geçici çözüm
Şuraya git: Product > Scheme > Edit Scheme….
Run sekmesini açın.
Mevcut ayarlarınızı görüntülemek için Options öğesini tıklayın.
Hem GPU Frame Capture hem de Metal API Validation'nin devre dışı bırakıldığından emin olun.
Uygulamanızı derleyip çalıştırın.
Bilinen diğer sorunlar için Cocoapods CHANGELOG
konusunu inceleyin.
Sınırlamalar
iOS için ARCore SDK'sı, ARKit setWorldOrigin(relativeTransform:)
yöntem çağrısını desteklemez.
Performansla ilgili konular
ARCore API'yi etkinleştirdiğinizde bellek kullanımı artar. Daha yüksek ağ ve CPU kullanımı nedeniyle cihazın pil kullanımı da artacaktır.