ym88659208ym87991671
Инструкция по установке | Документация для разработчиков

Инструкция по установке

Обновлено 26 декабря 2022

Видео инструкция по интеграции VPS SDK в проект для iOS:

Запуск Example Project

  1. Клонировать репозиторий по ссылке
https://github.com/naviar-io/naviar-sdk-ios.git
  1. Запустить pod install из папки проекта для создания файла workspace. Подробнее про Cocoa Pods и его установку можно прочитать на официальном сайте: https://cocoapods.org/
  2. Открыть проект в XCode (выбирать файл с расширением .xcworkspace)
  3. В разделе Signing & Capabilities установить свой сертификат разработчика
  4. Для запуска на телефоне, подключить к компьютеру, выбрать его в целевых устройствах и нажать Пуск
  5. Для проверки работы локализации на локации, наведите камеру на здание и нажмите кнопку Start. В правом верхнем углу будет отображаться статус запроса. Для тестирования вне локации, можно навести телефон на фотографию. Перед этим необходимо через долгое нажатие в любой части экрана вызвать меню и отключить тоггл GPS, после чего навести камеру на фотографию и нажать Start. После успешной локализации, ar контент встанет в нужное положение относительно локации.

Интеграция в собственный проект

Будет рассмотрена интеграция в проект на SceneKit / RealityKit с UIKit / SwiftUI. Первые шаги одинаковы для всех вариантов:

  1. Создаем новые проект / открываем существующий. Обратите внимание, что в проекте должна быть использована дополненная реальность, без нее vps работать не будет
  2. Если в проекте до этого не использовались CocoaPods, открыть терминал, перейти в папку проекта и вызвать pod init. Это создаст файл Podfile в папке проекта
  3. Открыть Podfile в текстовом редакторе и добавить pod 'VPSNMobile'
source 'https://github.com/CocoaPods/Specs.git'
target 'YOUR PROJECT NAME HERE' do
use_frameworks!
pod 'VPSNMobile'
end
  1. Вернутся в терминал и вызвать команду pod install
  2. После окончания установки в папке проекта появится файл 'ИМЯ ПРОЕКТА'.xcworkspace. Открываем проект в XCode через этот файл

Для SceneKit (с UIKit):

Код ViewController (в примере “Example”, но вы можете изменить на любое), отвечающий за vps и дополненную реальность:

import VPSNMobile
import UIKit
import ARKit

class Example:UIViewController, ARSCNViewDelegate {
var arview: ARSCNView!
var configuration: ARWorldTrackingConfiguration!
var vps: VPSService?

override func viewDidLoad() {
super.viewDidLoad()
arview.scene = SCNScene()
arview.delegate = self
if let config = VPSBuilder.getDefaultConfiguration() {
configuration = config
} else {
fatalError()
}

let set = Settings(
locationIds: ["polytech"],
recognizeType: .mobile)

VPSBuilder.initializeVPS(arsession: arview.session,
settings: set,
gpsUsage: false,
delegate: self) { (serc) in
self.vps = serc
self.vps?.start()
} loadingProgress: { (pr) in
print("value",pr)
} failure: { (er) in
print("err",er)
}

vps?.start()
}

override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
arview.session.run(configuration)
}

func renderer(_ renderer: SCNSceneRenderer, updateAtTime time: TimeInterval) {
vps?.frameUpdated()
}

func sessionWasInterrupted(_ session: ARSession) {
vps?.stop()
}

func sessionInterruptionEnded(_ session: ARSession) {
vps?.start()
}
}

extension Example: VPSServiceDelegate {
func positionVPS(pos: ResponseVPSPhoto) {
print("Pos", pos)
}

func error(err: NSError) {
print("err", err)
}

func correctMotionAngle(correct: Bool) {

}

func sending() {
print("Start sending")
}
}

Не забудьте убедиться, что поле ARSCNView связано с ARSCNView на StoryBoard

Для RealityKit (с UIKit):

Код ViewController (в примере “Example”, но вы можете изменить на любое), отвечающий за vps и дополненную реальность:

import UIKit
import RealityKit
import ARKit
import VPSNMobile

