Showing preview only (3,456K chars total). Download the full file or copy to clipboard to get everything.
Repository: AfrazCodes/Spotify-iOS
Branch: master
Commit: 03895df1d28c
Files: 661
Total size: 34.4 MB
Directory structure:
gitextract_bk3gpcyp/
├── Podfile
├── Pods/
│ ├── Appirater/
│ │ ├── Appirater.h
│ │ ├── Appirater.m
│ │ ├── AppiraterDelegate.h
│ │ ├── README.md
│ │ ├── ar.lproj/
│ │ │ └── AppiraterLocalizable.strings
│ │ ├── ca.lproj/
│ │ │ └── AppiraterLocalizable.strings
│ │ ├── cs.lproj/
│ │ │ └── AppiraterLocalizable.strings
│ │ ├── da.lproj/
│ │ │ └── AppiraterLocalizable.strings
│ │ ├── de.lproj/
│ │ │ └── AppiraterLocalizable.strings
│ │ ├── el.lproj/
│ │ │ └── AppiraterLocalizable.strings
│ │ ├── en.lproj/
│ │ │ └── AppiraterLocalizable.strings
│ │ ├── es.lproj/
│ │ │ └── AppiraterLocalizable.strings
│ │ ├── fa.lproj/
│ │ │ └── AppiraterLocalizable.strings
│ │ ├── fi.lproj/
│ │ │ └── AppiraterLocalizable.strings
│ │ ├── fr.lproj/
│ │ │ └── AppiraterLocalizable.strings
│ │ ├── he.lproj/
│ │ │ └── AppiraterLocalizable.strings
│ │ ├── hu.lproj/
│ │ │ └── AppiraterLocalizable.strings
│ │ ├── hy.lproj/
│ │ │ └── AppiraterLocalizable.strings
│ │ ├── id.lproj/
│ │ │ └── AppiraterLocalizable.strings
│ │ ├── it.lproj/
│ │ │ └── AppiraterLocalizable.strings
│ │ ├── ja.lproj/
│ │ │ └── AppiraterLocalizable.strings
│ │ ├── ko.lproj/
│ │ │ └── AppiraterLocalizable.strings
│ │ ├── ms.lproj/
│ │ │ └── AppiraterLocalizable.strings
│ │ ├── nb.lproj/
│ │ │ └── AppiraterLocalizable.strings
│ │ ├── nl.lproj/
│ │ │ └── AppiraterLocalizable.strings
│ │ ├── pl.lproj/
│ │ │ └── AppiraterLocalizable.strings
│ │ ├── pt-BR.lproj/
│ │ │ └── AppiraterLocalizable.strings
│ │ ├── pt.lproj/
│ │ │ └── AppiraterLocalizable.strings
│ │ ├── ro.lproj/
│ │ │ └── AppiraterLocalizable.strings
│ │ ├── ru.lproj/
│ │ │ └── AppiraterLocalizable.strings
│ │ ├── sk.lproj/
│ │ │ └── AppiraterLocalizable.strings
│ │ ├── sv.lproj/
│ │ │ └── AppiraterLocalizable.strings
│ │ ├── th.lproj/
│ │ │ └── AppiraterLocalizable.strings
│ │ ├── tr.lproj/
│ │ │ └── AppiraterLocalizable.strings
│ │ ├── uk.lproj/
│ │ │ └── AppiraterLocalizable.strings
│ │ ├── vi.lproj/
│ │ │ └── AppiraterLocalizable.strings
│ │ ├── zh-Hans.lproj/
│ │ │ └── AppiraterLocalizable.strings
│ │ └── zh-Hant.lproj/
│ │ └── AppiraterLocalizable.strings
│ ├── Firebase/
│ │ ├── CoreOnly/
│ │ │ └── Sources/
│ │ │ ├── Firebase.h
│ │ │ └── module.modulemap
│ │ ├── LICENSE
│ │ └── README.md
│ ├── FirebaseAnalytics/
│ │ └── Frameworks/
│ │ └── FirebaseAnalytics.xcframework/
│ │ ├── Info.plist
│ │ ├── ios-arm64_armv7/
│ │ │ └── FirebaseAnalytics.framework/
│ │ │ ├── FirebaseAnalytics
│ │ │ ├── Headers/
│ │ │ │ ├── FIRAnalytics+AppDelegate.h
│ │ │ │ ├── FIRAnalytics+Consent.h
│ │ │ │ ├── FIRAnalytics.h
│ │ │ │ ├── FIREventNames.h
│ │ │ │ ├── FIRParameterNames.h
│ │ │ │ ├── FIRUserPropertyNames.h
│ │ │ │ └── FirebaseAnalytics.h
│ │ │ ├── Info.plist
│ │ │ └── Modules/
│ │ │ └── module.modulemap
│ │ └── ios-arm64_i386_x86_64-simulator/
│ │ └── FirebaseAnalytics.framework/
│ │ ├── FirebaseAnalytics
│ │ ├── Headers/
│ │ │ ├── FIRAnalytics+AppDelegate.h
│ │ │ ├── FIRAnalytics+Consent.h
│ │ │ ├── FIRAnalytics.h
│ │ │ ├── FIREventNames.h
│ │ │ ├── FIRParameterNames.h
│ │ │ ├── FIRUserPropertyNames.h
│ │ │ └── FirebaseAnalytics.h
│ │ ├── Info.plist
│ │ └── Modules/
│ │ └── module.modulemap
│ ├── FirebaseCore/
│ │ ├── FirebaseCore/
│ │ │ └── Sources/
│ │ │ ├── FIRAnalyticsConfiguration.h
│ │ │ ├── FIRAnalyticsConfiguration.m
│ │ │ ├── FIRApp.m
│ │ │ ├── FIRAppAssociationRegistration.h
│ │ │ ├── FIRAppAssociationRegistration.m
│ │ │ ├── FIRBundleUtil.h
│ │ │ ├── FIRBundleUtil.m
│ │ │ ├── FIRComponent.m
│ │ │ ├── FIRComponentContainer.m
│ │ │ ├── FIRComponentContainerInternal.h
│ │ │ ├── FIRComponentType.m
│ │ │ ├── FIRConfiguration.m
│ │ │ ├── FIRConfigurationInternal.h
│ │ │ ├── FIRCoreDiagnosticsConnector.m
│ │ │ ├── FIRDependency.m
│ │ │ ├── FIRDiagnosticsData.h
│ │ │ ├── FIRDiagnosticsData.m
│ │ │ ├── FIRFirebaseUserAgent.h
│ │ │ ├── FIRFirebaseUserAgent.m
│ │ │ ├── FIRHeartbeatInfo.m
│ │ │ ├── FIRLogger.m
│ │ │ ├── FIROptions.m
│ │ │ ├── FIRVersion.m
│ │ │ ├── Private/
│ │ │ │ ├── FIRAppInternal.h
│ │ │ │ ├── FIRComponent.h
│ │ │ │ ├── FIRComponentContainer.h
│ │ │ │ ├── FIRComponentType.h
│ │ │ │ ├── FIRCoreDiagnosticsConnector.h
│ │ │ │ ├── FIRDependency.h
│ │ │ │ ├── FIRHeartbeatInfo.h
│ │ │ │ ├── FIRLibrary.h
│ │ │ │ ├── FIRLogger.h
│ │ │ │ ├── FIROptionsInternal.h
│ │ │ │ └── FirebaseCoreInternal.h
│ │ │ └── Public/
│ │ │ └── FirebaseCore/
│ │ │ ├── FIRApp.h
│ │ │ ├── FIRConfiguration.h
│ │ │ ├── FIRLoggerLevel.h
│ │ │ ├── FIROptions.h
│ │ │ ├── FIRVersion.h
│ │ │ └── FirebaseCore.h
│ │ ├── Interop/
│ │ │ └── CoreDiagnostics/
│ │ │ └── Public/
│ │ │ ├── FIRCoreDiagnosticsData.h
│ │ │ └── FIRCoreDiagnosticsInterop.h
│ │ ├── LICENSE
│ │ └── README.md
│ ├── FirebaseCoreDiagnostics/
│ │ ├── Firebase/
│ │ │ └── CoreDiagnostics/
│ │ │ └── FIRCDLibrary/
│ │ │ ├── FIRCoreDiagnostics.m
│ │ │ ├── Protogen/
│ │ │ │ └── nanopb/
│ │ │ │ ├── firebasecore.nanopb.c
│ │ │ │ └── firebasecore.nanopb.h
│ │ │ └── Public/
│ │ │ └── FIRCoreDiagnostics.h
│ │ ├── Interop/
│ │ │ └── CoreDiagnostics/
│ │ │ └── Public/
│ │ │ ├── FIRCoreDiagnosticsData.h
│ │ │ └── FIRCoreDiagnosticsInterop.h
│ │ ├── LICENSE
│ │ └── README.md
│ ├── FirebaseInstallations/
│ │ ├── FirebaseCore/
│ │ │ └── Sources/
│ │ │ └── Private/
│ │ │ ├── FIRAppInternal.h
│ │ │ ├── FIRComponent.h
│ │ │ ├── FIRComponentContainer.h
│ │ │ ├── FIRComponentType.h
│ │ │ ├── FIRCoreDiagnosticsConnector.h
│ │ │ ├── FIRDependency.h
│ │ │ ├── FIRHeartbeatInfo.h
│ │ │ ├── FIRLibrary.h
│ │ │ ├── FIRLogger.h
│ │ │ ├── FIROptionsInternal.h
│ │ │ └── FirebaseCoreInternal.h
│ │ ├── FirebaseInstallations/
│ │ │ └── Source/
│ │ │ └── Library/
│ │ │ ├── Errors/
│ │ │ │ ├── FIRInstallationsErrorUtil.h
│ │ │ │ ├── FIRInstallationsErrorUtil.m
│ │ │ │ ├── FIRInstallationsHTTPError.h
│ │ │ │ └── FIRInstallationsHTTPError.m
│ │ │ ├── FIRInstallations.m
│ │ │ ├── FIRInstallationsAuthTokenResult.m
│ │ │ ├── FIRInstallationsAuthTokenResultInternal.h
│ │ │ ├── FIRInstallationsItem.h
│ │ │ ├── FIRInstallationsItem.m
│ │ │ ├── FIRInstallationsLogger.h
│ │ │ ├── FIRInstallationsLogger.m
│ │ │ ├── IIDMigration/
│ │ │ │ ├── FIRInstallationsIIDStore.h
│ │ │ │ ├── FIRInstallationsIIDStore.m
│ │ │ │ ├── FIRInstallationsIIDTokenStore.h
│ │ │ │ └── FIRInstallationsIIDTokenStore.m
│ │ │ ├── InstallationsAPI/
│ │ │ │ ├── FIRInstallationsAPIService.h
│ │ │ │ ├── FIRInstallationsAPIService.m
│ │ │ │ ├── FIRInstallationsItem+RegisterInstallationAPI.h
│ │ │ │ └── FIRInstallationsItem+RegisterInstallationAPI.m
│ │ │ ├── InstallationsIDController/
│ │ │ │ ├── FIRCurrentDateProvider.h
│ │ │ │ ├── FIRCurrentDateProvider.m
│ │ │ │ ├── FIRInstallationsBackoffController.h
│ │ │ │ ├── FIRInstallationsBackoffController.m
│ │ │ │ ├── FIRInstallationsIDController.h
│ │ │ │ ├── FIRInstallationsIDController.m
│ │ │ │ ├── FIRInstallationsSingleOperationPromiseCache.h
│ │ │ │ ├── FIRInstallationsSingleOperationPromiseCache.m
│ │ │ │ └── FIRInstallationsStatus.h
│ │ │ ├── InstallationsStore/
│ │ │ │ ├── FIRInstallationsStore.h
│ │ │ │ ├── FIRInstallationsStore.m
│ │ │ │ ├── FIRInstallationsStoredAuthToken.h
│ │ │ │ ├── FIRInstallationsStoredAuthToken.m
│ │ │ │ ├── FIRInstallationsStoredItem.h
│ │ │ │ └── FIRInstallationsStoredItem.m
│ │ │ ├── Private/
│ │ │ │ └── FirebaseInstallationsInternal.h
│ │ │ └── Public/
│ │ │ └── FirebaseInstallations/
│ │ │ ├── FIRInstallations.h
│ │ │ ├── FIRInstallationsAuthTokenResult.h
│ │ │ ├── FIRInstallationsErrors.h
│ │ │ └── FirebaseInstallations.h
│ │ ├── LICENSE
│ │ └── README.md
│ ├── GoogleAppMeasurement/
│ │ └── Frameworks/
│ │ └── GoogleAppMeasurement.xcframework/
│ │ ├── Info.plist
│ │ ├── ios-arm64_armv7/
│ │ │ └── GoogleAppMeasurement.framework/
│ │ │ ├── GoogleAppMeasurement
│ │ │ ├── Info.plist
│ │ │ └── Modules/
│ │ │ └── module.modulemap
│ │ └── ios-arm64_i386_x86_64-simulator/
│ │ └── GoogleAppMeasurement.framework/
│ │ ├── GoogleAppMeasurement
│ │ ├── Info.plist
│ │ └── Modules/
│ │ └── module.modulemap
│ ├── GoogleDataTransport/
│ │ ├── GoogleDataTransport/
│ │ │ ├── GDTCCTLibrary/
│ │ │ │ ├── GDTCCTCompressionHelper.m
│ │ │ │ ├── GDTCCTNanopbHelpers.m
│ │ │ │ ├── GDTCCTUploadOperation.m
│ │ │ │ ├── GDTCCTUploader.m
│ │ │ │ ├── GDTCOREvent+GDTCCTSupport.m
│ │ │ │ ├── Private/
│ │ │ │ │ ├── GDTCCTCompressionHelper.h
│ │ │ │ │ ├── GDTCCTNanopbHelpers.h
│ │ │ │ │ ├── GDTCCTUploadOperation.h
│ │ │ │ │ └── GDTCCTUploader.h
│ │ │ │ ├── Protogen/
│ │ │ │ │ └── nanopb/
│ │ │ │ │ ├── cct.nanopb.c
│ │ │ │ │ └── cct.nanopb.h
│ │ │ │ └── Public/
│ │ │ │ └── GDTCOREvent+GDTCCTSupport.h
│ │ │ └── GDTCORLibrary/
│ │ │ ├── GDTCORAssert.m
│ │ │ ├── GDTCORClock.m
│ │ │ ├── GDTCORConsoleLogger.m
│ │ │ ├── GDTCORDirectorySizeTracker.m
│ │ │ ├── GDTCOREndpoints.m
│ │ │ ├── GDTCOREvent.m
│ │ │ ├── GDTCORFlatFileStorage+Promises.m
│ │ │ ├── GDTCORFlatFileStorage.m
│ │ │ ├── GDTCORLifecycle.m
│ │ │ ├── GDTCORPlatform.m
│ │ │ ├── GDTCORReachability.m
│ │ │ ├── GDTCORRegistrar.m
│ │ │ ├── GDTCORStorageEventSelector.m
│ │ │ ├── GDTCORTransformer.m
│ │ │ ├── GDTCORTransport.m
│ │ │ ├── GDTCORUploadBatch.m
│ │ │ ├── GDTCORUploadCoordinator.m
│ │ │ ├── Internal/
│ │ │ │ ├── GDTCORAssert.h
│ │ │ │ ├── GDTCORDirectorySizeTracker.h
│ │ │ │ ├── GDTCORLifecycle.h
│ │ │ │ ├── GDTCORPlatform.h
│ │ │ │ ├── GDTCORReachability.h
│ │ │ │ ├── GDTCORRegistrar.h
│ │ │ │ ├── GDTCORStorageEventSelector.h
│ │ │ │ ├── GDTCORStorageProtocol.h
│ │ │ │ └── GDTCORUploader.h
│ │ │ ├── Private/
│ │ │ │ ├── GDTCOREndpoints_Private.h
│ │ │ │ ├── GDTCOREvent_Private.h
│ │ │ │ ├── GDTCORFlatFileStorage+Promises.h
│ │ │ │ ├── GDTCORFlatFileStorage.h
│ │ │ │ ├── GDTCORReachability_Private.h
│ │ │ │ ├── GDTCORRegistrar_Private.h
│ │ │ │ ├── GDTCORTransformer.h
│ │ │ │ ├── GDTCORTransformer_Private.h
│ │ │ │ ├── GDTCORTransport_Private.h
│ │ │ │ ├── GDTCORUploadBatch.h
│ │ │ │ └── GDTCORUploadCoordinator.h
│ │ │ └── Public/
│ │ │ └── GoogleDataTransport/
│ │ │ ├── GDTCORClock.h
│ │ │ ├── GDTCORConsoleLogger.h
│ │ │ ├── GDTCOREndpoints.h
│ │ │ ├── GDTCOREvent.h
│ │ │ ├── GDTCOREventDataObject.h
│ │ │ ├── GDTCOREventTransformer.h
│ │ │ ├── GDTCORTargets.h
│ │ │ ├── GDTCORTransport.h
│ │ │ └── GoogleDataTransport.h
│ │ ├── LICENSE
│ │ └── README.md
│ ├── GoogleUtilities/
│ │ ├── GoogleUtilities/
│ │ │ ├── AppDelegateSwizzler/
│ │ │ │ ├── GULAppDelegateSwizzler.m
│ │ │ │ ├── GULSceneDelegateSwizzler.m
│ │ │ │ ├── Internal/
│ │ │ │ │ ├── GULAppDelegateSwizzler_Private.h
│ │ │ │ │ └── GULSceneDelegateSwizzler_Private.h
│ │ │ │ └── Public/
│ │ │ │ └── GoogleUtilities/
│ │ │ │ ├── GULAppDelegateSwizzler.h
│ │ │ │ ├── GULApplication.h
│ │ │ │ └── GULSceneDelegateSwizzler.h
│ │ │ ├── Common/
│ │ │ │ └── GULLoggerCodes.h
│ │ │ ├── Environment/
│ │ │ │ ├── GULHeartbeatDateStorage.m
│ │ │ │ ├── GULHeartbeatDateStorageUserDefaults.m
│ │ │ │ ├── GULSecureCoding.m
│ │ │ │ ├── Public/
│ │ │ │ │ └── GoogleUtilities/
│ │ │ │ │ ├── GULAppEnvironmentUtil.h
│ │ │ │ │ ├── GULHeartbeatDateStorable.h
│ │ │ │ │ ├── GULHeartbeatDateStorage.h
│ │ │ │ │ ├── GULHeartbeatDateStorageUserDefaults.h
│ │ │ │ │ ├── GULKeychainStorage.h
│ │ │ │ │ ├── GULKeychainUtils.h
│ │ │ │ │ ├── GULSecureCoding.h
│ │ │ │ │ ├── GULURLSessionDataResponse.h
│ │ │ │ │ └── NSURLSession+GULPromises.h
│ │ │ │ ├── SecureStorage/
│ │ │ │ │ ├── GULKeychainStorage.m
│ │ │ │ │ └── GULKeychainUtils.m
│ │ │ │ ├── URLSessionPromiseWrapper/
│ │ │ │ │ ├── GULURLSessionDataResponse.m
│ │ │ │ │ └── NSURLSession+GULPromises.m
│ │ │ │ └── third_party/
│ │ │ │ └── GULAppEnvironmentUtil.m
│ │ │ ├── Logger/
│ │ │ │ ├── GULLogger.m
│ │ │ │ └── Public/
│ │ │ │ └── GoogleUtilities/
│ │ │ │ ├── GULLogger.h
│ │ │ │ └── GULLoggerLevel.h
│ │ │ ├── MethodSwizzler/
│ │ │ │ ├── GULSwizzler.m
│ │ │ │ └── Public/
│ │ │ │ └── GoogleUtilities/
│ │ │ │ ├── GULOriginalIMPConvenienceMacros.h
│ │ │ │ └── GULSwizzler.h
│ │ │ ├── NSData+zlib/
│ │ │ │ ├── GULNSData+zlib.m
│ │ │ │ └── Public/
│ │ │ │ └── GoogleUtilities/
│ │ │ │ └── GULNSData+zlib.h
│ │ │ ├── Network/
│ │ │ │ ├── GULMutableDictionary.m
│ │ │ │ ├── GULNetwork.m
│ │ │ │ ├── GULNetworkConstants.m
│ │ │ │ ├── GULNetworkInternal.h
│ │ │ │ ├── GULNetworkURLSession.m
│ │ │ │ └── Public/
│ │ │ │ └── GoogleUtilities/
│ │ │ │ ├── GULMutableDictionary.h
│ │ │ │ ├── GULNetwork.h
│ │ │ │ ├── GULNetworkConstants.h
│ │ │ │ ├── GULNetworkLoggerProtocol.h
│ │ │ │ ├── GULNetworkMessageCode.h
│ │ │ │ └── GULNetworkURLSession.h
│ │ │ ├── Reachability/
│ │ │ │ ├── GULReachabilityChecker+Internal.h
│ │ │ │ ├── GULReachabilityChecker.m
│ │ │ │ ├── GULReachabilityMessageCode.h
│ │ │ │ └── Public/
│ │ │ │ └── GoogleUtilities/
│ │ │ │ └── GULReachabilityChecker.h
│ │ │ └── UserDefaults/
│ │ │ ├── GULUserDefaults.m
│ │ │ └── Public/
│ │ │ └── GoogleUtilities/
│ │ │ └── GULUserDefaults.h
│ │ ├── LICENSE
│ │ └── README.md
│ ├── Pods.xcodeproj/
│ │ ├── project.pbxproj
│ │ └── xcuserdata/
│ │ └── afrazsiddiqui.xcuserdatad/
│ │ └── xcschemes/
│ │ ├── Appirater-Appirater.xcscheme
│ │ ├── Appirater.xcscheme
│ │ ├── Firebase.xcscheme
│ │ ├── FirebaseAnalytics.xcscheme
│ │ ├── FirebaseCore.xcscheme
│ │ ├── FirebaseCoreDiagnostics.xcscheme
│ │ ├── FirebaseInstallations.xcscheme
│ │ ├── GoogleAppMeasurement.xcscheme
│ │ ├── GoogleDataTransport.xcscheme
│ │ ├── GoogleUtilities.xcscheme
│ │ ├── Pods-Spotify.xcscheme
│ │ ├── PromisesObjC.xcscheme
│ │ ├── SDWebImage.xcscheme
│ │ ├── nanopb.xcscheme
│ │ └── xcschememanagement.plist
│ ├── PromisesObjC/
│ │ ├── LICENSE
│ │ ├── README.md
│ │ └── Sources/
│ │ └── FBLPromises/
│ │ ├── FBLPromise+All.m
│ │ ├── FBLPromise+Always.m
│ │ ├── FBLPromise+Any.m
│ │ ├── FBLPromise+Async.m
│ │ ├── FBLPromise+Await.m
│ │ ├── FBLPromise+Catch.m
│ │ ├── FBLPromise+Delay.m
│ │ ├── FBLPromise+Do.m
│ │ ├── FBLPromise+Race.m
│ │ ├── FBLPromise+Recover.m
│ │ ├── FBLPromise+Reduce.m
│ │ ├── FBLPromise+Retry.m
│ │ ├── FBLPromise+Testing.m
│ │ ├── FBLPromise+Then.m
│ │ ├── FBLPromise+Timeout.m
│ │ ├── FBLPromise+Validate.m
│ │ ├── FBLPromise+Wrap.m
│ │ ├── FBLPromise.m
│ │ ├── FBLPromiseError.m
│ │ └── include/
│ │ ├── FBLPromise+All.h
│ │ ├── FBLPromise+Always.h
│ │ ├── FBLPromise+Any.h
│ │ ├── FBLPromise+Async.h
│ │ ├── FBLPromise+Await.h
│ │ ├── FBLPromise+Catch.h
│ │ ├── FBLPromise+Delay.h
│ │ ├── FBLPromise+Do.h
│ │ ├── FBLPromise+Race.h
│ │ ├── FBLPromise+Recover.h
│ │ ├── FBLPromise+Reduce.h
│ │ ├── FBLPromise+Retry.h
│ │ ├── FBLPromise+Testing.h
│ │ ├── FBLPromise+Then.h
│ │ ├── FBLPromise+Timeout.h
│ │ ├── FBLPromise+Validate.h
│ │ ├── FBLPromise+Wrap.h
│ │ ├── FBLPromise.h
│ │ ├── FBLPromiseError.h
│ │ ├── FBLPromisePrivate.h
│ │ └── FBLPromises.h
│ ├── SDWebImage/
│ │ ├── LICENSE
│ │ ├── README.md
│ │ ├── SDWebImage/
│ │ │ ├── Core/
│ │ │ │ ├── NSButton+WebCache.h
│ │ │ │ ├── NSButton+WebCache.m
│ │ │ │ ├── NSData+ImageContentType.h
│ │ │ │ ├── NSData+ImageContentType.m
│ │ │ │ ├── NSImage+Compatibility.h
│ │ │ │ ├── NSImage+Compatibility.m
│ │ │ │ ├── SDAnimatedImage.h
│ │ │ │ ├── SDAnimatedImage.m
│ │ │ │ ├── SDAnimatedImagePlayer.h
│ │ │ │ ├── SDAnimatedImagePlayer.m
│ │ │ │ ├── SDAnimatedImageRep.h
│ │ │ │ ├── SDAnimatedImageRep.m
│ │ │ │ ├── SDAnimatedImageView+WebCache.h
│ │ │ │ ├── SDAnimatedImageView+WebCache.m
│ │ │ │ ├── SDAnimatedImageView.h
│ │ │ │ ├── SDAnimatedImageView.m
│ │ │ │ ├── SDDiskCache.h
│ │ │ │ ├── SDDiskCache.m
│ │ │ │ ├── SDGraphicsImageRenderer.h
│ │ │ │ ├── SDGraphicsImageRenderer.m
│ │ │ │ ├── SDImageAPNGCoder.h
│ │ │ │ ├── SDImageAPNGCoder.m
│ │ │ │ ├── SDImageAWebPCoder.h
│ │ │ │ ├── SDImageAWebPCoder.m
│ │ │ │ ├── SDImageCache.h
│ │ │ │ ├── SDImageCache.m
│ │ │ │ ├── SDImageCacheConfig.h
│ │ │ │ ├── SDImageCacheConfig.m
│ │ │ │ ├── SDImageCacheDefine.h
│ │ │ │ ├── SDImageCacheDefine.m
│ │ │ │ ├── SDImageCachesManager.h
│ │ │ │ ├── SDImageCachesManager.m
│ │ │ │ ├── SDImageCoder.h
│ │ │ │ ├── SDImageCoder.m
│ │ │ │ ├── SDImageCoderHelper.h
│ │ │ │ ├── SDImageCoderHelper.m
│ │ │ │ ├── SDImageCodersManager.h
│ │ │ │ ├── SDImageCodersManager.m
│ │ │ │ ├── SDImageFrame.h
│ │ │ │ ├── SDImageFrame.m
│ │ │ │ ├── SDImageGIFCoder.h
│ │ │ │ ├── SDImageGIFCoder.m
│ │ │ │ ├── SDImageGraphics.h
│ │ │ │ ├── SDImageGraphics.m
│ │ │ │ ├── SDImageHEICCoder.h
│ │ │ │ ├── SDImageHEICCoder.m
│ │ │ │ ├── SDImageIOAnimatedCoder.h
│ │ │ │ ├── SDImageIOAnimatedCoder.m
│ │ │ │ ├── SDImageIOCoder.h
│ │ │ │ ├── SDImageIOCoder.m
│ │ │ │ ├── SDImageLoader.h
│ │ │ │ ├── SDImageLoader.m
│ │ │ │ ├── SDImageLoadersManager.h
│ │ │ │ ├── SDImageLoadersManager.m
│ │ │ │ ├── SDImageTransformer.h
│ │ │ │ ├── SDImageTransformer.m
│ │ │ │ ├── SDMemoryCache.h
│ │ │ │ ├── SDMemoryCache.m
│ │ │ │ ├── SDWebImageCacheKeyFilter.h
│ │ │ │ ├── SDWebImageCacheKeyFilter.m
│ │ │ │ ├── SDWebImageCacheSerializer.h
│ │ │ │ ├── SDWebImageCacheSerializer.m
│ │ │ │ ├── SDWebImageCompat.h
│ │ │ │ ├── SDWebImageCompat.m
│ │ │ │ ├── SDWebImageDefine.h
│ │ │ │ ├── SDWebImageDefine.m
│ │ │ │ ├── SDWebImageDownloader.h
│ │ │ │ ├── SDWebImageDownloader.m
│ │ │ │ ├── SDWebImageDownloaderConfig.h
│ │ │ │ ├── SDWebImageDownloaderConfig.m
│ │ │ │ ├── SDWebImageDownloaderDecryptor.h
│ │ │ │ ├── SDWebImageDownloaderDecryptor.m
│ │ │ │ ├── SDWebImageDownloaderOperation.h
│ │ │ │ ├── SDWebImageDownloaderOperation.m
│ │ │ │ ├── SDWebImageDownloaderRequestModifier.h
│ │ │ │ ├── SDWebImageDownloaderRequestModifier.m
│ │ │ │ ├── SDWebImageDownloaderResponseModifier.h
│ │ │ │ ├── SDWebImageDownloaderResponseModifier.m
│ │ │ │ ├── SDWebImageError.h
│ │ │ │ ├── SDWebImageError.m
│ │ │ │ ├── SDWebImageIndicator.h
│ │ │ │ ├── SDWebImageIndicator.m
│ │ │ │ ├── SDWebImageManager.h
│ │ │ │ ├── SDWebImageManager.m
│ │ │ │ ├── SDWebImageOperation.h
│ │ │ │ ├── SDWebImageOperation.m
│ │ │ │ ├── SDWebImageOptionsProcessor.h
│ │ │ │ ├── SDWebImageOptionsProcessor.m
│ │ │ │ ├── SDWebImagePrefetcher.h
│ │ │ │ ├── SDWebImagePrefetcher.m
│ │ │ │ ├── SDWebImageTransition.h
│ │ │ │ ├── SDWebImageTransition.m
│ │ │ │ ├── UIButton+WebCache.h
│ │ │ │ ├── UIButton+WebCache.m
│ │ │ │ ├── UIImage+ExtendedCacheData.h
│ │ │ │ ├── UIImage+ExtendedCacheData.m
│ │ │ │ ├── UIImage+ForceDecode.h
│ │ │ │ ├── UIImage+ForceDecode.m
│ │ │ │ ├── UIImage+GIF.h
│ │ │ │ ├── UIImage+GIF.m
│ │ │ │ ├── UIImage+MemoryCacheCost.h
│ │ │ │ ├── UIImage+MemoryCacheCost.m
│ │ │ │ ├── UIImage+Metadata.h
│ │ │ │ ├── UIImage+Metadata.m
│ │ │ │ ├── UIImage+MultiFormat.h
│ │ │ │ ├── UIImage+MultiFormat.m
│ │ │ │ ├── UIImage+Transform.h
│ │ │ │ ├── UIImage+Transform.m
│ │ │ │ ├── UIImageView+HighlightedWebCache.h
│ │ │ │ ├── UIImageView+HighlightedWebCache.m
│ │ │ │ ├── UIImageView+WebCache.h
│ │ │ │ ├── UIImageView+WebCache.m
│ │ │ │ ├── UIView+WebCache.h
│ │ │ │ ├── UIView+WebCache.m
│ │ │ │ ├── UIView+WebCacheOperation.h
│ │ │ │ └── UIView+WebCacheOperation.m
│ │ │ └── Private/
│ │ │ ├── NSBezierPath+SDRoundedCorners.h
│ │ │ ├── NSBezierPath+SDRoundedCorners.m
│ │ │ ├── SDAssociatedObject.h
│ │ │ ├── SDAssociatedObject.m
│ │ │ ├── SDAsyncBlockOperation.h
│ │ │ ├── SDAsyncBlockOperation.m
│ │ │ ├── SDDeviceHelper.h
│ │ │ ├── SDDeviceHelper.m
│ │ │ ├── SDDisplayLink.h
│ │ │ ├── SDDisplayLink.m
│ │ │ ├── SDFileAttributeHelper.h
│ │ │ ├── SDFileAttributeHelper.m
│ │ │ ├── SDImageAssetManager.h
│ │ │ ├── SDImageAssetManager.m
│ │ │ ├── SDImageCachesManagerOperation.h
│ │ │ ├── SDImageCachesManagerOperation.m
│ │ │ ├── SDImageIOAnimatedCoderInternal.h
│ │ │ ├── SDInternalMacros.h
│ │ │ ├── SDInternalMacros.m
│ │ │ ├── SDWeakProxy.h
│ │ │ ├── SDWeakProxy.m
│ │ │ ├── SDWebImageTransitionInternal.h
│ │ │ ├── SDmetamacros.h
│ │ │ ├── UIColor+SDHexString.h
│ │ │ └── UIColor+SDHexString.m
│ │ └── WebImage/
│ │ └── SDWebImage.h
│ ├── Target Support Files/
│ │ ├── Appirater/
│ │ │ ├── Appirater-Info.plist
│ │ │ ├── Appirater-dummy.m
│ │ │ ├── Appirater-prefix.pch
│ │ │ ├── Appirater-umbrella.h
│ │ │ ├── Appirater.debug.xcconfig
│ │ │ ├── Appirater.modulemap
│ │ │ ├── Appirater.release.xcconfig
│ │ │ └── ResourceBundle-Appirater-Appirater-Info.plist
│ │ ├── Firebase/
│ │ │ ├── Firebase.debug.xcconfig
│ │ │ └── Firebase.release.xcconfig
│ │ ├── FirebaseAnalytics/
│ │ │ ├── FirebaseAnalytics-xcframeworks-input-files.xcfilelist
│ │ │ ├── FirebaseAnalytics-xcframeworks-output-files.xcfilelist
│ │ │ ├── FirebaseAnalytics-xcframeworks.sh
│ │ │ ├── FirebaseAnalytics.debug.xcconfig
│ │ │ └── FirebaseAnalytics.release.xcconfig
│ │ ├── FirebaseCore/
│ │ │ ├── FirebaseCore-Info.plist
│ │ │ ├── FirebaseCore-dummy.m
│ │ │ ├── FirebaseCore-umbrella.h
│ │ │ ├── FirebaseCore.debug.xcconfig
│ │ │ ├── FirebaseCore.modulemap
│ │ │ └── FirebaseCore.release.xcconfig
│ │ ├── FirebaseCoreDiagnostics/
│ │ │ ├── FirebaseCoreDiagnostics-Info.plist
│ │ │ ├── FirebaseCoreDiagnostics-dummy.m
│ │ │ ├── FirebaseCoreDiagnostics-umbrella.h
│ │ │ ├── FirebaseCoreDiagnostics.debug.xcconfig
│ │ │ ├── FirebaseCoreDiagnostics.modulemap
│ │ │ └── FirebaseCoreDiagnostics.release.xcconfig
│ │ ├── FirebaseInstallations/
│ │ │ ├── FirebaseInstallations-Info.plist
│ │ │ ├── FirebaseInstallations-dummy.m
│ │ │ ├── FirebaseInstallations-umbrella.h
│ │ │ ├── FirebaseInstallations.debug.xcconfig
│ │ │ ├── FirebaseInstallations.modulemap
│ │ │ └── FirebaseInstallations.release.xcconfig
│ │ ├── GoogleAppMeasurement/
│ │ │ ├── GoogleAppMeasurement-xcframeworks-input-files.xcfilelist
│ │ │ ├── GoogleAppMeasurement-xcframeworks-output-files.xcfilelist
│ │ │ ├── GoogleAppMeasurement-xcframeworks.sh
│ │ │ ├── GoogleAppMeasurement.debug.xcconfig
│ │ │ └── GoogleAppMeasurement.release.xcconfig
│ │ ├── GoogleDataTransport/
│ │ │ ├── GoogleDataTransport-Info.plist
│ │ │ ├── GoogleDataTransport-dummy.m
│ │ │ ├── GoogleDataTransport-umbrella.h
│ │ │ ├── GoogleDataTransport.debug.xcconfig
│ │ │ ├── GoogleDataTransport.modulemap
│ │ │ └── GoogleDataTransport.release.xcconfig
│ │ ├── GoogleUtilities/
│ │ │ ├── GoogleUtilities-Info.plist
│ │ │ ├── GoogleUtilities-dummy.m
│ │ │ ├── GoogleUtilities-umbrella.h
│ │ │ ├── GoogleUtilities.debug.xcconfig
│ │ │ ├── GoogleUtilities.modulemap
│ │ │ └── GoogleUtilities.release.xcconfig
│ │ ├── Pods-Spotify/
│ │ │ ├── Pods-Spotify-Info.plist
│ │ │ ├── Pods-Spotify-acknowledgements.markdown
│ │ │ ├── Pods-Spotify-acknowledgements.plist
│ │ │ ├── Pods-Spotify-dummy.m
│ │ │ ├── Pods-Spotify-frameworks-Debug-input-files.xcfilelist
│ │ │ ├── Pods-Spotify-frameworks-Debug-output-files.xcfilelist
│ │ │ ├── Pods-Spotify-frameworks-Release-input-files.xcfilelist
│ │ │ ├── Pods-Spotify-frameworks-Release-output-files.xcfilelist
│ │ │ ├── Pods-Spotify-frameworks.sh
│ │ │ ├── Pods-Spotify-umbrella.h
│ │ │ ├── Pods-Spotify.debug.xcconfig
│ │ │ ├── Pods-Spotify.modulemap
│ │ │ └── Pods-Spotify.release.xcconfig
│ │ ├── PromisesObjC/
│ │ │ ├── PromisesObjC-Info.plist
│ │ │ ├── PromisesObjC-dummy.m
│ │ │ ├── PromisesObjC-umbrella.h
│ │ │ ├── PromisesObjC.debug.xcconfig
│ │ │ ├── PromisesObjC.modulemap
│ │ │ └── PromisesObjC.release.xcconfig
│ │ ├── SDWebImage/
│ │ │ ├── SDWebImage-Info.plist
│ │ │ ├── SDWebImage-dummy.m
│ │ │ ├── SDWebImage-prefix.pch
│ │ │ ├── SDWebImage-umbrella.h
│ │ │ ├── SDWebImage.debug.xcconfig
│ │ │ ├── SDWebImage.modulemap
│ │ │ └── SDWebImage.release.xcconfig
│ │ └── nanopb/
│ │ ├── nanopb-Info.plist
│ │ ├── nanopb-dummy.m
│ │ ├── nanopb-prefix.pch
│ │ ├── nanopb-umbrella.h
│ │ ├── nanopb.debug.xcconfig
│ │ ├── nanopb.modulemap
│ │ └── nanopb.release.xcconfig
│ └── nanopb/
│ ├── LICENSE.txt
│ ├── README.md
│ ├── pb.h
│ ├── pb_common.c
│ ├── pb_common.h
│ ├── pb_decode.c
│ ├── pb_decode.h
│ ├── pb_encode.c
│ └── pb_encode.h
├── README.md
├── Spotify/
│ ├── Controllers/
│ │ ├── Core/
│ │ │ ├── HomeViewController.swift
│ │ │ ├── LibraryViewController.swift
│ │ │ ├── SearchViewController.swift
│ │ │ └── TabBarViewController.swift
│ │ └── Other/
│ │ ├── AlbumViewController.swift
│ │ ├── AuthViewController.swift
│ │ ├── CategoryViewController.swift
│ │ ├── Library/
│ │ │ ├── LibraryAlbumsViewController.swift
│ │ │ └── LibraryPlaylistsViewController.swift
│ │ ├── PlayerViewController.swift
│ │ ├── PlaylistViewController.swift
│ │ ├── ProfileViewController.swift
│ │ ├── SearchResultsViewController.swift
│ │ ├── SettingsViewController.swift
│ │ └── WelcomeViewController.swift
│ ├── Info.plist
│ ├── Managers/
│ │ ├── APICaller.swift
│ │ ├── AuthManager.swift
│ │ └── HapticsManager.swift
│ ├── Models/
│ │ ├── APIImage.swift
│ │ ├── AlbumDetailsResponse.swift
│ │ ├── AllCategoriesResponse.swift
│ │ ├── Artist.swift
│ │ ├── AudioTrack.swift
│ │ ├── AuthResponse.swift
│ │ ├── FeaturedPlaylistsResponse.swift
│ │ ├── LibraryAlbumsResponse.swift
│ │ ├── LibraryPlaylistsResponse.swift
│ │ ├── NewReleasesResponse.swift
│ │ ├── Playlist.swift
│ │ ├── PlaylistDetailsResponse.swift
│ │ ├── RecommendationsResponse.swift
│ │ ├── RecommendedGenresResponse.swift
│ │ ├── SearchResult.swift
│ │ ├── SearchResultResponse.swift
│ │ ├── SettingsModels.swift
│ │ └── UserProfile.swift
│ ├── Presenter/
│ │ └── PlaybackPresenter.swift
│ ├── Resources/
│ │ ├── AppDelegate.swift
│ │ ├── Assets.xcassets/
│ │ │ ├── AccentColor.colorset/
│ │ │ │ └── Contents.json
│ │ │ ├── AppIcon.appiconset/
│ │ │ │ └── Contents.json
│ │ │ ├── Contents.json
│ │ │ ├── albums_background.imageset/
│ │ │ │ └── Contents.json
│ │ │ └── logo.imageset/
│ │ │ └── Contents.json
│ │ ├── Extensions.swift
│ │ └── SceneDelegate.swift
│ ├── ViewModels/
│ │ ├── AlbumCollectionViewCellViewModel.swift
│ │ ├── CategoryCollectionViewCellViewModel.swift
│ │ ├── FeaturedPlaylistCellViewModel.swift
│ │ ├── NewReleasesCellViewModel.swift
│ │ ├── PlaylistHeaderViewViewModel.swift
│ │ ├── RecommendedTrackCellViewModel.swift
│ │ ├── SearchResultDefaultTableViewCellViewModel.swift
│ │ └── SearchResultSubtitleTableViewCellViewModel.swift
│ └── Views/
│ ├── ActionLabelView.swift
│ ├── AlbumTrackCollectionViewCell.swift
│ ├── Base.lproj/
│ │ └── LaunchScreen.storyboard
│ ├── Browse/
│ │ ├── FeaturedPlaylistCollectionViewCell.swift
│ │ ├── NewReleaseCollectionViewCell.swift
│ │ └── RecommendedTrackCollectionViewCell.swift
│ ├── GenreCollectionViewCell.swift
│ ├── LibraryToggleView.swift
│ ├── PlayerControlsView.swift
│ ├── PlaylistHeaderCollectionReusableView.swift
│ ├── SearchResultCells/
│ │ ├── SearchResultDefaultTableViewCell.swift
│ │ └── SearchResultSubtitleTableViewCell.swift
│ └── TitleHeaderCollectionReusableView.swift
├── Spotify.xcodeproj/
│ ├── project.pbxproj
│ ├── project.xcworkspace/
│ │ ├── contents.xcworkspacedata
│ │ └── xcshareddata/
│ │ └── IDEWorkspaceChecks.plist
│ └── xcuserdata/
│ └── afrazsiddiqui.xcuserdatad/
│ ├── xcdebugger/
│ │ └── Breakpoints_v2.xcbkptlist
│ └── xcschemes/
│ └── xcschememanagement.plist
├── Spotify.xcworkspace/
│ ├── contents.xcworkspacedata
│ ├── xcshareddata/
│ │ └── IDEWorkspaceChecks.plist
│ └── xcuserdata/
│ └── afrazsiddiqui.xcuserdatad/
│ ├── UserInterfaceState.xcuserstate
│ └── xcdebugger/
│ └── Breakpoints_v2.xcbkptlist
├── SpotifyTests/
│ └── SpotifyTests.swift
├── codemagic.yaml
└── codemagic.yml
================================================
FILE CONTENTS
================================================
================================================
FILE: Podfile
================================================
# Uncomment the next line to define a global platform for your project
# platform :ios, '9.0'
target 'Spotify' do
use_frameworks!
pod 'SDWebImage'
pod 'Appirater'
pod 'Firebase/Analytics'
end
================================================
FILE: Pods/Appirater/Appirater.h
================================================
/*
This file is part of Appirater.
Copyright (c) 2012, Arash Payan
All rights reserved.
Permission is hereby granted, free of charge, to any person
obtaining a copy of this software and associated documentation
files (the "Software"), to deal in the Software without
restriction, including without limitation the rights to use,
copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the
Software is furnished to do so, subject to the following
conditions:
The above copyright notice and this permission notice shall be
included in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
OTHER DEALINGS IN THE SOFTWARE.
*/
/*
* Appirater.h
* appirater
*
* Created by Arash Payan on 9/5/09.
* http://arashpayan.com
* Copyright 2012 Arash Payan. All rights reserved.
*/
#import <Foundation/Foundation.h>
#import <StoreKit/StoreKit.h>
#import "AppiraterDelegate.h"
extern NSString *const kAppiraterFirstUseDate;
extern NSString *const kAppiraterUseCount;
extern NSString *const kAppiraterSignificantEventCount;
extern NSString *const kAppiraterCurrentVersion;
extern NSString *const kAppiraterRatedCurrentVersion;
extern NSString *const kAppiraterDeclinedToRate;
extern NSString *const kAppiraterReminderRequestDate;
/*!
Your localized app's name.
*/
#define APPIRATER_LOCALIZED_APP_NAME [[[NSBundle mainBundle] localizedInfoDictionary] objectForKey:@"CFBundleDisplayName"]
/*!
Your app's name.
*/
#define APPIRATER_APP_NAME APPIRATER_LOCALIZED_APP_NAME ?: [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleDisplayName"] ?: [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleName"]
/*!
This is the message your users will see once they've passed the day+launches
threshold.
*/
#define APPIRATER_LOCALIZED_MESSAGE NSLocalizedStringFromTableInBundle(@"If you enjoy using %@, would you mind taking a moment to rate it? It won't take more than a minute. Thanks for your support!", @"AppiraterLocalizable", [Appirater bundle], nil)
#define APPIRATER_MESSAGE [NSString stringWithFormat:APPIRATER_LOCALIZED_MESSAGE, APPIRATER_APP_NAME]
/*!
This is the title of the message alert that users will see.
*/
#define APPIRATER_LOCALIZED_MESSAGE_TITLE NSLocalizedStringFromTableInBundle(@"Rate %@", @"AppiraterLocalizable", [Appirater bundle], nil)
#define APPIRATER_MESSAGE_TITLE [NSString stringWithFormat:APPIRATER_LOCALIZED_MESSAGE_TITLE, APPIRATER_APP_NAME]
/*!
The text of the button that rejects reviewing the app.
*/
#define APPIRATER_CANCEL_BUTTON NSLocalizedStringFromTableInBundle(@"No, Thanks", @"AppiraterLocalizable", [Appirater bundle], nil)
/*!
Text of button that will send user to app review page.
*/
#define APPIRATER_LOCALIZED_RATE_BUTTON NSLocalizedStringFromTableInBundle(@"Rate %@", @"AppiraterLocalizable", [Appirater bundle], nil)
#define APPIRATER_RATE_BUTTON [NSString stringWithFormat:APPIRATER_LOCALIZED_RATE_BUTTON, APPIRATER_APP_NAME]
/*!
Text for button to remind the user to review later.
*/
#define APPIRATER_RATE_LATER NSLocalizedStringFromTableInBundle(@"Remind me later", @"AppiraterLocalizable", [Appirater bundle], nil)
@interface Appirater : NSObject <UIAlertViewDelegate, SKStoreProductViewControllerDelegate>
/*!
UIAlertController for iOS 8 and later, otherwise UIAlertView
*/
@property(nonatomic, strong) id ratingAlert;
@property(nonatomic) BOOL openInAppStore;
#if __has_feature(objc_arc_weak)
@property(nonatomic, weak) NSObject <AppiraterDelegate> *delegate;
#else
@property(nonatomic, unsafe_unretained) NSObject <AppiraterDelegate> *delegate;
#endif
/*!
Tells Appirater that the app has launched, and on devices that do NOT
support multitasking, the 'uses' count will be incremented. You should
call this method at the end of your application delegate's
application:didFinishLaunchingWithOptions: method.
If the app has been used enough to be rated (and enough significant events),
you can suppress the rating alert
by passing NO for canPromptForRating. The rating alert will simply be postponed
until it is called again with YES for canPromptForRating. The rating alert
can also be triggered by appEnteredForeground: and userDidSignificantEvent:
(as long as you pass YES for canPromptForRating in those methods).
*/
+ (void)appLaunched:(BOOL)canPromptForRating;
/*!
Tells Appirater that the app was brought to the foreground on multitasking
devices. You should call this method from the application delegate's
applicationWillEnterForeground: method.
If the app has been used enough to be rated (and enough significant events),
you can suppress the rating alert
by passing NO for canPromptForRating. The rating alert will simply be postponed
until it is called again with YES for canPromptForRating. The rating alert
can also be triggered by appLaunched: and userDidSignificantEvent:
(as long as you pass YES for canPromptForRating in those methods).
*/
+ (void)appEnteredForeground:(BOOL)canPromptForRating;
/*!
Tells Appirater that the user performed a significant event. A significant
event is whatever you want it to be. If you're app is used to make VoIP
calls, then you might want to call this method whenever the user places
a call. If it's a game, you might want to call this whenever the user
beats a level boss.
If the user has performed enough significant events and used the app enough,
you can suppress the rating alert by passing NO for canPromptForRating. The
rating alert will simply be postponed until it is called again with YES for
canPromptForRating. The rating alert can also be triggered by appLaunched:
and appEnteredForeground: (as long as you pass YES for canPromptForRating
in those methods).
*/
+ (void)userDidSignificantEvent:(BOOL)canPromptForRating;
/*!
Tells Appirater to try and show the prompt (a rating alert). The prompt will be showed
if there is connection available, the user hasn't declined to rate
or hasn't rated current version.
You could call to show the prompt regardless Appirater settings,
e.g., in case of some special event in your app.
*/
+ (void)tryToShowPrompt;
/*!
Tells Appirater to show the prompt (a rating alert).
Similar to tryToShowPrompt, but without checks (the prompt is always displayed).
Passing false will hide the rate later button on the prompt.
The only case where you should call this is if your app has an
explicit "Rate this app" command somewhere. This is similar to rateApp,
but instead of jumping to the review directly, an intermediary prompt is displayed.
*/
+ (void)forceShowPrompt:(BOOL)displayRateLaterButton;
/*!
Tells Appirater to open the App Store page where the user can specify a
rating for the app. Also records the fact that this has happened, so the
user won't be prompted again to rate the app.
The only case where you should call this directly is if your app has an
explicit "Rate this app" command somewhere. In all other cases, don't worry
about calling this -- instead, just call the other functions listed above,
and let Appirater handle the bookkeeping of deciding when to ask the user
whether to rate the app.
*/
+ (void)rateApp;
/*!
Tells Appirater to immediately close any open rating modals (e.g. StoreKit rating VCs).
*/
+ (void)closeModal;
/*!
Asks Appirater if the user has declined to rate;
*/
- (BOOL)userHasDeclinedToRate;
/*!
Asks Appirater if the user has rated the current version.
Note that this is not a guarantee that the user has actually rated the app in the
app store, but they've just clicked the rate button on the Appirater dialog.
*/
- (BOOL)userHasRatedCurrentVersion;
@end
@interface Appirater(Configuration)
/*!
Set your Apple generated software id here.
*/
+ (void) setAppId:(NSString*)appId;
/*!
Users will need to have the same version of your app installed for this many
days before they will be prompted to rate it.
*/
+ (void) setDaysUntilPrompt:(double)value;
/*!
An example of a 'use' would be if the user launched the app. Bringing the app
into the foreground (on devices that support it) would also be considered
a 'use'. You tell Appirater about these events using the two methods:
[Appirater appLaunched:]
[Appirater appEnteredForeground:]
Users need to 'use' the same version of the app this many times before
before they will be prompted to rate it.
*/
+ (void) setUsesUntilPrompt:(NSInteger)value;
/*!
A significant event can be anything you want to be in your app. In a
telephone app, a significant event might be placing or receiving a call.
In a game, it might be beating a level or a boss. This is just another
layer of filtering that can be used to make sure that only the most
loyal of your users are being prompted to rate you on the app store.
If you leave this at a value of -1, then this won't be a criterion
used for rating. To tell Appirater that the user has performed
a significant event, call the method:
[Appirater userDidSignificantEvent:];
*/
+ (void) setSignificantEventsUntilPrompt:(NSInteger)value;
/*!
Once the rating alert is presented to the user, they might select
'Remind me later'. This value specifies how long (in days) Appirater
will wait before reminding them.
*/
+ (void) setTimeBeforeReminding:(double)value;
/*!
Set customized title for alert view.
*/
+ (void) setCustomAlertTitle:(NSString *)title;
/*!
Set customized message for alert view.
*/
+ (void) setCustomAlertMessage:(NSString *)message;
/*!
Set customized cancel button title for alert view.
*/
+ (void) setCustomAlertCancelButtonTitle:(NSString *)cancelTitle;
/*!
Set customized rate button title for alert view.
*/
+ (void) setCustomAlertRateButtonTitle:(NSString *)rateTitle;
/*!
Set customized rate later button title for alert view.
*/
+ (void) setCustomAlertRateLaterButtonTitle:(NSString *)rateLaterTitle;
/*!
'YES' will show the Appirater alert everytime. Useful for testing how your message
looks and making sure the link to your app's review page works.
*/
+ (void) setDebug:(BOOL)debug;
/*!
Set the delegate if you want to know when Appirater does something
*/
+ (void)setDelegate:(id<AppiraterDelegate>)delegate;
/*!
Set whether or not Appirater uses animation (currently respected when pushing modal StoreKit rating VCs).
*/
+ (void)setUsesAnimation:(BOOL)animation;
/*!
If set to YES, Appirater will open App Store link (instead of SKStoreProductViewController on iOS 6). Default YES.
*/
+ (void)setOpenInAppStore:(BOOL)openInAppStore;
/*!
If set to YES, the main bundle will always be used to load localized strings.
Set this to YES if you have provided your own custom localizations in AppiraterLocalizable.strings
in your main bundle. Default is NO.
*/
+ (void)setAlwaysUseMainBundle:(BOOL)useMainBundle;
@end
/*!
Methods in this interface are public out of necessity, but may change without notice
*/
@interface Appirater(Unsafe)
/*!
The bundle localized strings will be loaded from.
*/
+(NSBundle *)bundle;
@end
@interface Appirater(Deprecated)
/*!
DEPRECATED: While still functional, it's better to use
appLaunched:(BOOL)canPromptForRating instead.
Calls [Appirater appLaunched:YES]. See appLaunched: for details of functionality.
*/
+ (void)appLaunched __attribute__((deprecated));
/*!
DEPRECATED: While still functional, it's better to use
tryToShowPrompt instead.
Calls [Appirater tryToShowPrompt]. See tryToShowPrompt for details of functionality.
*/
+ (void)showPrompt __attribute__((deprecated));
@end
================================================
FILE: Pods/Appirater/Appirater.m
================================================
/*
This file is part of Appirater.
Copyright (c) 2012, Arash Payan
All rights reserved.
Permission is hereby granted, free of charge, to any person
obtaining a copy of this software and associated documentation
files (the "Software"), to deal in the Software without
restriction, including without limitation the rights to use,
copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the
Software is furnished to do so, subject to the following
conditions:
The above copyright notice and this permission notice shall be
included in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
OTHER DEALINGS IN THE SOFTWARE.
*/
/*
* Appirater.m
* appirater
*
* Created by Arash Payan on 9/5/09.
* http://arashpayan.com
* Copyright 2012 Arash Payan. All rights reserved.
*/
#import <SystemConfiguration/SystemConfiguration.h>
#import <CFNetwork/CFNetwork.h>
#import "Appirater.h"
#include <netinet/in.h>
#if ! __has_feature(objc_arc)
#warning This file must be compiled with ARC. Use -fobjc-arc flag (or convert project to ARC).
#endif
NSString *const kAppiraterFirstUseDate = @"kAppiraterFirstUseDate";
NSString *const kAppiraterUseCount = @"kAppiraterUseCount";
NSString *const kAppiraterSignificantEventCount = @"kAppiraterSignificantEventCount";
NSString *const kAppiraterCurrentVersion = @"kAppiraterCurrentVersion";
NSString *const kAppiraterRatedCurrentVersion = @"kAppiraterRatedCurrentVersion";
NSString *const kAppiraterDeclinedToRate = @"kAppiraterDeclinedToRate";
NSString *const kAppiraterReminderRequestDate = @"kAppiraterReminderRequestDate";
NSString *templateReviewURL = @"itms-apps://ax.itunes.apple.com/WebObjects/MZStore.woa/wa/viewContentsUserReviews?type=Purple+Software&id=APP_ID";
NSString *templateReviewURLiOS7 = @"itms-apps://itunes.apple.com/app/idAPP_ID";
NSString *templateReviewURLiOS8 = @"itms-apps://itunes.apple.com/WebObjects/MZStore.woa/wa/viewContentsUserReviews?id=APP_ID&onlyLatestVersion=true&pageNumber=0&sortOrdering=1&type=Purple+Software";
static NSString *_appId;
static double _daysUntilPrompt = 30;
static NSInteger _usesUntilPrompt = 20;
static NSInteger _significantEventsUntilPrompt = -1;
static double _timeBeforeReminding = 1;
static BOOL _debug = NO;
static BOOL _usesAnimation = TRUE;
static UIStatusBarStyle _statusBarStyle;
static BOOL _modalOpen = false;
static BOOL _alwaysUseMainBundle = NO;
@interface Appirater ()
@property (nonatomic, copy) NSString *alertTitle;
@property (nonatomic, copy) NSString *alertMessage;
@property (nonatomic, copy) NSString *alertCancelTitle;
@property (nonatomic, copy) NSString *alertRateTitle;
@property (nonatomic, copy) NSString *alertRateLaterTitle;
@property (nonatomic, strong) NSOperationQueue *eventQueue;
- (BOOL)connectedToNetwork;
+ (Appirater*)sharedInstance;
- (void)showPromptWithChecks:(BOOL)withChecks
displayRateLaterButton:(BOOL)displayRateLaterButton;
- (void)showRatingAlert:(BOOL)displayRateLaterButton;
- (void)showRatingAlert;
- (BOOL)ratingAlertIsAppropriate;
- (BOOL)ratingConditionsHaveBeenMet;
- (void)incrementUseCount;
- (void)hideRatingAlert;
@end
@implementation Appirater
+ (void) setAppId:(NSString *)appId {
_appId = appId;
}
+ (void) setDaysUntilPrompt:(double)value {
_daysUntilPrompt = value;
}
+ (void) setUsesUntilPrompt:(NSInteger)value {
_usesUntilPrompt = value;
}
+ (void) setSignificantEventsUntilPrompt:(NSInteger)value {
_significantEventsUntilPrompt = value;
}
+ (void) setTimeBeforeReminding:(double)value {
_timeBeforeReminding = value;
}
+ (void) setCustomAlertTitle:(NSString *)title
{
[self sharedInstance].alertTitle = title;
}
+ (void) setCustomAlertMessage:(NSString *)message
{
[self sharedInstance].alertMessage = message;
}
+ (void) setCustomAlertCancelButtonTitle:(NSString *)cancelTitle
{
[self sharedInstance].alertCancelTitle = cancelTitle;
}
+ (void) setCustomAlertRateButtonTitle:(NSString *)rateTitle
{
[self sharedInstance].alertRateTitle = rateTitle;
}
+ (void) setCustomAlertRateLaterButtonTitle:(NSString *)rateLaterTitle
{
[self sharedInstance].alertRateLaterTitle = rateLaterTitle;
}
+ (void) setDebug:(BOOL)debug {
_debug = debug;
}
+ (void)setDelegate:(id<AppiraterDelegate>)delegate{
Appirater.sharedInstance.delegate = delegate;
}
+ (void)setUsesAnimation:(BOOL)animation {
_usesAnimation = animation;
}
+ (void)setOpenInAppStore:(BOOL)openInAppStore {
[Appirater sharedInstance].openInAppStore = openInAppStore;
}
+ (void)setStatusBarStyle:(UIStatusBarStyle)style {
_statusBarStyle = style;
}
+ (void)setModalOpen:(BOOL)open {
_modalOpen = open;
}
+ (void)setAlwaysUseMainBundle:(BOOL)alwaysUseMainBundle {
_alwaysUseMainBundle = alwaysUseMainBundle;
}
+ (NSBundle *)bundle
{
NSBundle *bundle;
if (_alwaysUseMainBundle) {
bundle = [NSBundle mainBundle];
} else {
NSURL *appiraterBundleURL = [[NSBundle mainBundle] URLForResource:@"Appirater" withExtension:@"bundle"];
if (appiraterBundleURL) {
// Appirater.bundle will likely only exist when used via CocoaPods
bundle = [NSBundle bundleWithURL:appiraterBundleURL];
} else {
bundle = [NSBundle mainBundle];
}
}
return bundle;
}
- (NSString *)alertTitle
{
return _alertTitle ? _alertTitle : APPIRATER_MESSAGE_TITLE;
}
- (NSString *)alertMessage
{
return _alertMessage ? _alertMessage : APPIRATER_MESSAGE;
}
- (NSString *)alertCancelTitle
{
return _alertCancelTitle ? _alertCancelTitle : APPIRATER_CANCEL_BUTTON;
}
- (NSString *)alertRateTitle
{
return _alertRateTitle ? _alertRateTitle : APPIRATER_RATE_BUTTON;
}
- (NSString *)alertRateLaterTitle
{
return _alertRateLaterTitle ? _alertRateLaterTitle : APPIRATER_RATE_LATER;
}
- (void)dealloc {
[[NSNotificationCenter defaultCenter] removeObserver:self];
}
- (id)init {
self = [super init];
if (self) {
if ([[UIDevice currentDevice].systemVersion floatValue] >= 7.0) {
self.openInAppStore = YES;
} else {
self.openInAppStore = NO;
}
}
return self;
}
- (BOOL)connectedToNetwork {
// Create zero addy
struct sockaddr_in zeroAddress;
bzero(&zeroAddress, sizeof(zeroAddress));
zeroAddress.sin_len = sizeof(zeroAddress);
zeroAddress.sin_family = AF_INET;
// Recover reachability flags
SCNetworkReachabilityRef defaultRouteReachability = SCNetworkReachabilityCreateWithAddress(NULL, (struct sockaddr *)&zeroAddress);
SCNetworkReachabilityFlags flags;
Boolean didRetrieveFlags = SCNetworkReachabilityGetFlags(defaultRouteReachability, &flags);
CFRelease(defaultRouteReachability);
if (!didRetrieveFlags)
{
NSLog(@"Error. Could not recover network reachability flags");
return NO;
}
BOOL isReachable = flags & kSCNetworkFlagsReachable;
BOOL needsConnection = flags & kSCNetworkFlagsConnectionRequired;
BOOL nonWiFi = flags & kSCNetworkReachabilityFlagsTransientConnection;
NSURL *testURL = [NSURL URLWithString:@"http://www.apple.com/"];
NSURLSessionConfiguration* sessionConfiguration = [NSURLSessionConfiguration ephemeralSessionConfiguration];
sessionConfiguration.requestCachePolicy = NSURLRequestReloadIgnoringLocalCacheData;
sessionConfiguration.timeoutIntervalForRequest = 20.0;
NSURLSession *session = [NSURLSession sessionWithConfiguration:sessionConfiguration];
NSURLSessionTask *task = [session dataTaskWithURL:testURL];
[task resume];
return ((isReachable && !needsConnection) || nonWiFi) ? ( (task.state != NSURLSessionTaskStateSuspended) ? YES : NO ) : NO;
}
+ (Appirater*)sharedInstance {
static Appirater *appirater = nil;
if (appirater == nil)
{
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
appirater = [[Appirater alloc] init];
appirater.eventQueue = [[NSOperationQueue alloc] init];
appirater.eventQueue.maxConcurrentOperationCount = 1;
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(appWillResignActive) name:
UIApplicationWillResignActiveNotification object:nil];
});
}
return appirater;
}
- (void)showRatingAlert:(BOOL)displayRateLaterButton {
id <AppiraterDelegate> delegate = _delegate;
if(delegate && [delegate respondsToSelector:@selector(appiraterShouldDisplayAlert:)] && ![delegate appiraterShouldDisplayAlert:self]) {
return;
}
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wunguarded-availability"
if (NSStringFromClass([SKStoreReviewController class]) != nil) {
#pragma clang diagnostic pop
[Appirater rateApp];
} else {
// Otherwise show a custom Alert
NSMutableArray *buttons = [[NSMutableArray alloc] initWithObjects:self.alertRateTitle, nil];
if (displayRateLaterButton) {
[buttons addObject:self.alertRateLaterTitle];
}
if (NSStringFromClass([UIAlertController class]) != nil) {
[buttons addObject:self.alertCancelTitle];
UIAlertController *alert = [UIAlertController alertControllerWithTitle:self.alertTitle message:self.alertMessage preferredStyle:UIAlertControllerStyleAlert];
for (NSInteger i = 0; i < buttons.count; i++) {
UIAlertActionStyle style = i == buttons.count - 1 ? UIAlertActionStyleCancel : UIAlertActionStyleDefault;
[alert addAction:[UIAlertAction actionWithTitle:buttons[i] style:style handler:^(UIAlertAction * _Nonnull action) {
NSString *title = action.title;
NSInteger buttonIndex = -1;
if ([title isEqual:self.alertCancelTitle]) {
buttonIndex = 0;
} else if ([title isEqual:self.alertRateTitle]) {
buttonIndex = 1;
} else if ([title isEqual:self.alertRateLaterTitle]) {
buttonIndex = 2;
}
[self alertViewDidDismissWithButtonIndex:buttonIndex];
}]];
}
[[Appirater getRootViewController] presentViewController:alert animated:YES completion:nil];
self.ratingAlert = alert;
} else {
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wdeprecated-declarations"
UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:self.alertTitle
message:self.alertMessage
delegate:self
cancelButtonTitle:self.alertCancelTitle
otherButtonTitles:nil];
for (NSString *button in buttons) {
[alertView addButtonWithTitle:button];
}
self.ratingAlert = alertView;
[alertView show];
#pragma clang diagnostic pop
}
}
if (delegate && [delegate respondsToSelector:@selector(appiraterDidDisplayAlert:)]) {
[delegate appiraterDidDisplayAlert:self];
}
}
- (void)showRatingAlert
{
[self showRatingAlert:true];
}
// is this an ok time to show the alert? (regardless of whether the rating conditions have been met)
//
// things checked here:
// * connectivity with network
// * whether user has rated before
// * whether user has declined to rate
// * whether rating alert is currently showing visibly
// things NOT checked here:
// * time since first launch
// * number of uses of app
// * number of significant events
// * time since last reminder
- (BOOL)ratingAlertIsAppropriate {
return ([self connectedToNetwork]
&& ![self userHasDeclinedToRate]
&& ![self isRatingAlertVisible]
&& ![self userHasRatedCurrentVersion]);
}
// have the rating conditions been met/earned? (regardless of whether this would be a moment when it's appropriate to show a new rating alert)
//
// things checked here:
// * time since first launch
// * number of uses of app
// * number of significant events
// * time since last reminder
// things NOT checked here:
// * connectivity with network
// * whether user has rated before
// * whether user has declined to rate
// * whether rating alert is currently showing visibly
- (BOOL)ratingConditionsHaveBeenMet {
if (_debug)
return YES;
NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];
NSDate *dateOfFirstLaunch = [NSDate dateWithTimeIntervalSince1970:[userDefaults doubleForKey:kAppiraterFirstUseDate]];
NSTimeInterval timeSinceFirstLaunch = [[NSDate date] timeIntervalSinceDate:dateOfFirstLaunch];
NSTimeInterval timeUntilRate = 60 * 60 * 24 * _daysUntilPrompt;
if (timeSinceFirstLaunch < timeUntilRate)
return NO;
// check if the app has been used enough
NSInteger useCount = [userDefaults integerForKey:kAppiraterUseCount];
if (useCount < _usesUntilPrompt)
return NO;
// check if the user has done enough significant events
NSInteger sigEventCount = [userDefaults integerForKey:kAppiraterSignificantEventCount];
if (sigEventCount < _significantEventsUntilPrompt)
return NO;
// if the user wanted to be reminded later, has enough time passed?
NSDate *reminderRequestDate = [NSDate dateWithTimeIntervalSince1970:[userDefaults doubleForKey:kAppiraterReminderRequestDate]];
NSTimeInterval timeSinceReminderRequest = [[NSDate date] timeIntervalSinceDate:reminderRequestDate];
NSTimeInterval timeUntilReminder = 60 * 60 * 24 * _timeBeforeReminding;
if (timeSinceReminderRequest < timeUntilReminder)
return NO;
return YES;
}
- (void)incrementUseCount {
// get the app's version
NSString *version = [[[NSBundle mainBundle] infoDictionary] objectForKey:(NSString*)kCFBundleVersionKey];
// get the version number that we've been tracking
NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];
NSString *trackingVersion = [userDefaults stringForKey:kAppiraterCurrentVersion];
if (trackingVersion == nil)
{
trackingVersion = version;
[userDefaults setObject:version forKey:kAppiraterCurrentVersion];
}
if (_debug)
NSLog(@"APPIRATER Tracking version: %@", trackingVersion);
if ([trackingVersion isEqualToString:version])
{
// check if the first use date has been set. if not, set it.
NSTimeInterval timeInterval = [userDefaults doubleForKey:kAppiraterFirstUseDate];
if (timeInterval == 0)
{
timeInterval = [[NSDate date] timeIntervalSince1970];
[userDefaults setDouble:timeInterval forKey:kAppiraterFirstUseDate];
}
// increment the use count
NSInteger useCount = [userDefaults integerForKey:kAppiraterUseCount];
useCount++;
[userDefaults setInteger:useCount forKey:kAppiraterUseCount];
if (_debug)
NSLog(@"APPIRATER Use count: %@", @(useCount));
}
else
{
// it's a new version of the app, so restart tracking
[userDefaults setObject:version forKey:kAppiraterCurrentVersion];
[userDefaults setDouble:[[NSDate date] timeIntervalSince1970] forKey:kAppiraterFirstUseDate];
[userDefaults setInteger:1 forKey:kAppiraterUseCount];
[userDefaults setInteger:0 forKey:kAppiraterSignificantEventCount];
[userDefaults setBool:NO forKey:kAppiraterRatedCurrentVersion];
[userDefaults setBool:NO forKey:kAppiraterDeclinedToRate];
[userDefaults setDouble:0 forKey:kAppiraterReminderRequestDate];
}
[userDefaults synchronize];
}
- (void)incrementSignificantEventCount {
// get the app's version
NSString *version = [[[NSBundle mainBundle] infoDictionary] objectForKey:(NSString*)kCFBundleVersionKey];
// get the version number that we've been tracking
NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];
NSString *trackingVersion = [userDefaults stringForKey:kAppiraterCurrentVersion];
if (trackingVersion == nil)
{
trackingVersion = version;
[userDefaults setObject:version forKey:kAppiraterCurrentVersion];
}
if (_debug)
NSLog(@"APPIRATER Tracking version: %@", trackingVersion);
if ([trackingVersion isEqualToString:version])
{
// check if the first use date has been set. if not, set it.
NSTimeInterval timeInterval = [userDefaults doubleForKey:kAppiraterFirstUseDate];
if (timeInterval == 0)
{
timeInterval = [[NSDate date] timeIntervalSince1970];
[userDefaults setDouble:timeInterval forKey:kAppiraterFirstUseDate];
}
// increment the significant event count
NSInteger sigEventCount = [userDefaults integerForKey:kAppiraterSignificantEventCount];
sigEventCount++;
[userDefaults setInteger:sigEventCount forKey:kAppiraterSignificantEventCount];
if (_debug)
NSLog(@"APPIRATER Significant event count: %@", @(sigEventCount));
}
else
{
// it's a new version of the app, so restart tracking
[userDefaults setObject:version forKey:kAppiraterCurrentVersion];
[userDefaults setDouble:0 forKey:kAppiraterFirstUseDate];
[userDefaults setInteger:0 forKey:kAppiraterUseCount];
[userDefaults setInteger:1 forKey:kAppiraterSignificantEventCount];
[userDefaults setBool:NO forKey:kAppiraterRatedCurrentVersion];
[userDefaults setBool:NO forKey:kAppiraterDeclinedToRate];
[userDefaults setDouble:0 forKey:kAppiraterReminderRequestDate];
}
[userDefaults synchronize];
}
- (void)incrementAndRate:(BOOL)canPromptForRating {
[self incrementUseCount];
if (canPromptForRating &&
[self ratingConditionsHaveBeenMet] &&
[self ratingAlertIsAppropriate])
{
dispatch_async(dispatch_get_main_queue(),
^{
[self showRatingAlert];
});
}
}
- (void)incrementSignificantEventAndRate:(BOOL)canPromptForRating {
[self incrementSignificantEventCount];
if (canPromptForRating &&
[self ratingConditionsHaveBeenMet] &&
[self ratingAlertIsAppropriate])
{
dispatch_async(dispatch_get_main_queue(),
^{
[self showRatingAlert];
});
}
}
- (BOOL)userHasDeclinedToRate {
return [[NSUserDefaults standardUserDefaults] boolForKey:kAppiraterDeclinedToRate];
}
- (BOOL)userHasRatedCurrentVersion {
return [[NSUserDefaults standardUserDefaults] boolForKey:kAppiraterRatedCurrentVersion];
}
#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wdeprecated-implementations"
+ (void)appLaunched {
[Appirater appLaunched:YES];
}
#pragma GCC diagnostic pop
+ (void)appLaunched:(BOOL)canPromptForRating {
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_LOW, 0),
^{
Appirater *a = [Appirater sharedInstance];
if (_debug) {
dispatch_async(dispatch_get_main_queue(),
^{
[a showRatingAlert];
});
} else {
[a incrementAndRate:canPromptForRating];
}
});
}
- (BOOL)isRatingAlertVisible {
if (NSStringFromClass([UIAlertController class]) != nil) {
return ((UIAlertController *)self.ratingAlert).view.superview != nil;
} else {
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wdeprecated-declarations"
return ((UIAlertView *)self.ratingAlert).visible;
#pragma clang diagnostic pop
}
}
- (void)hideRatingAlert {
if ([self isRatingAlertVisible]) {
if (_debug) {
NSLog(@"APPIRATER Hiding Alert");
}
if ([self.ratingAlert respondsToSelector:@selector(dismissWithClickedButtonIndex:animated:)]) {
[self.ratingAlert dismissWithClickedButtonIndex:-1 animated:NO];
} else {
[self.ratingAlert dismissViewControllerAnimated:NO completion:nil];
}
}
}
+ (void)appWillResignActive {
if (_debug)
NSLog(@"APPIRATER appWillResignActive");
[[Appirater sharedInstance] hideRatingAlert];
}
+ (void)appEnteredForeground:(BOOL)canPromptForRating {
Appirater *a = [Appirater sharedInstance];
[a.eventQueue addOperationWithBlock:^{
[[Appirater sharedInstance] incrementAndRate:canPromptForRating];
}];
}
+ (void)userDidSignificantEvent:(BOOL)canPromptForRating {
Appirater *a = [Appirater sharedInstance];
[a.eventQueue addOperationWithBlock:^{
[[Appirater sharedInstance] incrementSignificantEventAndRate:canPromptForRating];
}];
}
#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wdeprecated-implementations"
+ (void)showPrompt {
[Appirater tryToShowPrompt];
}
#pragma GCC diagnostic pop
+ (void)tryToShowPrompt {
[[Appirater sharedInstance] showPromptWithChecks:true
displayRateLaterButton:true];
}
+ (void)forceShowPrompt:(BOOL)displayRateLaterButton {
[[Appirater sharedInstance] showPromptWithChecks:false
displayRateLaterButton:displayRateLaterButton];
}
- (void)showPromptWithChecks:(BOOL)withChecks
displayRateLaterButton:(BOOL)displayRateLaterButton {
if (withChecks == NO || [self ratingAlertIsAppropriate]) {
[self showRatingAlert:displayRateLaterButton];
}
}
+ (id)getRootViewController {
UIWindow *window = [[UIApplication sharedApplication] keyWindow];
if (window.windowLevel != UIWindowLevelNormal) {
NSArray *windows = [[UIApplication sharedApplication] windows];
for(window in windows) {
if (window.windowLevel == UIWindowLevelNormal) {
break;
}
}
}
return [Appirater iterateSubViewsForViewController:window]; // iOS 8+ deep traverse
}
+ (id)iterateSubViewsForViewController:(UIView *) parentView {
for (UIView *subView in [parentView subviews]) {
UIResponder *responder = [subView nextResponder];
if([responder isKindOfClass:[UIViewController class]]) {
return [self topMostViewController: (UIViewController *) responder];
}
id found = [Appirater iterateSubViewsForViewController:subView];
if( nil != found) {
return found;
}
}
return nil;
}
+ (UIViewController *) topMostViewController: (UIViewController *) controller {
BOOL isPresenting = NO;
do {
// this path is called only on iOS 6+, so -presentedViewController is fine here.
UIViewController *presented = [controller presentedViewController];
isPresenting = presented != nil;
if(presented != nil) {
controller = presented;
}
} while (isPresenting);
return controller;
}
+ (void)rateApp {
NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];
[userDefaults setBool:YES forKey:kAppiraterRatedCurrentVersion];
[userDefaults synchronize];
// Use the built SKStoreReviewController if available (available from iOS 10.3 upwards)
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wunguarded-availability"
if (NSStringFromClass([SKStoreReviewController class]) != nil) {
[SKStoreReviewController requestReview];
#pragma clang diagnostic pop
return;
}
//Use the in-app StoreKit view if available (iOS 6) and imported. This works in the simulator.
if (![Appirater sharedInstance].openInAppStore && NSStringFromClass([SKStoreProductViewController class]) != nil) {
SKStoreProductViewController *storeViewController = [[SKStoreProductViewController alloc] init];
NSNumber *appId = [NSNumber numberWithInteger:_appId.integerValue];
[storeViewController loadProductWithParameters:@{SKStoreProductParameterITunesItemIdentifier:appId} completionBlock:nil];
storeViewController.delegate = self.sharedInstance;
id <AppiraterDelegate> delegate = self.sharedInstance.delegate;
if ([delegate respondsToSelector:@selector(appiraterWillPresentModalView:animated:)]) {
[delegate appiraterWillPresentModalView:self.sharedInstance animated:_usesAnimation];
}
[[self getRootViewController] presentViewController:storeViewController animated:_usesAnimation completion:^{
[self setModalOpen:YES];
}];
//Use the standard openUrl method if StoreKit is unavailable.
} else {
#if TARGET_IPHONE_SIMULATOR
NSLog(@"APPIRATER NOTE: iTunes App Store is not supported on the iOS simulator. Unable to open App Store page.");
#else
NSString *reviewURL = [templateReviewURL stringByReplacingOccurrencesOfString:@"APP_ID" withString:_appId];
// iOS 7 needs a different templateReviewURL @see https://github.com/arashpayan/appirater/issues/131
// Fixes condition @see https://github.com/arashpayan/appirater/issues/205
if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7.0 && [[[UIDevice currentDevice] systemVersion] floatValue] < 8.0) {
reviewURL = [templateReviewURLiOS7 stringByReplacingOccurrencesOfString:@"APP_ID" withString:_appId];
}
// iOS 8 needs a different templateReviewURL also @see https://github.com/arashpayan/appirater/issues/182
else if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 8.0)
{
reviewURL = [templateReviewURLiOS8 stringByReplacingOccurrencesOfString:@"APP_ID" withString:_appId];
}
[[UIApplication sharedApplication] openURL:[NSURL URLWithString:reviewURL]];
#endif
}
}
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wdeprecated-declarations"
- (void)alertView:(UIAlertView *)alertView didDismissWithButtonIndex:(NSInteger)buttonIndex {
[self alertViewDidDismissWithButtonIndex:buttonIndex];
}
#pragma clang diagnostic pop
- (void)alertViewDidDismissWithButtonIndex:(NSInteger)buttonIndex {
NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];
id <AppiraterDelegate> delegate = _delegate;
switch (buttonIndex) {
case 0:
{
// they don't want to rate it
[userDefaults setBool:YES forKey:kAppiraterDeclinedToRate];
[userDefaults synchronize];
if(delegate && [delegate respondsToSelector:@selector(appiraterDidDeclineToRate:)]){
[delegate appiraterDidDeclineToRate:self];
}
break;
}
case 1:
{
// they want to rate it
[Appirater rateApp];
if(delegate&& [delegate respondsToSelector:@selector(appiraterDidOptToRate:)]){
[delegate appiraterDidOptToRate:self];
}
break;
}
case 2:
// remind them later
[userDefaults setDouble:[[NSDate date] timeIntervalSince1970] forKey:kAppiraterReminderRequestDate];
[userDefaults synchronize];
if(delegate && [delegate respondsToSelector:@selector(appiraterDidOptToRemindLater:)]){
[delegate appiraterDidOptToRemindLater:self];
}
break;
default:
break;
}
self.ratingAlert = nil;
}
//Delegate call from the StoreKit view.
- (void)productViewControllerDidFinish:(SKStoreProductViewController *)viewController {
[Appirater closeModal];
}
//Close the in-app rating (StoreKit) view and restore the previous status bar style.
+ (void)closeModal {
if (_modalOpen) {
BOOL usedAnimation = _usesAnimation;
[self setModalOpen:NO];
// get the top most controller (= the StoreKit Controller) and dismiss it
UIViewController *presentingController = [UIApplication sharedApplication].keyWindow.rootViewController;
presentingController = [self topMostViewController: presentingController];
[presentingController dismissViewControllerAnimated:_usesAnimation completion:^{
id <AppiraterDelegate> delegate = self.sharedInstance.delegate;
if ([delegate respondsToSelector:@selector(appiraterDidDismissModalView:animated:)]) {
[delegate appiraterDidDismissModalView:(Appirater *)self animated:usedAnimation];
}
}];
[self.class setStatusBarStyle:(UIStatusBarStyle)nil];
}
}
@end
================================================
FILE: Pods/Appirater/AppiraterDelegate.h
================================================
//
// AppiraterDelegate.h
// Banana Stand
//
// Created by Robert Haining on 9/25/12.
// Copyright (c) 2012 News.me. All rights reserved.
//
#import <Foundation/Foundation.h>
@class Appirater;
@protocol AppiraterDelegate <NSObject>
@optional
-(BOOL)appiraterShouldDisplayAlert:(Appirater *)appirater;
-(void)appiraterDidDisplayAlert:(Appirater *)appirater;
-(void)appiraterDidDeclineToRate:(Appirater *)appirater;
-(void)appiraterDidOptToRate:(Appirater *)appirater;
-(void)appiraterDidOptToRemindLater:(Appirater *)appirater;
-(void)appiraterWillPresentModalView:(Appirater *)appirater animated:(BOOL)animated;
-(void)appiraterDidDismissModalView:(Appirater *)appirater animated:(BOOL)animated;
@end
================================================
FILE: Pods/Appirater/README.md
================================================
Introduction
---------------
Appirater is a class that you can drop into any iPhone app (iOS 4.0 or later) that will help remind your users to review your app on the App Store. The code is released under the MIT/X11, so feel free to modify and share your changes with the world. Read on below for how to get started. If you need any help using, the library, post your questions on [Stack Overflow] [stackoverflow] under the `appirater` tag.
Getting Started
---------------
### CocoaPods
To add Appirater to your app, add `pod "Appirater"` to your Podfile.
Configuration
-------------
1. Appirater provides class methods to configure its behavior. See [`Appirater.h`] [Appirater.h] for more information.
```objc
[Appirater setAppId:@"552035781"];
[Appirater setDaysUntilPrompt:1];
[Appirater setUsesUntilPrompt:10];
[Appirater setSignificantEventsUntilPrompt:-1];
[Appirater setTimeBeforeReminding:2];
[Appirater setDebug:YES];
```
2. Call `[Appirater setAppId:@"yourAppId"]` with the app id provided by Apple. A good place to do this is at the beginning of your app delegate's `application:didFinishLaunchingWithOptions:` method.
3. Call `[Appirater appLaunched:YES]` at the end of your app delegate's `application:didFinishLaunchingWithOptions:` method.
4. Call `[Appirater appEnteredForeground:YES]` in your app delegate's `applicationWillEnterForeground:` method.
5. (OPTIONAL) Call `[Appirater userDidSignificantEvent:YES]` when the user does something 'significant' in the app.
### Development
Setting `[Appirater setDebug:YES]` will ensure that the rating request is shown each time the app is launched.
### Production
Make sure you set `[Appirater setDebug:NO]` to ensure the request is not shown every time the app is launched. Also make sure that each of these components are set in the `application:didFinishLaunchingWithOptions:` method.
This example states that the rating request is only shown when the app has been launched 5 times **and** after 7 days.
```objc
[Appirater setAppId:@"770699556"];
[Appirater setDaysUntilPrompt:7];
[Appirater setUsesUntilPrompt:5];
[Appirater setSignificantEventsUntilPrompt:-1];
[Appirater setTimeBeforeReminding:2];
[Appirater setDebug:NO];
[Appirater appLaunched:YES];
```
If you wanted to show the request after 5 days only you can set the following:
```objc
[Appirater setAppId:@"770699556"];
[Appirater setDaysUntilPrompt:5];
[Appirater setUsesUntilPrompt:0];
[Appirater setSignificantEventsUntilPrompt:-1];
[Appirater setTimeBeforeReminding:2];
[Appirater setDebug:NO];
[Appirater appLaunched:YES];
```
SKStoreReviewController
----------------------
In iOS 10.3, [SKStoreReviewController](https://developer.apple.com/library/content/releasenotes/General/WhatsNewIniOS/Articles/iOS10_3.html) was introduced which allows rating directly within the app without any additional setup.
Appirater automatically uses `SKStoreReviewController` if available. You'll need to manually link `StoreKit` in your App however.
If `SKStoreReviewController` is used, Appirater is used only to decide when to show the rating dialog to the user. Keep in mind, that `SKStoreReviewController` automatically limits the number of impressions, so the dialog might be displayed less frequently than your configured conditions might suggest.
License
-------
Copyright 2017. [Arash Payan] [arash].
This library is distributed under the terms of the MIT/X11.
While not required, I greatly encourage and appreciate any improvements that you make
to this library be contributed back for the benefit of all who use Appirater.
Ports for other SDKs
--------------
A few people have ported Appirater to other SDKs. The ports are listed here in hopes that they may assist developers of those SDKs. I don't know how closesly (if at all) they track the Objective-C version of Appirater. If you need support for any of the libraries, please contact the maintainer of the port.
+ MonoTouch Binding (using native Appirater). [Github] [monotouchbinding]
[stackoverflow]: http://stackoverflow.com/
[homepage]: https://arashpayan.com/blog/2009/09/07/presenting-appirater/
[arash]: https://arashpayan.com
[Appirater.h]: https://github.com/arashpayan/appirater/blob/master/Appirater.h
[monotouchbinding]: https://github.com/theonlylawislove/MonoTouch.Appirater
================================================
FILE: Pods/Appirater/ar.lproj/AppiraterLocalizable.strings
================================================
"If you enjoy using %@, would you mind taking a moment to rate it? It won't take more than a minute. Thanks for your support!" = "إذا كنت تستمع باستخدام %@، فهل تمانع بأن تأخذ دقيقة من وقتك لتقيمه؟ لن يستغرق الأمر أكثر من دقيقة. شكرا لدعمك!";
"Rate %@" = "قيم %@";
"No, Thanks" = "لا شكرا";
"Remind me later" = "ذكرني لاحقا";
================================================
FILE: Pods/Appirater/ca.lproj/AppiraterLocalizable.strings
================================================
"If you enjoy using %@, would you mind taking a moment to rate it? It won't take more than a minute. Thanks for your support!" = "Si li agrada utilitzar %@, li importaria prendre’s un moment per a valorar-lo? No trigarà més d’un minut. Gràcies por la seva col·laboració!";
"Rate %@" = "Valorar %@";
"No, Thanks" = "No, gràcies";
"Remind me later" = "Recordar-m’ho més tard";
================================================
FILE: Pods/Appirater/cs.lproj/AppiraterLocalizable.strings
================================================
"If you enjoy using %@, would you mind taking a moment to rate it? It won't take more than a minute. Thanks for your support!" = "Pokud se Vám aplikace %@ líbí, mohli byste ji prosím ohodnotit v App Store? Zabere to jen chvilku. Díky za Vaši podporu!";
"Rate %@" = "Ohodnotit %@";
"No, Thanks" = "Ne, díky";
"Remind me later" = "Možná později";
================================================
FILE: Pods/Appirater/da.lproj/AppiraterLocalizable.strings
================================================
"If you enjoy using %@, would you mind taking a moment to rate it? It won't take more than a minute. Thanks for your support!" = "Hvis du synes om at bruge %@, vil du have noget imod at bruge et kort øjeblik på at bedømme det? Det tager kun et minut. Tak for din støtte!";
"Rate %@" = "Bedøm %@";
"No, Thanks" = "Nej tak";
"Remind me later" = "Påmind mig senere";
================================================
FILE: Pods/Appirater/de.lproj/AppiraterLocalizable.strings
================================================
"If you enjoy using %@, would you mind taking a moment to rate it? It won't take more than a minute. Thanks for your support!" = "Sie nutzen %@ gerne? Dann nehmen Sie sich bitte für eine Bewertung einen Moment Zeit! Es dauert nicht länger als eine Minute. Vielen Dank!";
"Rate %@" = "Bewerte %@";
"No, Thanks" = "Nein, danke";
"Remind me later" = "Später erinnern";
================================================
FILE: Pods/Appirater/el.lproj/AppiraterLocalizable.strings
================================================
"If you enjoy using %@, would you mind taking a moment to rate it? It won't take more than a minute. Thanks for your support!" = "Αν σου αρέσει το %@, θα μπορούσες να αφιερώσεις μια στιγμή για να το βαθμολογήσεις; Η διαδικασία είναι πολύ σύντομη. Ευχαριστούμε για τη στήριξη!";
"Rate %@" = "Βαθμολόγηση του %@";
"No, Thanks" = "Όχι, ευχαριστώ";
"Remind me later" = "Υπενθύμιση αργότερα";
================================================
FILE: Pods/Appirater/en.lproj/AppiraterLocalizable.strings
================================================
"If you enjoy using %@, would you mind taking a moment to rate it? It won't take more than a minute. Thanks for your support!" = "If you enjoy using %@, would you mind taking a moment to rate it? It won't take more than a minute. Thanks for your support!";
"Rate %@" = "Rate %@";
"No, Thanks" = "No, thanks";
"Remind me later" = "Remind me later";
================================================
FILE: Pods/Appirater/es.lproj/AppiraterLocalizable.strings
================================================
"If you enjoy using %@, would you mind taking a moment to rate it? It won't take more than a minute. Thanks for your support!" = "Si te ha gustado %@, ¿te gustaría calificarnos? No te tomará más de un minuto. ¡Gracias por tu colaboración!";
"Rate %@" = "Calificar %@";
"No, Thanks" = "No, gracias";
"Remind me later" = "Recuérdame más tarde";
================================================
FILE: Pods/Appirater/fa.lproj/AppiraterLocalizable.strings
================================================
"If you enjoy using %@, would you mind taking a moment to rate it? It won't take more than a minute. Thanks for your support!" = "اگر از استفاده برنامه %@ لذت میبرید، زمان دارید بهش امتیاز دهید؟ بیشتر از یک دقیقه زمان نخواهد گرفت. با تشکر از اینکه ما را همایت میکنید.";
"Rate %@" = "ارزیابی کردن %@";
"No, Thanks" = "نه، مرسی";
"Remind me later" = "بعدا";
================================================
FILE: Pods/Appirater/fi.lproj/AppiraterLocalizable.strings
================================================
"If you enjoy using %@, would you mind taking a moment to rate it? It won't take more than a minute. Thanks for your support!" = "Jos käytät mielelläsi %@, voisitko käyttää hetken ja arvostella sen? Se ei kestä minuuttia kauempaa. Kiitos tuestasi!";
"Rate %@" = "Arvioi %@";
"No, Thanks" = "Ei kiitos";
"Remind me later" = "Muistuta minua myöhemmin";
================================================
FILE: Pods/Appirater/fr.lproj/AppiraterLocalizable.strings
================================================
"If you enjoy using %@, would you mind taking a moment to rate it? It won't take more than a minute. Thanks for your support!" = "Si vous aimez %@, voulez-vous prendre un moment pour l'évaluer ? Cela ne vous prendra pas plus d'une minute. Merci de votre soutien !";
"Rate %@" = "Évaluer %@";
"No, Thanks" = "Non, merci";
"Remind me later" = "Me rappeler plus tard";
================================================
FILE: Pods/Appirater/he.lproj/AppiraterLocalizable.strings
================================================
"If you enjoy using %@, would you mind taking a moment to rate it? It won't take more than a minute. Thanks for your support!" = "אם נהנת להשתמש ב %@, האם תסכים לדרג אותה? זה לא יקח יותר מדקה. תודה על התמיכה!";
"Rate %@" = "דרג את %@";
"No, Thanks" = "לא תודה";
"Remind me later" = "מאוחר יותר";
================================================
FILE: Pods/Appirater/hu.lproj/AppiraterLocalizable.strings
================================================
"If you enjoy using %@, would you mind taking a moment to rate it? It won't take more than a minute. Thanks for your support!" = "Ha tetszik a %@, ne felejtsd el értékelni az App Store-ban! Csak egy perc az egész. Köszönet a támogatásért!";
"Rate %@" = "%@ értékelése";
"No, Thanks" = "Most inkább nem";
"Remind me later" = "Emlékeztess később";
================================================
FILE: Pods/Appirater/hy.lproj/AppiraterLocalizable.strings
================================================
"If you enjoy using %@, would you mind taking a moment to rate it? It won't take more than a minute. Thanks for your support!" = "Եթե Դուք հաճույքով եք օգտագործում %@-ը, դեմ չե՞ք լինի տրամադրել մեկ րոպե այն գնահատելու համար: Այն չի պահանջի ձեզանից ավելի քան մեկ րոպե: Շնորհակալություն աջակցության համար:";
"Rate %@" = "Գնահատել %@-ը";
"No, Thanks" = "Ոչ, շնորհակալություն";
"Remind me later" = "Հիշեցնել ավելի ուշ";
================================================
FILE: Pods/Appirater/id.lproj/AppiraterLocalizable.strings
================================================
"If you enjoy using %@, would you mind taking a moment to rate it? It won't take more than a minute. Thanks for your support!" = "Jika anda menyukai %@, maukah anda memberikan rating kepada aplikasi ini? Rating hanya memakan waktu kurang dari 1 menit. Terimakasih untuk dukungan anda!";
"Rate %@" = "Rating %@";
"No, Thanks" = "Tidak, terimakasih";
"Remind me later" = "Silakan ingatkan saya lagi";
================================================
FILE: Pods/Appirater/it.lproj/AppiraterLocalizable.strings
================================================
"If you enjoy using %@, would you mind taking a moment to rate it? It won't take more than a minute. Thanks for your support!" = "Se ti piace %@, perché non dedichi qualche istante a darne una valutazione sull'App Store? Non richiederà più di un minuto. Grazie per il supporto!";
"Rate %@" = "Valuta %@";
"No, Thanks" = "No, grazie";
"Remind me later" = "Ricordamelo più tardi";
================================================
FILE: Pods/Appirater/ja.lproj/AppiraterLocalizable.strings
================================================
"If you enjoy using %@, would you mind taking a moment to rate it? It won't take more than a minute. Thanks for your support!" = "%@をお使いいただきありがとうございます。もしよろしければ、ほんの少しだけお時間をいただき評価をお願いできませんか?ご協力感謝いたします!";
"Rate %@" = "%@を評価する";
"No, Thanks" ="結構です";
"Remind me later" = "あとで";
================================================
FILE: Pods/Appirater/ko.lproj/AppiraterLocalizable.strings
================================================
"If you enjoy using %@, would you mind taking a moment to rate it? It won't take more than a minute. Thanks for your support!" = "%@ 사용이 맘에 드셨나요? 잠시만 시간을 내서 평가를 부탁드리겠습니다. 감사합니다!";
"Rate %@" = "%@ 평가하기";
"No, Thanks" = "평가하지 않겠습니다";
"Remind me later" = "다음에 평가하겠습니다";
================================================
FILE: Pods/Appirater/ms.lproj/AppiraterLocalizable.strings
================================================
"If you enjoy using %@, would you mind taking a moment to rate it? It won't take more than a minute. Thanks for your support!" = "Jika anda suka %@, bolehkah luangkan sedikit masa untuk beri penarafan? Tak sampai seminit pun. Terima kasih atas sokongan anda!";
"Rate %@" = "Tarafkan %@";
"No, Thanks" = "Terima kasih saja";
"Remind me later" = "Ingatkan saya lain kali";
================================================
FILE: Pods/Appirater/nb.lproj/AppiraterLocalizable.strings
================================================
"If you enjoy using %@, would you mind taking a moment to rate it? It won't take more than a minute. Thanks for your support!" = "Hvis du liker å bruke %@, kan du ta deg et øyeblikk for å vurdere den? Det vil ikke ta mer enn ett minutt. Takk for din støtte!";
"Rate %@" = "Vurder %@";
"No, Thanks" = "Nei, takk";
"Remind me later" = "Påminn meg senere";
================================================
FILE: Pods/Appirater/nl.lproj/AppiraterLocalizable.strings
================================================
"If you enjoy using %@, would you mind taking a moment to rate it? It won't take more than a minute. Thanks for your support!" = "Als het gebruik van %@ je bevalt, zou je dan een momentje de tijd willen nemen om het te beoordelen? Het duurt nog geen minuut. Bedankt voor je steun!";
"Rate %@" = "%@ beoordelen";
"No, Thanks" = "Nee, bedankt";
"Remind me later" = "Herinner me er later aan";
================================================
FILE: Pods/Appirater/pl.lproj/AppiraterLocalizable.strings
================================================
"If you enjoy using %@, would you mind taking a moment to rate it? It won't take more than a minute. Thanks for your support!" = "Jeżeli podoba Ci się korzystanie z %@, może zechciałbyś poświęcić chwilę czasu, aby ocenić aplikację? Nie zajmie Ci to więcej niż minutę. Dziękujemy za pomoc!";
"Rate %@" = "Oceń %@";
"No, Thanks" = "Nie, dziękuję";
"Remind me later" = "Przypomnij później";
================================================
FILE: Pods/Appirater/pt-BR.lproj/AppiraterLocalizable.strings
================================================
"If you enjoy using %@, would you mind taking a moment to rate it? It won't take more than a minute. Thanks for your support!" = "Se você gosta de usar o %@, que tal avaliá-lo? Não levará mais de um minuto. Agradecemos o seu apoio!";
"Rate %@" = "Avaliar o %@";
"No, Thanks" = "Não, obrigado";
"Remind me later" = "Mais tarde";
================================================
FILE: Pods/Appirater/pt.lproj/AppiraterLocalizable.strings
================================================
"If you enjoy using %@, would you mind taking a moment to rate it? It won't take more than a minute. Thanks for your support!" = "Se você gosta de usar o %@, que tal avaliá-lo? Não levará mais de um minuto. Agradecemos o seu apoio!";
"Rate %@" = "Avaliar o %@";
"No, Thanks" = "Não, obrigado";
"Remind me later" = "Mais tarde";
================================================
FILE: Pods/Appirater/ro.lproj/AppiraterLocalizable.strings
================================================
"If you enjoy using %@, would you mind taking a moment to rate it? It won't take more than a minute. Thanks for your support!" = "Dacă îți place %@, acordă-i o notă te rog, nu durează mult. Mulțumim pentru susținere!";
"Rate %@" = "Acordă notă pentru %@";
"No, Thanks" = "Nu, mulțumesc";
"Remind me later" = "Adu-mi aminte mai târziu";
================================================
FILE: Pods/Appirater/ru.lproj/AppiraterLocalizable.strings
================================================
"If you enjoy using %@, would you mind taking a moment to rate it? It won't take more than a minute. Thanks for your support!" = "Если Вам нравится %@, пожалуйста, поставьте свою оценку. Это займет у Вас не больше одной минуты.\n Спасибо за поддержку!";
"Rate %@" = "Оценить %@";
"No, Thanks" = "Нет, спасибо";
"Remind me later" = "Напомнить позже";
================================================
FILE: Pods/Appirater/sk.lproj/AppiraterLocalizable.strings
================================================
"If you enjoy using %@, would you mind taking a moment to rate it? It won't take more than a minute. Thanks for your support!" = "Pokiaľ sa Vám páči aplikácia %@, mohli by ste ju prosím ohodnotiť v App Store? Zaberie to len chvíľu. Vďaka za Vašu podporu!";
"Rate %@" = "Ohodnotiť %@";
"No, Thanks" = "Nie, ďakujem";
"Remind me later" = "Pripomenúť neskôr";
================================================
FILE: Pods/Appirater/sv.lproj/AppiraterLocalizable.strings
================================================
"If you enjoy using %@, would you mind taking a moment to rate it? It won't take more than a minute. Thanks for your support!" = "Om du gillar att använda %@, kan du tänka dig att betygsätta det åt oss? Det tar bara en minut. Tack för hjälpen!";
"Rate %@" = "Betygsätt %@";
"No, Thanks" = "Nej tack";
"Remind me later" = "Påminn mig senare";
================================================
FILE: Pods/Appirater/th.lproj/AppiraterLocalizable.strings
================================================
"If you enjoy using %@, would you mind taking a moment to rate it? It won't take more than a minute. Thanks for your support!" = "ถ้าคุณกำลังใช้ %@ โปรดสละเวลาสักครู่ในการให้อันดับแก่เรา คุณจะเสียเวลาไม่เกินหนึ่งนาที ขอบคุณสำหรับการสนับสนุน!";
"Rate %@" = "ให้อันดับ %@";
"No, Thanks" = "ไม่ ขอบคุณ";
"Remind me later" = "เตือนฉันภายหลัง";
================================================
FILE: Pods/Appirater/tr.lproj/AppiraterLocalizable.strings
================================================
"If you enjoy using %@, would you mind taking a moment to rate it? It won't take more than a minute. Thanks for your support!" = "Eğer %@ uygulamasını kullanmaktan keyif alıyorsanız, onu değerlendirmek için zaman ayırabilir misiniz? Desteğiniz için teşekkür ederiz!";
"Rate %@" = "%@ uygulamasını değerlendir";
"No, Thanks" = "Hayır, teşekkürler";
"Remind me later" = "Daha sonra hatırlat";
================================================
FILE: Pods/Appirater/uk.lproj/AppiraterLocalizable.strings
================================================
"If you enjoy using %@, would you mind taking a moment to rate it? It won't take more than a minute. Thanks for your support!" = "Якщо вам сподобалося %@, будь ласка, поставте свою оцінку. Це займає не більше однієї хвилини.\n Дякуємо за підтримку!";
"Rate %@" = "Оцінити %@";
"No, Thanks" = "Ні, дякую";
"Remind me later" = "Нагадати пізніше";
================================================
FILE: Pods/Appirater/vi.lproj/AppiraterLocalizable.strings
================================================
"If you enjoy using %@, would you mind taking a moment to rate it? It won't take more than a minute. Thanks for your support!" = "Cảm ơn bạn đã sử dụng ứng dụng %@ trong thời gian qua, bạn có thể dành chút thời gian để đánh giá ứng dụng trong AppStore không?";
"Rate %@" = "Đánh giá %@";
"No, Thanks" = "Không, xin cảm ơn";
"Remind me later" = "Hãy nhắc nhở tôi sau";
================================================
FILE: Pods/Appirater/zh-Hans.lproj/AppiraterLocalizable.strings
================================================
"If you enjoy using %@, would you mind taking a moment to rate it? It won't take more than a minute. Thanks for your support!" = "如果你喜欢使用%@,你介意花一点时间给它评分吗?不会超过一分钟。感谢您的支持!";
"Rate %@" = "给%@评分";
"No, Thanks" = "不,谢谢";
"Remind me later" = "稍后提醒我";
================================================
FILE: Pods/Appirater/zh-Hant.lproj/AppiraterLocalizable.strings
================================================
"If you enjoy using %@, would you mind taking a moment to rate it? It won't take more than a minute. Thanks for your support!" = "如果你喜歡使用%@,你介意花一點時間給它評分嗎?不會超過一分鐘。感謝您的支持!";
"Rate %@" = "給%@評分";
"No, Thanks" = "不,謝謝";
"Remind me later" = "稍後提醒我";
================================================
FILE: Pods/Firebase/CoreOnly/Sources/Firebase.h
================================================
// Copyright 2019 Google
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
#import <FirebaseCore/FirebaseCore.h>
#if !defined(__has_include)
#error "Firebase.h won't import anything if your compiler doesn't support __has_include. Please \
import the headers individually."
#else
#if __has_include(<FirebaseAnalytics/FirebaseAnalytics.h>)
#import <FirebaseAnalytics/FirebaseAnalytics.h>
#endif
#if __has_include(<FirebaseAppCheck/FirebaseAppCheck.h>)
#import <FirebaseAppCheck/FirebaseAppCheck.h>
#endif
#if __has_include(<FirebaseAppDistribution/FirebaseAppDistribution.h>)
#import <FirebaseAppDistribution/FirebaseAppDistribution.h>
#endif
#if __has_include(<FirebaseAuth/FirebaseAuth.h>)
#import <FirebaseAuth/FirebaseAuth.h>
#endif
#if __has_include(<FirebaseCrashlytics/FirebaseCrashlytics.h>)
#import <FirebaseCrashlytics/FirebaseCrashlytics.h>
#endif
#if __has_include(<FirebaseDatabase/FirebaseDatabase.h>)
#import <FirebaseDatabase/FirebaseDatabase.h>
#endif
#if __has_include(<FirebaseDynamicLinks/FirebaseDynamicLinks.h>)
#import <FirebaseDynamicLinks/FirebaseDynamicLinks.h>
#endif
#if __has_include(<FirebaseFirestore/FirebaseFirestore.h>)
#import <FirebaseFirestore/FirebaseFirestore.h>
#endif
#if __has_include(<FirebaseFunctions/FirebaseFunctions.h>)
#import <FirebaseFunctions/FirebaseFunctions.h>
#endif
#if __has_include(<FirebaseInAppMessaging/FirebaseInAppMessaging.h>)
#import <FirebaseInAppMessaging/FirebaseInAppMessaging.h>
#endif
#if __has_include(<FirebaseInstallations/FirebaseInstallations.h>)
#import <FirebaseInstallations/FirebaseInstallations.h>
#endif
#if __has_include(<FirebaseMessaging/FirebaseMessaging.h>)
#import <FirebaseMessaging/FirebaseMessaging.h>
#endif
#if __has_include(<FirebasePerformance/FirebasePerformance.h>)
#import <FirebasePerformance/FirebasePerformance.h>
#endif
#if __has_include(<FirebaseRemoteConfig/FirebaseRemoteConfig.h>)
#import <FirebaseRemoteConfig/FirebaseRemoteConfig.h>
#endif
#if __has_include(<FirebaseStorage/FirebaseStorage.h>)
#import <FirebaseStorage/FirebaseStorage.h>
#endif
#endif // defined(__has_include)
================================================
FILE: Pods/Firebase/CoreOnly/Sources/module.modulemap
================================================
module Firebase {
export *
header "Firebase.h"
}
================================================
FILE: Pods/Firebase/LICENSE
================================================
Apache License
Version 2.0, January 2004
http://www.apache.org/licenses/
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
1. Definitions.
"License" shall mean the terms and conditions for use, reproduction,
and distribution as defined by Sections 1 through 9 of this document.
"Licensor" shall mean the copyright owner or entity authorized by
the copyright owner that is granting the License.
"Legal Entity" shall mean the union of the acting entity and all
other entities that control, are controlled by, or are under common
control with that entity. For the purposes of this definition,
"control" means (i) the power, direct or indirect, to cause the
direction or management of such entity, whether by contract or
otherwise, or (ii) ownership of fifty percent (50%) or more of the
outstanding shares, or (iii) beneficial ownership of such entity.
"You" (or "Your") shall mean an individual or Legal Entity
exercising permissions granted by this License.
"Source" form shall mean the preferred form for making modifications,
including but not limited to software source code, documentation
source, and configuration files.
"Object" form shall mean any form resulting from mechanical
transformation or translation of a Source form, including but
not limited to compiled object code, generated documentation,
and conversions to other media types.
"Work" shall mean the work of authorship, whether in Source or
Object form, made available under the License, as indicated by a
copyright notice that is included in or attached to the work
(an example is provided in the Appendix below).
"Derivative Works" shall mean any work, whether in Source or Object
form, that is based on (or derived from) the Work and for which the
editorial revisions, annotations, elaborations, or other modifications
represent, as a whole, an original work of authorship. For the purposes
of this License, Derivative Works shall not include works that remain
separable from, or merely link (or bind by name) to the interfaces of,
the Work and Derivative Works thereof.
"Contribution" shall mean any work of authorship, including
the original version of the Work and any modifications or additions
to that Work or Derivative Works thereof, that is intentionally
submitted to Licensor for inclusion in the Work by the copyright owner
or by an individual or Legal Entity authorized to submit on behalf of
the copyright owner. For the purposes of this definition, "submitted"
means any form of electronic, verbal, or written communication sent
to the Licensor or its representatives, including but not limited to
communication on electronic mailing lists, source code control systems,
and issue tracking systems that are managed by, or on behalf of, the
Licensor for the purpose of discussing and improving the Work, but
excluding communication that is conspicuously marked or otherwise
designated in writing by the copyright owner as "Not a Contribution."
"Contributor" shall mean Licensor and any individual or Legal Entity
on behalf of whom a Contribution has been received by Licensor and
subsequently incorporated within the Work.
2. Grant of Copyright License. Subject to the terms and conditions of
this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
copyright license to reproduce, prepare Derivative Works of,
publicly display, publicly perform, sublicense, and distribute the
Work and such Derivative Works in Source or Object form.
3. Grant of Patent License. Subject to the terms and conditions of
this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
(except as stated in this section) patent license to make, have made,
use, offer to sell, sell, import, and otherwise transfer the Work,
where such license applies only to those patent claims licensable
by such Contributor that are necessarily infringed by their
Contribution(s) alone or by combination of their Contribution(s)
with the Work to which such Contribution(s) was submitted. If You
institute patent litigation against any entity (including a
cross-claim or counterclaim in a lawsuit) alleging that the Work
or a Contribution incorporated within the Work constitutes direct
or contributory patent infringement, then any patent licenses
granted to You under this License for that Work shall terminate
as of the date such litigation is filed.
4. Redistribution. You may reproduce and distribute copies of the
Work or Derivative Works thereof in any medium, with or without
modifications, and in Source or Object form, provided that You
meet the following conditions:
(a) You must give any other recipients of the Work or
Derivative Works a copy of this License; and
(b) You must cause any modified files to carry prominent notices
stating that You changed the files; and
(c) You must retain, in the Source form of any Derivative Works
that You distribute, all copyright, patent, trademark, and
attribution notices from the Source form of the Work,
excluding those notices that do not pertain to any part of
the Derivative Works; and
(d) If the Work includes a "NOTICE" text file as part of its
distribution, then any Derivative Works that You distribute must
include a readable copy of the attribution notices contained
within such NOTICE file, excluding those notices that do not
pertain to any part of the Derivative Works, in at least one
of the following places: within a NOTICE text file distributed
as part of the Derivative Works; within the Source form or
documentation, if provided along with the Derivative Works; or,
within a display generated by the Derivative Works, if and
wherever such third-party notices normally appear. The contents
of the NOTICE file are for informational purposes only and
do not modify the License. You may add Your own attribution
notices within Derivative Works that You distribute, alongside
or as an addendum to the NOTICE text from the Work, provided
that such additional attribution notices cannot be construed
as modifying the License.
You may add Your own copyright statement to Your modifications and
may provide additional or different license terms and conditions
for use, reproduction, or distribution of Your modifications, or
for any such Derivative Works as a whole, provided Your use,
reproduction, and distribution of the Work otherwise complies with
the conditions stated in this License.
5. Submission of Contributions. Unless You explicitly state otherwise,
any Contribution intentionally submitted for inclusion in the Work
by You to the Licensor shall be under the terms and conditions of
this License, without any additional terms or conditions.
Notwithstanding the above, nothing herein shall supersede or modify
the terms of any separate license agreement you may have executed
with Licensor regarding such Contributions.
6. Trademarks. This License does not grant permission to use the trade
names, trademarks, service marks, or product names of the Licensor,
except as required for reasonable and customary use in describing the
origin of the Work and reproducing the content of the NOTICE file.
7. Disclaimer of Warranty. Unless required by applicable law or
agreed to in writing, Licensor provides the Work (and each
Contributor provides its Contributions) on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
implied, including, without limitation, any warranties or conditions
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
PARTICULAR PURPOSE. You are solely responsible for determining the
appropriateness of using or redistributing the Work and assume any
risks associated with Your exercise of permissions under this License.
8. Limitation of Liability. In no event and under no legal theory,
whether in tort (including negligence), contract, or otherwise,
unless required by applicable law (such as deliberate and grossly
negligent acts) or agreed to in writing, shall any Contributor be
liable to You for damages, including any direct, indirect, special,
incidental, or consequential damages of any character arising as a
result of this License or out of the use or inability to use the
Work (including but not limited to damages for loss of goodwill,
work stoppage, computer failure or malfunction, or any and all
other commercial damages or losses), even if such Contributor
has been advised of the possibility of such damages.
9. Accepting Warranty or Additional Liability. While redistributing
the Work or Derivative Works thereof, You may choose to offer,
and charge a fee for, acceptance of support, warranty, indemnity,
or other liability obligations and/or rights consistent with this
License. However, in accepting such obligations, You may act only
on Your own behalf and on Your sole responsibility, not on behalf
of any other Contributor, and only if You agree to indemnify,
defend, and hold each Contributor harmless for any liability
incurred by, or claims asserted against, such Contributor by reason
of your accepting any such warranty or additional liability.
END OF TERMS AND CONDITIONS
APPENDIX: How to apply the Apache License to your work.
To apply the Apache License to your work, attach the following
boilerplate notice, with the fields enclosed by brackets "[]"
replaced with your own identifying information. (Don't include
the brackets!) The text should be enclosed in the appropriate
comment syntax for the file format. We also recommend that a
file or class name and description of purpose be included on the
same "printed page" as the copyright notice for easier
identification within third-party archives.
Copyright [yyyy] [name of copyright owner]
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
================================================
FILE: Pods/Firebase/README.md
================================================
[](https://cocoapods.org/pods/Firebase)
[](https://cocoapods.org/pods/Firebase)
[](https://cocoapods.org/pods/Firebase)
[![Actions Status][gh-abtesting-badge]][gh-actions]
[![Actions Status][gh-appcheck-badge]][gh-actions]
[![Actions Status][gh-appdistribution-badge]][gh-actions]
[![Actions Status][gh-auth-badge]][gh-actions]
[![Actions Status][gh-cocoapods-integration-badge]][gh-actions]
[![Actions Status][gh-core-badge]][gh-actions]
[![Actions Status][gh-core-diagnostics-badge]][gh-actions]
[![Actions Status][gh-crashlytics-badge]][gh-actions]
[![Actions Status][gh-database-badge]][gh-actions]
[![Actions Status][gh-datatransport-badge]][gh-actions]
[![Actions Status][gh-dynamiclinks-badge]][gh-actions]
[![Actions Status][gh-firebasepod-badge]][gh-actions]
[![Actions Status][gh-firestore-badge]][gh-actions]
[![Actions Status][gh-functions-badge]][gh-actions]
[![Actions Status][gh-google-utilities-badge]][gh-actions]
[![Actions Status][gh-google-utilities-components-badge]][gh-actions]
[![Actions Status][gh-inappmessaging-badge]][gh-actions]
[![Actions Status][gh-interop-badge]][gh-actions]
[![Actions Status][gh-messaging-badge]][gh-actions]
[![Actions Status][gh-mlmodeldownloader-badge]][gh-actions]
[![Actions Status][gh-performance-badge]][gh-actions]
[![Actions Status][gh-remoteconfig-badge]][gh-actions]
[![Actions Status][gh-storage-badge]][gh-actions]
[![Actions Status][gh-symbolcollision-badge]][gh-actions]
[![Actions Status][gh-zip-badge]][gh-actions]
[](https://travis-ci.org/firebase/firebase-ios-sdk)
# Firebase Apple Open Source Development
This repository contains all Apple platform Firebase SDK source except FirebaseAnalytics
and FirebaseML.
Firebase is an app development platform with tools to help you build, grow and
monetize your app. More information about Firebase can be found on the
[official Firebase website](https://firebase.google.com).
**Note** _FirebaseCombineSwift_ contains support for Apple's Combine framework. This module is currently under development, and not yet supported for use in production environments. Fore more details, please refer to the [docs](FirebaseCombineSwift/README.md).
## Installation
See the subsections below for details about the different installation methods.
1. [Standard pod install](README.md#standard-pod-install)
1. [Swift Package Manager](SwiftPackageManager.md)
1. [Installing from the GitHub repo](README.md#installing-from-github)
1. [Experimental Carthage](README.md#carthage-ios-only)
### Standard pod install
Go to
[https://firebase.google.com/docs/ios/setup](https://firebase.google.com/docs/ios/setup).
### Swift Package Manager
Instructions for [Swift Package Manager](https://swift.org/package-manager/) support can be
found at [SwiftPackageManager.md](SwiftPackageManager.md).
### Installing from GitHub
These instructions can be used to access the Firebase repo at other branches,
tags, or commits.
#### Background
See
[the Podfile Syntax Reference](https://guides.cocoapods.org/syntax/podfile.html#pod)
for instructions and options about overriding pod source locations.
#### Accessing Firebase Source Snapshots
All of the official releases are tagged in this repo and available via CocoaPods. To access a local
source snapshot or unreleased branch, use Podfile directives like the following:
To access FirebaseFirestore via a branch:
```ruby
pod 'FirebaseCore', :git => 'https://github.com/firebase/firebase-ios-sdk.git', :branch => 'master'
pod 'FirebaseFirestore', :git => 'https://github.com/firebase/firebase-ios-sdk.git', :branch => 'master'
```
To access FirebaseMessaging via a checked out version of the firebase-ios-sdk repo do:
```ruby
pod 'FirebaseCore', :path => '/path/to/firebase-ios-sdk'
pod 'FirebaseMessaging', :path => '/path/to/firebase-ios-sdk'
```
### Carthage (iOS only)
Instructions for the experimental Carthage distribution are at
[Carthage](Carthage.md).
### Using Firebase from a Framework or a library
[Using Firebase from a Framework or a library](docs/firebase_in_libraries.md)
## Development
To develop Firebase software in this repository, ensure that you have at least
the following software:
* Xcode 12.2 (or later)
CocoaPods is still the canonical way to develop, but much of the repo now supports
development with Swift Package Manager.
### CocoaPods
Install
* CocoaPods 1.10.0 (or later)
* [CocoaPods generate](https://github.com/square/cocoapods-generate)
For the pod that you want to develop:
```ruby
pod gen Firebase{name here}.podspec --local-sources=./ --auto-open --platforms=ios
```
Note: If the CocoaPods cache is out of date, you may need to run
`pod repo update` before the `pod gen` command.
Note: Set the `--platforms` option to `macos` or `tvos` to develop/test for
those platforms. Since 10.2, Xcode does not properly handle multi-platform
CocoaPods workspaces.
Firestore has a self contained Xcode project. See
[Firestore/README.md](Firestore/README.md).
#### Development for Catalyst
* `pod gen {name here}.podspec --local-sources=./ --auto-open --platforms=ios`
* Check the Mac box in the App-iOS Build Settings
* Sign the App in the Settings Signing & Capabilities tab
* Click Pods in the Project Manager
* Add Signing to the iOS host app and unit test targets
* Select the Unit-unit scheme
* Run it to build and test
Alternatively disable signing in each target:
* Go to Build Settings tab
* Click `+`
* Select `Add User-Defined Setting`
* Add `CODE_SIGNING_REQUIRED` setting with a value of `NO`
### Swift Package Manager
* To enable test schemes: `./scripts/setup_spm_tests.sh`
* `open Package.swift` or double click `Package.swift` in Finder.
* Xcode will open the project
* Choose a scheme for a library to build or test suite to run
* Choose a target platform by selecting the run destination along with the scheme
### Adding a New Firebase Pod
See [AddNewPod.md](AddNewPod.md).
### Managing Headers and Imports
See [HeadersImports.md](HeadersImports.md).
### Code Formatting
To ensure that the code is formatted consistently, run the script
[./scripts/check.sh](https://github.com/firebase/firebase-ios-sdk/blob/master/scripts/check.sh)
before creating a PR.
GitHub Actions will verify that any code changes are done in a style compliant
way. Install `clang-format` and `mint`:
```console
brew install clang-format@12
brew install mint
```
### Running Unit Tests
Select a scheme and press Command-u to build a component and run its unit tests.
### Running Sample Apps
In order to run the sample apps and integration tests, you'll need a valid
`GoogleService-Info.plist` file. The Firebase Xcode project contains dummy plist
files without real values, but can be replaced with real plist files. To get your own
`GoogleService-Info.plist` files:
1. Go to the [Firebase Console](https://console.firebase.google.com/)
2. Create a new Firebase project, if you don't already have one
3. For each sample app you want to test, create a new Firebase app with the sample app's bundle
identifier (e.g. `com.google.Database-Example`)
4. Download the resulting `GoogleService-Info.plist` and add it to the Xcode project.
### Coverage Report Generation
See [scripts/code_coverage_report/README.md](scripts/code_coverage_report/README.md).
## Specific Component Instructions
See the sections below for any special instructions for those components.
### Firebase Auth
If you're doing specific Firebase Auth development, see
[the Auth Sample README](FirebaseAuth/Tests/Sample/README.md) for instructions about
building and running the FirebaseAuth pod along with various samples and tests.
### Firebase Database
The Firebase Database Integration tests can be run against a locally running Database Emulator
or against a production instance.
To run against a local emulator instance, invoke `./scripts/run_database_emulator.sh start` before
running the integration test.
To run against a production instance, provide a valid GoogleServices-Info.plist and copy it to
`FirebaseDatabase/Tests/Resources/GoogleService-Info.plist`. Your Security Rule must be set to
[public](https://firebase.google.com/docs/database/security/quickstart) while your tests are
running.
### Firebase Performance Monitoring
If you're doing specific Firebase Performance Monitoring development, see
[the Performance README](FirebasePerformance/README.md) for instructions about building the SDK
and [the Performance TestApp README](FirebasePerformance/Tests/TestApp/README.md) for instructions about
integrating Performance with the dev test App.
### Firebase Storage
To run the Storage Integration tests, follow the instructions in
[FIRStorageIntegrationTests.m](FirebaseStorage/Tests/Integration/FIRStorageIntegrationTests.m).
#### Push Notifications
Push notifications can only be delivered to specially provisioned App IDs in the developer portal.
In order to actually test receiving push notifications, you will need to:
1. Change the bundle identifier of the sample app to something you own in your Apple Developer
account, and enable that App ID for push notifications.
2. You'll also need to
[upload your APNs Provider Authentication Key or certificate to the
Firebase Console](https://firebase.google.com/docs/cloud-messaging/ios/certs)
at **Project Settings > Cloud Messaging > [Your Firebase App]**.
3. Ensure your iOS device is added to your Apple Developer portal as a test device.
#### iOS Simulator
The iOS Simulator cannot register for remote notifications, and will not receive push notifications.
In order to receive push notifications, you'll have to follow the steps above and run the app on a
physical device.
## Building with Firebase on Apple platforms
At this time, not all of Firebase's products are available across all Apple platforms. However,
Firebase is constantly evolving and community supported efforts have helped expand Firebase's support.
To keep up with the latest info regarding Firebase's support across Apple platforms, refer to
[this chart](https://firebase.google.com/docs/ios/learn-more#firebase_library_support_by_platform)
in Firebase's documentation.
### Community Supported Efforts
We've seen an amazing amount of interest and contributions to improve the Firebase SDKs, and we are
very grateful! We'd like to empower as many developers as we can to be able to use Firebase and
participate in the Firebase community.
#### tvOS, macOS, watchOS and Catalyst
Thanks to contributions from the community, many of Firebase SDKs now compile, run unit tests, and
work on tvOS, macOS, watchOS and Catalyst.
For tvOS, see the [Sample](Example/tvOSSample).
For watchOS, currently only Messaging, Storage and Crashlytics (and their dependencies) have limited
support. See the [Independent Watch App Sample](Example/watchOSSample).
Keep in mind that macOS, tvOS, watchOS and Catalyst are not officially supported by Firebase, and
this repository is actively developed primarily for iOS. While we can catch basic unit test issues
with GitHub Actions, there may be some changes where the SDK no longer works as expected on macOS,
tvOS or watchOS. If you encounter this, please
[file an issue](https://github.com/firebase/firebase-ios-sdk/issues).
During app setup in the console, you may get to a step that mentions something like "Checking if the
app has communicated with our servers". This relies on Analytics and will not work on
macOS/tvOS/watchOS/Catalyst.
**It's safe to ignore the message and continue**, the rest of the SDKs will work as expected.
#### Additional MacOS and Catalyst Notes
* FirebaseAuth and FirebaseMessaging require adding `Keychain Sharing Capability`
to Build Settings.
* For Catalyst, FirebaseFirestore requires signing the
[gRPC Resource target](https://github.com/firebase/firebase-ios-sdk/issues/3500#issuecomment-518741681).
#### Additional Crashlytics Notes
* watchOS has limited support. Due to watchOS restrictions, mach exceptions and signal crashes are
not recorded. (Crashes in SwiftUI are generated as mach exceptions, so will not be recorded)
## Roadmap
See [Roadmap](ROADMAP.md) for more about the Firebase iOS SDK Open Source
plans and directions.
## Contributing
See [Contributing](CONTRIBUTING.md) for more information on contributing to the Firebase
iOS SDK.
## License
The contents of this repository are licensed under the
[Apache License, version 2.0](http://www.apache.org/licenses/LICENSE-2.0).
Your use of Firebase is governed by the
[Terms of Service for Firebase Services](https://firebase.google.com/terms/).
[gh-actions]: https://github.com/firebase/firebase-ios-sdk/actions
[gh-abtesting-badge]: https://github.com/firebase/firebase-ios-sdk/workflows/abtesting/badge.svg
[gh-appcheck-badge]: https://github.com/firebase/firebase-ios-sdk/workflows/app_check/badge.svg
[gh-appdistribution-badge]: https://github.com/firebase/firebase-ios-sdk/workflows/appdistribution/badge.svg
[gh-auth-badge]: https://github.com/firebase/firebase-ios-sdk/workflows/auth/badge.svg
[gh-cocoapods-integration-badge]: https://github.com/firebase/firebase-ios-sdk/workflows/cocoapods-integration/badge.svg
[gh-core-badge]: https://github.com/firebase/firebase-ios-sdk/workflows/core/badge.svg
[gh-core-diagnostics-badge]: https://github.com/firebase/firebase-ios-sdk/workflows/core-diagnostics/badge.svg
[gh-crashlytics-badge]: https://github.com/firebase/firebase-ios-sdk/workflows/crashlytics/badge.svg
[gh-database-badge]: https://github.com/firebase/firebase-ios-sdk/workflows/database/badge.svg
[gh-datatransport-badge]: https://github.com/firebase/firebase-ios-sdk/workflows/datatransport/badge.svg
[gh-dynamiclinks-badge]: https://github.com/firebase/firebase-ios-sdk/workflows/dynamiclinks/badge.svg
[gh-firebasepod-badge]: https://github.com/firebase/firebase-ios-sdk/workflows/firebasepod/badge.svg
[gh-firestore-badge]: https://github.com/firebase/firebase-ios-sdk/workflows/firestore/badge.svg
[gh-functions-badge]: https://github.com/firebase/firebase-ios-sdk/workflows/functions/badge.svg
[gh-google-utilities-badge]: https://github.com/firebase/firebase-ios-sdk/workflows/google-utilities/badge.svg
[gh-google-utilities-components-badge]: https://github.com/firebase/firebase-ios-sdk/workflows/google-utilities-components/badge.svg
[gh-inappmessaging-badge]: https://github.com/firebase/firebase-ios-sdk/workflows/inappmessaging/badge.svg
[gh-interop-badge]: https://github.com/firebase/firebase-ios-sdk/workflows/interop/badge.svg
[gh-messaging-badge]: https://github.com/firebase/firebase-ios-sdk/workflows/messaging/badge.svg
[gh-mlmodeldownloader-badge]: https://github.com/firebase/firebase-ios-sdk/workflows/mlmodeldownloader/badge.svg
[gh-performance-badge]: https://github.com/firebase/firebase-ios-sdk/workflows/performance/badge.svg
[gh-remoteconfig-badge]: https://github.com/firebase/firebase-ios-sdk/workflows/remoteconfig/badge.svg
[gh-storage-badge]: https://github.com/firebase/firebase-ios-sdk/workflows/storage/badge.svg
[gh-symbolcollision-badge]: https://github.com/firebase/firebase-ios-sdk/workflows/symbolcollision/badge.svg
[gh-zip-badge]: https://github.com/firebase/firebase-ios-sdk/workflows/zip/badge.svg
================================================
FILE: Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.xcframework/Info.plist
================================================
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>AvailableLibraries</key>
<array>
<dict>
<key>LibraryIdentifier</key>
<string>ios-arm64_armv7</string>
<key>LibraryPath</key>
<string>FirebaseAnalytics.framework</string>
<key>SupportedArchitectures</key>
<array>
<string>arm64</string>
<string>armv7</string>
</array>
<key>SupportedPlatform</key>
<string>ios</string>
</dict>
<dict>
<key>LibraryIdentifier</key>
<string>ios-arm64_i386_x86_64-simulator</string>
<key>LibraryPath</key>
<string>FirebaseAnalytics.framework</string>
<key>SupportedArchitectures</key>
<array>
<string>arm64</string>
<string>i386</string>
<string>x86_64</string>
</array>
<key>SupportedPlatform</key>
<string>ios</string>
<key>SupportedPlatformVariant</key>
<string>simulator</string>
</dict>
</array>
<key>CFBundlePackageType</key>
<string>XFWK</string>
<key>XCFrameworkFormatVersion</key>
<string>1.0</string>
</dict>
</plist>
================================================
FILE: Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.xcframework/ios-arm64_armv7/FirebaseAnalytics.framework/Headers/FIRAnalytics+AppDelegate.h
================================================
#import <Foundation/Foundation.h>
#import "FIRAnalytics.h"
NS_ASSUME_NONNULL_BEGIN
/**
* Provides App Delegate handlers to be used in your App Delegate.
*
* To save time integrating Firebase Analytics in an application, Firebase Analytics does not
* require delegation implementation from the AppDelegate. Instead this is automatically done by
* Firebase Analytics. Should you choose instead to delegate manually, you can turn off the App
* Delegate Proxy by adding FirebaseAppDelegateProxyEnabled into your app's Info.plist and setting
* it to NO, and adding the methods in this category to corresponding delegation handlers.
*
* To handle Universal Links, you must return YES in
* [UIApplicationDelegate application:didFinishLaunchingWithOptions:].
*/
@interface FIRAnalytics (AppDelegate)
/**
* Handles events related to a URL session that are waiting to be processed.
*
* For optimal use of Firebase Analytics, call this method from the
* [UIApplicationDelegate application:handleEventsForBackgroundURLSession:completionHandler]
* method of the app delegate in your app.
*
* @param identifier The identifier of the URL session requiring attention.
* @param completionHandler The completion handler to call when you finish processing the events.
* Calling this completion handler lets the system know that your app's user interface is
* updated and a new snapshot can be taken.
*/
+ (void)handleEventsForBackgroundURLSession:(NSString *)identifier
completionHandler:(nullable void (^)(void))completionHandler;
/**
* Handles the event when the app is launched by a URL.
*
* Call this method from [UIApplicationDelegate application:openURL:options:] (on iOS 9.0 and
* above), or [UIApplicationDelegate application:openURL:sourceApplication:annotation:] (on
* iOS 8.x and below) in your app.
*
* @param url The URL resource to open. This resource can be a network resource or a file.
*/
+ (void)handleOpenURL:(NSURL *)url;
/**
* Handles the event when the app receives data associated with user activity that includes a
* Universal Link (on iOS 9.0 and above).
*
* Call this method from [UIApplication continueUserActivity:restorationHandler:] in your app
* delegate (on iOS 9.0 and above).
*
* @param userActivity The activity object containing the data associated with the task the user
* was performing.
*/
+ (void)handleUserActivity:(id)userActivity;
@end
NS_ASSUME_NONNULL_END
================================================
FILE: Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.xcframework/ios-arm64_armv7/FirebaseAnalytics.framework/Headers/FIRAnalytics+Consent.h
================================================
#import <Foundation/Foundation.h>
#import "FIRAnalytics.h"
NS_ASSUME_NONNULL_BEGIN
/// The type of consent to set. Supported consent types are `ConsentType.adStorage` and
/// `ConsentType.analyticsStorage`. Omitting a type retains its previous status.
typedef NSString *FIRConsentType NS_TYPED_ENUM NS_SWIFT_NAME(ConsentType);
extern FIRConsentType const FIRConsentTypeAdStorage;
extern FIRConsentType const FIRConsentTypeAnalyticsStorage;
/// The status value of the consent type. Supported statuses are `ConsentStatus.granted` and
/// `ConsentStatus.denied`.
typedef NSString *FIRConsentStatus NS_TYPED_ENUM NS_SWIFT_NAME(ConsentStatus);
extern FIRConsentStatus const FIRConsentStatusDenied;
extern FIRConsentStatus const FIRConsentStatusGranted;
/// Sets the applicable end user consent state.
@interface FIRAnalytics (Consent)
/// Sets the applicable end user consent state (e.g. for device identifiers) for this app on this
/// device. Use the consent settings to specify individual consent type values. Settings are
/// persisted across app sessions. By default consent types are set to `ConsentStatus.granted`.
///
/// @param consentSettings An NSDictionary of consent types. Supported consent type keys are
/// `ConsentType.adStorage` and `ConsentType.analyticsStorage`. Valid values are
/// `ConsentStatus.granted` and `ConsentStatus.denied`.
+ (void)setConsent:(NSDictionary<FIRConsentType, FIRConsentStatus> *)consentSettings;
@end
NS_ASSUME_NONNULL_END
================================================
FILE: Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.xcframework/ios-arm64_armv7/FirebaseAnalytics.framework/Headers/FIRAnalytics.h
================================================
#import <Foundation/Foundation.h>
#import "FIREventNames.h"
#import "FIRParameterNames.h"
#import "FIRUserPropertyNames.h"
NS_ASSUME_NONNULL_BEGIN
/// The top level Firebase Analytics singleton that provides methods for logging events and setting
/// user properties. See <a href="http://goo.gl/gz8SLz">the developer guides</a> for general
/// information on using Firebase Analytics in your apps.
///
/// @note The Analytics SDK uses SQLite to persist events and other app-specific data. Calling
/// certain thread-unsafe global SQLite methods like `sqlite3_shutdown()` can result in
/// unexpected crashes at runtime.
NS_SWIFT_NAME(Analytics)
@interface FIRAnalytics : NSObject
/// Logs an app event. The event can have up to 25 parameters. Events with the same name must have
/// the same parameters. Up to 500 event names are supported. Using predefined events and/or
/// parameters is recommended for optimal reporting.
///
/// The following event names are reserved and cannot be used:
/// <ul>
/// <li>ad_activeview</li>
/// <li>ad_click</li>
/// <li>ad_exposure</li>
/// <li>ad_query</li>
/// <li>ad_reward</li>
/// <li>adunit_exposure</li>
/// <li>app_background</li>
/// <li>app_clear_data</li>
/// <li>app_exception</li>
/// <li>app_remove</li>
/// <li>app_store_refund</li>
/// <li>app_store_subscription_cancel</li>
/// <li>app_store_subscription_convert</li>
/// <li>app_store_subscription_renew</li>
/// <li>app_update</li>
/// <li>app_upgrade</li>
/// <li>dynamic_link_app_open</li>
/// <li>dynamic_link_app_update</li>
/// <li>dynamic_link_first_open</li>
/// <li>error</li>
/// <li>firebase_campaign</li>
/// <li>first_open</li>
/// <li>first_visit</li>
/// <li>in_app_purchase</li>
/// <li>notification_dismiss</li>
/// <li>notification_foreground</li>
/// <li>notification_open</li>
/// <li>notification_receive</li>
/// <li>os_update</li>
/// <li>session_start</li>
/// <li>session_start_with_rollout</li>
/// <li>user_engagement</li>
/// </ul>
///
/// @param name The name of the event. Should contain 1 to 40 alphanumeric characters or
/// underscores. The name must start with an alphabetic character. Some event names are
/// reserved. See FIREventNames.h for the list of reserved event names. The "firebase_",
/// "google_", and "ga_" prefixes are reserved and should not be used. Note that event names are
/// case-sensitive and that logging two events whose names differ only in case will result in
/// two distinct events. To manually log screen view events, use the `screen_view` event name.
/// @param parameters The dictionary of event parameters. Passing nil indicates that the event has
/// no parameters. Parameter names can be up to 40 characters long and must start with an
/// alphabetic character and contain only alphanumeric characters and underscores. Only NSString
/// and NSNumber (signed 64-bit integer and 64-bit floating-point number) parameter types are
/// supported. NSString parameter values can be up to 100 characters long. The "firebase_",
/// "google_", and "ga_" prefixes are reserved and should not be used for parameter names.
+ (void)logEventWithName:(NSString *)name
parameters:(nullable NSDictionary<NSString *, id> *)parameters
NS_SWIFT_NAME(logEvent(_:parameters:));
/// Sets a user property to a given value. Up to 25 user property names are supported. Once set,
/// user property values persist throughout the app lifecycle and across sessions.
///
/// The following user property names are reserved and cannot be used:
/// <ul>
/// <li>first_open_time</li>
/// <li>last_deep_link_referrer</li>
/// <li>user_id</li>
/// </ul>
///
/// @param value The value of the user property. Values can be up to 36 characters long. Setting the
/// value to nil removes the user property.
/// @param name The name of the user property to set. Should contain 1 to 24 alphanumeric characters
/// or underscores and must start with an alphabetic character. The "firebase_", "google_", and
/// "ga_" prefixes are reserved and should not be used for user property names.
+ (void)setUserPropertyString:(nullable NSString *)value forName:(NSString *)name
NS_SWIFT_NAME(setUserProperty(_:forName:));
/// Sets the user ID property. This feature must be used in accordance with
/// <a href="https://www.google.com/policies/privacy">Google's Privacy Policy</a>
///
/// @param userID The user ID to ascribe to the user of this app on this device, which must be
/// non-empty and no more than 256 characters long. Setting userID to nil removes the user ID.
+ (void)setUserID:(nullable NSString *)userID;
/// Sets whether analytics collection is enabled for this app on this device. This setting is
/// persisted across app sessions. By default it is enabled.
///
/// @param analyticsCollectionEnabled A flag that enables or disables Analytics collection.
+ (void)setAnalyticsCollectionEnabled:(BOOL)analyticsCollectionEnabled;
/// Sets the interval of inactivity in seconds that terminates the current session. The default
/// value is 1800 seconds (30 minutes).
///
/// @param sessionTimeoutInterval The custom time of inactivity in seconds before the current
/// session terminates.
+ (void)setSessionTimeoutInterval:(NSTimeInterval)sessionTimeoutInterval;
/// Returns the unique ID for this instance of the application or nil if
/// `ConsentType.analyticsStorage` has been set to `ConsentStatus.denied`.
///
/// @see `FIRAnalytics+Consent.h`
+ (nullable NSString *)appInstanceID;
/// Clears all analytics data for this instance from the device and resets the app instance ID.
/// FIRAnalyticsConfiguration values will be reset to the default values.
+ (void)resetAnalyticsData;
/// Adds parameters that will be set on every event logged from the SDK, including automatic ones.
/// The values passed in the parameters dictionary will be added to the dictionary of default event
/// parameters. These parameters persist across app runs. They are of lower precedence than event
/// parameters, so if an event parameter and a parameter set using this API have the same name, the
/// value of the event parameter will be used. The same limitations on event parameters apply to
/// default event parameters.
///
/// @param parameters Parameters to be added to the dictionary of parameters added to every event.
/// They will be added to the dictionary of default event parameters, replacing any existing
/// parameter with the same name. Valid parameters are NSString and NSNumber (signed 64-bit
/// integer and 64-bit floating-point number). Setting a key's value to [NSNull null] will clear
/// that parameter. Passing in a nil dictionary will clear all parameters.
+ (void)setDefaultEventParameters:(nullable NSDictionary<NSString *, id> *)parameters;
/// Unavailable.
- (instancetype)init NS_UNAVAILABLE;
@end
NS_ASSUME_NONNULL_END
================================================
FILE: Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.xcframework/ios-arm64_armv7/FirebaseAnalytics.framework/Headers/FIREventNames.h
================================================
/// @file FIREventNames.h
///
/// Predefined event names.
///
/// An Event is an important occurrence in your app that you want to measure. You can report up to
/// 500 different types of Events per app and you can associate up to 25 unique parameters with each
/// Event type. Some common events are suggested below, but you may also choose to specify custom
/// Event types that are associated with your specific app. Each event type is identified by a
/// unique name. Event names can be up to 40 characters long, may only contain alphanumeric
/// characters and underscores ("_"), and must start with an alphabetic character. The "firebase_",
/// "google_", and "ga_" prefixes are reserved and should not be used.
#import <Foundation/Foundation.h>
/// Add Payment Info event. This event signifies that a user has submitted their payment
/// information. Note: If you supply the @c kFIRParameterValue parameter, you must also supply the
/// @c kFIRParameterCurrency parameter so that revenue metrics can be computed accurately. Params:
///
/// <ul>
/// <li>@c kFIRParameterCoupon (NSString) (optional)</li>
/// <li>@c kFIRParameterCurrency (NSString) (optional)</li>
/// <li>@c kFIRParameterItems (NSArray) (optional)</li>
/// <li>@c kFIRParameterPaymentType (NSString) (optional)</li>
/// <li>@c kFIRParameterValue (double as NSNumber) (optional)</li>
/// </ul>
static NSString *const kFIREventAddPaymentInfo NS_SWIFT_NAME(AnalyticsEventAddPaymentInfo) =
@"add_payment_info";
/// E-Commerce Add To Cart event. This event signifies that an item(s) was added to a cart for
/// purchase. Add this event to a funnel with @c kFIREventPurchase to gauge the effectiveness of
/// your checkout process. Note: If you supply the @c kFIRParameterValue parameter, you must also
/// supply the @c kFIRParameterCurrency parameter so that revenue metrics can be computed
/// accurately. Params:
///
/// <ul>
/// <li>@c kFIRParameterCurrency (NSString) (optional)</li>
/// <li>@c kFIRParameterItems (NSArray) (optional)</li>
/// <li>@c kFIRParameterValue (double as NSNumber) (optional)</li>
/// </ul>
static NSString *const kFIREventAddToCart NS_SWIFT_NAME(AnalyticsEventAddToCart) = @"add_to_cart";
/// E-Commerce Add To Wishlist event. This event signifies that an item was added to a wishlist. Use
/// this event to identify popular gift items. Note: If you supply the @c kFIRParameterValue
/// parameter, you must also supply the @c kFIRParameterCurrency parameter so that revenue metrics
/// can be computed accurately. Params:
///
/// <ul>
/// <li>@c kFIRParameterCurrency (NSString) (optional)</li>
/// <li>@c kFIRParameterItems (NSArray) (optional)</li>
/// <li>@c kFIRParameterValue (double as NSNumber) (optional)</li>
/// </ul>
static NSString *const kFIREventAddToWishlist NS_SWIFT_NAME(AnalyticsEventAddToWishlist) =
@"add_to_wishlist";
/// Ad Impression event. This event signifies when a user sees an ad impression. Note: If you supply
/// the @c kFIRParameterValue parameter, you must also supply the @c kFIRParameterCurrency parameter
/// so that revenue metrics can be computed accurately. Params:
///
/// <ul>
/// <li>@c kFIRParameterAdPlatform (NSString) (optional)</li>
/// <li>@c kFIRParameterAdFormat (NSString) (optional)</li>
/// <li>@c kFIRParameterAdSource (NSString) (optional)</li>
/// <li>@c kFIRParameterAdUnitName (NSString) (optional)</li>
/// <li>@c kFIRParameterCurrency (NSString) (optional)</li>
/// <li>@c kFIRParameterValue (double as NSNumber) (optional)</li>
/// </ul>
static NSString *const kFIREventAdImpression NS_SWIFT_NAME(AnalyticsEventAdImpression) =
@"ad_impression";
/// App Open event. By logging this event when an App becomes active, developers can understand how
/// often users leave and return during the course of a Session. Although Sessions are automatically
/// reported, this event can provide further clarification around the continuous engagement of
/// app-users.
static NSString *const kFIREventAppOpen NS_SWIFT_NAME(AnalyticsEventAppOpen) = @"app_open";
/// E-Commerce Begin Checkout event. This event signifies that a user has begun the process of
/// checking out. Add this event to a funnel with your @c kFIREventPurchase event to gauge the
/// effectiveness of your checkout process. Note: If you supply the @c kFIRParameterValue parameter,
/// you must also supply the @c kFIRParameterCurrency parameter so that revenue metrics can be
/// computed accurately. Params:
///
/// <ul>
/// <li>@c kFIRParameterCoupon (NSString) (optional)</li>
/// <li>@c kFIRParameterCurrency (NSString) (optional)</li>
/// <li>@c kFIRParameterItems (NSArray) (optional)</li>
/// <li>@c kFIRParameterValue (double as NSNumber) (optional)</li>
/// </ul>
static NSString *const kFIREventBeginCheckout NS_SWIFT_NAME(AnalyticsEventBeginCheckout) =
@"begin_checkout";
/// Campaign Detail event. Log this event to supply the referral details of a re-engagement
/// campaign. Note: you must supply at least one of the required parameters kFIRParameterSource,
/// kFIRParameterMedium or kFIRParameterCampaign. Params:
///
/// <ul>
/// <li>@c kFIRParameterSource (NSString)</li>
/// <li>@c kFIRParameterMedium (NSString)</li>
/// <li>@c kFIRParameterCampaign (NSString)</li>
/// <li>@c kFIRParameterTerm (NSString) (optional)</li>
/// <li>@c kFIRParameterContent (NSString) (optional)</li>
/// <li>@c kFIRParameterAdNetworkClickID (NSString) (optional)</li>
/// <li>@c kFIRParameterCP1 (NSString) (optional)</li>
/// </ul>
static NSString *const kFIREventCampaignDetails NS_SWIFT_NAME(AnalyticsEventCampaignDetails) =
@"campaign_details";
/// Checkout progress. Params:
///
/// <ul>
/// <li>@c kFIRParameterCheckoutStep (unsigned 64-bit integer as NSNumber)</li>
/// <li>@c kFIRParameterCheckoutOption (NSString) (optional)</li>
/// </ul>
/// <b>This constant has been deprecated.</b>
static NSString *const kFIREventCheckoutProgress NS_SWIFT_NAME(AnalyticsEventCheckoutProgress) =
@"checkout_progress";
/// Earn Virtual Currency event. This event tracks the awarding of virtual currency in your app. Log
/// this along with @c kFIREventSpendVirtualCurrency to better understand your virtual economy.
/// Params:
///
/// <ul>
/// <li>@c kFIRParameterVirtualCurrencyName (NSString)</li>
/// <li>@c kFIRParameterValue (signed 64-bit integer or double as NSNumber)</li>
/// </ul>
static NSString *const kFIREventEarnVirtualCurrency
NS_SWIFT_NAME(AnalyticsEventEarnVirtualCurrency) = @"earn_virtual_currency";
/// E-Commerce Purchase event. This event signifies that an item was purchased by a user. Note:
/// This is different from the in-app purchase event, which is reported automatically for App
/// Store-based apps. Note: If you supply the @c kFIRParameterValue parameter, you must also
/// supply the @c kFIRParameterCurrency parameter so that revenue metrics can be computed
/// accurately. Params:
///
/// <ul>
/// <li>@c kFIRParameterCurrency (NSString) (optional)</li>
/// <li>@c kFIRParameterValue (double as NSNumber) (optional)</li>
/// <li>@c kFIRParameterTransactionID (NSString) (optional)</li>
/// <li>@c kFIRParameterTax (double as NSNumber) (optional)</li>
/// <li>@c kFIRParameterShipping (double as NSNumber) (optional)</li>
/// <li>@c kFIRParameterCoupon (NSString) (optional)</li>
/// <li>@c kFIRParameterLocation (NSString) (optional)</li>
/// <li>@c kFIRParameterStartDate (NSString) (optional)</li>
/// <li>@c kFIRParameterEndDate (NSString) (optional)</li>
/// <li>@c kFIRParameterNumberOfNights (signed 64-bit integer as NSNumber) (optional) for
/// hotel bookings</li>
/// <li>@c kFIRParameterNumberOfRooms (signed 64-bit integer as NSNumber) (optional) for
/// hotel bookings</li>
/// <li>@c kFIRParameterNumberOfPassengers (signed 64-bit integer as NSNumber) (optional)
/// for travel bookings</li>
/// <li>@c kFIRParameterOrigin (NSString) (optional)</li>
/// <li>@c kFIRParameterDestination (NSString) (optional)</li>
/// <li>@c kFIRParameterTravelClass (NSString) (optional) for travel bookings</li>
/// </ul>
/// <b>This constant has been deprecated. Use @c kFIREventPurchase constant instead.</b>
static NSString *const kFIREventEcommercePurchase NS_SWIFT_NAME(AnalyticsEventEcommercePurchase) =
@"ecommerce_purchase";
/// Generate Lead event. Log this event when a lead has been generated in the app to understand the
/// efficacy of your install and re-engagement campaigns. Note: If you supply the
/// @c kFIRParameterValue parameter, you must also supply the @c kFIRParameterCurrency
/// parameter so that revenue metrics can be computed accurately. Params:
///
/// <ul>
/// <li>@c kFIRParameterCurrency (NSString) (optional)</li>
/// <li>@c kFIRParameterValue (double as NSNumber) (optional)</li>
/// </ul>
static NSString *const kFIREventGenerateLead NS_SWIFT_NAME(AnalyticsEventGenerateLead) =
@"generate_lead";
/// Join Group event. Log this event when a user joins a group such as a guild, team or family. Use
/// this event to analyze how popular certain groups or social features are in your app. Params:
///
/// <ul>
/// <li>@c kFIRParameterGroupID (NSString)</li>
/// </ul>
static NSString *const kFIREventJoinGroup NS_SWIFT_NAME(AnalyticsEventJoinGroup) = @"join_group";
/// Level End event. Log this event when the user finishes a level. Params:
///
/// <ul>
/// <li>@c kFIRParameterLevelName (NSString)</li>
/// <li>@c kFIRParameterSuccess (NSString)</li>
/// </ul>
static NSString *const kFIREventLevelEnd NS_SWIFT_NAME(AnalyticsEventLevelEnd) = @"level_end";
/// Level Start event. Log this event when the user starts a new level. Params:
///
/// <ul>
/// <li>@c kFIRParameterLevelName (NSString)</li>
/// </ul>
static NSString *const kFIREventLevelStart NS_SWIFT_NAME(AnalyticsEventLevelStart) = @"level_start";
/// Level Up event. This event signifies that a player has leveled up in your gaming app. It can
/// help you gauge the level distribution of your userbase and help you identify certain levels that
/// are difficult to pass. Params:
///
/// <ul>
/// <li>@c kFIRParameterLevel (signed 64-bit integer as NSNumber)</li>
/// <li>@c kFIRParameterCharacter (NSString) (optional)</li>
/// </ul>
static NSString *const kFIREventLevelUp NS_SWIFT_NAME(AnalyticsEventLevelUp) = @"level_up";
/// Login event. Apps with a login feature can report this event to signify that a user has logged
/// in.
static NSString *const kFIREventLogin NS_SWIFT_NAME(AnalyticsEventLogin) = @"login";
/// Post Score event. Log this event when the user posts a score in your gaming app. This event can
/// help you understand how users are actually performing in your game and it can help you correlate
/// high scores with certain audiences or behaviors. Params:
///
/// <ul>
/// <li>@c kFIRParameterScore (signed 64-bit integer as NSNumber)</li>
/// <li>@c kFIRParameterLevel (signed 64-bit integer as NSNumber) (optional)</li>
/// <li>@c kFIRParameterCharacter (NSString) (optional)</li>
/// </ul>
static NSString *const kFIREventPostScore NS_SWIFT_NAME(AnalyticsEventPostScore) = @"post_score";
/// Present Offer event. This event signifies that the app has presented a purchase offer to a user.
/// Add this event to a funnel with the kFIREventAddToCart and kFIREventEcommercePurchase to gauge
/// your conversion process. Note: If you supply the @c kFIRParameterValue parameter, you must
/// also supply the @c kFIRParameterCurrency parameter so that revenue metrics can be computed
/// accurately. Params:
///
/// <ul>
/// <li>@c kFIRParameterQuantity (signed 64-bit integer as NSNumber)</li>
/// <li>@c kFIRParameterItemID (NSString)</li>
/// <li>@c kFIRParameterItemName (NSString)</li>
/// <li>@c kFIRParameterItemCategory (NSString)</li>
/// <li>@c kFIRParameterItemLocationID (NSString) (optional)</li>
/// <li>@c kFIRParameterPrice (double as NSNumber) (optional)</li>
/// <li>@c kFIRParameterCurrency (NSString) (optional)</li>
/// <li>@c kFIRParameterValue (double as NSNumber) (optional)</li>
/// </ul>
/// <b>This constant has been deprecated. Use @c kFIREventViewPromotion constant instead.</b>
static NSString *const kFIREventPresentOffer NS_SWIFT_NAME(AnalyticsEventPresentOffer) =
@"present_offer";
/// E-Commerce Purchase Refund event. This event signifies that an item purchase was refunded.
/// Note: If you supply the @c kFIRParameterValue parameter, you must also supply the
/// @c kFIRParameterCurrency parameter so that revenue metrics can be computed accurately.
/// Params:
///
/// <ul>
/// <li>@c kFIRParameterCurrency (NSString) (optional)</li>
/// <li>@c kFIRParameterValue (double as NSNumber) (optional)</li>
/// <li>@c kFIRParameterTransactionID (NSString) (optional)</li>
/// </ul>
/// <b>This constant has been deprecated. Use @c kFIREventRefund constant instead.</b>
static NSString *const kFIREventPurchaseRefund NS_SWIFT_NAME(AnalyticsEventPurchaseRefund) =
@"purchase_refund";
/// E-Commerce Remove from Cart event. This event signifies that an item(s) was removed from a cart.
/// Note: If you supply the @c kFIRParameterValue parameter, you must also supply the @c
/// kFIRParameterCurrency parameter so that revenue metrics can be computed accurately. Params:
///
/// <ul>
/// <li>@c kFIRParameterCurrency (NSString) (optional)</li>
/// <li>@c kFIRParameterItems (NSArray) (optional)</li>
/// <li>@c kFIRParameterValue (double as NSNumber) (optional)</li>
/// </ul>
static NSString *const kFIREventRemoveFromCart NS_SWIFT_NAME(AnalyticsEventRemoveFromCart) =
@"remove_from_cart";
/// Screen View event. This event signifies a screen view. Use this when a screen transition occurs.
/// This event can be logged irrespective of whether automatic screen tracking is enabled. Params:
///
/// <ul>
/// <li>@c kFIRParameterScreenClass (NSString) (optional)</li>
/// <li>@c kFIRParameterScreenName (NSString) (optional)</li>
/// </ul>
static NSString *const kFIREventScreenView NS_SWIFT_NAME(AnalyticsEventScreenView) = @"screen_view";
/// Search event. Apps that support search features can use this event to contextualize search
/// operations by supplying the appropriate, corresponding parameters. This event can help you
/// identify the most popular content in your app. Params:
///
/// <ul>
/// <li>@c kFIRParameterSearchTerm (NSString)</li>
/// <li>@c kFIRParameterStartDate (NSString) (optional)</li>
/// <li>@c kFIRParameterEndDate (NSString) (optional)</li>
/// <li>@c kFIRParameterNumberOfNights (signed 64-bit integer as NSNumber) (optional) for
/// hotel bookings</li>
/// <li>@c kFIRParameterNumberOfRooms (signed 64-bit integer as NSNumber) (optional) for
/// hotel bookings</li>
/// <li>@c kFIRParameterNumberOfPassengers (signed 64-bit integer as NSNumber) (optional)
/// for travel bookings</li>
/// <li>@c kFIRParameterOrigin (NSString) (optional)</li>
/// <li>@c kFIRParameterDestination (NSString) (optional)</li>
/// <li>@c kFIRParameterTravelClass (NSString) (optional) for travel bookings</li>
/// </ul>
static NSString *const kFIREventSearch NS_SWIFT_NAME(AnalyticsEventSearch) = @"search";
/// Select Content event. This general purpose event signifies that a user has selected some content
/// of a certain type in an app. The content can be any object in your app. This event can help you
/// identify popular content and categories of content in your app. Params:
///
/// <ul>
/// <li>@c kFIRParameterContentType (NSString)</li>
/// <li>@c kFIRParameterItemID (NSString)</li>
/// </ul>
static NSString *const kFIREventSelectContent NS_SWIFT_NAME(AnalyticsEventSelectContent) =
@"select_content";
/// Set checkout option. Params:
///
/// <ul>
/// <li>@c kFIRParameterCheckoutStep (unsigned 64-bit integer as NSNumber)</li>
/// <li>@c kFIRParameterCheckoutOption (NSString)</li>
/// </ul>
/// <b>This constant has been deprecated.</b>
static NSString *const kFIREventSetCheckoutOption NS_SWIFT_NAME(AnalyticsEventSetCheckoutOption) =
@"set_checkout_option";
/// Share event. Apps with social features can log the Share event to identify the most viral
/// content. Params:
///
/// <ul>
/// <li>@c kFIRParameterContentType (NSString)</li>
/// <li>@c kFIRParameterItemID (NSString)</li>
/// </ul>
static NSString *const kFIREventShare NS_SWIFT_NAME(AnalyticsEventShare) = @"share";
/// Sign Up event. This event indicates that a user has signed up for an account in your app. The
/// parameter signifies the method by which the user signed up. Use this event to understand the
/// different behaviors between logged in and logged out users. Params:
///
/// <ul>
/// <li>@c kFIRParameterSignUpMethod (NSString)</li>
/// </ul>
static NSString *const kFIREventSignUp NS_SWIFT_NAME(AnalyticsEventSignUp) = @"sign_up";
/// Spend Virtual Currency event. This event tracks the sale of virtual goods in your app and can
/// help you identify which virtual goods are the most popular objects of purchase. Params:
///
/// <ul>
/// <li>@c kFIRParameterItemName (NSString)</li>
/// <li>@c kFIRParameterVirtualCurrencyName (NSString)</li>
/// <li>@c kFIRParameterValue (signed 64-bit integer or double as NSNumber)</li>
/// </ul>
static NSString *const kFIREventSpendVirtualCurrency
NS_SWIFT_NAME(AnalyticsEventSpendVirtualCurrency) = @"spend_virtual_currency";
/// Tutorial Begin event. This event signifies the start of the on-boarding process in your app. Use
/// this in a funnel with kFIREventTutorialComplete to understand how many users complete this
/// process and move on to the full app experience.
static NSString *const kFIREventTutorialBegin NS_SWIFT_NAME(AnalyticsEventTutorialBegin) =
@"tutorial_begin";
/// Tutorial End event. Use this event to signify the user's completion of your app's on-boarding
/// process. Add this to a funnel with kFIREventTutorialBegin to gauge the completion rate of your
/// on-boarding process.
static NSString *const kFIREventTutorialComplete NS_SWIFT_NAME(AnalyticsEventTutorialComplete) =
@"tutorial_complete";
/// Unlock Achievement event. Log this event when the user has unlocked an achievement in your
/// game. Since achievements generally represent the breadth of a gaming experience, this event can
/// help you understand how many users are experiencing all that your game has to offer. Params:
///
/// <ul>
/// <li>@c kFIRParameterAchievementID (NSString)</li>
/// </ul>
static NSString *const kFIREventUnlockAchievement NS_SWIFT_NAME(AnalyticsEventUnlockAchievement) =
@"unlock_achievement";
/// View Item event. This event signifies that a user has viewed an item. Use the appropriate
/// parameters to contextualize the event. Use this event to discover the most popular items viewed
/// in your app. Note: If you supply the @c kFIRParameterValue parameter, you must also supply the
/// @c kFIRParameterCurrency parameter so that revenue metrics can be computed accurately. Params:
///
/// <ul>
/// <li>@c kFIRParameterCurrency (NSString) (optional)</li>
/// <li>@c kFIRParameterItems (NSArray) (optional)</li>
/// <li>@c kFIRParameterValue (double as NSNumber) (optional)</li>
/// </ul>
static NSString *const kFIREventViewItem NS_SWIFT_NAME(AnalyticsEventViewItem) = @"view_item";
/// View Item List event. Log this event when a user sees a list of items or offerings. Params:
///
/// <ul>
/// <li>@c kFIRParameterItems (NSArray) (optional)</li>
/// <li>@c kFIRParameterItemListID (NSString) (optional)</li>
/// <li>@c kFIRParameterItemListName (NSString) (optional)</li>
/// </ul>
static NSString *const kFIREventViewItemList NS_SWIFT_NAME(AnalyticsEventViewItemList) =
@"view_item_list";
/// View Search Results event. Log this event when the user has been presented with the results of a
/// search. Params:
///
/// <ul>
/// <li>@c kFIRParameterSearchTerm (NSString)</li>
/// </ul>
static NSString *const kFIREventViewSearchResults NS_SWIFT_NAME(AnalyticsEventViewSearchResults) =
@"view_search_results";
/// Add Shipping Info event. This event signifies that a user has submitted their shipping
/// information. Note: If you supply the @c kFIRParameterValue parameter, you must also supply the
/// @c kFIRParameterCurrency parameter so that revenue metrics can be computed accurately. Params:
///
/// <ul>
/// <li>@c kFIRParameterCoupon (NSString) (optional)</li>
/// <li>@c kFIRParameterCurrency (NSString) (optional)</li>
/// <li>@c kFIRParameterItems (NSArray) (optional)</li>
/// <li>@c kFIRParameterShippingTier (NSString) (optional)</li>
/// <li>@c kFIRParameterValue (double as NSNumber) (optional)</li>
/// </ul>
static NSString *const kFIREventAddShippingInfo NS_SWIFT_NAME(AnalyticsEventAddShippingInfo) =
@"add_shipping_info";
/// E-Commerce Purchase event. This event signifies that an item(s) was purchased by a user. Note:
/// This is different from the in-app purchase event, which is reported automatically for App
/// Store-based apps. Note: If you supply the @c kFIRParameterValue parameter, you must also supply
/// the @c kFIRParameterCurrency parameter so that revenue metrics can be computed accurately.
/// Params:
///
/// <ul>
/// <li>@c kFIRParameterAffiliation (NSString) (optional)</li>
/// <li>@c kFIRParameterCoupon (NSString) (optional)</li>
/// <li>@c kFIRParameterCurrency (NSString) (optional)</li>
/// <li>@c kFIRParameterItems (NSArray) (optional)</li>
/// <li>@c kFIRParameterShipping (double as NSNumber) (optional)</li>
/// <li>@c kFIRParameterTax (double as NSNumber) (optional)</li>
/// <li>@c kFIRParameterTransactionID (NSString) (optional)</li>
/// <li>@c kFIRParameterValue (double as NSNumber) (optional)</li>
/// </ul>
static NSString *const kFIREventPurchase NS_SWIFT_NAME(AnalyticsEventPurchase) = @"purchase";
/// E-Commerce Refund event. This event signifies that a refund was issued. Note: If you supply the
/// @c kFIRParameterValue parameter, you must also supply the @c kFIRParameterCurrency parameter so
/// that revenue metrics can be computed accurately. Params:
///
/// <ul>
/// <li>@c kFIRParameterAffiliation (NSString) (optional)</li>
/// <li>@c kFIRParameterCoupon (NSString) (optional)</li>
/// <li>@c kFIRParameterCurrency (NSString) (optional)</li>
/// <li>@c kFIRParameterItems (NSArray) (optional)</li>
/// <li>@c kFIRParameterShipping (double as NSNumber) (optional)</li>
/// <li>@c kFIRParameterTax (double as NSNumber) (optional)</li>
/// <li>@c kFIRParameterTransactionID (NSString) (optional)</li>
/// <li>@c kFIRParameterValue (double as NSNumber) (optional)</li>
/// </ul>
static NSString *const kFIREventRefund NS_SWIFT_NAME(AnalyticsEventRefund) = @"refund";
/// Select Item event. This event signifies that an item was selected by a user from a list. Use the
/// appropriate parameters to contextualize the event. Use this event to discover the most popular
/// items selected. Params:
///
/// <ul>
/// <li>@c kFIRParameterItems (NSArray) (optional)</li>
/// <li>@c kFIRParameterItemListID (NSString) (optional)</li>
/// <li>@c kFIRParameterItemListName (NSString) (optional)</li>
/// </ul>
static NSString *const kFIREventSelectItem NS_SWIFT_NAME(AnalyticsEventSelectItem) = @"select_item";
/// Select promotion event. This event signifies that a user has selected a promotion offer. Use the
/// appropriate parameters to contextualize the event, such as the item(s) for which the promotion
/// applies. Params:
///
/// <ul>
/// <li>@c kFIRParameterCreativeName (NSString) (optional)</li>
/// <li>@c kFIRParameterCreativeSlot (NSString) (optional)</li>
/// <li>@c kFIRParameterItems (NSArray) (optional)</li>
/// <li>@c kFIRParameterLocationID (NSString) (optional)</li>
/// <li>@c kFIRParameterPromotionID (NSString) (optional)</li>
/// <li>@c kFIRParameterPromotionName (NSString) (optional)</li>
/// </ul>
static NSString *const kFIREventSelectPromotion NS_SWIFT_NAME(AnalyticsEventSelectPromotion) =
@"select_promotion";
/// E-commerce View Cart event. This event signifies that a user has viewed their cart. Use this to
/// analyze your purchase funnel. Note: If you supply the @c kFIRParameterValue parameter, you must
/// also supply the @c kFIRParameterCurrency parameter so that revenue metrics can be computed
/// accurately. Params:
///
/// <ul>
/// <li>@c kFIRParameterCurrency (NSString) (optional)</li>
/// <li>@c kFIRParameterItems (NSArray) (optional)</li>
/// <li>@c kFIRParameterValue (double as NSNumber) (optional)</li>
/// </ul>
static NSString *const kFIREventViewCart NS_SWIFT_NAME(AnalyticsEventViewCart) = @"view_cart";
/// View Promotion event. This event signifies that a promotion was shown to a user. Add this event
/// to a funnel with the @c kFIREventAddToCart and @c kFIREventPurchase to gauge your conversion
/// process. Params:
///
/// <ul>
/// <li>@c kFIRParameterCreativeName (NSString) (optional)</li>
/// <li>@c kFIRParameterCreativeSlot (NSString) (optional)</li>
/// <li>@c kFIRParameterItems (NSArray) (optional)</li>
/// <li>@c kFIRParameterLocationID (NSString) (optional)</li>
/// <li>@c kFIRParameterPromotionID (NSString) (optional)</li>
/// <li>@c kFIRParameterPromotionName (NSString) (optional)</li>
/// </ul>
static NSString *const kFIREventViewPromotion NS_SWIFT_NAME(AnalyticsEventViewPromotion) =
@"view_promotion";
================================================
FILE: Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.xcframework/ios-arm64_armv7/FirebaseAnalytics.framework/Headers/FIRParameterNames.h
================================================
/// @file FIRParameterNames.h
///
/// Predefined event parameter names.
///
/// Params supply information that contextualize Events. You can associate up to 25 unique Params
/// with each Event type. Some Params are suggested below for certain common Events, but you are
/// not limited to these. You may supply extra Params for suggested Events or custom Params for
/// Custom events. Param names can be up to 40 characters long, may only contain alphanumeric
/// characters and underscores ("_"), and must start with an alphabetic character. Param values can
/// be up to 100 characters long. The "firebase_", "google_", and "ga_" prefixes are reserved and
/// should not be used.
#import <Foundation/Foundation.h>
/// Game achievement ID (NSString).
/// <pre>
/// NSDictionary *params = @{
/// kFIRParameterAchievementID : @"10_matches_won",
/// // ...
/// };
/// </pre>
static NSString *const kFIRParameterAchievementID NS_SWIFT_NAME(AnalyticsParameterAchievementID) =
@"achievement_id";
/// The ad format (e.g. Banner, Interstitial, Rewarded, Native, Rewarded Interstitial, Instream).
/// (NSString).
/// <pre>
/// NSDictionary *params = @{
/// kFIRParameterAdFormat : @"Banner",
/// // ...
/// };
/// </pre>
static NSString *const kFIRParameterAdFormat NS_SWIFT_NAME(AnalyticsParameterAdFormat) =
@"ad_format";
/// Ad Network Click ID (NSString). Used for network-specific click IDs which vary in format.
/// <pre>
/// NSDictionary *params = @{
/// kFIRParameterAdNetworkClickID : @"1234567",
/// // ...
/// };
/// </pre>
static NSString *const kFIRParameterAdNetworkClickID
NS_SWIFT_NAME(AnalyticsParameterAdNetworkClickID) = @"aclid";
/// The ad platform (e.g. MoPub, IronSource) (NSString).
/// <pre>
/// NSDictionary *params = @{
/// kFIRParameterAdPlatform : @"MoPub",
/// // ...
/// };
/// </pre>
static NSString *const kFIRParameterAdPlatform NS_SWIFT_NAME(AnalyticsParameterAdPlatform) =
@"ad_platform";
/// The ad source (e.g. AdColony) (NSString).
/// <pre>
/// NSDictionary *params = @{
/// kFIRParameterAdSource : @"AdColony",
/// // ...
/// };
/// </pre>
static NSString *const kFIRParameterAdSource NS_SWIFT_NAME(AnalyticsParameterAdSource) =
@"ad_source";
/// The ad unit name (e.g. Banner_03) (NSString).
/// <pre>
/// NSDictionary *params = @{
/// kFIRParameterAdUnitName : @"Banner_03",
/// // ...
/// };
/// </pre>
static NSString *const kFIRParameterAdUnitName NS_SWIFT_NAME(AnalyticsParameterAdUnitName) =
@"ad_unit_name";
/// A product affiliation to designate a supplying company or brick and mortar store location
/// (NSString). <pre>
/// NSDictionary *params = @{
/// kFIRParameterAffiliation : @"Google Store",
/// // ...
/// };
/// </pre>
static NSString *const kFIRParameterAffiliation NS_SWIFT_NAME(AnalyticsParameterAffiliation) =
@"affiliation";
/// The individual campaign name, slogan, promo code, etc. Some networks have pre-defined macro to
/// capture campaign information, otherwise can be populated by developer. Highly Recommended
/// (NSString).
/// <pre>
/// NSDictionary *params = @{
/// kFIRParameterCampaign : @"winter_promotion",
/// // ...
/// };
/// </pre>
static NSString *const kFIRParameterCampaign NS_SWIFT_NAME(AnalyticsParameterCampaign) =
@"campaign";
/// Character used in game (NSString).
/// <pre>
/// NSDictionary *params = @{
/// kFIRParameterCharacter : @"beat_boss",
/// // ...
/// };
/// </pre>
static NSString *const kFIRParameterCharacter NS_SWIFT_NAME(AnalyticsParameterCharacter) =
@"character";
/// The checkout step (1..N) (unsigned 64-bit integer as NSNumber).
/// <pre>
/// NSDictionary *params = @{
/// kFIRParameterCheckoutStep : @"1",
/// // ...
/// };
/// </pre>
/// <b>This constant has been deprecated.</b>
static NSString *const kFIRParameterCheckoutStep NS_SWIFT_NAME(AnalyticsParameterCheckoutStep) =
@"checkout_step";
/// Some option on a step in an ecommerce flow (NSString).
/// <pre>
/// NSDictionary *params = @{
/// kFIRParameterCheckoutOption : @"Visa",
/// // ...
/// };
/// </pre>
/// <b>This constant has been deprecated.</b>
static NSString *const kFIRParameterCheckoutOption
NS_SWIFT_NAME(AnalyticsParameterCheckoutOption) = @"checkout_option";
/// Campaign content (NSString).
static NSString *const kFIRParameterContent NS_SWIFT_NAME(AnalyticsParameterContent) = @"content";
/// Type of content selected (NSString).
/// <pre>
/// NSDictionary *params = @{
/// kFIRParameterContentType : @"news article",
/// // ...
/// };
/// </pre>
static NSString *const kFIRParameterContentType NS_SWIFT_NAME(AnalyticsParameterContentType) =
@"content_type";
/// Coupon code used for a purchase (NSString).
/// <pre>
/// NSDictionary *params = @{
/// kFIRParameterCoupon : @"SUMMER_FUN",
/// // ...
/// };
/// </pre>
static NSString *const kFIRParameterCoupon NS_SWIFT_NAME(AnalyticsParameterCoupon) = @"coupon";
/// Campaign custom parameter (NSString). Used as a method of capturing custom data in a campaign.
/// Use varies by network.
/// <pre>
/// NSDictionary *params = @{
/// kFIRParameterCP1 : @"custom_data",
/// // ...
/// };
/// </pre>
static NSString *const kFIRParameterCP1 NS_SWIFT_NAME(AnalyticsParameterCP1) = @"cp1";
/// The name of a creative used in a promotional spot (NSString).
/// <pre>
/// NSDictionary *params = @{
/// kFIRParameterCreativeName : @"Summer Sale",
/// // ...
/// };
/// </pre>
static NSString *const kFIRParameterCreativeName NS_SWIFT_NAME(AnalyticsParameterCreativeName) =
@"creative_name";
/// The name of a creative slot (NSString).
/// <pre>
/// NSDictionary *params = @{
/// kFIRParameterCreativeSlot : @"summer_banner2",
/// // ...
/// };
/// </pre>
static NSString *const kFIRParameterCreativeSlot NS_SWIFT_NAME(AnalyticsParameterCreativeSlot) =
@"creative_slot";
/// Currency of the purchase or items associated with the event, in 3-letter
/// <a href="http://en.wikipedia.org/wiki/ISO_4217#Active_codes"> ISO_4217</a> format (NSString).
/// <pre>
/// NSDictionary *params = @{
/// kFIRParameterCurrency : @"USD",
/// // ...
/// };
/// </pre>
static NSString *const kFIRParameterCurrency NS_SWIFT_NAME(AnalyticsParameterCurrency) =
@"currency";
/// Flight or Travel destination (NSString).
/// <pre>
/// NSDictionary *params = @{
/// kFIRParameterDestination : @"Mountain View, CA",
/// // ...
/// };
/// </pre>
static NSString *const kFIRParameterDestination NS_SWIFT_NAME(AnalyticsParameterDestination) =
@"destination";
/// The arrival date, check-out date or rental end date for the item. This should be in
/// YYYY-MM-DD format (NSString).
/// <pre>
/// NSDictionary *params = @{
/// kFIRParameterEndDate : @"2015-09-14",
/// // ...
/// };
/// </pre>
static NSString *const kFIRParameterEndDate NS_SWIFT_NAME(AnalyticsParameterEndDate) = @"end_date";
/// Flight number for travel events (NSString).
/// <pre>
/// NSDictionary *params = @{
/// kFIRParameterFlightNumber : @"ZZ800",
/// // ...
/// };
/// </pre>
static NSString *const kFIRParameterFlightNumber NS_SWIFT_NAME(AnalyticsParameterFlightNumber) =
@"flight_number";
/// Group/clan/guild ID (NSString).
/// <pre>
/// NSDictionary *params = @{
/// kFIRParameterGroupID : @"g1",
/// // ...
/// };
/// </pre>
static NSString *const kFIRParameterGroupID NS_SWIFT_NAME(AnalyticsParameterGroupID) = @"group_id";
/// The index of the item in a list (signed 64-bit integer as NSNumber).
/// <pre>
/// NSDictionary *params = @{
/// kFIRParameterIndex : @(5),
/// // ...
/// };
/// </pre>
static NSString *const kFIRParameterIndex NS_SWIFT_NAME(AnalyticsParameterIndex) = @"index";
/// Item brand (NSString).
/// <pre>
/// NSDictionary *params = @{
/// kFIRParameterItemBrand : @"Google",
/// // ...
/// };
/// </pre>
static NSString *const kFIRParameterItemBrand NS_SWIFT_NAME(AnalyticsParameterItemBrand) =
@"item_brand";
/// Item category (context-specific) (NSString).
/// <pre>
/// NSDictionary *params = @{
/// kFIRParameterItemCategory : @"pants",
/// // ...
/// };
/// </pre>
static NSString *const kFIRParameterItemCategory NS_SWIFT_NAME(AnalyticsParameterItemCategory) =
@"item_category";
/// Item ID (context-specific) (NSString).
/// <pre>
/// NSDictionary *params = @{
/// kFIRParameterItemID : @"SKU_12345",
/// // ...
/// };
/// </pre>
static NSString *const kFIRParameterItemID NS_SWIFT_NAME(AnalyticsParameterItemID) = @"item_id";
/// The Google <a href="https://developers.google.com/places/place-id">Place ID</a> (NSString) that
/// corresponds to the associated item. Alternatively, you can supply your own custom Location ID.
/// <pre>
/// NSDictionary *params = @{
/// kFIRParameterItemLocationID : @"ChIJiyj437sx3YAR9kUWC8QkLzQ",
/// // ...
/// };
/// </pre>
/// <b>This constant has been deprecated. Use @c kFIRParameterLocationID constant instead.</b>
static NSString *const kFIRParameterItemLocationID
NS_SWIFT_NAME(AnalyticsParameterItemLocationID) = @"item_location_id";
/// Item Name (context-specific) (NSString).
/// <pre>
/// NSDictionary *params = @{
/// kFIRParameterItemName : @"jeggings",
/// // ...
/// };
/// </pre>
static NSString *const kFIRParameterItemName NS_SWIFT_NAME(AnalyticsParameterItemName) =
@"item_name";
/// The list in which the item was presented to the user (NSString).
/// <pre>
/// NSDictionary *params = @{
/// kFIRParameterItemList : @"Search Results",
/// // ...
/// };
/// </pre>
/// <b>This constant has been deprecated. Use @c kFIRParameterItemListName constant instead.</b>
static NSString *const kFIRParameterItemList NS_SWIFT_NAME(AnalyticsParameterItemList) =
@"item_list";
/// Item variant (NSString).
/// <pre>
/// NSDictionary *params = @{
/// kFIRParameterItemVariant : @"Black",
/// // ...
/// };
/// </pre>
static NSString *const kFIRParameterItemVariant NS_SWIFT_NAME(AnalyticsParameterItemVariant) =
@"item_variant";
/// Level in game (signed 64-bit integer as NSNumber).
/// <pre>
/// NSDictionary *params = @{
/// kFIRParameterLevel : @(42),
/// // ...
/// };
/// </pre>
static NSString *const kFIRParameterLevel NS_SWIFT_NAME(AnalyticsParameterLevel) = @"level";
/// Location (NSString). The Google <a href="https://developers.google.com/places/place-id">Place ID
/// </a> that corresponds to the associated event. Alternatively, you can supply your own custom
/// Location ID.
/// <pre>
/// NSDictionary *params = @{
/// kFIRParameterLocation : @"ChIJiyj437sx3YAR9kUWC8QkLzQ",
/// // ...
/// };
/// </pre>
static NSString *const kFIRParameterLocation NS_SWIFT_NAME(AnalyticsParameterLocation) =
@"location";
/// The advertising or marketing medium, for example: cpc, banner, email, push. Highly recommended
/// (NSString).
/// <pre>
/// NSDictionary *params = @{
/// kFIRParameterMedium : @"email",
/// // ...
/// };
/// </pre>
static NSString *const kFIRParameterMedium NS_SWIFT_NAME(AnalyticsParameterMedium) = @"medium";
/// Number of nights staying at hotel (signed 64-bit integer as NSNumber).
/// <pre>
/// NSDictionary *params = @{
/// kFIRParameterNumberOfNights : @(3),
/// // ...
/// };
/// </pre>
static NSString *const kFIRParameterNumberOfNights
NS_SWIFT_NAME(AnalyticsParameterNumberOfNights) = @"number_of_nights";
/// Number of passengers traveling (signed 64-bit integer as NSNumber).
/// <pre>
/// NSDictionary *params = @{
/// kFIRParameterNumberOfPassengers : @(11),
/// // ...
/// };
/// </pre>
static NSString *const kFIRParameterNumberOfPassengers
NS_SWIFT_NAME(AnalyticsParameterNumberOfPassengers) = @"number_of_passengers";
/// Number of rooms for travel events (signed 64-bit integer as NSNumber).
/// <pre>
/// NSDictionary *params = @{
/// kFIRParameterNumberOfRooms : @(2),
/// // ...
/// };
/// </pre>
static NSString *const kFIRParameterNumberOfRooms NS_SWIFT_NAME(AnalyticsParameterNumberOfRooms) =
@"number_of_rooms";
/// Flight or Travel origin (NSString).
/// <pre>
/// NSDictionary *params = @{
/// kFIRParameterOrigin : @"Mountain View, CA",
/// // ...
/// };
/// </pre>
static NSString *const kFIRParameterOrigin NS_SWIFT_NAME(AnalyticsParameterOrigin) = @"origin";
/// Purchase price (double as NSNumber).
/// <pre>
/// NSDictionary *params = @{
/// kFIRParameterPrice : @(1.0),
/// kFIRParameterCurrency : @"USD", // e.g. $1.00 USD
/// // ...
/// };
/// </pre>
static NSString *const kFIRParameterPrice NS_SWIFT_NAME(AnalyticsParameterPrice) = @"price";
/// Purchase quantity (signed 64-bit integer as NSNumber).
/// <pre>
/// NSDictionary *params = @{
/// kFIRParameterQuantity : @(1),
/// // ...
/// };
/// </pre>
static NSString *const kFIRParameterQuantity NS_SWIFT_NAME(AnalyticsParameterQuantity) =
@"quantity";
/// Score in game (signed 64-bit integer as NSNumber).
/// <pre>
/// NSDictionary *params = @{
/// kFIRParameterScore : @(4200),
/// // ...
/// };
/// </pre>
static NSString *const kFIRParameterScore NS_SWIFT_NAME(AnalyticsParameterScore) = @"score";
/// Current screen class, such as the class name of the UIViewController, logged with screen_view
/// event and added to every event (NSString). <pre>
/// NSDictionary *params = @{
/// kFIRParameterScreenClass : @"LoginViewController",
/// // ...
/// };
/// </pre>
static NSString *const kFIRParameterScreenClass NS_SWIFT_NAME(AnalyticsParameterScreenClass) =
@"screen_class";
/// Current screen name, such as the name of the UIViewController, logged with screen_view event and
/// added to every event (NSString). <pre>
/// NSDictionary *params = @{
/// kFIRParameterScreenName : @"LoginView",
/// // ...
/// };
/// </pre>
static NSString *const kFIRParameterScreenName NS_SWIFT_NAME(AnalyticsParameterScreenName) =
@"screen_name";
/// The search string/keywords used (NSString).
/// <pre>
/// NSDictionary *params = @{
/// kFIRParameterSearchTerm : @"periodic table",
/// // ...
/// };
/// </pre>
static NSString *const kFIRParameterSearchTerm NS_SWIFT_NAME(AnalyticsParameterSearchTerm) =
@"search_term";
/// Shipping cost associated with a transaction (double as NSNumber).
/// <pre>
/// NSDictionary *params = @{
/// kFIRParameterShipping : @(5.99),
/// kFIRParameterCurrency : @"USD", // e.g. $5.99 USD
/// // ...
/// };
/// </pre>
static NSString *const kFIRParameterShipping NS_SWIFT_NAME(AnalyticsParameterShipping) =
@"shipping";
/// Sign up method (NSString).
/// <pre>
/// NSDictionary *params = @{
/// kFIRParameterSignUpMethod : @"google",
/// // ...
/// };
/// </pre>
///
/// <b>This constant has been deprecated. Use Method constant instead.</b>
static NSString *const kFIRParameterSignUpMethod NS_SWIFT_NAME(AnalyticsParameterSignUpMethod) =
@"sign_up_method";
/// A particular approach used in an operation; for example, "facebook" or "email" in the context
/// of a sign_up or login event. (NSString).
/// <pre>
/// NSDictionary *params = @{
/// kFIRParameterMethod : @"google",
/// // ...
/// };
/// </pre>
static NSString *const kFIRParameterMethod NS_SWIFT_NAME(AnalyticsParameterMethod) = @"method";
/// The origin of your traffic, such as an Ad network (for example, google) or partner (urban
/// airship). Identify the advertiser, site, publication, etc. that is sending traffic to your
/// property. Highly recommended (NSString).
/// <pre>
/// NSDictionary *params = @{
/// kFIRParameterSource : @"InMobi",
/// // ...
/// };
/// </pre>
static NSString *const kFIRParameterSource NS_SWIFT_NAME(AnalyticsParameterSource) = @"source";
/// The departure date, check-in date or rental start date for the item. This should be in
/// YYYY-MM-DD format (NSString).
/// <pre>
/// NSDictionary *params = @{
/// kFIRParameterStartDate : @"2015-09-14",
/// // ...
/// };
/// </pre>
static NSString *const kFIRParameterStartDate NS_SWIFT_NAME(AnalyticsParameterStartDate) =
@"start_date";
/// Tax cost associated with a transaction (double as NSNumber).
/// <pre>
/// NSDictionary *params = @{
/// kFIRParameterTax : @(2.43),
/// kFIRParameterCurrency : @"USD", // e.g. $2.43 USD
/// // ...
/// };
/// </pre>
static NSString *const kFIRParameterTax NS_SWIFT_NAME(AnalyticsParameterTax) = @"tax";
/// If you're manually tagging keyword campaigns, you should use utm_term to specify the keyword
/// (NSString).
/// <pre>
/// NSDictionary *params = @{
/// kFIRParameterTerm : @"game",
/// // ...
/// };
/// </pre>
static NSString *const kFIRParameterTerm NS_SWIFT_NAME(AnalyticsParameterTerm) = @"term";
/// The unique identifier of a transaction (NSString).
/// <pre>
/// NSDictionary *params = @{
/// kFIRParameterTransactionID : @"T12345",
/// // ...
/// };
/// </pre>
static NSString *const kFIRParameterTransactionID NS_SWIFT_NAME(AnalyticsParameterTransactionID) =
@"transaction_id";
/// Travel class (NSString).
/// <pre>
/// NSDictionary *params = @{
/// kFIRParameterTravelClass : @"business",
/// // ...
/// };
/// </pre>
static NSString *const kFIRParameterTravelClass NS_SWIFT_NAME(AnalyticsParameterTravelClass) =
@"travel_class";
/// A context-specific numeric value which is accumulated automatically for each event type. This is
/// a general purpose parameter that is useful for accumulating a key metric that pertains to an
/// event. Examples include revenue, distance, time and points. Value should be specified as signed
/// 64-bit integer or double as NSNumber. Notes: Values for pre-defined currency-related events
/// (such as @c kFIREventAddToCart) should be supplied using double as NSNumber and must be
/// accompanied by a @c kFIRParameterCurrency parameter. The valid range of accumulated values is
/// [-9,223,372,036,854.77, 9,223,372,036,854.77]. Supplying a non-numeric value, omitting the
/// corresponding @c kFIRParameterCurrency parameter, or supplying an invalid
/// <a href="https://goo.gl/qqX3J2">currency code</a> for conversion events will cause that
/// conversion to be omitted from reporting.
/// <pre>
/// NSDictionary *params = @{
/// kFIRParameterValue : @(3.99),
/// kFIRParameterCurrency : @"USD", // e.g. $3.99 USD
/// // ...
/// };
/// </pre>
static NSString *const kFIRParameterValue NS_SWIFT_NAME(AnalyticsParameterValue) = @"value";
/// Name of virtual currency type (NSString).
/// <pre>
/// NSDictionary *params = @{
/// kFIRParameterVirtualCurrencyName : @"virtual_currency_name",
/// // ...
/// };
/// </pre>
static NSString *const kFIRParameterVirtualCurrencyName
NS_SWIFT_NAME(AnalyticsParameterVirtualCurrencyName) = @"virtual_currency_name";
/// The name of a level in a game (NSString).
/// <pre>
/// NSDictionary *params = @{
/// kFIRParameterLevelName : @"room_1",
/// // ...
/// };
/// </pre>
static NSString *const kFIRParameterLevelName NS_SWIFT_NAME(AnalyticsParameterLevelName) =
@"level_name";
/// The result of an operation. Specify 1 to indicate success and 0 to indicate failure (unsigned
/// integer as NSNumber).
/// <pre>
/// NSDictionary *params = @{
/// kFIRParameterSuccess : @(1),
/// // ...
/// };
/// </pre>
static NSString *const kFIRParameterSuccess NS_SWIFT_NAME(AnalyticsParameterSuccess) = @"success";
/// Indicates that the associated event should either extend the current session
/// or start a new session if no session was active when the event was logged.
/// Specify YES to extend the current session or to start a new session; any
/// other value will not extend or start a session.
/// <pre>
/// NSDictionary *params = @{
/// kFIRParameterExtendSession : @YES,
/// // ...
/// };
/// </pre>
static NSString *const kFIRParameterExtendSession NS_SWIFT_NAME(AnalyticsParameterExtendSession) =
@"extend_session";
/// Monetary value of discount associated with a purchase (double as NSNumber).
/// <pre>
/// NSDictionary *params = @{
/// kFIRParameterDiscount : @(2.0),
/// kFIRParameterCurrency : @"USD", // e.g. $2.00 USD
/// // ...
/// };
/// </pre>
static NSString *const kFIRParameterDiscount NS_SWIFT_NAME(AnalyticsParameterDiscount) =
@"discount";
/// Item Category (context-specific) (NSString).
/// <pre>
/// NSDictionary *params = @{
/// kFIRParameterItemCategory2 : @"pants",
/// // ...
/// };
/// </pre>
static NSString *const kFIRParameterItemCategory2 NS_SWIFT_NAME(AnalyticsParameterItemCategory2) =
@"item_category2";
/// Item Category (context-specific) (NSString).
/// <pre>
/// NSDictionary *params = @{
/// kFIRParameterItemCategory3 : @"pants",
/// // ...
/// };
/// </pre>
static NSString *const kFIRParameterItemCategory3 NS_SWIFT_NAME(AnalyticsParameterItemCategory3) =
@"item_category3";
/// Item Category (context-specific) (NSString).
/// <pre>
/// NSDictionary *params = @{
/// kFIRParameterItemCategory4 : @"pants",
/// // ...
/// };
/// </pre>
static NSString *const kFIRParameterItemCategory4 NS_SWIFT_NAME(AnalyticsParameterItemCategory4) =
@"item_category4";
/// Item Category (context-specific) (NSString).
/// <pre>
/// NSDictionary *params = @{
/// kFIRParameterItemCategory5 : @"pants",
/// // ...
/// };
/// </pre>
static NSString *const kFIRParameterItemCategory5 NS_SWIFT_NAME(AnalyticsParameterItemCategory5) =
@"item_category5";
/// The ID of the list in which the item was presented to the user (NSString).
/// <pre>
/// NSDictionary *params = @{
/// kFIRParameterItemListID : @"ABC123",
/// // ...
/// };
/// </pre>
static NSString *const kFIRParameterItemListID NS_SWIFT_NAME(AnalyticsParameterItemListID) =
@"item_list_id";
/// The name of the list in which the item was presented to the user (NSString).
/// <pre>
/// NSDictionary *params = @{
/// kFIRParameterItemListName : @"Related products",
/// // ...
/// };
/// </pre>
static NSString *const kFIRParameterItemListName NS_SWIFT_NAME(AnalyticsParameterItemListName) =
@"item_list_name";
/// The list of items involved in the transaction. (NSArray).
/// <pre>
/// NSDictionary *params = @{
/// kFIRParameterItems : @[
/// @{kFIRParameterItemName : @"jeggings", kFIRParameterItemCategory : @"pants"},
/// @{kFIRParameterItemName : @"boots", kFIRParameterItemCategory : @"shoes"},
/// ],
/// };
/// </pre>
static NSString *const kFIRParameterItems NS_SWIFT_NAME(AnalyticsParameterItems) = @"items";
/// The location associated with the event. Preferred to be the Google
/// <a href="https://developers.google.com/places/place-id">Place ID</a> that corresponds to the
/// associated item but could be overridden to a custom location ID string.(NSString). <pre>
/// NSDictionary *params = @{
/// kFIRParameterLocationID : @"ChIJiyj437sx3YAR9kUWC8QkLzQ",
/// // ...
/// };
/// </pre>
static NSString *const kFIRParameterLocationID NS_SWIFT_NAME(AnalyticsParameterLocationID) =
@"location_id";
/// The chosen method of payment (NSString).
/// <pre>
/// NSDictionary *params = @{
/// kFIRParameterPaymentType : @"Visa",
/// // ...
/// };
/// </pre>
static NSString *const kFIRParameterPaymentType NS_SWIFT_NAME(AnalyticsParameterPaymentType) =
@"payment_type";
/// The ID of a product promotion (NSString).
/// <pre>
/// NSDictionary *params = @{
/// kFIRParameterPromotionID : @"ABC123",
/// // ...
/// };
/// </pre>
static NSString *const kFIRParameterPromotionID NS_SWIFT_NAME(AnalyticsParameterPromotionID) =
@"promotion_id";
/// The name of a product promotion (NSString).
/// <pre>
/// NSDictionary *params = @{
/// kFIRParameterPromotionName : @"Summer Sale",
/// // ...
/// };
/// </pre>
static NSString *const kFIRParameterPromotionName NS_SWIFT_NAME(AnalyticsParameterPromotionName) =
@"promotion_name";
/// The shipping tier (e.g. Ground, Air, Next-day) selected for delivery of the purchased item
/// (NSString).
/// <pre>
/// NSDictionary *params = @{
/// kFIRParameterShippingTier : @"Ground",
/// // ...
/// };
/// </pre>
static NSString *const kFIRParameterShippingTier NS_SWIFT_NAME(AnalyticsParameterShippingTier) =
@"shipping_tier";
================================================
FILE: Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.xcframework/ios-arm64_armv7/FirebaseAnalytics.framework/Headers/FIRUserPropertyNames.h
================================================
/// @file FIRUserPropertyNames.h
///
/// Predefined user property names.
///
/// A UserProperty is an attribute that describes the app-user. By supplying UserProperties, you can
/// later analyze different behaviors of various segments of your userbase. You may supply up to 25
/// unique UserProperties per app, and you can use the name and value of your choosing for each one.
/// UserProperty names can be up to 24 characters long, may only contain alphanumeric characters and
/// underscores ("_"), and must start with an alphabetic character. UserProperty values can be up to
/// 36 characters long. The "firebase_", "google_", and "ga_" prefixes are reserved and should not
/// be used.
#import <Foundation/Foundation.h>
/// The method used to sign in. For example, "google", "facebook" or "twitter".
static NSString *const kFIRUserPropertySignUpMethod
NS_SWIFT_NAME(AnalyticsUserPropertySignUpMethod) = @"sign_up_method";
/// Indicates whether events logged by Google Analytics can be used to personalize ads for the user.
/// Set to "YES" to enable, or "NO" to disable. Default is enabled. See the
/// <a href="https://firebase.google.com/support/guides/disable-analytics">documentation</a> for
/// more details and information about related settings.
///
/// <pre>
/// [FIRAnalytics setUserPropertyString:@"NO"
/// forName:kFIRUserPropertyAllowAdPersonalizationSignals];
/// </pre>
static NSString *const kFIRUserPropertyAllowAdPersonalizationSignals
NS_SWIFT_NAME(AnalyticsUserPropertyAllowAdPersonalizationSignals) = @"allow_personalized_ads";
================================================
FILE: Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.xcframework/ios-arm64_armv7/FirebaseAnalytics.framework/Headers/FirebaseAnalytics.h
================================================
#import "FIRAnalytics+AppDelegate.h"
#import "FIRAnalytics+Consent.h"
#import "FIRAnalytics.h"
#import "FIREventNames.h"
#import "FIRParameterNames.h"
#import "FIRUserPropertyNames.h"
================================================
FILE: Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.xcframework/ios-arm64_armv7/FirebaseAnalytics.framework/Info.plist
================================================
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>CFBundleExecutable</key>
<string>FirebaseAnalytics</string>
<key>CFBundleIdentifier</key>
<string>com.firebase.Firebase-FirebaseAnalytics</string>
<key>CFBundleInfoDictionaryVersion</key>
<string>6.0</string>
<key>CFBundleName</key>
<string>FirebaseAnalytics</string>
<key>CFBundlePackageType</key>
<string>FMWK</string>
<key>CFBundleVersion</key>
<string>8.3.0</string>
<key>DTSDKName</key>
<string>iphonesimulator11.2</string>
</dict>
</plist>
================================================
FILE: Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.xcframework/ios-arm64_armv7/FirebaseAnalytics.framework/Modules/module.modulemap
================================================
framework module FirebaseAnalytics {
umbrella header "FirebaseAnalytics.h"
export *
module * { export * }
link framework "CoreTelephony"
link framework "Foundation"
link framework "Security"
link framework "SystemConfiguration"
link framework "UIKit"
link "c++"
link "sqlite3"
link "z"
}
================================================
FILE: Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.xcframework/ios-arm64_i386_x86_64-simulator/FirebaseAnalytics.framework/Headers/FIRAnalytics+AppDelegate.h
================================================
#import <Foundation/Foundation.h>
#import "FIRAnalytics.h"
NS_ASSUME_NONNULL_BEGIN
/**
* Provides App Delegate handlers to be used in your App Delegate.
*
* To save time integrating Firebase Analytics in an application, Firebase Analytics does not
* require delegation implementation from the AppDelegate. Instead this is automatically done by
* Firebase Analytics. Should you choose instead to delegate manually, you can turn off the App
* Delegate Proxy by adding FirebaseAppDelegateProxyEnabled into your app's Info.plist and setting
* it to NO, and adding the methods in this category to corresponding delegation handlers.
*
* To handle Universal Links, you must return YES in
* [UIApplicationDelegate application:didFinishLaunchingWithOptions:].
*/
@interface FIRAnalytics (AppDelegate)
/**
* Handles events related to a URL session that are waiting to be processed.
*
* For optimal use of Firebase Analytics, call this method from the
* [UIApplicationDelegate application:handleEventsForBackgroundURLSession:completionHandler]
* method of the app delegate in your app.
*
* @param identifier The identifier of the URL session requiring attention.
* @param completionHandler The completion handler to call when you finish processing the events.
* Calling this completion handler lets the system know that your app's user interface is
* updated and a new snapshot can be taken.
*/
+ (void)handleEventsForBackgroundURLSession:(NSString *)identifier
completionHandler:(nullable void (^)(void))completionHandler;
/**
* Handles the event when the app is launched by a URL.
*
* Call this method from [UIApplicationDelegate application:openURL:options:] (on iOS 9.0 and
* above), or [UIApplicationDelegate application:openURL:sourceApplication:annotation:] (on
* iOS 8.x and below) in your app.
*
* @param url The URL resource to open. This resource can be a network resource or a file.
*/
+ (void)handleOpenURL:(NSURL *)url;
/**
* Handles the event when the app receives data associated with user activity that includes a
* Universal Link (on iOS 9.0 and above).
*
* Call this method from [UIApplication continueUserActivity:restorationHandler:] in your app
* delegate (on iOS 9.0 and above).
*
* @param userActivity The activity object containing the data associated with the task the user
* was performing.
*/
+ (void)handleUserActivity:(id)userActivity;
@end
NS_ASSUME_NONNULL_END
================================================
FILE: Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.xcframework/ios-arm64_i386_x86_64-simulator/FirebaseAnalytics.framework/Headers/FIRAnalytics+Consent.h
================================================
#import <Foundation/Foundation.h>
#import "FIRAnalytics.h"
NS_ASSUME_NONNULL_BEGIN
/// The type of consent to set. Supported consent types are `ConsentType.adStorage` and
/// `ConsentType.analyticsStorage`. Omitting a type retains its previous status.
typedef NSString *FIRConsentType NS_TYPED_ENUM NS_SWIFT_NAME(ConsentType);
extern FIRConsentType const FIRConsentTypeAdStorage;
extern FIRConsentType const FIRConsentTypeAnalyticsStorage;
/// The status value of the consent type. Supported statuses are `ConsentStatus.granted` and
/// `ConsentStatus.denied`.
typedef NSString *FIRConsentStatus NS_TYPED_ENUM NS_SWIFT_NAME(ConsentStatus);
extern FIRConsentStatus const FIRConsentStatusDenied;
extern FIRConsentStatus const FIRConsentStatusGranted;
/// Sets the applicable end user consent state.
@interface FIRAnalytics (Consent)
/// Sets the applicable end user consent state (e.g. for device identifiers) for this app on this
/// device. Use the consent settings to specify individual consent type values. Settings are
/// persisted across app sessions. By default consent types are set to `ConsentStatus.granted`.
///
/// @param consentSettings An NSDictionary of consent types. Supported consent type keys are
/// `ConsentType.adStorage` and `ConsentType.analyticsStorage`. Valid values are
/// `ConsentStatus.granted` and `ConsentStatus.denied`.
+ (void)setConsent:(NSDictionary<FIRConsentType, FIRConsentStatus> *)consentSettings;
@end
NS_ASSUME_NONNULL_END
================================================
FILE: Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.xcframework/ios-arm64_i386_x86_64-simulator/FirebaseAnalytics.framework/Headers/FIRAnalytics.h
================================================
#import <Foundation/Foundation.h>
#import "FIREventNames.h"
#import "FIRParameterNames.h"
#import "FIRUserPropertyNames.h"
NS_ASSUME_NONNULL_BEGIN
/// The top level Firebase Analytics singleton that provides methods for logging events and setting
/// user properties. See <a href="http://goo.gl/gz8SLz">the developer guides</a> for general
/// information on using Firebase Analytics in your apps.
///
/// @note The Analytics SDK uses SQLite to persist events and other app-specific data. Calling
/// certain thread-unsafe global SQLite methods like `sqlite3_shutdown()` can result in
/// unexpected crashes at runtime.
NS_SWIFT_NAME(Analytics)
@interface FIRAnalytics : NSObject
/// Logs an app event. The event can have up to 25 parameters. Events with the same name must have
/// the same parameters. Up to 500 event names are supported. Using predefined events and/or
/// parameters is recommended for optimal reporting.
///
/// The following event names are reserved and cannot be used:
/// <ul>
/// <li>ad_activeview</li>
/// <li>ad_click</li>
/// <li>ad_exposure</li>
/// <li>ad_query</li>
/// <li>ad_reward</li>
/// <li>adunit_exposure</li>
/// <li>app_background</li>
/// <li>app_clear_data</li>
/// <li>app_exception</li>
/// <li>app_remove</li>
/// <li>app_store_refund</li>
/// <li>app_store_subscription_cancel</li>
/// <li>app_store_subscription_convert</li>
/// <li>app_store_subscription_renew</li>
/// <li>app_update</li>
/// <li>app_upgrade</li>
/// <li>dynamic_link_app_open</li>
/// <li>dynamic_link_app_update</li>
/// <li>dynamic_link_first_open</li>
/// <li>error</li>
/// <li>firebase_campaign</li>
/// <li>first_open</li>
/// <li>first_visit</li>
/// <li>in_app_purchase</li>
/// <li>notification_dismiss</li>
/// <li>notification_foreground</li>
/// <li>notification_open</li>
/// <li>notification_receive</li>
/// <li>os_update</li>
/// <li>session_start</li>
/// <li>session_start_with_rollout</li>
/// <li>user_engagement</li>
/// </ul>
///
/// @param name The name of the event. Should contain 1 to 40 alphanumeric characters or
/// underscores. The name must start with an alphabetic character. Some event names are
/// reserved. See FIREventNames.h for the list of reserved event names. The "firebase_",
/// "google_", and "ga_" prefixes are reserved and should not be used. Note that event names are
/// case-sensitive and that logging two events whose names differ only in case will result in
/// two distinct events. To manually log screen view events, use the `screen_view` event name.
/// @param parameters The dictionary of event parameters. Passing nil indicates that the event has
/// no parameters. Parameter names can be up to 40 characters long and must start with an
/// alphabetic character and contain only alphanumeric characters and underscores. Only NSString
/// and NSNumber (signed 64-bit integer and 64-bit floating-point number) parameter types are
/// supported. NSString parameter values can be up to 100 characters long. The "firebase_",
/// "google_", and "ga_" prefixes are reserved and should not be used for parameter names.
+ (void)logEventWithName:(NSString *)name
parameters:(nullable NSDictionary<NSString *, id> *)parameters
NS_SWIFT_NAME(logEvent(_:parameters:));
/// Sets a user property to a given value. Up to 25 user property names are supported. Once set,
/// user property values persist throughout the app lifecycle and across sessions.
///
/// The following user property names are reserved and cannot be used:
/// <ul>
/// <li>first_open_time</li>
/// <li>last_deep_link_referrer</li>
/// <li>user_id</li>
/// </ul>
///
/// @param value The value of the user property. Values can be up to 36 characters long. Setting the
/// value to nil removes the user property.
/// @param name The name of the user property to set. Should contain 1 to 24 alphanumeric characters
/// or underscores and must start with an alphabetic character. The "firebase_", "google_", and
/// "ga_" prefixes are reserved and should not be used for user property names.
+ (void)setUserPropertyString:(nullable NSString *)value forName:(NSString *)name
NS_SWIFT_NAME(setUserProperty(_:forName:));
/// Sets the user ID property. This feature must be used in accordance with
/// <a href="https://www.google.com/policies/privacy">Google's Privacy Policy</a>
///
/// @param userID The user ID to ascribe to the user of this app on this device, which must be
/// non-empty and no more than 256 characters long. Setting userID to nil removes the user ID.
+ (void)setUserID:(nullable NSString *)userID;
/// Sets whether analytics collection is enabled for this app on this device. This setting is
/// persisted across app sessions. By default it is enabled.
///
/// @param analyticsCollectionEnabled A flag that enables or disables Analytics collection.
+ (void)setAnalyticsCollectionEnabled:(BOOL)analyticsCollectionEnabled;
/// Sets the interval of inactivity in seconds that terminates the current session. The default
/// value is 1800 seconds (30 minutes).
///
/// @param sessionTimeoutInterval The custom time of inactivity in seconds before the current
/// session terminates.
+ (void)setSessionTimeoutInterval:(NSTimeInterval)sessionTimeoutInterval;
/// Returns the unique ID for this instance of the application or nil if
/// `ConsentType.analyticsStorage` has been set to `ConsentStatus.denied`.
///
/// @see `FIRAnalytics+Consent.h`
+ (nullable NSString *)appInstanceID;
/// Clears all analytics data for this instance from the device and resets the app instance ID.
/// FIRAnalyticsConfiguration values will be reset to the default values.
+ (void)resetAnalyticsData;
/// Adds parameters that will be set on every event logged from the SDK, including automatic ones.
/// The values passed in the parameters dictionary will be added to the dictionary of default event
/// parameters. These parameters persist across app runs. They are of lower precedence than event
/// parameters, so if an event parameter and a parameter set using this API have the same name, the
/// value of the event parameter will be used. The same limitations on event parameters apply to
/// default event parameters.
///
/// @param parameters Parameters to be added to the dictionary of parameters added to every event.
/// They will be added to the dictionary of default event parameters, replacing any existing
/// parameter with the same name. Valid parameters are NSString and NSNumber (signed 64-bit
/// integer and 64-bit floating-point number). Setting a key's value to [NSNull null] will clear
/// that parameter. Passing in a nil dictionary will clear all parameters.
+ (void)setDefaultEventParameters:(nullable NSDictionary<NSString *, id> *)parameters;
/// Unavailable.
- (instancetype)init NS_UNAVAILABLE;
@end
NS_ASSUME_NONNULL_END
================================================
FILE: Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.xcframework/ios-arm64_i386_x86_64-simulator/FirebaseAnalytics.framework/Headers/FIREventNames.h
================================================
/// @file FIREventNames.h
///
/// Predefined event names.
///
/// An Event is an important occurrence in your app that you want to measure. You can report up to
/// 500 different types of Events per app and you can associate up to 25 unique parameters with each
/// Event type. Some common events are suggested below, but you may also choose to specify custom
/// Event types that are associated with your specific app. Each event type is identified by a
/// unique name. Event names can be up to 40 characters long, may only contain alphanumeric
/// characters and underscores ("_"), and must start with an alphabetic character. The "firebase_",
/// "google_", and "ga_" prefixes are reserved and should not be used.
#import <Foundation/Foundation.h>
/// Add Payment Info event. This event signifies that a user has submitted their payment
/// information. Note: If you supply the @c kFIRParameterValue parameter, you must also supply the
/// @c kFIRParameterCurrency parameter so that revenue metrics can be computed accurately. Params:
///
/// <ul>
/// <li>@c kFIRParameterCoupon (NSString) (optional)</li>
/// <li>@c kFIRParameterCurrency (NSString) (optional)</li>
/// <li>@c kFIRParameterItems (NSArray) (optional)</li>
/// <li>@c kFIRParameterPaymentType (NSString) (optional)</li>
/// <li>@c kFIRParameterValue (double as NSNumber) (optional)</li>
/// </ul>
static NSString *const kFIREventAddPaymentInfo NS_SWIFT_NAME(AnalyticsEventAddPaymentInfo) =
@"add_payment_info";
/// E-Commerce Add To Cart event. This event signifies that an item(s) was added to a cart for
/// purchase. Add this event to a funnel with @c kFIREventPurchase to gauge the effectiveness of
/// your checkout process. Note: If you supply the @c kFIRParameterValue parameter, you must also
/// supply the @c kFIRParameterCurrency parameter so that revenue metrics can be computed
/// accurately. Params:
///
/// <ul>
/// <li>@c kFIRParameterCurrency (NSString) (optional)</li>
/// <li>@c kFIRParameterItems (NSArray) (optional)</li>
/// <li>@c kFIRParameterValue (double as NSNumber) (optional)</li>
/// </ul>
static NSString *const kFIREventAddToCart NS_SWIFT_NAME(AnalyticsEventAddToCart) = @"add_to_cart";
/// E-Commerce Add To Wishlist event. This event signifies that an item was added to a wishlist. Use
/// this event to identify popular gift items. Note: If you supply the @c kFIRParameterValue
/// parameter, you must also supply the @c kFIRParameterCurrency parameter so that revenue metrics
/// can be computed accurately. Params:
///
/// <ul>
/// <li>@c kFIRParameterCurrency (NSString) (optional)</li>
/// <li>@c kFIRParameterItems (NSArray) (optional)</li>
/// <li>@c kFIRParameterValue (double as NSNumber) (optional)</li>
/// </ul>
static NSString *const kFIREventAddToWishlist NS_SWIFT_NAME(AnalyticsEventAddToWishlist) =
@"add_to_wishlist";
/// Ad Impression event. This event signifies when a user sees an ad impression. Note: If you supply
/// the @c kFIRParameterValue parameter, you must also supply the @c kFIRParameterCurrency parameter
/// so that revenue metrics can be computed accurately. Params:
///
/// <ul>
/// <li>@c kFIRParameterAdPlatform (NSString) (optional)</li>
/// <li>@c kFIRParameterAdFormat (NSString) (optional)</li>
/// <li>@c kFIRParameterAdSource (NSString) (optional)</li>
/// <li>@c kFIRParameterAdUnitName (NSString) (optional)</li>
/// <li>@c kFIRParameterCurrency (NSString) (optional)</li>
/// <li>@c kFIRParameterValue (double as NSNumber) (optional)</li>
/// </ul>
static NSString *const kFIREventAdImpression NS_SWIFT_NAME(AnalyticsEventAdImpression) =
@"ad_impression";
/// App Open event. By logging this event when an App becomes active, developers can understand how
/// often users leave and return during the course of a Session. Although Sessions are automatically
/// reported, this event can provide further clarification around the continuous engagement of
/// app-users.
static NSString *const kFIREventAppOpen NS_SWIFT_NAME(AnalyticsEventAppOpen) = @"app_open";
/// E-Commerce Begin Checkout event. This event signifies that a user has begun the process of
/// checking out. Add this event to a funnel with your @c kFIREventPurchase event to gauge the
/// effectiveness of your checkout process. Note: If you supply the @c kFIRParameterValue parameter,
/// you must also supply the @c kFIRParameterCurrency parameter so that revenue metrics can be
/// computed accurately. Params:
///
/// <ul>
/// <li>@c kFIRParameterCoupon (NSString) (optional)</li>
/// <li>@c kFIRParameterCurrency (NSString) (optional)</li>
/// <li>@c kFIRParameterItems (NSArray) (optional)</li>
/// <li>@c kFIRParameterValue (double as NSNumber) (optional)</li>
/// </ul>
static NSString *const kFIREventBeginCheckout NS_SWIFT_NAME(AnalyticsEventBeginCheckout) =
@"begin_checkout";
/// Campaign Detail event. Log this event to supply the referral details of a re-engagement
/// campaign. Note: you must supply at least one of the required parameters kFIRParameterSource,
/// kFIRParameterMedium or kFIRParameterCampaign. Params:
///
/// <ul>
/// <li>@c kFIRParameterSource (NSString)</li>
/// <li>@c kFIRParameterMedium (NSString)</li>
/// <li>@c kFIRParameterCampaign (NSString)</li>
/// <li>@c kFIRParameterTerm (NSString) (optional)</li>
/// <li>@c kFIRParameterContent (NSString) (optional)</li>
/// <li>@c kFIRParameterAdNetworkClickID (NSString) (optional)</li>
/// <li>@c kFIRParameterCP1 (NSString) (optional)</li>
/// </ul>
static NSString *const kFIREventCampaignDetails NS_SWIFT_NAME(AnalyticsEventCampaignDetails) =
@"campaign_details";
/// Checkout progress. Params:
///
/// <ul>
/// <li>@c kFIRParameterCheckoutStep (unsigned 64-bit integer as NSNumber)</li>
/// <li>@c kFIRParameterCheckoutOption (NSString) (optional)</li>
/// </ul>
/// <b>This constant has been deprecated.</b>
static NSString *const kFIREventCheckoutProgress NS_SWIFT_NAME(AnalyticsEventCheckoutProgress) =
@"checkout_progress";
/// Earn Virtual Currency event. This event tracks the awarding of virtual currency in your app. Log
/// this along with @c kFIREventSpendVirtualCurrency to better understand your virtual economy.
/// Params:
///
/// <ul>
/// <li>@c kFIRParameterVirtualCurrencyName (NSString)</li>
/// <li>@c kFIRParameterValue (signed 64-bit integer or double as NSNumber)</li>
/// </ul>
static NSString *const kFIREventEarnVirtualCurrency
NS_SWIFT_NAME(AnalyticsEventEarnVirtualCurrency) = @"earn_virtual_currency";
/// E-Commerce Purchase event. This event signifies that an item was purchased by a user. Note:
/// This is different from the in-app purchase event, which is reported automatically for App
/// Store-based apps. Note: If you supply the @c kFIRParameterValue parameter, you must also
/// supply the @c kFIRParameterCurrency parameter so that revenue metrics can be computed
/// accurately. Params:
///
/// <ul>
/// <li>@c kFIRParameterCurrency (NSString) (optional)</li>
/// <li>@c kFIRParameterValue (double as NSNumber) (optional)</li>
/// <li>@c kFIRParameterTransactionID (NSString) (optional)</li>
/// <li>@c kFIRParameterTax (double as NSNumber) (optional)</li>
/// <li>@c kFIRParameterShipping (double as NSNumber) (optional)</li>
/// <li>@c kFIRParameterCoupon (NSString) (optional)</li>
/// <li>@c kFIRParameterLocation (NSString) (optional)</li>
/// <li>@c kFIRParameterStartDate (NSString) (optional)</li>
/// <li>@c kFIRParameterEndDate (NSString) (optional)</li>
/// <li>@c kFIRParameterNumberOfNights (signed 64-bit integer as NSNumber) (optional) for
/// hotel bookings</li>
/// <li>@c kFIRParameterNumberOfRooms (signed 64-bit integer as NSNumber) (optional) for
/// hotel bookings</li>
/// <li>@c kFIRParameterNumberOfPassengers (signed 64-bit integer as NSNumber) (optional)
/// for travel bookings</li>
/// <li>@c kFIRParameterOrigin (NSString) (optional)</li>
/// <li>@c kFIRParameterDestination (NSString) (optional)</li>
/// <li>@c kFIRParameterTravelClass (NSString) (optional) for travel bookings</li>
/// </ul>
/// <b>This constant has been deprecated. Use @c kFIREventPurchase constant instead.</b>
static NSString *const kFIREventEcommercePurchase NS_SWIFT_NAME(AnalyticsEventEcommercePurchase) =
@"ecommerce_purchase";
/// Generate Lead event. Log this event when a lead has been generated in the app to understand the
/// efficacy of your install and re-engagement campaigns. Note: If you supply the
/// @c kFIRParameterValue parameter, you must also supply the @c kFIRParameterCurrency
/// parameter so that revenue metrics can be computed accurately. Params:
///
/// <ul>
/// <li>@c kFIRParameterCurrency (NSString) (optional)</li>
/// <li>@c kFIRParameterValue (double as NSNumber) (optional)</li>
/// </ul>
static NSString *const kFIREventGenerateLead NS_SWIFT_NAME(AnalyticsEventGenerateLead) =
@"generate_lead";
/// Join Group event. Log this event when a user joins a group such as a guild, team or family. Use
/// this event to analyze how popular certain groups or social features are in your app. Params:
///
/// <ul>
/// <li>@c kFIRParameterGroupID (NSString)</li>
/// </ul>
static NSString *const kFIREventJoinGroup NS_SWIFT_NAME(AnalyticsEventJoinGroup) = @"join_group";
/// Level End event. Log this event when the user finishes a level. Params:
///
/// <ul>
/// <li>@c kFIRParameterLevelName (NSString)</li>
/// <li>@c kFIRParameterSuccess (NSString)</li>
/// </ul>
static NSString *const kFIREventLevelEnd NS_SWIFT_NAME(AnalyticsEventLevelEnd) = @"level_end";
/// Level Start event. Log this event when the user starts a new level. Params:
///
/// <ul>
/// <li>@c kFIRParameterLevelName (NSString)</li>
/// </ul>
static NSString *const kFIREventLevelStart NS_SWIFT_NAME(AnalyticsEventLevelStart) = @"level_start";
/// Level Up event. This event signifies that a player has leveled up in your gaming app. It can
/// help you gauge the level distribution of your userbase and help you identify certain levels that
/// are difficult to pass. Params:
///
/// <ul>
/// <li>@c kFIRParameterLevel (signed 64-bit integer as NSNumber)</li>
/// <li>@c kFIRParameterCharacter (NSString) (optional)</li>
/// </ul>
static NSString *const kFIREventLevelUp NS_SWIFT_NAME(AnalyticsEventLevelUp) = @"level_up";
/// Login event. Apps with a login feature can report this event to signify that a user has logged
/// in.
static NSString *const kFIREventLogin NS_SWIFT_NAME(AnalyticsEventLogin) = @"login";
/// Post Score event. Log this event when the user posts a score in your gaming app. This event can
/// help you understand how users are actually performing in your game and it can help you correlate
/// high scores with certain audiences or behaviors. Params:
///
/// <ul>
/// <li>@c kFIRParameterScore (signed 64-bit integer as NSNumber)</li>
/// <li>@c kFIRParameterLevel (signed 64-bit integer as NSNumber) (optional)</li>
/// <li>@c kFIRParameterCharacter (NSString) (optional)</li>
/// </ul>
static NSString *const kFIREventPostScore NS_SWIFT_NAME(AnalyticsEventPostScore) = @"post_score";
/// Present Offer event. This event signifies that the app has presented a purchase offer to a user.
/// Add this event to a funnel with the kFIREventAddToCart and kFIREventEcommercePurchase to gauge
/// your conversion process. Note: If you supply the @c kFIRParameterValue parameter, you must
/// also supply the @c kFIRParameterCurrency parameter so that revenue metrics can be computed
/// accurately. Params:
///
/// <ul>
/// <li>@c kFIRParameterQuantity (signed 64-bit integer as NSNumber)</li>
/// <li>@c kFIRParameterItemID (NSString)</li>
/// <li>@c kFIRParameterItemName (NSString)</li>
/// <li>@c kFIRParameterItemCategory (NSString)</li>
/// <li>@c kFIRParameterItemLocationID (NSString) (optional)</li>
/// <li>@c kFIRParameterPrice (double as NSNumber) (optional)</li>
/// <li>@c kFIRParameterCurrency (NSString) (optional)</li>
/// <li>@c kFIRParameterValue (double as NSNumber) (optional)</li>
/// </ul>
/// <b>This constant has been deprecated. Use @c kFIREventViewPromotion constant instead.</b>
static NSString *const kFIREventPresentOffer NS_SWIFT_NAME(AnalyticsEventPresentOffer) =
@"present_offer";
/// E-Commerce Purchase Refund event. This event signifies that an item purchase was refunded.
/// Note: If you supply the @c kFIRParameterValue parameter, you must also supply the
/// @c kFIRParameterCurrency parameter so that revenue metrics can be computed accurately.
/// Params:
///
/// <ul>
/// <li>@c kFIRParameterCurrency (NSString) (optional)</li>
/// <li>@c kFIRParameterValue (double as NSNumber) (optional)</li>
/// <li>@c kFIRParameterTransactionID (NSString) (optional)</li>
/// </ul>
/// <b>This constant has been deprecated. Use @c kFIREventRefund constant instead.</b>
static NSString *const kFIREventPurchaseRefund NS_SWIFT_NAME(AnalyticsEventPurchaseRefund) =
@"purchase_refund";
/// E-Commerce Remove from Cart event. This event signifies that an item(s) was removed from a cart.
/// Note: If you supply the @c kFIRParameterValue parameter, you must also supply the @c
/// kFIRParameterCurrency parameter so that revenue metrics can be computed accurately. Params:
///
/// <ul>
/// <li>@c kFIRParameterCurrency (NSString) (optional)</li>
/// <li>@c kFIRParameterItems (NSArray) (optional)</li>
/// <li>@c kFIRParameterValue (double as NSNumber) (optional)</li>
/// </ul>
static NSString *const kFIREventRemoveFromCart NS_SWIFT_NAME(AnalyticsEventRemoveFromCart) =
@"remove_from_cart";
/// Screen View event. This event signifies a screen view. Use this when a screen transition occurs.
/// This event can be logged irrespective of whether automatic screen tracking is enabled. Params:
///
/// <ul>
/// <li>@c kFIRParameterScreenClass (NSString) (optional)</li>
/// <li>@c kFIRParameterScreenName (NSString) (optional)</li>
/// </ul>
static NSString *const kFIREventScreenView NS_SWIFT_NAME(AnalyticsEventScreenView) = @"screen_view";
/// Search event. Apps that support search features can use this event to contextualize search
/// operations by supplying the appropriate, corresponding parameters. This event can help you
/// identify the most popular content in your app. Params:
///
/// <ul>
/// <li>@c kFIRParameterSearchTerm (NSString)</li>
/// <li>@c kFIRParameterStartDate (NSString) (optional)</li>
/// <li>@c kFIRParameterEndDate (NSString) (optional)</li>
/// <li>@c kFIRParameterNumberOfNights (signed 64-bit integer as NSNumber) (optional) for
/// hotel bookings</li>
/// <li>@c kFIRParameterNumberOfRooms (signed 64-bit integer as NSNumber) (optional) for
/// hotel bookings</li>
/// <li>@c kFIRParameterNumberOfPassengers (signed 64-bit integer as NSNumber) (optional)
/// for travel bookings</li>
/// <li>@c kFIRParameterOrigin (NSString) (optional)</li>
/// <li>@c kFIRParameterDestination (NSString) (optional)</li>
/// <li>@c kFIRParameterTravelClass (NSString) (optional) for travel bookings</li>
/// </ul>
static NSString *const kFIREventSearch NS_SWIFT_NAME(AnalyticsEventSearch) = @"search";
/// Select Content event. This general purpose event signifies that a user has selected some content
/// of a certain type in an app. The content can be any object in your app. This event can help you
/// identify popular content and categories of content in your app. Params:
///
/// <ul>
/// <li>@c kFIRParameterContentType (NSString)</li>
/// <li>@c kFIRParameterItemID (NSString)</li>
/// </ul>
static NSString *const kFIREventSelectContent NS_SWIFT_NAME(AnalyticsEventSelectContent) =
@"select_content";
/// Set checkout option. Params:
///
/// <ul>
/// <li>@c kFIRParameterCheckoutStep (unsigned 64-bit integer as NSNumber)</li>
/// <li>@c kFIRParameterCheckoutOption (NSString)</li>
/// </ul>
/// <b>This constant has been deprecated.</b>
static NSString *const kFIREventSetCheckoutOption NS_SWIFT_NAME(AnalyticsEventSetCheckoutOption) =
@"set_checkout_option";
/// Share event. Apps with social features can log the Share event to identify the most viral
/// content. Params:
///
/// <ul>
/// <li>@c kFIRParameterContentType (NSString)</li>
/// <li>@c kFIRParameterItemID (NSString)</li>
/// </ul>
static NSString *const kFIREventShare NS_SWIFT_NAME(AnalyticsEventShare) = @"share";
/// Sign Up event. This event indicates that a user has signed up for an account in your app. The
/// parameter signifies the method by which the user signed up. Use this event to understand the
/// different behaviors between logged in and logged out users. Params:
///
/// <ul>
/// <li>@c kFIRParameterSignUpMethod (NSString)</li>
/// </ul>
static NSString *const kFIREventSignUp NS_SWIFT_NAME(AnalyticsEventSignUp) = @"sign_up";
/// Spend Virtual Currency event. This event tracks the sale of virtual goods in your app and can
/// help you identify which virtual goods are the most popular objects of purchase. Params:
///
/// <ul>
/// <li>@c kFIRParameterItemName (NSString)</li>
/// <li>@c kFIRParameterVirtualCurrencyName (NSString)</li>
/// <li>@c kFIRParameterValue (signed 64-bit integer or double as NSNumber)</li>
/// </ul>
static NSString *const kFIREventSpendVirtualCurrency
NS_SWIFT_NAME(AnalyticsEventSpendVirtualCurrency) = @"spend_virtual_currency";
/// Tutorial Begin event. This event signifies the start of the on-boarding process in your app. Use
/// this in a funnel with kFIREventTutorialComplete to understand how many users complete this
/// process and move on to the full app experience.
static NSString *const kFIREventTutorialBegin NS_SWIFT_NAME(AnalyticsEventTutorialBegin) =
@"tutorial_begin";
/// Tutorial End event. Use this event to signify the user's completion of your app's on-boarding
/// process. Add this to a funnel with kFIREventTutorialBegin to gauge the completion rate of your
/// on-boarding process.
static NSString *const kFIREventTutorialComplete NS_SWIFT_NAME(AnalyticsEventTutorialComplete) =
@"tutorial_complete";
/// Unlock Achievement event. Log this event when the user has unlocked an achievement in your
/// game. Since achievements generally represent the breadth of a gaming experience, this event can
/// help you understand how many users are experiencing all that your game has to offer. Params:
///
/// <ul>
/// <li>@c kFIRParameterAchievementID (NSString)</li>
/// </ul>
static NSString *const kFIREventUnlockAchievement NS_SWIFT_NAME(AnalyticsEventUnlockAchievement) =
@"unlock_achievement";
/// View Item event. This event signifies that a user has viewed an item. Use the appropriate
/// parameters to contextualize the event. Use this event to discover the most popular items viewed
/// in your app. Note: If you supply the @c kFIRParameterValue parameter, you must also supply the
/// @c kFIRParameterCurrency parameter so that revenue metrics can be computed accurately. Params:
///
/// <ul>
/// <li>@c kFIRParameterCurrency (NSString) (optional)</li>
/// <li>@c kFIRParameterItems (NSArray) (optional)</li>
/// <li>@c kFIRParameterValue (double as NSNumber) (optional)</li>
/// </ul>
static NSString *const kFIREventViewItem NS_SWIFT_NAME(AnalyticsEventViewItem) = @"view_item";
/// View Item List event. Log this event when a user sees a list of items or offerings. Params:
///
/// <ul>
/// <li>@c kFIRParameterItems (NSArray) (optional)</li>
/// <li>@c kFIRParameterItemListID (NSString) (optional)</li>
/// <li>@c kFIRParameterItemListName (NSString) (optional)</li>
/// </ul>
static NSString *const kFIREventViewItemList NS_SWIFT_NAME(AnalyticsEventViewItemList) =
@"view_item_list";
/// View Search Results event. Log this event when the user has been presented with the results of a
/// search. Params:
///
/// <ul>
/// <li>@c kFIRParameterSearchTerm (NSString)</li>
/// </ul>
static NSString *const kFIREventViewSearchResults NS_SWIFT_NAME(AnalyticsEventViewSearchResults) =
@"view_search_results";
/// Add Shipping Info event. This event signifies that a user has submitted their shipping
/// information. Note: If you supply the @c kFIRParameterValue parameter, you must also supply the
/// @c kFIRParameterCurrency parameter so that revenue metrics can be computed accurately. Params:
///
/// <ul>
/// <li>@c kFIRParameterCoupon (NSString) (optional)</li>
/// <li>@c kFIRParameterCurrency (NSString) (optional)</li>
/// <li>@c kFIRParameterItems (NSArray) (optional)</li>
/// <li>@c kFIRParameterShippingTier (NSString) (optional)</li>
/// <li>@c kFIRParameterValue (double as NSNumber) (optional)</li>
/// </ul>
static NSString *const kFIREventAddShippingInfo NS_SWIFT_NAME(AnalyticsEventAddShippingInfo) =
@"add_shipping_info";
/// E-Commerce Purchase event. This event signifies that an item(s) was purchased by a user. Note:
/// This is different from the in-app purchase event, which is reported automatically for App
/// Store-based apps. Note: If you supply the @c kFIRParameterValue parameter, you must also supply
/// the @c kFIRParameterCurrency parameter so that revenue metrics can be computed accurately.
/// Params:
///
/// <ul>
/// <li>@c kFIRParameterAffiliation (NSString) (optional)</li>
/// <li>@c kFIRParameterCoupon (NSString) (optional)</li>
/// <li>@c kFIRParameterCurrency (NSString) (optional)</li>
/// <li>@c kFIRParameterItems (NSArray) (optional)</li>
/// <li>@c kFIRParameterShipping (double as NSNumber) (optional)</li>
/// <li>@c kFIRParameterTax (double as NSNumber) (optional)</li>
/// <li>@c kFIRParameterTransactionID (NSString) (optional)</li>
/// <li>@c kFIRParameterValue (double as NSNumber) (optional)</li>
/// </ul>
static NSString *const kFIREventPurchase NS_SWIFT_NAME(AnalyticsEventPurchase) = @"purchase";
/// E-Commerce Refund event. This event signifies that a refund was issued. Note: If you supply the
/// @c kFIRParameterValue parameter, you must also supply the @c kFIRParameterCurrency parameter so
/// that revenue metrics can be computed accurately. Params:
///
/// <ul>
/// <li>@c kFIRParameterAffiliation (NSString) (optional)</li>
/// <li>@c kFIRParameterCoupon (NSString) (optional)</li>
/// <li>@c kFIRParameterCurrency (NSString) (optional)</li>
/// <li>@c kFIRParameterItems (NSArray) (optional)</li>
/// <li>@c kFIRParameterShipping (double as NSNumber) (optional)</li>
/// <li>@c kFIRParameterTax (double as NSNumber) (optional)</li>
/// <li>@c kFIRParameterTransactionID (NSString) (optional)</li>
/// <li>@c kFIRParameterValue (double as NSNumber) (optional)</li>
/// </ul>
static NSString *const kFIREventRefund NS_SWIFT_NAME(AnalyticsEventRefund) = @"refund";
/// Select Item event. This event signifies that an item was selected by a user from a list. Use the
/// appropriate parameters to contextualize the event. Use this event to discover the most popular
/// items selected. Params:
///
/// <ul>
/// <li>@c kFIRParameterItems (NSArray) (optional)</li>
/// <li>@c kFIRParameterItemListID (NSString) (optional)</li>
/// <li>@c kFIRParameterItemListName (NSString) (optional)</li>
/// </ul>
static NSString *const kFIREventSelectItem NS_SWIFT_NAME(AnalyticsEventSelectItem) = @"select_item";
/// Select promotion event. This event signifies that a user has selected a promotion offer. Use the
/// appropriate parameters to contextualize the event, such as the item(s) for which the promotion
/// applies. Params:
///
/// <ul>
/// <li>@c kFIRParameterCreativeName (NSString) (optional)</li>
/// <li>@c kFIRParameterCreativeSlot (NSString) (optional)</li>
/// <li>@c kFIRParameterItems (NSArray) (optional)</li>
/// <li>@c kFIRParameterLocationID (NSString) (optional)</li>
/// <li>@c kFIRParameterPromotionID (NSString) (optional)</li>
/// <li>@c kFIRParameterPromotionName (NSString) (optional)</li>
/// </ul>
static NSString *const kFIREventSelectPromotion NS_SWIFT_NAME(AnalyticsEventSelectPromotion) =
@"select_promotion";
/// E-commerce View Cart event. This event signifies that a user has viewed their cart. Use this to
/// analyze your purchase funnel. Note: If you supply the @c kFIRParameterValue parameter, you must
/// also supply the @c kFIRParameterCurrency parameter so that revenue metrics can be computed
/// accurately. Params:
///
/// <ul>
/// <li>@c kFIRParameterCurrency (NSString) (optional)</li>
/// <li>@c kFIRParameterItems (NSArray) (optional)</li>
/// <li>@c kFIRParameterValue (double as NSNumber) (optional)</li>
/// </ul>
static NSString *const kFIREventViewCart NS_SWIFT_NAME(AnalyticsEventViewCart) = @"view_cart";
/// View Promotion event. This event signifies that a promotion was shown to a user. Add this event
/// to a funnel with the @c kFIREventAddToCart and @c kFIREventPurchase to gauge your conversion
/// process. Params:
///
/// <ul>
/// <li>@c kFIRParameterCreativeName (NSString) (optional)</li>
/// <li>@c kFIRParameterCreativeSlot (NSString) (optional)</li>
/// <li>@c kFIRParameterItems (NSArray) (optional)</li>
/// <li>@c kFIRParameterLocationID (NSString) (optional)</li>
/// <li>@c kFIRParameterPromotionID (NSString) (optional)</li>
/// <li>@c kFIRParameterPromotionName (NSString) (optional)</li>
/// </ul>
static NSString *const kFIREventViewPromotion NS_SWIFT_NAME(AnalyticsEventViewPromotion) =
@"view_promotion";
================================================
FILE: Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.xcframework/ios-arm64_i386_x86_64-simulator/FirebaseAnalytics.framework/Headers/FIRParameterNames.h
================================================
/// @file FIRParameterNames.h
///
/// Predefined event parameter names.
///
/// Params supply information that contextualize Events. You can associate up to 25 unique Params
/// with each Event type. Some Params are suggested below for certain common Events, but you are
/// not limited to these. You may supply extra Params for suggested Events or custom Params for
/// Custom events. Param names can be up to 40 characters long, m
gitextract_bk3gpcyp/ ├── Podfile ├── Pods/ │ ├── Appirater/ │ │ ├── Appirater.h │ │ ├── Appirater.m │ │ ├── AppiraterDelegate.h │ │ ├── README.md │ │ ├── ar.lproj/ │ │ │ └── AppiraterLocalizable.strings │ │ ├── ca.lproj/ │ │ │ └── AppiraterLocalizable.strings │ │ ├── cs.lproj/ │ │ │ └── AppiraterLocalizable.strings │ │ ├── da.lproj/ │ │ │ └── AppiraterLocalizable.strings │ │ ├── de.lproj/ │ │ │ └── AppiraterLocalizable.strings │ │ ├── el.lproj/ │ │ │ └── AppiraterLocalizable.strings │ │ ├── en.lproj/ │ │ │ └── AppiraterLocalizable.strings │ │ ├── es.lproj/ │ │ │ └── AppiraterLocalizable.strings │ │ ├── fa.lproj/ │ │ │ └── AppiraterLocalizable.strings │ │ ├── fi.lproj/ │ │ │ └── AppiraterLocalizable.strings │ │ ├── fr.lproj/ │ │ │ └── AppiraterLocalizable.strings │ │ ├── he.lproj/ │ │ │ └── AppiraterLocalizable.strings │ │ ├── hu.lproj/ │ │ │ └── AppiraterLocalizable.strings │ │ ├── hy.lproj/ │ │ │ └── AppiraterLocalizable.strings │ │ ├── id.lproj/ │ │ │ └── AppiraterLocalizable.strings │ │ ├── it.lproj/ │ │ │ └── AppiraterLocalizable.strings │ │ ├── ja.lproj/ │ │ │ └── AppiraterLocalizable.strings │ │ ├── ko.lproj/ │ │ │ └── AppiraterLocalizable.strings │ │ ├── ms.lproj/ │ │ │ └── AppiraterLocalizable.strings │ │ ├── nb.lproj/ │ │ │ └── AppiraterLocalizable.strings │ │ ├── nl.lproj/ │ │ │ └── AppiraterLocalizable.strings │ │ ├── pl.lproj/ │ │ │ └── AppiraterLocalizable.strings │ │ ├── pt-BR.lproj/ │ │ │ └── AppiraterLocalizable.strings │ │ ├── pt.lproj/ │ │ │ └── AppiraterLocalizable.strings │ │ ├── ro.lproj/ │ │ │ └── AppiraterLocalizable.strings │ │ ├── ru.lproj/ │ │ │ └── AppiraterLocalizable.strings │ │ ├── sk.lproj/ │ │ │ └── AppiraterLocalizable.strings │ │ ├── sv.lproj/ │ │ │ └── AppiraterLocalizable.strings │ │ ├── th.lproj/ │ │ │ └── AppiraterLocalizable.strings │ │ ├── tr.lproj/ │ │ │ └── AppiraterLocalizable.strings │ │ ├── uk.lproj/ │ │ │ └── AppiraterLocalizable.strings │ │ ├── vi.lproj/ │ │ │ └── AppiraterLocalizable.strings │ │ ├── zh-Hans.lproj/ │ │ │ └── AppiraterLocalizable.strings │ │ └── zh-Hant.lproj/ │ │ └── AppiraterLocalizable.strings │ ├── Firebase/ │ │ ├── CoreOnly/ │ │ │ └── Sources/ │ │ │ ├── Firebase.h │ │ │ └── module.modulemap │ │ ├── LICENSE │ │ └── README.md │ ├── FirebaseAnalytics/ │ │ └── Frameworks/ │ │ └── FirebaseAnalytics.xcframework/ │ │ ├── Info.plist │ │ ├── ios-arm64_armv7/ │ │ │ └── FirebaseAnalytics.framework/ │ │ │ ├── FirebaseAnalytics │ │ │ ├── Headers/ │ │ │ │ ├── FIRAnalytics+AppDelegate.h │ │ │ │ ├── FIRAnalytics+Consent.h │ │ │ │ ├── FIRAnalytics.h │ │ │ │ ├── FIREventNames.h │ │ │ │ ├── FIRParameterNames.h │ │ │ │ ├── FIRUserPropertyNames.h │ │ │ │ └── FirebaseAnalytics.h │ │ │ ├── Info.plist │ │ │ └── Modules/ │ │ │ └── module.modulemap │ │ └── ios-arm64_i386_x86_64-simulator/ │ │ └── FirebaseAnalytics.framework/ │ │ ├── FirebaseAnalytics │ │ ├── Headers/ │ │ │ ├── FIRAnalytics+AppDelegate.h │ │ │ ├── FIRAnalytics+Consent.h │ │ │ ├── FIRAnalytics.h │ │ │ ├── FIREventNames.h │ │ │ ├── FIRParameterNames.h │ │ │ ├── FIRUserPropertyNames.h │ │ │ └── FirebaseAnalytics.h │ │ ├── Info.plist │ │ └── Modules/ │ │ └── module.modulemap │ ├── FirebaseCore/ │ │ ├── FirebaseCore/ │ │ │ └── Sources/ │ │ │ ├── FIRAnalyticsConfiguration.h │ │ │ ├── FIRAnalyticsConfiguration.m │ │ │ ├── FIRApp.m │ │ │ ├── FIRAppAssociationRegistration.h │ │ │ ├── FIRAppAssociationRegistration.m │ │ │ ├── FIRBundleUtil.h │ │ │ ├── FIRBundleUtil.m │ │ │ ├── FIRComponent.m │ │ │ ├── FIRComponentContainer.m │ │ │ ├── FIRComponentContainerInternal.h │ │ │ ├── FIRComponentType.m │ │ │ ├── FIRConfiguration.m │ │ │ ├── FIRConfigurationInternal.h │ │ │ ├── FIRCoreDiagnosticsConnector.m │ │ │ ├── FIRDependency.m │ │ │ ├── FIRDiagnosticsData.h │ │ │ ├── FIRDiagnosticsData.m │ │ │ ├── FIRFirebaseUserAgent.h │ │ │ ├── FIRFirebaseUserAgent.m │ │ │ ├── FIRHeartbeatInfo.m │ │ │ ├── FIRLogger.m │ │ │ ├── FIROptions.m │ │ │ ├── FIRVersion.m │ │ │ ├── Private/ │ │ │ │ ├── FIRAppInternal.h │ │ │ │ ├── FIRComponent.h │ │ │ │ ├── FIRComponentContainer.h │ │ │ │ ├── FIRComponentType.h │ │ │ │ ├── FIRCoreDiagnosticsConnector.h │ │ │ │ ├── FIRDependency.h │ │ │ │ ├── FIRHeartbeatInfo.h │ │ │ │ ├── FIRLibrary.h │ │ │ │ ├── FIRLogger.h │ │ │ │ ├── FIROptionsInternal.h │ │ │ │ └── FirebaseCoreInternal.h │ │ │ └── Public/ │ │ │ └── FirebaseCore/ │ │ │ ├── FIRApp.h │ │ │ ├── FIRConfiguration.h │ │ │ ├── FIRLoggerLevel.h │ │ │ ├── FIROptions.h │ │ │ ├── FIRVersion.h │ │ │ └── FirebaseCore.h │ │ ├── Interop/ │ │ │ └── CoreDiagnostics/ │ │ │ └── Public/ │ │ │ ├── FIRCoreDiagnosticsData.h │ │ │ └── FIRCoreDiagnosticsInterop.h │ │ ├── LICENSE │ │ └── README.md │ ├── FirebaseCoreDiagnostics/ │ │ ├── Firebase/ │ │ │ └── CoreDiagnostics/ │ │ │ └── FIRCDLibrary/ │ │ │ ├── FIRCoreDiagnostics.m │ │ │ ├── Protogen/ │ │ │ │ └── nanopb/ │ │ │ │ ├── firebasecore.nanopb.c │ │ │ │ └── firebasecore.nanopb.h │ │ │ └── Public/ │ │ │ └── FIRCoreDiagnostics.h │ │ ├── Interop/ │ │ │ └── CoreDiagnostics/ │ │ │ └── Public/ │ │ │ ├── FIRCoreDiagnosticsData.h │ │ │ └── FIRCoreDiagnosticsInterop.h │ │ ├── LICENSE │ │ └── README.md │ ├── FirebaseInstallations/ │ │ ├── FirebaseCore/ │ │ │ └── Sources/ │ │ │ └── Private/ │ │ │ ├── FIRAppInternal.h │ │ │ ├── FIRComponent.h │ │ │ ├── FIRComponentContainer.h │ │ │ ├── FIRComponentType.h │ │ │ ├── FIRCoreDiagnosticsConnector.h │ │ │ ├── FIRDependency.h │ │ │ ├── FIRHeartbeatInfo.h │ │ │ ├── FIRLibrary.h │ │ │ ├── FIRLogger.h │ │ │ ├── FIROptionsInternal.h │ │ │ └── FirebaseCoreInternal.h │ │ ├── FirebaseInstallations/ │ │ │ └── Source/ │ │ │ └── Library/ │ │ │ ├── Errors/ │ │ │ │ ├── FIRInstallationsErrorUtil.h │ │ │ │ ├── FIRInstallationsErrorUtil.m │ │ │ │ ├── FIRInstallationsHTTPError.h │ │ │ │ └── FIRInstallationsHTTPError.m │ │ │ ├── FIRInstallations.m │ │ │ ├── FIRInstallationsAuthTokenResult.m │ │ │ ├── FIRInstallationsAuthTokenResultInternal.h │ │ │ ├── FIRInstallationsItem.h │ │ │ ├── FIRInstallationsItem.m │ │ │ ├── FIRInstallationsLogger.h │ │ │ ├── FIRInstallationsLogger.m │ │ │ ├── IIDMigration/ │ │ │ │ ├── FIRInstallationsIIDStore.h │ │ │ │ ├── FIRInstallationsIIDStore.m │ │ │ │ ├── FIRInstallationsIIDTokenStore.h │ │ │ │ └── FIRInstallationsIIDTokenStore.m │ │ │ ├── InstallationsAPI/ │ │ │ │ ├── FIRInstallationsAPIService.h │ │ │ │ ├── FIRInstallationsAPIService.m │ │ │ │ ├── FIRInstallationsItem+RegisterInstallationAPI.h │ │ │ │ └── FIRInstallationsItem+RegisterInstallationAPI.m │ │ │ ├── InstallationsIDController/ │ │ │ │ ├── FIRCurrentDateProvider.h │ │ │ │ ├── FIRCurrentDateProvider.m │ │ │ │ ├── FIRInstallationsBackoffController.h │ │ │ │ ├── FIRInstallationsBackoffController.m │ │ │ │ ├── FIRInstallationsIDController.h │ │ │ │ ├── FIRInstallationsIDController.m │ │ │ │ ├── FIRInstallationsSingleOperationPromiseCache.h │ │ │ │ ├── FIRInstallationsSingleOperationPromiseCache.m │ │ │ │ └── FIRInstallationsStatus.h │ │ │ ├── InstallationsStore/ │ │ │ │ ├── FIRInstallationsStore.h │ │ │ │ ├── FIRInstallationsStore.m │ │ │ │ ├── FIRInstallationsStoredAuthToken.h │ │ │ │ ├── FIRInstallationsStoredAuthToken.m │ │ │ │ ├── FIRInstallationsStoredItem.h │ │ │ │ └── FIRInstallationsStoredItem.m │ │ │ ├── Private/ │ │ │ │ └── FirebaseInstallationsInternal.h │ │ │ └── Public/ │ │ │ └── FirebaseInstallations/ │ │ │ ├── FIRInstallations.h │ │ │ ├── FIRInstallationsAuthTokenResult.h │ │ │ ├── FIRInstallationsErrors.h │ │ │ └── FirebaseInstallations.h │ │ ├── LICENSE │ │ └── README.md │ ├── GoogleAppMeasurement/ │ │ └── Frameworks/ │ │ └── GoogleAppMeasurement.xcframework/ │ │ ├── Info.plist │ │ ├── ios-arm64_armv7/ │ │ │ └── GoogleAppMeasurement.framework/ │ │ │ ├── GoogleAppMeasurement │ │ │ ├── Info.plist │ │ │ └── Modules/ │ │ │ └── module.modulemap │ │ └── ios-arm64_i386_x86_64-simulator/ │ │ └── GoogleAppMeasurement.framework/ │ │ ├── GoogleAppMeasurement │ │ ├── Info.plist │ │ └── Modules/ │ │ └── module.modulemap │ ├── GoogleDataTransport/ │ │ ├── GoogleDataTransport/ │ │ │ ├── GDTCCTLibrary/ │ │ │ │ ├── GDTCCTCompressionHelper.m │ │ │ │ ├── GDTCCTNanopbHelpers.m │ │ │ │ ├── GDTCCTUploadOperation.m │ │ │ │ ├── GDTCCTUploader.m │ │ │ │ ├── GDTCOREvent+GDTCCTSupport.m │ │ │ │ ├── Private/ │ │ │ │ │ ├── GDTCCTCompressionHelper.h │ │ │ │ │ ├── GDTCCTNanopbHelpers.h │ │ │ │ │ ├── GDTCCTUploadOperation.h │ │ │ │ │ └── GDTCCTUploader.h │ │ │ │ ├── Protogen/ │ │ │ │ │ └── nanopb/ │ │ │ │ │ ├── cct.nanopb.c │ │ │ │ │ └── cct.nanopb.h │ │ │ │ └── Public/ │ │ │ │ └── GDTCOREvent+GDTCCTSupport.h │ │ │ └── GDTCORLibrary/ │ │ │ ├── GDTCORAssert.m │ │ │ ├── GDTCORClock.m │ │ │ ├── GDTCORConsoleLogger.m │ │ │ ├── GDTCORDirectorySizeTracker.m │ │ │ ├── GDTCOREndpoints.m │ │ │ ├── GDTCOREvent.m │ │ │ ├── GDTCORFlatFileStorage+Promises.m │ │ │ ├── GDTCORFlatFileStorage.m │ │ │ ├── GDTCORLifecycle.m │ │ │ ├── GDTCORPlatform.m │ │ │ ├── GDTCORReachability.m │ │ │ ├── GDTCORRegistrar.m │ │ │ ├── GDTCORStorageEventSelector.m │ │ │ ├── GDTCORTransformer.m │ │ │ ├── GDTCORTransport.m │ │ │ ├── GDTCORUploadBatch.m │ │ │ ├── GDTCORUploadCoordinator.m │ │ │ ├── Internal/ │ │ │ │ ├── GDTCORAssert.h │ │ │ │ ├── GDTCORDirectorySizeTracker.h │ │ │ │ ├── GDTCORLifecycle.h │ │ │ │ ├── GDTCORPlatform.h │ │ │ │ ├── GDTCORReachability.h │ │ │ │ ├── GDTCORRegistrar.h │ │ │ │ ├── GDTCORStorageEventSelector.h │ │ │ │ ├── GDTCORStorageProtocol.h │ │ │ │ └── GDTCORUploader.h │ │ │ ├── Private/ │ │ │ │ ├── GDTCOREndpoints_Private.h │ │ │ │ ├── GDTCOREvent_Private.h │ │ │ │ ├── GDTCORFlatFileStorage+Promises.h │ │ │ │ ├── GDTCORFlatFileStorage.h │ │ │ │ ├── GDTCORReachability_Private.h │ │ │ │ ├── GDTCORRegistrar_Private.h │ │ │ │ ├── GDTCORTransformer.h │ │ │ │ ├── GDTCORTransformer_Private.h │ │ │ │ ├── GDTCORTransport_Private.h │ │ │ │ ├── GDTCORUploadBatch.h │ │ │ │ └── GDTCORUploadCoordinator.h │ │ │ └── Public/ │ │ │ └── GoogleDataTransport/ │ │ │ ├── GDTCORClock.h │ │ │ ├── GDTCORConsoleLogger.h │ │ │ ├── GDTCOREndpoints.h │ │ │ ├── GDTCOREvent.h │ │ │ ├── GDTCOREventDataObject.h │ │ │ ├── GDTCOREventTransformer.h │ │ │ ├── GDTCORTargets.h │ │ │ ├── GDTCORTransport.h │ │ │ └── GoogleDataTransport.h │ │ ├── LICENSE │ │ └── README.md │ ├── GoogleUtilities/ │ │ ├── GoogleUtilities/ │ │ │ ├── AppDelegateSwizzler/ │ │ │ │ ├── GULAppDelegateSwizzler.m │ │ │ │ ├── GULSceneDelegateSwizzler.m │ │ │ │ ├── Internal/ │ │ │ │ │ ├── GULAppDelegateSwizzler_Private.h │ │ │ │ │ └── GULSceneDelegateSwizzler_Private.h │ │ │ │ └── Public/ │ │ │ │ └── GoogleUtilities/ │ │ │ │ ├── GULAppDelegateSwizzler.h │ │ │ │ ├── GULApplication.h │ │ │ │ └── GULSceneDelegateSwizzler.h │ │ │ ├── Common/ │ │ │ │ └── GULLoggerCodes.h │ │ │ ├── Environment/ │ │ │ │ ├── GULHeartbeatDateStorage.m │ │ │ │ ├── GULHeartbeatDateStorageUserDefaults.m │ │ │ │ ├── GULSecureCoding.m │ │ │ │ ├── Public/ │ │ │ │ │ └── GoogleUtilities/ │ │ │ │ │ ├── GULAppEnvironmentUtil.h │ │ │ │ │ ├── GULHeartbeatDateStorable.h │ │ │ │ │ ├── GULHeartbeatDateStorage.h │ │ │ │ │ ├── GULHeartbeatDateStorageUserDefaults.h │ │ │ │ │ ├── GULKeychainStorage.h │ │ │ │ │ ├── GULKeychainUtils.h │ │ │ │ │ ├── GULSecureCoding.h │ │ │ │ │ ├── GULURLSessionDataResponse.h │ │ │ │ │ └── NSURLSession+GULPromises.h │ │ │ │ ├── SecureStorage/ │ │ │ │ │ ├── GULKeychainStorage.m │ │ │ │ │ └── GULKeychainUtils.m │ │ │ │ ├── URLSessionPromiseWrapper/ │ │ │ │ │ ├── GULURLSessionDataResponse.m │ │ │ │ │ └── NSURLSession+GULPromises.m │ │ │ │ └── third_party/ │ │ │ │ └── GULAppEnvironmentUtil.m │ │ │ ├── Logger/ │ │ │ │ ├── GULLogger.m │ │ │ │ └── Public/ │ │ │ │ └── GoogleUtilities/ │ │ │ │ ├── GULLogger.h │ │ │ │ └── GULLoggerLevel.h │ │ │ ├── MethodSwizzler/ │ │ │ │ ├── GULSwizzler.m │ │ │ │ └── Public/ │ │ │ │ └── GoogleUtilities/ │ │ │ │ ├── GULOriginalIMPConvenienceMacros.h │ │ │ │ └── GULSwizzler.h │ │ │ ├── NSData+zlib/ │ │ │ │ ├── GULNSData+zlib.m │ │ │ │ └── Public/ │ │ │ │ └── GoogleUtilities/ │ │ │ │ └── GULNSData+zlib.h │ │ │ ├── Network/ │ │ │ │ ├── GULMutableDictionary.m │ │ │ │ ├── GULNetwork.m │ │ │ │ ├── GULNetworkConstants.m │ │ │ │ ├── GULNetworkInternal.h │ │ │ │ ├── GULNetworkURLSession.m │ │ │ │ └── Public/ │ │ │ │ └── GoogleUtilities/ │ │ │ │ ├── GULMutableDictionary.h │ │ │ │ ├── GULNetwork.h │ │ │ │ ├── GULNetworkConstants.h │ │ │ │ ├── GULNetworkLoggerProtocol.h │ │ │ │ ├── GULNetworkMessageCode.h │ │ │ │ └── GULNetworkURLSession.h │ │ │ ├── Reachability/ │ │ │ │ ├── GULReachabilityChecker+Internal.h │ │ │ │ ├── GULReachabilityChecker.m │ │ │ │ ├── GULReachabilityMessageCode.h │ │ │ │ └── Public/ │ │ │ │ └── GoogleUtilities/ │ │ │ │ └── GULReachabilityChecker.h │ │ │ └── UserDefaults/ │ │ │ ├── GULUserDefaults.m │ │ │ └── Public/ │ │ │ └── GoogleUtilities/ │ │ │ └── GULUserDefaults.h │ │ ├── LICENSE │ │ └── README.md │ ├── Pods.xcodeproj/ │ │ ├── project.pbxproj │ │ └── xcuserdata/ │ │ └── afrazsiddiqui.xcuserdatad/ │ │ └── xcschemes/ │ │ ├── Appirater-Appirater.xcscheme │ │ ├── Appirater.xcscheme │ │ ├── Firebase.xcscheme │ │ ├── FirebaseAnalytics.xcscheme │ │ ├── FirebaseCore.xcscheme │ │ ├── FirebaseCoreDiagnostics.xcscheme │ │ ├── FirebaseInstallations.xcscheme │ │ ├── GoogleAppMeasurement.xcscheme │ │ ├── GoogleDataTransport.xcscheme │ │ ├── GoogleUtilities.xcscheme │ │ ├── Pods-Spotify.xcscheme │ │ ├── PromisesObjC.xcscheme │ │ ├── SDWebImage.xcscheme │ │ ├── nanopb.xcscheme │ │ └── xcschememanagement.plist │ ├── PromisesObjC/ │ │ ├── LICENSE │ │ ├── README.md │ │ └── Sources/ │ │ └── FBLPromises/ │ │ ├── FBLPromise+All.m │ │ ├── FBLPromise+Always.m │ │ ├── FBLPromise+Any.m │ │ ├── FBLPromise+Async.m │ │ ├── FBLPromise+Await.m │ │ ├── FBLPromise+Catch.m │ │ ├── FBLPromise+Delay.m │ │ ├── FBLPromise+Do.m │ │ ├── FBLPromise+Race.m │ │ ├── FBLPromise+Recover.m │ │ ├── FBLPromise+Reduce.m │ │ ├── FBLPromise+Retry.m │ │ ├── FBLPromise+Testing.m │ │ ├── FBLPromise+Then.m │ │ ├── FBLPromise+Timeout.m │ │ ├── FBLPromise+Validate.m │ │ ├── FBLPromise+Wrap.m │ │ ├── FBLPromise.m │ │ ├── FBLPromiseError.m │ │ └── include/ │ │ ├── FBLPromise+All.h │ │ ├── FBLPromise+Always.h │ │ ├── FBLPromise+Any.h │ │ ├── FBLPromise+Async.h │ │ ├── FBLPromise+Await.h │ │ ├── FBLPromise+Catch.h │ │ ├── FBLPromise+Delay.h │ │ ├── FBLPromise+Do.h │ │ ├── FBLPromise+Race.h │ │ ├── FBLPromise+Recover.h │ │ ├── FBLPromise+Reduce.h │ │ ├── FBLPromise+Retry.h │ │ ├── FBLPromise+Testing.h │ │ ├── FBLPromise+Then.h │ │ ├── FBLPromise+Timeout.h │ │ ├── FBLPromise+Validate.h │ │ ├── FBLPromise+Wrap.h │ │ ├── FBLPromise.h │ │ ├── FBLPromiseError.h │ │ ├── FBLPromisePrivate.h │ │ └── FBLPromises.h │ ├── SDWebImage/ │ │ ├── LICENSE │ │ ├── README.md │ │ ├── SDWebImage/ │ │ │ ├── Core/ │ │ │ │ ├── NSButton+WebCache.h │ │ │ │ ├── NSButton+WebCache.m │ │ │ │ ├── NSData+ImageContentType.h │ │ │ │ ├── NSData+ImageContentType.m │ │ │ │ ├── NSImage+Compatibility.h │ │ │ │ ├── NSImage+Compatibility.m │ │ │ │ ├── SDAnimatedImage.h │ │ │ │ ├── SDAnimatedImage.m │ │ │ │ ├── SDAnimatedImagePlayer.h │ │ │ │ ├── SDAnimatedImagePlayer.m │ │ │ │ ├── SDAnimatedImageRep.h │ │ │ │ ├── SDAnimatedImageRep.m │ │ │ │ ├── SDAnimatedImageView+WebCache.h │ │ │ │ ├── SDAnimatedImageView+WebCache.m │ │ │ │ ├── SDAnimatedImageView.h │ │ │ │ ├── SDAnimatedImageView.m │ │ │ │ ├── SDDiskCache.h │ │ │ │ ├── SDDiskCache.m │ │ │ │ ├── SDGraphicsImageRenderer.h │ │ │ │ ├── SDGraphicsImageRenderer.m │ │ │ │ ├── SDImageAPNGCoder.h │ │ │ │ ├── SDImageAPNGCoder.m │ │ │ │ ├── SDImageAWebPCoder.h │ │ │ │ ├── SDImageAWebPCoder.m │ │ │ │ ├── SDImageCache.h │ │ │ │ ├── SDImageCache.m │ │ │ │ ├── SDImageCacheConfig.h │ │ │ │ ├── SDImageCacheConfig.m │ │ │ │ ├── SDImageCacheDefine.h │ │ │ │ ├── SDImageCacheDefine.m │ │ │ │ ├── SDImageCachesManager.h │ │ │ │ ├── SDImageCachesManager.m │ │ │ │ ├── SDImageCoder.h │ │ │ │ ├── SDImageCoder.m │ │ │ │ ├── SDImageCoderHelper.h │ │ │ │ ├── SDImageCoderHelper.m │ │ │ │ ├── SDImageCodersManager.h │ │ │ │ ├── SDImageCodersManager.m │ │ │ │ ├── SDImageFrame.h │ │ │ │ ├── SDImageFrame.m │ │ │ │ ├── SDImageGIFCoder.h │ │ │ │ ├── SDImageGIFCoder.m │ │ │ │ ├── SDImageGraphics.h │ │ │ │ ├── SDImageGraphics.m │ │ │ │ ├── SDImageHEICCoder.h │ │ │ │ ├── SDImageHEICCoder.m │ │ │ │ ├── SDImageIOAnimatedCoder.h │ │ │ │ ├── SDImageIOAnimatedCoder.m │ │ │ │ ├── SDImageIOCoder.h │ │ │ │ ├── SDImageIOCoder.m │ │ │ │ ├── SDImageLoader.h │ │ │ │ ├── SDImageLoader.m │ │ │ │ ├── SDImageLoadersManager.h │ │ │ │ ├── SDImageLoadersManager.m │ │ │ │ ├── SDImageTransformer.h │ │ │ │ ├── SDImageTransformer.m │ │ │ │ ├── SDMemoryCache.h │ │ │ │ ├── SDMemoryCache.m │ │ │ │ ├── SDWebImageCacheKeyFilter.h │ │ │ │ ├── SDWebImageCacheKeyFilter.m │ │ │ │ ├── SDWebImageCacheSerializer.h │ │ │ │ ├── SDWebImageCacheSerializer.m │ │ │ │ ├── SDWebImageCompat.h │ │ │ │ ├── SDWebImageCompat.m │ │ │ │ ├── SDWebImageDefine.h │ │ │ │ ├── SDWebImageDefine.m │ │ │ │ ├── SDWebImageDownloader.h │ │ │ │ ├── SDWebImageDownloader.m │ │ │ │ ├── SDWebImageDownloaderConfig.h │ │ │ │ ├── SDWebImageDownloaderConfig.m │ │ │ │ ├── SDWebImageDownloaderDecryptor.h │ │ │ │ ├── SDWebImageDownloaderDecryptor.m │ │ │ │ ├── SDWebImageDownloaderOperation.h │ │ │ │ ├── SDWebImageDownloaderOperation.m │ │ │ │ ├── SDWebImageDownloaderRequestModifier.h │ │ │ │ ├── SDWebImageDownloaderRequestModifier.m │ │ │ │ ├── SDWebImageDownloaderResponseModifier.h │ │ │ │ ├── SDWebImageDownloaderResponseModifier.m │ │ │ │ ├── SDWebImageError.h │ │ │ │ ├── SDWebImageError.m │ │ │ │ ├── SDWebImageIndicator.h │ │ │ │ ├── SDWebImageIndicator.m │ │ │ │ ├── SDWebImageManager.h │ │ │ │ ├── SDWebImageManager.m │ │ │ │ ├── SDWebImageOperation.h │ │ │ │ ├── SDWebImageOperation.m │ │ │ │ ├── SDWebImageOptionsProcessor.h │ │ │ │ ├── SDWebImageOptionsProcessor.m │ │ │ │ ├── SDWebImagePrefetcher.h │ │ │ │ ├── SDWebImagePrefetcher.m │ │ │ │ ├── SDWebImageTransition.h │ │ │ │ ├── SDWebImageTransition.m │ │ │ │ ├── UIButton+WebCache.h │ │ │ │ ├── UIButton+WebCache.m │ │ │ │ ├── UIImage+ExtendedCacheData.h │ │ │ │ ├── UIImage+ExtendedCacheData.m │ │ │ │ ├── UIImage+ForceDecode.h │ │ │ │ ├── UIImage+ForceDecode.m │ │ │ │ ├── UIImage+GIF.h │ │ │ │ ├── UIImage+GIF.m │ │ │ │ ├── UIImage+MemoryCacheCost.h │ │ │ │ ├── UIImage+MemoryCacheCost.m │ │ │ │ ├── UIImage+Metadata.h │ │ │ │ ├── UIImage+Metadata.m │ │ │ │ ├── UIImage+MultiFormat.h │ │ │ │ ├── UIImage+MultiFormat.m │ │ │ │ ├── UIImage+Transform.h │ │ │ │ ├── UIImage+Transform.m │ │ │ │ ├── UIImageView+HighlightedWebCache.h │ │ │ │ ├── UIImageView+HighlightedWebCache.m │ │ │ │ ├── UIImageView+WebCache.h │ │ │ │ ├── UIImageView+WebCache.m │ │ │ │ ├── UIView+WebCache.h │ │ │ │ ├── UIView+WebCache.m │ │ │ │ ├── UIView+WebCacheOperation.h │ │ │ │ └── UIView+WebCacheOperation.m │ │ │ └── Private/ │ │ │ ├── NSBezierPath+SDRoundedCorners.h │ │ │ ├── NSBezierPath+SDRoundedCorners.m │ │ │ ├── SDAssociatedObject.h │ │ │ ├── SDAssociatedObject.m │ │ │ ├── SDAsyncBlockOperation.h │ │ │ ├── SDAsyncBlockOperation.m │ │ │ ├── SDDeviceHelper.h │ │ │ ├── SDDeviceHelper.m │ │ │ ├── SDDisplayLink.h │ │ │ ├── SDDisplayLink.m │ │ │ ├── SDFileAttributeHelper.h │ │ │ ├── SDFileAttributeHelper.m │ │ │ ├── SDImageAssetManager.h │ │ │ ├── SDImageAssetManager.m │ │ │ ├── SDImageCachesManagerOperation.h │ │ │ ├── SDImageCachesManagerOperation.m │ │ │ ├── SDImageIOAnimatedCoderInternal.h │ │ │ ├── SDInternalMacros.h │ │ │ ├── SDInternalMacros.m │ │ │ ├── SDWeakProxy.h │ │ │ ├── SDWeakProxy.m │ │ │ ├── SDWebImageTransitionInternal.h │ │ │ ├── SDmetamacros.h │ │ │ ├── UIColor+SDHexString.h │ │ │ └── UIColor+SDHexString.m │ │ └── WebImage/ │ │ └── SDWebImage.h │ ├── Target Support Files/ │ │ ├── Appirater/ │ │ │ ├── Appirater-Info.plist │ │ │ ├── Appirater-dummy.m │ │ │ ├── Appirater-prefix.pch │ │ │ ├── Appirater-umbrella.h │ │ │ ├── Appirater.debug.xcconfig │ │ │ ├── Appirater.modulemap │ │ │ ├── Appirater.release.xcconfig │ │ │ └── ResourceBundle-Appirater-Appirater-Info.plist │ │ ├── Firebase/ │ │ │ ├── Firebase.debug.xcconfig │ │ │ └── Firebase.release.xcconfig │ │ ├── FirebaseAnalytics/ │ │ │ ├── FirebaseAnalytics-xcframeworks-input-files.xcfilelist │ │ │ ├── FirebaseAnalytics-xcframeworks-output-files.xcfilelist │ │ │ ├── FirebaseAnalytics-xcframeworks.sh │ │ │ ├── FirebaseAnalytics.debug.xcconfig │ │ │ └── FirebaseAnalytics.release.xcconfig │ │ ├── FirebaseCore/ │ │ │ ├── FirebaseCore-Info.plist │ │ │ ├── FirebaseCore-dummy.m │ │ │ ├── FirebaseCore-umbrella.h │ │ │ ├── FirebaseCore.debug.xcconfig │ │ │ ├── FirebaseCore.modulemap │ │ │ └── FirebaseCore.release.xcconfig │ │ ├── FirebaseCoreDiagnostics/ │ │ │ ├── FirebaseCoreDiagnostics-Info.plist │ │ │ ├── FirebaseCoreDiagnostics-dummy.m │ │ │ ├── FirebaseCoreDiagnostics-umbrella.h │ │ │ ├── FirebaseCoreDiagnostics.debug.xcconfig │ │ │ ├── FirebaseCoreDiagnostics.modulemap │ │ │ └── FirebaseCoreDiagnostics.release.xcconfig │ │ ├── FirebaseInstallations/ │ │ │ ├── FirebaseInstallations-Info.plist │ │ │ ├── FirebaseInstallations-dummy.m │ │ │ ├── FirebaseInstallations-umbrella.h │ │ │ ├── FirebaseInstallations.debug.xcconfig │ │ │ ├── FirebaseInstallations.modulemap │ │ │ └── FirebaseInstallations.release.xcconfig │ │ ├── GoogleAppMeasurement/ │ │ │ ├── GoogleAppMeasurement-xcframeworks-input-files.xcfilelist │ │ │ ├── GoogleAppMeasurement-xcframeworks-output-files.xcfilelist │ │ │ ├── GoogleAppMeasurement-xcframeworks.sh │ │ │ ├── GoogleAppMeasurement.debug.xcconfig │ │ │ └── GoogleAppMeasurement.release.xcconfig │ │ ├── GoogleDataTransport/ │ │ │ ├── GoogleDataTransport-Info.plist │ │ │ ├── GoogleDataTransport-dummy.m │ │ │ ├── GoogleDataTransport-umbrella.h │ │ │ ├── GoogleDataTransport.debug.xcconfig │ │ │ ├── GoogleDataTransport.modulemap │ │ │ └── GoogleDataTransport.release.xcconfig │ │ ├── GoogleUtilities/ │ │ │ ├── GoogleUtilities-Info.plist │ │ │ ├── GoogleUtilities-dummy.m │ │ │ ├── GoogleUtilities-umbrella.h │ │ │ ├── GoogleUtilities.debug.xcconfig │ │ │ ├── GoogleUtilities.modulemap │ │ │ └── GoogleUtilities.release.xcconfig │ │ ├── Pods-Spotify/ │ │ │ ├── Pods-Spotify-Info.plist │ │ │ ├── Pods-Spotify-acknowledgements.markdown │ │ │ ├── Pods-Spotify-acknowledgements.plist │ │ │ ├── Pods-Spotify-dummy.m │ │ │ ├── Pods-Spotify-frameworks-Debug-input-files.xcfilelist │ │ │ ├── Pods-Spotify-frameworks-Debug-output-files.xcfilelist │ │ │ ├── Pods-Spotify-frameworks-Release-input-files.xcfilelist │ │ │ ├── Pods-Spotify-frameworks-Release-output-files.xcfilelist │ │ │ ├── Pods-Spotify-frameworks.sh │ │ │ ├── Pods-Spotify-umbrella.h │ │ │ ├── Pods-Spotify.debug.xcconfig │ │ │ ├── Pods-Spotify.modulemap │ │ │ └── Pods-Spotify.release.xcconfig │ │ ├── PromisesObjC/ │ │ │ ├── PromisesObjC-Info.plist │ │ │ ├── PromisesObjC-dummy.m │ │ │ ├── PromisesObjC-umbrella.h │ │ │ ├── PromisesObjC.debug.xcconfig │ │ │ ├── PromisesObjC.modulemap │ │ │ └── PromisesObjC.release.xcconfig │ │ ├── SDWebImage/ │ │ │ ├── SDWebImage-Info.plist │ │ │ ├── SDWebImage-dummy.m │ │ │ ├── SDWebImage-prefix.pch │ │ │ ├── SDWebImage-umbrella.h │ │ │ ├── SDWebImage.debug.xcconfig │ │ │ ├── SDWebImage.modulemap │ │ │ └── SDWebImage.release.xcconfig │ │ └── nanopb/ │ │ ├── nanopb-Info.plist │ │ ├── nanopb-dummy.m │ │ ├── nanopb-prefix.pch │ │ ├── nanopb-umbrella.h │ │ ├── nanopb.debug.xcconfig │ │ ├── nanopb.modulemap │ │ └── nanopb.release.xcconfig │ └── nanopb/ │ ├── LICENSE.txt │ ├── README.md │ ├── pb.h │ ├── pb_common.c │ ├── pb_common.h │ ├── pb_decode.c │ ├── pb_decode.h │ ├── pb_encode.c │ └── pb_encode.h ├── README.md ├── Spotify/ │ ├── Controllers/ │ │ ├── Core/ │ │ │ ├── HomeViewController.swift │ │ │ ├── LibraryViewController.swift │ │ │ ├── SearchViewController.swift │ │ │ └── TabBarViewController.swift │ │ └── Other/ │ │ ├── AlbumViewController.swift │ │ ├── AuthViewController.swift │ │ ├── CategoryViewController.swift │ │ ├── Library/ │ │ │ ├── LibraryAlbumsViewController.swift │ │ │ └── LibraryPlaylistsViewController.swift │ │ ├── PlayerViewController.swift │ │ ├── PlaylistViewController.swift │ │ ├── ProfileViewController.swift │ │ ├── SearchResultsViewController.swift │ │ ├── SettingsViewController.swift │ │ └── WelcomeViewController.swift │ ├── Info.plist │ ├── Managers/ │ │ ├── APICaller.swift │ │ ├── AuthManager.swift │ │ └── HapticsManager.swift │ ├── Models/ │ │ ├── APIImage.swift │ │ ├── AlbumDetailsResponse.swift │ │ ├── AllCategoriesResponse.swift │ │ ├── Artist.swift │ │ ├── AudioTrack.swift │ │ ├── AuthResponse.swift │ │ ├── FeaturedPlaylistsResponse.swift │ │ ├── LibraryAlbumsResponse.swift │ │ ├── LibraryPlaylistsResponse.swift │ │ ├── NewReleasesResponse.swift │ │ ├── Playlist.swift │ │ ├── PlaylistDetailsResponse.swift │ │ ├── RecommendationsResponse.swift │ │ ├── RecommendedGenresResponse.swift │ │ ├── SearchResult.swift │ │ ├── SearchResultResponse.swift │ │ ├── SettingsModels.swift │ │ └── UserProfile.swift │ ├── Presenter/ │ │ └── PlaybackPresenter.swift │ ├── Resources/ │ │ ├── AppDelegate.swift │ │ ├── Assets.xcassets/ │ │ │ ├── AccentColor.colorset/ │ │ │ │ └── Contents.json │ │ │ ├── AppIcon.appiconset/ │ │ │ │ └── Contents.json │ │ │ ├── Contents.json │ │ │ ├── albums_background.imageset/ │ │ │ │ └── Contents.json │ │ │ └── logo.imageset/ │ │ │ └── Contents.json │ │ ├── Extensions.swift │ │ └── SceneDelegate.swift │ ├── ViewModels/ │ │ ├── AlbumCollectionViewCellViewModel.swift │ │ ├── CategoryCollectionViewCellViewModel.swift │ │ ├── FeaturedPlaylistCellViewModel.swift │ │ ├── NewReleasesCellViewModel.swift │ │ ├── PlaylistHeaderViewViewModel.swift │ │ ├── RecommendedTrackCellViewModel.swift │ │ ├── SearchResultDefaultTableViewCellViewModel.swift │ │ └── SearchResultSubtitleTableViewCellViewModel.swift │ └── Views/ │ ├── ActionLabelView.swift │ ├── AlbumTrackCollectionViewCell.swift │ ├── Base.lproj/ │ │ └── LaunchScreen.storyboard │ ├── Browse/ │ │ ├── FeaturedPlaylistCollectionViewCell.swift │ │ ├── NewReleaseCollectionViewCell.swift │ │ └── RecommendedTrackCollectionViewCell.swift │ ├── GenreCollectionViewCell.swift │ ├── LibraryToggleView.swift │ ├── PlayerControlsView.swift │ ├── PlaylistHeaderCollectionReusableView.swift │ ├── SearchResultCells/ │ │ ├── SearchResultDefaultTableViewCell.swift │ │ └── SearchResultSubtitleTableViewCell.swift │ └── TitleHeaderCollectionReusableView.swift ├── Spotify.xcodeproj/ │ ├── project.pbxproj │ ├── project.xcworkspace/ │ │ ├── contents.xcworkspacedata │ │ └── xcshareddata/ │ │ └── IDEWorkspaceChecks.plist │ └── xcuserdata/ │ └── afrazsiddiqui.xcuserdatad/ │ ├── xcdebugger/ │ │ └── Breakpoints_v2.xcbkptlist │ └── xcschemes/ │ └── xcschememanagement.plist ├── Spotify.xcworkspace/ │ ├── contents.xcworkspacedata │ ├── xcshareddata/ │ │ └── IDEWorkspaceChecks.plist │ └── xcuserdata/ │ └── afrazsiddiqui.xcuserdatad/ │ ├── UserInterfaceState.xcuserstate │ └── xcdebugger/ │ └── Breakpoints_v2.xcbkptlist ├── SpotifyTests/ │ └── SpotifyTests.swift ├── codemagic.yaml └── codemagic.yml
SYMBOL INDEX (173 symbols across 36 files)
FILE: Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.xcframework/ios-arm64_armv7/FirebaseAnalytics.framework/Headers/FIRAnalytics+Consent.h
type NSString (line 15) | typedef NSString *FIRConsentStatus
FILE: Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.xcframework/ios-arm64_i386_x86_64-simulator/FirebaseAnalytics.framework/Headers/FIRAnalytics+Consent.h
type NSString (line 15) | typedef NSString *FIRConsentStatus
FILE: Pods/FirebaseCore/FirebaseCore/Sources/Private/FIRComponent.h
type FIRInstantiationTimingLazy (line 39) | typedef NS_ENUM(NSInteger, FIRInstantiationTiming) {
FILE: Pods/FirebaseCoreDiagnostics/Firebase/CoreDiagnostics/FIRCDLibrary/Protogen/nanopb/firebasecore.nanopb.h
type logs_proto_mobilesdk_ios_ICoreConfiguration_ConfigurationType (line 31) | typedef enum _logs_proto_mobilesdk_ios_ICoreConfiguration_ConfigurationT...
type logs_proto_mobilesdk_ios_ICoreConfiguration_BuildType (line 40) | typedef enum _logs_proto_mobilesdk_ios_ICoreConfiguration_BuildType {
type logs_proto_mobilesdk_ios_ICoreConfiguration_ServiceType (line 50) | typedef enum _logs_proto_mobilesdk_ios_ICoreConfiguration_ServiceType {
type logs_proto_mobilesdk_ios_ICoreConfiguration_PodName (line 90) | typedef enum _logs_proto_mobilesdk_ios_ICoreConfiguration_PodName {
type logs_proto_mobilesdk_ios_ICoreConfiguration_DeploymentType (line 99) | typedef enum _logs_proto_mobilesdk_ios_ICoreConfiguration_DeploymentType {
type logs_proto_mobilesdk_ios_ICoreConfiguration (line 111) | typedef struct _logs_proto_mobilesdk_ios_ICoreConfiguration {
FILE: Pods/FirebaseInstallations/FirebaseCore/Sources/Private/FIRComponent.h
type FIRInstantiationTimingLazy (line 39) | typedef NS_ENUM(NSInteger, FIRInstantiationTiming) {
FILE: Pods/FirebaseInstallations/FirebaseInstallations/Source/Library/InstallationsIDController/FIRInstallationsStatus.h
type FIRInstallationStatusUnknown (line 26) | typedef NS_ENUM(NSInteger, FIRInstallationsStatus) {
FILE: Pods/GoogleDataTransport/GoogleDataTransport/GDTCCTLibrary/Protogen/nanopb/cct.nanopb.h
type gdt_cct_NetworkConnectionInfo_NetworkType (line 31) | typedef enum _gdt_cct_NetworkConnectionInfo_NetworkType {
type gdt_cct_NetworkConnectionInfo_MobileSubtype (line 56) | typedef enum _gdt_cct_NetworkConnectionInfo_MobileSubtype {
type gdt_cct_ClientInfo_ClientType (line 83) | typedef enum _gdt_cct_ClientInfo_ClientType {
type gdt_cct_QosTierConfiguration_QosTier (line 91) | typedef enum _gdt_cct_QosTierConfiguration_QosTier {
type gdt_cct_BatchedLogRequest (line 103) | typedef struct _gdt_cct_BatchedLogRequest {
type gdt_cct_IosClientInfo (line 109) | typedef struct _gdt_cct_IosClientInfo {
type gdt_cct_ClientInfo (line 120) | typedef struct _gdt_cct_ClientInfo {
type gdt_cct_NetworkConnectionInfo (line 128) | typedef struct _gdt_cct_NetworkConnectionInfo {
type gdt_cct_QosTierConfiguration (line 136) | typedef struct _gdt_cct_QosTierConfiguration {
type gdt_cct_QosTiersOverride (line 144) | typedef struct _gdt_cct_QosTiersOverride {
type gdt_cct_LogEvent (line 152) | typedef struct _gdt_cct_LogEvent {
type gdt_cct_LogRequest (line 167) | typedef struct _gdt_cct_LogRequest {
type gdt_cct_LogResponse (line 183) | typedef struct _gdt_cct_LogResponse {
FILE: Pods/GoogleDataTransport/GoogleDataTransport/GDTCORLibrary/Internal/GDTCORPlatform.h
type SCNetworkReachabilityFlags (line 74) | typedef SCNetworkReachabilityFlags GDTCORNetworkReachabilityFlags;
type SCNetworkReachabilityRef (line 77) | typedef SCNetworkReachabilityRef GDTCORNetworkReachabilityRef;
type GDTCORNetworkReachabilityRef (line 89) | typedef struct {
type NSUInteger (line 169) | typedef volatile NSUInteger GDTCORBackgroundIdentifier;
FILE: Pods/GoogleUtilities/GoogleUtilities/Reachability/GULReachabilityChecker+Internal.h
type SCNetworkReachabilityRef (line 20) | typedef SCNetworkReachabilityRef (*GULReachabilityCreateWithNameFn)(CFAl...
type Boolean (line 23) | typedef Boolean (*GULReachabilitySetCallbackFn)(SCNetworkReachabilityRef...
type Boolean (line 26) | typedef Boolean (*GULReachabilityScheduleWithRunLoopFn)(SCNetworkReachab...
type Boolean (line 29) | typedef Boolean (*GULReachabilityUnscheduleFromRunLoopFn)(SCNetworkReach...
type GULReachabilityApi (line 35) | struct GULReachabilityApi {
type GULReachabilityApi (line 45) | struct GULReachabilityApi
type GULReachabilityApi (line 46) | struct GULReachabilityApi
FILE: Pods/GoogleUtilities/GoogleUtilities/Reachability/Public/GoogleUtilities/GULReachabilityChecker.h
type GULReachabilityStatus (line 23) | typedef enum {
FILE: Pods/PromisesObjC/Sources/FBLPromises/include/FBLPromise+Retry.h
type id (line 29) | typedef id __nullable (^FBLPromiseRetryWorkBlock)(void)
FILE: Pods/PromisesObjC/Sources/FBLPromises/include/FBLPromiseError.h
function NS_INLINE (line 33) | NS_INLINE BOOL FBLPromiseErrorIsTimedOut(NSError *error) NS_SWIFT_UNAVAI...
function NS_INLINE (line 38) | NS_INLINE BOOL FBLPromiseErrorIsValidationFailure(NSError *error) NS_SWI...
FILE: Pods/PromisesObjC/Sources/FBLPromises/include/FBLPromisePrivate.h
type id (line 28) | typedef id __nullable (^__nullable FBLPromiseChainedFulfillBlock)(Value ...
type id (line 30) | typedef id __nullable (^__nullable FBLPromiseChainedRejectBlock)(NSError...
FILE: Pods/SDWebImage/SDWebImage/Core/NSData+ImageContentType.h
type NSInteger (line 17) | typedef NSInteger SDImageFormat
FILE: Pods/SDWebImage/SDWebImage/Core/SDImageCacheConfig.h
type SDImageCacheConfigExpireTypeAccessDate (line 13) | typedef NS_ENUM(NSUInteger, SDImageCacheConfigExpireType) {
FILE: Pods/SDWebImage/SDWebImage/Core/SDImageCacheDefine.h
type SDImageCacheTypeNone (line 15) | typedef NS_ENUM(NSInteger, SDImageCacheType) {
type NSString (line 41) | typedef NSString * _Nullable (^SDImageCacheAdditionalCachePathBlock)(NSS...
FILE: Pods/SDWebImage/SDWebImage/Core/SDImageCachesManager.h
type SDImageCachesManagerOperationPolicySerial (line 13) | typedef NS_ENUM(NSUInteger, SDImageCachesManagerOperationPolicy) {
FILE: Pods/SDWebImage/SDWebImage/Core/SDImageCoder.h
type NSString (line 13) | typedef NSString * SDImageCoderOption
type NSDictionary (line 14) | typedef NSDictionary<SDImageCoderOption, id> SDImageCoderOptions;
type NSMutableDictionary (line 15) | typedef NSMutableDictionary<SDImageCoderOption, id> SDImageCoderMutableO...
FILE: Pods/SDWebImage/SDWebImage/Core/SDWebImageCacheKeyFilter.h
type NSString (line 12) | typedef NSString * _Nullable(^SDWebImageCacheKeyFilterBlock)(NSURL * _No...
FILE: Pods/SDWebImage/SDWebImage/Core/SDWebImageCacheSerializer.h
type NSData (line 12) | typedef NSData * _Nullable(^SDWebImageCacheSerializerBlock)(UIImage * _N...
FILE: Pods/SDWebImage/SDWebImage/Core/SDWebImageDefine.h
type NSString (line 12) | typedef NSString * SDWebImageContextOption
type NSDictionary (line 13) | typedef NSDictionary<SDWebImageContextOption, id> SDWebImageContext;
type NSMutableDictionary (line 14) | typedef NSMutableDictionary<SDWebImageContextOption, id> SDWebImageMutab...
FILE: Pods/SDWebImage/SDWebImage/Core/SDWebImageDownloader.h
type SDImageLoaderProgressBlock (line 103) | typedef SDImageLoaderProgressBlock SDWebImageDownloaderProgressBlock;
type SDImageLoaderCompletedBlock (line 104) | typedef SDImageLoaderCompletedBlock SDWebImageDownloaderCompletedBlock;
FILE: Pods/SDWebImage/SDWebImage/Core/SDWebImageDownloaderConfig.h
type SDWebImageDownloaderFIFOExecutionOrder (line 13) | typedef NS_ENUM(NSInteger, SDWebImageDownloaderExecutionOrder) {
FILE: Pods/SDWebImage/SDWebImage/Core/SDWebImageDownloaderDecryptor.h
type NSData (line 12) | typedef NSData * _Nullable (^SDWebImageDownloaderDecryptorBlock)(NSData ...
FILE: Pods/SDWebImage/SDWebImage/Core/SDWebImageDownloaderRequestModifier.h
type NSURLRequest (line 12) | typedef NSURLRequest * _Nullable (^SDWebImageDownloaderRequestModifierBl...
FILE: Pods/SDWebImage/SDWebImage/Core/SDWebImageDownloaderResponseModifier.h
type NSURLResponse (line 12) | typedef NSURLResponse * _Nullable (^SDWebImageDownloaderResponseModifier...
FILE: Pods/SDWebImage/SDWebImage/Core/SDWebImageOptionsProcessor.h
type SDWebImageOptionsResult (line 15) | typedef SDWebImageOptionsResult * _Nullable(^SDWebImageOptionsProcessorB...
FILE: Pods/SDWebImage/SDWebImage/Core/SDWebImageTransition.h
type UIViewAnimationOptions (line 15) | typedef UIViewAnimationOptions SDWebImageAnimationOptions;
FILE: Pods/SDWebImage/SDWebImage/Core/UIImage+Transform.h
type UIRectCorner (line 18) | typedef UIRectCorner SDRectCorner;
FILE: Pods/nanopb/pb.h
type uint_least8_t (line 148) | typedef uint_least8_t pb_type_t;
type pb_size_t (line 212) | typedef uint32_t pb_size_t;
type pb_ssize_t (line 213) | typedef int32_t pb_ssize_t;
type uint_least16_t (line 215) | typedef uint_least16_t pb_size_t;
type int_least16_t (line 216) | typedef int_least16_t pb_ssize_t;
type uint_least8_t (line 218) | typedef uint_least8_t pb_size_t;
type int_least8_t (line 219) | typedef int_least8_t pb_ssize_t;
type uint_least8_t (line 227) | typedef uint_least8_t pb_byte_t;
type pb_field_s (line 238) | struct pb_field_s
type pb_field_s (line 239) | struct pb_field_s {
type pb_bytes_array_s (line 272) | struct pb_bytes_array_s {
type pb_bytes_array_t (line 276) | typedef struct pb_bytes_array_s pb_bytes_array_t;
type pb_istream_t (line 296) | typedef struct pb_istream_s pb_istream_t;
type pb_ostream_t (line 297) | typedef struct pb_ostream_s pb_ostream_t;
type pb_callback_t (line 298) | typedef struct pb_callback_s pb_callback_t;
type pb_callback_s (line 299) | struct pb_callback_s {
type pb_wire_type_t (line 319) | typedef enum {
type pb_extension_type_t (line 332) | typedef struct pb_extension_type_s pb_extension_type_t;
type pb_extension_t (line 333) | typedef struct pb_extension_s pb_extension_t;
type pb_extension_type_s (line 334) | struct pb_extension_type_s {
type pb_extension_s (line 356) | struct pb_extension_s {
FILE: Pods/nanopb/pb_common.c
function pb_field_iter_begin (line 8) | bool pb_field_iter_begin(pb_field_iter_t *iter, const pb_field_t *fields...
function pb_field_iter_next (line 20) | bool pb_field_iter_next(pb_field_iter_t *iter)
function pb_field_iter_find (line 78) | bool pb_field_iter_find(pb_field_iter_t *iter, uint32_t tag)
FILE: Pods/nanopb/pb_common.h
type pb_field_iter_s (line 15) | struct pb_field_iter_s {
type pb_field_iter_t (line 23) | typedef struct pb_field_iter_s pb_field_iter_t;
FILE: Pods/nanopb/pb_decode.c
function buf_read (line 87) | static bool checkreturn buf_read(pb_istream_t *stream, pb_byte_t *buf, s...
function pb_read (line 102) | bool checkreturn pb_read(pb_istream_t *stream, pb_byte_t *buf, size_t co...
function pb_readbyte (line 141) | static bool checkreturn pb_readbyte(pb_istream_t *stream, pb_byte_t *buf)
function pb_istream_t (line 159) | pb_istream_t pb_istream_from_buffer(const pb_byte_t *buf, size_t bufsize)
function pb_decode_varint32_eof (line 187) | static bool checkreturn pb_decode_varint32_eof(pb_istream_t *stream, uin...
function pb_decode_varint32 (line 249) | bool checkreturn pb_decode_varint32(pb_istream_t *stream, uint32_t *dest)
function pb_decode_varint (line 255) | bool checkreturn pb_decode_varint(pb_istream_t *stream, uint64_t *dest)
function pb_skip_varint (line 278) | bool checkreturn pb_skip_varint(pb_istream_t *stream)
function pb_skip_string (line 289) | bool checkreturn pb_skip_string(pb_istream_t *stream)
function pb_decode_tag (line 298) | bool checkreturn pb_decode_tag(pb_istream_t *stream, pb_wire_type_t *wir...
function pb_skip_field (line 321) | bool checkreturn pb_skip_field(pb_istream_t *stream, pb_wire_type_t wire...
function read_raw_value (line 336) | static bool checkreturn read_raw_value(pb_istream_t *stream, pb_wire_typ...
function pb_make_string_substream (line 372) | bool checkreturn pb_make_string_substream(pb_istream_t *stream, pb_istre...
function pb_close_string_substream (line 387) | bool checkreturn pb_close_string_substream(pb_istream_t *stream, pb_istr...
function decode_static_field (line 406) | static bool checkreturn decode_static_field(pb_istream_t *stream, pb_wir...
function allocate_field (line 490) | static bool checkreturn allocate_field(pb_istream_t *stream, void *pData...
function initialize_pointer_field (line 536) | static void initialize_pointer_field(void *pItem, pb_field_iter_t *iter)
function decode_pointer_field (line 553) | static bool checkreturn decode_pointer_field(pb_istream_t *stream, pb_wi...
function decode_callback_field (line 680) | static bool checkreturn decode_callback_field(pb_istream_t *stream, pb_w...
function decode_field (line 734) | static bool checkreturn decode_field(pb_istream_t *stream, pb_wire_type_...
function iter_from_extension (line 762) | static void iter_from_extension(pb_field_iter_t *iter, pb_extension_t *e...
function default_extension_decoder (line 783) | static bool checkreturn default_extension_decoder(pb_istream_t *stream,
function decode_extension (line 799) | static bool checkreturn decode_extension(pb_istream_t *stream,
function find_extension_field (line 825) | static bool checkreturn find_extension_field(pb_field_iter_t *iter)
function pb_field_set_to_default (line 839) | static void pb_field_set_to_default(pb_field_iter_t *iter)
function pb_message_set_to_defaults (line 911) | static void pb_message_set_to_defaults(const pb_field_t fields[], void *...
function pb_decode_noinit (line 928) | bool checkreturn pb_decode_noinit(pb_istream_t *stream, const pb_field_t...
function pb_decode (line 1078) | bool checkreturn pb_decode(pb_istream_t *stream, const pb_field_t fields...
function pb_decode_delimited_noinit (line 1092) | bool pb_decode_delimited_noinit(pb_istream_t *stream, const pb_field_t f...
function pb_decode_delimited (line 1107) | bool pb_decode_delimited(pb_istream_t *stream, const pb_field_t fields[]...
function pb_decode_nullterminated (line 1122) | bool pb_decode_nullterminated(pb_istream_t *stream, const pb_field_t fie...
function pb_release_union_field (line 1131) | static bool pb_release_union_field(pb_istream_t *stream, pb_field_iter_t...
function pb_release_single_field (line 1164) | static void pb_release_single_field(const pb_field_iter_t *iter)
function pb_release (line 1255) | void pb_release(const pb_field_t fields[], void *dest_struct)
function pb_decode_bool (line 1274) | bool pb_decode_bool(pb_istream_t *stream, bool *dest)
function pb_decode_svarint (line 1279) | bool pb_decode_svarint(pb_istream_t *stream, pb_int64_t *dest)
function pb_decode_fixed32 (line 1293) | bool pb_decode_fixed32(pb_istream_t *stream, void *dest)
function pb_decode_fixed64 (line 1308) | bool pb_decode_fixed64(pb_istream_t *stream, void *dest)
function pb_dec_bool (line 1328) | static bool checkreturn pb_dec_bool(pb_istream_t *stream, const pb_field...
function pb_dec_varint (line 1339) | static bool checkreturn pb_dec_varint(pb_istream_t *stream, const pb_fie...
function pb_dec_uvarint (line 1376) | static bool checkreturn pb_dec_uvarint(pb_istream_t *stream, const pb_fi...
function pb_dec_svarint (line 1400) | static bool checkreturn pb_dec_svarint(pb_istream_t *stream, const pb_fi...
function pb_dec_fixed32 (line 1424) | static bool checkreturn pb_dec_fixed32(pb_istream_t *stream, const pb_fi...
function pb_dec_fixed64 (line 1430) | static bool checkreturn pb_dec_fixed64(pb_istream_t *stream, const pb_fi...
function pb_dec_bytes (line 1441) | static bool checkreturn pb_dec_bytes(pb_istream_t *stream, const pb_fiel...
function pb_dec_string (line 1481) | static bool checkreturn pb_dec_string(pb_istream_t *stream, const pb_fie...
function pb_dec_submessage (line 1519) | static bool checkreturn pb_dec_submessage(pb_istream_t *stream, const pb...
function pb_dec_fixed_length_bytes (line 1543) | static bool checkreturn pb_dec_fixed_length_bytes(pb_istream_t *stream, ...
FILE: Pods/nanopb/pb_decode.h
type pb_istream_s (line 28) | struct pb_istream_s
FILE: Pods/nanopb/pb_encode.c
function buf_write (line 74) | static bool checkreturn buf_write(pb_ostream_t *stream, const pb_byte_t ...
function pb_ostream_t (line 86) | pb_ostream_t pb_ostream_from_buffer(pb_byte_t *buf, size_t bufsize)
function pb_write (line 103) | bool checkreturn pb_write(pb_ostream_t *stream, const pb_byte_t *buf, si...
function safe_read_bool (line 134) | static bool safe_read_bool(const void *pSize)
function encode_array (line 147) | static bool checkreturn encode_array(pb_ostream_t *stream, const pb_fiel...
function pb_check_proto3_default_value (line 240) | static bool pb_check_proto3_default_value(const pb_field_t *field, const...
function encode_basic_field (line 341) | static bool checkreturn encode_basic_field(pb_ostream_t *stream,
function encode_callback_field (line 430) | static bool checkreturn encode_callback_field(pb_ostream_t *stream,
function encode_field (line 450) | static bool checkreturn encode_field(pb_ostream_t *stream,
function default_extension_encoder (line 469) | static bool checkreturn default_extension_encoder(pb_ostream_t *stream,
function encode_extension_field (line 489) | static bool checkreturn encode_extension_field(pb_ostream_t *stream,
function pb_encode (line 528) | bool checkreturn pb_encode(pb_ostream_t *stream, const pb_field_t fields...
function pb_encode_delimited (line 552) | bool pb_encode_delimited(pb_ostream_t *stream, const pb_field_t fields[]...
function pb_encode_nullterminated (line 557) | bool pb_encode_nullterminated(pb_ostream_t *stream, const pb_field_t fie...
function pb_get_encoded_size (line 567) | bool pb_get_encoded_size(size_t *size, const pb_field_t fields[], const ...
function pb_encode_negative_varint (line 583) | bool checkreturn pb_encode_negative_varint(pb_ostream_t *stream, pb_uint...
function pb_encode_varint (line 608) | bool checkreturn pb_encode_varint(pb_ostream_t *stream, pb_uint64_t value)
function pb_encode_svarint (line 630) | bool checkreturn pb_encode_svarint(pb_ostream_t *stream, pb_int64_t value)
function pb_encode_fixed32 (line 641) | bool checkreturn pb_encode_fixed32(pb_ostream_t *stream, const void *value)
function pb_encode_fixed64 (line 653) | bool checkreturn pb_encode_fixed64(pb_ostream_t *stream, const void *value)
function pb_encode_tag (line 669) | bool checkreturn pb_encode_tag(pb_ostream_t *stream, pb_wire_type_t wire...
function pb_encode_tag_for_field (line 675) | bool checkreturn pb_encode_tag_for_field(pb_ostream_t *stream, const pb_...
function pb_encode_string (line 709) | bool checkreturn pb_encode_string(pb_ostream_t *stream, const pb_byte_t ...
function pb_encode_submessage (line 717) | bool checkreturn pb_encode_submessage(pb_ostream_t *stream, const pb_fie...
function pb_enc_bool (line 769) | static bool checkreturn pb_enc_bool(pb_ostream_t *stream, const pb_field...
function pb_enc_varint (line 776) | static bool checkreturn pb_enc_varint(pb_ostream_t *stream, const pb_fie...
function pb_enc_uvarint (line 799) | static bool checkreturn pb_enc_uvarint(pb_ostream_t *stream, const pb_fi...
function pb_enc_svarint (line 817) | static bool checkreturn pb_enc_svarint(pb_ostream_t *stream, const pb_fi...
function pb_enc_fixed64 (line 835) | static bool checkreturn pb_enc_fixed64(pb_ostream_t *stream, const pb_fi...
function pb_enc_fixed32 (line 846) | static bool checkreturn pb_enc_fixed32(pb_ostream_t *stream, const pb_fi...
function pb_enc_bytes (line 852) | static bool checkreturn pb_enc_bytes(pb_ostream_t *stream, const pb_fiel...
function pb_enc_string (line 875) | static bool checkreturn pb_enc_string(pb_ostream_t *stream, const pb_fie...
function pb_enc_submessage (line 901) | static bool checkreturn pb_enc_submessage(pb_ostream_t *stream, const pb...
function pb_enc_fixed_length_bytes (line 909) | static bool checkreturn pb_enc_fixed_length_bytes(pb_ostream_t *stream, ...
FILE: Pods/nanopb/pb_encode.h
type pb_ostream_s (line 27) | struct pb_ostream_s
Condensed preview — 661 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (3,470K chars).
[
{
"path": "Podfile",
"chars": 203,
"preview": "# Uncomment the next line to define a global platform for your project\n# platform :ios, '9.0'\n\ntarget 'Spotify' do\n use"
},
{
"path": "Pods/Appirater/Appirater.h",
"chars": 11982,
"preview": "/*\n This file is part of Appirater.\n \n Copyright (c) 2012, Arash Payan\n All rights reserved.\n \n Permission is hereby gra"
},
{
"path": "Pods/Appirater/Appirater.m",
"chars": 28564,
"preview": "/*\n This file is part of Appirater.\n \n Copyright (c) 2012, Arash Payan\n All rights reserved.\n \n Permission is hereby gra"
},
{
"path": "Pods/Appirater/AppiraterDelegate.h",
"chars": 709,
"preview": "//\n// AppiraterDelegate.h\n// Banana Stand\n//\n// Created by Robert Haining on 9/25/12.\n// Copyright (c) 2012 News.me."
},
{
"path": "Pods/Appirater/README.md",
"chars": 4288,
"preview": "Introduction\n---------------\n\nAppirater is a class that you can drop into any iPhone app (iOS 4.0 or later) that will he"
},
{
"path": "Pods/Appirater/ar.lproj/AppiraterLocalizable.strings",
"chars": 325,
"preview": "\"If you enjoy using %@, would you mind taking a moment to rate it? It won't take more than a minute. Thanks for your sup"
},
{
"path": "Pods/Appirater/ca.lproj/AppiraterLocalizable.strings",
"chars": 374,
"preview": "\"If you enjoy using %@, would you mind taking a moment to rate it? It won't take more than a minute. Thanks for your sup"
},
{
"path": "Pods/Appirater/cs.lproj/AppiraterLocalizable.strings",
"chars": 344,
"preview": "\"If you enjoy using %@, would you mind taking a moment to rate it? It won't take more than a minute. Thanks for your sup"
},
{
"path": "Pods/Appirater/da.lproj/AppiraterLocalizable.strings",
"chars": 364,
"preview": "\"If you enjoy using %@, would you mind taking a moment to rate it? It won't take more than a minute. Thanks for your sup"
},
{
"path": "Pods/Appirater/de.lproj/AppiraterLocalizable.strings",
"chars": 366,
"preview": "\"If you enjoy using %@, would you mind taking a moment to rate it? It won't take more than a minute. Thanks for your sup"
},
{
"path": "Pods/Appirater/el.lproj/AppiraterLocalizable.strings",
"chars": 387,
"preview": "\"If you enjoy using %@, would you mind taking a moment to rate it? It won't take more than a minute. Thanks for your sup"
},
{
"path": "Pods/Appirater/en.lproj/AppiraterLocalizable.strings",
"chars": 347,
"preview": "\"If you enjoy using %@, would you mind taking a moment to rate it? It won't take more than a minute. Thanks for your sup"
},
{
"path": "Pods/Appirater/es.lproj/AppiraterLocalizable.strings",
"chars": 344,
"preview": "\"If you enjoy using %@, would you mind taking a moment to rate it? It won't take more than a minute. Thanks for your sup"
},
{
"path": "Pods/Appirater/fa.lproj/AppiraterLocalizable.strings",
"chars": 360,
"preview": "\"If you enjoy using %@, would you mind taking a moment to rate it? It won't take more than a minute. Thanks for your sup"
},
{
"path": "Pods/Appirater/fi.lproj/AppiraterLocalizable.strings",
"chars": 350,
"preview": "\"If you enjoy using %@, would you mind taking a moment to rate it? It won't take more than a minute. Thanks for your sup"
},
{
"path": "Pods/Appirater/fr.lproj/AppiraterLocalizable.strings",
"chars": 366,
"preview": "\"If you enjoy using %@, would you mind taking a moment to rate it? It won't take more than a minute. Thanks for your sup"
},
{
"path": "Pods/Appirater/he.lproj/AppiraterLocalizable.strings",
"chars": 295,
"preview": "\"If you enjoy using %@, would you mind taking a moment to rate it? It won't take more than a minute. Thanks for your sup"
},
{
"path": "Pods/Appirater/hu.lproj/AppiraterLocalizable.strings",
"chars": 346,
"preview": "\"If you enjoy using %@, would you mind taking a moment to rate it? It won't take more than a minute. Thanks for your sup"
},
{
"path": "Pods/Appirater/hy.lproj/AppiraterLocalizable.strings",
"chars": 416,
"preview": "\"If you enjoy using %@, would you mind taking a moment to rate it? It won't take more than a minute. Thanks for your sup"
},
{
"path": "Pods/Appirater/id.lproj/AppiraterLocalizable.strings",
"chars": 398,
"preview": "\"If you enjoy using %@, would you mind taking a moment to rate it? It won't take more than a minute. Thanks for your sup"
},
{
"path": "Pods/Appirater/it.lproj/AppiraterLocalizable.strings",
"chars": 378,
"preview": "\"If you enjoy using %@, would you mind taking a moment to rate it? It won't take more than a minute. Thanks for your sup"
},
{
"path": "Pods/Appirater/ja.lproj/AppiraterLocalizable.strings",
"chars": 274,
"preview": "\"If you enjoy using %@, would you mind taking a moment to rate it? It won't take more than a minute. Thanks for your sup"
},
{
"path": "Pods/Appirater/ko.lproj/AppiraterLocalizable.strings",
"chars": 266,
"preview": "\"If you enjoy using %@, would you mind taking a moment to rate it? It won't take more than a minute. Thanks for your sup"
},
{
"path": "Pods/Appirater/ms.lproj/AppiraterLocalizable.strings",
"chars": 370,
"preview": "\"If you enjoy using %@, would you mind taking a moment to rate it? It won't take more than a minute. Thanks for your sup"
},
{
"path": "Pods/Appirater/nb.lproj/AppiraterLocalizable.strings",
"chars": 353,
"preview": "\"If you enjoy using %@, would you mind taking a moment to rate it? It won't take more than a minute. Thanks for your sup"
},
{
"path": "Pods/Appirater/nl.lproj/AppiraterLocalizable.strings",
"chars": 391,
"preview": "\"If you enjoy using %@, would you mind taking a moment to rate it? It won't take more than a minute. Thanks for your sup"
},
{
"path": "Pods/Appirater/pl.lproj/AppiraterLocalizable.strings",
"chars": 390,
"preview": "\"If you enjoy using %@, would you mind taking a moment to rate it? It won't take more than a minute. Thanks for your sup"
},
{
"path": "Pods/Appirater/pt-BR.lproj/AppiraterLocalizable.strings",
"chars": 328,
"preview": "\"If you enjoy using %@, would you mind taking a moment to rate it? It won't take more than a minute. Thanks for your sup"
},
{
"path": "Pods/Appirater/pt.lproj/AppiraterLocalizable.strings",
"chars": 328,
"preview": "\"If you enjoy using %@, would you mind taking a moment to rate it? It won't take more than a minute. Thanks for your sup"
},
{
"path": "Pods/Appirater/ro.lproj/AppiraterLocalizable.strings",
"chars": 335,
"preview": "\"If you enjoy using %@, would you mind taking a moment to rate it? It won't take more than a minute. Thanks for your sup"
},
{
"path": "Pods/Appirater/ru.lproj/AppiraterLocalizable.strings",
"chars": 350,
"preview": "\"If you enjoy using %@, would you mind taking a moment to rate it? It won't take more than a minute. Thanks for your sup"
},
{
"path": "Pods/Appirater/sk.lproj/AppiraterLocalizable.strings",
"chars": 356,
"preview": "\"If you enjoy using %@, would you mind taking a moment to rate it? It won't take more than a minute. Thanks for your sup"
},
{
"path": "Pods/Appirater/sv.lproj/AppiraterLocalizable.strings",
"chars": 342,
"preview": "\"If you enjoy using %@, would you mind taking a moment to rate it? It won't take more than a minute. Thanks for your sup"
},
{
"path": "Pods/Appirater/th.lproj/AppiraterLocalizable.strings",
"chars": 340,
"preview": "\"If you enjoy using %@, would you mind taking a moment to rate it? It won't take more than a minute. Thanks for your sup"
},
{
"path": "Pods/Appirater/tr.lproj/AppiraterLocalizable.strings",
"chars": 390,
"preview": "\"If you enjoy using %@, would you mind taking a moment to rate it? It won't take more than a minute. Thanks for your sup"
},
{
"path": "Pods/Appirater/uk.lproj/AppiraterLocalizable.strings",
"chars": 345,
"preview": "\"If you enjoy using %@, would you mind taking a moment to rate it? It won't take more than a minute. Thanks for your sup"
},
{
"path": "Pods/Appirater/vi.lproj/AppiraterLocalizable.strings",
"chars": 367,
"preview": "\"If you enjoy using %@, would you mind taking a moment to rate it? It won't take more than a minute. Thanks for your sup"
},
{
"path": "Pods/Appirater/zh-Hans.lproj/AppiraterLocalizable.strings",
"chars": 245,
"preview": "\"If you enjoy using %@, would you mind taking a moment to rate it? It won't take more than a minute. Thanks for your sup"
},
{
"path": "Pods/Appirater/zh-Hant.lproj/AppiraterLocalizable.strings",
"chars": 245,
"preview": "\"If you enjoy using %@, would you mind taking a moment to rate it? It won't take more than a minute. Thanks for your sup"
},
{
"path": "Pods/Firebase/CoreOnly/Sources/Firebase.h",
"chars": 2745,
"preview": "// Copyright 2019 Google\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this f"
},
{
"path": "Pods/Firebase/CoreOnly/Sources/module.modulemap",
"chars": 52,
"preview": "module Firebase {\n export *\n header \"Firebase.h\"\n}"
},
{
"path": "Pods/Firebase/LICENSE",
"chars": 11358,
"preview": "\n Apache License\n Version 2.0, January 2004\n "
},
{
"path": "Pods/Firebase/README.md",
"chars": 15424,
"preview": "[](https://cocoapods.org/pods/Firebase)\n[](https://cocoapods.org/pods/Firebase)\n[](https://cocoapods.org/pods/Firebase)\n[](https://cocoapods.org/pods/Firebase)\n[![License"
},
{
"path": "Pods/GoogleAppMeasurement/Frameworks/GoogleAppMeasurement.xcframework/Info.plist",
"chars": 1132,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/P"
},
{
"path": "Pods/GoogleAppMeasurement/Frameworks/GoogleAppMeasurement.xcframework/ios-arm64_armv7/GoogleAppMeasurement.framework/Info.plist",
"chars": 645,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/P"
},
{
"path": "Pods/GoogleAppMeasurement/Frameworks/GoogleAppMeasurement.xcframework/ios-arm64_armv7/GoogleAppMeasurement.framework/Modules/module.modulemap",
"chars": 231,
"preview": "framework module GoogleAppMeasurement {\numbrella header \"GoogleAppMeasurement-umbrella.h\"\nexport *\nmodule * { export * }"
},
{
"path": "Pods/GoogleAppMeasurement/Frameworks/GoogleAppMeasurement.xcframework/ios-arm64_i386_x86_64-simulator/GoogleAppMeasurement.framework/Info.plist",
"chars": 645,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/P"
},
{
"path": "Pods/GoogleAppMeasurement/Frameworks/GoogleAppMeasurement.xcframework/ios-arm64_i386_x86_64-simulator/GoogleAppMeasurement.framework/Modules/module.modulemap",
"chars": 231,
"preview": "framework module GoogleAppMeasurement {\numbrella header \"GoogleAppMeasurement-umbrella.h\"\nexport *\nmodule * { export * }"
},
{
"path": "Pods/GoogleDataTransport/GoogleDataTransport/GDTCCTLibrary/GDTCCTCompressionHelper.m",
"chars": 2706,
"preview": "/*\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use"
},
{
"path": "Pods/GoogleDataTransport/GoogleDataTransport/GDTCCTLibrary/GDTCCTNanopbHelpers.m",
"chars": 11826,
"preview": "/*\n * Copyright 2019 Google\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use thi"
},
{
"path": "Pods/GoogleDataTransport/GoogleDataTransport/GDTCCTLibrary/GDTCCTUploadOperation.m",
"chars": 23311,
"preview": "/*\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use"
},
{
"path": "Pods/GoogleDataTransport/GoogleDataTransport/GDTCCTLibrary/GDTCCTUploader.m",
"chars": 7601,
"preview": "/*\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use"
},
{
"path": "Pods/GoogleDataTransport/GoogleDataTransport/GDTCCTLibrary/GDTCOREvent+GDTCCTSupport.m",
"chars": 8773,
"preview": "/*\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use"
},
{
"path": "Pods/GoogleDataTransport/GoogleDataTransport/GDTCCTLibrary/Private/GDTCCTCompressionHelper.h",
"chars": 1311,
"preview": "/*\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use"
},
{
"path": "Pods/GoogleDataTransport/GoogleDataTransport/GDTCCTLibrary/Private/GDTCCTNanopbHelpers.h",
"chars": 4641,
"preview": "/*\n * Copyright 2019 Google\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use thi"
},
{
"path": "Pods/GoogleDataTransport/GoogleDataTransport/GDTCCTLibrary/Private/GDTCCTUploadOperation.h",
"chars": 3126,
"preview": "/*\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use"
},
{
"path": "Pods/GoogleDataTransport/GoogleDataTransport/GDTCCTLibrary/Private/GDTCCTUploader.h",
"chars": 1364,
"preview": "/*\n * Copyright 2019 Google\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use thi"
},
{
"path": "Pods/GoogleDataTransport/GoogleDataTransport/GDTCCTLibrary/Protogen/nanopb/cct.nanopb.c",
"chars": 7790,
"preview": "/*\n * Copyright 2019 Google\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use thi"
},
{
"path": "Pods/GoogleDataTransport/GoogleDataTransport/GDTCCTLibrary/Protogen/nanopb/cct.nanopb.h",
"chars": 14179,
"preview": "/*\n * Copyright 2019 Google\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use thi"
},
{
"path": "Pods/GoogleDataTransport/GoogleDataTransport/GDTCCTLibrary/Public/GDTCOREvent+GDTCCTSupport.h",
"chars": 1783,
"preview": "/*\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use"
},
{
"path": "Pods/GoogleDataTransport/GoogleDataTransport/GDTCORLibrary/GDTCORAssert.m",
"chars": 1485,
"preview": "/*\n * Copyright 2019 Google\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use thi"
},
{
"path": "Pods/GoogleDataTransport/GoogleDataTransport/GDTCORLibrary/GDTCORClock.m",
"chars": 6668,
"preview": "/*\n * Copyright 2018 Google\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use thi"
},
{
"path": "Pods/GoogleDataTransport/GoogleDataTransport/GDTCORLibrary/GDTCORConsoleLogger.m",
"chars": 2083,
"preview": "/*\n * Copyright 2018 Google\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use thi"
},
{
"path": "Pods/GoogleDataTransport/GoogleDataTransport/GDTCORLibrary/GDTCORDirectorySizeTracker.m",
"chars": 3103,
"preview": "/*\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use"
},
{
"path": "Pods/GoogleDataTransport/GoogleDataTransport/GDTCORLibrary/GDTCOREndpoints.m",
"chars": 4725,
"preview": "/*\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use"
},
{
"path": "Pods/GoogleDataTransport/GoogleDataTransport/GDTCORLibrary/GDTCOREvent.m",
"chars": 5923,
"preview": "/*\n * Copyright 2018 Google\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use thi"
},
{
"path": "Pods/GoogleDataTransport/GoogleDataTransport/GDTCORLibrary/GDTCORFlatFileStorage+Promises.m",
"chars": 4404,
"preview": "/*\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use"
},
{
"path": "Pods/GoogleDataTransport/GoogleDataTransport/GDTCORLibrary/GDTCORFlatFileStorage.m",
"chars": 34470,
"preview": "/*\n * Copyright 2018 Google\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use thi"
},
{
"path": "Pods/GoogleDataTransport/GoogleDataTransport/GDTCORLibrary/GDTCORLifecycle.m",
"chars": 5325,
"preview": "/*\n * Copyright 2019 Google\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use thi"
},
{
"path": "Pods/GoogleDataTransport/GoogleDataTransport/GDTCORLibrary/GDTCORPlatform.m",
"chars": 24867,
"preview": "/*\n * Copyright 2019 Google\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use thi"
},
{
"path": "Pods/GoogleDataTransport/GoogleDataTransport/GDTCORLibrary/GDTCORReachability.m",
"chars": 4395,
"preview": "/*\n * Copyright 2019 Google\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use thi"
},
{
"path": "Pods/GoogleDataTransport/GoogleDataTransport/GDTCORLibrary/GDTCORRegistrar.m",
"chars": 5511,
"preview": "/*\n * Copyright 2018 Google\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use thi"
},
{
"path": "Pods/GoogleDataTransport/GoogleDataTransport/GDTCORLibrary/GDTCORStorageEventSelector.m",
"chars": 1342,
"preview": "/*\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use"
},
{
"path": "Pods/GoogleDataTransport/GoogleDataTransport/GDTCORLibrary/GDTCORTransformer.m",
"chars": 4193,
"preview": "/*\n * Copyright 2018 Google\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use thi"
},
{
"path": "Pods/GoogleDataTransport/GoogleDataTransport/GDTCORLibrary/GDTCORTransport.m",
"chars": 3581,
"preview": "/*\n * Copyright 2018 Google\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use thi"
},
{
"path": "Pods/GoogleDataTransport/GoogleDataTransport/GDTCORLibrary/GDTCORUploadBatch.m",
"chars": 906,
"preview": "/*\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use"
},
{
"path": "Pods/GoogleDataTransport/GoogleDataTransport/GDTCORLibrary/GDTCORUploadCoordinator.m",
"chars": 6217,
"preview": "/*\n * Copyright 2018 Google\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use thi"
}
]
// ... and 461 more files (download for full content)
About this extraction
This page contains the full source code of the AfrazCodes/Spotify-iOS GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 661 files (34.4 MB), approximately 864.9k tokens, and a symbol index with 173 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.
Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.