Инструкция по установке
Видео инструкция по интеграции VPS SDK в проект для iOS:
Запуск Example Project
- Клонировать репозиторий по ссылке
https://github.com/naviar-io/naviar-sdk-ios.git
- Запустить
pod install
из папки проекта для создания файла workspace. Подробнее про Cocoa Pods и его установку можно прочитать на официальном сайте: https://cocoapods.org/ - Открыть проект в XCode (выбирать файл с расширением .xcworkspace)
- В разделе Signing & Capabilities установить свой сертификат разработчика
- Для запуска на телефоне, подключить к компьютеру, выбрать его в целевых устройствах и нажать Пуск
- Для проверки работы локализации на локации, наведите камеру на здание и нажмите кнопку Start. В правом верхнем углу будет отображаться статус запроса. Для тестирования вне локации, можно навести телефон на фотографию. Перед этим необходимо через долгое нажатие в любой части экрана вызвать меню и отключить тоггл GPS, после чего навести камеру на фотографию и нажать Start. После успешной локализации, ar контент встанет в нужное положение относительно локации.
Интеграция в собственный проект
Будет рассмотрена интеграция в проект на SceneKit / RealityKit с UIKit / SwiftUI. Первые шаги одинаковы для всех вариантов:
- Создаем новые проект / открываем существующий. Обратите внимание, что в проекте должна быть использована дополненная реальность, без нее vps работать не будет
- Если в проекте до этого не использовались CocoaPods, открыть терминал, перейти в папку проекта и вызвать pod init. Это создаст файл Podfile в папке проекта
- Открыть Podfile в текстовом редакторе и добавить pod 'VPSNMobile'
source 'https://github.com/CocoaPods/Specs.git'
target 'YOUR PROJECT NAME HERE' do
use_frameworks!
pod 'VPSNMobile'
end
- Вернутся в терминал и вызвать команду pod install
- После окончания установки в папке проекта появится файл 'ИМЯ ПРОЕКТА'.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 вызывается при начале отправки запроса на сервер