CocoaPods или Carthage?
![]()
CocoaPods — менеджер зависимостей для проектов Cocoa Swift и Objective-C. Он имеет более 30 тысяч библиотек и используется в более чем 1,9 миллиона приложений. CocoaPods может помочь вам элегантно масштабировать ваши проекты.
По сути, это помогает вам включать сторонние библиотеки, фреймворки в ваш продукт, не беспокоясь о том, как настроить их и ваш проект, что иногда может быть огромной трудностью.
Что пишет CocoaPods об этом:
CocoaPods управляет зависимостями библиотеки для ваших проектов Xcode.
Зависимости для ваших проектов указываются в одном текстовом файле под названием Podfile.
CocoaPods разрешит зависимости между библиотеками, извлечет полученный исходный код, а затем свяжет его вместе в рабочем пространстве XCode для построения вашего проекта.
В конечном итоге цель состоит в том, чтобы улучшить возможности обнаружения и вовлечение сторонних библиотек с открытым исходным кодом путем создания более централизованной экосистемы.
Carthage, а что у тебя?
Хоть CocoaPods и потрясающее средство для управления зависимостями, есть и другие варианты. Carthage является одним из таких вариантов. Это простой менеджер зависимостей для Mac и iOS, созданный группой разработчиков из Github.
Поопладируем Github!
Carthage был первый менеджер зависимостей для работы с Swift, фактически, сам Carthage написан на Swift!
Он использует исключительно динамические фреймворки вместо статических библиотек – это только способ распространения двоичных файлов Swift, которые поддерживаются в iOS 8 и выше.
Цель проекта Carthage состоит в том, чтобы предоставить более простой инструмент, чем CocoaPods, тот, который проще понять, проще в обслуживании и чтобы он был более гибкий.
Это достигается несколькими способами:
Carthage не изменяет ваш проект и не вынуждает вас использовать workspace.
Нет необходимости для Podspecs или централизованного хранилища данных, чтобы авторы библиотеки представляли свои pods. Ваш проект может быть разработан как фреймворк, он может быть использован с Carthage. Он использует существующую информацию прямо из Git и Xcode.
Carthage не делает ничего волшебного, вы всегда контролируете ситуацию. Вручную добавляете зависимости в проект и Carthage, извлекаете и создаете их.
CocoaPods@0 — задача CocoaPods v0
Используйте эту задачу для запуска установки pod CocoaPods.
CocoaPods — это менеджер зависимостей для проектов Swift и Objective-C Cocoa. Эта задача при необходимости выполняется pod repo update , а затем выполняется pod install .
Синтаксис
# CocoaPods v0 # Install CocoaPods dependencies for Swift and Objective-C Cocoa projects. - task: CocoaPods@0 inputs: #workingDirectory: # string. Alias: cwd. Working directory. # Advanced #forceRepoUpdate: false # boolean. Force repo update. Default: false. #projectDirectory: # string. Project directory.
# CocoaPods v0 # CocoaPods is a dependency manager for Swift and Objective-C Cocoa projects. This task runs 'pod install'. - task: CocoaPods@0 inputs: #workingDirectory: # string. Alias: cwd. Working directory. # Advanced #forceRepoUpdate: false # boolean. Force repo update. Default: false. #projectDirectory: # string. Project directory.
# YAML Syntax is not supported in TFS 2018. # Use the classic designer to add and configure tasks. # See the following Inputs section for details on the inputs that this task supports.
Входные данные
workingDirectory — Рабочий каталог
Входной псевдоним: cwd . string .
Указывает рабочий каталог, в котором выполняется эта задача. Если оставить пустым, будет использоваться каталог репозитория.
forceRepoUpdate — Принудительное обновление репозитория
boolean . Значение по умолчанию: false .
Выбор этого параметра приведет к принудительному выполнению pod repo update перед установкой.
projectDirectory — Каталог проекта
string .
Необязательный элемент. Указывает путь к корню каталога проекта. Если оставить его пустым, задача использует указанный проект в podfile. Если проект не указан, задача выполняет поиск проекта Xcode. Если задача находит несколько проектов Xcode, возникнет ошибка.
Параметры управления задачами
Все задачи имеют параметры управления в дополнение к входным данным задачи. Дополнительные сведения см. в разделе Параметры управления и общие свойства задачи.
Выходные переменные
Remarks
Используйте эту задачу для запуска установки pod CocoaPods.
CocoaPods — это менеджер зависимостей для проектов Swift и Objective-C Cocoa. Эта задача при необходимости выполняется pod repo update , а затем выполняется pod install .
Требования
| Требование | Описание |
|---|---|
| Типы конвейеров | YAML, классическая сборка |
| Выполняется в | Агент, DeploymentGroup |
| Требования | Нет |
| Capabilities | Эта задача не удовлетворяет требованиям для последующих задач в задании. |
| Ограничения команд | Эта задача выполняется с использованием следующих ограничений команд: restricted |
| Устанавливаемые переменные | Эта задача имеет разрешение на установку следующих переменных: настройка переменных отключена |
| Версия агента | 2.182.1 или более поздней версии |
| Категория задач | Пакет |
| Требование | Описание |
|---|---|
| Типы конвейеров | YAML, классическая сборка |
| Выполняется в | Агент, DeploymentGroup |
| Требования | Нет |
| Capabilities | Эта задача не удовлетворяет требованиям для последующих задач в задании. |
| Ограничения команд | Любой |
| Устанавливаемые переменные | Любой |
| Версия агента | Все поддерживаемые версии агента. |
| Категория задач | Пакет |
Cocoapods что это
CocoaPods — менеджер пакетов, сделанный по образу и подобию RubyGems, позволяющий легко скачивать и подключать сторонние библиотеки к Swift и Objective-C проектам.
Установка CocoaPods
Менеджер пакетов написан на Ruby и распространяется через RubyGems. В общем случае установка сводится к единственной команде в терминале:
sudo gem install cocoapods --pre
Процесс может занять некоторое (продолжительное) время, не выводя ничего на экран, стоит быть к этому готовым и не прерывать установку до завершения (должна появиться надпись вроде «xx gems installed»).
Далее установим мастер-репозиторий CocoaPods со спецификациями всех доступных проектов. Делается это командой в терминале:
pod setup --verbose
Отмечу, что этот шаг тоже занимает достаточно большой промежуток времени, поэтому я указал ключ —verbose , чтобы было видно, что процесс не завис и происходит клонирование репозитория. В зависимости от скорости интернет-соединения, установка мастер-репозитория может занимать от нескольких минут до часа.
Установка и использование библиотек
Чтобы сразу продемонстрировать все возможности создадим новый Swift-проект и установим для него Objective-C компонент под названием BEMCheckBox.
Откроем Xcode и создадим самый простой Single View, Swift-проект, я назову его «CocoaPodsExample». Сохраните его в любое место, закройте Xcode, откройте терминал, перейдите в директорию с проектом и напишите:
pod init
В корне директории должен появиться новый файл: Podfile. Это обычный текстовый файл с конфигурационным кодом на Ruby, в котором мы должны указать требуемые библиотеки. Обычно все солидные opensource-проекты указывают в Readme, что именно нужно прописать в Podfile для установки, и BEMCheckBox здесь не исключение. Откройте его любым текстовым редактором и приведите к следующему виду:
platform :ios, "9.0" target 'CocoaPodsTest'do use_frameworks! pod 'BEMCheckBox' end
Синтаксис должен быть интуитивно понятен: указываем целевую версию платформы, директива use_frameworks! указывает CocoaPods использовать фреймворки вместо статических библиотек (подробности в блоге проекта), а после pod пишем название библиотеки.
Иногда требуется установить не оригинальную библиотеку, а наиболее акутальный форк от другого автора (например, исправление критичного бага, который ещё не успели смерджить) в таком случае можно использовать следующий синтаксис:
pod 'SWRevealViewController', :git => '[email protected]:safarijv/SWRevealViewController.git', :branch => 'safarijv-additions'
В данном случае мы указываем репозиторий и ветку из которой нужно взять под. Если не указать ветку, то по-умолчанию будет браться master. Аналогично нужно поступать, если вам требуется внести свои изменения в библиотеку: создать форк, закоммитить изменения и сослаться на свой репозиторий в Podfile. Не стоит делать изменения в уже установленных подах, т.к. потом будет очень сложно разобраться (особенно другим разработчикам), почему поведение библиотеки отличается от описанного в оригинальной документации.
Далее запускаем установку командой:
pod install
После окончания установки, в директории с проектом должен появиться файл *.xcworkspace, который объединяет созданный нами проект и проект Pods со всеми необходимыми библиотеками и конфигурационными файлами. Теперь для работы с проектом нужно открывать именно воркспейс, а не сам проект (в противном случае ему не будут видны сторонние библиотеки).
Проверить, что библиотека подключилась легко: перейдите на Storyboard, поместите на ViewController UIView из Object Library и в Identity Inspector поставьте ему класс BEMCheckBox (если не получается, то можно попробовать собрать проект Cmd + B ). Запустите проект, и у вас должен появиться работающий чекбокс. Обратите внимание, что мы подключили Objective-C библиотеку к Swift проекту, если вы делали это раньше вручную, то помните, что для этой цели нужно было создавать специальный заголовочный файл Objective-C Bridging Header, но последние версии CocoaPods генерируют его автоматически, поэтому в этом больше нет необходимости.
CocoaPods и системы контроля версий
Обычно хорошим тоном в современной разработке является не добавлять сторонние библиотеки под контроль версий. Однако авторы проекта наоборот, рекомендуют хранить директорию Pods/ вместе с проектом. Преимуществом такого подхода является переносимость проекта и отсутствие зависимости от внешних инфраструктур (например Github, где хранится большинство исходных кодов библиотек). С другой стороны, в крупном проекте со множеством библиотек это может существенно увеличить размер репозитория, а в случае командной разработки добавит головной боли при слиянии веток. Поэтому в небольших проектах, где вы являетесь единственным разработчиком, можно смело оставить директорию Pods/ под контролем версий, а в крупных проектах и при командной разработке, лучше добавить ее в .gitignore.
Рекомендую почитать
Свежие записи
- Переустановка старой версии macOS на Mac Mini 2011 года
- Архитектура Redux в Swift: Введение
- Хостинг статического контента в Firebase
- Внешний SSD Transcend ESD240C
- FSEvents: Разбираемся с мониторингом событий файловой системы в macOS
Документация naviar SDK для iOS
CocoaPods — это менеджер зависимостей для проектов Cocoa. Более подробную информацию, а также инструкции по использованию и установке, вы можете найти на их сайте. Чтобы интегрировать naviar SDK в ваш проект Xcode с помощью CocoaPods, укажите зависимость VPSNMobile в своем Podfile :
source '' target 'YOUR PROJECT NAME HERE' do use_frameworks! pod 'VPSNMobile' end
Далее вызовите pod install из каталога проекта, чтобы создать новый файл .workspace.
Из источников
Вы также можете собрать VPS framework из этого репозитория.
Клонируйте этот репозиторий и вызовите pod install из каталога проекта, чтобы создать новый файл .workspace. Теперь вы можете построить VPS framework и подключить его к своему проекту.
Примеры
Пример приложения вы можете найти в этом репозитории:
- ExampleAppVPS — интеграция сервиса VPS в реальное приложение для конечного пользователя
Для запуска example проекта склонируйте этот репозиторий и вызовите pod install из папки ExampleAppVPS для создания файла .workspace.
Видео инструкция по запуску example проекта:
Выбор локации
В данной версии сервиса VPS вам доступно 7 тестовых локаций. Для переключения между ними в example проекте используйте поле currentLocation во ViewController
Применение
Пользовательские разрешения
Добавьте флаги для выдачи доступа к геолокации пользователя и камере в info.plist . Для устройств с версией iOS 14+ необходимо также добавить TemporaryAuth.
UIKit
- Необходимо определить делегат ARSCNViewDelegate и вызывать метод vps?.frameUpdated() каждый кадр
- Назначьте конфигурацию по умолчанию с помощью метода getDefaultConfiguration() . Если устройство не поддерживается, данная функция вернет nil
- Вы можете использовать метод делегата sessionWasInterrupted для остановки VPS, когда приложение теряет фокус, и заново запустить его в sessionInterruptionEnded
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") > >
Mobile VPS
Для включения Mobile VPS необходимо выбрать его в настройках recognizeType: .mobile . В этом случае перед запуском VPS на устройство будет загружена нейросеть. Прогресс установки можно отслеживать в обработчике loadingProgress . Если модель не удалось загрузить или инициализировать, будет вызван обработчик failure .
VPSBuilder.initializeVPS(arsession: arview.session, settings: set, gpsUsage: false, delegate: self) < (serc) in self.vps = serc > loadingProgress: < (pr) in print("value",pr) > failure: < (er) in print("err",er) >
RealityKit
Использование RealityKit похоже на использование SceneKit. Вместо использования func renderer(_ renderer: SCNSceneRenderer, updateAtTime time: TimeInterval) вам нужно использовать func session(_ session: ARSession, didUpdate frame: ARFrame) делегата ARSessionDelegate для вызова vps?.frameUpdated() каждый кадр.
func session(_ session: ARSession, didUpdate frame: ARFrame) >
SwiftUI
Для лучшего использования SwiftUI рекомендуется использовать архитектуру MVVM. Пример представлен ниже:
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 > >
