Минимальные требования для работы библиотеки версия iOS >= 14
Библиотеку можно подключить двумя способами: SPM, Framework архив
- Скачайте архив
- Разархивируйте архив
- Подключите к проекту зависимость в
General -> Framework, Libraries, and Embedded Content
библиотеку из каталогаTargetsSDK.xcframework
(убедитесь, что поставили чекбоксCopy if Needed
)
- Создайте SceneDelegate.swift со следующим содержимым:
import UIKit
import TargetsSDK
import SwiftUI
class SceneDelegate: UIResponder, UIWindowSceneDelegate {
var window: UIWindow?
var layerWindow: UIWindow?
func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {
guard let _ = (scene as? UIWindowScene) else { return }
SDKMetrica.shared.scene(scene, willConnectTo: session, options: connectionOptions)
self.layerWindow = SDKMetrica.shared.getLayer(in: scene)
}
}
- Создайте AppDelegate.swift со следующим содержимым:
import TargetsSDK
import UIKit
class AppDelegate: UIResponder, UIApplicationDelegate {
func application(_ application: UIApplication,
didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]? = nil) -> Bool {
Task {
let config = await SDKMetricaConfig.builder(apiKey: "API_KEY")
.enableLocationTracking(isEnabled: true)
.build()
SDKMetrica.shared.activate(config: config)
}
return true
}
func application(_ application: UIApplication, configurationForConnecting connectingSceneSession: UISceneSession, options: UIScene.ConnectionOptions) -> UISceneConfiguration {
let sceneConfig: UISceneConfiguration = UISceneConfiguration(name: nil, sessionRole: connectingSceneSession.role)
sceneConfig.delegateClass = SceneDelegate.self
return sceneConfig
}
public func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) {
SDKMetrica.shared.application(application, didRegisterForRemoteNotificationsWithDeviceToken: deviceToken)
}
public func application(_ application: UIApplication, didFailToRegisterForRemoteNotificationsWithError error: Error) {
SDKMetrica.shared.application(application, didFailToRegisterForRemoteNotificationsWithError: error)
}
public func application(_ application: UIApplication, didReceiveRemoteNotification userInfo: [AnyHashable: Any],
fetchCompletionHandler completionHandler: @escaping (UIBackgroundFetchResult) -> Void) {
SDKMetrica.shared.application(application, didReceiveRemoteNotification: userInfo, fetchCompletionHandler: completionHandler)
}
}
При создании экземпляра config, передается API_KEY, который необходимо получить при регистрации приложения в личном кабинете (ЛК).
Вызов метода enableLocationTracking
является опциональным, его отсутствие вызова или вызов с параметром isEnabled = false
- выключает фоновый трекинг геолокации пользователя.
Если в проекте используется исключительно SwiftUI можно добавить AppDelegate, используя следующее подключение в AppView:
@UIApplicationDelegateAdaptor(AppDelegate.self) var delegate
- Добавьте в Info.plist ключи:
Ключ | Тип | Значение |
---|---|---|
FirebaseAppDelegateProxyEnabled | Boolean | NO |
Privacy - Contacts Usage Description | String | Необходимость использования контакнтых данных |
Required background modes | Array | |
item 0 | String | App downloads content from the network |
item 1 | String | App downloads content in response to push notifications |
- Добавьте в entitlements файл записи:
Ключ | Тип | Значение |
---|---|---|
com.apple.developer.networking.wifi-info | Boolean | YES |
APS Environment | String | production |
- Добавьте конфигурационный файл Firebase
GooleService-Info.plist
.
Как сформировать этот файл можно ознакомиться на сайте https://firebase.google.com/docs/ios/setup
- Если в приложении не используется геолокация, но есть необходимость получать в событиях геоданные, для этого можно подключить как пример следующий сервис:
import Foundation
import CoreLocation
class AppLocationManager: NSObject, ObservableObject, CLLocationManagerDelegate {
private let locationManager = CLLocationManager()
@Published var locationStatus: CLAuthorizationStatus?
@Published var lastLocation: CLLocation?
override init() {
super.init()
locationManager.delegate = self
locationManager.desiredAccuracy = kCLLocationAccuracyBest
locationManager.requestWhenInUseAuthorization()
locationManager.requestAlwaysAuthorization()
locationManager.startUpdatingLocation()
}
func locationManager(_ manager: CLLocationManager, didChangeAuthorization status: CLAuthorizationStatus) {
locationStatus = status
}
func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
guard let location = locations.last else {
return
}
lastLocation = location
}
}
и подключить его, например так в SwiftUI:
@StateObject private var locationManager = AppLocationManager()
Добавьте в Info.plist ключи:
Ключ | Тип | Значение |
---|---|---|
Privacy - Location Always Usage Description | String | Необходимость использования локации |
Privacy - Location When In Use Usage Description | String | Необходимость использования локации |
Privacy - Location Always and When In Use Usage Description | String | Необходимость использования локации |
Отправлять данные возможно на любые триггерные события в приложении:
SDKMetrica.shared.reportEvent(name: String)
Отправка события со значением:
SDKMetrica.shared.reportEvent(name: String, value: String)
Аккумулированные данные по событиям доступны в ЛК
В File -> New -> Target
выберете Notification Service Extension
и укажите Product Name
как NotificationService
.
На вопрос Activate “NotificationService” scheme
выберете Activate
.
В созданном файле NotificationService.swift замените содержимое на следующий код
import UserNotifications
import TargetsSDK
class NotificationService: SDKMetricaServiceExtension {
override func didReceive(
_ request: UNNotificationRequest,
withContentHandler contentHandler: @escaping (UNNotificationContent) -> Void
) {
super.didReceive(request, withContentHandler: contentHandler)
}
}
В проекте у NotificationService Build -> Frameworks and Libraries
добавьте TargetsSDK
с типом Do not embed
.
Убедитесь, что Deployment Target
у сервиса расширения меньше, чем версия iOS на телефоне.
В File -> New -> Target
выберете Notification Content Extension
и укажите Product Name
как NotificationContent
.
На вопрос Activate “NotificationContentService” scheme
выберете Cancel
.
В созданном файле NotificationViewController.swift замените содержимое на следующий код
import UIKit
import TargetsSDK
class NotificationViewController: SDKMetricaContentExtension {
override func viewDidLoad() {
super.viewDidLoad()
// Do any required interface initialization here.
}
}
В Info.plist сделайте следующие изменения:
- для параметра
UNNotificationExtensionCategory
укажитеvideo
; - имя параметра
NSExtensionMainStoryboard
замените наNSExtensionPrincipalClass
и укажите значение параметраNotificationContent.NotificationViewController
.
В проекте NotificationContent
в настройке Build -> Frameworks and Libraries
добавьте TargetsSDK
с типом Do not embed
.
Убедитесь, что Deployment Target
у сервиса расширения меньше, чем версия iOS на телефоне.