class Example: UIViewController, ARSessionDelegate {
var arView: ARView!
var configuration: ARWorldTrackingConfiguration!
var vps: VPSService?

override func viewDidLoad() {
super.viewDidLoad()
if let config = VPSBuilder.getDefaultConfiguration() {
configuration = config
} else {
fatalError()
}

let set = Settings(
locationIds: ["polytech"],
recognizeType: .mobile)

VPSBuilder.initializeVPS(arsession: arView.session,
settings: set,
gpsUsage: false,
delegate: self) { (serc) in
self.vps = serc
self.vps?.start()
} loadingProgress: { (pr) in
print("value",pr)
} failure: { (er) in
print("err",er)
}

vps?.start()
}

override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
arView.session.run(configuration)
}

func session(_ session: ARSession, didUpdate frame: ARFrame) {
vps?.frameUpdated()
}

func sessionWasInterrupted(_ session: ARSession) {
vps?.stop()
}

func sessionInterruptionEnded(_ session: ARSession) {
vps?.start()
}
}

extension Example: VPSServiceDelegate {
func positionVPS(pos: ResponseVPSPhoto) {
print("Pos", pos)
}

func error(err: NSError) {
print("err", err)
}

func correctMotionAngle(correct: Bool) {

}

func sending() {
print("Start sending")
}
}

Для SwiftUI:

Код ContentView (в примере “ContentView”, но вы можете изменить на любое), отвечающий за vps и дополненную реальность:

import SwiftUI
import ARKit
import VPSNMobile

struct ContentView: View {
@StateObject var vm = ViewModel()
@State var vpsStarted = false
var body: some View {
VStack {
ARView(vm: vm)
.background(Color.gray)
.cornerRadius(20)
.padding(EdgeInsets(top: 10, leading: 10, bottom: 10, trailing: 10))
Button(vpsStarted ? "stop" : "start") {
vpsStarted ? vm.vps?.stop() : vm.vps?.start()
withAnimation(.linear) {
vpsStarted.toggle()
}
}
.frame(width: 300, height: 50, alignment: .center)
.background(vpsStarted ? Color.red : Color.green)
.cornerRadius(20)
.padding()
}
}
}

class ViewModel:NSObject, ObservableObject, ARSCNViewDelegate, VPSServiceDelegate {

var vps: VPSService?
func initVPS(session:ARSession) {
let set = Settings(
locationIds: ["polytech"],
recognizeType: .mobile)
VPSBuilder.initializeVPS(arsession: session,
settings: set,
gpsUsage: false,
delegate: self) { (vps) in
self.vps = vps
} loadingProgress: { (pr) in
} failure: { (er) in
print("err",er)
}
}

func positionVPS(pos: ResponseVPSPhoto) {
print("POS",pos)
}

func error(err: NSError) {

}

func correctMotionAngle(correct: Bool) {

}

func sending() {

}
}

struct ARView: UIViewRepresentable {

@ObservedObject var vm: ViewModel

func makeUIView(context: Context) -> ARSCNView {
let sceneView = ARSCNView()
sceneView.scene = SCNScene()
sceneView.autoenablesDefaultLighting = true
sceneView.delegate = vm
vm.initVPS(session: sceneView.session)
let config = VPSBuilder.getDefaultConfiguration()!
config.isAutoFocusEnabled = true
sceneView.session.run(config)
return sceneView
}

func updateUIView(_ uiView: ARSCNView, context: Context) {
}

static func dismantleUIView(_ uiView: ARSCNView, coordinator: ()) {
uiView.delegate = nil
}
}

В реализации протокола VPSServiceDelegate вы можете переопределить реакцию на события VPS:

  • positionVPS вызывается при получении ответа от сервера. Данные ответа содержаться в аргументе, в структуре ResponseVPSPhoto
  • error вызывается, если при отправке запроса на сервер произошла ошибка. Код и тип ошибки можно посмотреть в аргументе, в структуре NSError
  • correctMotionAngle вызывается при изменение угла поворота устройства с корректного на некорректный и наоборот. Некорректным считается угол наклона больше 30 градусов - в этом случае запросы на сервер отправляться не будут
  • sending вызывается при начале отправки запроса на сервер
ПАО Сбербанк использует cookie для персонализации сервисов и удобства пользователей.
Вы можете запретить сохранение cookie в настройках своего браузера.