{"id":429660,"date":"2024-08-21T09:00:42","date_gmt":"2024-08-21T09:00:42","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=429660"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=429660","title":{"rendered":"<span>\u041e\u0442 Cocoapods \u043a Tuist+SPM \u0431\u044b\u0441\u0442\u0440\u044b\u043c\u0438 \u0448\u0430\u0433\u0430\u043c\u0438<\/span>"},"content":{"rendered":"<div><!--[--><!--]--><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body article-formatted-body_version-2\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<p>\u041d\u0435 \u0442\u0430\u043a \u0434\u0430\u0432\u043d\u043e \u043f\u0440\u043e\u0433\u0440\u0435\u043c\u0435\u043b\u0430 <a href=\"https:\/\/blog.cocoapods.org\/CocoaPods-Support-Plans\/\" rel=\"noopener noreferrer nofollow\">\u043d\u043e\u0432\u043e\u0441\u0442\u044c<\/a>, \u0447\u0442\u043e Cocoapods \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u0442 \u0432 \u0440\u0435\u0436\u0438\u043c \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0438. \u0412 \u0441\u0432\u044f\u0437\u0438 \u0441 \u044d\u0442\u0438\u043c \u0432\u0441\u0442\u0430\u043b \u0432\u043e\u043f\u0440\u043e\u0441, \u0447\u0442\u043e \u0434\u0430\u043b\u044c\u0448\u0435. \u0412 \u043d\u0430\u0447\u0430\u043b\u0435 \u043c\u044b \u0441\u043a\u043b\u043e\u043d\u044f\u043b\u0438\u0441\u044c \u043a \u0447\u0438\u0441\u0442\u043e Swift Package Manager, \u043d\u043e \u043f\u043e\u0442\u043e\u043c \u043f\u0440\u0438\u0448\u043b\u043e \u043f\u043e\u043d\u0438\u043c\u0430\u043d\u0438\u0435, \u0447\u0442\u043e \u043d\u0435\u043f\u043b\u043e\u0445\u043e \u0431\u044b\u043b\u043e \u0431\u044b \u0443\u0439\u0442\u0438 \u043e\u0442 \u043a\u043e\u043d\u0444\u043b\u0438\u043a\u0442\u043e\u0432 \u0432 project \u0444\u0430\u0439\u043b\u0435 \u0438 \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0437\u0430\u0434\u0435\u043b \u043d\u0430 \u043c\u043e\u0434\u0443\u043b\u044c\u043d\u043e\u0441\u0442\u044c. \u0412 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u043c\u044b \u043f\u0440\u043e\u0439\u0434\u0435\u043c \u043e\u0442 \u043d\u0430\u0448\u0435\u0433\u043e \u0441\u0442\u0430\u0440\u043e\u0433\u043e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u043a \u043d\u043e\u0432\u043e\u043c\u0443 \u0438 \u0437\u0430\u043a\u043e\u043d\u0447\u0438\u043c \u0442\u0430\u043c, \u0433\u0434\u0435 \u043e\u0441\u0442\u0430\u043d\u0435\u0442\u0441\u044f \u043f\u0435\u0440\u0435\u043d\u0435\u0441\u0442\u0438 \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u0439 \u043a\u043e\u0434 \u0438 \u0432\u0441\u0435 \u0437\u0430\u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442.<\/p>\n<p><strong>\u041f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u043a\u0430<\/strong><\/p>\n<p>\u0414\u043b\u044f \u043d\u0430\u0447\u0430\u043b\u0430 \u044f \u0440\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0443\u044e \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0444\u0430\u0439\u043b, \u043a\u0443\u0434\u0430 \u0441 \u043e\u0434\u043d\u043e\u0439 \u0441\u0442\u043e\u0440\u043e\u043d\u044b \u043f\u043e\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u0438\u0437 Podfile, \u0430 \u0441 \u0434\u0440\u0443\u0433\u043e\u0439 URL \u0434\u043b\u044f SPM \u0441 \u043d\u043e\u043c\u0435\u0440\u043e\u043c \u0432\u0435\u0440\u0441\u0438\u0438, \u0442\u0430\u043a \u0431\u0443\u0434\u0435\u0442 \u043f\u0440\u043e\u0449\u0435 \u0432\u043d\u043e\u0441\u0438\u0442\u044c \u0438\u0445 \u0432 Tuist.<\/p>\n<details class=\"spoiler\">\n<summary>\u0421\u043a\u0440\u044b\u0442\u044b\u0439 \u0442\u0435\u043a\u0441\u0442<\/summary>\n<div class=\"spoiler__content\">\n<p>pod &#8216;GoogleMaps&#8217; https:\/\/github.com\/googlemaps\/ios-maps-sdk 9.0.1<br \/>pod &#8216;Google-Maps-iOS-Utils&#8217; https:\/\/github.com\/googlemaps\/google-maps-ios-utils 6.0.0<br \/>pod &#8216;Firebase\/Crashlytics&#8217; https:\/\/github.com\/firebase\/firebase-ios-sdk.git 11.0.0<br \/>pod &#8216;Kingfisher&#8217; https:\/\/github.com\/onevcat\/Kingfisher 7.12.0<br \/>pod &#8216;Moya&#8217; https:\/\/github.com\/Moya\/Moya.git 15.0.3<br \/>pod &#8216;ObjectMapper&#8217; https:\/\/github.com\/tristanhimmelman\/ObjectMapper.git 4.4.3<br \/>pod &#8216;SideMenu&#8217; https:\/\/github.com\/jonkykong\/SideMenu.git 6.5.0<br \/>pod &#8216;FloatingPanel&#8217; https:\/\/github.com\/scenee\/FloatingPanel.git 2.8.5<br \/>pod &#8216;YandexMobileMetrica\/Dynamic&#8217; https:\/\/github.com\/appmetrica\/appmetrica-sdk-ios 5.0.0<br \/>pod &#8216;AppsFlyerFramework&#8217; https:\/\/github.com\/AppsFlyerSDK\/AppsFlyerFramework-Static 6.15.0<br \/>pod &#8216;SkeletonView&#8217; https:\/\/github.com\/Juanpe\/SkeletonView.git 1.31.0<br \/>pod &#8216;Swinject&#8217; https:\/\/github.com\/Swinject\/Swinject.git 2.9.1<br \/>pod &#8216;SwinjectStoryboard&#8217; https:\/\/github.com\/Swinject\/SwinjectStoryboard.git 2.2.3<br \/>pod &#8216;SnapKit&#8217; https:\/\/github.com\/SnapKit\/SnapKit.git 5.7.1<br \/>pod &#8216;RxSwift&#8217; https:\/\/github.com\/ReactiveX\/RxSwift.git 6.7.1<br \/>pod &#8216;RxCocoa&#8217; \u0432\u0445\u043e\u0434\u0438\u0442 \u0432 RxSwift<br \/>pod &#8216;RxDataSources&#8217; https:\/\/github.com\/RxSwiftCommunity\/RxDataSources.git 5.0.2<\/p>\n<\/div>\n<\/details>\n<p>\u041a\u0430\u043a \u0432\u0438\u0434\u0438\u0442\u0435 \u0442\u0443\u0442 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0442\u0441\u044f \u043f\u043e\u0447\u0442\u0438 \u0432\u043e \u0432\u0441\u0435\u0445 iOS \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f\u0445(Firebase, Kingfisher) \u0438 \u0435\u0449\u0435 \u0435\u0441\u0442\u044c \u0441\u0442\u0430\u0440\u044b\u0435, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043f\u043e\u0440\u0430 \u0437\u0430\u043c\u0435\u043d\u0438\u0442\u044c \u043d\u0430 \u043d\u043e\u0432\u044b\u0435(YandexMobileMetrica\/Dynamic)<\/p>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u043f\u043e\u0441\u0442\u0430\u0432\u0438\u043c <a href=\"https:\/\/docs.tuist.io\/guides\/quick-start\/install-tuist\" rel=\"noopener noreferrer nofollow\">Tuist<\/a>, \u0432\u0441\u0435 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043f\u0440\u043e\u0441\u0442\u043e:<\/p>\n<ol>\n<li>\n<p>\u0421\u0442\u0430\u0432\u0438\u043c <a href=\"https:\/\/github.com\/jdx\/mise\" rel=\"noopener noreferrer nofollow\">Mise<\/a> <code>curl https:\/\/mise.run | sh<\/code><\/p>\n<\/li>\n<li>\n<p>\u0421\u0442\u0430\u0432\u0438\u043c Tuist <code>mise install tuist<\/code> \u0438 \u0430\u043a\u0442\u0438\u0432\u0438\u0440\u0443\u0435\u043c \u0435\u0433\u043e \u0432 \u043f\u0430\u043f\u043a\u0435 \u0441 \u043f\u0440\u043e\u0435\u043a\u0442\u043e\u043c <code>mise use tuist<\/code> <\/p>\n<\/li>\n<\/ol>\n<p><strong>\u041d\u0430\u0447\u0430\u043b\u043e<\/strong><\/p>\n<p>\u042f \u0440\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0443\u044e \u043f\u043e\u0442\u0440\u0435\u043d\u0438\u0440\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u043d\u0430 \u043d\u043e\u0432\u043e\u043c \u043f\u0440\u043e\u0435\u043a\u0442\u0435, \u043f\u0440\u0435\u0436\u0434\u0435 \u0447\u0435\u043c \u043f\u0440\u0430\u0432\u0438\u0442\u044c \u0431\u043e\u0435\u0432\u043e\u0439. <\/p>\n<p>\u0421\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u043d\u043e\u0432\u044b\u0439 \u043f\u0440\u043e\u0435\u043a\u0442:<br \/><code>tuist init --name Demo<\/code> \u00a0<\/p>\n<p>\u041f\u0440\u0438\u0441\u0442\u0443\u043f\u0438\u043c \u043a \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0435 \u043f\u0440\u043e\u0435\u043a\u0442\u0430:<br \/><code>tuist edit<\/code><\/p>\n<p>\u0417\u0430\u0439\u043c\u0435\u043c\u0441\u044f \u0441\u0440\u0430\u0437\u0443 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u044f\u043c\u0438, \u044d\u0442\u043e \u0441\u0430\u043c\u044b\u0439 \u0434\u043e\u043b\u0433\u0438\u0439 \u0448\u0430\u0433, \u043e\u0442\u043a\u0440\u043e\u0435\u043c \u0444\u0430\u0439\u043b <em>Manifests\/Tuist\/Package.swift<\/em> \u0438 \u043d\u0430\u0447\u043d\u0435\u043c:<br \/>\u0412 \u043c\u0430\u0441\u0441\u0438\u0432 dependencies \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u043d\u0430\u0448\u0438 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438, \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u044f url \u0438 \u0432\u0435\u0440\u0441\u0438\u044e \u0438\u0437 \u043d\u0430\u0448\u0435\u0433\u043e \u0444\u0430\u0439\u043b\u0430<br \/><code>.package(url: \"URL\", .upToNextMajor(from: \"VERSION\")),<\/code> <br \/>\u0432 \u0438\u0442\u043e\u0433\u0435 \u043f\u043e\u043b\u0443\u0447\u0438\u043c \u043d\u0430\u0448\u0438 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/c4a\/485\/495\/c4a48549598a6c832a009662e4a03b01.png\" alt=\"\" title=\"\" width=\"2797\" height=\"1754\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/c4a\/485\/495\/c4a48549598a6c832a009662e4a03b01.png\"\/><\/figure>\n<details class=\"spoiler\">\n<summary>\u0421\u043a\u0440\u044b\u0442\u044b\u0439 \u0442\u0435\u043a\u0441\u0442<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"swift\">let package = Package(     name: \"demo\",     dependencies: [         .package(url: \"https:\/\/github.com\/onevcat\/Kingfisher\", .upToNextMajor(from: \"7.12.0\")),         .package(url: \"https:\/\/github.com\/firebase\/firebase-ios-sdk.git\", .upToNextMajor(from: \"11.0.0\")),         .package(url: \"https:\/\/github.com\/googlemaps\/ios-maps-sdk\", .upToNextMajor(from: \"9.0.1\")),         .package(url: \"https:\/\/github.com\/googlemaps\/google-maps-ios-utils\", .upToNextMajor(from: \"6.0.0\")),         .package(url: \"https:\/\/github.com\/Moya\/Moya.git\", .upToNextMajor(from: \"15.0.3\")),         .package(url: \"https:\/\/github.com\/ReactiveX\/RxSwift.git\", .upToNextMajor(from: \"6.7.1\")),         .package(url: \"https:\/\/github.com\/RxSwiftCommunity\/RxDataSources.git\", .upToNextMajor(from: \"5.0.2\")),         .package(url: \"https:\/\/github.com\/tristanhimmelman\/ObjectMapper.git\", .upToNextMajor(from: \"4.4.3\")),         .package(url: \"https:\/\/github.com\/jonkykong\/SideMenu.git\", .upToNextMajor(from: \"6.5.0\")),         .package(url: \"https:\/\/github.com\/scenee\/FloatingPanel.git\", .upToNextMajor(from: \"2.8.5\")),         .package(url: \"https:\/\/github.com\/SwiftKickMobile\/SwiftMessages.git\", .upToNextMajor(from: \"10.0.0\")),         .package(url: \"https:\/\/github.com\/appmetrica\/appmetrica-sdk-ios\", .upToNextMajor(from: \"5.0.0\")),         .package(url: \"https:\/\/github.com\/AppsFlyerSDK\/AppsFlyerFramework-Static\", .upToNextMajor(from: \"6.15.0\")),         .package(url: \"https:\/\/github.com\/Juanpe\/SkeletonView.git\", .upToNextMajor(from: \"1.31.0\")),         .package(url: \"https:\/\/github.com\/Swinject\/Swinject.git\", .upToNextMajor(from: \"2.9.1\")),         .package(url: \"https:\/\/github.com\/Swinject\/SwinjectStoryboard.git\", .upToNextMajor(from: \"2.2.3\")),         .package(url: \"https:\/\/github.com\/SnapKit\/SnapKit.git\", .upToNextMajor(from: \"5.7.1\"))     ] ) <\/code><\/pre>\n<\/p>\n<\/div>\n<\/details>\n<p>\u0412\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u043c <code>tuist install<\/code> \u0434\u043b\u044f \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0435\u0439.<\/p>\n<p><strong>\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 \u043f\u0440\u043e\u0435\u043a\u0442\u0430<\/strong><\/p>\n<p>\u041f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u043c \u0432 <em>Manifests\/Project.swift <\/em>\u0442\u0443\u0442 \u043d\u0430\u0441 \u0436\u0434\u0435\u0442 \u0441\u0430\u043c\u043e\u0435 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e\u0435. \u0423\u0434\u0430\u043b\u0438\u043c \u043f\u043e\u043a\u0430 target \u0441 \u0442\u0435\u0441\u0442\u0430\u043c\u0438, \u0437\u0430\u0439\u043c\u0435\u043c\u0441\u044f \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435\u043c.<\/p>\n<p>\u0412 Project \u043a\u0440\u043e\u043c\u0435 \u0438\u043c\u0435\u043d\u0438 \u043c\u043e\u0436\u043d\u043e \u0443\u043a\u0430\u0437\u0430\u0442\u044c organizationName &#8212; \u043e\u0440\u0433\u0430\u043d\u0438\u0437\u0430\u0446\u0438\u044e \u0434\u043b\u044f copyright.<\/p>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u043f\u0435\u0440\u0435\u0439\u0434\u0435\u043c \u043a target \u0438 \u0435\u0435 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0435, \u0447\u0442\u043e \u043c\u044b \u0442\u0443\u0442 \u0432\u0438\u0434\u0438\u043c:<\/p>\n<p><strong>destinations<\/strong> &#8212; \u044d\u0442\u043e \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u043c\u044b\u0435 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430, \u044d\u0442\u043e \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e \u0438 \u043c\u043e\u0436\u043d\u043e \u0432\u044b\u0431\u0440\u0430\u0442\u044c \u0432\u0441\u0435, \u0447\u0442\u043e \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e, \u0443 \u043c\u0435\u043d\u044f \u044d\u0442\u043e <code>destinations: [.iPhone],<\/code> <\/p>\n<p><strong>product<\/strong> &#8212; \u0432\u043e \u0447\u0442\u043e \u043f\u0440\u0435\u0432\u0440\u0430\u0442\u0438\u0442\u0441\u044f \u044d\u0442\u0430 target, \u0443 \u043c\u0435\u043d\u044f \u044d\u0442\u043e <code>product: .app,<\/code><\/p>\n<p><strong>bundleId<\/strong> &#8212; id \u043d\u0430\u0448\u0435\u0433\u043e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f, \u043c\u043e\u0436\u043d\u043e \u0441\u0440\u0430\u0437\u0443 \u0443\u043a\u0430\u0437\u0430\u0442\u044c id \u0438\u0441\u0445\u043e\u0434\u043d\u043e\u0433\u043e, \u0447\u0442\u043e\u0431\u044b \u0431\u044b\u043b\u043e \u043c\u0435\u043d\u044c\u0448\u0435 \u043f\u0440\u043e\u0431\u043b\u0435\u043c \u0441 firebase \u0438 \u0434\u0440\u0443\u0433\u0438\u043c\u0438 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u044f\u043c\u0438<\/p>\n<p><strong>deploymentTargets<\/strong> &#8212; \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u0430\u044f \u0432\u0435\u0440\u0441\u0438\u044f iOS, \u043f\u043e\u0447\u0435\u043c\u0443-\u0442\u043e \u0432 \u0442\u0435\u043c\u043f\u043b\u0435\u0439\u0442\u0435 \u044d\u0442\u043e\u0442 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u043e\u0432\u0430\u043b, \u0437\u0430\u0434\u0430\u0434\u0438\u043c <code>deploymentTargets: .iOS(\"15.0\"),<\/code><\/p>\n<p><strong>infoPlist<\/strong> &#8212; \u0433\u043b\u0430\u0432\u043d\u044b\u0439 plist \u043d\u0430\u0448\u0435\u0433\u043e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f, \u0440\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0443\u044e \u0441\u0440\u0430\u0437\u0443 \u043f\u0435\u0440\u0435\u043d\u0435\u0441\u0442\u0438 \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u0439 <code>infoPlist: .file(path: \"demo\/Info.plist\"),<\/code><\/p>\n<p><strong>sources<\/strong> &#8212; \u0442\u043e, \u0433\u0434\u0435 \u0431\u0443\u0434\u0435\u0442 \u043d\u0430\u0448 \u043a\u043e\u0434, \u0440\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0443\u044e \u043e\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u043f\u043e\u043a\u0430 \u0431\u0435\u0437 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0439, \u0432 \u0431\u0443\u0434\u0443\u0449\u0435\u043c \u043f\u0435\u0440\u0435\u043d\u0435\u0441\u0442\u0438 \u0432\u0441\u0435 \u0442\u0443\u0434\u0430 <code>sources: [\"demo\/Sources\/**\"],<\/code><\/p>\n<p><strong>resources<\/strong> &#8212; \u043c\u0435\u0441\u0442\u043e \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u043d\u0430\u0448\u0438\u0445 \u0440\u0435\u0441\u0443\u0440\u0441\u043e\u0432, \u0440\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0443\u044e \u0432\u044b\u043d\u0435\u0441\u0442\u0438 \u0432\u044b\u0448\u0435 \u0432 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u0443\u044e \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e \u0442.\u043a. \u0442\u0430\u043c \u0431\u0443\u0434\u0443\u0442 \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u0443\u0442\u044c \u0434\u043e \u043d\u0430\u0448\u0438\u0445 \u043a\u0430\u0440\u0442\u0438\u043d\u043e\u043a(Assets.xcassets), xib, storyboard(\u0435\u0441\u043b\u0438 \u043e\u043d\u0438 \u0443 \u0432\u0430\u0441 \u0435\u0441\u0442\u044c) \u0438 GoogleService-Info.plist , \u043d\u043e \u0438 <a href=\"https:\/\/developer.apple.com\/documentation\/bundleresources\/privacy_manifest_files\" rel=\"noopener noreferrer nofollow\">PrivacyManifest<\/a>. \u041f\u043e\u0441\u043b\u0435 \u0437\u0430\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f <a href=\"https:\/\/github.com\/tuist\/tuist\/tree\/main\/fixtures\/ios_app_with_privacy_manifest\" rel=\"noopener noreferrer nofollow\">PrivacyManifest<\/a> \u044f \u0440\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0443\u044e \u0441\u0432\u0435\u0440\u0438\u0442\u0441\u044f \u0441 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b\u043e\u043c<\/p>\n<pre><code class=\"swift\">let resources: ProjectDescription.ResourceFileElements =     .resources(         [             \"demo\/Resources\/**\",             \"demo\/**\/*.storyboard\",             \"demo\/**\/*.xib\"         ],         privacyManifest: privacyManifest     )<\/code><\/pre>\n<details class=\"spoiler\">\n<summary>\u0421\u043a\u0440\u044b\u0442\u044b\u0439 \u0442\u0435\u043a\u0441\u0442<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"swift\">let privacyManifest: ProjectDescription.PrivacyManifest = .privacyManifest(     tracking: true,     trackingDomains: [         \"firebase-settings.crashlytics.com\",         \"report.appmetrica.yandex.net\",         \"usccgg-launches.appsflyersdk.com\",         \"firebaselogging-pa.googleapis.com\"     ],     collectedDataTypes: [         [             \"NSPrivacyCollectedDataType\": \"NSPrivacyCollectedDataTypeName\",             \"NSPrivacyCollectedDataTypeLinked\": true,             \"NSPrivacyCollectedDataTypeTracking\": false,             \"NSPrivacyCollectedDataTypePurposes\": [                 \"NSPrivacyCollectedDataTypePurposeProductPersonalization\",             ],         ],         [             \"NSPrivacyCollectedDataType\": \"NSPrivacyCollectedDataTypeEmailAddress\",             \"NSPrivacyCollectedDataTypeLinked\": true,             \"NSPrivacyCollectedDataTypeTracking\": false,             \"NSPrivacyCollectedDataTypePurposes\": [                 \"NSPrivacyCollectedDataTypePurposeDeveloperAdvertising\",                 \"NSPrivacyCollectedDataTypePurposeProductPersonalization\",                 \"NSPrivacyCollectedDataTypePurposeAppFunctionality\"             ]         ],         [             \"NSPrivacyCollectedDataType\": \"NSPrivacyCollectedDataTypePhoneNumber\",             \"NSPrivacyCollectedDataTypeLinked\": true,             \"NSPrivacyCollectedDataTypeTracking\": false,             \"NSPrivacyCollectedDataTypePurposes\": [                 \"NSPrivacyCollectedDataTypePurposeAppFunctionality\"             ]         ],         [             \"NSPrivacyCollectedDataType\": \"NSPrivacyCollectedDataTypePaymentInfo\",             \"NSPrivacyCollectedDataTypeLinked\": true,             \"NSPrivacyCollectedDataTypeTracking\": false,             \"NSPrivacyCollectedDataTypePurposes\": [                 \"NSPrivacyCollectedDataTypePurposeAppFunctionality\"             ]         ],         [             \"NSPrivacyCollectedDataType\": \"NSPrivacyCollectedDataTypeCrashData\",             \"NSPrivacyCollectedDataTypeLinked\": false,             \"NSPrivacyCollectedDataTypeTracking\": false,             \"NSPrivacyCollectedDataTypePurposes\": [                 \"NSPrivacyCollectedDataTypePurposeAnalytics\"             ]         ],         [             \"NSPrivacyCollectedDataType\": \"NSPrivacyCollectedDataTypePreciseLocation\",             \"NSPrivacyCollectedDataTypeLinked\": false,             \"NSPrivacyCollectedDataTypeTracking\": false,             \"NSPrivacyCollectedDataTypePurposes\": [                 \"NSPrivacyCollectedDataTypePurposeAppFunctionality\"             ]         ],         [             \"NSPrivacyCollectedDataType\": \"NSPrivacyCollectedDataTypeDeviceID\",             \"NSPrivacyCollectedDataTypeLinked\": false,             \"NSPrivacyCollectedDataTypeTracking\": true,             \"NSPrivacyCollectedDataTypePurposes\": [                 \"NSPrivacyCollectedDataTypePurposeDeveloperAdvertising\",                 \"NSPrivacyCollectedDataTypePurposeAnalytics\",                 \"NSPrivacyCollectedDataTypePurposeAppFunctionality\",             ]         ],         [             \"NSPrivacyCollectedDataType\": \"NSPrivacyCollectedDataTypeProductInteraction\",             \"NSPrivacyCollectedDataTypeLinked\": false,             \"NSPrivacyCollectedDataTypeTracking\": true,             \"NSPrivacyCollectedDataTypePurposes\": [                 \"NSPrivacyCollectedDataTypePurposeAppFunctionality\",                 \"NSPrivacyCollectedDataTypePurposeAnalytics\",             ]         ]     ],     accessedApiTypes: [         [             \"NSPrivacyAccessedAPIType\": \"NSPrivacyAccessedAPICategorySystemBootTime\",             \"NSPrivacyAccessedAPITypeReasons\": [                 \"35F9.1\",             ],         ],         [             \"NSPrivacyAccessedAPIType\": \"NSPrivacyAccessedAPICategoryUserDefaults\",             \"NSPrivacyAccessedAPITypeReasons\": [                 \"CA92.1\",             ],         ],         [             \"NSPrivacyAccessedAPIType\": \"NSPrivacyAccessedAPICategoryDiskSpace\",             \"NSPrivacyAccessedAPITypeReasons\": [                 \"E174.1\",             ],         ],         [             \"NSPrivacyAccessedAPIType\": \"NSPrivacyAccessedAPICategoryFileTimestamp\",             \"NSPrivacyAccessedAPITypeReasons\": [                 \"3B52.1\",             ],         ],     ] )<\/code><\/pre>\n<\/p>\n<\/div>\n<\/details>\n<p><strong>entitlements<\/strong> &#8212; \u043d\u0430\u0448\u0438 entitlements, \u0435\u0441\u043b\u0438 \u043e\u043d\u0438 \u0435\u0441\u0442\u044c, \u0442\u043e \u0440\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0443\u044e \u0442\u0430\u043a \u0436\u0435 \u043f\u0435\u0440\u0435\u043d\u0435\u0441\u0442\u0438 \u0438\u0437 \u0441\u0442\u0430\u0440\u043e\u0433\u043e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f <code>entitlements: Entitlements(stringLiteral: \"demo\/demo.entitlements\"),<\/code> <\/p>\n<p><strong>scripts <\/strong>&#8212; \u043d\u0430\u0448\u0438 \u0441\u043a\u0440\u0438\u043f\u0442\u044b, \u0432 \u0434\u0430\u043d\u043d\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u0442\u043e\u043b\u044c\u043a\u043e Firebase \u0441\u043a\u0440\u0438\u043f\u0442, \u043e\u0442 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438 <code>(\"${BUILD_DIR%\/Build\/*}\/SourcePackages\/checkouts\/firebase-ios-sdk\/Crashlytics\/run\")<\/code> \u0435\u0433\u043e \u043e\u0442\u043b\u0438\u0447\u0430\u0435\u0442 \u043f\u0443\u0442\u044c. \u0422\u0430\u043a \u0436\u0435 \u0442\u0443\u0442 \u043c\u043e\u0436\u043d\u043e \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0441\u043a\u0440\u0438\u043f\u0442 \u0434\u043b\u044f SwiftLint, \u0433\u043b\u0430\u0432\u043d\u043e\u0435 \u0437\u0430\u0434\u0430\u0442\u044c \u0432 .swiftlint.yml \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0443 \u0442\u043e\u043b\u044c\u043a\u043e \u043d\u0430\u0448\u0438\u0445 \u0438\u0441\u0445\u043e\u0434\u043d\u0438\u043a\u043e\u0432(demo\/Sources)<\/p>\n<details class=\"spoiler\">\n<summary>\u0421\u043a\u0440\u044b\u0442\u044b\u0439 \u0442\u0435\u043a\u0441\u0442<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"swift\">let firebaseScript = \"\"\"                     if [ \"${CONFIGURATION}\" != \"Debug\" ]; then                         \"$SRCROOT\/Tuist\/.build\/checkouts\/firebase-ios-sdk\/Crashlytics\/run\"                     fi                     \"\"\" let scripts: [ProjectDescription.TargetScript] = [     .post(script: firebaseScript, name: \"firebase\", inputPaths: [         \"${DWARF_DSYM_FOLDER_PATH}\/${DWARF_DSYM_FILE_NAME}\",         \"${DWARF_DSYM_FOLDER_PATH}\/${DWARF_DSYM_FILE_NAME}\/Contents\/Resources\/DWARF\/${PRODUCT_NAME}\",         \"${DWARF_DSYM_FOLDER_PATH}\/${DWARF_DSYM_FILE_NAME}\/Contents\/Info.plist\",         \"$(TARGET_BUILD_DIR)\/$(UNLOCALIZED_RESOURCES_FOLDER_PATH)\/GoogleService-Info.plist\",         \"$(TARGET_BUILD_DIR)\/$(EXECUTABLE_PATH)\"     ], basedOnDependencyAnalysis: false) ]<\/code><\/pre>\n<\/p>\n<\/div>\n<\/details>\n<p><strong>dependencies<\/strong> &#8212; \u0432\u043e\u0442 \u043c\u044b \u0438 \u043f\u043e\u0434\u043e\u0448\u043b\u0438 \u043a \u043d\u0430\u0448\u0438\u043c \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u044f\u043c. \u041d\u0443\u0436\u043d\u043e \u0441\u043a\u0430\u0437\u0430\u0442\u044c, \u0447\u0442\u043e \u0441 \u043d\u0438\u043c\u0438 \u043d\u0435 \u0432\u0441\u0435 \u0442\u0430\u043a \u043f\u0440\u043e\u0441\u0442\u043e, \u0438\u043d\u043e\u0433\u0434\u0430 \u043d\u0435\u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043f\u0440\u043e\u0441\u0442\u043e \u0441\u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u044f \u0438\u0437 Package.swift, \u0442\u043e\u0433\u0434\u0430 \u0444\u0430\u0439\u043b \u043f\u0440\u043e\u0435\u043a\u0442 \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u0441 \u043e\u0448\u0438\u0431\u043a\u043e\u0439, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440:<\/p>\n<ul>\n<li>\n<p>AppsFlyerFramework, \u043c\u044b \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u043c \u0432 Package.swift \u043a\u0430\u043a <br \/><code>.package(url: \"https:\/\/github.com\/AppsFlyerSDK\/AppsFlyerFramework-Static\", .upToNextMajor(from: \"6.15.0\")),<br \/><\/code>\u043d\u043e \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u044f \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u044c \u043a\u0430\u043a AppsFlyerFramework-Static \u043c\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u043c \u043e\u0448\u0438\u0431\u043a\u0443. \u041f\u0440\u0438 \u0442\u0430\u043a\u0438\u0445 \u043e\u0431\u0441\u0442\u043e\u044f\u0442\u0435\u043b\u044c\u0441\u0442\u0432\u0430\u0445 \u044f \u0440\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0443\u044e \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u043d\u043e\u0432\u044b\u0439 \u043f\u0440\u043e\u0435\u043a\u0442 \u0438 \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u044d\u0442\u0443 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u044c \u0447\u0435\u0440\u0435\u0437 File -&gt; Add Package Dependencies&#8230;, \u043f\u0435\u0440\u0435\u0439\u0442\u0438 \u0432 Package \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u0438 \u043d\u0430\u0439\u0442\u0438 \u043f\u043e\u043b\u0435 name, \u0432 \u0434\u0430\u043d\u043d\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u044d\u0442\u043e name: &#171;AppsFlyerLib-Static&#187;, \u0447\u0442\u043e \u0438 \u043d\u0443\u0436\u043d\u043e \u0431\u0443\u0434\u0435\u0442 \u0443\u043a\u0430\u0437\u0430\u0442\u044c \u0432 \u043d\u0430\u0448\u0435\u043c Project.swift<\/p>\n<\/li>\n<li>\n<p>Firebase, \u043e\u043d \u043d\u0430\u043c \u043d\u0435 \u043d\u0443\u0436\u0435\u043d \u0432\u0435\u0441\u044c, \u0442\u0443\u0442 \u043d\u0430\u043c \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0443\u043a\u0430\u0437\u0430\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u043d\u0443\u0436\u043d\u044b\u0435 \u0447\u0430\u0441\u0442\u0438, \u0432 \u043d\u0430\u0448\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u044d\u0442\u043e FirebaseCrashlytics, \u043d\u043e \u043e\u0431 \u044d\u0442\u043e\u043c \u043f\u043e\u0447\u0435\u043c\u0443-\u0442\u043e \u043c\u043e\u043b\u0447\u0438\u0442 <a href=\"https:\/\/firebase.google.com\/docs\/crashlytics\/get-started?platform=ios\" rel=\"noopener noreferrer nofollow\">Get started<\/a> \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438(\u0438\u043b\u0438 \u044f \u043d\u0435 \u043d\u0430\u0448\u0435\u043b, \u043d\u043e \u0442\u0430\u043c \u0441\u043a\u0430\u0437\u0430\u043d\u043e \u043f\u0440\u043e \u0444\u043b\u0430\u0433 <code>-ObjC<\/code>  \u043a \u043d\u0435\u043c\u0443 \u043c\u044b \u0432\u0435\u0440\u043d\u0435\u043c\u0441\u044f \u043a\u043e\u0433\u0434\u0430 \u0431\u0443\u0434\u0435\u043c \u0440\u0430\u0437\u0431\u0438\u0440\u0430\u0442\u044c\u0441\u044f \u0441 \u043f\u043e\u043b\u0435\u043c settings)<\/p>\n<\/li>\n<li>\n<p>\u0421 Appmetrica \u0442\u0430\u043a \u0436\u0435 \u043a\u0430\u043a \u0441 FirebaseCrashlytics, \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0443\u043a\u0430\u0437\u0430\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u0442\u043e, \u0447\u0442\u043e \u043d\u0443\u0436\u043d\u043e AppMetricaCore<\/p>\n<\/li>\n<\/ul>\n<details class=\"spoiler\">\n<summary>\u0421\u043a\u0440\u044b\u0442\u044b\u0439 \u0442\u0435\u043a\u0441\u0442<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"swift\">dependencies: [                 .external(name: \"Kingfisher\"),                 .external(name: \"FirebaseCrashlytics\"),                 .external(name: \"GoogleMaps\"),                 .external(name: \"GoogleMapsUtils\"),                 .external(name: \"Moya\"),                 .external(name: \"RxSwift\"),                 .external(name: \"RxDataSources\"),                 .external(name: \"ObjectMapper\"),                 .external(name: \"SideMenu\"),                 .external(name: \"FloatingPanel\"),                 .external(name: \"SwiftMessages\"),                 .external(name: \"AppMetricaCore\"),                 .external(name: \"AppsFlyerLib-Static\"),                 .external(name: \"SkeletonView\"),                 .external(name: \"Swinject\"),                 .external(name: \"SwinjectStoryboard\"),                 .external(name: \"SnapKit\"),             ]<\/code><\/pre>\n<\/p>\n<\/div>\n<\/details>\n<p><strong>settings &#8212; <\/strong>\u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u043f\u0440\u043e\u0435\u043a\u0442\u0430<br \/>\u0441 configurations \u0432\u0441\u0435 \u044f\u0441\u043d\u043e: debug \u0438 release<br \/>\u0441 base \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430\u043c\u0438 \u0432\u0441\u0435 \u0432\u0435\u0441\u0435\u043b\u0435\u0435:<\/p>\n<ul>\n<li>\n<p>\u0414\u043b\u044f \u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u043d\u0430 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0435, \u043d\u0443\u0436\u043d\u043e \u0443\u043a\u0430\u0437\u0430\u0442\u044c CODE_SIGN_STYLE: <code>manualCodeSigning<\/code>, <code>.automaticCodeSigning(devTeam: \"\u041a\u041e\u041c\u0410\u041d\u0414\u0410\")<\/code> \u0438 \u0442\u0430\u043a \u0434\u0430\u043b\u0435\u0435, \u043c\u044b \u043f\u0440\u0435\u0434\u043f\u043e\u0447\u0442\u0435\u043c \u043f\u043e\u043a\u0430 <code>.codeSignIdentityAppleDevelopment<\/code><\/p>\n<\/li>\n<li>\n<p> \u0434\u043b\u044f Firebase, \u0441\u043e\u0433\u043b\u0430\u0441\u043d\u043e \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438, \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0443\u043a\u0430\u0437\u0430\u0442\u044c <code>.otherLinkerFlags([\"-ObjC\"])<\/code>  <\/p>\n<\/li>\n<li>\n<p>\u0442\u0430\u043a \u0436\u0435 \u0434\u043b\u044f Firebase \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u043c <code>.debugInformationFormat(.dwarfWithDsym)<\/code> <\/p>\n<\/li>\n<li>\n<p>\u0427\u0442\u043e\u0431\u044b \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u043d\u0435 \u0443\u043f\u0430\u043b\u043e \u043f\u0440\u0438 \u0437\u0430\u043f\u0443\u0441\u043a\u0435, \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0443\u043a\u0430\u0437\u0430\u0442\u044c: <code>.marketingVersion(\"1.0.0\")<\/code> + <code>.currentProjectVersion(\"1\")<\/code><\/p>\n<\/li>\n<li>\n<p>4. \u0420\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0443\u044e \u0443\u043a\u0430\u0437\u0430\u0442\u044c <code>.otherSwiftFlags([\"-D IS_PRODUCTION\"])<\/code>, \u0447\u0442\u043e\u0431\u044b \u0438\u043c\u0435\u0442\u044c \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0447\u0435\u0440\u0435\u0437 #if \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0442\u044c \u043a\u0430\u043a\u043e\u0439 target \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f, \u0435\u0441\u043b\u0438 \u043e\u043d \u0443 \u0432\u0430\u0441 \u043d\u0435 \u043e\u0434\u0438\u043d<\/p>\n<\/li>\n<\/ul>\n<p>\u041e\u0441\u0442\u0430\u043b\u043e\u0441\u044c \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c <code>tuist generate<\/code> ,\u0435\u0441\u043b\u0438 \u0432\u0441\u0435 \u0441\u0434\u0435\u043b\u0430\u043d\u043e \u0432\u0435\u0440\u043d\u043e, \u0442\u043e \u043e\u0442\u043a\u0440\u043e\u0435\u0442\u0441\u044f \u043f\u0440\u043e\u0435\u043a\u0442 \u0432 Xcode:<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/7d1\/d3d\/c84\/7d1d3dc845bf742411aca9eae11bb394.png\" width=\"2796\" height=\"1673\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/7d1\/d3d\/c84\/7d1d3dc845bf742411aca9eae11bb394.png\"\/><\/figure>\n<p>\u0412\u043e\u0442 \u0438 \u0432\u0441\u0435, \u0432\u0430\u043c \u043e\u0441\u0442\u0430\u043d\u0435\u0442\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u0443\u0434\u0430\u043b\u0438\u0442\u044c ContentView.swift + DemoApp.swift \u0438 \u043f\u0435\u0440\u0435\u043d\u0435\u0441\u0442\u0438 \u0432\u0435\u0441\u044c \u0441\u0432\u043e\u0439 \u043a\u043e\u0434 \u0432 Sources. \u0421\u043f\u0430\u0441\u0438\u0431\u043e \u0437\u0430 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435.<\/p>\n<details class=\"spoiler\">\n<summary>\u0421\u043a\u0440\u044b\u0442\u044b\u0439 \u0442\u0435\u043a\u0441\u0442<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"swift\">import ProjectDescription let privacyManifest: ProjectDescription.PrivacyManifest = .privacyManifest(     tracking: true,     trackingDomains: [         \"firebase-settings.crashlytics.com\",         \"report.appmetrica.yandex.net\",         \"usccgg-launches.appsflyersdk.com\",         \"firebaselogging-pa.googleapis.com\"     ],     collectedDataTypes: [         [             \"NSPrivacyCollectedDataType\": \"NSPrivacyCollectedDataTypeName\",             \"NSPrivacyCollectedDataTypeLinked\": true,             \"NSPrivacyCollectedDataTypeTracking\": false,             \"NSPrivacyCollectedDataTypePurposes\": [                 \"NSPrivacyCollectedDataTypePurposeProductPersonalization\",             ],         ],         [             \"NSPrivacyCollectedDataType\": \"NSPrivacyCollectedDataTypeEmailAddress\",             \"NSPrivacyCollectedDataTypeLinked\": true,             \"NSPrivacyCollectedDataTypeTracking\": false,             \"NSPrivacyCollectedDataTypePurposes\": [                 \"NSPrivacyCollectedDataTypePurposeDeveloperAdvertising\",                 \"NSPrivacyCollectedDataTypePurposeProductPersonalization\",                 \"NSPrivacyCollectedDataTypePurposeAppFunctionality\"             ]         ],         [             \"NSPrivacyCollectedDataType\": \"NSPrivacyCollectedDataTypePhoneNumber\",             \"NSPrivacyCollectedDataTypeLinked\": true,             \"NSPrivacyCollectedDataTypeTracking\": false,             \"NSPrivacyCollectedDataTypePurposes\": [                 \"NSPrivacyCollectedDataTypePurposeAppFunctionality\"             ]         ],         [             \"NSPrivacyCollectedDataType\": \"NSPrivacyCollectedDataTypePaymentInfo\",             \"NSPrivacyCollectedDataTypeLinked\": true,             \"NSPrivacyCollectedDataTypeTracking\": false,             \"NSPrivacyCollectedDataTypePurposes\": [                 \"NSPrivacyCollectedDataTypePurposeAppFunctionality\"             ]         ],         [             \"NSPrivacyCollectedDataType\": \"NSPrivacyCollectedDataTypeCrashData\",             \"NSPrivacyCollectedDataTypeLinked\": false,             \"NSPrivacyCollectedDataTypeTracking\": false,             \"NSPrivacyCollectedDataTypePurposes\": [                 \"NSPrivacyCollectedDataTypePurposeAnalytics\"             ]         ],         [             \"NSPrivacyCollectedDataType\": \"NSPrivacyCollectedDataTypePreciseLocation\",             \"NSPrivacyCollectedDataTypeLinked\": false,             \"NSPrivacyCollectedDataTypeTracking\": false,             \"NSPrivacyCollectedDataTypePurposes\": [                 \"NSPrivacyCollectedDataTypePurposeAppFunctionality\"             ]         ],         [             \"NSPrivacyCollectedDataType\": \"NSPrivacyCollectedDataTypeDeviceID\",             \"NSPrivacyCollectedDataTypeLinked\": false,             \"NSPrivacyCollectedDataTypeTracking\": true,             \"NSPrivacyCollectedDataTypePurposes\": [                 \"NSPrivacyCollectedDataTypePurposeDeveloperAdvertising\",                 \"NSPrivacyCollectedDataTypePurposeAnalytics\",                 \"NSPrivacyCollectedDataTypePurposeAppFunctionality\",             ]         ],         [             \"NSPrivacyCollectedDataType\": \"NSPrivacyCollectedDataTypeProductInteraction\",             \"NSPrivacyCollectedDataTypeLinked\": false,             \"NSPrivacyCollectedDataTypeTracking\": true,             \"NSPrivacyCollectedDataTypePurposes\": [                 \"NSPrivacyCollectedDataTypePurposeAppFunctionality\",                 \"NSPrivacyCollectedDataTypePurposeAnalytics\",             ]         ]     ],     accessedApiTypes: [         [             \"NSPrivacyAccessedAPIType\": \"NSPrivacyAccessedAPICategorySystemBootTime\",             \"NSPrivacyAccessedAPITypeReasons\": [                 \"35F9.1\",             ],         ],         [             \"NSPrivacyAccessedAPIType\": \"NSPrivacyAccessedAPICategoryUserDefaults\",             \"NSPrivacyAccessedAPITypeReasons\": [                 \"CA92.1\",             ],         ],         [             \"NSPrivacyAccessedAPIType\": \"NSPrivacyAccessedAPICategoryDiskSpace\",             \"NSPrivacyAccessedAPITypeReasons\": [                 \"E174.1\",             ],         ],         [             \"NSPrivacyAccessedAPIType\": \"NSPrivacyAccessedAPICategoryFileTimestamp\",             \"NSPrivacyAccessedAPITypeReasons\": [                 \"3B52.1\",             ],         ],     ] ) let resources: ProjectDescription.ResourceFileElements =     .resources(         [             \"demo\/Resources\/**\",             \"demo\/**\/*.storyboard\",             \"demo\/**\/*.xib\"         ],         privacyManifest: privacyManifest     ) let firebaseScript = \"\"\"                     if [ \"${CONFIGURATION}\" != \"Debug\" ]; then                         \"$SRCROOT\/Tuist\/.build\/checkouts\/firebase-ios-sdk\/Crashlytics\/run\"                     fi                     \"\"\" let scripts: [ProjectDescription.TargetScript] = [     .post(script: firebaseScript, name: \"firebase\", inputPaths: [         \"${DWARF_DSYM_FOLDER_PATH}\/${DWARF_DSYM_FILE_NAME}\",         \"${DWARF_DSYM_FOLDER_PATH}\/${DWARF_DSYM_FILE_NAME}\/Contents\/Resources\/DWARF\/${PRODUCT_NAME}\",         \"${DWARF_DSYM_FOLDER_PATH}\/${DWARF_DSYM_FILE_NAME}\/Contents\/Info.plist\",         \"$(TARGET_BUILD_DIR)\/$(UNLOCALIZED_RESOURCES_FOLDER_PATH)\/GoogleService-Info.plist\",         \"$(TARGET_BUILD_DIR)\/$(EXECUTABLE_PATH)\"     ], basedOnDependencyAnalysis: false) ] let project = Project(     name: \"demo\",     organizationName: \"DEMO\",     targets: [         .target(             name: \"demo\",             destinations: [.iPhone],             product: .app,             bundleId: \"io.tuist.demo\",             deploymentTargets: .iOS(\"15.0\"),             infoPlist: .file(path: \"demo\/Info.plist\"),             sources: [\"demo\/Sources\/**\"],             resources: resources,             entitlements: Entitlements(stringLiteral: \"demo\/demo.entitlements\"),             scripts: scripts,             dependencies: [                 .external(name: \"Kingfisher\"),                 .external(name: \"FirebaseCrashlytics\"),                 .external(name: \"GoogleMaps\"),                 .external(name: \"GoogleMapsUtils\"),                 .external(name: \"Moya\"),                 .external(name: \"RxSwift\"),                 .external(name: \"RxDataSources\"),                 .external(name: \"ObjectMapper\"),                 .external(name: \"SideMenu\"),                 .external(name: \"FloatingPanel\"),                 .external(name: \"SwiftMessages\"),                 .external(name: \"AppMetricaCore\"),                 .external(name: \"AppsFlyerLib-Static\"),                 .external(name: \"SkeletonView\"),                 .external(name: \"Swinject\"),                 .external(name: \"SwinjectStoryboard\"),                 .external(name: \"SnapKit\"),             ],             settings: .settings(                 base: SettingsDictionary()                     .codeSignIdentityAppleDevelopment()                     .otherLinkerFlags([\"-ObjC\"])                     .debugInformationFormat(.dwarfWithDsym)                     .marketingVersion(\"1.0.0\")                     .otherSwiftFlags([\"-D IS_PRODUCTION\"])                     .currentProjectVersion(\"1\"),                                  configurations: [                     .debug(name: .debug),                     .release(name: .release)                 ]             )         ),     ] ) <\/code><\/pre>\n<\/p>\n<\/div>\n<\/details>\n<\/div>\n<\/div>\n<\/div>\n<p><!----><!----><\/div>\n<p><!----><!----><br \/> \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"https:\/\/habr.com\/ru\/articles\/837456\/\"> https:\/\/habr.com\/ru\/articles\/837456\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<div><!--[--><!--]--><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body article-formatted-body_version-2\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<p>\u041d\u0435 \u0442\u0430\u043a \u0434\u0430\u0432\u043d\u043e \u043f\u0440\u043e\u0433\u0440\u0435\u043c\u0435\u043b\u0430 <a href=\"https:\/\/blog.cocoapods.org\/CocoaPods-Support-Plans\/\" rel=\"noopener noreferrer nofollow\">\u043d\u043e\u0432\u043e\u0441\u0442\u044c<\/a>, \u0447\u0442\u043e Cocoapods \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u0442 \u0432 \u0440\u0435\u0436\u0438\u043c \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0438. \u0412 \u0441\u0432\u044f\u0437\u0438 \u0441 \u044d\u0442\u0438\u043c \u0432\u0441\u0442\u0430\u043b \u0432\u043e\u043f\u0440\u043e\u0441, \u0447\u0442\u043e \u0434\u0430\u043b\u044c\u0448\u0435. \u0412 \u043d\u0430\u0447\u0430\u043b\u0435 \u043c\u044b \u0441\u043a\u043b\u043e\u043d\u044f\u043b\u0438\u0441\u044c \u043a \u0447\u0438\u0441\u0442\u043e Swift Package Manager, \u043d\u043e \u043f\u043e\u0442\u043e\u043c \u043f\u0440\u0438\u0448\u043b\u043e \u043f\u043e\u043d\u0438\u043c\u0430\u043d\u0438\u0435, \u0447\u0442\u043e \u043d\u0435\u043f\u043b\u043e\u0445\u043e \u0431\u044b\u043b\u043e \u0431\u044b \u0443\u0439\u0442\u0438 \u043e\u0442 \u043a\u043e\u043d\u0444\u043b\u0438\u043a\u0442\u043e\u0432 \u0432 project \u0444\u0430\u0439\u043b\u0435 \u0438 \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0437\u0430\u0434\u0435\u043b \u043d\u0430 \u043c\u043e\u0434\u0443\u043b\u044c\u043d\u043e\u0441\u0442\u044c. \u0412 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u043c\u044b \u043f\u0440\u043e\u0439\u0434\u0435\u043c \u043e\u0442 \u043d\u0430\u0448\u0435\u0433\u043e \u0441\u0442\u0430\u0440\u043e\u0433\u043e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u043a \u043d\u043e\u0432\u043e\u043c\u0443 \u0438 \u0437\u0430\u043a\u043e\u043d\u0447\u0438\u043c \u0442\u0430\u043c, \u0433\u0434\u0435 \u043e\u0441\u0442\u0430\u043d\u0435\u0442\u0441\u044f \u043f\u0435\u0440\u0435\u043d\u0435\u0441\u0442\u0438 \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u0439 \u043a\u043e\u0434 \u0438 \u0432\u0441\u0435 \u0437\u0430\u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442.<\/p>\n<p><strong>\u041f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u043a\u0430<\/strong><\/p>\n<p>\u0414\u043b\u044f \u043d\u0430\u0447\u0430\u043b\u0430 \u044f \u0440\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0443\u044e \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0444\u0430\u0439\u043b, \u043a\u0443\u0434\u0430 \u0441 \u043e\u0434\u043d\u043e\u0439 \u0441\u0442\u043e\u0440\u043e\u043d\u044b \u043f\u043e\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u0438\u0437 Podfile, \u0430 \u0441 \u0434\u0440\u0443\u0433\u043e\u0439 URL \u0434\u043b\u044f SPM \u0441 \u043d\u043e\u043c\u0435\u0440\u043e\u043c \u0432\u0435\u0440\u0441\u0438\u0438, \u0442\u0430\u043a \u0431\u0443\u0434\u0435\u0442 \u043f\u0440\u043e\u0449\u0435 \u0432\u043d\u043e\u0441\u0438\u0442\u044c \u0438\u0445 \u0432 Tuist.<\/p>\n<details class=\"spoiler\">\n<summary>\u0421\u043a\u0440\u044b\u0442\u044b\u0439 \u0442\u0435\u043a\u0441\u0442<\/summary>\n<div class=\"spoiler__content\">\n<p>pod &#8216;GoogleMaps&#8217; https:\/\/github.com\/googlemaps\/ios-maps-sdk 9.0.1<br \/>pod &#8216;Google-Maps-iOS-Utils&#8217; https:\/\/github.com\/googlemaps\/google-maps-ios-utils 6.0.0<br \/>pod &#8216;Firebase\/Crashlytics&#8217; https:\/\/github.com\/firebase\/firebase-ios-sdk.git 11.0.0<br \/>pod &#8216;Kingfisher&#8217; https:\/\/github.com\/onevcat\/Kingfisher 7.12.0<br \/>pod &#8216;Moya&#8217; https:\/\/github.com\/Moya\/Moya.git 15.0.3<br \/>pod &#8216;ObjectMapper&#8217; https:\/\/github.com\/tristanhimmelman\/ObjectMapper.git 4.4.3<br \/>pod &#8216;SideMenu&#8217; https:\/\/github.com\/jonkykong\/SideMenu.git 6.5.0<br \/>pod &#8216;FloatingPanel&#8217; https:\/\/github.com\/scenee\/FloatingPanel.git 2.8.5<br \/>pod &#8216;YandexMobileMetrica\/Dynamic&#8217; https:\/\/github.com\/appmetrica\/appmetrica-sdk-ios 5.0.0<br \/>pod &#8216;AppsFlyerFramework&#8217; https:\/\/github.com\/AppsFlyerSDK\/AppsFlyerFramework-Static 6.15.0<br \/>pod &#8216;SkeletonView&#8217; https:\/\/github.com\/Juanpe\/SkeletonView.git 1.31.0<br \/>pod &#8216;Swinject&#8217; https:\/\/github.com\/Swinject\/Swinject.git 2.9.1<br \/>pod &#8216;SwinjectStoryboard&#8217; https:\/\/github.com\/Swinject\/SwinjectStoryboard.git 2.2.3<br \/>pod &#8216;SnapKit&#8217; https:\/\/github.com\/SnapKit\/SnapKit.git 5.7.1<br \/>pod &#8216;RxSwift&#8217; https:\/\/github.com\/ReactiveX\/RxSwift.git 6.7.1<br \/>pod &#8216;RxCocoa&#8217; \u0432\u0445\u043e\u0434\u0438\u0442 \u0432 RxSwift<br \/>pod &#8216;RxDataSources&#8217; https:\/\/github.com\/RxSwiftCommunity\/RxDataSources.git 5.0.2<\/p>\n<\/div>\n<\/details>\n<p>\u041a\u0430\u043a \u0432\u0438\u0434\u0438\u0442\u0435 \u0442\u0443\u0442 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0442\u0441\u044f \u043f\u043e\u0447\u0442\u0438 \u0432\u043e \u0432\u0441\u0435\u0445 iOS \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f\u0445(Firebase, Kingfisher) \u0438 \u0435\u0449\u0435 \u0435\u0441\u0442\u044c \u0441\u0442\u0430\u0440\u044b\u0435, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043f\u043e\u0440\u0430 \u0437\u0430\u043c\u0435\u043d\u0438\u0442\u044c \u043d\u0430 \u043d\u043e\u0432\u044b\u0435(YandexMobileMetrica\/Dynamic)<\/p>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u043f\u043e\u0441\u0442\u0430\u0432\u0438\u043c <a href=\"https:\/\/docs.tuist.io\/guides\/quick-start\/install-tuist\" rel=\"noopener noreferrer nofollow\">Tuist<\/a>, \u0432\u0441\u0435 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043f\u0440\u043e\u0441\u0442\u043e:<\/p>\n<ol>\n<li>\n<p>\u0421\u0442\u0430\u0432\u0438\u043c <a href=\"https:\/\/github.com\/jdx\/mise\" rel=\"noopener noreferrer nofollow\">Mise<\/a> <code>curl https:\/\/mise.run | sh<\/code><\/p>\n<\/li>\n<li>\n<p>\u0421\u0442\u0430\u0432\u0438\u043c Tuist <code>mise install tuist<\/code> \u0438 \u0430\u043a\u0442\u0438\u0432\u0438\u0440\u0443\u0435\u043c \u0435\u0433\u043e \u0432 \u043f\u0430\u043f\u043a\u0435 \u0441 \u043f\u0440\u043e\u0435\u043a\u0442\u043e\u043c <code>mise use tuist<\/code> <\/p>\n<\/li>\n<\/ol>\n<p><strong>\u041d\u0430\u0447\u0430\u043b\u043e<\/strong><\/p>\n<p>\u042f \u0440\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0443\u044e \u043f\u043e\u0442\u0440\u0435\u043d\u0438\u0440\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u043d\u0430 \u043d\u043e\u0432\u043e\u043c \u043f\u0440\u043e\u0435\u043a\u0442\u0435, \u043f\u0440\u0435\u0436\u0434\u0435 \u0447\u0435\u043c \u043f\u0440\u0430\u0432\u0438\u0442\u044c \u0431\u043e\u0435\u0432\u043e\u0439. <\/p>\n<p>\u0421\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u043d\u043e\u0432\u044b\u0439 \u043f\u0440\u043e\u0435\u043a\u0442:<br \/><code>tuist init --name Demo<\/code> \u00a0<\/p>\n<p>\u041f\u0440\u0438\u0441\u0442\u0443\u043f\u0438\u043c \u043a \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0435 \u043f\u0440\u043e\u0435\u043a\u0442\u0430:<br \/><code>tuist edit<\/code><\/p>\n<p>\u0417\u0430\u0439\u043c\u0435\u043c\u0441\u044f \u0441\u0440\u0430\u0437\u0443 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u044f\u043c\u0438, \u044d\u0442\u043e \u0441\u0430\u043c\u044b\u0439 \u0434\u043e\u043b\u0433\u0438\u0439 \u0448\u0430\u0433, \u043e\u0442\u043a\u0440\u043e\u0435\u043c \u0444\u0430\u0439\u043b <em>Manifests\/Tuist\/Package.swift<\/em> \u0438 \u043d\u0430\u0447\u043d\u0435\u043c:<br \/>\u0412 \u043c\u0430\u0441\u0441\u0438\u0432 dependencies \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u043d\u0430\u0448\u0438 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438, \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u044f url \u0438 \u0432\u0435\u0440\u0441\u0438\u044e \u0438\u0437 \u043d\u0430\u0448\u0435\u0433\u043e \u0444\u0430\u0439\u043b\u0430<br \/><code>.package(url: \"URL\", .upToNextMajor(from: \"VERSION\")),<\/code> <br \/>\u0432 \u0438\u0442\u043e\u0433\u0435 \u043f\u043e\u043b\u0443\u0447\u0438\u043c \u043d\u0430\u0448\u0438 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438<\/p>\n<figure class=\"full-width\"><\/figure>\n<details class=\"spoiler\">\n<summary>\u0421\u043a\u0440\u044b\u0442\u044b\u0439 \u0442\u0435\u043a\u0441\u0442<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"swift\">let package = Package(     name: \"demo\",     dependencies: [         .package(url: \"https:\/\/github.com\/onevcat\/Kingfisher\", .upToNextMajor(from: \"7.12.0\")),         .package(url: \"https:\/\/github.com\/firebase\/firebase-ios-sdk.git\", .upToNextMajor(from: \"11.0.0\")),         .package(url: \"https:\/\/github.com\/googlemaps\/ios-maps-sdk\", .upToNextMajor(from: \"9.0.1\")),         .package(url: \"https:\/\/github.com\/googlemaps\/google-maps-ios-utils\", .upToNextMajor(from: \"6.0.0\")),         .package(url: \"https:\/\/github.com\/Moya\/Moya.git\", .upToNextMajor(from: \"15.0.3\")),         .package(url: \"https:\/\/github.com\/ReactiveX\/RxSwift.git\", .upToNextMajor(from: \"6.7.1\")),         .package(url: \"https:\/\/github.com\/RxSwiftCommunity\/RxDataSources.git\", .upToNextMajor(from: \"5.0.2\")),         .package(url: \"https:\/\/github.com\/tristanhimmelman\/ObjectMapper.git\", .upToNextMajor(from: \"4.4.3\")),         .package(url: \"https:\/\/github.com\/jonkykong\/SideMenu.git\", .upToNextMajor(from: \"6.5.0\")),         .package(url: \"https:\/\/github.com\/scenee\/FloatingPanel.git\", .upToNextMajor(from: \"2.8.5\")),         .package(url: \"https:\/\/github.com\/SwiftKickMobile\/SwiftMessages.git\", .upToNextMajor(from: \"10.0.0\")),         .package(url: \"https:\/\/github.com\/appmetrica\/appmetrica-sdk-ios\", .upToNextMajor(from: \"5.0.0\")),         .package(url: \"https:\/\/github.com\/AppsFlyerSDK\/AppsFlyerFramework-Static\", .upToNextMajor(from: \"6.15.0\")),         .package(url: \"https:\/\/github.com\/Juanpe\/SkeletonView.git\", .upToNextMajor(from: \"1.31.0\")),         .package(url: \"https:\/\/github.com\/Swinject\/Swinject.git\", .upToNextMajor(from: \"2.9.1\")),         .package(url: \"https:\/\/github.com\/Swinject\/SwinjectStoryboard.git\", .upToNextMajor(from: \"2.2.3\")),         .package(url: \"https:\/\/github.com\/SnapKit\/SnapKit.git\", .upToNextMajor(from: \"5.7.1\"))     ] ) <\/code><\/pre>\n<\/p>\n<\/div>\n<\/details>\n<p>\u0412\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u043c <code>tuist install<\/code> \u0434\u043b\u044f \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0435\u0439.<\/p>\n<p><strong>\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 \u043f\u0440\u043e\u0435\u043a\u0442\u0430<\/strong><\/p>\n<p>\u041f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u043c \u0432 <em>Manifests\/Project.swift <\/em>\u0442\u0443\u0442 \u043d\u0430\u0441 \u0436\u0434\u0435\u0442 \u0441\u0430\u043c\u043e\u0435 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e\u0435. \u0423\u0434\u0430\u043b\u0438\u043c \u043f\u043e\u043a\u0430 target \u0441 \u0442\u0435\u0441\u0442\u0430\u043c\u0438, \u0437\u0430\u0439\u043c\u0435\u043c\u0441\u044f \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435\u043c.<\/p>\n<p>\u0412 Project \u043a\u0440\u043e\u043c\u0435 \u0438\u043c\u0435\u043d\u0438 \u043c\u043e\u0436\u043d\u043e \u0443\u043a\u0430\u0437\u0430\u0442\u044c organizationName &#8212; \u043e\u0440\u0433\u0430\u043d\u0438\u0437\u0430\u0446\u0438\u044e \u0434\u043b\u044f copyright.<\/p>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u043f\u0435\u0440\u0435\u0439\u0434\u0435\u043c \u043a target \u0438 \u0435\u0435 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0435, \u0447\u0442\u043e \u043c\u044b \u0442\u0443\u0442 \u0432\u0438\u0434\u0438\u043c:<\/p>\n<p><strong>destinations<\/strong> &#8212; \u044d\u0442\u043e \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u043c\u044b\u0435 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430, \u044d\u0442\u043e \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e \u0438 \u043c\u043e\u0436\u043d\u043e \u0432\u044b\u0431\u0440\u0430\u0442\u044c \u0432\u0441\u0435, \u0447\u0442\u043e \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e, \u0443 \u043c\u0435\u043d\u044f \u044d\u0442\u043e <code>destinations: [.iPhone],<\/code> <\/p>\n<p><strong>product<\/strong> &#8212; \u0432\u043e \u0447\u0442\u043e \u043f\u0440\u0435\u0432\u0440\u0430\u0442\u0438\u0442\u0441\u044f \u044d\u0442\u0430 target, \u0443 \u043c\u0435\u043d\u044f \u044d\u0442\u043e <code>product: .app,<\/code><\/p>\n<p><strong>bundleId<\/strong> &#8212; id \u043d\u0430\u0448\u0435\u0433\u043e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f, \u043c\u043e\u0436\u043d\u043e \u0441\u0440\u0430\u0437\u0443 \u0443\u043a\u0430\u0437\u0430\u0442\u044c id \u0438\u0441\u0445\u043e\u0434\u043d\u043e\u0433\u043e, \u0447\u0442\u043e\u0431\u044b \u0431\u044b\u043b\u043e \u043c\u0435\u043d\u044c\u0448\u0435 \u043f\u0440\u043e\u0431\u043b\u0435\u043c \u0441 firebase \u0438 \u0434\u0440\u0443\u0433\u0438\u043c\u0438 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u044f\u043c\u0438<\/p>\n<p><strong>deploymentTargets<\/strong> &#8212; \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u0430\u044f \u0432\u0435\u0440\u0441\u0438\u044f iOS, \u043f\u043e\u0447\u0435\u043c\u0443-\u0442\u043e \u0432 \u0442\u0435\u043c\u043f\u043b\u0435\u0439\u0442\u0435 \u044d\u0442\u043e\u0442 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u043e\u0432\u0430\u043b, \u0437\u0430\u0434\u0430\u0434\u0438\u043c <code>deploymentTargets: .iOS(\"15.0\"),<\/code><\/p>\n<p><strong>infoPlist<\/strong> &#8212; \u0433\u043b\u0430\u0432\u043d\u044b\u0439 plist \u043d\u0430\u0448\u0435\u0433\u043e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f, \u0440\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0443\u044e \u0441\u0440\u0430\u0437\u0443 \u043f\u0435\u0440\u0435\u043d\u0435\u0441\u0442\u0438 \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u0439 <code>infoPlist: .file(path: \"demo\/Info.plist\"),<\/code><\/p>\n<p><strong>sources<\/strong> &#8212; \u0442\u043e, \u0433\u0434\u0435 \u0431\u0443\u0434\u0435\u0442 \u043d\u0430\u0448 \u043a\u043e\u0434, \u0440\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0443\u044e \u043e\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u043f\u043e\u043a\u0430 \u0431\u0435\u0437 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0439, \u0432 \u0431\u0443\u0434\u0443\u0449\u0435\u043c \u043f\u0435\u0440\u0435\u043d\u0435\u0441\u0442\u0438 \u0432\u0441\u0435 \u0442\u0443\u0434\u0430 <code>sources: [\"demo\/Sources\/**\"],<\/code><\/p>\n<p><strong>resources<\/strong> &#8212; \u043c\u0435\u0441\u0442\u043e \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u043d\u0430\u0448\u0438\u0445 \u0440\u0435\u0441\u0443\u0440\u0441\u043e\u0432, \u0440\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0443\u044e \u0432\u044b\u043d\u0435\u0441\u0442\u0438 \u0432\u044b\u0448\u0435 \u0432 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u0443\u044e \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e \u0442.\u043a. \u0442\u0430\u043c \u0431\u0443\u0434\u0443\u0442 \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u0443\u0442\u044c \u0434\u043e \u043d\u0430\u0448\u0438\u0445 \u043a\u0430\u0440\u0442\u0438\u043d\u043e\u043a(Assets.xcassets), xib, storyboard(\u0435\u0441\u043b\u0438 \u043e\u043d\u0438 \u0443 \u0432\u0430\u0441 \u0435\u0441\u0442\u044c) \u0438 GoogleService-Info.plist , \u043d\u043e \u0438 <a href=\"https:\/\/developer.apple.com\/documentation\/bundleresources\/privacy_manifest_files\" rel=\"noopener noreferrer nofollow\">PrivacyManifest<\/a>. \u041f\u043e\u0441\u043b\u0435 \u0437\u0430\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f <a href=\"https:\/\/github.com\/tuist\/tuist\/tree\/main\/fixtures\/ios_app_with_privacy_manifest\" rel=\"noopener noreferrer nofollow\">PrivacyManifest<\/a> \u044f \u0440\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0443\u044e \u0441\u0432\u0435\u0440\u0438\u0442\u0441\u044f \u0441 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b\u043e\u043c<\/p>\n<pre><code class=\"swift\">let resources: ProjectDescription.ResourceFileElements =     .resources(         [             \"demo\/Resources\/**\",             \"demo\/**\/*.storyboard\",             \"demo\/**\/*.xib\"         ],         privacyManifest: privacyManifest     )<\/code><\/pre>\n<details class=\"spoiler\">\n<summary>\u0421\u043a\u0440\u044b\u0442\u044b\u0439 \u0442\u0435\u043a\u0441\u0442<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"swift\">let privacyManifest: ProjectDescription.PrivacyManifest = .privacyManifest(     tracking: true,     trackingDomains: [         \"firebase-settings.crashlytics.com\",         \"report.appmetrica.yandex.net\",         \"usccgg-launches.appsflyersdk.com\",         \"firebaselogging-pa.googleapis.com\"     ],     collectedDataTypes: [         [             \"NSPrivacyCollectedDataType\": \"NSPrivacyCollectedDataTypeName\",             \"NSPrivacyCollectedDataTypeLinked\": true,             \"NSPrivacyCollectedDataTypeTracking\": false,             \"NSPrivacyCollectedDataTypePurposes\": [                 \"NSPrivacyCollectedDataTypePurposeProductPersonalization\",             ],         ],         [             \"NSPrivacyCollectedDataType\": \"NSPrivacyCollectedDataTypeEmailAddress\",             \"NSPrivacyCollectedDataTypeLinked\": true,             \"NSPrivacyCollectedDataTypeTracking\": false,             \"NSPrivacyCollectedDataTypePurposes\": [                 \"NSPrivacyCollectedDataTypePurposeDeveloperAdvertising\",                 \"NSPrivacyCollectedDataTypePurposeProductPersonalization\",                 \"NSPrivacyCollectedDataTypePurposeAppFunctionality\"             ]         ],         [             \"NSPrivacyCollectedDataType\": \"NSPrivacyCollectedDataTypePhoneNumber\",             \"NSPrivacyCollectedDataTypeLinked\": true,             \"NSPrivacyCollectedDataTypeTracking\": false,             \"NSPrivacyCollectedDataTypePurposes\": [                 \"NSPrivacyCollectedDataTypePurposeAppFunctionality\"             ]         ],         [             \"NSPrivacyCollectedDataType\": \"NSPrivacyCollectedDataTypePaymentInfo\",             \"NSPrivacyCollectedDataTypeLinked\": true,             \"NSPrivacyCollectedDataTypeTracking\": false,             \"NSPrivacyCollectedDataTypePurposes\": [                 \"NSPrivacyCollectedDataTypePurposeAppFunctionality\"             ]         ],         [             \"NSPrivacyCollectedDataType\": \"NSPrivacyCollectedDataTypeCrashData\",             \"NSPrivacyCollectedDataTypeLinked\": false,             \"NSPrivacyCollectedDataTypeTracking\": false,             \"NSPrivacyCollectedDataTypePurposes\": [                 \"NSPrivacyCollectedDataTypePurposeAnalytics\"             ]         ],         [             \"NSPrivacyCollectedDataType\": \"NSPrivacyCollectedDataTypePreciseLocation\",             \"NSPrivacyCollectedDataTypeLinked\": false,             \"NSPrivacyCollectedDataTypeTracking\": false,             \"NSPrivacyCollectedDataTypePurposes\": [                 \"NSPrivacyCollectedDataTypePurposeAppFunctionality\"             ]         ],         [             \"NSPrivacyCollectedDataType\": \"NSPrivacyCollectedDataTypeDeviceID\",             \"NSPrivacyCollectedDataTypeLinked\": false,             \"NSPrivacyCollectedDataTypeTracking\": true,             \"NSPrivacyCollectedDataTypePurposes\": [                 \"NSPrivacyCollectedDataTypePurposeDeveloperAdvertising\",                 \"NSPrivacyCollectedDataTypePurposeAnalytics\",                 \"NSPrivacyCollectedDataTypePurposeAppFunctionality\",             ]         ],         [             \"NSPrivacyCollectedDataType\": \"NSPrivacyCollectedDataTypeProductInteraction\",             \"NSPrivacyCollectedDataTypeLinked\": false,             \"NSPrivacyCollectedDataTypeTracking\": true,             \"NSPrivacyCollectedDataTypePurposes\": [                 \"NSPrivacyCollectedDataTypePurposeAppFunctionality\",                 \"NSPrivacyCollectedDataTypePurposeAnalytics\",             ]         ]     ],     accessedApiTypes: [         [             \"NSPrivacyAccessedAPIType\": \"NSPrivacyAccessedAPICategorySystemBootTime\",             \"NSPrivacyAccessedAPITypeReasons\": [                 \"35F9.1\",             ],         ],         [             \"NSPrivacyAccessedAPIType\": \"NSPrivacyAccessedAPICategoryUserDefaults\",             \"NSPrivacyAccessedAPITypeReasons\": [                 \"CA92.1\",             ],         ],         [             \"NSPrivacyAccessedAPIType\": \"NSPrivacyAccessedAPICategoryDiskSpace\",    <\/code><\/pre>\n<\/div>\n<\/details>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-429660","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/429660","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=429660"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/429660\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=429660"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=429660"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=429660"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}