diff --git a/CHANGELOG.md b/CHANGELOG.md index 982e4f6b..394e0a4e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,11 @@ # CHANGE LOG +## Version 3.3.0 (October 26, 2018) +* Adds support for Native InApp Notifications + +## Version 3.2.2 (September 26, 2018) +* Update Build Info + ## Version 3.2.1 (September 26, 2018) * Fix method swizzling issue diff --git a/CleverTap-iOS-SDK.podspec b/CleverTap-iOS-SDK.podspec index 92b364e9..c35c24b0 100644 --- a/CleverTap-iOS-SDK.podspec +++ b/CleverTap-iOS-SDK.podspec @@ -1,6 +1,6 @@ Pod::Spec.new do |s| s.name = "CleverTap-iOS-SDK" -s.version = "3.2.2" +s.version = "3.3.0" s.summary = "The CleverTap iOS SDK for App Analytics and Engagement." s.homepage = "https://github.com/CleverTap/clevertap-ios-sdk" s.license = { :type => "MIT" } @@ -9,11 +9,11 @@ s.source = { :git => "https://github.com/CleverTap/clevertap- s.requires_arc = true s.module_name = 'CleverTapSDK' s.resources = 'CleverTapSDK/*.crt' +s.ios.resources = 'CleverTapSDK/**/*.{png,xib}' s.ios.deployment_target = '8.0' -s.ios.source_files = 'CleverTapSDK/*.{h,m}' +s.ios.source_files = 'CleverTapSDK/**/*.{h,m}' s.ios.public_header_files = 'CleverTapSDK/CleverTap.h', 'CleverTapSDK/CleverTap+SSLPinning.h', 'CleverTapSDK/CleverTapInstanceConfig.h', 'CleverTapSDK/CleverTapBuildInfo.h', 'CleverTapSDK/CleverTapEventDetail.h', 'CleverTapSDK/CleverTapInAppNotificationDelegate.h', 'CleverTapSDK/CleverTapSyncDelegate.h', 'CleverTapSDK/CleverTapTrackedViewController.h', 'CleverTapSDK/CleverTapUTMDetail.h' s.tvos.deployment_target = '9.0' s.tvos.source_files = 'CleverTapSDK/*.{h,m}' -s.tvos.exclude_files = 'CleverTapSDK/CTInAppHTMLViewController.{h,m}' s.tvos.public_header_files = 'CleverTapSDK/CleverTap.h', 'CleverTapSDK/CleverTap+SSLPinning.h', 'CleverTapSDK/CleverTapInstanceConfig.h', 'CleverTapSDK/CleverTapBuildInfo.h', 'CleverTapSDK/CleverTapEventDetail.h', 'CleverTapSDK/CleverTapSyncDelegate.h', 'CleverTapSDK/CleverTapTrackedViewController.h', 'CleverTapSDK/CleverTapUTMDetail.h' end diff --git a/CleverTapSDK.xcodeproj/project.pbxproj b/CleverTapSDK.xcodeproj/project.pbxproj index 3244edfb..82b747bb 100644 --- a/CleverTapSDK.xcodeproj/project.pbxproj +++ b/CleverTapSDK.xcodeproj/project.pbxproj @@ -7,20 +7,108 @@ objects = { /* Begin PBXBuildFile section */ + 071EB4C7217F6427008F0FAB /* CTFooterViewController.h in Headers */ = {isa = PBXBuildFile; fileRef = 071EB477217F6427008F0FAB /* CTFooterViewController.h */; settings = {ATTRIBUTES = (Private, ); }; }; + 071EB4C8217F6427008F0FAB /* CTDismissButton.m in Sources */ = {isa = PBXBuildFile; fileRef = 071EB478217F6427008F0FAB /* CTDismissButton.m */; }; + 071EB4C9217F6427008F0FAB /* CTHeaderViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 071EB479217F6427008F0FAB /* CTHeaderViewController.m */; }; + 071EB4CA217F6427008F0FAB /* CTHalfInterstitialViewController~ipad.xib in Resources */ = {isa = PBXBuildFile; fileRef = 071EB47A217F6427008F0FAB /* CTHalfInterstitialViewController~ipad.xib */; }; + 071EB4CB217F6427008F0FAB /* CTHalfInterstitialViewController~iphoneport.xib in Resources */ = {isa = PBXBuildFile; fileRef = 071EB47B217F6427008F0FAB /* CTHalfInterstitialViewController~iphoneport.xib */; }; + 071EB4CC217F6427008F0FAB /* CTHalfInterstitialViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 071EB47C217F6427008F0FAB /* CTHalfInterstitialViewController.m */; }; + 071EB4CD217F6427008F0FAB /* CTInAppUtils.m in Sources */ = {isa = PBXBuildFile; fileRef = 071EB47D217F6427008F0FAB /* CTInAppUtils.m */; }; + 071EB4CE217F6427008F0FAB /* CTInAppDisplayViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 071EB47E217F6427008F0FAB /* CTInAppDisplayViewController.m */; }; + 071EB4CF217F6427008F0FAB /* CTBaseHeaderFooterViewControllerPrivate.h in Headers */ = {isa = PBXBuildFile; fileRef = 071EB47F217F6427008F0FAB /* CTBaseHeaderFooterViewControllerPrivate.h */; settings = {ATTRIBUTES = (Private, ); }; }; + 071EB4D0217F6427008F0FAB /* CTInterstitialViewController~ipad.xib in Resources */ = {isa = PBXBuildFile; fileRef = 071EB480217F6427008F0FAB /* CTInterstitialViewController~ipad.xib */; }; + 071EB4D1217F6427008F0FAB /* CTNotificationButton.m in Sources */ = {isa = PBXBuildFile; fileRef = 071EB481217F6427008F0FAB /* CTNotificationButton.m */; }; + 071EB4D2217F6427008F0FAB /* CTInterstitialImageViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 071EB482217F6427008F0FAB /* CTInterstitialImageViewController.m */; }; + 071EB4D3217F6427008F0FAB /* CTAVPlayerViewController.h in Headers */ = {isa = PBXBuildFile; fileRef = 071EB483217F6427008F0FAB /* CTAVPlayerViewController.h */; settings = {ATTRIBUTES = (Private, ); }; }; + 071EB4D4217F6427008F0FAB /* CTBaseHeaderFooterViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 071EB484217F6427008F0FAB /* CTBaseHeaderFooterViewController.m */; }; + 071EB4D5217F6427008F0FAB /* CTCoverImageViewController~iphoneport.xib in Resources */ = {isa = PBXBuildFile; fileRef = 071EB485217F6427008F0FAB /* CTCoverImageViewController~iphoneport.xib */; }; + 071EB4D6217F6427008F0FAB /* CTInAppFCManager.h in Headers */ = {isa = PBXBuildFile; fileRef = 071EB486217F6427008F0FAB /* CTInAppFCManager.h */; settings = {ATTRIBUTES = (Private, ); }; }; + 071EB4D7217F6427008F0FAB /* CTCoverViewController.h in Headers */ = {isa = PBXBuildFile; fileRef = 071EB487217F6427008F0FAB /* CTCoverViewController.h */; settings = {ATTRIBUTES = (Private, ); }; }; + 071EB4D8217F6427008F0FAB /* CTHalfInterstitialImageViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 071EB488217F6427008F0FAB /* CTHalfInterstitialImageViewController.m */; }; + 071EB4D9217F6427008F0FAB /* FLAnimatedImage.m in Sources */ = {isa = PBXBuildFile; fileRef = 071EB489217F6427008F0FAB /* FLAnimatedImage.m */; }; + 071EB4DA217F6427008F0FAB /* ic_shrink@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 071EB48B217F6427008F0FAB /* ic_shrink@2x.png */; }; + 071EB4DB217F6427008F0FAB /* ic_play@1x.png in Resources */ = {isa = PBXBuildFile; fileRef = 071EB48C217F6427008F0FAB /* ic_play@1x.png */; }; + 071EB4DC217F6427008F0FAB /* ic_shrink@3x.png in Resources */ = {isa = PBXBuildFile; fileRef = 071EB48D217F6427008F0FAB /* ic_shrink@3x.png */; }; + 071EB4DD217F6427008F0FAB /* ic_thumb.png in Resources */ = {isa = PBXBuildFile; fileRef = 071EB48E217F6427008F0FAB /* ic_thumb.png */; }; + 071EB4DF217F6427008F0FAB /* ic_expand@3x.png in Resources */ = {isa = PBXBuildFile; fileRef = 071EB490217F6427008F0FAB /* ic_expand@3x.png */; }; + 071EB4E0217F6427008F0FAB /* ic_expand@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 071EB491217F6427008F0FAB /* ic_expand@2x.png */; }; + 071EB4E1217F6427008F0FAB /* ic_pause@1x.png in Resources */ = {isa = PBXBuildFile; fileRef = 071EB492217F6427008F0FAB /* ic_pause@1x.png */; }; + 071EB4E2217F6427008F0FAB /* ic_pause@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 071EB493217F6427008F0FAB /* ic_pause@2x.png */; }; + 071EB4E3217F6427008F0FAB /* ic_expand@1x.png in Resources */ = {isa = PBXBuildFile; fileRef = 071EB494217F6427008F0FAB /* ic_expand@1x.png */; }; + 071EB4E4217F6427008F0FAB /* ic_pause@3x.png in Resources */ = {isa = PBXBuildFile; fileRef = 071EB495217F6427008F0FAB /* ic_pause@3x.png */; }; + 071EB4E5217F6427008F0FAB /* ic_play@3x.png in Resources */ = {isa = PBXBuildFile; fileRef = 071EB496217F6427008F0FAB /* ic_play@3x.png */; }; + 071EB4E6217F6427008F0FAB /* ic_play@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 071EB497217F6427008F0FAB /* ic_play@2x.png */; }; + 071EB4E7217F6427008F0FAB /* ic_shrink@1x.png in Resources */ = {isa = PBXBuildFile; fileRef = 071EB498217F6427008F0FAB /* ic_shrink@1x.png */; }; + 071EB4E8217F6427008F0FAB /* CTFooterViewController~ipad.xib in Resources */ = {isa = PBXBuildFile; fileRef = 071EB499217F6427008F0FAB /* CTFooterViewController~ipad.xib */; }; + 071EB4E9217F6427008F0FAB /* CTSlider.h in Headers */ = {isa = PBXBuildFile; fileRef = 071EB49A217F6427008F0FAB /* CTSlider.h */; settings = {ATTRIBUTES = (Private, ); }; }; + 071EB4EA217F6427008F0FAB /* FLAnimatedImageView.m in Sources */ = {isa = PBXBuildFile; fileRef = 071EB49B217F6427008F0FAB /* FLAnimatedImageView.m */; }; + 071EB4EB217F6427008F0FAB /* CTCoverImageViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 071EB49C217F6427008F0FAB /* CTCoverImageViewController.m */; }; + 071EB4EC217F6427008F0FAB /* CTAVPlayerControlsViewController.h in Headers */ = {isa = PBXBuildFile; fileRef = 071EB49D217F6427008F0FAB /* CTAVPlayerControlsViewController.h */; settings = {ATTRIBUTES = (Private, ); }; }; + 071EB4ED217F6427008F0FAB /* CTInterstitialImageViewController~iphoneport.xib in Resources */ = {isa = PBXBuildFile; fileRef = 071EB49E217F6427008F0FAB /* CTInterstitialImageViewController~iphoneport.xib */; }; + 071EB4EE217F6427008F0FAB /* CTAlertViewController.h in Headers */ = {isa = PBXBuildFile; fileRef = 071EB49F217F6427008F0FAB /* CTAlertViewController.h */; settings = {ATTRIBUTES = (Private, ); }; }; + 071EB4EF217F6427008F0FAB /* CTInterstitialViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 071EB4A0217F6427008F0FAB /* CTInterstitialViewController.m */; }; + 071EB4F0217F6427008F0FAB /* CTInAppDisplayViewControllerPrivate.h in Headers */ = {isa = PBXBuildFile; fileRef = 071EB4A1217F6427008F0FAB /* CTInAppDisplayViewControllerPrivate.h */; settings = {ATTRIBUTES = (Private, ); }; }; + 071EB4F1217F6427008F0FAB /* CTAVPlayerControlsViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 071EB4A2217F6427008F0FAB /* CTAVPlayerControlsViewController.xib */; }; + 071EB4F2217F6427008F0FAB /* CTCoverViewController~iphoneport.xib in Resources */ = {isa = PBXBuildFile; fileRef = 071EB4A3217F6427008F0FAB /* CTCoverViewController~iphoneport.xib */; }; + 071EB4F3217F6427008F0FAB /* CTInAppNotification.h in Headers */ = {isa = PBXBuildFile; fileRef = 071EB4A4217F6427008F0FAB /* CTInAppNotification.h */; settings = {ATTRIBUTES = (Private, ); }; }; + 071EB4F4217F6427008F0FAB /* CTCoverViewController~ipad.xib in Resources */ = {isa = PBXBuildFile; fileRef = 071EB4A5217F6427008F0FAB /* CTCoverViewController~ipad.xib */; }; + 071EB4F5217F6427008F0FAB /* CTInAppHTMLViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 071EB4A6217F6427008F0FAB /* CTInAppHTMLViewController.m */; }; + 071EB4F6217F6427008F0FAB /* CTInAppResources.m in Sources */ = {isa = PBXBuildFile; fileRef = 071EB4A7217F6427008F0FAB /* CTInAppResources.m */; }; + 071EB4F7217F6427008F0FAB /* CTHeaderViewController~iphoneport.xib in Resources */ = {isa = PBXBuildFile; fileRef = 071EB4A8217F6427008F0FAB /* CTHeaderViewController~iphoneport.xib */; }; + 071EB4F8217F6427008F0FAB /* CTInterstitialImageViewController.h in Headers */ = {isa = PBXBuildFile; fileRef = 071EB4A9217F6427008F0FAB /* CTInterstitialImageViewController.h */; settings = {ATTRIBUTES = (Private, ); }; }; + 071EB4F9217F6427008F0FAB /* CTNotificationButton.h in Headers */ = {isa = PBXBuildFile; fileRef = 071EB4AA217F6427008F0FAB /* CTNotificationButton.h */; settings = {ATTRIBUTES = (Private, ); }; }; + 071EB4FA217F6427008F0FAB /* CTAVPlayerViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 071EB4AB217F6427008F0FAB /* CTAVPlayerViewController.m */; }; + 071EB4FB217F6427008F0FAB /* CTInAppDisplayViewController.h in Headers */ = {isa = PBXBuildFile; fileRef = 071EB4AC217F6427008F0FAB /* CTInAppDisplayViewController.h */; settings = {ATTRIBUTES = (Private, ); }; }; + 071EB4FC217F6427008F0FAB /* CTHalfInterstitialViewController.h in Headers */ = {isa = PBXBuildFile; fileRef = 071EB4AD217F6427008F0FAB /* CTHalfInterstitialViewController.h */; settings = {ATTRIBUTES = (Private, ); }; }; + 071EB4FD217F6427008F0FAB /* CTInAppUtils.h in Headers */ = {isa = PBXBuildFile; fileRef = 071EB4AE217F6427008F0FAB /* CTInAppUtils.h */; settings = {ATTRIBUTES = (Private, ); }; }; + 071EB4FE217F6427008F0FAB /* CTDismissButton.h in Headers */ = {isa = PBXBuildFile; fileRef = 071EB4AF217F6427008F0FAB /* CTDismissButton.h */; settings = {ATTRIBUTES = (Private, ); }; }; + 071EB4FF217F6427008F0FAB /* CTHeaderViewController.h in Headers */ = {isa = PBXBuildFile; fileRef = 071EB4B0217F6427008F0FAB /* CTHeaderViewController.h */; settings = {ATTRIBUTES = (Private, ); }; }; + 071EB500217F6427008F0FAB /* CTHeaderViewController~ipad.xib in Resources */ = {isa = PBXBuildFile; fileRef = 071EB4B1217F6427008F0FAB /* CTHeaderViewController~ipad.xib */; }; + 071EB501217F6427008F0FAB /* CTFooterViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 071EB4B2217F6427008F0FAB /* CTFooterViewController.m */; }; + 071EB502217F6427008F0FAB /* FLAnimatedImage.h in Headers */ = {isa = PBXBuildFile; fileRef = 071EB4B3217F6427008F0FAB /* FLAnimatedImage.h */; settings = {ATTRIBUTES = (Private, ); }; }; + 071EB503217F6427008F0FAB /* CTHalfInterstitialImageViewController.h in Headers */ = {isa = PBXBuildFile; fileRef = 071EB4B4217F6427008F0FAB /* CTHalfInterstitialImageViewController.h */; settings = {ATTRIBUTES = (Private, ); }; }; + 071EB504217F6427008F0FAB /* CTInterstitialViewController~iphoneport.xib in Resources */ = {isa = PBXBuildFile; fileRef = 071EB4B5217F6427008F0FAB /* CTInterstitialViewController~iphoneport.xib */; }; + 071EB505217F6427008F0FAB /* CTCoverViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 071EB4B6217F6427008F0FAB /* CTCoverViewController.m */; }; + 071EB506217F6427008F0FAB /* CTInAppFCManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 071EB4B7217F6427008F0FAB /* CTInAppFCManager.m */; }; + 071EB507217F6427008F0FAB /* CTFooterViewController~iphoneport.xib in Resources */ = {isa = PBXBuildFile; fileRef = 071EB4B8217F6427008F0FAB /* CTFooterViewController~iphoneport.xib */; }; + 071EB508217F6427008F0FAB /* CTBaseHeaderFooterViewController.h in Headers */ = {isa = PBXBuildFile; fileRef = 071EB4B9217F6427008F0FAB /* CTBaseHeaderFooterViewController.h */; settings = {ATTRIBUTES = (Private, ); }; }; + 071EB509217F6427008F0FAB /* CTAlertViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 071EB4BA217F6427008F0FAB /* CTAlertViewController.m */; }; + 071EB50A217F6427008F0FAB /* CTHalfInterstitialImageViewController~ipad.xib in Resources */ = {isa = PBXBuildFile; fileRef = 071EB4BB217F6427008F0FAB /* CTHalfInterstitialImageViewController~ipad.xib */; }; + 071EB50B217F6427008F0FAB /* CTAVPlayerControlsViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 071EB4BC217F6427008F0FAB /* CTAVPlayerControlsViewController.m */; }; + 071EB50C217F6427008F0FAB /* CTCoverImageViewController.h in Headers */ = {isa = PBXBuildFile; fileRef = 071EB4BD217F6427008F0FAB /* CTCoverImageViewController.h */; settings = {ATTRIBUTES = (Private, ); }; }; + 071EB50D217F6427008F0FAB /* FLAnimatedImageView.h in Headers */ = {isa = PBXBuildFile; fileRef = 071EB4BE217F6427008F0FAB /* FLAnimatedImageView.h */; settings = {ATTRIBUTES = (Private, ); }; }; + 071EB50E217F6427008F0FAB /* CTInterstitialImageViewController~ipad.xib in Resources */ = {isa = PBXBuildFile; fileRef = 071EB4BF217F6427008F0FAB /* CTInterstitialImageViewController~ipad.xib */; }; + 071EB50F217F6427008F0FAB /* CTHalfInterstitialImageViewController~iphoneport.xib in Resources */ = {isa = PBXBuildFile; fileRef = 071EB4C0217F6427008F0FAB /* CTHalfInterstitialImageViewController~iphoneport.xib */; }; + 071EB510217F6427008F0FAB /* CTSlider.m in Sources */ = {isa = PBXBuildFile; fileRef = 071EB4C1217F6427008F0FAB /* CTSlider.m */; }; + 071EB511217F6427008F0FAB /* CTInAppResources.h in Headers */ = {isa = PBXBuildFile; fileRef = 071EB4C2217F6427008F0FAB /* CTInAppResources.h */; settings = {ATTRIBUTES = (Private, ); }; }; + 071EB512217F6427008F0FAB /* CTInAppHTMLViewController.h in Headers */ = {isa = PBXBuildFile; fileRef = 071EB4C3217F6427008F0FAB /* CTInAppHTMLViewController.h */; settings = {ATTRIBUTES = (Private, ); }; }; + 071EB513217F6427008F0FAB /* CTInAppNotification.m in Sources */ = {isa = PBXBuildFile; fileRef = 071EB4C4217F6427008F0FAB /* CTInAppNotification.m */; }; + 071EB514217F6427008F0FAB /* CTCoverImageViewController~ipad.xib in Resources */ = {isa = PBXBuildFile; fileRef = 071EB4C5217F6427008F0FAB /* CTCoverImageViewController~ipad.xib */; }; + 071EB515217F6427008F0FAB /* CTInterstitialViewController.h in Headers */ = {isa = PBXBuildFile; fileRef = 071EB4C6217F6427008F0FAB /* CTInterstitialViewController.h */; settings = {ATTRIBUTES = (Private, ); }; }; + 071EB518217F6510008F0FAB /* CTInAppFCManager.h in Headers */ = {isa = PBXBuildFile; fileRef = 071EB486217F6427008F0FAB /* CTInAppFCManager.h */; settings = {ATTRIBUTES = (Private, ); }; }; + 071EB519217F6513008F0FAB /* CTInAppFCManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 071EB4B7217F6427008F0FAB /* CTInAppFCManager.m */; }; + 071EB51A217F6565008F0FAB /* CTInAppNotification.h in Headers */ = {isa = PBXBuildFile; fileRef = 071EB4A4217F6427008F0FAB /* CTInAppNotification.h */; settings = {ATTRIBUTES = (Private, ); }; }; + 071EB51B217F6568008F0FAB /* CTInAppNotification.m in Sources */ = {isa = PBXBuildFile; fileRef = 071EB4C4217F6427008F0FAB /* CTInAppNotification.m */; }; + 071EB51C217F6721008F0FAB /* FLAnimatedImage.h in Headers */ = {isa = PBXBuildFile; fileRef = 071EB4B3217F6427008F0FAB /* FLAnimatedImage.h */; settings = {ATTRIBUTES = (Private, ); }; }; + 071EB51F217F6730008F0FAB /* FLAnimatedImage.m in Sources */ = {isa = PBXBuildFile; fileRef = 071EB489217F6427008F0FAB /* FLAnimatedImage.m */; }; + 071EB521217F6764008F0FAB /* CTNotificationButton.h in Headers */ = {isa = PBXBuildFile; fileRef = 071EB4AA217F6427008F0FAB /* CTNotificationButton.h */; settings = {ATTRIBUTES = (Private, ); }; }; + 071EB525217F6C8F008F0FAB /* CTInAppResources.h in Headers */ = {isa = PBXBuildFile; fileRef = 071EB4C2217F6427008F0FAB /* CTInAppResources.h */; settings = {ATTRIBUTES = (Private, ); }; }; + 071EB527217F6CD1008F0FAB /* CTNotificationButton.m in Sources */ = {isa = PBXBuildFile; fileRef = 071EB481217F6427008F0FAB /* CTNotificationButton.m */; }; + 0766014A21833277009A244E /* FLAnimatedImageView.h in Headers */ = {isa = PBXBuildFile; fileRef = 071EB4BE217F6427008F0FAB /* FLAnimatedImageView.h */; settings = {ATTRIBUTES = (Private, ); }; }; + 0766014B2183327D009A244E /* FLAnimatedImageView.m in Sources */ = {isa = PBXBuildFile; fileRef = 071EB49B217F6427008F0FAB /* FLAnimatedImageView.m */; }; + 079701E52180A055008BF668 /* sound-wave-headphones.png in Resources */ = {isa = PBXBuildFile; fileRef = 079701E42180A055008BF668 /* sound-wave-headphones.png */; }; + 07BF465B217F7C41002E166D /* CTInAppDisplayViewController.h in Headers */ = {isa = PBXBuildFile; fileRef = 071EB4AC217F6427008F0FAB /* CTInAppDisplayViewController.h */; settings = {ATTRIBUTES = (Private, ); }; }; + 07BF465C217F7C4B002E166D /* CTInAppDisplayViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 071EB47E217F6427008F0FAB /* CTInAppDisplayViewController.m */; }; + 07BF465D217F7C88002E166D /* CTInAppDisplayViewControllerPrivate.h in Headers */ = {isa = PBXBuildFile; fileRef = 071EB4A1217F6427008F0FAB /* CTInAppDisplayViewControllerPrivate.h */; settings = {ATTRIBUTES = (Private, ); }; }; + 07BF4661217F80C1002E166D /* CTInAppResources.m in Sources */ = {isa = PBXBuildFile; fileRef = 071EB4A7217F6427008F0FAB /* CTInAppResources.m */; }; + 07BF4662217F8359002E166D /* CTInAppUtils.h in Headers */ = {isa = PBXBuildFile; fileRef = 071EB4AE217F6427008F0FAB /* CTInAppUtils.h */; settings = {ATTRIBUTES = (Private, ); }; }; + 07BF4663217F838D002E166D /* CTInAppUtils.m in Sources */ = {isa = PBXBuildFile; fileRef = 071EB47D217F6427008F0FAB /* CTInAppUtils.m */; }; D0047B0A2098D45B0019C6FD /* CTLocalDataStore.h in Headers */ = {isa = PBXBuildFile; fileRef = D0047B082098D45B0019C6FD /* CTLocalDataStore.h */; settings = {ATTRIBUTES = (Private, ); }; }; D0047B0B2098D45B0019C6FD /* CTLocalDataStore.m in Sources */ = {isa = PBXBuildFile; fileRef = D0047B092098D45B0019C6FD /* CTLocalDataStore.m */; }; D0047B0E2098E2F00019C6FD /* CTProfileBuilder.h in Headers */ = {isa = PBXBuildFile; fileRef = D0047B0C2098E2F00019C6FD /* CTProfileBuilder.h */; settings = {ATTRIBUTES = (Private, ); }; }; D0047B0F2098E2F00019C6FD /* CTProfileBuilder.m in Sources */ = {isa = PBXBuildFile; fileRef = D0047B0D2098E2F00019C6FD /* CTProfileBuilder.m */; }; D0047B122098EDA90019C6FD /* CTLocationManager.h in Headers */ = {isa = PBXBuildFile; fileRef = D0047B102098EDA90019C6FD /* CTLocationManager.h */; settings = {ATTRIBUTES = (Private, ); }; }; D0047B132098EDA90019C6FD /* CTLocationManager.m in Sources */ = {isa = PBXBuildFile; fileRef = D0047B112098EDA90019C6FD /* CTLocationManager.m */; }; - D0047B1E209904DD0019C6FD /* CTInAppFCManager.h in Headers */ = {isa = PBXBuildFile; fileRef = D0047B1C209904DD0019C6FD /* CTInAppFCManager.h */; settings = {ATTRIBUTES = (Private, ); }; }; - D0047B1F209904DD0019C6FD /* CTInAppFCManager.m in Sources */ = {isa = PBXBuildFile; fileRef = D0047B1D209904DD0019C6FD /* CTInAppFCManager.m */; }; - D0047B22209935200019C6FD /* CTInAppUtils.h in Headers */ = {isa = PBXBuildFile; fileRef = D0047B20209935200019C6FD /* CTInAppUtils.h */; settings = {ATTRIBUTES = (Private, ); }; }; - D0047B23209935200019C6FD /* CTInAppUtils.m in Sources */ = {isa = PBXBuildFile; fileRef = D0047B21209935200019C6FD /* CTInAppUtils.m */; }; - D0047B26209935EA0019C6FD /* CTInAppDisplayViewController.h in Headers */ = {isa = PBXBuildFile; fileRef = D0047B24209935EA0019C6FD /* CTInAppDisplayViewController.h */; settings = {ATTRIBUTES = (Private, ); }; }; - D0047B27209935EA0019C6FD /* CTInAppDisplayViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = D0047B25209935EA0019C6FD /* CTInAppDisplayViewController.m */; }; - D0047B2A209936510019C6FD /* CTInAppNotification.h in Headers */ = {isa = PBXBuildFile; fileRef = D0047B28209936510019C6FD /* CTInAppNotification.h */; settings = {ATTRIBUTES = (Private, ); }; }; - D0047B2B209936510019C6FD /* CTInAppNotification.m in Sources */ = {isa = PBXBuildFile; fileRef = D0047B29209936510019C6FD /* CTInAppNotification.m */; }; D014B8DF20E2F9DE001E0780 /* CleverTap.h in Headers */ = {isa = PBXBuildFile; fileRef = D0C7BBC8207D8837001345EF /* CleverTap.h */; settings = {ATTRIBUTES = (Public, ); }; }; D014B8E020E2F9E6001E0780 /* CleverTap.m in Sources */ = {isa = PBXBuildFile; fileRef = D0C7BBC9207D8837001345EF /* CleverTap.m */; }; D014B8E120E2F9E9001E0780 /* CleverTap+SSLPinning.h in Headers */ = {isa = PBXBuildFile; fileRef = D0CACF8A20B890EA00A02327 /* CleverTap+SSLPinning.h */; settings = {ATTRIBUTES = (Public, ); }; }; @@ -66,17 +154,6 @@ D014B90920E2FB71001E0780 /* CTLocalDataStore.m in Sources */ = {isa = PBXBuildFile; fileRef = D0047B092098D45B0019C6FD /* CTLocalDataStore.m */; }; D014B90A20E2FB74001E0780 /* CTProfileBuilder.h in Headers */ = {isa = PBXBuildFile; fileRef = D0047B0C2098E2F00019C6FD /* CTProfileBuilder.h */; settings = {ATTRIBUTES = (Private, ); }; }; D014B90B20E2FB7A001E0780 /* CTProfileBuilder.m in Sources */ = {isa = PBXBuildFile; fileRef = D0047B0D2098E2F00019C6FD /* CTProfileBuilder.m */; }; - D014B90E20E2FB89001E0780 /* CTInAppFCManager.h in Headers */ = {isa = PBXBuildFile; fileRef = D0047B1C209904DD0019C6FD /* CTInAppFCManager.h */; settings = {ATTRIBUTES = (Private, ); }; }; - D014B90F20E2FB8F001E0780 /* CTInAppFCManager.m in Sources */ = {isa = PBXBuildFile; fileRef = D0047B1D209904DD0019C6FD /* CTInAppFCManager.m */; }; - D014B91020E2FB93001E0780 /* CTInAppUtils.h in Headers */ = {isa = PBXBuildFile; fileRef = D0047B20209935200019C6FD /* CTInAppUtils.h */; settings = {ATTRIBUTES = (Private, ); }; }; - D014B91120E2FB99001E0780 /* CTInAppUtils.m in Sources */ = {isa = PBXBuildFile; fileRef = D0047B21209935200019C6FD /* CTInAppUtils.m */; }; - D014B91220E2FB9C001E0780 /* CTInAppNotification.h in Headers */ = {isa = PBXBuildFile; fileRef = D0047B28209936510019C6FD /* CTInAppNotification.h */; settings = {ATTRIBUTES = (Private, ); }; }; - D014B91320E2FBA3001E0780 /* CTInAppNotification.m in Sources */ = {isa = PBXBuildFile; fileRef = D0047B29209936510019C6FD /* CTInAppNotification.m */; }; - D014B91420E2FBA8001E0780 /* CTInAppDisplayViewController.h in Headers */ = {isa = PBXBuildFile; fileRef = D0047B24209935EA0019C6FD /* CTInAppDisplayViewController.h */; settings = {ATTRIBUTES = (Private, ); }; }; - D014B91620E2FBB8001E0780 /* CTInAppDisplayViewControllerPrivate.h in Headers */ = {isa = PBXBuildFile; fileRef = D0047B2C209936E00019C6FD /* CTInAppDisplayViewControllerPrivate.h */; settings = {ATTRIBUTES = (Private, ); }; }; - D014B91720E2FBB9001E0780 /* CTInAppDisplayViewControllerPrivate.h in Headers */ = {isa = PBXBuildFile; fileRef = D0047B2C209936E00019C6FD /* CTInAppDisplayViewControllerPrivate.h */; settings = {ATTRIBUTES = (Private, ); }; }; - D014B91A20E2FBC8001E0780 /* CTDismissButton.h in Headers */ = {isa = PBXBuildFile; fileRef = D0A9802E209B892100499991 /* CTDismissButton.h */; settings = {ATTRIBUTES = (Private, ); }; }; - D014B91B20E2FBCD001E0780 /* CTDismissButton.m in Sources */ = {isa = PBXBuildFile; fileRef = D0A9802F209B892100499991 /* CTDismissButton.m */; }; D014B91C20E2FBD1001E0780 /* CTCertificatePinning.h in Headers */ = {isa = PBXBuildFile; fileRef = D0CACF8C20B8A44B00A02327 /* CTCertificatePinning.h */; settings = {ATTRIBUTES = (Private, ); }; }; D014B91D20E2FBD6001E0780 /* CTCertificatePinning.m in Sources */ = {isa = PBXBuildFile; fileRef = D0CACF8D20B8A44C00A02327 /* CTCertificatePinning.m */; }; D014B91E20E2FBDA001E0780 /* CTPinnedNSURLSessionDelegate.h in Headers */ = {isa = PBXBuildFile; fileRef = D0CACF9420B8A4F800A02327 /* CTPinnedNSURLSessionDelegate.h */; settings = {ATTRIBUTES = (Private, ); }; }; @@ -91,7 +168,6 @@ D01A0895207EC2D400423D6F /* CleverTapInstanceConfig.m in Sources */ = {isa = PBXBuildFile; fileRef = D01A0893207EC2D400423D6F /* CleverTapInstanceConfig.m */; }; D01A0898207ED98300423D6F /* CTPlistInfo.m in Sources */ = {isa = PBXBuildFile; fileRef = D01A0896207ED98300423D6F /* CTPlistInfo.m */; }; D01A0899207ED98300423D6F /* CTPlistInfo.h in Headers */ = {isa = PBXBuildFile; fileRef = D01A0897207ED98300423D6F /* CTPlistInfo.h */; settings = {ATTRIBUTES = (Private, ); }; }; - D01F688B210295A7004DEC85 /* CTInAppDisplayViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = D0047B25209935EA0019C6FD /* CTInAppDisplayViewController.m */; }; D020C928209006AD0073F61E /* CTUriHelper.h in Headers */ = {isa = PBXBuildFile; fileRef = D020C926209006AD0073F61E /* CTUriHelper.h */; settings = {ATTRIBUTES = (Private, ); }; }; D020C929209006AD0073F61E /* CTUriHelper.m in Sources */ = {isa = PBXBuildFile; fileRef = D020C927209006AD0073F61E /* CTUriHelper.m */; }; D0213D4B207D905800FE5740 /* CleverTapInAppNotificationDelegate.h in Headers */ = {isa = PBXBuildFile; fileRef = D0213D43207D905700FE5740 /* CleverTapInAppNotificationDelegate.h */; settings = {ATTRIBUTES = (Public, ); }; }; @@ -116,11 +192,6 @@ D0A84AD9209135D400191B1F /* CTPreferences.m in Sources */ = {isa = PBXBuildFile; fileRef = D0A84AD7209135D400191B1F /* CTPreferences.m */; }; D0A84ADC209136D500191B1F /* CTLogger.h in Headers */ = {isa = PBXBuildFile; fileRef = D0A84ADA209136D500191B1F /* CTLogger.h */; settings = {ATTRIBUTES = (Private, ); }; }; D0A84ADD209136D500191B1F /* CTLogger.m in Sources */ = {isa = PBXBuildFile; fileRef = D0A84ADB209136D500191B1F /* CTLogger.m */; }; - D0A9802C209B83B100499991 /* CTInAppHTMLViewController.h in Headers */ = {isa = PBXBuildFile; fileRef = D0A9802A209B83B100499991 /* CTInAppHTMLViewController.h */; settings = {ATTRIBUTES = (Private, ); }; }; - D0A9802D209B83B100499991 /* CTInAppHTMLViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = D0A9802B209B83B100499991 /* CTInAppHTMLViewController.m */; }; - D0A98030209B892100499991 /* CTDismissButton.h in Headers */ = {isa = PBXBuildFile; fileRef = D0A9802E209B892100499991 /* CTDismissButton.h */; settings = {ATTRIBUTES = (Private, ); }; }; - D0A98031209B892100499991 /* CTDismissButton.m in Sources */ = {isa = PBXBuildFile; fileRef = D0A9802F209B892100499991 /* CTDismissButton.m */; }; - D0A9E9CC20EEA8500004BC6F /* CTInAppHTMLViewController.h in Headers */ = {isa = PBXBuildFile; fileRef = D0A9802A209B83B100499991 /* CTInAppHTMLViewController.h */; settings = {ATTRIBUTES = (Private, ); }; }; D0A9E9CD20EEA8630004BC6F /* CTLocationManager.h in Headers */ = {isa = PBXBuildFile; fileRef = D0047B102098EDA90019C6FD /* CTLocationManager.h */; settings = {ATTRIBUTES = (Private, ); }; }; D0A9E9CE20EEA8770004BC6F /* CTLocationManager.m in Sources */ = {isa = PBXBuildFile; fileRef = D0047B112098EDA90019C6FD /* CTLocationManager.m */; }; D0C7BBCA207D8837001345EF /* CleverTap.h in Headers */ = {isa = PBXBuildFile; fileRef = D0C7BBC8207D8837001345EF /* CleverTap.h */; settings = {ATTRIBUTES = (Public, ); }; }; @@ -136,21 +207,91 @@ /* End PBXBuildFile section */ /* Begin PBXFileReference section */ + 071EB477217F6427008F0FAB /* CTFooterViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CTFooterViewController.h; sourceTree = ""; }; + 071EB478217F6427008F0FAB /* CTDismissButton.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CTDismissButton.m; sourceTree = ""; }; + 071EB479217F6427008F0FAB /* CTHeaderViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CTHeaderViewController.m; sourceTree = ""; }; + 071EB47A217F6427008F0FAB /* CTHalfInterstitialViewController~ipad.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = "CTHalfInterstitialViewController~ipad.xib"; sourceTree = ""; }; + 071EB47B217F6427008F0FAB /* CTHalfInterstitialViewController~iphoneport.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = "CTHalfInterstitialViewController~iphoneport.xib"; sourceTree = ""; }; + 071EB47C217F6427008F0FAB /* CTHalfInterstitialViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CTHalfInterstitialViewController.m; sourceTree = ""; }; + 071EB47D217F6427008F0FAB /* CTInAppUtils.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CTInAppUtils.m; sourceTree = ""; }; + 071EB47E217F6427008F0FAB /* CTInAppDisplayViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CTInAppDisplayViewController.m; sourceTree = ""; }; + 071EB47F217F6427008F0FAB /* CTBaseHeaderFooterViewControllerPrivate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CTBaseHeaderFooterViewControllerPrivate.h; sourceTree = ""; }; + 071EB480217F6427008F0FAB /* CTInterstitialViewController~ipad.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = "CTInterstitialViewController~ipad.xib"; sourceTree = ""; }; + 071EB481217F6427008F0FAB /* CTNotificationButton.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CTNotificationButton.m; sourceTree = ""; }; + 071EB482217F6427008F0FAB /* CTInterstitialImageViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CTInterstitialImageViewController.m; sourceTree = ""; }; + 071EB483217F6427008F0FAB /* CTAVPlayerViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CTAVPlayerViewController.h; sourceTree = ""; }; + 071EB484217F6427008F0FAB /* CTBaseHeaderFooterViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CTBaseHeaderFooterViewController.m; sourceTree = ""; }; + 071EB485217F6427008F0FAB /* CTCoverImageViewController~iphoneport.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = "CTCoverImageViewController~iphoneport.xib"; sourceTree = ""; }; + 071EB486217F6427008F0FAB /* CTInAppFCManager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CTInAppFCManager.h; sourceTree = ""; }; + 071EB487217F6427008F0FAB /* CTCoverViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CTCoverViewController.h; sourceTree = ""; }; + 071EB488217F6427008F0FAB /* CTHalfInterstitialImageViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CTHalfInterstitialImageViewController.m; sourceTree = ""; }; + 071EB489217F6427008F0FAB /* FLAnimatedImage.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = FLAnimatedImage.m; sourceTree = ""; }; + 071EB48B217F6427008F0FAB /* ic_shrink@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "ic_shrink@2x.png"; sourceTree = ""; }; + 071EB48C217F6427008F0FAB /* ic_play@1x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "ic_play@1x.png"; sourceTree = ""; }; + 071EB48D217F6427008F0FAB /* ic_shrink@3x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "ic_shrink@3x.png"; sourceTree = ""; }; + 071EB48E217F6427008F0FAB /* ic_thumb.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = ic_thumb.png; sourceTree = ""; }; + 071EB490217F6427008F0FAB /* ic_expand@3x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "ic_expand@3x.png"; sourceTree = ""; }; + 071EB491217F6427008F0FAB /* ic_expand@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "ic_expand@2x.png"; sourceTree = ""; }; + 071EB492217F6427008F0FAB /* ic_pause@1x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "ic_pause@1x.png"; sourceTree = ""; }; + 071EB493217F6427008F0FAB /* ic_pause@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "ic_pause@2x.png"; sourceTree = ""; }; + 071EB494217F6427008F0FAB /* ic_expand@1x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "ic_expand@1x.png"; sourceTree = ""; }; + 071EB495217F6427008F0FAB /* ic_pause@3x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "ic_pause@3x.png"; sourceTree = ""; }; + 071EB496217F6427008F0FAB /* ic_play@3x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "ic_play@3x.png"; sourceTree = ""; }; + 071EB497217F6427008F0FAB /* ic_play@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "ic_play@2x.png"; sourceTree = ""; }; + 071EB498217F6427008F0FAB /* ic_shrink@1x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "ic_shrink@1x.png"; sourceTree = ""; }; + 071EB499217F6427008F0FAB /* CTFooterViewController~ipad.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = "CTFooterViewController~ipad.xib"; sourceTree = ""; }; + 071EB49A217F6427008F0FAB /* CTSlider.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CTSlider.h; sourceTree = ""; }; + 071EB49B217F6427008F0FAB /* FLAnimatedImageView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = FLAnimatedImageView.m; sourceTree = ""; }; + 071EB49C217F6427008F0FAB /* CTCoverImageViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CTCoverImageViewController.m; sourceTree = ""; }; + 071EB49D217F6427008F0FAB /* CTAVPlayerControlsViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CTAVPlayerControlsViewController.h; sourceTree = ""; }; + 071EB49E217F6427008F0FAB /* CTInterstitialImageViewController~iphoneport.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = "CTInterstitialImageViewController~iphoneport.xib"; sourceTree = ""; }; + 071EB49F217F6427008F0FAB /* CTAlertViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CTAlertViewController.h; sourceTree = ""; }; + 071EB4A0217F6427008F0FAB /* CTInterstitialViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CTInterstitialViewController.m; sourceTree = ""; }; + 071EB4A1217F6427008F0FAB /* CTInAppDisplayViewControllerPrivate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CTInAppDisplayViewControllerPrivate.h; sourceTree = ""; }; + 071EB4A2217F6427008F0FAB /* CTAVPlayerControlsViewController.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = CTAVPlayerControlsViewController.xib; sourceTree = ""; }; + 071EB4A3217F6427008F0FAB /* CTCoverViewController~iphoneport.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = "CTCoverViewController~iphoneport.xib"; sourceTree = ""; }; + 071EB4A4217F6427008F0FAB /* CTInAppNotification.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CTInAppNotification.h; sourceTree = ""; }; + 071EB4A5217F6427008F0FAB /* CTCoverViewController~ipad.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = "CTCoverViewController~ipad.xib"; sourceTree = ""; }; + 071EB4A6217F6427008F0FAB /* CTInAppHTMLViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CTInAppHTMLViewController.m; sourceTree = ""; }; + 071EB4A7217F6427008F0FAB /* CTInAppResources.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CTInAppResources.m; sourceTree = ""; }; + 071EB4A8217F6427008F0FAB /* CTHeaderViewController~iphoneport.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = "CTHeaderViewController~iphoneport.xib"; sourceTree = ""; }; + 071EB4A9217F6427008F0FAB /* CTInterstitialImageViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CTInterstitialImageViewController.h; sourceTree = ""; }; + 071EB4AA217F6427008F0FAB /* CTNotificationButton.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CTNotificationButton.h; sourceTree = ""; }; + 071EB4AB217F6427008F0FAB /* CTAVPlayerViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CTAVPlayerViewController.m; sourceTree = ""; }; + 071EB4AC217F6427008F0FAB /* CTInAppDisplayViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CTInAppDisplayViewController.h; sourceTree = ""; }; + 071EB4AD217F6427008F0FAB /* CTHalfInterstitialViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CTHalfInterstitialViewController.h; sourceTree = ""; }; + 071EB4AE217F6427008F0FAB /* CTInAppUtils.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CTInAppUtils.h; sourceTree = ""; }; + 071EB4AF217F6427008F0FAB /* CTDismissButton.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CTDismissButton.h; sourceTree = ""; }; + 071EB4B0217F6427008F0FAB /* CTHeaderViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CTHeaderViewController.h; sourceTree = ""; }; + 071EB4B1217F6427008F0FAB /* CTHeaderViewController~ipad.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = "CTHeaderViewController~ipad.xib"; sourceTree = ""; }; + 071EB4B2217F6427008F0FAB /* CTFooterViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CTFooterViewController.m; sourceTree = ""; }; + 071EB4B3217F6427008F0FAB /* FLAnimatedImage.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FLAnimatedImage.h; sourceTree = ""; }; + 071EB4B4217F6427008F0FAB /* CTHalfInterstitialImageViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CTHalfInterstitialImageViewController.h; sourceTree = ""; }; + 071EB4B5217F6427008F0FAB /* CTInterstitialViewController~iphoneport.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = "CTInterstitialViewController~iphoneport.xib"; sourceTree = ""; }; + 071EB4B6217F6427008F0FAB /* CTCoverViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CTCoverViewController.m; sourceTree = ""; }; + 071EB4B7217F6427008F0FAB /* CTInAppFCManager.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CTInAppFCManager.m; sourceTree = ""; }; + 071EB4B8217F6427008F0FAB /* CTFooterViewController~iphoneport.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = "CTFooterViewController~iphoneport.xib"; sourceTree = ""; }; + 071EB4B9217F6427008F0FAB /* CTBaseHeaderFooterViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CTBaseHeaderFooterViewController.h; sourceTree = ""; }; + 071EB4BA217F6427008F0FAB /* CTAlertViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CTAlertViewController.m; sourceTree = ""; }; + 071EB4BB217F6427008F0FAB /* CTHalfInterstitialImageViewController~ipad.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = "CTHalfInterstitialImageViewController~ipad.xib"; sourceTree = ""; }; + 071EB4BC217F6427008F0FAB /* CTAVPlayerControlsViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CTAVPlayerControlsViewController.m; sourceTree = ""; }; + 071EB4BD217F6427008F0FAB /* CTCoverImageViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CTCoverImageViewController.h; sourceTree = ""; }; + 071EB4BE217F6427008F0FAB /* FLAnimatedImageView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FLAnimatedImageView.h; sourceTree = ""; }; + 071EB4BF217F6427008F0FAB /* CTInterstitialImageViewController~ipad.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = "CTInterstitialImageViewController~ipad.xib"; sourceTree = ""; }; + 071EB4C0217F6427008F0FAB /* CTHalfInterstitialImageViewController~iphoneport.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = "CTHalfInterstitialImageViewController~iphoneport.xib"; sourceTree = ""; }; + 071EB4C1217F6427008F0FAB /* CTSlider.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CTSlider.m; sourceTree = ""; }; + 071EB4C2217F6427008F0FAB /* CTInAppResources.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CTInAppResources.h; sourceTree = ""; }; + 071EB4C3217F6427008F0FAB /* CTInAppHTMLViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CTInAppHTMLViewController.h; sourceTree = ""; }; + 071EB4C4217F6427008F0FAB /* CTInAppNotification.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CTInAppNotification.m; sourceTree = ""; }; + 071EB4C5217F6427008F0FAB /* CTCoverImageViewController~ipad.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = "CTCoverImageViewController~ipad.xib"; sourceTree = ""; }; + 071EB4C6217F6427008F0FAB /* CTInterstitialViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CTInterstitialViewController.h; sourceTree = ""; }; + 079701E42180A055008BF668 /* sound-wave-headphones.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "sound-wave-headphones.png"; sourceTree = ""; }; D0047B082098D45B0019C6FD /* CTLocalDataStore.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = CTLocalDataStore.h; sourceTree = ""; }; D0047B092098D45B0019C6FD /* CTLocalDataStore.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = CTLocalDataStore.m; sourceTree = ""; }; D0047B0C2098E2F00019C6FD /* CTProfileBuilder.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = CTProfileBuilder.h; sourceTree = ""; }; D0047B0D2098E2F00019C6FD /* CTProfileBuilder.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = CTProfileBuilder.m; sourceTree = ""; }; D0047B102098EDA90019C6FD /* CTLocationManager.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = CTLocationManager.h; sourceTree = ""; }; D0047B112098EDA90019C6FD /* CTLocationManager.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = CTLocationManager.m; sourceTree = ""; }; - D0047B1C209904DD0019C6FD /* CTInAppFCManager.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = CTInAppFCManager.h; sourceTree = ""; }; - D0047B1D209904DD0019C6FD /* CTInAppFCManager.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = CTInAppFCManager.m; sourceTree = ""; }; - D0047B20209935200019C6FD /* CTInAppUtils.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = CTInAppUtils.h; sourceTree = ""; }; - D0047B21209935200019C6FD /* CTInAppUtils.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = CTInAppUtils.m; sourceTree = ""; }; - D0047B24209935EA0019C6FD /* CTInAppDisplayViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = CTInAppDisplayViewController.h; sourceTree = ""; }; - D0047B25209935EA0019C6FD /* CTInAppDisplayViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = CTInAppDisplayViewController.m; sourceTree = ""; }; - D0047B28209936510019C6FD /* CTInAppNotification.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = CTInAppNotification.h; sourceTree = ""; }; - D0047B29209936510019C6FD /* CTInAppNotification.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = CTInAppNotification.m; sourceTree = ""; }; - D0047B2C209936E00019C6FD /* CTInAppDisplayViewControllerPrivate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = CTInAppDisplayViewControllerPrivate.h; sourceTree = ""; }; D014B8D720E2F963001E0780 /* CleverTapSDK.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = CleverTapSDK.framework; sourceTree = BUILT_PRODUCTS_DIR; }; D01651AC2097B38400660178 /* CTEventBuilder.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = CTEventBuilder.h; sourceTree = ""; }; D01651AD2097B38400660178 /* CTEventBuilder.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = CTEventBuilder.m; sourceTree = ""; }; @@ -186,10 +327,6 @@ D0A84AD7209135D400191B1F /* CTPreferences.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = CTPreferences.m; sourceTree = ""; }; D0A84ADA209136D500191B1F /* CTLogger.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = CTLogger.h; sourceTree = ""; }; D0A84ADB209136D500191B1F /* CTLogger.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = CTLogger.m; sourceTree = ""; }; - D0A9802A209B83B100499991 /* CTInAppHTMLViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = CTInAppHTMLViewController.h; sourceTree = ""; }; - D0A9802B209B83B100499991 /* CTInAppHTMLViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = CTInAppHTMLViewController.m; sourceTree = ""; }; - D0A9802E209B892100499991 /* CTDismissButton.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CTDismissButton.h; sourceTree = ""; }; - D0A9802F209B892100499991 /* CTDismissButton.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CTDismissButton.m; sourceTree = ""; }; D0C7BBBD207D82C0001345EF /* CleverTapSDK.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = CleverTapSDK.framework; sourceTree = BUILT_PRODUCTS_DIR; }; D0C7BBC8207D8837001345EF /* CleverTap.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = CleverTap.h; sourceTree = ""; }; D0C7BBC9207D8837001345EF /* CleverTap.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = CleverTap.m; sourceTree = ""; }; @@ -222,6 +359,83 @@ /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ + 071EB476217F6427008F0FAB /* InApps */ = { + isa = PBXGroup; + children = ( + 071EB48A217F6427008F0FAB /* images */, + 071EB4B1217F6427008F0FAB /* CTHeaderViewController~ipad.xib */, + 071EB4B5217F6427008F0FAB /* CTInterstitialViewController~iphoneport.xib */, + 071EB4B8217F6427008F0FAB /* CTFooterViewController~iphoneport.xib */, + 071EB4BB217F6427008F0FAB /* CTHalfInterstitialImageViewController~ipad.xib */, + 071EB4BF217F6427008F0FAB /* CTInterstitialImageViewController~ipad.xib */, + 071EB4C0217F6427008F0FAB /* CTHalfInterstitialImageViewController~iphoneport.xib */, + 071EB4C5217F6427008F0FAB /* CTCoverImageViewController~ipad.xib */, + 071EB47A217F6427008F0FAB /* CTHalfInterstitialViewController~ipad.xib */, + 071EB47B217F6427008F0FAB /* CTHalfInterstitialViewController~iphoneport.xib */, + 071EB480217F6427008F0FAB /* CTInterstitialViewController~ipad.xib */, + 071EB485217F6427008F0FAB /* CTCoverImageViewController~iphoneport.xib */, + 071EB499217F6427008F0FAB /* CTFooterViewController~ipad.xib */, + 071EB49E217F6427008F0FAB /* CTInterstitialImageViewController~iphoneport.xib */, + 071EB4A2217F6427008F0FAB /* CTAVPlayerControlsViewController.xib */, + 071EB4A3217F6427008F0FAB /* CTCoverViewController~iphoneport.xib */, + 071EB4A5217F6427008F0FAB /* CTCoverViewController~ipad.xib */, + 071EB4A8217F6427008F0FAB /* CTHeaderViewController~iphoneport.xib */, + 071EB4AF217F6427008F0FAB /* CTDismissButton.h */, + 071EB478217F6427008F0FAB /* CTDismissButton.m */, + 071EB4B0217F6427008F0FAB /* CTHeaderViewController.h */, + 071EB479217F6427008F0FAB /* CTHeaderViewController.m */, + 071EB4AD217F6427008F0FAB /* CTHalfInterstitialViewController.h */, + 071EB47C217F6427008F0FAB /* CTHalfInterstitialViewController.m */, + 071EB4B9217F6427008F0FAB /* CTBaseHeaderFooterViewController.h */, + 071EB47F217F6427008F0FAB /* CTBaseHeaderFooterViewControllerPrivate.h */, + 071EB484217F6427008F0FAB /* CTBaseHeaderFooterViewController.m */, + 071EB4A9217F6427008F0FAB /* CTInterstitialImageViewController.h */, + 071EB482217F6427008F0FAB /* CTInterstitialImageViewController.m */, + 071EB483217F6427008F0FAB /* CTAVPlayerViewController.h */, + 071EB4AB217F6427008F0FAB /* CTAVPlayerViewController.m */, + 071EB487217F6427008F0FAB /* CTCoverViewController.h */, + 071EB4B6217F6427008F0FAB /* CTCoverViewController.m */, + 071EB4BD217F6427008F0FAB /* CTCoverImageViewController.h */, + 071EB49C217F6427008F0FAB /* CTCoverImageViewController.m */, + 071EB4B4217F6427008F0FAB /* CTHalfInterstitialImageViewController.h */, + 071EB488217F6427008F0FAB /* CTHalfInterstitialImageViewController.m */, + 071EB49A217F6427008F0FAB /* CTSlider.h */, + 071EB4C1217F6427008F0FAB /* CTSlider.m */, + 071EB49F217F6427008F0FAB /* CTAlertViewController.h */, + 071EB4BA217F6427008F0FAB /* CTAlertViewController.m */, + 071EB4C6217F6427008F0FAB /* CTInterstitialViewController.h */, + 071EB4A0217F6427008F0FAB /* CTInterstitialViewController.m */, + 071EB4C3217F6427008F0FAB /* CTInAppHTMLViewController.h */, + 071EB4A6217F6427008F0FAB /* CTInAppHTMLViewController.m */, + 071EB477217F6427008F0FAB /* CTFooterViewController.h */, + 071EB4B2217F6427008F0FAB /* CTFooterViewController.m */, + 071EB49D217F6427008F0FAB /* CTAVPlayerControlsViewController.h */, + 071EB4BC217F6427008F0FAB /* CTAVPlayerControlsViewController.m */, + ); + path = InApps; + sourceTree = ""; + }; + 071EB48A217F6427008F0FAB /* images */ = { + isa = PBXGroup; + children = ( + 071EB48B217F6427008F0FAB /* ic_shrink@2x.png */, + 071EB48C217F6427008F0FAB /* ic_play@1x.png */, + 071EB48D217F6427008F0FAB /* ic_shrink@3x.png */, + 071EB48E217F6427008F0FAB /* ic_thumb.png */, + 071EB490217F6427008F0FAB /* ic_expand@3x.png */, + 071EB491217F6427008F0FAB /* ic_expand@2x.png */, + 079701E42180A055008BF668 /* sound-wave-headphones.png */, + 071EB492217F6427008F0FAB /* ic_pause@1x.png */, + 071EB493217F6427008F0FAB /* ic_pause@2x.png */, + 071EB494217F6427008F0FAB /* ic_expand@1x.png */, + 071EB495217F6427008F0FAB /* ic_pause@3x.png */, + 071EB496217F6427008F0FAB /* ic_play@3x.png */, + 071EB497217F6427008F0FAB /* ic_play@2x.png */, + 071EB498217F6427008F0FAB /* ic_shrink@1x.png */, + ); + path = images; + sourceTree = ""; + }; D0C7BBB3207D82C0001345EF = { isa = PBXGroup; children = ( @@ -242,6 +456,7 @@ D0C7BBBF207D82C0001345EF /* CleverTapSDK */ = { isa = PBXGroup; children = ( + 071EB476217F6427008F0FAB /* InApps */, D0C7BBC8207D8837001345EF /* CleverTap.h */, D0C7BBC9207D8837001345EF /* CleverTap.m */, D0CACF8A20B890EA00A02327 /* CleverTap+SSLPinning.h */, @@ -287,23 +502,27 @@ D0047B0D2098E2F00019C6FD /* CTProfileBuilder.m */, D0047B102098EDA90019C6FD /* CTLocationManager.h */, D0047B112098EDA90019C6FD /* CTLocationManager.m */, - D0047B1C209904DD0019C6FD /* CTInAppFCManager.h */, - D0047B1D209904DD0019C6FD /* CTInAppFCManager.m */, - D0047B20209935200019C6FD /* CTInAppUtils.h */, - D0047B21209935200019C6FD /* CTInAppUtils.m */, - D0047B28209936510019C6FD /* CTInAppNotification.h */, - D0047B29209936510019C6FD /* CTInAppNotification.m */, - D0047B24209935EA0019C6FD /* CTInAppDisplayViewController.h */, - D0047B25209935EA0019C6FD /* CTInAppDisplayViewController.m */, - D0047B2C209936E00019C6FD /* CTInAppDisplayViewControllerPrivate.h */, - D0A9802A209B83B100499991 /* CTInAppHTMLViewController.h */, - D0A9802B209B83B100499991 /* CTInAppHTMLViewController.m */, - D0A9802E209B892100499991 /* CTDismissButton.h */, - D0A9802F209B892100499991 /* CTDismissButton.m */, D0CACF8C20B8A44B00A02327 /* CTCertificatePinning.h */, D0CACF8D20B8A44C00A02327 /* CTCertificatePinning.m */, D0CACF9420B8A4F800A02327 /* CTPinnedNSURLSessionDelegate.h */, D0CACF9520B8A4F800A02327 /* CTPinnedNSURLSessionDelegate.m */, + 071EB4AE217F6427008F0FAB /* CTInAppUtils.h */, + 071EB47D217F6427008F0FAB /* CTInAppUtils.m */, + 071EB486217F6427008F0FAB /* CTInAppFCManager.h */, + 071EB4B7217F6427008F0FAB /* CTInAppFCManager.m */, + 071EB4A4217F6427008F0FAB /* CTInAppNotification.h */, + 071EB4C4217F6427008F0FAB /* CTInAppNotification.m */, + 071EB4AC217F6427008F0FAB /* CTInAppDisplayViewController.h */, + 071EB47E217F6427008F0FAB /* CTInAppDisplayViewController.m */, + 071EB4A1217F6427008F0FAB /* CTInAppDisplayViewControllerPrivate.h */, + 071EB4A7217F6427008F0FAB /* CTInAppResources.m */, + 071EB4C2217F6427008F0FAB /* CTInAppResources.h */, + 071EB4AA217F6427008F0FAB /* CTNotificationButton.h */, + 071EB481217F6427008F0FAB /* CTNotificationButton.m */, + 071EB4B3217F6427008F0FAB /* FLAnimatedImage.h */, + 071EB489217F6427008F0FAB /* FLAnimatedImage.m */, + 071EB4BE217F6427008F0FAB /* FLAnimatedImageView.h */, + 071EB49B217F6427008F0FAB /* FLAnimatedImageView.m */, D0CACF9E20B8C14B00A02327 /* DigiCertGlobalRootCA.crt */, D0CACFA020B8C19300A02327 /* DigiCertSHA2SecureServerCA.crt */, ); @@ -323,23 +542,24 @@ D014B8E320E2F9FA001E0780 /* CleverTapInstanceConfigPrivate.h in Headers */, D014B91E20E2FBDA001E0780 /* CTPinnedNSURLSessionDelegate.h in Headers */, D014B8E920E2FA88001E0780 /* CleverTapEventDetail.h in Headers */, + 071EB521217F6764008F0FAB /* CTNotificationButton.h in Headers */, D014B8FC20E2FB12001E0780 /* CTPreferences.h in Headers */, + 071EB518217F6510008F0FAB /* CTInAppFCManager.h in Headers */, D014B8EE20E2FAA8001E0780 /* CleverTapUTMDetail.h in Headers */, - D014B91720E2FBB9001E0780 /* CTInAppDisplayViewControllerPrivate.h in Headers */, - D014B91420E2FBA8001E0780 /* CTInAppDisplayViewController.h in Headers */, D014B90820E2FB6B001E0780 /* CTLocalDataStore.h in Headers */, - D014B91220E2FB9C001E0780 /* CTInAppNotification.h in Headers */, D014B90220E2FB4F001E0780 /* CTEventBuilder.h in Headers */, + 07BF465B217F7C41002E166D /* CTInAppDisplayViewController.h in Headers */, + 071EB51A217F6565008F0FAB /* CTInAppNotification.h in Headers */, D014B8F020E2FAB1001E0780 /* CTPlistInfo.h in Headers */, D014B8EC20E2FA9D001E0780 /* CleverTapTrackedViewController.h in Headers */, D014B8EB20E2FA94001E0780 /* CleverTapSyncDelegate.h in Headers */, - D014B91020E2FB93001E0780 /* CTInAppUtils.h in Headers */, + 07BF465D217F7C88002E166D /* CTInAppDisplayViewControllerPrivate.h in Headers */, D014B8F820E2FADD001E0780 /* CTUtils.h in Headers */, + 071EB51C217F6721008F0FAB /* FLAnimatedImage.h in Headers */, D014B8DF20E2F9DE001E0780 /* CleverTap.h in Headers */, D014B8FA20E2FB09001E0780 /* CTUriHelper.h in Headers */, - D0A9E9CC20EEA8500004BC6F /* CTInAppHTMLViewController.h in Headers */, D014B8F620E2FAD5001E0780 /* CTConstants.h in Headers */, - D014B91A20E2FBC8001E0780 /* CTDismissButton.h in Headers */, + 071EB525217F6C8F008F0FAB /* CTInAppResources.h in Headers */, D014B8FE20E2FB3B001E0780 /* CTLogger.h in Headers */, D014B8E120E2F9E9001E0780 /* CleverTap+SSLPinning.h in Headers */, D014B91C20E2FBD1001E0780 /* CTCertificatePinning.h in Headers */, @@ -348,8 +568,9 @@ D014B8F420E2FACA001E0780 /* CTSwizzle.h in Headers */, D014B8E620E2FA64001E0780 /* CleverTapInstanceConfig.h in Headers */, D014B8F220E2FABC001E0780 /* CTDeviceInfo.h in Headers */, + 0766014A21833277009A244E /* FLAnimatedImageView.h in Headers */, D014B90A20E2FB74001E0780 /* CTProfileBuilder.h in Headers */, - D014B90E20E2FB89001E0780 /* CTInAppFCManager.h in Headers */, + 07BF4662217F8359002E166D /* CTInAppUtils.h in Headers */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -358,39 +579,57 @@ buildActionMask = 2147483647; files = ( D0CACF8B20B8923700A02327 /* CleverTap+SSLPinning.h in Headers */, + 071EB4F3217F6427008F0FAB /* CTInAppNotification.h in Headers */, D0C7BBCA207D8837001345EF /* CleverTap.h in Headers */, D014B8E220E2F9F9001E0780 /* CleverTapInstanceConfigPrivate.h in Headers */, + 071EB4CF217F6427008F0FAB /* CTBaseHeaderFooterViewControllerPrivate.h in Headers */, D0213D4F207D905800FE5740 /* CleverTapUTMDetail.h in Headers */, + 071EB4D3217F6427008F0FAB /* CTAVPlayerViewController.h in Headers */, D0213D4C207D905800FE5740 /* CleverTapSyncDelegate.h in Headers */, D01651B22097B42C00660178 /* CTValidator.h in Headers */, D0A84ADC209136D500191B1F /* CTLogger.h in Headers */, + 071EB4EE217F6427008F0FAB /* CTAlertViewController.h in Headers */, D0CACF9620B8A4F800A02327 /* CTPinnedNSURLSessionDelegate.h in Headers */, + 071EB4FE217F6427008F0FAB /* CTDismissButton.h in Headers */, + 071EB511217F6427008F0FAB /* CTInAppResources.h in Headers */, D01651AE2097B38400660178 /* CTEventBuilder.h in Headers */, D01651B62097B81400660178 /* CTKnownProfileFields.h in Headers */, - D0047B26209935EA0019C6FD /* CTInAppDisplayViewController.h in Headers */, + 071EB4D7217F6427008F0FAB /* CTCoverViewController.h in Headers */, D0047B0E2098E2F00019C6FD /* CTProfileBuilder.h in Headers */, - D0A9802C209B83B100499991 /* CTInAppHTMLViewController.h in Headers */, D033FB83208FE51200B4390F /* CTUtils.h in Headers */, D0CACF9020B8A44C00A02327 /* CTCertificatePinning.h in Headers */, - D0A98030209B892100499991 /* CTDismissButton.h in Headers */, + 071EB503217F6427008F0FAB /* CTHalfInterstitialImageViewController.h in Headers */, + 071EB515217F6427008F0FAB /* CTInterstitialViewController.h in Headers */, + 071EB4F8217F6427008F0FAB /* CTInterstitialImageViewController.h in Headers */, D0047B122098EDA90019C6FD /* CTLocationManager.h in Headers */, - D0047B2A209936510019C6FD /* CTInAppNotification.h in Headers */, - D014B91620E2FBB8001E0780 /* CTInAppDisplayViewControllerPrivate.h in Headers */, + 071EB4FC217F6427008F0FAB /* CTHalfInterstitialViewController.h in Headers */, + 071EB4C7217F6427008F0FAB /* CTFooterViewController.h in Headers */, + 071EB4FD217F6427008F0FAB /* CTInAppUtils.h in Headers */, D0213D54207D93C300FE5740 /* CTConstants.h in Headers */, D0047B0A2098D45B0019C6FD /* CTLocalDataStore.h in Headers */, - D0047B1E209904DD0019C6FD /* CTInAppFCManager.h in Headers */, + 071EB4F0217F6427008F0FAB /* CTInAppDisplayViewControllerPrivate.h in Headers */, + 071EB4E9217F6427008F0FAB /* CTSlider.h in Headers */, D01A0899207ED98300423D6F /* CTPlistInfo.h in Headers */, D032F3A82093EC9700F98D74 /* CTValidationResult.h in Headers */, - D0047B22209935200019C6FD /* CTInAppUtils.h in Headers */, D020C928209006AD0073F61E /* CTUriHelper.h in Headers */, D0596EFA208A6A9000A80753 /* CTSwizzle.h in Headers */, + 071EB502217F6427008F0FAB /* FLAnimatedImage.h in Headers */, + 071EB508217F6427008F0FAB /* CTBaseHeaderFooterViewController.h in Headers */, D0A84AD8209135D400191B1F /* CTPreferences.h in Headers */, + 071EB4FB217F6427008F0FAB /* CTInAppDisplayViewController.h in Headers */, D0A6626D20801E7F00B403F3 /* CTDeviceInfo.h in Headers */, D0A6626A207EE6F500B403F3 /* CleverTapBuildInfo.h in Headers */, + 071EB50D217F6427008F0FAB /* FLAnimatedImageView.h in Headers */, D0213D50207D905800FE5740 /* CleverTapEventDetail.h in Headers */, + 071EB4F9217F6427008F0FAB /* CTNotificationButton.h in Headers */, D0213D4D207D905800FE5740 /* CleverTapTrackedViewController.h in Headers */, + 071EB4EC217F6427008F0FAB /* CTAVPlayerControlsViewController.h in Headers */, + 071EB512217F6427008F0FAB /* CTInAppHTMLViewController.h in Headers */, D01A0894207EC2D400423D6F /* CleverTapInstanceConfig.h in Headers */, + 071EB50C217F6427008F0FAB /* CTCoverImageViewController.h in Headers */, D0213D4B207D905800FE5740 /* CleverTapInAppNotificationDelegate.h in Headers */, + 071EB4FF217F6427008F0FAB /* CTHeaderViewController.h in Headers */, + 071EB4D6217F6427008F0FAB /* CTInAppFCManager.h in Headers */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -482,8 +721,39 @@ isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( + 071EB4E0217F6427008F0FAB /* ic_expand@2x.png in Resources */, + 071EB4CA217F6427008F0FAB /* CTHalfInterstitialViewController~ipad.xib in Resources */, D0CACFA120B8C19300A02327 /* DigiCertSHA2SecureServerCA.crt in Resources */, + 071EB4D5217F6427008F0FAB /* CTCoverImageViewController~iphoneport.xib in Resources */, + 071EB4ED217F6427008F0FAB /* CTInterstitialImageViewController~iphoneport.xib in Resources */, + 071EB4DB217F6427008F0FAB /* ic_play@1x.png in Resources */, + 071EB507217F6427008F0FAB /* CTFooterViewController~iphoneport.xib in Resources */, + 071EB4E5217F6427008F0FAB /* ic_play@3x.png in Resources */, + 071EB4E7217F6427008F0FAB /* ic_shrink@1x.png in Resources */, + 071EB4F2217F6427008F0FAB /* CTCoverViewController~iphoneport.xib in Resources */, + 071EB500217F6427008F0FAB /* CTHeaderViewController~ipad.xib in Resources */, + 071EB4F7217F6427008F0FAB /* CTHeaderViewController~iphoneport.xib in Resources */, + 071EB4DF217F6427008F0FAB /* ic_expand@3x.png in Resources */, + 071EB4E6217F6427008F0FAB /* ic_play@2x.png in Resources */, + 071EB4F4217F6427008F0FAB /* CTCoverViewController~ipad.xib in Resources */, + 071EB50E217F6427008F0FAB /* CTInterstitialImageViewController~ipad.xib in Resources */, + 071EB4E3217F6427008F0FAB /* ic_expand@1x.png in Resources */, + 071EB504217F6427008F0FAB /* CTInterstitialViewController~iphoneport.xib in Resources */, + 071EB4E2217F6427008F0FAB /* ic_pause@2x.png in Resources */, + 071EB4E8217F6427008F0FAB /* CTFooterViewController~ipad.xib in Resources */, + 071EB4DD217F6427008F0FAB /* ic_thumb.png in Resources */, + 079701E52180A055008BF668 /* sound-wave-headphones.png in Resources */, + 071EB4E4217F6427008F0FAB /* ic_pause@3x.png in Resources */, + 071EB4DC217F6427008F0FAB /* ic_shrink@3x.png in Resources */, + 071EB4F1217F6427008F0FAB /* CTAVPlayerControlsViewController.xib in Resources */, + 071EB4DA217F6427008F0FAB /* ic_shrink@2x.png in Resources */, + 071EB4E1217F6427008F0FAB /* ic_pause@1x.png in Resources */, + 071EB50F217F6427008F0FAB /* CTHalfInterstitialImageViewController~iphoneport.xib in Resources */, D0CACF9F20B8C14B00A02327 /* DigiCertGlobalRootCA.crt in Resources */, + 071EB4D0217F6427008F0FAB /* CTInterstitialViewController~ipad.xib in Resources */, + 071EB4CB217F6427008F0FAB /* CTHalfInterstitialViewController~iphoneport.xib in Resources */, + 071EB50A217F6427008F0FAB /* CTHalfInterstitialImageViewController~ipad.xib in Resources */, + 071EB514217F6427008F0FAB /* CTCoverImageViewController~ipad.xib in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -494,23 +764,24 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( + 071EB519217F6513008F0FAB /* CTInAppFCManager.m in Sources */, D014B8ED20E2FAA2001E0780 /* CleverTapTrackedViewController.m in Sources */, - D014B91B20E2FBCD001E0780 /* CTDismissButton.m in Sources */, - D01F688B210295A7004DEC85 /* CTInAppDisplayViewController.m in Sources */, D014B8F120E2FAB9001E0780 /* CTPlistInfo.m in Sources */, - D014B91320E2FBA3001E0780 /* CTInAppNotification.m in Sources */, D014B8F320E2FAC2001E0780 /* CTDeviceInfo.m in Sources */, - D014B90F20E2FB8F001E0780 /* CTInAppFCManager.m in Sources */, D014B8F920E2FAE4001E0780 /* CTUtils.m in Sources */, - D014B91120E2FB99001E0780 /* CTInAppUtils.m in Sources */, + 07BF4661217F80C1002E166D /* CTInAppResources.m in Sources */, + 07BF465C217F7C4B002E166D /* CTInAppDisplayViewController.m in Sources */, + 071EB51B217F6568008F0FAB /* CTInAppNotification.m in Sources */, D0A9E9CE20EEA8770004BC6F /* CTLocationManager.m in Sources */, D014B90B20E2FB7A001E0780 /* CTProfileBuilder.m in Sources */, + 071EB51F217F6730008F0FAB /* FLAnimatedImage.m in Sources */, D014B90120E2FB4C001E0780 /* CTValidationResult.m in Sources */, D014B91F20E2FBDF001E0780 /* CTPinnedNSURLSessionDelegate.m in Sources */, D014B90520E2FB5F001E0780 /* CTValidator.m in Sources */, D014B8F720E2FADA001E0780 /* CTConstants.m in Sources */, D014B90720E2FB67001E0780 /* CTKnownProfileFields.m in Sources */, D014B8E020E2F9E6001E0780 /* CleverTap.m in Sources */, + 0766014B2183327D009A244E /* FLAnimatedImageView.m in Sources */, D014B8E720E2FA6A001E0780 /* CleverTapInstanceConfig.m in Sources */, D014B8F520E2FAD0001E0780 /* CTSwizzle.m in Sources */, D014B8EF20E2FAAD001E0780 /* CleverTapUTMDetail.m in Sources */, @@ -521,6 +792,8 @@ D014B8FB20E2FB0E001E0780 /* CTUriHelper.m in Sources */, D014B8FF20E2FB40001E0780 /* CTLogger.m in Sources */, D014B8FD20E2FB18001E0780 /* CTPreferences.m in Sources */, + 071EB527217F6CD1008F0FAB /* CTNotificationButton.m in Sources */, + 07BF4663217F838D002E166D /* CTInAppUtils.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -528,33 +801,50 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( - D0A98031209B892100499991 /* CTDismissButton.m in Sources */, + 071EB509217F6427008F0FAB /* CTAlertViewController.m in Sources */, + 071EB510217F6427008F0FAB /* CTSlider.m in Sources */, D0213D52207D905800FE5740 /* CleverTapEventDetail.m in Sources */, - D0A9802D209B83B100499991 /* CTInAppHTMLViewController.m in Sources */, + 071EB4F5217F6427008F0FAB /* CTInAppHTMLViewController.m in Sources */, D01651AF2097B38400660178 /* CTEventBuilder.m in Sources */, D020C929209006AD0073F61E /* CTUriHelper.m in Sources */, D01A0898207ED98300423D6F /* CTPlistInfo.m in Sources */, - D0047B2B209936510019C6FD /* CTInAppNotification.m in Sources */, - D0047B27209935EA0019C6FD /* CTInAppDisplayViewController.m in Sources */, + 071EB4D2217F6427008F0FAB /* CTInterstitialImageViewController.m in Sources */, + 071EB4C9217F6427008F0FAB /* CTHeaderViewController.m in Sources */, + 071EB505217F6427008F0FAB /* CTCoverViewController.m in Sources */, + 071EB4CD217F6427008F0FAB /* CTInAppUtils.m in Sources */, + 071EB4EA217F6427008F0FAB /* FLAnimatedImageView.m in Sources */, D0CACF9120B8A44C00A02327 /* CTCertificatePinning.m in Sources */, D033FB84208FE51200B4390F /* CTUtils.m in Sources */, - D0047B1F209904DD0019C6FD /* CTInAppFCManager.m in Sources */, + 071EB50B217F6427008F0FAB /* CTAVPlayerControlsViewController.m in Sources */, D01651B32097B42C00660178 /* CTValidator.m in Sources */, + 071EB513217F6427008F0FAB /* CTInAppNotification.m in Sources */, D0CACF9720B8A4F800A02327 /* CTPinnedNSURLSessionDelegate.m in Sources */, D0047B0F2098E2F00019C6FD /* CTProfileBuilder.m in Sources */, D0A6626E20801E7F00B403F3 /* CTDeviceInfo.m in Sources */, + 071EB4D1217F6427008F0FAB /* CTNotificationButton.m in Sources */, D0213D4E207D905800FE5740 /* CleverTapTrackedViewController.m in Sources */, D0047B0B2098D45B0019C6FD /* CTLocalDataStore.m in Sources */, - D0047B23209935200019C6FD /* CTInAppUtils.m in Sources */, + 071EB4CC217F6427008F0FAB /* CTHalfInterstitialViewController.m in Sources */, + 071EB4CE217F6427008F0FAB /* CTInAppDisplayViewController.m in Sources */, D0213D51207D905800FE5740 /* CleverTapUTMDetail.m in Sources */, D0596EFB208A6A9000A80753 /* CTSwizzle.m in Sources */, D032F3A92093EC9700F98D74 /* CTValidationResult.m in Sources */, + 071EB501217F6427008F0FAB /* CTFooterViewController.m in Sources */, D0A84ADD209136D500191B1F /* CTLogger.m in Sources */, D0A84AD9209135D400191B1F /* CTPreferences.m in Sources */, D0047B132098EDA90019C6FD /* CTLocationManager.m in Sources */, + 071EB4EB217F6427008F0FAB /* CTCoverImageViewController.m in Sources */, + 071EB4D4217F6427008F0FAB /* CTBaseHeaderFooterViewController.m in Sources */, + 071EB4F6217F6427008F0FAB /* CTInAppResources.m in Sources */, + 071EB4FA217F6427008F0FAB /* CTAVPlayerViewController.m in Sources */, + 071EB506217F6427008F0FAB /* CTInAppFCManager.m in Sources */, D01651B72097B81400660178 /* CTKnownProfileFields.m in Sources */, D0C7BBCB207D8837001345EF /* CleverTap.m in Sources */, D01A0895207EC2D400423D6F /* CleverTapInstanceConfig.m in Sources */, + 071EB4D9217F6427008F0FAB /* FLAnimatedImage.m in Sources */, + 071EB4C8217F6427008F0FAB /* CTDismissButton.m in Sources */, + 071EB4D8217F6427008F0FAB /* CTHalfInterstitialImageViewController.m in Sources */, + 071EB4EF217F6427008F0FAB /* CTInterstitialViewController.m in Sources */, D0CACF9920B8A78600A02327 /* CTConstants.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; diff --git a/CleverTapSDK/CTEventBuilder.m b/CleverTapSDK/CTEventBuilder.m index 879c69b3..2712b0de 100644 --- a/CleverTapSDK/CTEventBuilder.m +++ b/CleverTapSDK/CTEventBuilder.m @@ -141,11 +141,11 @@ + (void)buildChargedEventWithDetails:(NSDictionary *)chargeDetails andItems:(NSA return; } - if (((int) [items count]) > 15) { + if (((int) [items count]) > 50) { CTValidationResult *error = [[CTValidationResult alloc] init]; [error setErrorCode:522]; - [error setErrorDesc:@"Charged event contained more than 15 items."]; - CleverTapLogStaticDebug(@"Charged event contained more than 15 items."); + [error setErrorDesc:@"Charged event contained more than 50 items."]; + CleverTapLogStaticDebug(@"Charged event contained more than 50 items."); [errors addObject:error]; } NSMutableDictionary *evtData = [[NSMutableDictionary alloc] init]; diff --git a/CleverTapSDK/CTInAppDisplayViewController.m b/CleverTapSDK/CTInAppDisplayViewController.m index 5aca5153..95a15332 100644 --- a/CleverTapSDK/CTInAppDisplayViewController.m +++ b/CleverTapSDK/CTInAppDisplayViewController.m @@ -31,6 +31,18 @@ - (instancetype)initWithNotification:(CTInAppNotification *)notification { return self; } +#if !(TARGET_OS_TV) +- (BOOL)shouldAutorotate { + return NO; +} +#endif + +#if !(TARGET_OS_TV) +- (UIInterfaceOrientationMask)supportedInterfaceOrientations { + return (UIInterfaceOrientationPortrait | UIInterfaceOrientationPortraitUpsideDown); +} +#endif + -(void)show:(BOOL)animated { NSAssert(false, @"Override in sub-class"); } @@ -100,10 +112,64 @@ - (void)viewWillPassThroughTouch { [self hide:NO]; } +#pragma mark - Setup Buttons + +- (UIButton*)setupViewForButton:(UIButton *)buttonView withData:(CTNotificationButton *)button withIndex:(NSInteger)index { + [buttonView setTag: index]; + buttonView.titleLabel.adjustsFontSizeToFitWidth = YES; + buttonView.hidden = NO; + if (_notification.inAppType != CTInAppTypeHeader && _notification.inAppType != CTInAppTypeFooter) { + buttonView.layer.borderWidth = 1.0f; + buttonView.layer.cornerRadius = [button.borderRadius floatValue]; + buttonView.layer.borderColor = [[CTInAppUtils ct_colorWithHexString:button.borderColor] CGColor]; + } + + [buttonView setBackgroundColor:[CTInAppUtils ct_colorWithHexString:button.backgroundColor]]; + [buttonView setTitleColor:[CTInAppUtils ct_colorWithHexString:button.textColor] forState:UIControlStateNormal]; + [buttonView addTarget:self action:@selector(buttonTapped:) forControlEvents:UIControlEventTouchUpInside]; + [buttonView setTitle:button.text forState:UIControlStateNormal]; + return buttonView; +} + #pragma mark - Actions - (void)tappedDismiss { [self hide:YES]; } +- (void)buttonTapped:(UIButton*)button { + [self handleButtonClickFromIndex:(int)button.tag]; + [self hide:YES]; +} + +- (void)handleButtonClickFromIndex:(int)index { + CTNotificationButton *button = self.notification.buttons[index]; + NSURL *buttonCTA = button.actionURL; + NSString *buttonText = button.text; + NSString *campaignId = self.notification.campaignId; + + if (campaignId == nil) { + campaignId = @""; + } + + if (self.delegate && [self.delegate respondsToSelector:@selector(handleNotificationCTA:forNotification:fromViewController:withExtras:)]) { + [self.delegate handleNotificationCTA:buttonCTA forNotification:self.notification fromViewController:self withExtras:@{@"wzrk_id":campaignId, @"wzrk_c2a": buttonText}]; + } +} + +- (void)handleImageTapGesture{ + CTNotificationButton *button = self.notification.buttons[0]; + NSURL *buttonCTA = button.actionURL; + NSString *buttonText = @"image"; + NSString *campaignId = self.notification.campaignId; + + if (campaignId == nil) { + campaignId = @""; + } + + if (self.delegate && [self.delegate respondsToSelector:@selector(handleNotificationCTA:forNotification:fromViewController:withExtras:)]) { + [self.delegate handleNotificationCTA:buttonCTA forNotification:self.notification fromViewController:self withExtras:@{@"wzrk_id":campaignId, @"wzrk_c2a": buttonText}]; + } +} + @end diff --git a/CleverTapSDK/CTInAppDisplayViewControllerPrivate.h b/CleverTapSDK/CTInAppDisplayViewControllerPrivate.h index 413f2be6..65de0fe9 100644 --- a/CleverTapSDK/CTInAppDisplayViewControllerPrivate.h +++ b/CleverTapSDK/CTInAppDisplayViewControllerPrivate.h @@ -16,13 +16,18 @@ @interface CTInAppDisplayViewController () { } + @property (nonatomic, strong) UIWindow *window; @property (nonatomic, strong, readwrite) CTInAppNotification *notification; -@property(nonatomic, assign) BOOL shouldPassThroughTouches; +@property (nonatomic, assign) BOOL shouldPassThroughTouches; -(void)showFromWindow:(BOOL)animated; -(void)hideFromWindow:(BOOL)animated; -(void)tappedDismiss; +-(void)buttonTapped:(UIButton*)button; +-(void)handleButtonClickFromIndex:(int)index; +-(void)handleImageTapGesture; +-(UIButton*)setupViewForButton:(UIButton *)buttonView withData:(CTNotificationButton *)button withIndex:(NSInteger)index; @end diff --git a/CleverTapSDK/CTInAppNotification.h b/CleverTapSDK/CTInAppNotification.h index 3fb28717..0feae3ed 100644 --- a/CleverTapSDK/CTInAppNotification.h +++ b/CleverTapSDK/CTInAppNotification.h @@ -2,12 +2,15 @@ #import #import #import "CTInAppUtils.h" +#import "CTNotificationButton.h" @interface CTInAppNotification : NSObject -@property (nonatomic, readonly) NSString* Id; -@property (nonatomic, readonly) NSString* campaignId; +@property (nonatomic, readonly) NSString *Id; +@property (nonatomic, readonly) NSString *campaignId; +@property (nonatomic, copy, readonly) NSString *type; @property (nonatomic, readonly) CTInAppType inAppType; + @property (nonatomic, copy, readonly) NSString *html; @property (nonatomic, readonly) BOOL excludeFromCaps; @property (nonatomic, readonly) BOOL showClose; @@ -21,6 +24,25 @@ @property (nonatomic, assign, readonly) float width; @property (nonatomic, assign, readonly) float widthPercent; +@property (nonatomic, readonly) NSData *image; +@property (nonatomic, copy, readonly) NSString *contentType; +@property (nonatomic, copy, readonly) NSString *mediaUrl; +@property (nonatomic, readonly, assign) BOOL mediaIsVideo; +@property (nonatomic, readonly, assign) BOOL mediaIsAudio; +@property (nonatomic, readonly, assign) BOOL mediaIsImage; +@property (nonatomic, readonly, assign) BOOL mediaIsGif; + +@property (nonatomic, copy, readonly) NSString *title; +@property (nonatomic, copy, readonly) NSString *titleColor; +@property (nonatomic, copy, readonly) NSString *message; +@property (nonatomic, copy, readonly) NSString *messageColor; +@property (nonatomic, copy, readonly) NSString *backgroundColor; + +@property (nonatomic, readonly, assign) BOOL showCloseButton; +@property (nonatomic, readonly, assign) BOOL tablet; + +@property (nonatomic, readonly) NSArray *buttons; + @property (nonatomic, copy, readonly) NSDictionary *jsonDescription; @property (nonatomic, readonly) NSString *error; diff --git a/CleverTapSDK/CTInAppNotification.m b/CleverTapSDK/CTInAppNotification.m index 5b7974ab..d65683f4 100644 --- a/CleverTapSDK/CTInAppNotification.m +++ b/CleverTapSDK/CTInAppNotification.m @@ -1,14 +1,32 @@ #import "CTInAppNotification.h" #import "CTConstants.h" +#import "FLAnimatedImage.h" @interface CTInAppNotification() { } -@property (nonatomic, readwrite) NSString* Id; -@property (nonatomic, readwrite) NSString* campaignId; +@property (nonatomic, readwrite) NSString *Id; +@property (nonatomic, readwrite) NSString *campaignId; +@property (nonatomic, readwrite) NSString *type; @property (nonatomic, readwrite) CTInAppType inAppType; + +@property (nonatomic, strong) NSURL *imageURL; +@property (nonatomic, readwrite, strong) NSData *image; +@property (nonatomic, copy, readwrite) NSString *contentType; +@property (nonatomic, copy, readwrite) NSString *mediaUrl; + +@property (nonatomic, readwrite) NSString *title; +@property (nonatomic, readwrite) NSString *titleColor; +@property (nonatomic, readwrite) NSString *message; +@property (nonatomic, readwrite) NSString *messageColor; + +@property (nonatomic, readwrite) NSString *backgroundColor; + +@property (nonatomic, readwrite, assign) BOOL hideMedia; +@property (nonatomic, readwrite, assign) BOOL showCloseButton; +@property (nonatomic, readwrite, assign) BOOL tablet; + @property (nonatomic, copy, readwrite) NSString *html; -@property (nonatomic, copy, readwrite) NSDictionary *jsonDescription; @property (nonatomic, readwrite) BOOL showClose; @property (nonatomic, readwrite) BOOL darkenScreen; @property (nonatomic, readwrite) BOOL excludeFromCaps; @@ -21,6 +39,9 @@ @interface CTInAppNotification() { @property (nonatomic, assign, readwrite) float width; @property (nonatomic, assign, readwrite) float widthPercent; +@property (nonatomic, readwrite) NSArray *buttons; + +@property (nonatomic, copy, readwrite) NSDictionary *jsonDescription; @property (nonatomic, copy, readwrite) NSDictionary *customExtras; @property (nonatomic, readwrite) NSString *error; @@ -29,42 +50,31 @@ @interface CTInAppNotification() { @implementation CTInAppNotification: NSObject +@synthesize mediaIsImage=_mediaIsImage; +@synthesize mediaIsGif=_mediaIsGif; +@synthesize mediaIsAudio=_mediaIsAudio; +@synthesize mediaIsVideo=_mediaIsVideo; + - (instancetype)initWithJSON:(NSDictionary *)jsonObject { if (self = [super init]) { @try { + self.inAppType = CTInAppTypeUnknown; self.jsonDescription = jsonObject; - if (![self validateJSON:jsonObject]) { - self.error = @"Invalid JSON"; - return self; - } - if (jsonObject[@"ti"]) { - self.Id = [NSString stringWithFormat:@"%@", jsonObject[@"ti"]]; - } self.campaignId = (NSString*) jsonObject[@"wzrk_id"]; self.excludeFromCaps = [jsonObject[@"efc"] boolValue]; self.totalLifetimeCount = jsonObject[@"tlc"] ? [jsonObject[@"tlc"] intValue] : -1; self.totalDailyCount = jsonObject[@"tdc"] ? [jsonObject[@"tdc"] intValue] : -1; - NSDictionary *data = (NSDictionary*) jsonObject[@"d"]; - if (data) { - NSString *html = (NSString*) data[CLTAP_INAPP_DATA_TAG]; - if (html) { - self.html = html; - self.inAppType = [CTInAppUtils inAppTypeFromString:@"html"]; - } - NSDictionary* customExtras = (NSDictionary *) data[@"kv"]; - if (!customExtras) customExtras = [NSDictionary new]; - self.customExtras = customExtras; + if (jsonObject[@"ti"]) { + self.Id = [NSString stringWithFormat:@"%@", jsonObject[@"ti"]]; + } + NSString *type = (NSString*) jsonObject[@"type"]; + if (!type || [type isEqualToString:@"custom-html"]) { + [self legacyConfigureFromJSON:jsonObject]; + } else { + [self configureFromJSON:jsonObject]; } - NSDictionary *displayParams = jsonObject[@"w"]; - if (displayParams) { - self.darkenScreen = [displayParams[CLTAP_INAPP_NOTIF_DARKEN_SCREEN] boolValue]; - self.showClose = [displayParams[CLTAP_INAPP_NOTIF_SHOW_CLOSE] boolValue]; - self.position = (char) [displayParams[CLTAP_INAPP_POSITION] characterAtIndex:0]; - self.width = displayParams[CLTAP_INAPP_X_DP] ? [displayParams[CLTAP_INAPP_X_DP] floatValue] : 0.0; - self.widthPercent = displayParams[CLTAP_INAPP_X_PERCENT] ? [displayParams[CLTAP_INAPP_X_PERCENT] floatValue] : 0.0; - self.height = displayParams[CLTAP_INAPP_Y_DP] ? [displayParams[CLTAP_INAPP_Y_DP] floatValue] : 0.0; - self.heightPercent = displayParams[CLTAP_INAPP_Y_PERCENT] ? [displayParams[CLTAP_INAPP_Y_PERCENT] floatValue] : 0.0; - self.maxPerSession = displayParams[@"mdc"] ? [displayParams[@"mdc"] intValue] : -1; + if (self.inAppType == CTInAppTypeUnknown) { + self.error = @"Unknown InApp Type"; } } @catch (NSException *e) { self.error = e.debugDescription; @@ -73,16 +83,165 @@ - (instancetype)initWithJSON:(NSDictionary *)jsonObject { return self; } +- (void)configureFromJSON: (NSDictionary *)jsonObject { + self.type = (NSString*) jsonObject[@"type"]; + if (self.type) { + self.inAppType = [CTInAppUtils inAppTypeFromString:self.type]; + } + self.backgroundColor = jsonObject[@"bg"]; + self.title = (NSString*) jsonObject[@"title"][@"text"]; + self.titleColor = (NSString*) jsonObject[@"title"][@"color"]; + self.message = (NSString*) jsonObject[@"message"][@"text"]; + self.messageColor = (NSString*) jsonObject[@"message"][@"color"]; + self.showCloseButton = [jsonObject[@"close"] boolValue]; + self.tablet = [jsonObject[@"tablet"] boolValue]; + + NSDictionary *_media = (NSDictionary*) jsonObject[@"media"]; + if (_media) { + self.contentType = _media[@"content_type"]; + NSString *_mediaUrl = _media[@"url"]; + if (_mediaUrl) { + if ([self.contentType hasPrefix:@"image"]) { + self.imageURL = [NSURL URLWithString:_mediaUrl]; + if ([self.contentType isEqualToString:@"image/gif"] ) { + _mediaIsGif = YES; + }else { + _mediaIsImage = YES; + } + } else { + self.mediaUrl = _mediaUrl; + if ([self.contentType hasPrefix:@"video"]) { + _mediaIsVideo = YES; + } + if ([self.contentType hasPrefix:@"audio"]) { + _mediaIsAudio = YES; + } + } + } + } + + id buttons = jsonObject[@"buttons"]; + + NSMutableArray *_buttons = [NSMutableArray new]; + + if ([buttons isKindOfClass:[NSArray class]]) { + buttons = (NSArray *) buttons; + for (NSDictionary *button in buttons) { + CTNotificationButton *ct_button = [[CTNotificationButton alloc] initWithJSON:button]; + if (ct_button && !ct_button.error) { + [_buttons addObject:ct_button]; + } + } + } + else if ([buttons isKindOfClass:[NSDictionary class]]) { + buttons = (NSDictionary*) buttons; + for (NSString *key in [buttons allKeys]) { + CTNotificationButton *ct_button = [[CTNotificationButton alloc] initWithJSON:buttons[key]]; + if (ct_button && !ct_button.error) { + [_buttons addObject:ct_button]; + } + } + } + self.buttons = _buttons; + + switch (self.inAppType) { + case CTInAppTypeHeader: + case CTInAppTypeFooter: + if (_mediaIsGif || _mediaIsAudio || _mediaIsVideo){ + self.imageURL = nil; + CleverTapLogStaticDebug(@"unable to download media, wrong media type for template"); + } + break; + case CTInAppTypeCoverImage: + case CTInAppTypeInterstitialImage: + case CTInAppTypeHalfInterstitialImage: + if (_mediaIsGif || _mediaIsAudio || _mediaIsVideo || !_mediaIsImage){ + self.error = [NSString stringWithFormat:@"wrong media type for template"]; + } + break; + case CTInAppTypeCover: + case CTInAppTypeHalfInterstitial: + if (_mediaIsGif || _mediaIsAudio || _mediaIsVideo){ + self.imageURL = nil; + CleverTapLogStaticDebug(@"unable to download media, wrong media type for template"); + } + break; + default: + break; + } +} + +- (void)legacyConfigureFromJSON:(NSDictionary *)jsonObject { + if (![self validateLegacyJSON:jsonObject]) { + self.error = @"Invalid JSON"; + return; + } + NSDictionary *data = (NSDictionary*) jsonObject[@"d"]; + if (data) { + NSString *html = (NSString*) data[@"html"]; + if (html) { + self.html = html; + self.inAppType = [CTInAppUtils inAppTypeFromString:@"custom-html"]; + } + NSDictionary* customExtras = (NSDictionary *) data[@"kv"]; + if (!customExtras) customExtras = [NSDictionary new]; + self.customExtras = customExtras; + } + NSDictionary *displayParams = jsonObject[@"w"]; + if (displayParams) { + self.darkenScreen = [displayParams[CLTAP_INAPP_NOTIF_DARKEN_SCREEN] boolValue]; + self.showClose = [displayParams[CLTAP_INAPP_NOTIF_SHOW_CLOSE] boolValue]; + self.position = (char) [displayParams[CLTAP_INAPP_POSITION] characterAtIndex:0]; + self.width = displayParams[CLTAP_INAPP_X_DP] ? [displayParams[CLTAP_INAPP_X_DP] floatValue] : 0.0; + self.widthPercent = displayParams[CLTAP_INAPP_X_PERCENT] ? [displayParams[CLTAP_INAPP_X_PERCENT] floatValue] : 0.0; + self.height = displayParams[CLTAP_INAPP_Y_DP] ? [displayParams[CLTAP_INAPP_Y_DP] floatValue] : 0.0; + self.heightPercent = displayParams[CLTAP_INAPP_Y_PERCENT] ? [displayParams[CLTAP_INAPP_Y_PERCENT] floatValue] : 0.0; + self.maxPerSession = displayParams[@"mdc"] ? [displayParams[@"mdc"] intValue] : -1; + } +} + +- (BOOL)mediaIsAudio { + return _mediaIsAudio; +} + +- (BOOL)mediaIsImage { + return _mediaIsImage; +} +- (BOOL)mediaIsGif { + return _mediaIsGif; +} + +- (BOOL)mediaIsVideo { + return _mediaIsVideo; +} + - (void)prepareWithCompletionHandler: (void (^)(void))completionHandler { if ([NSThread isMainThread]) { self.error = [NSString stringWithFormat:@"[%@ prepareWithCompletionHandler] should not be called on the main thread", [self class]]; completionHandler(); return; } + + if (self.imageURL) { + NSError *error = nil; + NSData *imageData = [NSData dataWithContentsOfURL:self.imageURL options:NSDataReadingMappedIfSafe error:&error]; + if (error || !imageData) { + self.error = [NSString stringWithFormat:@"unable to load image from URL: %@", self.imageURL]; + } else { + if ([self.contentType isEqualToString:@"image/gif"] ) { + FLAnimatedImage *gif = [FLAnimatedImage animatedImageWithGIFData:imageData]; + if (gif == nil) { + self.error = [NSString stringWithFormat:@"unable to decode gif for URL: %@", self.imageURL]; + } + } + self.image = self.error ? nil : imageData; + } + } + completionHandler(); } -- (BOOL)validateJSON:(NSDictionary *)jsonObject { +- (BOOL)validateLegacyJSON:(NSDictionary *)jsonObject { // Check that either xdp or xp is set NSDictionary *w = jsonObject[@"w"]; if (![self isKeyValidInDictionary:w forKey:CLTAP_INAPP_X_DP ofClass:[NSNumber class]]) if (![self isKeyValidInDictionary:w forKey:CLTAP_INAPP_X_PERCENT ofClass:[NSNumber class]]) @@ -118,7 +277,7 @@ - (BOOL)validateJSON:(NSDictionary *)jsonObject { NSDictionary *d = jsonObject[@"d"]; // Check that html is set - if (![self isKeyValidInDictionary:d forKey:CLTAP_INAPP_DATA_TAG ofClass:[NSString class]]) + if (![self isKeyValidInDictionary:d forKey:@"html" ofClass:[NSString class]]) return FALSE; // Check that pos contains the right value diff --git a/CleverTapSDK/CTInAppResources.h b/CleverTapSDK/CTInAppResources.h new file mode 100644 index 00000000..4e772e2e --- /dev/null +++ b/CleverTapSDK/CTInAppResources.h @@ -0,0 +1,14 @@ +#import +#import + +NS_ASSUME_NONNULL_BEGIN + +@interface CTInAppResources : NSObject + ++ (NSBundle *)bundle; ++ (NSString *)XibNameForControllerName:(NSString *)controllerName; ++ (UIImage *)imageForName:(NSString *)name type:(NSString *)type; ++ (UIApplication *)getSharedApplication; +@end + +NS_ASSUME_NONNULL_END diff --git a/CleverTapSDK/CTInAppResources.m b/CleverTapSDK/CTInAppResources.m new file mode 100644 index 00000000..258f21bf --- /dev/null +++ b/CleverTapSDK/CTInAppResources.m @@ -0,0 +1,32 @@ +#import "CTInAppResources.h" + +@implementation CTInAppResources + ++ (NSBundle *)bundle { + return [NSBundle bundleForClass:self.class]; +} + ++ (NSString *)XibNameForControllerName:(NSString *)controllerName { + NSMutableString *xib = [NSMutableString stringWithString:controllerName]; + if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPhone) { + [xib appendString:@"~iphoneport"]; + } else { + [xib appendString:@"~ipad"]; + } + return [xib copy]; +} + ++ (UIImage *)imageForName:(NSString *)name type:(NSString *)type { + NSString *imagePath = [[self bundle] pathForResource:name ofType:type]; + return [UIImage imageWithContentsOfFile:imagePath]; +} + ++ (UIApplication *)getSharedApplication { + Class UIApplicationClass = NSClassFromString(@"UIApplication"); + if (UIApplicationClass && [UIApplicationClass respondsToSelector:@selector(sharedApplication)]) { + return [UIApplication performSelector:@selector(sharedApplication)]; + } + return nil; +} + +@end diff --git a/CleverTapSDK/CTInAppUtils.h b/CleverTapSDK/CTInAppUtils.h index 3f7e0314..15b37ff1 100644 --- a/CleverTapSDK/CTInAppUtils.h +++ b/CleverTapSDK/CTInAppUtils.h @@ -1,12 +1,26 @@ #import typedef NS_ENUM(NSUInteger, CTInAppType){ + CTInAppTypeUnknown, CTInAppTypeHTML, - + CTInAppTypeInterstitial, + CTInAppTypeHalfInterstitial, + CTInAppTypeCover, + CTInAppTypeHeader, + CTInAppTypeFooter, + CTInAppTypeAlert, + CTInAppTypeInterstitialImage, + CTInAppTypeHalfInterstitialImage, + CTInAppTypeCoverImage, }; @interface CTInAppUtils : NSObject -+(CTInAppType)inAppTypeFromString:(NSString*)type; ++ (CTInAppType)inAppTypeFromString:(NSString*_Nonnull)type; ++ (NSBundle *_Nullable)bundle; ++ (NSString *_Nullable)XibNameForControllerName:(NSString *_Nonnull)controllerName; ++ (UIImage *_Nullable)imageForName:(NSString *_Nonnull)name type:(NSString *_Nonnull)type; ++ (UIColor * _Nullable)ct_colorWithHexString:(NSString* _Nonnull)string; ++ (UIColor * _Nullable)ct_colorWithHexString:(NSString * _Nonnull)string withAlpha:(CGFloat)alpha; @end diff --git a/CleverTapSDK/CTInAppUtils.m b/CleverTapSDK/CTInAppUtils.m index fa6562d5..e9f06510 100644 --- a/CleverTapSDK/CTInAppUtils.m +++ b/CleverTapSDK/CTInAppUtils.m @@ -1,4 +1,9 @@ +#import #import "CTInAppUtils.h" +#if !CLEVERTAP_NO_INAPP_SUPPORT +#import "CTInAppResources.h" +#endif + static NSDictionary *_inAppTypeMap; @@ -6,16 +11,83 @@ @implementation CTInAppUtils + (void)load { _inAppTypeMap = @{ - @"html": @(CTInAppTypeHTML), + @"custom-html": @(CTInAppTypeHTML), + @"interstitial": @(CTInAppTypeInterstitial), + @"cover": @(CTInAppTypeCover), + @"header-template": @(CTInAppTypeHeader), + @"footer-template": @(CTInAppTypeFooter), + @"half-interstitial": @(CTInAppTypeHalfInterstitial), + @"alert-template": @(CTInAppTypeAlert), + @"interstitial-image": @(CTInAppTypeInterstitialImage), + @"half-interstitial-image": @(CTInAppTypeHalfInterstitialImage), + @"cover-image": @(CTInAppTypeCoverImage) }; } -+(CTInAppType)inAppTypeFromString:(NSString*)type { - NSNumber *_type = _inAppTypeMap[type]; ++ (CTInAppType)inAppTypeFromString:(NSString*)type { + NSNumber *_type = type != nil ? _inAppTypeMap[type] : @(CTInAppTypeUnknown); if (!_type) { - _type = @(CTInAppTypeHTML); + _type = @(CTInAppTypeUnknown); } return [_type integerValue]; } ++ (NSBundle *)bundle { +#if CLEVERTAP_NO_INAPP_SUPPORT + return nil; +#else + return [CTInAppResources bundle]; +#endif +} + ++ (NSString *)XibNameForControllerName:(NSString *)controllerName { +#if CLEVERTAP_NO_INAPP_SUPPORT + return nil; +#else + return [CTInAppResources XibNameForControllerName:controllerName]; +#endif +} + ++ (UIImage *)imageForName:(NSString *)name type:(NSString *)type { +#if CLEVERTAP_NO_INAPP_SUPPORT + return nil; +#else + return [CTInAppResources imageForName:name type:type]; +#endif + +} + ++(UIColor * _Nullable)ct_colorWithHexString:(NSString *)string{ + + return [self ct_colorWithHexString:string withAlpha:1.0]; +} + ++ (UIColor * _Nullable)ct_colorWithHexString:(NSString *)string withAlpha:(CGFloat)alpha{ + + if (![string isKindOfClass:[NSString class]] || [string length] == 0) { + return [UIColor colorWithRed:0.0f green:0.0f blue:0.0f alpha:1.0f]; + } + + // Convert hex string to an integer + unsigned int hexint = 0; + + // Create scanner + NSScanner *scanner = [NSScanner scannerWithString:string]; + + // Tell scanner to skip the # character + [scanner setCharactersToBeSkipped:[NSCharacterSet + characterSetWithCharactersInString:@"#"]]; + [scanner scanHexInt:&hexint]; + + // Create color object, specifying alpha + UIColor *color = + [UIColor colorWithRed:((CGFloat) ((hexint & 0xFF0000) >> 16))/255 + green:((CGFloat) ((hexint & 0xFF00) >> 8))/255 + blue:((CGFloat) (hexint & 0xFF))/255 + alpha:alpha]; + + return color; + +} + @end diff --git a/CleverTapSDK/CTNotificationButton.h b/CleverTapSDK/CTNotificationButton.h new file mode 100644 index 00000000..70860d68 --- /dev/null +++ b/CleverTapSDK/CTNotificationButton.h @@ -0,0 +1,22 @@ + +#import + +@interface CTNotificationButton : NSObject + +@property (nonatomic, copy, readonly) NSString *text; +@property (nonatomic, copy, readonly) NSString *textColor; +@property (nonatomic, copy, readonly) NSString *borderRadius; +@property (nonatomic, copy, readonly) NSString *borderColor; + +@property (nonatomic, copy, readonly) NSString *backgroundColor; +@property (nonatomic, readonly) NSURL *actionURL; + +@property (nonatomic, copy, readonly) NSDictionary *jsonDescription; + +@property (nonatomic, readonly) NSString *error; + +- (instancetype)init __unavailable; + +- (instancetype)initWithJSON:(NSDictionary *)json; + +@end diff --git a/CleverTapSDK/CTNotificationButton.m b/CleverTapSDK/CTNotificationButton.m new file mode 100644 index 00000000..2524fdaa --- /dev/null +++ b/CleverTapSDK/CTNotificationButton.m @@ -0,0 +1,52 @@ + +#import "CTNotificationButton.h" + +@interface CTNotificationButton () { + +} + +@property (nonatomic, copy, readwrite) NSString *text; +@property (nonatomic, copy, readwrite) NSString *textColor; +@property (nonatomic, copy, readwrite) NSString *borderRadius; +@property (nonatomic, copy, readwrite) NSString *borderColor; +@property (nonatomic, copy, readwrite) NSString *backgroundColor; +@property (nonatomic, readwrite) NSURL *actionURL; + +@property (nonatomic, copy, readwrite) NSDictionary *jsonDescription; + +@property (nonatomic, readwrite) NSString *error; + +@end + +@implementation CTNotificationButton + +- (instancetype)initWithJSON:(NSDictionary *)jsonObject { + if (self = [super init]) { + @try { + self.jsonDescription = jsonObject; + self.text = jsonObject[@"text"]; + self.textColor = jsonObject[@"color"]; + self.borderRadius = jsonObject[@"radius"]; + self.borderColor = jsonObject[@"border"]; + self.backgroundColor = jsonObject[@"bg"]; + + NSDictionary *actions = jsonObject[@"actions"]; + if (actions) { + NSString *action = actions[@"ios"]; + if (action && action.length > 0) { + @try { + self.actionURL = [NSURL URLWithString:action]; + } @catch (NSException *e) { + self.error = [e debugDescription]; + } + } + } + + } @catch (NSException *e) { + self.error = [e debugDescription]; + } + } + return self; +} + +@end diff --git a/CleverTapSDK/CleverTap.m b/CleverTapSDK/CleverTap.m index 42cac222..52377c24 100644 --- a/CleverTapSDK/CleverTap.m +++ b/CleverTapSDK/CleverTap.m @@ -23,6 +23,15 @@ #import "CTInAppDisplayViewController.h" #if !CLEVERTAP_NO_INAPP_SUPPORT #import "CTInAppHTMLViewController.h" +#import "CTInterstitialViewController.h" +#import "CTHalfInterstitialViewController.h" +#import "CTCoverViewController.h" +#import "CTHeaderViewController.h" +#import "CTFooterViewController.h" +#import "CTAlertViewController.h" +#import "CTCoverImageViewController.h" +#import "CTInterstitialImageViewController.h" +#import "CTHalfInterstitialImageViewController.h" #endif #import "CTLocationManager.h" @@ -1544,6 +1553,33 @@ - (void)displayNotification:(CTInAppNotification*)notification { case CTInAppTypeHTML: controller = [[CTInAppHTMLViewController alloc] initWithNotification:notification]; break; + case CTInAppTypeInterstitial: + controller = [[CTInterstitialViewController alloc] initWithNotification:notification]; + break; + case CTInAppTypeHalfInterstitial: + controller = [[CTHalfInterstitialViewController alloc] initWithNotification:notification]; + break; + case CTInAppTypeCover: + controller = [[CTCoverViewController alloc] initWithNotification:notification]; + break; + case CTInAppTypeHeader: + controller = [[CTHeaderViewController alloc] initWithNotification:notification]; + break; + case CTInAppTypeFooter: + controller = [[CTFooterViewController alloc] initWithNotification:notification]; + break; + case CTInAppTypeAlert: + controller = [[CTAlertViewController alloc] initWithNotification:notification]; + break; + case CTInAppTypeInterstitialImage: + controller = [[CTInterstitialImageViewController alloc] initWithNotification:notification]; + break; + case CTInAppTypeHalfInterstitialImage: + controller = [[CTHalfInterstitialImageViewController alloc] initWithNotification:notification]; + break; + case CTInAppTypeCoverImage: + controller = [[CTCoverImageViewController alloc] initWithNotification:notification]; + break; default: errorString = [NSString stringWithFormat:@"Unhandled notification type: %lu", (unsigned long)notification.inAppType]; break; diff --git a/CleverTapSDK/CleverTapBuildInfo.h b/CleverTapSDK/CleverTapBuildInfo.h index 52c03e57..4dfa595d 100644 --- a/CleverTapSDK/CleverTapBuildInfo.h +++ b/CleverTapSDK/CleverTapBuildInfo.h @@ -5,4 +5,4 @@ // Copyright (c) 2015 WizRocket. All rights reserved. // -#define WR_SDK_REVISION @"30202" +#define WR_SDK_REVISION @"30300" diff --git a/CleverTapSDK/FLAnimatedImage.h b/CleverTapSDK/FLAnimatedImage.h new file mode 100644 index 00000000..e7f0d617 --- /dev/null +++ b/CleverTapSDK/FLAnimatedImage.h @@ -0,0 +1,107 @@ +// +// FLAnimatedImage.h +// Flipboard +// +// Created by Raphael Schaad on 7/8/13. +// Copyright (c) 2013-2015 Flipboard. All rights reserved. +// +/* +The MIT License (MIT) + +Copyright (c) 2014-2016 Flipboard + +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. +*/ + + +#import + +// Allow user classes conveniently just importing one header. +#import "FLAnimatedImageView.h" + + +#ifndef NS_DESIGNATED_INITIALIZER + #if __has_attribute(objc_designated_initializer) + #define NS_DESIGNATED_INITIALIZER __attribute((objc_designated_initializer)) + #else + #define NS_DESIGNATED_INITIALIZER + #endif +#endif + +extern const NSTimeInterval kFLAnimatedImageDelayTimeIntervalMinimum; + +// +// An `FLAnimatedImage`'s job is to deliver frames in a highly performant way and works in conjunction with `FLAnimatedImageView`. +// It subclasses `NSObject` and not `UIImage` because it's only an "image" in the sense that a sea lion is a lion. +// It tries to intelligently choose the frame cache size depending on the image and memory situation with the goal to lower CPU usage for smaller ones, lower memory usage for larger ones and always deliver frames for high performant play-back. +// Note: `posterImage`, `size`, `loopCount`, `delayTimes` and `frameCount` don't change after successful initialization. +// +@interface FLAnimatedImage : NSObject + +@property (nonatomic, strong, readonly) UIImage *posterImage; // Guaranteed to be loaded; usually equivalent to `-imageLazilyCachedAtIndex:0` +@property (nonatomic, assign, readonly) CGSize size; // The `.posterImage`'s `.size` + +@property (nonatomic, assign, readonly) NSUInteger loopCount; // 0 means repeating the animation indefinitely +@property (nonatomic, strong, readonly) NSDictionary *delayTimesForIndexes; // Of type `NSTimeInterval` boxed in `NSNumber`s +@property (nonatomic, assign, readonly) NSUInteger frameCount; // Number of valid frames; equal to `[.delayTimes count]` + +@property (nonatomic, assign, readonly) NSUInteger frameCacheSizeCurrent; // Current size of intelligently chosen buffer window; can range in the interval [1..frameCount] +@property (nonatomic, assign) NSUInteger frameCacheSizeMax; // Allow to cap the cache size; 0 means no specific limit (default) + +// Intended to be called from main thread synchronously; will return immediately. +// If the result isn't cached, will return `nil`; the caller should then pause playback, not increment frame counter and keep polling. +// After an initial loading time, depending on `frameCacheSize`, frames should be available immediately from the cache. +- (UIImage *)imageLazilyCachedAtIndex:(NSUInteger)index; + +// Pass either a `UIImage` or an `FLAnimatedImage` and get back its size ++ (CGSize)sizeForImage:(id)image; + +// On success, the initializers return an `FLAnimatedImage` with all fields initialized, on failure they return `nil` and an error will be logged. +- (instancetype)initWithAnimatedGIFData:(NSData *)data; +// Pass 0 for optimalFrameCacheSize to get the default, predrawing is enabled by default. +- (instancetype)initWithAnimatedGIFData:(NSData *)data optimalFrameCacheSize:(NSUInteger)optimalFrameCacheSize predrawingEnabled:(BOOL)isPredrawingEnabled NS_DESIGNATED_INITIALIZER; ++ (instancetype)animatedImageWithGIFData:(NSData *)data; + +@property (nonatomic, strong, readonly) NSData *data; // The data the receiver was initialized with; read-only + +@end + +typedef NS_ENUM(NSUInteger, FLLogLevel) { + FLLogLevelNone = 0, + FLLogLevelError, + FLLogLevelWarn, + FLLogLevelInfo, + FLLogLevelDebug, + FLLogLevelVerbose +}; + +@interface FLAnimatedImage (Logging) + ++ (void)setLogBlock:(void (^)(NSString *logString, FLLogLevel logLevel))logBlock logLevel:(FLLogLevel)logLevel; ++ (void)logStringFromBlock:(NSString *(^)(void))stringBlock withLevel:(FLLogLevel)level; + +@end + +#define FLLog(logLevel, format, ...) [FLAnimatedImage logStringFromBlock:^NSString *{ return [NSString stringWithFormat:(format), ## __VA_ARGS__]; } withLevel:(logLevel)] + +@interface FLWeakProxy : NSProxy + ++ (instancetype)weakProxyForObject:(id)targetObject; + +@end diff --git a/CleverTapSDK/FLAnimatedImage.m b/CleverTapSDK/FLAnimatedImage.m new file mode 100755 index 00000000..2cd870af --- /dev/null +++ b/CleverTapSDK/FLAnimatedImage.m @@ -0,0 +1,816 @@ +// +// FLAnimatedImage.m +// Flipboard +// +// Created by Raphael Schaad on 7/8/13. +// Copyright (c) 2013-2015 Flipboard. All rights reserved. +// + + +#import "FLAnimatedImage.h" +#import +#import + + +// From vm_param.h, define for iOS 8.0 or higher to build on device. +#ifndef BYTE_SIZE + #define BYTE_SIZE 8 // byte size in bits +#endif + +#define MEGABYTE (1024 * 1024) + +// This is how the fastest browsers do it as per 2012: http://nullsleep.tumblr.com/post/16524517190/animated-gif-minimum-frame-delay-browser-compatibility +const NSTimeInterval kFLAnimatedImageDelayTimeIntervalMinimum = 0.02; + +// An animated image's data size (dimensions * frameCount) category; its value is the max allowed memory (in MB). +// E.g.: A 100x200px GIF with 30 frames is ~2.3MB in our pixel format and would fall into the `FLAnimatedImageDataSizeCategoryAll` category. +typedef NS_ENUM(NSUInteger, FLAnimatedImageDataSizeCategory) { + FLAnimatedImageDataSizeCategoryAll = 10, // All frames permanently in memory (be nice to the CPU) + FLAnimatedImageDataSizeCategoryDefault = 75, // A frame cache of default size in memory (usually real-time performance and keeping low memory profile) + FLAnimatedImageDataSizeCategoryOnDemand = 250, // Only keep one frame at the time in memory (easier on memory, slowest performance) + FLAnimatedImageDataSizeCategoryUnsupported // Even for one frame too large, computer says no. +}; + +typedef NS_ENUM(NSUInteger, FLAnimatedImageFrameCacheSize) { + FLAnimatedImageFrameCacheSizeNoLimit = 0, // 0 means no specific limit + FLAnimatedImageFrameCacheSizeLowMemory = 1, // The minimum frame cache size; this will produce frames on-demand. + FLAnimatedImageFrameCacheSizeGrowAfterMemoryWarning = 2, // If we can produce the frames faster than we consume, one frame ahead will already result in a stutter-free playback. + FLAnimatedImageFrameCacheSizeDefault = 5 // Build up a comfy buffer window to cope with CPU hiccups etc. +}; + + +#if defined(DEBUG) && DEBUG +@protocol FLAnimatedImageDebugDelegate +@optional +- (void)debug_animatedImage:(FLAnimatedImage *)animatedImage didUpdateCachedFrames:(NSIndexSet *)indexesOfFramesInCache; +- (void)debug_animatedImage:(FLAnimatedImage *)animatedImage didRequestCachedFrame:(NSUInteger)index; +- (CGFloat)debug_animatedImagePredrawingSlowdownFactor:(FLAnimatedImage *)animatedImage; +@end +#endif + + +@interface FLAnimatedImage () + +@property (nonatomic, assign, readonly) NSUInteger frameCacheSizeOptimal; // The optimal number of frames to cache based on image size & number of frames; never changes +@property (nonatomic, assign, readonly, getter=isPredrawingEnabled) BOOL predrawingEnabled; // Enables predrawing of images to improve performance. +@property (nonatomic, assign) NSUInteger frameCacheSizeMaxInternal; // Allow to cap the cache size e.g. when memory warnings occur; 0 means no specific limit (default) +@property (nonatomic, assign) NSUInteger requestedFrameIndex; // Most recently requested frame index +@property (nonatomic, assign, readonly) NSUInteger posterImageFrameIndex; // Index of non-purgable poster image; never changes +@property (nonatomic, strong, readonly) NSMutableDictionary *cachedFramesForIndexes; +@property (nonatomic, strong, readonly) NSMutableIndexSet *cachedFrameIndexes; // Indexes of cached frames +@property (nonatomic, strong, readonly) NSMutableIndexSet *requestedFrameIndexes; // Indexes of frames that are currently produced in the background +@property (nonatomic, strong, readonly) NSIndexSet *allFramesIndexSet; // Default index set with the full range of indexes; never changes +@property (nonatomic, assign) NSUInteger memoryWarningCount; +@property (nonatomic, strong, readonly) dispatch_queue_t serialQueue; +@property (nonatomic, strong, readonly) __attribute__((NSObject)) CGImageSourceRef imageSource; + +// The weak proxy is used to break retain cycles with delayed actions from memory warnings. +// We are lying about the actual type here to gain static type checking and eliminate casts. +// The actual type of the object is `FLWeakProxy`. +@property (nonatomic, strong, readonly) FLAnimatedImage *weakProxy; + +#if defined(DEBUG) && DEBUG +@property (nonatomic, weak) id debug_delegate; +#endif + +@end + + +// For custom dispatching of memory warnings to avoid deallocation races since NSNotificationCenter doesn't retain objects it is notifying. +static NSHashTable *allAnimatedImagesWeak; + +@implementation FLAnimatedImage + +#pragma mark - Accessors +#pragma mark Public + +// This is the definite value the frame cache needs to size itself to. +- (NSUInteger)frameCacheSizeCurrent +{ + NSUInteger frameCacheSizeCurrent = self.frameCacheSizeOptimal; + + // If set, respect the caps. + if (self.frameCacheSizeMax > FLAnimatedImageFrameCacheSizeNoLimit) { + frameCacheSizeCurrent = MIN(frameCacheSizeCurrent, self.frameCacheSizeMax); + } + + if (self.frameCacheSizeMaxInternal > FLAnimatedImageFrameCacheSizeNoLimit) { + frameCacheSizeCurrent = MIN(frameCacheSizeCurrent, self.frameCacheSizeMaxInternal); + } + + return frameCacheSizeCurrent; +} + + +- (void)setFrameCacheSizeMax:(NSUInteger)frameCacheSizeMax +{ + if (_frameCacheSizeMax != frameCacheSizeMax) { + + // Remember whether the new cap will cause the current cache size to shrink; then we'll make sure to purge from the cache if needed. + BOOL willFrameCacheSizeShrink = (frameCacheSizeMax < self.frameCacheSizeCurrent); + + // Update the value + _frameCacheSizeMax = frameCacheSizeMax; + + if (willFrameCacheSizeShrink) { + [self purgeFrameCacheIfNeeded]; + } + } +} + + +#pragma mark Private + +- (void)setFrameCacheSizeMaxInternal:(NSUInteger)frameCacheSizeMaxInternal +{ + if (_frameCacheSizeMaxInternal != frameCacheSizeMaxInternal) { + + // Remember whether the new cap will cause the current cache size to shrink; then we'll make sure to purge from the cache if needed. + BOOL willFrameCacheSizeShrink = (frameCacheSizeMaxInternal < self.frameCacheSizeCurrent); + + // Update the value + _frameCacheSizeMaxInternal = frameCacheSizeMaxInternal; + + if (willFrameCacheSizeShrink) { + [self purgeFrameCacheIfNeeded]; + } + } +} + + +#pragma mark - Life Cycle + ++ (void)initialize +{ + if (self == [FLAnimatedImage class]) { + // UIKit memory warning notification handler shared by all of the instances + allAnimatedImagesWeak = [NSHashTable weakObjectsHashTable]; + + [[NSNotificationCenter defaultCenter] addObserverForName:UIApplicationDidReceiveMemoryWarningNotification object:nil queue:nil usingBlock:^(NSNotification *note) { + // UIKit notifications are posted on the main thread. didReceiveMemoryWarning: is expecting the main run loop, and we don't lock on allAnimatedImagesWeak + NSAssert([NSThread isMainThread], @"Received memory warning on non-main thread"); + // Get a strong reference to all of the images. If an instance is returned in this array, it is still live and has not entered dealloc. + // Note that FLAnimatedImages can be created on any thread, so the hash table must be locked. + NSArray *images = nil; + @synchronized(allAnimatedImagesWeak) { + images = [[allAnimatedImagesWeak allObjects] copy]; + } + // Now issue notifications to all of the images while holding a strong reference to them + [images makeObjectsPerformSelector:@selector(didReceiveMemoryWarning:) withObject:note]; + }]; + } +} + + +- (instancetype)init +{ + FLAnimatedImage *animatedImage = [self initWithAnimatedGIFData:nil]; + if (!animatedImage) { + FLLog(FLLogLevelError, @"Use `-initWithAnimatedGIFData:` and supply the animated GIF data as an argument to initialize an object of type `FLAnimatedImage`."); + } + return animatedImage; +} + + +- (instancetype)initWithAnimatedGIFData:(NSData *)data +{ + return [self initWithAnimatedGIFData:data optimalFrameCacheSize:0 predrawingEnabled:YES]; +} + +- (instancetype)initWithAnimatedGIFData:(NSData *)data optimalFrameCacheSize:(NSUInteger)optimalFrameCacheSize predrawingEnabled:(BOOL)isPredrawingEnabled +{ + // Early return if no data supplied! + BOOL hasData = ([data length] > 0); + if (!hasData) { + FLLog(FLLogLevelError, @"No animated GIF data supplied."); + return nil; + } + + self = [super init]; + if (self) { + // Do one-time initializations of `readonly` properties directly to ivar to prevent implicit actions and avoid need for private `readwrite` property overrides. + + // Keep a strong reference to `data` and expose it read-only publicly. + // However, we will use the `_imageSource` as handler to the image data throughout our life cycle. + _data = data; + _predrawingEnabled = isPredrawingEnabled; + + // Initialize internal data structures + _cachedFramesForIndexes = [[NSMutableDictionary alloc] init]; + _cachedFrameIndexes = [[NSMutableIndexSet alloc] init]; + _requestedFrameIndexes = [[NSMutableIndexSet alloc] init]; + + // Note: We could leverage `CGImageSourceCreateWithURL` too to add a second initializer `-initWithAnimatedGIFContentsOfURL:`. + _imageSource = CGImageSourceCreateWithData((__bridge CFDataRef)data, + (__bridge CFDictionaryRef)@{(NSString *)kCGImageSourceShouldCache: @NO}); + // Early return on failure! + if (!_imageSource) { + FLLog(FLLogLevelError, @"Failed to `CGImageSourceCreateWithData` for animated GIF data %@", data); + return nil; + } + + // Early return if not GIF! + CFStringRef imageSourceContainerType = CGImageSourceGetType(_imageSource); + BOOL isGIFData = UTTypeConformsTo(imageSourceContainerType, kUTTypeGIF); + if (!isGIFData) { + FLLog(FLLogLevelError, @"Supplied data is of type %@ and doesn't seem to be GIF data %@", imageSourceContainerType, data); + return nil; + } + + // Get `LoopCount` + // Note: 0 means repeating the animation indefinitely. + // Image properties example: + // { + // FileSize = 314446; + // "{GIF}" = { + // HasGlobalColorMap = 1; + // LoopCount = 0; + // }; + // } + NSDictionary *imageProperties = (__bridge_transfer NSDictionary *)CGImageSourceCopyProperties(_imageSource, NULL); + _loopCount = [[[imageProperties objectForKey:(id)kCGImagePropertyGIFDictionary] objectForKey:(id)kCGImagePropertyGIFLoopCount] unsignedIntegerValue]; + + // Iterate through frame images + size_t imageCount = CGImageSourceGetCount(_imageSource); + NSUInteger skippedFrameCount = 0; + NSMutableDictionary *delayTimesForIndexesMutable = [NSMutableDictionary dictionaryWithCapacity:imageCount]; + for (size_t i = 0; i < imageCount; i++) { + @autoreleasepool { + CGImageRef frameImageRef = CGImageSourceCreateImageAtIndex(_imageSource, i, NULL); + if (frameImageRef) { + UIImage *frameImage = [UIImage imageWithCGImage:frameImageRef]; + // Check for valid `frameImage` before parsing its properties as frames can be corrupted (and `frameImage` even `nil` when `frameImageRef` was valid). + if (frameImage) { + // Set poster image + if (!self.posterImage) { + _posterImage = frameImage; + // Set its size to proxy our size. + _size = _posterImage.size; + // Remember index of poster image so we never purge it; also add it to the cache. + _posterImageFrameIndex = i; + [self.cachedFramesForIndexes setObject:self.posterImage forKey:@(self.posterImageFrameIndex)]; + [self.cachedFrameIndexes addIndex:self.posterImageFrameIndex]; + } + + // Get `DelayTime` + // Note: It's not in (1/100) of a second like still falsely described in the documentation as per iOS 8 (rdar://19507384) but in seconds stored as `kCFNumberFloat32Type`. + // Frame properties example: + // { + // ColorModel = RGB; + // Depth = 8; + // PixelHeight = 960; + // PixelWidth = 640; + // "{GIF}" = { + // DelayTime = "0.4"; + // UnclampedDelayTime = "0.4"; + // }; + // } + + NSDictionary *frameProperties = (__bridge_transfer NSDictionary *)CGImageSourceCopyPropertiesAtIndex(_imageSource, i, NULL); + NSDictionary *framePropertiesGIF = [frameProperties objectForKey:(id)kCGImagePropertyGIFDictionary]; + + // Try to use the unclamped delay time; fall back to the normal delay time. + NSNumber *delayTime = [framePropertiesGIF objectForKey:(id)kCGImagePropertyGIFUnclampedDelayTime]; + if (!delayTime) { + delayTime = [framePropertiesGIF objectForKey:(id)kCGImagePropertyGIFDelayTime]; + } + // If we don't get a delay time from the properties, fall back to `kDelayTimeIntervalDefault` or carry over the preceding frame's value. + const NSTimeInterval kDelayTimeIntervalDefault = 0.1; + if (!delayTime) { + if (i == 0) { + FLLog(FLLogLevelInfo, @"Falling back to default delay time for first frame %@ because none found in GIF properties %@", frameImage, frameProperties); + delayTime = @(kDelayTimeIntervalDefault); + } else { + FLLog(FLLogLevelInfo, @"Falling back to preceding delay time for frame %zu %@ because none found in GIF properties %@", i, frameImage, frameProperties); + delayTime = delayTimesForIndexesMutable[@(i - 1)]; + } + } + // Support frame delays as low as `kFLAnimatedImageDelayTimeIntervalMinimum`, with anything below being rounded up to `kDelayTimeIntervalDefault` for legacy compatibility. + // To support the minimum even when rounding errors occur, use an epsilon when comparing. We downcast to float because that's what we get for delayTime from ImageIO. + if ([delayTime floatValue] < ((float)kFLAnimatedImageDelayTimeIntervalMinimum - FLT_EPSILON)) { + FLLog(FLLogLevelInfo, @"Rounding frame %zu's `delayTime` from %f up to default %f (minimum supported: %f).", i, [delayTime floatValue], kDelayTimeIntervalDefault, kFLAnimatedImageDelayTimeIntervalMinimum); + delayTime = @(kDelayTimeIntervalDefault); + } + delayTimesForIndexesMutable[@(i)] = delayTime; + } else { + skippedFrameCount++; + FLLog(FLLogLevelInfo, @"Dropping frame %zu because valid `CGImageRef` %@ did result in `nil`-`UIImage`.", i, frameImageRef); + } + CFRelease(frameImageRef); + } else { + skippedFrameCount++; + FLLog(FLLogLevelInfo, @"Dropping frame %zu because failed to `CGImageSourceCreateImageAtIndex` with image source %@", i, self.imageSource); + } + } + } + _delayTimesForIndexes = [delayTimesForIndexesMutable copy]; + _frameCount = imageCount; + + if (self.frameCount == 0) { + FLLog(FLLogLevelInfo, @"Failed to create any valid frames for GIF with properties %@", imageProperties); + return nil; + } else if (self.frameCount == 1) { + // Warn when we only have a single frame but return a valid GIF. + FLLog(FLLogLevelInfo, @"Created valid GIF but with only a single frame. Image properties: %@", imageProperties); + } else { + // We have multiple frames, rock on! + } + + // If no value is provided, select a default based on the GIF. + if (optimalFrameCacheSize == 0) { + // Calculate the optimal frame cache size: try choosing a larger buffer window depending on the predicted image size. + // It's only dependent on the image size & number of frames and never changes. + CGFloat animatedImageDataSize = CGImageGetBytesPerRow(self.posterImage.CGImage) * self.size.height * (self.frameCount - skippedFrameCount) / MEGABYTE; + if (animatedImageDataSize <= FLAnimatedImageDataSizeCategoryAll) { + _frameCacheSizeOptimal = self.frameCount; + } else if (animatedImageDataSize <= FLAnimatedImageDataSizeCategoryDefault) { + // This value doesn't depend on device memory much because if we're not keeping all frames in memory we will always be decoding 1 frame up ahead per 1 frame that gets played and at this point we might as well just keep a small buffer just large enough to keep from running out of frames. + _frameCacheSizeOptimal = FLAnimatedImageFrameCacheSizeDefault; + } else { + // The predicted size exceeds the limits to build up a cache and we go into low memory mode from the beginning. + _frameCacheSizeOptimal = FLAnimatedImageFrameCacheSizeLowMemory; + } + } else { + // Use the provided value. + _frameCacheSizeOptimal = optimalFrameCacheSize; + } + // In any case, cap the optimal cache size at the frame count. + _frameCacheSizeOptimal = MIN(_frameCacheSizeOptimal, self.frameCount); + + // Convenience/minor performance optimization; keep an index set handy with the full range to return in `-frameIndexesToCache`. + _allFramesIndexSet = [[NSIndexSet alloc] initWithIndexesInRange:NSMakeRange(0, self.frameCount)]; + + // See the property declarations for descriptions. + _weakProxy = (id)[FLWeakProxy weakProxyForObject:self]; + + // Register this instance in the weak table for memory notifications. The NSHashTable will clean up after itself when we're gone. + // Note that FLAnimatedImages can be created on any thread, so the hash table must be locked. + @synchronized(allAnimatedImagesWeak) { + [allAnimatedImagesWeak addObject:self]; + } + } + return self; +} + + ++ (instancetype)animatedImageWithGIFData:(NSData *)data +{ + FLAnimatedImage *animatedImage = [[FLAnimatedImage alloc] initWithAnimatedGIFData:data]; + return animatedImage; +} + + +- (void)dealloc +{ + if (_weakProxy) { + [NSObject cancelPreviousPerformRequestsWithTarget:_weakProxy]; + } + + if (_imageSource) { + CFRelease(_imageSource); + } +} + + +#pragma mark - Public Methods + +// See header for more details. +// Note: both consumer and producer are throttled: consumer by frame timings and producer by the available memory (max buffer window size). +- (UIImage *)imageLazilyCachedAtIndex:(NSUInteger)index +{ + // Early return if the requested index is beyond bounds. + // Note: We're comparing an index with a count and need to bail on greater than or equal to. + if (index >= self.frameCount) { + FLLog(FLLogLevelWarn, @"Skipping requested frame %lu beyond bounds (total frame count: %lu) for animated image: %@", (unsigned long)index, (unsigned long)self.frameCount, self); + return nil; + } + + // Remember requested frame index, this influences what we should cache next. + self.requestedFrameIndex = index; +#if defined(DEBUG) && DEBUG + if ([self.debug_delegate respondsToSelector:@selector(debug_animatedImage:didRequestCachedFrame:)]) { + [self.debug_delegate debug_animatedImage:self didRequestCachedFrame:index]; + } +#endif + + // Quick check to avoid doing any work if we already have all possible frames cached, a common case. + if ([self.cachedFrameIndexes count] < self.frameCount) { + // If we have frames that should be cached but aren't and aren't requested yet, request them. + // Exclude existing cached frames, frames already requested, and specially cached poster image. + NSMutableIndexSet *frameIndexesToAddToCacheMutable = [self frameIndexesToCache]; + [frameIndexesToAddToCacheMutable removeIndexes:self.cachedFrameIndexes]; + [frameIndexesToAddToCacheMutable removeIndexes:self.requestedFrameIndexes]; + [frameIndexesToAddToCacheMutable removeIndex:self.posterImageFrameIndex]; + NSIndexSet *frameIndexesToAddToCache = [frameIndexesToAddToCacheMutable copy]; + + // Asynchronously add frames to our cache. + if ([frameIndexesToAddToCache count] > 0) { + [self addFrameIndexesToCache:frameIndexesToAddToCache]; + } + } + + // Get the specified image. + UIImage *image = self.cachedFramesForIndexes[@(index)]; + + // Purge if needed based on the current playhead position. + [self purgeFrameCacheIfNeeded]; + + return image; +} + + +// Only called once from `-imageLazilyCachedAtIndex` but factored into its own method for logical grouping. +- (void)addFrameIndexesToCache:(NSIndexSet *)frameIndexesToAddToCache +{ + // Order matters. First, iterate over the indexes starting from the requested frame index. + // Then, if there are any indexes before the requested frame index, do those. + NSRange firstRange = NSMakeRange(self.requestedFrameIndex, self.frameCount - self.requestedFrameIndex); + NSRange secondRange = NSMakeRange(0, self.requestedFrameIndex); + if (firstRange.length + secondRange.length != self.frameCount) { + FLLog(FLLogLevelWarn, @"Two-part frame cache range doesn't equal full range."); + } + + // Add to the requested list before we actually kick them off, so they don't get into the queue twice. + [self.requestedFrameIndexes addIndexes:frameIndexesToAddToCache]; + + // Lazily create dedicated isolation queue. + if (!self.serialQueue) { + _serialQueue = dispatch_queue_create("com.flipboard.framecachingqueue", DISPATCH_QUEUE_SERIAL); + } + + // Start streaming requested frames in the background into the cache. + // Avoid capturing self in the block as there's no reason to keep doing work if the animated image went away. + FLAnimatedImage * __weak weakSelf = self; + dispatch_async(self.serialQueue, ^{ + // Produce and cache next needed frame. + void (^frameRangeBlock)(NSRange, BOOL *) = ^(NSRange range, BOOL *stop) { + // Iterate through contiguous indexes; can be faster than `enumerateIndexesInRange:options:usingBlock:`. + for (NSUInteger i = range.location; i < NSMaxRange(range); i++) { +#if defined(DEBUG) && DEBUG + CFTimeInterval predrawBeginTime = CACurrentMediaTime(); +#endif + UIImage *image = [weakSelf imageAtIndex:i]; +#if defined(DEBUG) && DEBUG + CFTimeInterval predrawDuration = CACurrentMediaTime() - predrawBeginTime; + CFTimeInterval slowdownDuration = 0.0; + if ([self.debug_delegate respondsToSelector:@selector(debug_animatedImagePredrawingSlowdownFactor:)]) { + CGFloat predrawingSlowdownFactor = [self.debug_delegate debug_animatedImagePredrawingSlowdownFactor:self]; + slowdownDuration = predrawDuration * predrawingSlowdownFactor - predrawDuration; + [NSThread sleepForTimeInterval:slowdownDuration]; + } + FLLog(FLLogLevelVerbose, @"Predrew frame %lu in %f ms for animated image: %@", (unsigned long)i, (predrawDuration + slowdownDuration) * 1000, self); +#endif + // The results get returned one by one as soon as they're ready (and not in batch). + // The benefits of having the first frames as quick as possible outweigh building up a buffer to cope with potential hiccups when the CPU suddenly gets busy. + if (image && weakSelf) { + dispatch_async(dispatch_get_main_queue(), ^{ + weakSelf.cachedFramesForIndexes[@(i)] = image; + [weakSelf.cachedFrameIndexes addIndex:i]; + [weakSelf.requestedFrameIndexes removeIndex:i]; +#if defined(DEBUG) && DEBUG + if ([weakSelf.debug_delegate respondsToSelector:@selector(debug_animatedImage:didUpdateCachedFrames:)]) { + [weakSelf.debug_delegate debug_animatedImage:weakSelf didUpdateCachedFrames:weakSelf.cachedFrameIndexes]; + } +#endif + }); + } + } + }; + + [frameIndexesToAddToCache enumerateRangesInRange:firstRange options:0 usingBlock:frameRangeBlock]; + [frameIndexesToAddToCache enumerateRangesInRange:secondRange options:0 usingBlock:frameRangeBlock]; + }); +} + + ++ (CGSize)sizeForImage:(id)image +{ + CGSize imageSize = CGSizeZero; + + // Early return for nil + if (!image) { + return imageSize; + } + + if ([image isKindOfClass:[UIImage class]]) { + UIImage *uiImage = (UIImage *)image; + imageSize = uiImage.size; + } else if ([image isKindOfClass:[FLAnimatedImage class]]) { + FLAnimatedImage *animatedImage = (FLAnimatedImage *)image; + imageSize = animatedImage.size; + } else { + // Bear trap to capture bad images; we have seen crashers cropping up on iOS 7. + FLLog(FLLogLevelError, @"`image` isn't of expected types `UIImage` or `FLAnimatedImage`: %@", image); + } + + return imageSize; +} + + +#pragma mark - Private Methods +#pragma mark Frame Loading + +- (UIImage *)imageAtIndex:(NSUInteger)index +{ + // It's very important to use the cached `_imageSource` since the random access to a frame with `CGImageSourceCreateImageAtIndex` turns from an O(1) into an O(n) operation when re-initializing the image source every time. + CGImageRef imageRef = CGImageSourceCreateImageAtIndex(_imageSource, index, NULL); + + // Early return for nil + if (!imageRef) { + return nil; + } + + UIImage *image = [UIImage imageWithCGImage:imageRef]; + CFRelease(imageRef); + + // Loading in the image object is only half the work, the displaying image view would still have to synchronosly wait and decode the image, so we go ahead and do that here on the background thread. + if (self.isPredrawingEnabled) { + image = [[self class] predrawnImageFromImage:image]; + } + + return image; +} + + +#pragma mark Frame Caching + +- (NSMutableIndexSet *)frameIndexesToCache +{ + NSMutableIndexSet *indexesToCache = nil; + // Quick check to avoid building the index set if the number of frames to cache equals the total frame count. + if (self.frameCacheSizeCurrent == self.frameCount) { + indexesToCache = [self.allFramesIndexSet mutableCopy]; + } else { + indexesToCache = [[NSMutableIndexSet alloc] init]; + + // Add indexes to the set in two separate blocks- the first starting from the requested frame index, up to the limit or the end. + // The second, if needed, the remaining number of frames beginning at index zero. + NSUInteger firstLength = MIN(self.frameCacheSizeCurrent, self.frameCount - self.requestedFrameIndex); + NSRange firstRange = NSMakeRange(self.requestedFrameIndex, firstLength); + [indexesToCache addIndexesInRange:firstRange]; + NSUInteger secondLength = self.frameCacheSizeCurrent - firstLength; + if (secondLength > 0) { + NSRange secondRange = NSMakeRange(0, secondLength); + [indexesToCache addIndexesInRange:secondRange]; + } + // Double check our math, before we add the poster image index which may increase it by one. + if ([indexesToCache count] != self.frameCacheSizeCurrent) { + FLLog(FLLogLevelWarn, @"Number of frames to cache doesn't equal expected cache size."); + } + + [indexesToCache addIndex:self.posterImageFrameIndex]; + } + + return indexesToCache; +} + + +- (void)purgeFrameCacheIfNeeded +{ + // Purge frames that are currently cached but don't need to be. + // But not if we're still under the number of frames to cache. + // This way, if all frames are allowed to be cached (the common case), we can skip all the `NSIndexSet` math below. + if ([self.cachedFrameIndexes count] > self.frameCacheSizeCurrent) { + NSMutableIndexSet *indexesToPurge = [self.cachedFrameIndexes mutableCopy]; + [indexesToPurge removeIndexes:[self frameIndexesToCache]]; + [indexesToPurge enumerateRangesUsingBlock:^(NSRange range, BOOL *stop) { + // Iterate through contiguous indexes; can be faster than `enumerateIndexesInRange:options:usingBlock:`. + for (NSUInteger i = range.location; i < NSMaxRange(range); i++) { + [self.cachedFrameIndexes removeIndex:i]; + [self.cachedFramesForIndexes removeObjectForKey:@(i)]; + // Note: Don't `CGImageSourceRemoveCacheAtIndex` on the image source for frames that we don't want cached any longer to maintain O(1) time access. +#if defined(DEBUG) && DEBUG + if ([self.debug_delegate respondsToSelector:@selector(debug_animatedImage:didUpdateCachedFrames:)]) { + dispatch_async(dispatch_get_main_queue(), ^{ + [self.debug_delegate debug_animatedImage:self didUpdateCachedFrames:self.cachedFrameIndexes]; + }); + } +#endif + } + }]; + } +} + + +- (void)growFrameCacheSizeAfterMemoryWarning:(NSNumber *)frameCacheSize +{ + self.frameCacheSizeMaxInternal = [frameCacheSize unsignedIntegerValue]; + FLLog(FLLogLevelDebug, @"Grew frame cache size max to %lu after memory warning for animated image: %@", (unsigned long)self.frameCacheSizeMaxInternal, self); + + // Schedule resetting the frame cache size max completely after a while. + const NSTimeInterval kResetDelay = 3.0; + [self.weakProxy performSelector:@selector(resetFrameCacheSizeMaxInternal) withObject:nil afterDelay:kResetDelay]; +} + + +- (void)resetFrameCacheSizeMaxInternal +{ + self.frameCacheSizeMaxInternal = FLAnimatedImageFrameCacheSizeNoLimit; + FLLog(FLLogLevelDebug, @"Reset frame cache size max (current frame cache size: %lu) for animated image: %@", (unsigned long)self.frameCacheSizeCurrent, self); +} + + +#pragma mark System Memory Warnings Notification Handler + +- (void)didReceiveMemoryWarning:(NSNotification *)notification +{ + self.memoryWarningCount++; + + // If we were about to grow larger, but got rapped on our knuckles by the system again, cancel. + [NSObject cancelPreviousPerformRequestsWithTarget:self.weakProxy selector:@selector(growFrameCacheSizeAfterMemoryWarning:) object:@(FLAnimatedImageFrameCacheSizeGrowAfterMemoryWarning)]; + [NSObject cancelPreviousPerformRequestsWithTarget:self.weakProxy selector:@selector(resetFrameCacheSizeMaxInternal) object:nil]; + + // Go down to the minimum and by that implicitly immediately purge from the cache if needed to not get jettisoned by the system and start producing frames on-demand. + FLLog(FLLogLevelDebug, @"Attempt setting frame cache size max to %lu (previous was %lu) after memory warning #%lu for animated image: %@", (unsigned long)FLAnimatedImageFrameCacheSizeLowMemory, (unsigned long)self.frameCacheSizeMaxInternal, (unsigned long)self.memoryWarningCount, self); + self.frameCacheSizeMaxInternal = FLAnimatedImageFrameCacheSizeLowMemory; + + // Schedule growing larger again after a while, but cap our attempts to prevent a periodic sawtooth wave (ramps upward and then sharply drops) of memory usage. + // + // [mem]^ (2) (5) (6) 1) Loading frames for the first time + // (*)| , , , 2) Mem warning #1; purge cache + // | /| (4)/| /| 3) Grow cache size a bit after a while, if no mem warning occurs + // | / | _/ | _/ | 4) Try to grow cache size back to optimum after a while, if no mem warning occurs + // |(1)/ |_/ |/ |__(7) 5) Mem warning #2; purge cache + // |__/ (3) 6) After repetition of (3) and (4), mem warning #3; purge cache + // +----------------------> 7) After 3 mem warnings, stay at minimum cache size + // [t] + // *) The mem high water mark before we get warned might change for every cycle. + // + const NSUInteger kGrowAttemptsMax = 2; + const NSTimeInterval kGrowDelay = 2.0; + if ((self.memoryWarningCount - 1) <= kGrowAttemptsMax) { + [self.weakProxy performSelector:@selector(growFrameCacheSizeAfterMemoryWarning:) withObject:@(FLAnimatedImageFrameCacheSizeGrowAfterMemoryWarning) afterDelay:kGrowDelay]; + } + + // Note: It's not possible to get the level of a memory warning with a public API: http://stackoverflow.com/questions/2915247/iphone-os-memory-warnings-what-do-the-different-levels-mean/2915477#2915477 +} + + +#pragma mark Image Decoding + +// Decodes the image's data and draws it off-screen fully in memory; it's thread-safe and hence can be called on a background thread. +// On success, the returned object is a new `UIImage` instance with the same content as the one passed in. +// On failure, the returned object is the unchanged passed in one; the data will not be predrawn in memory though and an error will be logged. +// First inspired by & good Karma to: https://gist.github.com/steipete/1144242 ++ (UIImage *)predrawnImageFromImage:(UIImage *)imageToPredraw +{ + // Always use a device RGB color space for simplicity and predictability what will be going on. + CGColorSpaceRef colorSpaceDeviceRGBRef = CGColorSpaceCreateDeviceRGB(); + // Early return on failure! + if (!colorSpaceDeviceRGBRef) { + FLLog(FLLogLevelError, @"Failed to `CGColorSpaceCreateDeviceRGB` for image %@", imageToPredraw); + return imageToPredraw; + } + + // Even when the image doesn't have transparency, we have to add the extra channel because Quartz doesn't support other pixel formats than 32 bpp/8 bpc for RGB: + // kCGImageAlphaNoneSkipFirst, kCGImageAlphaNoneSkipLast, kCGImageAlphaPremultipliedFirst, kCGImageAlphaPremultipliedLast + // (source: docs "Quartz 2D Programming Guide > Graphics Contexts > Table 2-1 Pixel formats supported for bitmap graphics contexts") + size_t numberOfComponents = CGColorSpaceGetNumberOfComponents(colorSpaceDeviceRGBRef) + 1; // 4: RGB + A + + // "In iOS 4.0 and later, and OS X v10.6 and later, you can pass NULL if you want Quartz to allocate memory for the bitmap." (source: docs) + void *data = NULL; + size_t width = imageToPredraw.size.width; + size_t height = imageToPredraw.size.height; + size_t bitsPerComponent = CHAR_BIT; + + size_t bitsPerPixel = (bitsPerComponent * numberOfComponents); + size_t bytesPerPixel = (bitsPerPixel / BYTE_SIZE); + size_t bytesPerRow = (bytesPerPixel * width); + + CGBitmapInfo bitmapInfo = kCGBitmapByteOrderDefault; + + CGImageAlphaInfo alphaInfo = CGImageGetAlphaInfo(imageToPredraw.CGImage); + // If the alpha info doesn't match to one of the supported formats (see above), pick a reasonable supported one. + // "For bitmaps created in iOS 3.2 and later, the drawing environment uses the premultiplied ARGB format to store the bitmap data." (source: docs) + if (alphaInfo == kCGImageAlphaNone || alphaInfo == kCGImageAlphaOnly) { + alphaInfo = kCGImageAlphaNoneSkipFirst; + } else if (alphaInfo == kCGImageAlphaFirst) { + alphaInfo = kCGImageAlphaPremultipliedFirst; + } else if (alphaInfo == kCGImageAlphaLast) { + alphaInfo = kCGImageAlphaPremultipliedLast; + } + // "The constants for specifying the alpha channel information are declared with the `CGImageAlphaInfo` type but can be passed to this parameter safely." (source: docs) + bitmapInfo |= alphaInfo; + + // Create our own graphics context to draw to; `UIGraphicsGetCurrentContext`/`UIGraphicsBeginImageContextWithOptions` doesn't create a new context but returns the current one which isn't thread-safe (e.g. main thread could use it at the same time). + // Note: It's not worth caching the bitmap context for multiple frames ("unique key" would be `width`, `height` and `hasAlpha`), it's ~50% slower. Time spent in libRIP's `CGSBlendBGRA8888toARGB8888` suddenly shoots up -- not sure why. + CGContextRef bitmapContextRef = CGBitmapContextCreate(data, width, height, bitsPerComponent, bytesPerRow, colorSpaceDeviceRGBRef, bitmapInfo); + CGColorSpaceRelease(colorSpaceDeviceRGBRef); + // Early return on failure! + if (!bitmapContextRef) { + FLLog(FLLogLevelError, @"Failed to `CGBitmapContextCreate` with color space %@ and parameters (width: %zu height: %zu bitsPerComponent: %zu bytesPerRow: %zu) for image %@", colorSpaceDeviceRGBRef, width, height, bitsPerComponent, bytesPerRow, imageToPredraw); + return imageToPredraw; + } + + // Draw image in bitmap context and create image by preserving receiver's properties. + CGContextDrawImage(bitmapContextRef, CGRectMake(0.0, 0.0, imageToPredraw.size.width, imageToPredraw.size.height), imageToPredraw.CGImage); + CGImageRef predrawnImageRef = CGBitmapContextCreateImage(bitmapContextRef); + UIImage *predrawnImage = [UIImage imageWithCGImage:predrawnImageRef scale:imageToPredraw.scale orientation:imageToPredraw.imageOrientation]; + CGImageRelease(predrawnImageRef); + CGContextRelease(bitmapContextRef); + + // Early return on failure! + if (!predrawnImage) { + FLLog(FLLogLevelError, @"Failed to `imageWithCGImage:scale:orientation:` with image ref %@ created with color space %@ and bitmap context %@ and properties and properties (scale: %f orientation: %ld) for image %@", predrawnImageRef, colorSpaceDeviceRGBRef, bitmapContextRef, imageToPredraw.scale, (long)imageToPredraw.imageOrientation, imageToPredraw); + return imageToPredraw; + } + + return predrawnImage; +} + + +#pragma mark - Description + +- (NSString *)description +{ + NSString *description = [super description]; + + description = [description stringByAppendingFormat:@" size=%@", NSStringFromCGSize(self.size)]; + description = [description stringByAppendingFormat:@" frameCount=%lu", (unsigned long)self.frameCount]; + + return description; +} + + +@end + +#pragma mark - Logging + +@implementation FLAnimatedImage (Logging) + +static void (^_logBlock)(NSString *logString, FLLogLevel logLevel) = nil; +static FLLogLevel _logLevel; + ++ (void)setLogBlock:(void (^)(NSString *logString, FLLogLevel logLevel))logBlock logLevel:(FLLogLevel)logLevel +{ + _logBlock = logBlock; + _logLevel = logLevel; +} + ++ (void)logStringFromBlock:(NSString *(^)(void))stringBlock withLevel:(FLLogLevel)level +{ + if (level <= _logLevel && _logBlock && stringBlock) { + _logBlock(stringBlock(), level); + } +} + +@end + + +#pragma mark - FLWeakProxy + +@interface FLWeakProxy () + +@property (nonatomic, weak) id target; + +@end + + +@implementation FLWeakProxy + +#pragma mark Life Cycle + +// This is the designated creation method of an `FLWeakProxy` and +// as a subclass of `NSProxy` it doesn't respond to or need `-init`. ++ (instancetype)weakProxyForObject:(id)targetObject +{ + FLWeakProxy *weakProxy = [FLWeakProxy alloc]; + weakProxy.target = targetObject; + return weakProxy; +} + + +#pragma mark Forwarding Messages + +- (id)forwardingTargetForSelector:(SEL)selector +{ + // Keep it lightweight: access the ivar directly + return _target; +} + + +#pragma mark - NSWeakProxy Method Overrides +#pragma mark Handling Unimplemented Methods + +- (void)forwardInvocation:(NSInvocation *)invocation +{ + // Fallback for when target is nil. Don't do anything, just return 0/NULL/nil. + // The method signature we've received to get here is just a dummy to keep `doesNotRecognizeSelector:` from firing. + // We can't really handle struct return types here because we don't know the length. + void *nullPointer = NULL; + [invocation setReturnValue:&nullPointer]; +} + + +- (NSMethodSignature *)methodSignatureForSelector:(SEL)selector +{ + // We only get here if `forwardingTargetForSelector:` returns nil. + // In that case, our weak target has been reclaimed. Return a dummy method signature to keep `doesNotRecognizeSelector:` from firing. + // We'll emulate the Obj-c messaging nil behavior by setting the return value to nil in `forwardInvocation:`, but we'll assume that the return value is `sizeof(void *)`. + // Other libraries handle this situation by making use of a global method signature cache, but that seems heavier than necessary and has issues as well. + // See https://www.mikeash.com/pyblog/friday-qa-2010-02-26-futures.html and https://github.com/steipete/PSTDelegateProxy/issues/1 for examples of using a method signature cache. + return [NSObject instanceMethodSignatureForSelector:@selector(init)]; +} + + +@end diff --git a/CleverTapSDK/FLAnimatedImageView.h b/CleverTapSDK/FLAnimatedImageView.h new file mode 100644 index 00000000..c0d527aa --- /dev/null +++ b/CleverTapSDK/FLAnimatedImageView.h @@ -0,0 +1,36 @@ +// +// FLAnimatedImageView.h +// Flipboard +// +// Created by Raphael Schaad on 7/8/13. +// Copyright (c) 2013-2015 Flipboard. All rights reserved. +// + + +#import + +@class FLAnimatedImage; +@protocol FLAnimatedImageViewDebugDelegate; + + +// +// An `FLAnimatedImageView` can take an `FLAnimatedImage` and plays it automatically when in view hierarchy and stops when removed. +// The animation can also be controlled with the `UIImageView` methods `-start/stop/isAnimating`. +// It is a fully compatible `UIImageView` subclass and can be used as a drop-in component to work with existing code paths expecting to display a `UIImage`. +// Under the hood it uses a `CADisplayLink` for playback, which can be inspected with `currentFrame` & `currentFrameIndex`. +// +@interface FLAnimatedImageView : UIImageView + +// Setting `[UIImageView.image]` to a non-`nil` value clears out existing `animatedImage`. +// And vice versa, setting `animatedImage` will initially populate the `[UIImageView.image]` to its `posterImage` and then start animating and hold `currentFrame`. +@property (nonatomic, strong) FLAnimatedImage *animatedImage; +@property (nonatomic, copy) void(^loopCompletionBlock)(NSUInteger loopCountRemaining); + +@property (nonatomic, strong, readonly) UIImage *currentFrame; +@property (nonatomic, assign, readonly) NSUInteger currentFrameIndex; + +// The animation runloop mode. Enables playback during scrolling by allowing timer events (i.e. animation) with NSRunLoopCommonModes. +// To keep scrolling smooth on single-core devices such as iPhone 3GS/4 and iPod Touch 4th gen, the default run loop mode is NSDefaultRunLoopMode. Otherwise, the default is NSDefaultRunLoopMode. +@property (nonatomic, copy) NSString *runLoopMode; + +@end diff --git a/CleverTapSDK/FLAnimatedImageView.m b/CleverTapSDK/FLAnimatedImageView.m new file mode 100755 index 00000000..0995186e --- /dev/null +++ b/CleverTapSDK/FLAnimatedImageView.m @@ -0,0 +1,442 @@ +// +// FLAnimatedImageView.h +// Flipboard +// +// Created by Raphael Schaad on 7/8/13. +// Copyright (c) 2013-2015 Flipboard. All rights reserved. +// + + +#import "FLAnimatedImageView.h" +#import "FLAnimatedImage.h" +#import + + +#if defined(DEBUG) && DEBUG +@protocol FLAnimatedImageViewDebugDelegate +@optional +- (void)debug_animatedImageView:(FLAnimatedImageView *)animatedImageView waitingForFrame:(NSUInteger)index duration:(NSTimeInterval)duration; +@end +#endif + + +@interface FLAnimatedImageView () + +// Override of public `readonly` properties as private `readwrite` +@property (nonatomic, strong, readwrite) UIImage *currentFrame; +@property (nonatomic, assign, readwrite) NSUInteger currentFrameIndex; + +@property (nonatomic, assign) NSUInteger loopCountdown; +@property (nonatomic, assign) NSTimeInterval accumulator; +@property (nonatomic, strong) CADisplayLink *displayLink; + +@property (nonatomic, assign) BOOL shouldAnimate; // Before checking this value, call `-updateShouldAnimate` whenever the animated image or visibility (window, superview, hidden, alpha) has changed. +@property (nonatomic, assign) BOOL needsDisplayWhenImageBecomesAvailable; + +#if defined(DEBUG) && DEBUG +@property (nonatomic, weak) id debug_delegate; +#endif + +@end + + +@implementation FLAnimatedImageView +@synthesize runLoopMode = _runLoopMode; + +#pragma mark - Initializers + +// -initWithImage: isn't documented as a designated initializer of UIImageView, but it actually seems to be. +// Using -initWithImage: doesn't call any of the other designated initializers. +- (instancetype)initWithImage:(UIImage *)image +{ + self = [super initWithImage:image]; + if (self) { + [self commonInit]; + } + return self; +} + +// -initWithImage:highlightedImage: also isn't documented as a designated initializer of UIImageView, but it doesn't call any other designated initializers. +- (instancetype)initWithImage:(UIImage *)image highlightedImage:(UIImage *)highlightedImage +{ + self = [super initWithImage:image highlightedImage:highlightedImage]; + if (self) { + [self commonInit]; + } + return self; +} + +- (instancetype)initWithFrame:(CGRect)frame +{ + self = [super initWithFrame:frame]; + if (self) { + [self commonInit]; + } + return self; +} + +- (instancetype)initWithCoder:(NSCoder *)aDecoder +{ + self = [super initWithCoder:aDecoder]; + if (self) { + [self commonInit]; + } + return self; +} + +- (void)commonInit +{ + self.runLoopMode = [[self class] defaultRunLoopMode]; + + if (@available(iOS 11.0, tvOS 11.0, *)) { + self.accessibilityIgnoresInvertColors = YES; + } +} + + +#pragma mark - Accessors +#pragma mark Public + +- (void)setAnimatedImage:(FLAnimatedImage *)animatedImage +{ + if (![_animatedImage isEqual:animatedImage]) { + if (animatedImage) { + // Clear out the image. + super.image = nil; + // Ensure disabled highlighting; it's not supported (see `-setHighlighted:`). + super.highlighted = NO; + // UIImageView seems to bypass some accessors when calculating its intrinsic content size, so this ensures its intrinsic content size comes from the animated image. + [self invalidateIntrinsicContentSize]; + } else { + // Stop animating before the animated image gets cleared out. + [self stopAnimating]; + } + + _animatedImage = animatedImage; + + self.currentFrame = animatedImage.posterImage; + self.currentFrameIndex = 0; + if (animatedImage.loopCount > 0) { + self.loopCountdown = animatedImage.loopCount; + } else { + self.loopCountdown = NSUIntegerMax; + } + self.accumulator = 0.0; + + // Start animating after the new animated image has been set. + [self updateShouldAnimate]; + if (self.shouldAnimate) { + [self startAnimating]; + } + + [self.layer setNeedsDisplay]; + } +} + + +#pragma mark - Life Cycle + +- (void)dealloc +{ + // Removes the display link from all run loop modes. + [_displayLink invalidate]; +} + + +#pragma mark - UIView Method Overrides +#pragma mark Observing View-Related Changes + +- (void)didMoveToSuperview +{ + [super didMoveToSuperview]; + + [self updateShouldAnimate]; + if (self.shouldAnimate) { + [self startAnimating]; + } else { + [self stopAnimating]; + } +} + + +- (void)didMoveToWindow +{ + [super didMoveToWindow]; + + [self updateShouldAnimate]; + if (self.shouldAnimate) { + [self startAnimating]; + } else { + [self stopAnimating]; + } +} + +- (void)setAlpha:(CGFloat)alpha +{ + [super setAlpha:alpha]; + + [self updateShouldAnimate]; + if (self.shouldAnimate) { + [self startAnimating]; + } else { + [self stopAnimating]; + } +} + +- (void)setHidden:(BOOL)hidden +{ + [super setHidden:hidden]; + + [self updateShouldAnimate]; + if (self.shouldAnimate) { + [self startAnimating]; + } else { + [self stopAnimating]; + } +} + + +#pragma mark Auto Layout + +- (CGSize)intrinsicContentSize +{ + // Default to let UIImageView handle the sizing of its image, and anything else it might consider. + CGSize intrinsicContentSize = [super intrinsicContentSize]; + + // If we have have an animated image, use its image size. + // UIImageView's intrinsic content size seems to be the size of its image. The obvious approach, simply calling `-invalidateIntrinsicContentSize` when setting an animated image, results in UIImageView steadfastly returning `{UIViewNoIntrinsicMetric, UIViewNoIntrinsicMetric}` for its intrinsicContentSize. + // (Perhaps UIImageView bypasses its `-image` getter in its implementation of `-intrinsicContentSize`, as `-image` is not called after calling `-invalidateIntrinsicContentSize`.) + if (self.animatedImage) { + intrinsicContentSize = self.image.size; + } + + return intrinsicContentSize; +} + +#pragma mark Smart Invert Colors + +#pragma mark - UIImageView Method Overrides +#pragma mark Image Data + +- (UIImage *)image +{ + UIImage *image = nil; + if (self.animatedImage) { + // Initially set to the poster image. + image = self.currentFrame; + } else { + image = super.image; + } + return image; +} + + +- (void)setImage:(UIImage *)image +{ + if (image) { + // Clear out the animated image and implicitly pause animation playback. + self.animatedImage = nil; + } + + super.image = image; +} + + +#pragma mark Animating Images + +- (NSTimeInterval)frameDelayGreatestCommonDivisor +{ + // Presision is set to half of the `kFLAnimatedImageDelayTimeIntervalMinimum` in order to minimize frame dropping. + const NSTimeInterval kGreatestCommonDivisorPrecision = 2.0 / kFLAnimatedImageDelayTimeIntervalMinimum; + + NSArray *delays = self.animatedImage.delayTimesForIndexes.allValues; + + // Scales the frame delays by `kGreatestCommonDivisorPrecision` + // then converts it to an UInteger for in order to calculate the GCD. + NSUInteger scaledGCD = lrint([delays.firstObject floatValue] * kGreatestCommonDivisorPrecision); + for (NSNumber *value in delays) { + scaledGCD = gcd(lrint([value floatValue] * kGreatestCommonDivisorPrecision), scaledGCD); + } + + // Reverse to scale to get the value back into seconds. + return scaledGCD / kGreatestCommonDivisorPrecision; +} + + +static NSUInteger gcd(NSUInteger a, NSUInteger b) +{ + // http://en.wikipedia.org/wiki/Greatest_common_divisor + if (a < b) { + return gcd(b, a); + } else if (a == b) { + return b; + } + + while (true) { + NSUInteger remainder = a % b; + if (remainder == 0) { + return b; + } + a = b; + b = remainder; + } +} + + +- (void)startAnimating +{ + if (self.animatedImage) { + // Lazily create the display link. + if (!self.displayLink) { + // It is important to note the use of a weak proxy here to avoid a retain cycle. `-displayLinkWithTarget:selector:` + // will retain its target until it is invalidated. We use a weak proxy so that the image view will get deallocated + // independent of the display link's lifetime. Upon image view deallocation, we invalidate the display + // link which will lead to the deallocation of both the display link and the weak proxy. + FLWeakProxy *weakProxy = [FLWeakProxy weakProxyForObject:self]; + self.displayLink = [CADisplayLink displayLinkWithTarget:weakProxy selector:@selector(displayDidRefresh:)]; + + [self.displayLink addToRunLoop:[NSRunLoop mainRunLoop] forMode:self.runLoopMode]; + } + + // Note: The display link's `.frameInterval` value of 1 (default) means getting callbacks at the refresh rate of the display (~60Hz). + // Setting it to 2 divides the frame rate by 2 and hence calls back at every other display refresh. + const NSTimeInterval kDisplayRefreshRate = 60.0; // 60Hz + self.displayLink.frameInterval = MAX([self frameDelayGreatestCommonDivisor] * kDisplayRefreshRate, 1); + + self.displayLink.paused = NO; + } else { + [super startAnimating]; + } +} + +- (void)setRunLoopMode:(NSString *)runLoopMode +{ + if (![@[NSDefaultRunLoopMode, NSRunLoopCommonModes] containsObject:runLoopMode]) { + NSAssert(NO, @"Invalid run loop mode: %@", runLoopMode); + _runLoopMode = [[self class] defaultRunLoopMode]; + } else { + _runLoopMode = runLoopMode; + } +} + +- (void)stopAnimating +{ + if (self.animatedImage) { + self.displayLink.paused = YES; + } else { + [super stopAnimating]; + } +} + + +- (BOOL)isAnimating +{ + BOOL isAnimating = NO; + if (self.animatedImage) { + isAnimating = self.displayLink && !self.displayLink.isPaused; + } else { + isAnimating = [super isAnimating]; + } + return isAnimating; +} + + +#pragma mark Highlighted Image Unsupport + +- (void)setHighlighted:(BOOL)highlighted +{ + // Highlighted image is unsupported for animated images, but implementing it breaks the image view when embedded in a UICollectionViewCell. + if (!self.animatedImage) { + [super setHighlighted:highlighted]; + } +} + + +#pragma mark - Private Methods +#pragma mark Animation + +// Don't repeatedly check our window & superview in `-displayDidRefresh:` for performance reasons. +// Just update our cached value whenever the animated image or visibility (window, superview, hidden, alpha) is changed. +- (void)updateShouldAnimate +{ + BOOL isVisible = self.window && self.superview && ![self isHidden] && self.alpha > 0.0; + self.shouldAnimate = self.animatedImage && isVisible; +} + + +- (void)displayDidRefresh:(CADisplayLink *)displayLink +{ + // If for some reason a wild call makes it through when we shouldn't be animating, bail. + // Early return! + if (!self.shouldAnimate) { + FLLog(FLLogLevelWarn, @"Trying to animate image when we shouldn't: %@", self); + return; + } + + NSNumber *delayTimeNumber = [self.animatedImage.delayTimesForIndexes objectForKey:@(self.currentFrameIndex)]; + // If we don't have a frame delay (e.g. corrupt frame), don't update the view but skip the playhead to the next frame (in else-block). + if (delayTimeNumber) { + NSTimeInterval delayTime = [delayTimeNumber floatValue]; + // If we have a nil image (e.g. waiting for frame), don't update the view nor playhead. + UIImage *image = [self.animatedImage imageLazilyCachedAtIndex:self.currentFrameIndex]; + if (image) { + FLLog(FLLogLevelVerbose, @"Showing frame %lu for animated image: %@", (unsigned long)self.currentFrameIndex, self.animatedImage); + self.currentFrame = image; + if (self.needsDisplayWhenImageBecomesAvailable) { + [self.layer setNeedsDisplay]; + self.needsDisplayWhenImageBecomesAvailable = NO; + } + + self.accumulator += displayLink.duration * displayLink.frameInterval; + + // While-loop first inspired by & good Karma to: https://github.com/ondalabs/OLImageView/blob/master/OLImageView.m + while (self.accumulator >= delayTime) { + self.accumulator -= delayTime; + self.currentFrameIndex++; + if (self.currentFrameIndex >= self.animatedImage.frameCount) { + // If we've looped the number of times that this animated image describes, stop looping. + self.loopCountdown--; + if (self.loopCompletionBlock) { + self.loopCompletionBlock(self.loopCountdown); + } + + if (self.loopCountdown == 0) { + [self stopAnimating]; + return; + } + self.currentFrameIndex = 0; + } + // Calling `-setNeedsDisplay` will just paint the current frame, not the new frame that we may have moved to. + // Instead, set `needsDisplayWhenImageBecomesAvailable` to `YES` -- this will paint the new image once loaded. + self.needsDisplayWhenImageBecomesAvailable = YES; + } + } else { + FLLog(FLLogLevelDebug, @"Waiting for frame %lu for animated image: %@", (unsigned long)self.currentFrameIndex, self.animatedImage); +#if defined(DEBUG) && DEBUG + if ([self.debug_delegate respondsToSelector:@selector(debug_animatedImageView:waitingForFrame:duration:)]) { + [self.debug_delegate debug_animatedImageView:self waitingForFrame:self.currentFrameIndex duration:(NSTimeInterval)displayLink.duration * displayLink.frameInterval]; + } +#endif + } + } else { + self.currentFrameIndex++; + } +} + ++ (NSString *)defaultRunLoopMode +{ + // Key off `activeProcessorCount` (as opposed to `processorCount`) since the system could shut down cores in certain situations. + return [NSProcessInfo processInfo].activeProcessorCount > 1 ? NSRunLoopCommonModes : NSDefaultRunLoopMode; +} + + +#pragma mark - CALayerDelegate (Informal) +#pragma mark Providing the Layer's Content + +- (void)displayLayer:(CALayer *)layer +{ + layer.contents = (__bridge id)self.image.CGImage; +} + + +@end diff --git a/CleverTapSDK/InApps/CTAVPlayerControlsViewController.h b/CleverTapSDK/InApps/CTAVPlayerControlsViewController.h new file mode 100644 index 00000000..312883b5 --- /dev/null +++ b/CleverTapSDK/InApps/CTAVPlayerControlsViewController.h @@ -0,0 +1,16 @@ +#import +#import + + +@protocol CTAVPlayerControlsDelegate +- (void)toggleFullscreen; +@end + +@interface CTAVPlayerControlsViewController : UIViewController + +@property (nonatomic, weak) id delegate; + +- (instancetype)init __unavailable; +- (instancetype)initWithPlayer:(AVPlayer*)player andConfig:(NSDictionary*)config; + +@end diff --git a/CleverTapSDK/InApps/CTAVPlayerControlsViewController.m b/CleverTapSDK/InApps/CTAVPlayerControlsViewController.m new file mode 100644 index 00000000..471d49f9 --- /dev/null +++ b/CleverTapSDK/InApps/CTAVPlayerControlsViewController.m @@ -0,0 +1,251 @@ +#import "CTAVPlayerControlsViewController.h" +#import "CTAVPlayerViewController.h" +#import "CTInAppUtils.h" +#import "CTSlider.h" + +static const float kAVSliderHeight = 18; + +@interface CTAVPlayerControlsViewController () + +@property (nonatomic, strong) IBOutlet UIView *containerView; +@property (nonatomic, strong) IBOutlet CTSlider *avSlider; +@property (nonatomic, strong) IBOutlet UIButton *playButton; +@property (nonatomic, strong) IBOutlet UILabel *currentTimeLabel; +@property (nonatomic, strong) IBOutlet UILabel *remainingTimeLabel; +@property (nonatomic, strong) IBOutlet UIButton *fullscreenButton; +@property (nonatomic, weak) NSTimer *controllersTimer; +@property (nonatomic, assign) NSInteger controllersTimeoutPeriod; +@property (nonatomic, assign) BOOL isControlsHidden; +@property (nonatomic, assign) BOOL allowsFullscreen; + +@property (nonatomic, strong, readwrite) AVPlayer *player; +@property (nonatomic, strong) id periodicTimeObserver; + +@end + +@implementation CTAVPlayerControlsViewController + +- (instancetype)initWithPlayer:(AVPlayer*)player andConfig:(NSDictionary *)config { + self = [super initWithNibName:NSStringFromClass([self class]) bundle:[CTInAppUtils bundle]]; + if (self) { + _player = player; + _allowsFullscreen = [config[@"fullscreen"] boolValue]; + } + return self; +} + +- (void)dealloc { + [self.player pause]; + self.player = nil; +} + +- (void)viewDidLoad { + [super viewDidLoad]; + self.view.backgroundColor = [UIColor clearColor]; + self.containerView.backgroundColor = [[UIColor blackColor] colorWithAlphaComponent:0.65f]; + + // setup fullscreen button + NSBundle *bundle = [NSBundle bundleForClass:[self class]]; + UIImage *imageShrink = [UIImage imageNamed:@"ic_shrink.png" inBundle:bundle compatibleWithTraitCollection:nil]; + UIImage *imageExpand = [UIImage imageNamed:@"ic_expand.png" inBundle:bundle compatibleWithTraitCollection:nil]; + [self.fullscreenButton setImage:imageExpand forState:UIControlStateNormal]; + [self.fullscreenButton setImage:imageShrink forState:UIControlStateSelected]; + [self.fullscreenButton addTarget:self action:@selector(toggleFullscreen:) forControlEvents:UIControlEventTouchUpInside]; + + self.fullscreenButton.hidden = !_allowsFullscreen; + + // setup progress slider + UIImage *imagethumb = [UIImage imageNamed:@"ic_thumb.png" inBundle:bundle compatibleWithTraitCollection:nil]; + imagethumb = [imagethumb resizableImageWithCapInsets:UIEdgeInsetsZero resizingMode:UIImageResizingModeTile]; + [self.avSlider setThumbImage:imagethumb forState:UIControlStateNormal]; + self.avSlider.tintColor = [UIColor whiteColor]; + self.avSlider.maximumTrackTintColor = [UIColor whiteColor]; + self.avSlider.minimumTrackTintColor = [UIColor redColor]; + [self.avSlider addTarget:self action:@selector(sliderValueChanged:) forControlEvents:UIControlEventValueChanged]; + self.avSlider.minimumValue = 0; + CGFloat availableDuration = [self duration]; + self.avSlider.maximumValue = round(availableDuration); + + [[NSLayoutConstraint constraintWithItem:self.avSlider + attribute:NSLayoutAttributeHeight relatedBy:NSLayoutRelationEqual + toItem:nil attribute:NSLayoutAttributeNotAnAttribute + multiplier:1 constant:kAVSliderHeight] setActive:YES]; + + // setup time-labels + self.currentTimeLabel.text = @"00:00"; + self.remainingTimeLabel.text = @"00:00"; + + + // setup play button + UIImage *imagePlay = [UIImage imageNamed:@"ic_play.png" inBundle:bundle compatibleWithTraitCollection:nil]; + UIImage *imagePause = [UIImage imageNamed:@"ic_pause.png" inBundle:bundle compatibleWithTraitCollection:nil]; + [self.playButton setImage:imagePlay forState:UIControlStateNormal]; + [self.playButton setImage:imagePause forState:UIControlStateSelected]; + [self.playButton addTarget:self action:@selector(togglePlay) forControlEvents:UIControlEventTouchUpInside]; + + self.controllersTimeoutPeriod = 3; + + UITapGestureRecognizer *tapGesture = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(togglePlayControls:)]; + [self.view addGestureRecognizer:tapGesture]; + + __weak typeof(self) weakSelf = self; + _periodicTimeObserver = [self.player addPeriodicTimeObserverForInterval:CMTimeMake(1, 2) queue:nil usingBlock:^(CMTime progressTime) { + [weakSelf progressDidUpdate:progressTime]; + }]; +} + +- (void)viewDidDisappear:(BOOL)animated { + [super viewDidDisappear:animated]; + [self pause]; + [self.player removeTimeObserver:_periodicTimeObserver]; + _periodicTimeObserver = nil; +} + +#pragma mark - Actions + +- (void)play { + if (self.player != nil) { + [self.player play]; + [self.playButton setSelected:YES]; + [self startAVIdleCountdown]; + } +} + +- (void)stop { + [self pause]; + if (self.player != nil) { + [self.player seekToTime:kCMTimeZero]; + [self.playButton setSelected:NO]; + [self stopAVIdleCountdown]; + } +} + +- (void)pause { + if (self.player != nil) { + [self.player pause]; + [self.playButton setSelected:NO]; + [self stopAVIdleCountdown]; + } +} + +- (CGFloat)duration { + return (self.player && self.player.currentItem) ? CMTimeGetSeconds(self.player.currentItem.asset.duration) : 0; +} + +- (BOOL)isPlaying { + return self.player && self.player.rate > 0; +} + +- (CGFloat)currentTime { + return self.player ? CMTimeGetSeconds(self.player.currentTime) : 0.0; +} + +- (AVPlayerItemStatus)currentStatus { + return (self.player && self.player.currentItem) ? self.player.currentItem.status : AVPlayerItemStatusUnknown; +} + +- (void)togglePlay { + if (![self isPlaying]){ + [self play]; + } else { + [self pause]; + } +} + +- (void)seekTo:(CMTime)time { + if(self.player) { + [self pause]; + [self.player seekToTime:time]; + if (![self isPlaying]) { + [self play]; + } + } +} + +- (void)progressDidUpdate:(CMTime)progressTime { + CGFloat availableDuration = [self duration]; + Float64 seconds = CMTimeGetSeconds(progressTime); + NSString *secondsString = [NSString stringWithFormat:@"%02d", (int)(((int)seconds % 60))]; + NSString *minutesString = [NSString stringWithFormat:@"%02d", (int)(seconds/60)]; + self.currentTimeLabel.text = [NSString stringWithFormat:@"%@:%@", minutesString, secondsString]; + + Float64 remaininingSeconds = round(availableDuration) - CMTimeGetSeconds(progressTime); + NSString *secondsString1 = [NSString stringWithFormat:@"%02d", (int)(((int)remaininingSeconds % 60))]; + NSString *minutesString1 = [NSString stringWithFormat:@"%02d", (int)(remaininingSeconds/60)]; + self.remainingTimeLabel.text = [NSString stringWithFormat:@"-%@:%@", minutesString1, secondsString1]; + + // move the slider thumb + if ([self currentStatus] == AVPlayerStatusReadyToPlay) { + CGFloat currentTime = [self currentTime]; + [self.avSlider setValue:round(currentTime) animated:NO]; + } + + if (round(seconds) >= round(availableDuration)) { + [self stop]; + } +} + +- (void)sliderValueChanged:(UISlider *)sender { + Float64 seconds = self.avSlider.value; + CMTime targetTime = CMTimeMake(seconds, 2); + [self seekTo:targetTime]; +} + +- (void)togglePlayControls:(UIGestureRecognizer *)sender { + if (self.isControlsHidden) { + [self showControls:YES]; + }else { + [self hideControls:YES]; + } +} + +- (void)toggleFullscreen:(UIButton *)sender { + sender.selected = !sender.selected; + if (self.delegate && [self.delegate respondsToSelector:@selector(toggleFullscreen)]) { + [self.delegate toggleFullscreen]; + } + [self hideControls:NO]; +} + +- (void)showControls:(BOOL)animated { + if (!animated) { + [self.containerView setAlpha:1.0f]; + self.isControlsHidden = YES; + return; + } + [UIView animateWithDuration:0.3f animations:^{ + [self.containerView setAlpha:1.0f]; + } completion:^(BOOL finished) { + self.isControlsHidden = false; + }]; +} + +- (void)hideControls:(BOOL)animated { + if (!animated) { + [self.containerView setAlpha:0.0f]; + self.isControlsHidden = YES; + return; + } + [UIView animateWithDuration:0.3f animations:^{ + [self.containerView setAlpha:0.0f]; + } completion:^(BOOL finished) { + self.isControlsHidden = true; + }]; +} + +- (void)startAVIdleCountdown { + if (self.controllersTimer) { + [self.controllersTimer invalidate]; + } + if (self.controllersTimeoutPeriod > 0) { + self.controllersTimer = [NSTimer scheduledTimerWithTimeInterval:self.controllersTimeoutPeriod target:self selector:@selector(hideControls:) userInfo:nil repeats:NO]; + } +} + +- (void)stopAVIdleCountdown { + if (self.controllersTimer) { + [self.controllersTimer invalidate]; + } +} + +@end diff --git a/CleverTapSDK/InApps/CTAVPlayerControlsViewController.xib b/CleverTapSDK/InApps/CTAVPlayerControlsViewController.xib new file mode 100644 index 00000000..c3236dc5 --- /dev/null +++ b/CleverTapSDK/InApps/CTAVPlayerControlsViewController.xib @@ -0,0 +1,95 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/CleverTapSDK/InApps/CTAVPlayerViewController.h b/CleverTapSDK/InApps/CTAVPlayerViewController.h new file mode 100644 index 00000000..977e008e --- /dev/null +++ b/CleverTapSDK/InApps/CTAVPlayerViewController.h @@ -0,0 +1,20 @@ +#import +#import "CTAVPlayerControlsViewController.h" + +NS_ASSUME_NONNULL_BEGIN + +@class CTInAppNotification; + +@protocol CTAVPlayerViewControllerDelegate +- (void)toggleFullscreen; +@end + +@interface CTAVPlayerViewController : AVPlayerViewController + +@property (nonatomic, weak) id playerDelegate; + +- (instancetype)initWithNotification:(CTInAppNotification*)notification; + +@end + +NS_ASSUME_NONNULL_END diff --git a/CleverTapSDK/InApps/CTAVPlayerViewController.m b/CleverTapSDK/InApps/CTAVPlayerViewController.m new file mode 100644 index 00000000..bccd2cb9 --- /dev/null +++ b/CleverTapSDK/InApps/CTAVPlayerViewController.m @@ -0,0 +1,91 @@ +#import "CTAVPlayerViewController.h" +#import "CTInAppNotification.h" +#import "CTInAppResources.h" + +@interface CTAVPlayerViewController () + +@property (nonatomic, strong) CTAVPlayerControlsViewController *controlsViewVC; +@property (nonatomic, strong) CTInAppNotification *notification; +@property (nonatomic, strong) UIImageView *imageView; + +@end + +@implementation CTAVPlayerViewController + +- (instancetype)initWithNotification:(CTInAppNotification *)notification { + self = [super init]; + if (self) { + _notification = notification; + AVPlayerItem *avPlayerItem = [AVPlayerItem playerItemWithURL:[NSURL URLWithString:self.notification.mediaUrl]]; + self.player = [AVPlayer playerWithPlayerItem:avPlayerItem]; + } + return self; +} + +- (void)dealloc { + [self.controlsViewVC removeFromParentViewController]; + self.controlsViewVC = nil; +} + +- (void)viewDidLoad { + [super viewDidLoad]; + [[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayback error:nil]; + self.showsPlaybackControls = NO; + self.view.backgroundColor = [UIColor clearColor]; + self.view.translatesAutoresizingMaskIntoConstraints = NO; + + self.controlsViewVC = [[CTAVPlayerControlsViewController alloc] initWithPlayer:self.player andConfig:@{@"fullscreen":@(!self.notification.mediaIsAudio)}]; + [self addChildViewController:self.controlsViewVC]; + [self.view addSubview:self.controlsViewVC.view]; + [self.controlsViewVC didMoveToParentViewController:self]; + self.controlsViewVC.delegate = self; + self.controlsViewVC.view.translatesAutoresizingMaskIntoConstraints = NO; + + [[NSLayoutConstraint constraintWithItem:self.controlsViewVC.view attribute:NSLayoutAttributeWidth relatedBy:NSLayoutRelationEqual + toItem:self.view attribute:NSLayoutAttributeWidth + multiplier:1 constant:0] setActive:YES]; + + [[NSLayoutConstraint constraintWithItem:self.controlsViewVC.view attribute:NSLayoutAttributeHeight relatedBy:NSLayoutRelationEqual + toItem:self.view attribute:NSLayoutAttributeHeight + multiplier:1 constant:0] setActive:YES]; + + [[NSLayoutConstraint constraintWithItem:self.controlsViewVC.view attribute:NSLayoutAttributeLeading relatedBy:NSLayoutRelationEqual + toItem:self.view attribute:NSLayoutAttributeLeading + multiplier:1 constant:0] setActive:YES]; + + [[NSLayoutConstraint constraintWithItem:self.controlsViewVC.view attribute:NSLayoutAttributeTrailing relatedBy:NSLayoutRelationEqual + toItem:self.view attribute:NSLayoutAttributeTrailing + multiplier:1 constant:0] setActive:YES]; + + [[NSLayoutConstraint constraintWithItem:self.controlsViewVC.view attribute:NSLayoutAttributeCenterY relatedBy:NSLayoutRelationEqual + toItem:self.view attribute:NSLayoutAttributeCenterY + multiplier:1 constant:0] setActive:YES]; + + if (self.notification.mediaIsAudio) { + + NSBundle *bundle = [NSBundle bundleForClass:[self class]]; + UIImage *image = [UIImage imageNamed:@"sound-wave-headphones.png" inBundle:bundle compatibleWithTraitCollection:nil]; + self.imageView = [[UIImageView alloc] initWithFrame: self.controlsViewVC.view.frame]; + self.imageView.backgroundColor = [UIColor blackColor]; + self.imageView.contentMode = UIViewContentModeScaleAspectFit; + self.imageView.image = image; + [self.contentOverlayView addSubview:self.imageView]; + } +} + +- (void)viewDidLayoutSubviews { + [super viewDidLayoutSubviews]; + self.controlsViewVC.view.frame = self.view.bounds; + self.imageView.frame = self.controlsViewVC.view.bounds; + [self.view bringSubviewToFront:self.controlsViewVC.view]; +} + +#pragma mark - Delegates + +- (void)toggleFullscreen { + if (self.playerDelegate && [self.playerDelegate respondsToSelector:@selector(toggleFullscreen)]) { + [self.playerDelegate toggleFullscreen]; + } +} + +@end diff --git a/CleverTapSDK/InApps/CTAlertViewController.h b/CleverTapSDK/InApps/CTAlertViewController.h new file mode 100644 index 00000000..e67befbc --- /dev/null +++ b/CleverTapSDK/InApps/CTAlertViewController.h @@ -0,0 +1,5 @@ +#import "CTInAppDisplayViewController.h" + +@interface CTAlertViewController : CTInAppDisplayViewController + +@end diff --git a/CleverTapSDK/InApps/CTAlertViewController.m b/CleverTapSDK/InApps/CTAlertViewController.m new file mode 100644 index 00000000..41ce81e5 --- /dev/null +++ b/CleverTapSDK/InApps/CTAlertViewController.m @@ -0,0 +1,125 @@ +#import "CTAlertViewController.h" +#import "CTInAppDisplayViewControllerPrivate.h" +#import "CTInAppResources.h" + +@interface CTAlertViewController () + +@end + +@implementation CTAlertViewController + +- (instancetype)initWithNotification:(CTInAppNotification *)notification { + if (self) { + self.notification = notification; + } + return self; +} + +- (void)viewDidLoad { + [super viewDidLoad]; + // Do any additional setup after loading the view. + self.view.backgroundColor = [UIColor clearColor]; + [self setupDialogNotification]; +} + +- (void)didReceiveMemoryWarning { + [super didReceiveMemoryWarning]; + // Dispose of any resources that can be recreated. +} + +#pragma mark - Setup Notification + +- (void)setupDialogNotification { + + UIAlertController *dialogBox = [UIAlertController + alertControllerWithTitle: self.notification.title + message: self.notification.message + preferredStyle:UIAlertControllerStyleAlert]; + + if (self.notification.buttons && self.notification.buttons.count > 0) { + + //Add Buttons + UIAlertAction *firstButton = [UIAlertAction + actionWithTitle:self.notification.buttons[0].text + style:UIAlertActionStyleDefault + handler:^(UIAlertAction * action) { + [self handleAlertButtonClickFromIndex:0]; + }]; + + [dialogBox addAction:firstButton]; + + if (self.notification.buttons.count == 2) { + + UIAlertAction *secondButton = [UIAlertAction + actionWithTitle:self.notification.buttons[1].text + style:UIAlertActionStyleDefault + handler:^(UIAlertAction * action) { + [self handleAlertButtonClickFromIndex:1]; + }]; + + [dialogBox addAction:secondButton]; + } else if (self.notification.buttons.count == 3) { + + UIAlertAction *secondButton = [UIAlertAction + actionWithTitle:self.notification.buttons[1].text + style:UIAlertActionStyleDefault + handler:^(UIAlertAction * action) { + [self handleAlertButtonClickFromIndex:1]; + }]; + + [dialogBox addAction:secondButton]; + + UIAlertAction *thirdButton = [UIAlertAction + actionWithTitle:self.notification.buttons[2].text + style:UIAlertActionStyleDefault + handler:^(UIAlertAction * action) { + [self handleAlertButtonClickFromIndex:2]; + }]; + + [dialogBox addAction:thirdButton]; + } + } + + dispatch_async(dispatch_get_main_queue(), ^{ + [self presentViewController:dialogBox animated:YES completion:nil]; + }); +} + +- (void)handleAlertButtonClickFromIndex:(int)index { + [self handleButtonClickFromIndex:index]; + [self hide:true]; +} + +- (void)showFromWindow:(BOOL)animated { + + if (!self.notification) return; + + self.window = [[UIWindow alloc] initWithFrame:CGRectMake(0, 0, [UIScreen mainScreen].bounds.size.width, [UIScreen mainScreen].bounds.size.height)]; + self.window.alpha = 0; + self.window.backgroundColor = [UIColor clearColor]; + self.window.windowLevel = UIWindowLevelNormal; + self.window.rootViewController = self; + [self.window makeKeyAndVisible]; + [self.window setHidden:NO]; + + void (^completionBlock)(void) = ^ { + if (self.delegate && [self.delegate respondsToSelector:@selector(notificationDidShow:fromViewController:)]) { + [self.delegate notificationDidShow:self.notification fromViewController:self]; + } + }; + + self.window.alpha = 1.0; + completionBlock(); +} + +#pragma mark - Public + +-(void)show:(BOOL)animated { + [self showFromWindow:animated]; +} + +-(void)hide:(BOOL)animated { + [self hideFromWindow:animated]; +} + +@end diff --git a/CleverTapSDK/InApps/CTBaseHeaderFooterViewController.h b/CleverTapSDK/InApps/CTBaseHeaderFooterViewController.h new file mode 100644 index 00000000..8c01748a --- /dev/null +++ b/CleverTapSDK/InApps/CTBaseHeaderFooterViewController.h @@ -0,0 +1,5 @@ +#import "CTInAppDisplayViewController.h" + +@interface CTBaseHeaderFooterViewController : CTInAppDisplayViewController + +@end diff --git a/CleverTapSDK/InApps/CTBaseHeaderFooterViewController.m b/CleverTapSDK/InApps/CTBaseHeaderFooterViewController.m new file mode 100644 index 00000000..445d9610 --- /dev/null +++ b/CleverTapSDK/InApps/CTBaseHeaderFooterViewController.m @@ -0,0 +1,369 @@ + +#import "CTBaseHeaderFooterViewController.h" +#import "CTBaseHeaderFooterViewControllerPrivate.h" +#import "CTInAppDisplayViewControllerPrivate.h" + +typedef enum { + kWRSlideStatusNormal = 0, + kWRSlideStatusLeftExpanded, + kWRSlideStatusLeftExpanding, + kWRSlideStatusRightExpanded, + kWRSlideStatusRightExpanding, +} kWRSlideStatus; + +typedef enum { + WRSlideCellDirectionRight, + WRSlideCellDirectionLeft, +} WRSlideCellDirection; + +#define kMinimumVelocity self.containerView.frame.size.width*1.5 +#define kMinimumPan 60.0 +#define kBOUNCE_DISTANCE 0.0 + + +@interface CTBaseHeaderFooterViewController () { + + kWRSlideStatus _currentStatus; +} + +@property (nonatomic, strong) IBOutlet UIView *containerView; +@property (nonatomic, strong) IBOutlet UILabel *titleLabel; +@property (nonatomic, strong) IBOutlet UILabel *bodyLabel; +@property (nonatomic, strong) IBOutlet UIImageView *imageView; +@property (nonatomic, strong) IBOutlet UIView *buttonsContainer; +@property (nonatomic, strong) IBOutlet UIView *secondButtonContainer; +@property (nonatomic, strong) IBOutlet UIButton *firstButton; +@property (nonatomic, strong) IBOutlet UIButton *secondButton; +@property (nonatomic, strong) IBOutlet UIView *imageContainer; + +@property(nonatomic, retain) UIPanGestureRecognizer *panGesture; +@property(nonatomic, assign) CGFloat initialHorizontalCenter; +@property(nonatomic, assign) CGFloat initialTouchPositionX; + +@property(nonatomic, assign) WRSlideCellDirection lastDirection; +@property(nonatomic, assign) CGFloat originalCenter; + +@property(nonatomic, assign) BOOL revealing; + +@end + +@implementation CTBaseHeaderFooterViewController + +- (instancetype)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil notification:(CTInAppNotification *)notification { + self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]; + if (self) { + self.shouldPassThroughTouches = YES; + self.notification = notification; + } + return self; +} + +- (void)viewDidLoad { + [super viewDidLoad]; + self.view.backgroundColor = [UIColor clearColor]; + CTInAppPassThroughView *view = (CTInAppPassThroughView*)self.view; + view.delegate = self; + [self layoutNotification]; +} + +#pragma mark - Setup Notification + +- (void)layoutNotification { + + self.containerView.backgroundColor = [CTInAppUtils ct_colorWithHexString:self.notification.backgroundColor]; + + if (self.notification.darkenScreen) { + self.view.backgroundColor = [[UIColor blackColor] colorWithAlphaComponent:0.75f]; + } + + // set image + if (self.notification.image) { + self.imageView.clipsToBounds = YES; + self.imageView.hidden = NO; + self.imageView.contentMode = UIViewContentModeScaleAspectFill; + self.imageView.image = [UIImage imageWithData:self.notification.image]; + } else { + [[NSLayoutConstraint constraintWithItem:self.imageContainer attribute:NSLayoutAttributeWidth relatedBy:NSLayoutRelationEqual toItem:nil attribute:NSLayoutAttributeNotAnAttribute + multiplier:1 constant:20] setActive:YES]; + self.imageView.hidden = YES; + } + + if (self.notification.title) { + self.titleLabel.textAlignment = NSTextAlignmentLeft; + self.titleLabel.backgroundColor = [UIColor clearColor]; + self.titleLabel.textColor = [CTInAppUtils ct_colorWithHexString:self.notification.titleColor]; + self.titleLabel.text = self.notification.title; + } + + if (self.notification.message) { + self.bodyLabel.textAlignment = NSTextAlignmentLeft; + self.bodyLabel.backgroundColor = [UIColor clearColor]; + self.bodyLabel.textColor = [CTInAppUtils ct_colorWithHexString:self.notification.messageColor]; + self.bodyLabel.numberOfLines = 0; + self.bodyLabel.text = self.notification.message; + } + + if (!self.notification.showClose) { + _panGesture = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(panGestureHandle:)]; + _panGesture.delegate = self; + [self.containerView addGestureRecognizer:_panGesture]; + } + + self.firstButton.hidden = YES; + self.secondButton.hidden = YES; + + if (self.notification.buttons && self.notification.buttons.count > 0) { + self.firstButton = [self setupViewForButton:self.firstButton withData:self.notification.buttons[0] withIndex:0]; + if (self.notification.buttons.count == 2) { + _secondButton = [self setupViewForButton:_secondButton withData:self.notification.buttons[1] withIndex:1]; + } else { + [[NSLayoutConstraint constraintWithItem:self.secondButtonContainer attribute:NSLayoutAttributeWidth relatedBy:NSLayoutRelationEqual + toItem:nil attribute:NSLayoutAttributeNotAnAttribute + multiplier:1 constant:0] setActive:YES]; + } + } +} + +- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer { + return YES; +} + +- (void)panGestureHandle:(UIPanGestureRecognizer *)recognizer { + //begin pan... + if (recognizer.state == UIGestureRecognizerStateBegan) { + self.initialTouchPositionX = [recognizer locationInView:self.view].x; + self.initialHorizontalCenter = self.containerView.center.x; + } else if (recognizer.state == UIGestureRecognizerStateChanged) { //status change + + CGFloat panAmount = _initialTouchPositionX - [recognizer locationInView:self.view].x; + CGFloat newCenterPosition = _initialHorizontalCenter - panAmount; + CGFloat centerX = self.containerView.center.x; + + if (centerX > _originalCenter && _currentStatus != kWRSlideStatusLeftExpanding) { + _currentStatus = kWRSlideStatusLeftExpanding; + } + else if (centerX < _originalCenter && _currentStatus != kWRSlideStatusRightExpanding) { + _currentStatus = kWRSlideStatusRightExpanding; + } + + if (panAmount > 0) { + _lastDirection = WRSlideCellDirectionLeft; + } + else { + _lastDirection = WRSlideCellDirectionRight; + } + + if (newCenterPosition > self.view.bounds.size.width + self.containerView.bounds.size.width) { + newCenterPosition = self.view.bounds.size.width + self.containerView.bounds.size.width; + } + else if (newCenterPosition < -self.containerView.bounds.size.width) { + newCenterPosition = -self.containerView.bounds.size.width; + } + CGPoint center = self.containerView.center; + center.x = newCenterPosition; + self.containerView.layer.position = center; + } + else if (recognizer.state == UIGestureRecognizerStateEnded || + recognizer.state == UIGestureRecognizerStateCancelled) { + + CGPoint translation = [recognizer translationInView:self.view]; + CGFloat velocityX = [recognizer velocityInView:self.view].x; + + BOOL isNeedPush = (fabs(velocityX) > kMinimumVelocity); + + isNeedPush |= ((_lastDirection == WRSlideCellDirectionLeft && translation.x < -kMinimumPan) || + (_lastDirection == WRSlideCellDirectionRight && translation.x > kMinimumPan)); + + if (velocityX > 0 && _lastDirection == WRSlideCellDirectionLeft) { + isNeedPush = NO; + } + + else if (velocityX < 0 && _lastDirection == WRSlideCellDirectionRight) { + isNeedPush = NO; + } + + if (isNeedPush && !self.revealing) { + + if (_lastDirection == WRSlideCellDirectionRight) { + _currentStatus = kWRSlideStatusLeftExpanding; + } + else { + _currentStatus = kWRSlideStatusRightExpanding; + } + [self _slideOutContentViewInDirection:_lastDirection]; + [self _setRevealing:YES]; + } + else if (self.revealing && translation.x != 0) { + WRSlideCellDirection direct = _currentStatus == kWRSlideStatusRightExpanding ? WRSlideCellDirectionLeft : WRSlideCellDirectionRight; + + [self _slideInContentViewFromDirection:direct]; + [self _setRevealing:NO]; + } + else if (translation.x != 0) { + // Figure out which side we've dragged on. + WRSlideCellDirection finalDir = WRSlideCellDirectionRight; + if (translation.x < 0) + finalDir = WRSlideCellDirectionLeft; + [self _slideInContentViewFromDirection:finalDir]; + [self _setRevealing:NO]; + } + } +} + +#pragma mark - revealing setter + +- (void)setRevealing:(BOOL)revealing { + if (_revealing == revealing) { + return; + } + [self _setRevealing:revealing]; + + if (self.revealing) { + [self _slideOutContentViewInDirection:_lastDirection]; + } else { + [self _slideInContentViewFromDirection:_lastDirection]; + } +} + +- (void)_setRevealing:(BOOL)revealing { + _revealing = revealing; +} + +#pragma mark - ContentView Sliding + +- (void)_slideInContentViewFromDirection:(WRSlideCellDirection)direction { + CGFloat bounceDistance; + + if (self.containerView.center.x == _originalCenter) + return; + + switch (direction) { + case WRSlideCellDirectionRight: + bounceDistance = kBOUNCE_DISTANCE; + break; + case WRSlideCellDirectionLeft: + bounceDistance = (CGFloat) -kBOUNCE_DISTANCE; + break; + default: + break; + } + + [UIView animateWithDuration:0.1 + delay:0 + options:UIViewAnimationOptionCurveEaseOut | UIViewAnimationOptionAllowUserInteraction + animations:^{ + self->_containerView.center = CGPointMake(self->_originalCenter, self->_containerView.center.y); + } + completion:^(BOOL f) { + [UIView animateWithDuration:0.1 delay:0 + options:UIViewAnimationOptionCurveEaseOut + animations:^{ + self->_containerView.frame = CGRectOffset(self->_containerView.frame, bounceDistance, 0); + } + completion:^(BOOL f2) { + [UIView animateWithDuration:0.1 delay:0 + options:UIViewAnimationOptionCurveEaseIn + animations:^{ + self->_containerView.frame = CGRectOffset(self->_containerView.frame, -bounceDistance, 0); + } + completion:^(BOOL f1) { + self->_currentStatus = kWRSlideStatusNormal; + }]; + }]; + }]; +} + +- (void)_slideOutContentViewInDirection:(WRSlideCellDirection)direction; { + CGFloat newCenterX; + CGFloat bounceDistance; + switch (direction) { + case WRSlideCellDirectionLeft: { + newCenterX = -self.containerView.bounds.size.width; + bounceDistance = (CGFloat) -kBOUNCE_DISTANCE; + _currentStatus = kWRSlideStatusLeftExpanded; + } + break; + case WRSlideCellDirectionRight: { + newCenterX = self.view.bounds.size.width + self.containerView.bounds.size.width; + bounceDistance = kBOUNCE_DISTANCE; + _currentStatus = kWRSlideStatusRightExpanded; + } + break; + default: + break; + } + + [UIView animateWithDuration:0.1 + delay:0 + options:UIViewAnimationOptionCurveEaseOut + animations:^{ + self->_containerView.center = CGPointMake(newCenterX, self->_containerView.center.y); + } + completion:^(BOOL f) { + [UIView animateWithDuration:0.1 delay:0 + options:UIViewAnimationOptionCurveEaseIn + animations:^{ + self->_containerView.frame = CGRectOffset(self->_containerView.frame, -bounceDistance, 0); + } + completion:^(BOOL f1) { + [UIView animateWithDuration:0.1 delay:0 + options:UIViewAnimationOptionCurveEaseIn + animations:^{ + self->_containerView.frame = CGRectOffset(self->_containerView.frame, bounceDistance, 0); + } + completion:^(BOOL finished) { + [self hide:NO]; + }]; + }]; + }]; +} + +#pragma mark - UIGestureRecognizerDelegate + +- (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer { + if (gestureRecognizer == _panGesture) { + UIScrollView *superview = (UIScrollView *) self.view; + CGPoint translation = [(UIPanGestureRecognizer *) gestureRecognizer translationInView:superview]; + // Make it scrolling horizontally + return fabs(translation.x) / fabs(translation.y) > 1; + } + return YES; +} + +- (void)showFromWindow:(BOOL)animated { + if (!self.notification) return; + self.window = [[CTInAppPassThroughWindow alloc] initWithFrame:CGRectMake(0, 0, [UIScreen mainScreen].bounds.size.width, [UIScreen mainScreen].bounds.size.height)]; + self.window.alpha = 0; + self.window.backgroundColor = [UIColor clearColor]; + self.window.windowLevel = UIWindowLevelNormal; + self.window.rootViewController = self; + [self.window setHidden:NO]; + + void (^completionBlock)(void) = ^ { + if (self.delegate && [self.delegate respondsToSelector:@selector(notificationDidShow:fromViewController:)]) { + [self.delegate notificationDidShow:self.notification fromViewController:self]; + } + }; + if (animated) { + [UIView animateWithDuration:0.25 animations:^{ + self.window.alpha = 1.0; + } completion:^(BOOL finished) { + completionBlock(); + }]; + } else { + self.window.alpha = 1.0; + completionBlock(); + } +} + +#pragma mark - Public + +-(void)show:(BOOL)animated { + [self showFromWindow:animated]; +} + +-(void)hide:(BOOL)animated { + [self hideFromWindow:animated]; +} + +@end diff --git a/CleverTapSDK/InApps/CTBaseHeaderFooterViewControllerPrivate.h b/CleverTapSDK/InApps/CTBaseHeaderFooterViewControllerPrivate.h new file mode 100644 index 00000000..bd5da3a3 --- /dev/null +++ b/CleverTapSDK/InApps/CTBaseHeaderFooterViewControllerPrivate.h @@ -0,0 +1,9 @@ +@interface CTBaseHeaderFooterViewController () + +- (instancetype)initWithNibName:(NSString *)nibNameOrNil + bundle:(NSBundle *)nibBundleOrNil + notification: (CTInAppNotification *)notification; + +- (void)layoutNotification; + +@end diff --git a/CleverTapSDK/InApps/CTCoverImageViewController.h b/CleverTapSDK/InApps/CTCoverImageViewController.h new file mode 100644 index 00000000..722d1c05 --- /dev/null +++ b/CleverTapSDK/InApps/CTCoverImageViewController.h @@ -0,0 +1,6 @@ +#import "CTInAppDisplayViewController.h" + +@interface CTCoverImageViewController : CTInAppDisplayViewController + +@end + diff --git a/CleverTapSDK/InApps/CTCoverImageViewController.m b/CleverTapSDK/InApps/CTCoverImageViewController.m new file mode 100644 index 00000000..03520c8b --- /dev/null +++ b/CleverTapSDK/InApps/CTCoverImageViewController.m @@ -0,0 +1,89 @@ +#import "CTCoverImageViewController.h" +#import "CTInAppDisplayViewControllerPrivate.h" +#import "CTDismissButton.h" +#import "CTInAppResources.h" + +@interface CTCoverImageViewController () + +@property (nonatomic, strong) IBOutlet UIView *containerView; +@property (nonatomic, strong) IBOutlet UIImageView *imageView; +@property (nonatomic, strong) IBOutlet CTDismissButton *closeButton; + +@end + +@implementation CTCoverImageViewController + +- (instancetype)initWithNotification:(CTInAppNotification *)notification { + self = [super initWithNibName:[CTInAppUtils XibNameForControllerName:NSStringFromClass([CTCoverImageViewController class])] bundle:[CTInAppUtils bundle]]; + if (self) { + self.notification = notification; + } + return self; +} + +- (void)viewDidLoad { + [super viewDidLoad]; + // Do any additional setup after loading the view. + self.view.backgroundColor = [UIColor clearColor]; + [self layoutNotification]; +} + +- (void)didReceiveMemoryWarning { + [super didReceiveMemoryWarning]; + // Dispose of any resources that can be recreated. +} + +#pragma mark - Setup Notification + +- (void)layoutNotification { + + // UIView container which holds all other subviews + self.containerView.backgroundColor = [CTInAppUtils ct_colorWithHexString:self.notification.backgroundColor]; + + self.closeButton.hidden = !self.notification.showCloseButton; + + if (@available(iOS 11.0, *)) { + CGFloat statusBarFrame = [[CTInAppResources getSharedApplication] statusBarFrame].size.height; + [[NSLayoutConstraint constraintWithItem: self.closeButton + attribute:NSLayoutAttributeTop relatedBy:NSLayoutRelationEqual + toItem:self.containerView + attribute:NSLayoutAttributeTop + multiplier:1.0 constant:statusBarFrame] setActive:YES]; + + } else { + // Fallback on earlier versions + } + + // set image + if (self.notification.image) { + self.imageView.clipsToBounds = YES; + self.imageView.contentMode = UIViewContentModeScaleAspectFill; + self.imageView.image = [UIImage imageWithData:self.notification.image]; + self.imageView.userInteractionEnabled = YES; + UITapGestureRecognizer *imageTapGesture = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleImageTapGesture:)]; + [self.imageView addGestureRecognizer:imageTapGesture]; + + } +} + +#pragma mark - Actions + +- (IBAction)closeButtonTapped:(id)sender { + [super tappedDismiss]; +} +- (void)handleImageTapGesture:(UITapGestureRecognizer *)sender { + [self handleImageTapGesture]; + [self hide:true]; +} + +#pragma mark - Public + +-(void)show:(BOOL)animated { + [self showFromWindow:animated]; +} + +-(void)hide:(BOOL)animated { + [self hideFromWindow:animated]; +} + +@end diff --git a/CleverTapSDK/InApps/CTCoverImageViewController~ipad.xib b/CleverTapSDK/InApps/CTCoverImageViewController~ipad.xib new file mode 100644 index 00000000..07365840 --- /dev/null +++ b/CleverTapSDK/InApps/CTCoverImageViewController~ipad.xib @@ -0,0 +1,81 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/CleverTapSDK/InApps/CTCoverImageViewController~iphoneport.xib b/CleverTapSDK/InApps/CTCoverImageViewController~iphoneport.xib new file mode 100644 index 00000000..4e5549c5 --- /dev/null +++ b/CleverTapSDK/InApps/CTCoverImageViewController~iphoneport.xib @@ -0,0 +1,79 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/CleverTapSDK/InApps/CTCoverViewController.h b/CleverTapSDK/InApps/CTCoverViewController.h new file mode 100644 index 00000000..bb08ec89 --- /dev/null +++ b/CleverTapSDK/InApps/CTCoverViewController.h @@ -0,0 +1,5 @@ +#import "CTInAppDisplayViewController.h" + +@interface CTCoverViewController : CTInAppDisplayViewController + +@end diff --git a/CleverTapSDK/InApps/CTCoverViewController.m b/CleverTapSDK/InApps/CTCoverViewController.m new file mode 100644 index 00000000..10297258 --- /dev/null +++ b/CleverTapSDK/InApps/CTCoverViewController.m @@ -0,0 +1,115 @@ +#import "CTCoverViewController.h" +#import "CTInAppDisplayViewControllerPrivate.h" +#import "CTDismissButton.h" +#import "CTInAppUtils.h" +#import "CTInAppResources.h" + +@interface CTCoverViewController () + +@property (nonatomic, strong) IBOutlet UIView *containerView; +@property (nonatomic, strong) IBOutlet UILabel *titleLabel; +@property (nonatomic, strong) IBOutlet UILabel *bodyLabel; +@property (nonatomic, strong) IBOutlet UIImageView *imageView; +@property (nonatomic, strong) IBOutlet UIView *buttonsContainer; +@property (nonatomic, strong) IBOutlet UIView *secondButtonContainer; +@property (nonatomic, strong) IBOutlet UIButton *firstButton; +@property (nonatomic, strong) IBOutlet UIButton *secondButton; +@property (nonatomic, strong) IBOutlet CTDismissButton *closeButton; + +@end + +@implementation CTCoverViewController + +@synthesize delegate; + +#pragma mark - UIViewController Lifecycle + +- (instancetype) initWithNotification:(CTInAppNotification *)notification { + self = [super initWithNibName:[CTInAppUtils XibNameForControllerName:NSStringFromClass([CTCoverViewController class])] bundle:[CTInAppUtils bundle]]; + if (self) { + self.notification = notification; + } + return self; +} + +-(void)viewDidLoad { + [super viewDidLoad]; + [self layoutNotification]; +} + +#pragma mark - Setup Notification + +- (void)layoutNotification { + + self.view.backgroundColor = [UIColor clearColor]; + + if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPhone) { + if (@available(iOS 11.0, *)) { + CGFloat statusBarFrame = [[CTInAppResources getSharedApplication] statusBarFrame].size.height; + [[NSLayoutConstraint constraintWithItem: self.closeButton + attribute:NSLayoutAttributeTop relatedBy:NSLayoutRelationEqual + toItem:self.containerView + attribute:NSLayoutAttributeTop + multiplier:1.0 constant:statusBarFrame] setActive:YES]; + } + } + + // UIView container which holds all other subviews + self.containerView.backgroundColor = [CTInAppUtils ct_colorWithHexString:self.notification.backgroundColor]; + + self.closeButton.hidden = !self.notification.showCloseButton; + + // set image + if (self.notification.image) { + self.imageView.clipsToBounds = YES; + self.imageView.contentMode = UIViewContentModeScaleAspectFill; + self.imageView.image = [UIImage imageWithData:self.notification.image]; + } + + if (self.notification.title) { + self.titleLabel.textAlignment = NSTextAlignmentCenter; + self.titleLabel.backgroundColor = [UIColor clearColor]; + self.titleLabel.textColor = [CTInAppUtils ct_colorWithHexString:self.notification.titleColor]; + self.titleLabel.text = self.notification.title; + } + + if (self.notification.message) { + self.bodyLabel.textAlignment = NSTextAlignmentCenter; + self.bodyLabel.backgroundColor = [UIColor clearColor]; + self.bodyLabel.textColor = [CTInAppUtils ct_colorWithHexString:self.notification.messageColor]; + self.bodyLabel.numberOfLines = 0; + self.bodyLabel.text = self.notification.message; + } + + self.firstButton.hidden = YES; + self.secondButton.hidden = YES; + + if (self.notification.buttons && self.notification.buttons.count > 0) { + self.firstButton = [self setupViewForButton:self.firstButton withData:self.notification.buttons[0] withIndex:0]; + if (self.notification.buttons.count == 2) { + self.secondButton = [self setupViewForButton:self.secondButton withData:self.notification.buttons[1] withIndex:1]; + } else { + [self.secondButton setHidden:YES]; + [[NSLayoutConstraint constraintWithItem:self.secondButtonContainer attribute:NSLayoutAttributeHeight relatedBy:NSLayoutRelationEqual + toItem:nil attribute:NSLayoutAttributeNotAnAttribute + multiplier:1 constant:0] setActive:YES]; + } + } +} + +#pragma mark - Actions + +- (IBAction)closeButtonTapped:(id)sender { + [super tappedDismiss]; +} + +#pragma mark - Public + +-(void)show:(BOOL)animated { + [self showFromWindow:animated]; +} + +-(void)hide:(BOOL)animated { + [self hideFromWindow:animated]; +} +@end diff --git a/CleverTapSDK/InApps/CTCoverViewController~ipad.xib b/CleverTapSDK/InApps/CTCoverViewController~ipad.xib new file mode 100644 index 00000000..42cf403c --- /dev/null +++ b/CleverTapSDK/InApps/CTCoverViewController~ipad.xib @@ -0,0 +1,176 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/CleverTapSDK/InApps/CTCoverViewController~iphoneport.xib b/CleverTapSDK/InApps/CTCoverViewController~iphoneport.xib new file mode 100644 index 00000000..bf5c2d7d --- /dev/null +++ b/CleverTapSDK/InApps/CTCoverViewController~iphoneport.xib @@ -0,0 +1,149 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/CleverTapSDK/CTDismissButton.h b/CleverTapSDK/InApps/CTDismissButton.h similarity index 100% rename from CleverTapSDK/CTDismissButton.h rename to CleverTapSDK/InApps/CTDismissButton.h diff --git a/CleverTapSDK/CTDismissButton.m b/CleverTapSDK/InApps/CTDismissButton.m similarity index 92% rename from CleverTapSDK/CTDismissButton.m rename to CleverTapSDK/InApps/CTDismissButton.m index 1ed636ce..7c08e60c 100644 --- a/CleverTapSDK/CTDismissButton.m +++ b/CleverTapSDK/InApps/CTDismissButton.m @@ -5,9 +5,29 @@ @implementation CTDismissButton static UIImage *dismissButtonImage; - (instancetype)init { - if (!(self = [super initWithFrame:(CGRect) {0, 0, 32, 32}])) { + if (!(self = [self initWithFrame:(CGRect) {0, 0, 32, 32}])) { return nil; } + return self; +} + +- (instancetype)initWithFrame:(CGRect)frame { + self = [super initWithFrame:frame]; + if (self) { + [self commonInit]; + } + return self; +} + +- (instancetype)initWithCoder:(NSCoder *)aDecoder { + self = [super initWithCoder:aDecoder]; + if (self) { + [self commonInit]; + } + return self; +} + +- (void)commonInit { if (dismissButtonImage != nil) { [self setImage:dismissButtonImage forState:UIControlStateNormal]; } else { @@ -16,7 +36,6 @@ - (instancetype)init { dismissButtonImage = [self dismissButtonImage]; }); } - return self; } - (UIImage *)dismissButtonImage { @@ -129,5 +148,4 @@ - (UIImage *)dismissImage:(UIColor *)color withSize:(int)size return img; } - @end diff --git a/CleverTapSDK/InApps/CTFooterViewController.h b/CleverTapSDK/InApps/CTFooterViewController.h new file mode 100644 index 00000000..ad796cee --- /dev/null +++ b/CleverTapSDK/InApps/CTFooterViewController.h @@ -0,0 +1,5 @@ +#import "CTBaseHeaderFooterViewController.h" + +@interface CTFooterViewController : CTBaseHeaderFooterViewController + +@end diff --git a/CleverTapSDK/InApps/CTFooterViewController.m b/CleverTapSDK/InApps/CTFooterViewController.m new file mode 100644 index 00000000..382a0106 --- /dev/null +++ b/CleverTapSDK/InApps/CTFooterViewController.m @@ -0,0 +1,30 @@ +#import "CTFooterViewController.h" +#import "CTBaseHeaderFooterViewControllerPrivate.h" + +@interface CTFooterViewController () { +} + +@property (nonatomic, strong) IBOutlet UIView *containerView; + +@end + +@implementation CTFooterViewController + +- (instancetype)initWithNotification:(CTInAppNotification *)notification { + self = [super + initWithNibName:[CTInAppUtils XibNameForControllerName:NSStringFromClass([CTFooterViewController class])] + bundle:[CTInAppUtils bundle] + notification:notification]; + return self; +} + +- (void)layoutNotification { + [super layoutNotification]; + + if (@available(iOS 11, *)) { + UILayoutGuide *layoutGuide = self.view.safeAreaLayoutGuide; + [self.containerView.bottomAnchor constraintEqualToAnchor:layoutGuide.bottomAnchor].active = YES; + } +} + +@end diff --git a/CleverTapSDK/InApps/CTFooterViewController~ipad.xib b/CleverTapSDK/InApps/CTFooterViewController~ipad.xib new file mode 100644 index 00000000..91b161b6 --- /dev/null +++ b/CleverTapSDK/InApps/CTFooterViewController~ipad.xib @@ -0,0 +1,163 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/CleverTapSDK/InApps/CTFooterViewController~iphoneport.xib b/CleverTapSDK/InApps/CTFooterViewController~iphoneport.xib new file mode 100644 index 00000000..52c1bba5 --- /dev/null +++ b/CleverTapSDK/InApps/CTFooterViewController~iphoneport.xib @@ -0,0 +1,163 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/CleverTapSDK/InApps/CTHalfInterstitialImageViewController.h b/CleverTapSDK/InApps/CTHalfInterstitialImageViewController.h new file mode 100644 index 00000000..0312fd12 --- /dev/null +++ b/CleverTapSDK/InApps/CTHalfInterstitialImageViewController.h @@ -0,0 +1,6 @@ +#import "CTInAppDisplayViewController.h" + +@interface CTHalfInterstitialImageViewController : CTInAppDisplayViewController + +@end + diff --git a/CleverTapSDK/InApps/CTHalfInterstitialImageViewController.m b/CleverTapSDK/InApps/CTHalfInterstitialImageViewController.m new file mode 100644 index 00000000..40852f57 --- /dev/null +++ b/CleverTapSDK/InApps/CTHalfInterstitialImageViewController.m @@ -0,0 +1,112 @@ +#import "CTHalfInterstitialImageViewController.h" +#import "CTInAppDisplayViewControllerPrivate.h" +#import "CTDismissButton.h" +#import "CTInAppResources.h" + +@interface CTHalfInterstitialImageViewController () + +@property (nonatomic, strong) IBOutlet UIView *containerView; +@property (nonatomic, strong) IBOutlet UIImageView *imageView; +@property (nonatomic, strong) IBOutlet CTDismissButton *closeButton; + +@end + +@implementation CTHalfInterstitialImageViewController + +- (instancetype)initWithNotification:(CTInAppNotification *)notification { + self = [super initWithNibName:[CTInAppUtils XibNameForControllerName:NSStringFromClass([CTHalfInterstitialImageViewController class])] bundle:[CTInAppUtils bundle]]; + if (self) { + self.notification = notification; + } + return self; +} + +- (void)viewDidLoad { + [super viewDidLoad]; + // Do any additional setup after loading the view. + self.view.backgroundColor = [UIColor clearColor]; + [self layoutNotification]; + +} + +- (void)didReceiveMemoryWarning { + [super didReceiveMemoryWarning]; + // Dispose of any resources that can be recreated. +} + +#pragma mark - Setup Notification + +- (void)layoutNotification { + + // UIView container which holds all other subviews + self.containerView.backgroundColor = [CTInAppUtils ct_colorWithHexString:self.notification.backgroundColor]; + + self.closeButton.hidden = !self.notification.showCloseButton; + + if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPad) { + [self.containerView setTranslatesAutoresizingMaskIntoConstraints:NO]; + if (self.notification.tablet) { + [[NSLayoutConstraint constraintWithItem:self.containerView + attribute:NSLayoutAttributeLeading + relatedBy:NSLayoutRelationEqual + toItem:self.view attribute:NSLayoutAttributeLeading + multiplier:1 constant:40] setActive:YES]; + [[NSLayoutConstraint constraintWithItem:self.containerView + attribute:NSLayoutAttributeTrailing + relatedBy:NSLayoutRelationEqual + toItem:self.view attribute:NSLayoutAttributeTrailing + multiplier:1 constant:-40] setActive:YES]; + [[NSLayoutConstraint constraintWithItem:self.containerView + attribute:NSLayoutAttributeHeight + relatedBy:NSLayoutRelationEqual + toItem:self.view + attribute:NSLayoutAttributeHeight + multiplier:0.5 constant:0] setActive:YES]; + + }else{ + [[NSLayoutConstraint constraintWithItem:self.containerView + attribute:NSLayoutAttributeLeading + relatedBy:NSLayoutRelationEqual + toItem:self.view attribute:NSLayoutAttributeLeading + multiplier:1 constant:160] setActive:YES]; + [[NSLayoutConstraint constraintWithItem:self.containerView + attribute:NSLayoutAttributeTrailing + relatedBy:NSLayoutRelationEqual + toItem:self.view attribute:NSLayoutAttributeTrailing + multiplier:1 constant:-160] setActive:YES]; + } + } + + // set image + if (self.notification.image) { + self.imageView.clipsToBounds = YES; + self.imageView.contentMode = UIViewContentModeScaleAspectFill; + self.imageView.image = [UIImage imageWithData:self.notification.image]; + self.imageView.userInteractionEnabled = YES; + UITapGestureRecognizer *imageTapGesture = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleImageTapGesture:)]; + [self.imageView addGestureRecognizer:imageTapGesture]; + } +} + +#pragma mark - Actions + +- (IBAction)closeButtonTapped:(id)sender { + [super tappedDismiss]; +} + +- (void)handleImageTapGesture:(UITapGestureRecognizer *)sender { + [self handleImageTapGesture]; + [self hide:true]; +} + +#pragma mark - Public + +-(void)show:(BOOL)animated { + [self showFromWindow:animated]; +} + +-(void)hide:(BOOL)animated { + [self hideFromWindow:animated]; +} + +@end diff --git a/CleverTapSDK/InApps/CTHalfInterstitialImageViewController~ipad.xib b/CleverTapSDK/InApps/CTHalfInterstitialImageViewController~ipad.xib new file mode 100644 index 00000000..d91ed797 --- /dev/null +++ b/CleverTapSDK/InApps/CTHalfInterstitialImageViewController~ipad.xib @@ -0,0 +1,77 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/CleverTapSDK/InApps/CTHalfInterstitialImageViewController~iphoneport.xib b/CleverTapSDK/InApps/CTHalfInterstitialImageViewController~iphoneport.xib new file mode 100644 index 00000000..5536bbcb --- /dev/null +++ b/CleverTapSDK/InApps/CTHalfInterstitialImageViewController~iphoneport.xib @@ -0,0 +1,67 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/CleverTapSDK/InApps/CTHalfInterstitialViewController.h b/CleverTapSDK/InApps/CTHalfInterstitialViewController.h new file mode 100644 index 00000000..bfabc293 --- /dev/null +++ b/CleverTapSDK/InApps/CTHalfInterstitialViewController.h @@ -0,0 +1,5 @@ +#import "CTInAppDisplayViewController.h" + +@interface CTHalfInterstitialViewController : CTInAppDisplayViewController + +@end diff --git a/CleverTapSDK/InApps/CTHalfInterstitialViewController.m b/CleverTapSDK/InApps/CTHalfInterstitialViewController.m new file mode 100644 index 00000000..61468deb --- /dev/null +++ b/CleverTapSDK/InApps/CTHalfInterstitialViewController.m @@ -0,0 +1,140 @@ +#import "CTHalfInterstitialViewController.h" +#import "CTInAppDisplayViewControllerPrivate.h" +#import "CTDismissButton.h" +#import "CTInAppUtils.h" +#import "CTInAppResources.h" + +@interface CTHalfInterstitialViewController () + +@property (nonatomic, strong) IBOutlet UIView *containerView; +@property (nonatomic, strong) IBOutlet UIImageView *imageView; +@property (nonatomic, strong) IBOutlet UIView *buttonsContainer; +@property (nonatomic, strong) IBOutlet UIView *secondButtonContainer; +@property (nonatomic, strong) IBOutlet UILabel *titleLabel; +@property (nonatomic, strong) IBOutlet UILabel *bodyLabel; +@property (nonatomic, strong) IBOutlet UIButton *firstButton; +@property (nonatomic, strong) IBOutlet UIButton *secondButton; +@property (nonatomic, strong) IBOutlet CTDismissButton *closeButton; + + +@end + +@implementation CTHalfInterstitialViewController + +#pragma mark - UIViewController Lifecycle + +- (instancetype) initWithNotification:(CTInAppNotification *)notification { + self = [super initWithNibName:[CTInAppUtils XibNameForControllerName:NSStringFromClass([CTHalfInterstitialViewController class])] bundle:[CTInAppUtils bundle]]; + if (self) { + self.notification = notification; + } + return self; +} + +-(void)viewDidLoad { + [super viewDidLoad]; + [self layoutNotification]; +} + +#pragma mark - Setup Notification + +- (void)layoutNotification { + + self.view.backgroundColor = [UIColor clearColor]; + self.containerView.backgroundColor = [CTInAppUtils ct_colorWithHexString:self.notification.backgroundColor]; + + if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPad) { + [self.containerView setTranslatesAutoresizingMaskIntoConstraints:NO]; + if (self.notification.tablet) { + [[NSLayoutConstraint constraintWithItem:self.containerView + attribute:NSLayoutAttributeTrailing + relatedBy:NSLayoutRelationEqual + toItem:self.view attribute:NSLayoutAttributeTrailing + multiplier:1 constant:-40] setActive:YES]; + [[NSLayoutConstraint constraintWithItem:self.containerView + attribute:NSLayoutAttributeLeading + relatedBy:NSLayoutRelationEqual + toItem:self.view attribute:NSLayoutAttributeLeading + multiplier:1 constant:40] setActive:YES]; + [[NSLayoutConstraint constraintWithItem:self.containerView + attribute:NSLayoutAttributeHeight + relatedBy:NSLayoutRelationEqual + toItem:self.view + attribute:NSLayoutAttributeHeight + multiplier:0.5 constant:0] setActive:YES]; + + }else { + [[NSLayoutConstraint constraintWithItem:self.containerView + attribute:NSLayoutAttributeTrailing + relatedBy:NSLayoutRelationEqual + toItem:self.view attribute:NSLayoutAttributeTrailing + multiplier:1 constant:-160] setActive:YES]; + [[NSLayoutConstraint constraintWithItem:self.containerView + attribute:NSLayoutAttributeLeading + relatedBy:NSLayoutRelationEqual + toItem:self.view attribute:NSLayoutAttributeLeading + multiplier:1 constant:160] setActive:YES]; + } + } + + if (self.notification.darkenScreen) { + self.view.backgroundColor = [[UIColor blackColor] colorWithAlphaComponent:0.75f]; + } + + if (self.notification.image) { + self.imageView.clipsToBounds = YES; + self.imageView.contentMode = UIViewContentModeScaleAspectFill; + self.imageView.image = [UIImage imageWithData:self.notification.image]; + } + + self.closeButton.hidden = !self.notification.showCloseButton; + + if (self.notification.title) { + self.titleLabel.textAlignment = NSTextAlignmentCenter; + self.titleLabel.backgroundColor = [UIColor clearColor]; + self.titleLabel.textColor = [CTInAppUtils ct_colorWithHexString:self.notification.titleColor]; + self.titleLabel.text = self.notification.title; + } + + if (self.notification.message) { + self.bodyLabel.textAlignment = NSTextAlignmentCenter; + self.bodyLabel.backgroundColor = [UIColor clearColor]; + self.bodyLabel.textColor = [CTInAppUtils ct_colorWithHexString:self.notification.messageColor]; + self.bodyLabel.numberOfLines = 0; + self.bodyLabel.text = self.notification.message; + } + + self.firstButton.hidden = YES; + self.secondButton.hidden = YES; + + if (self.notification.buttons && self.notification.buttons.count > 0) { + self.firstButton = [self setupViewForButton:self.firstButton withData:self.notification.buttons[0] withIndex:0]; + if (self.notification.buttons.count == 2) { + self.secondButton = [self setupViewForButton:_secondButton withData:self.notification.buttons[1] withIndex:1]; + } else { + [[NSLayoutConstraint constraintWithItem:self.secondButtonContainer attribute:NSLayoutAttributeHeight relatedBy:NSLayoutRelationEqual + toItem:nil attribute:NSLayoutAttributeNotAnAttribute + multiplier:1 constant:0] setActive:YES]; + + [self.secondButton setHidden:YES]; + } + } +} + +#pragma mark - Actions + +- (IBAction)closeButtonTapped:(id)sender { + [super tappedDismiss]; +} + +#pragma mark - Public + +-(void)show:(BOOL)animated { + [self showFromWindow:animated]; +} + +-(void)hide:(BOOL)animated { + [self hideFromWindow:animated]; +} + +@end diff --git a/CleverTapSDK/InApps/CTHalfInterstitialViewController~ipad.xib b/CleverTapSDK/InApps/CTHalfInterstitialViewController~ipad.xib new file mode 100644 index 00000000..14eac630 --- /dev/null +++ b/CleverTapSDK/InApps/CTHalfInterstitialViewController~ipad.xib @@ -0,0 +1,147 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/CleverTapSDK/InApps/CTHalfInterstitialViewController~iphoneport.xib b/CleverTapSDK/InApps/CTHalfInterstitialViewController~iphoneport.xib new file mode 100644 index 00000000..3cec1366 --- /dev/null +++ b/CleverTapSDK/InApps/CTHalfInterstitialViewController~iphoneport.xib @@ -0,0 +1,151 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/CleverTapSDK/InApps/CTHeaderViewController.h b/CleverTapSDK/InApps/CTHeaderViewController.h new file mode 100644 index 00000000..e4569b56 --- /dev/null +++ b/CleverTapSDK/InApps/CTHeaderViewController.h @@ -0,0 +1,5 @@ +#import "CTBaseHeaderFooterViewController.h" + +@interface CTHeaderViewController : CTBaseHeaderFooterViewController + +@end diff --git a/CleverTapSDK/InApps/CTHeaderViewController.m b/CleverTapSDK/InApps/CTHeaderViewController.m new file mode 100644 index 00000000..5fffefa4 --- /dev/null +++ b/CleverTapSDK/InApps/CTHeaderViewController.m @@ -0,0 +1,36 @@ +#import "CTHeaderViewController.h" +#import "CTBaseHeaderFooterViewControllerPrivate.h" +#import "CTInAppResources.h" + +@interface CTHeaderViewController () { +} + +@property (nonatomic, strong) IBOutlet UIView *containerView; + +@end + +@implementation CTHeaderViewController + +- (instancetype)initWithNotification:(CTInAppNotification *)notification { + self = [super + initWithNibName:[CTInAppUtils XibNameForControllerName:NSStringFromClass([CTHeaderViewController class])] + bundle:[CTInAppUtils bundle] + notification:notification]; + + return self; +} + + +#pragma mark - Setup Notification + +- (void)layoutNotification { + [super layoutNotification]; + + CGFloat statusBarFrame = [[CTInAppResources getSharedApplication] statusBarFrame].size.height; + [[NSLayoutConstraint constraintWithItem: self.containerView + attribute:NSLayoutAttributeTop relatedBy:NSLayoutRelationEqual + toItem:self.view attribute:NSLayoutAttributeTop + multiplier:1.0 constant:statusBarFrame] setActive:YES]; +} + +@end diff --git a/CleverTapSDK/InApps/CTHeaderViewController~ipad.xib b/CleverTapSDK/InApps/CTHeaderViewController~ipad.xib new file mode 100644 index 00000000..9d26d865 --- /dev/null +++ b/CleverTapSDK/InApps/CTHeaderViewController~ipad.xib @@ -0,0 +1,163 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/CleverTapSDK/InApps/CTHeaderViewController~iphoneport.xib b/CleverTapSDK/InApps/CTHeaderViewController~iphoneport.xib new file mode 100644 index 00000000..b477487b --- /dev/null +++ b/CleverTapSDK/InApps/CTHeaderViewController~iphoneport.xib @@ -0,0 +1,164 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/CleverTapSDK/CTInAppHTMLViewController.h b/CleverTapSDK/InApps/CTInAppHTMLViewController.h similarity index 100% rename from CleverTapSDK/CTInAppHTMLViewController.h rename to CleverTapSDK/InApps/CTInAppHTMLViewController.h diff --git a/CleverTapSDK/CTInAppHTMLViewController.m b/CleverTapSDK/InApps/CTInAppHTMLViewController.m similarity index 90% rename from CleverTapSDK/CTInAppHTMLViewController.m rename to CleverTapSDK/InApps/CTInAppHTMLViewController.m index 605c27d8..55a88481 100644 --- a/CleverTapSDK/CTInAppHTMLViewController.m +++ b/CleverTapSDK/InApps/CTInAppHTMLViewController.m @@ -26,21 +26,21 @@ @interface CTInAppHTMLViewController () + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/CleverTapSDK/InApps/CTInterstitialImageViewController~iphoneport.xib b/CleverTapSDK/InApps/CTInterstitialImageViewController~iphoneport.xib new file mode 100644 index 00000000..18eb7277 --- /dev/null +++ b/CleverTapSDK/InApps/CTInterstitialImageViewController~iphoneport.xib @@ -0,0 +1,81 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/CleverTapSDK/InApps/CTInterstitialViewController.h b/CleverTapSDK/InApps/CTInterstitialViewController.h new file mode 100644 index 00000000..bde5a8b1 --- /dev/null +++ b/CleverTapSDK/InApps/CTInterstitialViewController.h @@ -0,0 +1,5 @@ +#import "CTInAppDisplayViewController.h" + +@interface CTInterstitialViewController : CTInAppDisplayViewController + +@end diff --git a/CleverTapSDK/InApps/CTInterstitialViewController.m b/CleverTapSDK/InApps/CTInterstitialViewController.m new file mode 100644 index 00000000..3891810c --- /dev/null +++ b/CleverTapSDK/InApps/CTInterstitialViewController.m @@ -0,0 +1,306 @@ +#import "CTInterstitialViewController.h" +#import "CTInAppDisplayViewControllerPrivate.h" +#import "CTInAppResources.h" +#import "CTDismissButton.h" +#import "CTInAppUtils.h" +#import "CTAVPlayerViewController.h" + +#import "FLAnimatedImageView.h" +#import "FLAnimatedImage.h" +#import "CTSlider.h" + +@import AVFoundation; +#import + +struct FrameRotation { + CGRect frame; + CGFloat angle; + BOOL isRotated; +}; + +@interface CTInterstitialViewController () + +@property (nonatomic, strong) IBOutlet UIView *containerView; +@property (nonatomic, strong) IBOutlet UILabel *titleLabel; +@property (nonatomic, strong) IBOutlet UILabel *bodyLabel; +@property (nonatomic, strong) IBOutlet FLAnimatedImageView *imageView; +@property (nonatomic, strong) IBOutlet UIView *avPlayerContainerView; +@property (nonatomic, strong) IBOutlet UIView *buttonsContainer; +@property (nonatomic, strong) IBOutlet UIView *secondButtonContainer; +@property (nonatomic, strong) IBOutlet UIButton *firstButton; +@property (nonatomic, strong) IBOutlet UIButton *secondButton; +@property (nonatomic, strong) IBOutlet CTDismissButton *closeButton; + +@property (nonatomic, strong) CTAVPlayerViewController *playerController; +@property (nonatomic, assign) CGRect cachedAVPlayerFrame; +@property (nonatomic, assign) UIInterfaceOrientation originalOrientation; +@property (nonatomic, strong) UIWindow *avPlayerWindow; +@property (nonatomic, weak) UIWindow *mainWindow; +@property (nonatomic, assign) BOOL avPlayerIsFullScreen; + +@end + +@implementation CTInterstitialViewController + +@synthesize delegate; + +#pragma mark - UIViewController Lifecycle + +- (instancetype) initWithNotification:(CTInAppNotification *)notification { + self = [super initWithNibName:[CTInAppUtils XibNameForControllerName:NSStringFromClass([CTInterstitialViewController class])] bundle:[CTInAppUtils bundle]]; + if (self) { + self.notification = notification; + } + return self; +} + +-(void)viewDidLoad { + [super viewDidLoad]; + [self layoutNotification]; +} + +- (void)viewDidDisappear:(BOOL)animated { + [super viewDidDisappear:animated]; +} + +- (IBAction)closeButtonTapped:(id)sender { + [super tappedDismiss]; +} + +#pragma mark - Setup Notification + +- (void)layoutNotification { + + self.originalOrientation = [CTInAppResources getSharedApplication].statusBarOrientation; + self.view.backgroundColor = [UIColor clearColor]; + self.containerView.backgroundColor = [CTInAppUtils ct_colorWithHexString:self.notification.backgroundColor]; + + if ([UIScreen mainScreen].bounds.size.height == 480) { + [self.containerView setTranslatesAutoresizingMaskIntoConstraints:NO]; + [[NSLayoutConstraint constraintWithItem:self.containerView + attribute:NSLayoutAttributeWidth + relatedBy:NSLayoutRelationEqual + toItem:self.containerView + attribute:NSLayoutAttributeHeight + multiplier:0.6 constant:0] setActive:YES]; + + } + + if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPad) { + [self.containerView setTranslatesAutoresizingMaskIntoConstraints:NO]; + if (self.notification.tablet) { + [[NSLayoutConstraint constraintWithItem:self.containerView + attribute:NSLayoutAttributeLeading + relatedBy:NSLayoutRelationEqual + toItem:self.view attribute:NSLayoutAttributeLeading + multiplier:1 constant:40] setActive:YES]; + [[NSLayoutConstraint constraintWithItem:self.containerView + attribute:NSLayoutAttributeTrailing + relatedBy:NSLayoutRelationEqual + toItem:self.view attribute:NSLayoutAttributeTrailing + multiplier:1 constant:-40] setActive:YES]; + [[NSLayoutConstraint constraintWithItem:self.containerView + attribute:NSLayoutAttributeHeight + relatedBy:NSLayoutRelationEqual + toItem:self.view + attribute:NSLayoutAttributeHeight + multiplier:0.85 constant:0] setActive:YES]; + } else { + [[NSLayoutConstraint constraintWithItem:self.containerView + attribute:NSLayoutAttributeLeading + relatedBy:NSLayoutRelationEqual + toItem:self.view attribute:NSLayoutAttributeLeading + multiplier:1 constant:160] setActive:YES]; + [[NSLayoutConstraint constraintWithItem:self.containerView + attribute:NSLayoutAttributeTrailing + relatedBy:NSLayoutRelationEqual + toItem:self.view attribute:NSLayoutAttributeTrailing + multiplier:1 constant:-160] setActive:YES]; + + } + } + + if (self.notification.darkenScreen) { + self.view.backgroundColor = [[UIColor blackColor] colorWithAlphaComponent:0.75f]; + } + + self.closeButton.hidden = !self.notification.showCloseButton; + + // use FLAnimatedImageView to support gif + if (self.notification.image) { + self.imageView.contentMode = UIViewContentModeScaleAspectFit; + if ([self.notification.contentType isEqualToString:@"image/gif"] ) { + FLAnimatedImage *gif = [FLAnimatedImage animatedImageWithGIFData:self.notification.image]; + self.imageView.animatedImage = gif; + } else { + self.imageView.image = [UIImage imageWithData:self.notification.image]; + } + } + + // handle video or audio + if (self.notification.mediaUrl) { + self.playerController = [[CTAVPlayerViewController alloc] initWithNotification:self.notification]; + self.playerController.playerDelegate = self; + self.imageView.hidden = YES; + self.avPlayerContainerView.hidden = NO; + [self configureAvPlayerController]; + } + + if (self.notification.title) { + self.titleLabel.textAlignment = NSTextAlignmentCenter; + self.titleLabel.backgroundColor = [UIColor clearColor]; + self.titleLabel.textColor = [CTInAppUtils ct_colorWithHexString:self.notification.titleColor]; + self.titleLabel.text = self.notification.title; + } + + if (self.notification.message) { + self.bodyLabel.textAlignment = NSTextAlignmentCenter; + self.bodyLabel.backgroundColor = [UIColor clearColor]; + self.bodyLabel.textColor = [CTInAppUtils ct_colorWithHexString:self.notification.messageColor]; + self.bodyLabel.numberOfLines = 0; + self.bodyLabel.text = self.notification.message; + } + + self.firstButton.hidden = YES; + self.secondButton.hidden = YES; + + if (self.notification.buttons && self.notification.buttons.count > 0) { + self.firstButton = [self setupViewForButton:self.firstButton withData:self.notification.buttons[0] withIndex:0]; + if (self.notification.buttons.count == 2) { + self.secondButton = [self setupViewForButton:self.secondButton withData:self.notification.buttons[1] withIndex:1]; + } else { + [self.secondButton setHidden: YES]; + [[NSLayoutConstraint constraintWithItem:self.secondButtonContainer + attribute:NSLayoutAttributeHeight relatedBy:NSLayoutRelationEqual + toItem:nil attribute:NSLayoutAttributeNotAnAttribute + multiplier:1 constant:0] setActive:YES]; + } + } +} + +- (void)configureAvPlayerController { + [self addChildViewController:self.playerController]; + + [self.avPlayerContainerView addSubview:self.playerController.view]; + + [[NSLayoutConstraint constraintWithItem:self.playerController.view attribute:NSLayoutAttributeWidth relatedBy:NSLayoutRelationEqual + toItem:self.avPlayerContainerView attribute:NSLayoutAttributeWidth + multiplier:1 constant:0] setActive:YES]; + [[NSLayoutConstraint constraintWithItem:self.playerController.view attribute:NSLayoutAttributeHeight relatedBy:NSLayoutRelationEqual + toItem:self.avPlayerContainerView attribute:NSLayoutAttributeHeight + multiplier:1 constant:0] setActive:YES]; + [[NSLayoutConstraint constraintWithItem:self.playerController.view attribute:NSLayoutAttributeLeading relatedBy:NSLayoutRelationEqual + toItem:self.avPlayerContainerView attribute:NSLayoutAttributeLeading + multiplier:1 constant:0] setActive:YES]; + [[NSLayoutConstraint constraintWithItem:self.playerController.view attribute:NSLayoutAttributeTrailing relatedBy:NSLayoutRelationEqual + toItem:self.avPlayerContainerView attribute:NSLayoutAttributeTrailing + multiplier:1 constant:0] setActive:YES]; + [[NSLayoutConstraint constraintWithItem:self.playerController.view attribute:NSLayoutAttributeCenterY relatedBy:NSLayoutRelationEqual + toItem:self.avPlayerContainerView attribute:NSLayoutAttributeCenterY + multiplier:1 constant:0] setActive:YES]; + + [self.playerController didMoveToParentViewController:self]; + +} + +#pragma mark - AV Delegates + +- (struct FrameRotation)rotateFrameIfNeeded:(CGRect)frame { + struct FrameRotation frameRotation; + frameRotation.frame = frame; + frameRotation.angle = 0; + frameRotation.isRotated = NO; + UIInterfaceOrientation currentOrientation = [CTInAppResources getSharedApplication].statusBarOrientation; + if (currentOrientation != _originalOrientation) { + frameRotation.isRotated = YES; + if (currentOrientation == UIInterfaceOrientationPortrait && _originalOrientation == UIInterfaceOrientationLandscapeRight) { + frameRotation.frame = CGRectMake(frame.origin.y, frame.origin.x, frame.size.height, frame.size.width); + frameRotation.angle = M_PI_2; + } + else if (currentOrientation == UIInterfaceOrientationPortrait && _originalOrientation == UIInterfaceOrientationLandscapeLeft) { + frameRotation.frame = CGRectMake(frame.origin.y, [UIScreen mainScreen].bounds.size.height - frame.origin.x - frame.size.height, frame.size.height, frame.size.width); + frameRotation.angle = -M_PI_2; + } + else if (currentOrientation == UIInterfaceOrientationLandscapeRight && _originalOrientation == UIInterfaceOrientationPortrait) { + frameRotation.frame = CGRectMake(frame.origin.y, frame.origin.x, frame.size.height, frame.size.width); + frameRotation.angle = -M_PI_2; + } + else if (currentOrientation == UIInterfaceOrientationLandscapeRight && _originalOrientation == UIInterfaceOrientationLandscapeLeft) { + frameRotation.frame = CGRectMake([UIScreen mainScreen].bounds.size.width - frame.origin.x - frame.size.width, frame.origin.y, frame.size.width, frame.size.height); + frameRotation.angle = M_PI; + } + else if (currentOrientation == UIInterfaceOrientationLandscapeLeft && _originalOrientation == UIInterfaceOrientationPortrait) { + frameRotation.frame = CGRectMake([UIScreen mainScreen].bounds.size.width - frame.origin.y - frame.size.height, frame.origin.x, frame.size.height, frame.size.width); + frameRotation.angle = M_PI_2; + } + else if (currentOrientation == UIInterfaceOrientationLandscapeLeft && _originalOrientation == UIInterfaceOrientationLandscapeRight) { + frameRotation.frame = CGRectMake([UIScreen mainScreen].bounds.size.width - frame.origin.y - frame.size.height, frame.origin.x, frame.size.height, frame.size.width); + frameRotation.angle = -M_PI; + } + } + return frameRotation; +} + +- (void)toggleFullscreen { + if (self.mainWindow == nil) { + self.mainWindow = [CTInAppResources getSharedApplication].keyWindow; + } + + if (self.avPlayerIsFullScreen) { + struct FrameRotation frameRotation = [self rotateFrameIfNeeded:self.cachedAVPlayerFrame]; + self.playerController.view.frame = frameRotation.frame; + [UIView animateKeyframesWithDuration:0.3 + delay:0 options:UIViewKeyframeAnimationOptionLayoutSubviews + animations:^{ + self->_avPlayerWindow.transform = CGAffineTransformRotate(self->_avPlayerWindow.transform, frameRotation.angle); + self->_avPlayerWindow.frame = frameRotation.frame; + } completion:^(BOOL finished) { + [self->_playerController removeFromParentViewController]; + [self->_playerController.view removeFromSuperview]; + [self configureAvPlayerController]; + [self->_avPlayerWindow removeFromSuperview]; + self->_avPlayerWindow.rootViewController = nil; + self->_avPlayerWindow = nil; + }]; + } + else { + self.cachedAVPlayerFrame = [[self.playerController.view superview] convertRect:self.playerController.view.frame toView:self.window]; + + [self.playerController removeFromParentViewController]; + [self.playerController.view removeFromSuperview]; + [self.playerController willMoveToParentViewController:nil]; + + struct FrameRotation frameRotation = [self rotateFrameIfNeeded:self.cachedAVPlayerFrame]; + + self.avPlayerWindow = [[UIWindow alloc] initWithFrame:frameRotation.frame]; + self.avPlayerWindow.transform = CGAffineTransformRotate(self.avPlayerWindow.transform, frameRotation.angle); + self.avPlayerWindow.backgroundColor = [UIColor blackColor]; + self.avPlayerWindow.windowLevel = UIWindowLevelNormal; + [self.avPlayerWindow makeKeyAndVisible]; + self.avPlayerWindow.rootViewController = self.playerController; + + self.playerController.view.frame = self.mainWindow.bounds; + + [UIView animateKeyframesWithDuration:0.3 + delay:0 options:UIViewKeyframeAnimationOptionLayoutSubviews + animations:^{ + self->_avPlayerWindow.transform = CGAffineTransformRotate(self->_avPlayerWindow.transform, -frameRotation.angle); + self->_avPlayerWindow.frame = self->_mainWindow.bounds; + } completion:^(BOOL finished) { + // no-op + }]; + } + self.avPlayerIsFullScreen = !self.avPlayerIsFullScreen; +} + +#pragma mark - Public + +-(void)show:(BOOL)animated { + [self showFromWindow:animated]; +} + +-(void)hide:(BOOL)animated { + [self hideFromWindow:animated]; +} + +@end diff --git a/CleverTapSDK/InApps/CTInterstitialViewController~ipad.xib b/CleverTapSDK/InApps/CTInterstitialViewController~ipad.xib new file mode 100644 index 00000000..eb3918d2 --- /dev/null +++ b/CleverTapSDK/InApps/CTInterstitialViewController~ipad.xib @@ -0,0 +1,157 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/CleverTapSDK/InApps/CTInterstitialViewController~iphoneport.xib b/CleverTapSDK/InApps/CTInterstitialViewController~iphoneport.xib new file mode 100644 index 00000000..0ff4182f --- /dev/null +++ b/CleverTapSDK/InApps/CTInterstitialViewController~iphoneport.xib @@ -0,0 +1,161 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/CleverTapSDK/InApps/CTSlider.h b/CleverTapSDK/InApps/CTSlider.h new file mode 100644 index 00000000..801e8e87 --- /dev/null +++ b/CleverTapSDK/InApps/CTSlider.h @@ -0,0 +1,5 @@ +#import + +@interface CTSlider : UISlider + +@end diff --git a/CleverTapSDK/InApps/CTSlider.m b/CleverTapSDK/InApps/CTSlider.m new file mode 100644 index 00000000..7ea8ccbc --- /dev/null +++ b/CleverTapSDK/InApps/CTSlider.m @@ -0,0 +1,12 @@ +#import "CTSlider.h" + +static const float kSliderHeight = 6.0; + +@implementation CTSlider + +- (CGRect)trackRectForBounds:(CGRect)bounds { + CGRect rect = CGRectMake(bounds.origin.x, bounds.size.height/2 - 3, bounds.size.width, kSliderHeight); + return rect; +} + +@end diff --git a/CleverTapSDK/InApps/images/ic_expand@1x.png b/CleverTapSDK/InApps/images/ic_expand@1x.png new file mode 100755 index 00000000..01c2ae96 Binary files /dev/null and b/CleverTapSDK/InApps/images/ic_expand@1x.png differ diff --git a/CleverTapSDK/InApps/images/ic_expand@2x.png b/CleverTapSDK/InApps/images/ic_expand@2x.png new file mode 100755 index 00000000..1e284fcb Binary files /dev/null and b/CleverTapSDK/InApps/images/ic_expand@2x.png differ diff --git a/CleverTapSDK/InApps/images/ic_expand@3x.png b/CleverTapSDK/InApps/images/ic_expand@3x.png new file mode 100755 index 00000000..16908826 Binary files /dev/null and b/CleverTapSDK/InApps/images/ic_expand@3x.png differ diff --git a/CleverTapSDK/InApps/images/ic_pause@1x.png b/CleverTapSDK/InApps/images/ic_pause@1x.png new file mode 100755 index 00000000..071b2440 Binary files /dev/null and b/CleverTapSDK/InApps/images/ic_pause@1x.png differ diff --git a/CleverTapSDK/InApps/images/ic_pause@2x.png b/CleverTapSDK/InApps/images/ic_pause@2x.png new file mode 100755 index 00000000..76b1af8f Binary files /dev/null and b/CleverTapSDK/InApps/images/ic_pause@2x.png differ diff --git a/CleverTapSDK/InApps/images/ic_pause@3x.png b/CleverTapSDK/InApps/images/ic_pause@3x.png new file mode 100755 index 00000000..fe9a1303 Binary files /dev/null and b/CleverTapSDK/InApps/images/ic_pause@3x.png differ diff --git a/CleverTapSDK/InApps/images/ic_play@1x.png b/CleverTapSDK/InApps/images/ic_play@1x.png new file mode 100755 index 00000000..9e17816b Binary files /dev/null and b/CleverTapSDK/InApps/images/ic_play@1x.png differ diff --git a/CleverTapSDK/InApps/images/ic_play@2x.png b/CleverTapSDK/InApps/images/ic_play@2x.png new file mode 100755 index 00000000..c7094d5d Binary files /dev/null and b/CleverTapSDK/InApps/images/ic_play@2x.png differ diff --git a/CleverTapSDK/InApps/images/ic_play@3x.png b/CleverTapSDK/InApps/images/ic_play@3x.png new file mode 100755 index 00000000..31b759da Binary files /dev/null and b/CleverTapSDK/InApps/images/ic_play@3x.png differ diff --git a/CleverTapSDK/InApps/images/ic_shrink@1x.png b/CleverTapSDK/InApps/images/ic_shrink@1x.png new file mode 100755 index 00000000..7afb6d6a Binary files /dev/null and b/CleverTapSDK/InApps/images/ic_shrink@1x.png differ diff --git a/CleverTapSDK/InApps/images/ic_shrink@2x.png b/CleverTapSDK/InApps/images/ic_shrink@2x.png new file mode 100755 index 00000000..7908a6d6 Binary files /dev/null and b/CleverTapSDK/InApps/images/ic_shrink@2x.png differ diff --git a/CleverTapSDK/InApps/images/ic_shrink@3x.png b/CleverTapSDK/InApps/images/ic_shrink@3x.png new file mode 100755 index 00000000..9afc0069 Binary files /dev/null and b/CleverTapSDK/InApps/images/ic_shrink@3x.png differ diff --git a/CleverTapSDK/InApps/images/ic_thumb.png b/CleverTapSDK/InApps/images/ic_thumb.png new file mode 100644 index 00000000..37fb4a68 Binary files /dev/null and b/CleverTapSDK/InApps/images/ic_thumb.png differ diff --git a/CleverTapSDK/InApps/images/sound-wave-headphones.png b/CleverTapSDK/InApps/images/sound-wave-headphones.png new file mode 100644 index 00000000..d432fefd Binary files /dev/null and b/CleverTapSDK/InApps/images/sound-wave-headphones.png differ diff --git a/ObjCStarter/ObjCStarter.xcodeproj/project.pbxproj b/ObjCStarter/ObjCStarter.xcodeproj/project.pbxproj index a8caaebc..02a758b9 100644 --- a/ObjCStarter/ObjCStarter.xcodeproj/project.pbxproj +++ b/ObjCStarter/ObjCStarter.xcodeproj/project.pbxproj @@ -309,7 +309,7 @@ 07E16E82212FF6E700429BDF /* Frameworks */, 07E16E83212FF6E700429BDF /* Resources */, 07E16ED021300A5500429BDF /* Embed App Extensions */, - 88FF26A12D4FDE2480D7B220 /* [CP] Embed Pods Frameworks */, + C49BF7CD1E4041C3EF91F662 /* [CP] Embed Pods Frameworks */, ); buildRules = ( ); @@ -366,7 +366,7 @@ 07E16ED121300EE200429BDF /* Sources */, 07E16ED221300EE200429BDF /* Frameworks */, 07E16ED321300EE200429BDF /* Resources */, - C4E696347544397D8CBD6B24 /* [CP] Embed Pods Frameworks */, + 4DBE0A0327463DC9FCF298BB /* [CP] Embed Pods Frameworks */, ); buildRules = ( ); @@ -525,40 +525,40 @@ /* End PBXResourcesBuildPhase section */ /* Begin PBXShellScriptBuildPhase section */ - 75907684EA1FB3A91E298071 /* [CP] Check Pods Manifest.lock */ = { + 4DBE0A0327463DC9FCF298BB /* [CP] Embed Pods Frameworks */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( ); inputPaths = ( - "${PODS_PODFILE_DIR_PATH}/Podfile.lock", - "${PODS_ROOT}/Manifest.lock", + "${SRCROOT}/Pods/Target Support Files/Pods-ObjCTvOS/Pods-ObjCTvOS-frameworks.sh", + "${BUILT_PRODUCTS_DIR}/CleverTap-iOS-SDK-tvOS/CleverTapSDK.framework", ); - name = "[CP] Check Pods Manifest.lock"; + name = "[CP] Embed Pods Frameworks"; outputPaths = ( - "$(DERIVED_FILE_DIR)/Pods-ObjCStarter-checkManifestLockResult.txt", + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/CleverTapSDK.framework", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; + shellScript = "\"${SRCROOT}/Pods/Target Support Files/Pods-ObjCTvOS/Pods-ObjCTvOS-frameworks.sh\"\n"; showEnvVarsInLog = 0; }; - 88FF26A12D4FDE2480D7B220 /* [CP] Embed Pods Frameworks */ = { + 75907684EA1FB3A91E298071 /* [CP] Check Pods Manifest.lock */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( ); inputPaths = ( - "${SRCROOT}/Pods/Target Support Files/Pods-ObjCStarter/Pods-ObjCStarter-frameworks.sh", - "${BUILT_PRODUCTS_DIR}/CleverTap-iOS-SDK-iOS/CleverTapSDK.framework", + "${PODS_PODFILE_DIR_PATH}/Podfile.lock", + "${PODS_ROOT}/Manifest.lock", ); - name = "[CP] Embed Pods Frameworks"; + name = "[CP] Check Pods Manifest.lock"; outputPaths = ( - "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/CleverTapSDK.framework", + "$(DERIVED_FILE_DIR)/Pods-ObjCStarter-checkManifestLockResult.txt", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "\"${SRCROOT}/Pods/Target Support Files/Pods-ObjCStarter/Pods-ObjCStarter-frameworks.sh\"\n"; + shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; showEnvVarsInLog = 0; }; BC0631ECDE413CA037DA7257 /* [CP] Check Pods Manifest.lock */ = { @@ -597,14 +597,14 @@ shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; showEnvVarsInLog = 0; }; - C4E696347544397D8CBD6B24 /* [CP] Embed Pods Frameworks */ = { + C49BF7CD1E4041C3EF91F662 /* [CP] Embed Pods Frameworks */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( ); inputPaths = ( - "${SRCROOT}/Pods/Target Support Files/Pods-ObjCTvOS/Pods-ObjCTvOS-frameworks.sh", - "${BUILT_PRODUCTS_DIR}/CleverTap-iOS-SDK-tvOS/CleverTapSDK.framework", + "${SRCROOT}/Pods/Target Support Files/Pods-ObjCStarter/Pods-ObjCStarter-frameworks.sh", + "${BUILT_PRODUCTS_DIR}/CleverTap-iOS-SDK-iOS/CleverTapSDK.framework", ); name = "[CP] Embed Pods Frameworks"; outputPaths = ( @@ -612,7 +612,7 @@ ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "\"${SRCROOT}/Pods/Target Support Files/Pods-ObjCTvOS/Pods-ObjCTvOS-frameworks.sh\"\n"; + shellScript = "\"${SRCROOT}/Pods/Target Support Files/Pods-ObjCStarter/Pods-ObjCStarter-frameworks.sh\"\n"; showEnvVarsInLog = 0; }; D95F8DB8D769D26A010EB076 /* [CP] Check Pods Manifest.lock */ = { @@ -861,10 +861,7 @@ DEVELOPMENT_TEAM = A5J34NR598; INFOPLIST_FILE = ObjCStarter/Info.plist; IPHONEOS_DEPLOYMENT_TARGET = 10.0; - LD_RUNPATH_SEARCH_PATHS = ( - "$(inherited)", - "@executable_path/Frameworks", - ); + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; PRODUCT_BUNDLE_IDENTIFIER = com.clevertap.ObjCStarter; PRODUCT_NAME = "$(TARGET_NAME)"; TARGETED_DEVICE_FAMILY = "1,2"; @@ -881,10 +878,7 @@ DEVELOPMENT_TEAM = A5J34NR598; INFOPLIST_FILE = ObjCStarter/Info.plist; IPHONEOS_DEPLOYMENT_TARGET = 10.0; - LD_RUNPATH_SEARCH_PATHS = ( - "$(inherited)", - "@executable_path/Frameworks", - ); + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; PRODUCT_BUNDLE_IDENTIFIER = com.clevertap.ObjCStarter; PRODUCT_NAME = "$(TARGET_NAME)"; TARGETED_DEVICE_FAMILY = "1,2"; @@ -899,11 +893,7 @@ CODE_SIGN_STYLE = Automatic; DEVELOPMENT_TEAM = A5J34NR598; INFOPLIST_FILE = ObjCStarterTests/Info.plist; - LD_RUNPATH_SEARCH_PATHS = ( - "$(inherited)", - "@executable_path/Frameworks", - "@loader_path/Frameworks", - ); + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; PRODUCT_BUNDLE_IDENTIFIER = com.clevertap.ObjCStarterTests; PRODUCT_NAME = "$(TARGET_NAME)"; TARGETED_DEVICE_FAMILY = "1,2"; @@ -919,11 +909,7 @@ CODE_SIGN_STYLE = Automatic; DEVELOPMENT_TEAM = A5J34NR598; INFOPLIST_FILE = ObjCStarterTests/Info.plist; - LD_RUNPATH_SEARCH_PATHS = ( - "$(inherited)", - "@executable_path/Frameworks", - "@loader_path/Frameworks", - ); + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; PRODUCT_BUNDLE_IDENTIFIER = com.clevertap.ObjCStarterTests; PRODUCT_NAME = "$(TARGET_NAME)"; TARGETED_DEVICE_FAMILY = "1,2"; @@ -938,11 +924,7 @@ CODE_SIGN_STYLE = Automatic; DEVELOPMENT_TEAM = A5J34NR598; INFOPLIST_FILE = ObjCStarterUITests/Info.plist; - LD_RUNPATH_SEARCH_PATHS = ( - "$(inherited)", - "@executable_path/Frameworks", - "@loader_path/Frameworks", - ); + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; PRODUCT_BUNDLE_IDENTIFIER = com.clevertap.ObjCStarterUITests; PRODUCT_NAME = "$(TARGET_NAME)"; TARGETED_DEVICE_FAMILY = "1,2"; @@ -957,11 +939,7 @@ CODE_SIGN_STYLE = Automatic; DEVELOPMENT_TEAM = A5J34NR598; INFOPLIST_FILE = ObjCStarterUITests/Info.plist; - LD_RUNPATH_SEARCH_PATHS = ( - "$(inherited)", - "@executable_path/Frameworks", - "@loader_path/Frameworks", - ); + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; PRODUCT_BUNDLE_IDENTIFIER = com.clevertap.ObjCStarterUITests; PRODUCT_NAME = "$(TARGET_NAME)"; TARGETED_DEVICE_FAMILY = "1,2"; @@ -978,10 +956,7 @@ CODE_SIGN_STYLE = Automatic; DEVELOPMENT_TEAM = A5J34NR598; INFOPLIST_FILE = ObjCTvOS/Info.plist; - LD_RUNPATH_SEARCH_PATHS = ( - "$(inherited)", - "@executable_path/Frameworks", - ); + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; PRODUCT_BUNDLE_IDENTIFIER = com.clevertap.ObjCTvOS; PRODUCT_NAME = "$(TARGET_NAME)"; SDKROOT = appletvos; @@ -999,10 +974,7 @@ CODE_SIGN_STYLE = Automatic; DEVELOPMENT_TEAM = A5J34NR598; INFOPLIST_FILE = ObjCTvOS/Info.plist; - LD_RUNPATH_SEARCH_PATHS = ( - "$(inherited)", - "@executable_path/Frameworks", - ); + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; PRODUCT_BUNDLE_IDENTIFIER = com.clevertap.ObjCTvOS; PRODUCT_NAME = "$(TARGET_NAME)"; SDKROOT = appletvos; @@ -1018,11 +990,7 @@ CODE_SIGN_STYLE = Automatic; DEVELOPMENT_TEAM = A5J34NR598; INFOPLIST_FILE = ObjCTvOSTests/Info.plist; - LD_RUNPATH_SEARCH_PATHS = ( - "$(inherited)", - "@executable_path/Frameworks", - "@loader_path/Frameworks", - ); + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; PRODUCT_BUNDLE_IDENTIFIER = com.clevertap.ObjCTvOSTests; PRODUCT_NAME = "$(TARGET_NAME)"; SDKROOT = appletvos; @@ -1039,11 +1007,7 @@ CODE_SIGN_STYLE = Automatic; DEVELOPMENT_TEAM = A5J34NR598; INFOPLIST_FILE = ObjCTvOSTests/Info.plist; - LD_RUNPATH_SEARCH_PATHS = ( - "$(inherited)", - "@executable_path/Frameworks", - "@loader_path/Frameworks", - ); + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; PRODUCT_BUNDLE_IDENTIFIER = com.clevertap.ObjCTvOSTests; PRODUCT_NAME = "$(TARGET_NAME)"; SDKROOT = appletvos; @@ -1059,11 +1023,7 @@ CODE_SIGN_STYLE = Automatic; DEVELOPMENT_TEAM = A5J34NR598; INFOPLIST_FILE = ObjCTvOSUITests/Info.plist; - LD_RUNPATH_SEARCH_PATHS = ( - "$(inherited)", - "@executable_path/Frameworks", - "@loader_path/Frameworks", - ); + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; PRODUCT_BUNDLE_IDENTIFIER = com.clevertap.ObjCTvOSUITests; PRODUCT_NAME = "$(TARGET_NAME)"; SDKROOT = appletvos; @@ -1079,11 +1039,7 @@ CODE_SIGN_STYLE = Automatic; DEVELOPMENT_TEAM = A5J34NR598; INFOPLIST_FILE = ObjCTvOSUITests/Info.plist; - LD_RUNPATH_SEARCH_PATHS = ( - "$(inherited)", - "@executable_path/Frameworks", - "@loader_path/Frameworks", - ); + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; PRODUCT_BUNDLE_IDENTIFIER = com.clevertap.ObjCTvOSUITests; PRODUCT_NAME = "$(TARGET_NAME)"; SDKROOT = appletvos; diff --git a/ObjCStarter/ObjCTvOS/AppDelegate.m b/ObjCStarter/ObjCTvOS/AppDelegate.m index 30ae98bf..a46ce3ea 100644 --- a/ObjCStarter/ObjCTvOS/AppDelegate.m +++ b/ObjCStarter/ObjCTvOS/AppDelegate.m @@ -7,7 +7,7 @@ // #import "AppDelegate.h" -#import +#import @interface AppDelegate () diff --git a/ObjCStarter/Podfile b/ObjCStarter/Podfile index 99624842..ab8a47d7 100644 --- a/ObjCStarter/Podfile +++ b/ObjCStarter/Podfile @@ -6,7 +6,6 @@ target 'ObjCStarter' do use_frameworks! # Pods for ObjCStarter - pod 'CleverTap-iOS-SDK', :path =>'../' target 'ObjCStarterTests' do diff --git a/ObjCStarter/Podfile.lock b/ObjCStarter/Podfile.lock index ff67085b..da1f4082 100644 --- a/ObjCStarter/Podfile.lock +++ b/ObjCStarter/Podfile.lock @@ -1,5 +1,5 @@ PODS: - - CleverTap-iOS-SDK (3.2.0) + - CleverTap-iOS-SDK (3.3.0) DEPENDENCIES: - CleverTap-iOS-SDK (from `../`) @@ -9,8 +9,8 @@ EXTERNAL SOURCES: :path: "../" SPEC CHECKSUMS: - CleverTap-iOS-SDK: c97919fe74eb445d67678c6b228711588ebf6f29 + CleverTap-iOS-SDK: fe97ad987d57990c105db9d2ec7197336c88d0dc -PODFILE CHECKSUM: bb22d4cf4cb18e79258f10dd77a6cf7a5fafa099 +PODFILE CHECKSUM: b4f3542daf2ced0c2c6faa368b426728b78fa179 COCOAPODS: 1.5.3 diff --git a/ObjCStarter/Pods/Local Podspecs/CleverTap-iOS-SDK.podspec.json b/ObjCStarter/Pods/Local Podspecs/CleverTap-iOS-SDK.podspec.json index b6208ec6..a1d49eee 100644 --- a/ObjCStarter/Pods/Local Podspecs/CleverTap-iOS-SDK.podspec.json +++ b/ObjCStarter/Pods/Local Podspecs/CleverTap-iOS-SDK.podspec.json @@ -1,6 +1,6 @@ { "name": "CleverTap-iOS-SDK", - "version": "3.2.0", + "version": "3.3.0", "summary": "The CleverTap iOS SDK for App Analytics and Engagement.", "homepage": "https://github.com/CleverTap/clevertap-ios-sdk", "license": { @@ -11,17 +11,14 @@ }, "source": { "git": "https://github.com/CleverTap/clevertap-ios-sdk.git", - "tag": "3.2.0" + "tag": "3.3.0" }, "requires_arc": true, "module_name": "CleverTapSDK", "resources": "CleverTapSDK/*.crt", - "platforms": { - "ios": "8.0", - "tvos": "9.0" - }, "ios": { - "source_files": "CleverTapSDK/*.{h,m}", + "resources": "CleverTapSDK/**/*.{png,xib}", + "source_files": "CleverTapSDK/**/*.{h,m}", "public_header_files": [ "CleverTapSDK/CleverTap.h", "CleverTapSDK/CleverTap+SSLPinning.h", @@ -34,9 +31,12 @@ "CleverTapSDK/CleverTapUTMDetail.h" ] }, + "platforms": { + "ios": "8.0", + "tvos": "9.0" + }, "tvos": { "source_files": "CleverTapSDK/*.{h,m}", - "exclude_files": "CleverTapSDK/CTInAppHTMLViewController.{h,m}", "public_header_files": [ "CleverTapSDK/CleverTap.h", "CleverTapSDK/CleverTap+SSLPinning.h", diff --git a/ObjCStarter/Pods/Manifest.lock b/ObjCStarter/Pods/Manifest.lock index ff67085b..da1f4082 100644 --- a/ObjCStarter/Pods/Manifest.lock +++ b/ObjCStarter/Pods/Manifest.lock @@ -1,5 +1,5 @@ PODS: - - CleverTap-iOS-SDK (3.2.0) + - CleverTap-iOS-SDK (3.3.0) DEPENDENCIES: - CleverTap-iOS-SDK (from `../`) @@ -9,8 +9,8 @@ EXTERNAL SOURCES: :path: "../" SPEC CHECKSUMS: - CleverTap-iOS-SDK: c97919fe74eb445d67678c6b228711588ebf6f29 + CleverTap-iOS-SDK: fe97ad987d57990c105db9d2ec7197336c88d0dc -PODFILE CHECKSUM: bb22d4cf4cb18e79258f10dd77a6cf7a5fafa099 +PODFILE CHECKSUM: b4f3542daf2ced0c2c6faa368b426728b78fa179 COCOAPODS: 1.5.3 diff --git a/ObjCStarter/Pods/Pods.xcodeproj/project.pbxproj b/ObjCStarter/Pods/Pods.xcodeproj/project.pbxproj index b4e5e3c4..0a62f232 100644 --- a/ObjCStarter/Pods/Pods.xcodeproj/project.pbxproj +++ b/ObjCStarter/Pods/Pods.xcodeproj/project.pbxproj @@ -7,150 +7,222 @@ objects = { /* Begin PBXBuildFile section */ - 010B1E0E4BD95B6AE78E4F8986B091C9 /* CTUriHelper.h in Headers */ = {isa = PBXBuildFile; fileRef = B348031FEFB1EA79566F0D55DE15B182 /* CTUriHelper.h */; settings = {ATTRIBUTES = (Project, ); }; }; - 039D14DC50391D8207DADDA668D9A349 /* CTInAppDisplayViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 2617A3A815A6114348D59341F0247FD5 /* CTInAppDisplayViewController.m */; }; - 03B0DC0E9E5B257E0660555CF4D70960 /* CTValidationResult.h in Headers */ = {isa = PBXBuildFile; fileRef = 0D3EAE1F8B2726519BC21CDDD48B65A9 /* CTValidationResult.h */; settings = {ATTRIBUTES = (Project, ); }; }; - 04475821C7F3ADA742DD3CCF5EE1CC9C /* CleverTapInstanceConfig.m in Sources */ = {isa = PBXBuildFile; fileRef = 38D4AFCC18E575326EC924033BE82276 /* CleverTapInstanceConfig.m */; }; - 05648D895C339F479535D8E7912F3018 /* CTConstants.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C0ED5A580CAEA63A56F9146BBA72617 /* CTConstants.m */; }; + 019966732D030AB16972BCCB9CC259F7 /* CTInAppResources.h in Headers */ = {isa = PBXBuildFile; fileRef = D543C5BF50378C1B8A23F6976D478067 /* CTInAppResources.h */; settings = {ATTRIBUTES = (Project, ); }; }; + 025318C726D140C576C0CEF618BA22E0 /* ic_expand@1x.png in Resources */ = {isa = PBXBuildFile; fileRef = 136304F58B055F4508F3B3A8DE97C896 /* ic_expand@1x.png */; }; + 0356DDAC53D1FF3BB76C2FEF4DE919D8 /* DigiCertGlobalRootCA.crt in Resources */ = {isa = PBXBuildFile; fileRef = EC9C697FCA78C0EC2162488EF7230820 /* DigiCertGlobalRootCA.crt */; }; + 04383408B0ECBDD7A75116AFBD8B850E /* CTSwizzle.h in Headers */ = {isa = PBXBuildFile; fileRef = 9695D83BF46B823360ACAF210134EC68 /* CTSwizzle.h */; settings = {ATTRIBUTES = (Project, ); }; }; + 04A94BBBFC01C559A0252A56C1B29385 /* CTValidationResult.h in Headers */ = {isa = PBXBuildFile; fileRef = 49EB62718778444E487FF6AF62CDD169 /* CTValidationResult.h */; settings = {ATTRIBUTES = (Project, ); }; }; + 050B115BD9DF3D531DB1C35800D99C9A /* ic_shrink@1x.png in Resources */ = {isa = PBXBuildFile; fileRef = CDE6846D50B94A5F6CD61BC0AAAFBF8D /* ic_shrink@1x.png */; }; 05B73700B32D35A8C35B046A0CCA5BCB /* Pods-ObjCStarterUITests-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = FBC5915F32DE4E5C1640B391D3C8E2EC /* Pods-ObjCStarterUITests-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 07C75CA5FC1C76FFF8C72123661A12A2 /* CleverTapUTMDetail.m in Sources */ = {isa = PBXBuildFile; fileRef = 59462084C7E04F4769F8574724A12D55 /* CleverTapUTMDetail.m */; }; - 083BB426FC4841FC1B226947E180BFDF /* CTSwizzle.m in Sources */ = {isa = PBXBuildFile; fileRef = 0C01A16579ABF46C33AE6ED1A2F7394B /* CTSwizzle.m */; }; - 088F0F5E395CFF7D4BBB469B37268B67 /* CTValidator.m in Sources */ = {isa = PBXBuildFile; fileRef = 2D030191BC682E7E802973AC81F31E2E /* CTValidator.m */; }; - 106868C0DFDEE68B39D9FA365E70A91B /* CTDismissButton.m in Sources */ = {isa = PBXBuildFile; fileRef = 15070C4566FBE45EFBDB5451C038B7C8 /* CTDismissButton.m */; }; - 10776E4668476D85EE0060FCAD7CD07D /* CTProfileBuilder.h in Headers */ = {isa = PBXBuildFile; fileRef = C789D3F7D1871F098BBA2039D49C2863 /* CTProfileBuilder.h */; settings = {ATTRIBUTES = (Project, ); }; }; - 10811375401EFCF85D52583E8123B8A2 /* CleverTapUTMDetail.m in Sources */ = {isa = PBXBuildFile; fileRef = 59462084C7E04F4769F8574724A12D55 /* CleverTapUTMDetail.m */; }; - 11730CA73EC917C5DCA49F9142B88485 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 2D154F4805B9715F0E6D79B0363CE280 /* Foundation.framework */; }; - 136F8447F2DA3665E1104AD3A1545DC0 /* CTLogger.h in Headers */ = {isa = PBXBuildFile; fileRef = FEAAD18188F20412C606B38176BF2F07 /* CTLogger.h */; settings = {ATTRIBUTES = (Project, ); }; }; - 18BA64D879457ACDD15252C795728B52 /* CleverTapTrackedViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 646D615B9BC65FECDB0A825610E53740 /* CleverTapTrackedViewController.m */; }; - 1A02D5986CEB1C94F6E0441D1C381283 /* CTInAppFCManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 091B30FA1A8C64AE90397D1CA497738C /* CTInAppFCManager.m */; }; - 1B571069D1BC61C1F0BA09D8776A7793 /* CTSwizzle.m in Sources */ = {isa = PBXBuildFile; fileRef = 0C01A16579ABF46C33AE6ED1A2F7394B /* CTSwizzle.m */; }; - 1BB3B0810C28144C2A35795C7955A80C /* CTValidationResult.m in Sources */ = {isa = PBXBuildFile; fileRef = 395F098F17AAB478E5B337467CB3B067 /* CTValidationResult.m */; }; - 1D6953F948580CAE3E6F29E2D94AEFFA /* CleverTapInstanceConfig.m in Sources */ = {isa = PBXBuildFile; fileRef = 38D4AFCC18E575326EC924033BE82276 /* CleverTapInstanceConfig.m */; }; - 1DFCBD616D55C825CB2211CC00540F48 /* CTPreferences.m in Sources */ = {isa = PBXBuildFile; fileRef = 501D22ACF66B2A82BE966C199198CAE6 /* CTPreferences.m */; }; - 2BD035C6BF0FD3D9B92162E1A43D6734 /* CTInAppUtils.h in Headers */ = {isa = PBXBuildFile; fileRef = A4C8FA6B0477CB80281C2AE55279768F /* CTInAppUtils.h */; settings = {ATTRIBUTES = (Project, ); }; }; - 2BF072A3C89F91C915FDF605F0F776CA /* DigiCertSHA2SecureServerCA.crt in Resources */ = {isa = PBXBuildFile; fileRef = 4F1F32D5B355D498183AE8B616433193 /* DigiCertSHA2SecureServerCA.crt */; }; - 2C57356E3B3DB1BB090B054761D2D4C4 /* CTLocalDataStore.h in Headers */ = {isa = PBXBuildFile; fileRef = BD4449C0B5C27D2AD66111F894764B75 /* CTLocalDataStore.h */; settings = {ATTRIBUTES = (Project, ); }; }; - 2DA6C4F740D35103261716D3A05A6B6F /* CTInAppNotification.h in Headers */ = {isa = PBXBuildFile; fileRef = 97ACCF6EED3EE851EEFF4C291CB3AF24 /* CTInAppNotification.h */; settings = {ATTRIBUTES = (Project, ); }; }; - 2E5B80DD430804FA9EC4BF5F37702990 /* CTInAppDisplayViewControllerPrivate.h in Headers */ = {isa = PBXBuildFile; fileRef = F39F164DB168FD4CD6A4908C4B715EB9 /* CTInAppDisplayViewControllerPrivate.h */; settings = {ATTRIBUTES = (Project, ); }; }; - 30CEAE6A2BA0FE5725A2096FD853E7E2 /* CleverTap.m in Sources */ = {isa = PBXBuildFile; fileRef = 07981E535135904FDBD4AB0287274566 /* CleverTap.m */; }; - 3113E3EC4976B22E43DB58671B8E6AED /* CleverTapTrackedViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 646D615B9BC65FECDB0A825610E53740 /* CleverTapTrackedViewController.m */; }; - 366DA2DB7FCE94ED288F5E4873268890 /* CTLogger.m in Sources */ = {isa = PBXBuildFile; fileRef = 6CE4722E30C333E5A8FADDE1D3FAAC9D /* CTLogger.m */; }; - 3790216AC027F4716A9FFE0C2730CA67 /* CleverTapInstanceConfig.h in Headers */ = {isa = PBXBuildFile; fileRef = AF494C58C071ED207A181EB7D44D8BB6 /* CleverTapInstanceConfig.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 383FBFE4E1D65DA8B837CFEEFF208742 /* CTProfileBuilder.m in Sources */ = {isa = PBXBuildFile; fileRef = 77590200341E346BF3FC105D215BDDF7 /* CTProfileBuilder.m */; }; - 38FE9700A306CB6CEBA7247140520531 /* CleverTapSyncDelegate.h in Headers */ = {isa = PBXBuildFile; fileRef = 2716FFA5E99ADF21128485D375BFF395 /* CleverTapSyncDelegate.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 3C9FF88B66130018F0E913A8F19D56D7 /* DigiCertGlobalRootCA.crt in Resources */ = {isa = PBXBuildFile; fileRef = 3CC67043DED88D351310185E6BCD1857 /* DigiCertGlobalRootCA.crt */; }; - 3D4E4F59C2C83F7E8A338FDCBE09E03B /* CleverTapInstanceConfigPrivate.h in Headers */ = {isa = PBXBuildFile; fileRef = EE2C815B70A0C03AADDC8DC9E5344C75 /* CleverTapInstanceConfigPrivate.h */; settings = {ATTRIBUTES = (Project, ); }; }; - 3E109618B0EB8883A2B21E56BABF8839 /* CTPlistInfo.h in Headers */ = {isa = PBXBuildFile; fileRef = 095E9ACB3D337FC5CB51FA124FA9ADB1 /* CTPlistInfo.h */; settings = {ATTRIBUTES = (Project, ); }; }; - 3F0F18CA203B33DB111264ED383724E6 /* CTDeviceInfo.h in Headers */ = {isa = PBXBuildFile; fileRef = 4D8AA26A1735494E601DC80F56B9412F /* CTDeviceInfo.h */; settings = {ATTRIBUTES = (Project, ); }; }; - 401AA19F26F9A66A2E02B689E0CFF757 /* CleverTapEventDetail.m in Sources */ = {isa = PBXBuildFile; fileRef = 963EBF5C91F6EA2D7528D028B1CE29B7 /* CleverTapEventDetail.m */; }; - 40525BB0C277D41762F6ED6C6D828B5A /* CTValidator.h in Headers */ = {isa = PBXBuildFile; fileRef = 8EDC42319924402E70B4EB184DE336A1 /* CTValidator.h */; settings = {ATTRIBUTES = (Project, ); }; }; - 4354F76EC42B1C1719384424142B2767 /* CTDismissButton.h in Headers */ = {isa = PBXBuildFile; fileRef = 639325DB8803A3AEE14E2D7F805B96A1 /* CTDismissButton.h */; settings = {ATTRIBUTES = (Project, ); }; }; - 45AF7BB1BDBA6BD644663D9ADFA9E39A /* CTUriHelper.m in Sources */ = {isa = PBXBuildFile; fileRef = AD862D8CC6FDBE7AF873BBD44C103489 /* CTUriHelper.m */; }; - 46BD5EA9F4D80202D4FE29FE5C870DF9 /* CleverTapEventDetail.h in Headers */ = {isa = PBXBuildFile; fileRef = 9A8FD5E5181EA2EE244121730F9C7666 /* CleverTapEventDetail.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 489F9079B8885ECA90F106256BFD8E9B /* CTLocationManager.h in Headers */ = {isa = PBXBuildFile; fileRef = F733563AAC6D9A040A2B545A5C716EB5 /* CTLocationManager.h */; settings = {ATTRIBUTES = (Project, ); }; }; - 48AF0926B4AEB7E1DB05D7E0AF3AAD81 /* CleverTapInAppNotificationDelegate.h in Headers */ = {isa = PBXBuildFile; fileRef = E0C00A606A2590B73F04B937EAA81178 /* CleverTapInAppNotificationDelegate.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 06F5F0B8E27B3224174DDBA8F0DA11CA /* ic_pause@1x.png in Resources */ = {isa = PBXBuildFile; fileRef = D61F229BD7097404A09463DBF6F7EBC0 /* ic_pause@1x.png */; }; + 075DC436FB19AE0C496456FBBBBCA3DC /* CTInAppFCManager.h in Headers */ = {isa = PBXBuildFile; fileRef = B70AE09F30139285706D87B96B514D7F /* CTInAppFCManager.h */; settings = {ATTRIBUTES = (Project, ); }; }; + 076EDBF4B55369F074DABA5C7B83AF92 /* CTValidationResult.h in Headers */ = {isa = PBXBuildFile; fileRef = 49EB62718778444E487FF6AF62CDD169 /* CTValidationResult.h */; settings = {ATTRIBUTES = (Project, ); }; }; + 08B444D113C4688A4AD491C1C0C90CAA /* CTPlistInfo.h in Headers */ = {isa = PBXBuildFile; fileRef = E7B097A182A433F871E63ED6A8A53E52 /* CTPlistInfo.h */; settings = {ATTRIBUTES = (Project, ); }; }; + 097DCCA74CE1A4101AC2AFF977FED231 /* DigiCertSHA2SecureServerCA.crt in Resources */ = {isa = PBXBuildFile; fileRef = 527BF21FF6FC41547E18EFD6A8F1305F /* DigiCertSHA2SecureServerCA.crt */; }; + 0B9604E8639FC280AFCE5525C0DF72DE /* CTPinnedNSURLSessionDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 394EBE80516139F64F6FC71DD9B6B23E /* CTPinnedNSURLSessionDelegate.m */; }; + 0CEB894A42167717B0DD0B88965BB8B5 /* CTInAppNotification.m in Sources */ = {isa = PBXBuildFile; fileRef = CC5D0B8692C53314758FCF655C9DA029 /* CTInAppNotification.m */; }; + 0EA6497E515BBF774E12927B4F58FE09 /* CTPlistInfo.m in Sources */ = {isa = PBXBuildFile; fileRef = E4B52C105964295DFD36A013FD29A697 /* CTPlistInfo.m */; }; + 0F5EBCE2BC3C3CCE83686E2E0B3BB229 /* CleverTapBuildInfo.h in Headers */ = {isa = PBXBuildFile; fileRef = BB9F312E74BF39FF075418DA1A21B000 /* CleverTapBuildInfo.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 127DD67C05F173C125D7FB7EA81D97F1 /* CTPreferences.m in Sources */ = {isa = PBXBuildFile; fileRef = DC1A354B989FD32E783116138E5A68B4 /* CTPreferences.m */; }; + 145E734BBC07C74F9683CC957C3AE67D /* CleverTapUTMDetail.m in Sources */ = {isa = PBXBuildFile; fileRef = A0614CA4BC8D032872F1843DEC4BCFFD /* CleverTapUTMDetail.m */; }; + 156CF49F1F7D157635D33387D9AB3835 /* CTInAppDisplayViewControllerPrivate.h in Headers */ = {isa = PBXBuildFile; fileRef = 2C22CD81AB7B7AE5CAE4280B119AA9F7 /* CTInAppDisplayViewControllerPrivate.h */; settings = {ATTRIBUTES = (Project, ); }; }; + 159C0881A84A2B1F2223EC0DB904322A /* CTInAppNotification.m in Sources */ = {isa = PBXBuildFile; fileRef = CC5D0B8692C53314758FCF655C9DA029 /* CTInAppNotification.m */; }; + 160BE77DF345665361FB4B53C75F4BAA /* CTInterstitialViewController~iphoneport.xib in Resources */ = {isa = PBXBuildFile; fileRef = 6D5D76B445EF5FA681BE76EECC0109C8 /* CTInterstitialViewController~iphoneport.xib */; }; + 1874B74CAA7711561DAE59624B17E435 /* CTInAppNotification.h in Headers */ = {isa = PBXBuildFile; fileRef = 551D5602237989DE6A8582739E068591 /* CTInAppNotification.h */; settings = {ATTRIBUTES = (Project, ); }; }; + 189C13AA533C9EA91E0FA1004E5596BF /* ic_play@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = E1AE0962382D63E3BD800F113259D28A /* ic_play@2x.png */; }; + 1B9E4B4A3D13E04B9CDDE8067735E007 /* DigiCertGlobalRootCA.crt in Resources */ = {isa = PBXBuildFile; fileRef = EC9C697FCA78C0EC2162488EF7230820 /* DigiCertGlobalRootCA.crt */; }; + 1BFCDB17546E2782D2BE747920739658 /* CleverTap-iOS-SDK-tvOS-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = D7BC8D68CD0E1295BCE67A4EAC94CB11 /* CleverTap-iOS-SDK-tvOS-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 1CD9A5F614B585ADC4D85282CC63F9C2 /* ic_pause@3x.png in Resources */ = {isa = PBXBuildFile; fileRef = 94807550BD47C9E4AAD8B075C0E3C5B2 /* ic_pause@3x.png */; }; + 1DE8B5C56C90DDA315D39EAFB2FEC844 /* CTUtils.h in Headers */ = {isa = PBXBuildFile; fileRef = 4DD10F967555B9910D22C26C7C80730E /* CTUtils.h */; settings = {ATTRIBUTES = (Project, ); }; }; + 1EA156FB080FC5AAA17DF148BFF48539 /* CleverTap.h in Headers */ = {isa = PBXBuildFile; fileRef = C71FD0730A6C95382CAEAE8EA6D6C075 /* CleverTap.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 1FBFEC1199EC6702EF9667E8FDE94BA5 /* ic_expand@3x.png in Resources */ = {isa = PBXBuildFile; fileRef = D0AA251E8D333CA7A8821F8ED025E60D /* ic_expand@3x.png */; }; + 20E584334BC490EE9148DDC360F9CCBB /* CTAVPlayerControlsViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 92F5FD5B43281CD40EDFDDE0BFE50E9B /* CTAVPlayerControlsViewController.m */; }; + 20EE9A8D8CB60D116193950DDA21D976 /* CTLocationManager.h in Headers */ = {isa = PBXBuildFile; fileRef = A36E887DC0B59FF9A9EE45D0E549E860 /* CTLocationManager.h */; settings = {ATTRIBUTES = (Project, ); }; }; + 2228EA0868EC399661350A546B7FD6E2 /* CTLogger.h in Headers */ = {isa = PBXBuildFile; fileRef = 56D478D07B27BFFFB796B200CE5B2BA2 /* CTLogger.h */; settings = {ATTRIBUTES = (Project, ); }; }; + 2257DDA5713716047A1287CBC0C3BF43 /* CTLocalDataStore.h in Headers */ = {isa = PBXBuildFile; fileRef = 931955FA97D3AD073FDC034F68777212 /* CTLocalDataStore.h */; settings = {ATTRIBUTES = (Project, ); }; }; + 23E40774FBD23725875ED1080225D71B /* ic_pause@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 6D58B3FF37F9AFFABD98A10766BDD44D /* ic_pause@2x.png */; }; + 26710F78640D6C950D46145F5F71C2EF /* CTUriHelper.m in Sources */ = {isa = PBXBuildFile; fileRef = 965306BE46850E4476C1EA58AB08EED7 /* CTUriHelper.m */; }; + 26C3E7B2CDABB8A32E799A5424B02ED8 /* CTLogger.m in Sources */ = {isa = PBXBuildFile; fileRef = 05B0B48AF845DC78378BEF56822A0B5D /* CTLogger.m */; }; + 26EFE33BA60630AF279DBC79E62B7920 /* CTCertificatePinning.m in Sources */ = {isa = PBXBuildFile; fileRef = E09FE9E56679DE709F6B24480C23EE1D /* CTCertificatePinning.m */; }; + 2931AC44B9FA8080E78FC5A6CF868E4D /* CTCoverViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 269AC7FB0C4CED99C25D10B760FAACD4 /* CTCoverViewController.m */; }; + 2941CD022D8B2CCEA1A6A31727C61042 /* CTLocalDataStore.h in Headers */ = {isa = PBXBuildFile; fileRef = 931955FA97D3AD073FDC034F68777212 /* CTLocalDataStore.h */; settings = {ATTRIBUTES = (Project, ); }; }; + 296E072D627DD14E7E42213457F5F614 /* CTHalfInterstitialImageViewController~iphoneport.xib in Resources */ = {isa = PBXBuildFile; fileRef = 0A4ABE1ED3A0E08A57B676413A390C69 /* CTHalfInterstitialImageViewController~iphoneport.xib */; }; + 2B6FC734C6CA2584BB66B4EEA276D076 /* FLAnimatedImageView.m in Sources */ = {isa = PBXBuildFile; fileRef = EE74DE7CE2CAEF199A4F2E736B5444D6 /* FLAnimatedImageView.m */; }; + 2BD81FEB113E79A5B2AC42FBA78BC581 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 572DBE63D5360AB71E5F80F979738FD0 /* Foundation.framework */; }; + 2DF403615FA15E305D4CF8DF3B7FDFB8 /* CTInAppResources.h in Headers */ = {isa = PBXBuildFile; fileRef = D543C5BF50378C1B8A23F6976D478067 /* CTInAppResources.h */; settings = {ATTRIBUTES = (Project, ); }; }; + 2E1B67FA5825CC43873CCCCC9A8C87AB /* CTLogger.m in Sources */ = {isa = PBXBuildFile; fileRef = 05B0B48AF845DC78378BEF56822A0B5D /* CTLogger.m */; }; + 2FBBEC07A86FBA7283F22D628D81276E /* CTEventBuilder.m in Sources */ = {isa = PBXBuildFile; fileRef = 3095E807A11FB6375FCA4AA260BBA802 /* CTEventBuilder.m */; }; + 30BC4CB4CE59D3546E6D71B2461B834C /* CTHalfInterstitialImageViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = AD7CCAF8E73FA20B1585DF553A57C5A2 /* CTHalfInterstitialImageViewController.m */; }; + 321C8D98A3A70F08356D695DC24E606D /* CTSwizzle.h in Headers */ = {isa = PBXBuildFile; fileRef = 9695D83BF46B823360ACAF210134EC68 /* CTSwizzle.h */; settings = {ATTRIBUTES = (Project, ); }; }; + 321D7E47128A04961D0BA327BA2CBF3D /* CTSwizzle.m in Sources */ = {isa = PBXBuildFile; fileRef = 56A49FBC0EFE520AC706E69F46E001CC /* CTSwizzle.m */; }; + 32532E93FF9A84C8C9890DC63A3BE318 /* CleverTapEventDetail.m in Sources */ = {isa = PBXBuildFile; fileRef = 835627291937792A21124FD4AB4A18DC /* CleverTapEventDetail.m */; }; + 327C0DC095145389EA92CCB4098E3FD4 /* CTHalfInterstitialViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 8F73014FC6D0633BC655951F07E5E015 /* CTHalfInterstitialViewController.m */; }; + 32C2095C462E3DF82294822A6D06E52A /* CTInAppUtils.m in Sources */ = {isa = PBXBuildFile; fileRef = 7BB62C49A14987C6FC89120F7AB770A9 /* CTInAppUtils.m */; }; + 32C3A35DE4655CA339093A4540B20966 /* CleverTapInstanceConfigPrivate.h in Headers */ = {isa = PBXBuildFile; fileRef = 2DC25E7418C1C7F3CB29C3D87771977A /* CleverTapInstanceConfigPrivate.h */; settings = {ATTRIBUTES = (Project, ); }; }; + 33A40BD65EAD1F62B4A2D378F3A12DB1 /* CTValidationResult.m in Sources */ = {isa = PBXBuildFile; fileRef = E069B9D9C5E39F08226BD77D7ADFACC7 /* CTValidationResult.m */; }; + 35A14A069C9FCC9AFE9E3FB2BEC12075 /* FLAnimatedImage.m in Sources */ = {isa = PBXBuildFile; fileRef = 7018F5597CE34DFCDEF5D795A2796EA9 /* FLAnimatedImage.m */; }; + 37929862226FBC933E3F29D0F449C7A4 /* CTBaseHeaderFooterViewController.h in Headers */ = {isa = PBXBuildFile; fileRef = 995A6677E2991BD72791806C4F9A7FBC /* CTBaseHeaderFooterViewController.h */; settings = {ATTRIBUTES = (Project, ); }; }; + 39DCC474DBE62620A15E113CBF4D4048 /* CTLogger.h in Headers */ = {isa = PBXBuildFile; fileRef = 56D478D07B27BFFFB796B200CE5B2BA2 /* CTLogger.h */; settings = {ATTRIBUTES = (Project, ); }; }; + 3AB39EB03DF665D6B08BD64BCC9A20FB /* CTSwizzle.m in Sources */ = {isa = PBXBuildFile; fileRef = 56A49FBC0EFE520AC706E69F46E001CC /* CTSwizzle.m */; }; + 3ADAE255C58798E4D39115CA1888C516 /* CTLocationManager.m in Sources */ = {isa = PBXBuildFile; fileRef = BCC5282D081707857B3A015F9A462C3E /* CTLocationManager.m */; }; + 3ADF561410FB575959611F0EDAE149E3 /* CTHalfInterstitialViewController.h in Headers */ = {isa = PBXBuildFile; fileRef = CE834314A265333D84FD03B767B6DD42 /* CTHalfInterstitialViewController.h */; settings = {ATTRIBUTES = (Project, ); }; }; + 3B3CAA501029A009377E190662B36DDE /* CTFooterViewController~ipad.xib in Resources */ = {isa = PBXBuildFile; fileRef = D5A9DC6C6A7FDC1F1B96185ABE022098 /* CTFooterViewController~ipad.xib */; }; + 3C9D8BC08682BAF56046B519F9E5D884 /* ic_expand@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = FA50D8E5A8C18EBA0CE4DF069730B2DE /* ic_expand@2x.png */; }; + 3D2507AE9B75F8129E3FF909A48AB372 /* CTInAppDisplayViewControllerPrivate.h in Headers */ = {isa = PBXBuildFile; fileRef = 2C22CD81AB7B7AE5CAE4280B119AA9F7 /* CTInAppDisplayViewControllerPrivate.h */; settings = {ATTRIBUTES = (Project, ); }; }; + 3DE2B72606B061F05488BF535B890223 /* CTKnownProfileFields.m in Sources */ = {isa = PBXBuildFile; fileRef = 33C56B9DD164BD1C2F223DD9E57A8D9B /* CTKnownProfileFields.m */; }; + 40664B8A0697EF161D85C8AE74F9CECB /* CleverTapUTMDetail.h in Headers */ = {isa = PBXBuildFile; fileRef = 8BD0FDCE50661AA79B4A851D8A873663 /* CleverTapUTMDetail.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 411378120CA0A042F812BA05E04A25C1 /* CleverTap-iOS-SDK-tvOS-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = BE4FF7D92BDF0E1D568D53C65596AF89 /* CleverTap-iOS-SDK-tvOS-dummy.m */; }; + 43DD5DFFD7B75129551B7BF4FA467AD0 /* CleverTapUTMDetail.m in Sources */ = {isa = PBXBuildFile; fileRef = A0614CA4BC8D032872F1843DEC4BCFFD /* CleverTapUTMDetail.m */; }; + 45227132853B3293ECC629ABB3032F3B /* CleverTap+SSLPinning.h in Headers */ = {isa = PBXBuildFile; fileRef = F2E38FED1F744E4A2B8D59E388D2FFD3 /* CleverTap+SSLPinning.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 45BD171ABEE9497AF46E036AD736E775 /* CTInterstitialViewController~ipad.xib in Resources */ = {isa = PBXBuildFile; fileRef = 3FB139938EEC7D267F6C1DC5F4650FC8 /* CTInterstitialViewController~ipad.xib */; }; + 464333947A06BF1A097ECA3571E326E2 /* CTInAppDisplayViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = CCB8B1BFEA8A95724A14FE93EE0E0778 /* CTInAppDisplayViewController.m */; }; + 46DEEB62D4DC2734FF6A6DB20BAC98D6 /* CleverTap-iOS-SDK-iOS-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 8DFD1499A9C6494C71D55AFB666C110A /* CleverTap-iOS-SDK-iOS-dummy.m */; }; + 47421FBD8FCEEC460C7F346086DB4B27 /* FLAnimatedImageView.m in Sources */ = {isa = PBXBuildFile; fileRef = EE74DE7CE2CAEF199A4F2E736B5444D6 /* FLAnimatedImageView.m */; }; + 47E76CA4E5E8A2008F088EF3E8B339D4 /* CTProfileBuilder.m in Sources */ = {isa = PBXBuildFile; fileRef = 3132311D86866710BD636E787EAC5C8E /* CTProfileBuilder.m */; }; + 483D6BBFE052BB6223662C3F32CDCAA0 /* CleverTapInstanceConfigPrivate.h in Headers */ = {isa = PBXBuildFile; fileRef = 2DC25E7418C1C7F3CB29C3D87771977A /* CleverTapInstanceConfigPrivate.h */; settings = {ATTRIBUTES = (Project, ); }; }; + 4A311153F88D539B6F88D76C743D1552 /* CTLocalDataStore.m in Sources */ = {isa = PBXBuildFile; fileRef = 2707C7EDD1BE135A727A8CE17C7E3B4B /* CTLocalDataStore.m */; }; 4AAB1998FDD2C1A3A045AAE63DF6CC74 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 2D154F4805B9715F0E6D79B0363CE280 /* Foundation.framework */; }; - 4BE674AE0E1C84B33FD2CAC1F24684C8 /* CTCertificatePinning.h in Headers */ = {isa = PBXBuildFile; fileRef = CD1AF2425B398594084683B46E53C832 /* CTCertificatePinning.h */; settings = {ATTRIBUTES = (Project, ); }; }; - 4E74597E88A50E02CD0F255D2AFF85C7 /* CTUtils.m in Sources */ = {isa = PBXBuildFile; fileRef = 1661589AB26E97676CB37F8C7CF394D4 /* CTUtils.m */; }; - 50CFE1F669BA7782322802057D2CD541 /* CTLocationManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 47631EE9479492A3346E591EA49F3F13 /* CTLocationManager.m */; }; - 55D7F67BAFDC21C446ECC0F52F1C197C /* CTLocationManager.h in Headers */ = {isa = PBXBuildFile; fileRef = F733563AAC6D9A040A2B545A5C716EB5 /* CTLocationManager.h */; settings = {ATTRIBUTES = (Project, ); }; }; - 55F91F04CB07C42A24A845D97E9EFB9E /* CTDismissButton.m in Sources */ = {isa = PBXBuildFile; fileRef = 15070C4566FBE45EFBDB5451C038B7C8 /* CTDismissButton.m */; }; - 56ABDCA8359002FA4EAC6A67FC4C583C /* CTLocationManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 47631EE9479492A3346E591EA49F3F13 /* CTLocationManager.m */; }; - 5752A3B55A136E9581818D12D2A469AB /* CleverTap-iOS-SDK-iOS-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = B245513B6CFF684B16E20B5A8AD3834C /* CleverTap-iOS-SDK-iOS-dummy.m */; }; - 598388878066C29540DF97FD55B557A0 /* CTPinnedNSURLSessionDelegate.h in Headers */ = {isa = PBXBuildFile; fileRef = C9348135E640B69B3CA9227C26CADDF4 /* CTPinnedNSURLSessionDelegate.h */; settings = {ATTRIBUTES = (Project, ); }; }; - 5E4BB7955284AADDE2A1B5B633BB38C9 /* CTKnownProfileFields.m in Sources */ = {isa = PBXBuildFile; fileRef = CCDC6232B4591787A62D0E8D6A8EC0E3 /* CTKnownProfileFields.m */; }; - 5F1C56ABD7F1F0A3A8681E90F5C947EE /* CTKnownProfileFields.h in Headers */ = {isa = PBXBuildFile; fileRef = 078CBD2F2B7E20498F5A1EE7977A9813 /* CTKnownProfileFields.h */; settings = {ATTRIBUTES = (Project, ); }; }; - 5F7DBE42ED3A162863119CD19EC12F7A /* CleverTap.h in Headers */ = {isa = PBXBuildFile; fileRef = 4CCE23D23ACB76F6510C05C54F533854 /* CleverTap.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 5FBF3A4086B746F117C51B33BBB3B1C7 /* CleverTap-iOS-SDK-tvOS-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = F05E9E3E67196CBCD176D2951D6ED70C /* CleverTap-iOS-SDK-tvOS-dummy.m */; }; - 6034E4F7C276ECB8990EDA775E56912B /* CTInAppFCManager.h in Headers */ = {isa = PBXBuildFile; fileRef = 9BF3DA18F0CECB3E18ED486A49CAFDEB /* CTInAppFCManager.h */; settings = {ATTRIBUTES = (Project, ); }; }; - 60961E47C8D896106515607D3CCE939A /* CTInAppHTMLViewController.h in Headers */ = {isa = PBXBuildFile; fileRef = 0DC97F613A2F9B31344CD6AFE8F5A93E /* CTInAppHTMLViewController.h */; settings = {ATTRIBUTES = (Project, ); }; }; - 63763D8589CF9FDDC3ADCCD304E7F8BF /* CleverTap-iOS-SDK-tvOS-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 8F6ECD2BE49C4D4CAE10650C788F33CD /* CleverTap-iOS-SDK-tvOS-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 668B0FB9CBC1CAB96C7469E2794D2F8F /* CTDeviceInfo.m in Sources */ = {isa = PBXBuildFile; fileRef = 729B0E94993BF08B95873A5A54DB2554 /* CTDeviceInfo.m */; }; - 672D5CEDA1404791A857BB86DAFC58F3 /* CTEventBuilder.h in Headers */ = {isa = PBXBuildFile; fileRef = D87C4FEA24B9F4CB8E5D386C7CE6251E /* CTEventBuilder.h */; settings = {ATTRIBUTES = (Project, ); }; }; + 4B9E321C86BB8FA4CB1B577078B6DADB /* CTValidationResult.m in Sources */ = {isa = PBXBuildFile; fileRef = E069B9D9C5E39F08226BD77D7ADFACC7 /* CTValidationResult.m */; }; + 4C7AC7B8D45E481EA7327429747D530A /* FLAnimatedImageView.h in Headers */ = {isa = PBXBuildFile; fileRef = 758F33C54F35570FC766C43728CE7B46 /* FLAnimatedImageView.h */; settings = {ATTRIBUTES = (Project, ); }; }; + 4D56362CE17CA396E49E461E13962DDA /* CTHalfInterstitialImageViewController.h in Headers */ = {isa = PBXBuildFile; fileRef = 14F941163E688FD29B138F651C992A23 /* CTHalfInterstitialImageViewController.h */; settings = {ATTRIBUTES = (Project, ); }; }; + 4D97A497E52F42E0025BFB48E47311D4 /* CTSlider.m in Sources */ = {isa = PBXBuildFile; fileRef = CEF1718498368EF535C233136C98D138 /* CTSlider.m */; }; + 4F9E60F5627F08B5DD7A6E2AA9A09999 /* CTKnownProfileFields.m in Sources */ = {isa = PBXBuildFile; fileRef = 33C56B9DD164BD1C2F223DD9E57A8D9B /* CTKnownProfileFields.m */; }; + 5047CD6AD90B3EEB4419F4ED876E079B /* CTInAppHTMLViewController.h in Headers */ = {isa = PBXBuildFile; fileRef = 73D9D8A160193092345354E99A7EDC60 /* CTInAppHTMLViewController.h */; settings = {ATTRIBUTES = (Project, ); }; }; + 510A04A1B183505F7BD59C955D8A161E /* CTAlertViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 0840C9BDE124A93F680EC32D84FB6B2A /* CTAlertViewController.m */; }; + 552F43140AE88F4EBFB859BFB84FCFB9 /* CTInAppResources.m in Sources */ = {isa = PBXBuildFile; fileRef = 6C2E2044A2F88E9B43BF8386D047D1BF /* CTInAppResources.m */; }; + 555C7939AF6D75A6C6FE7ED073A850B4 /* CTFooterViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 65026832BA761398F290AE5EA311FA55 /* CTFooterViewController.m */; }; + 55BCBF03AC573DB45CAF3E1A599294EA /* CTInAppUtils.h in Headers */ = {isa = PBXBuildFile; fileRef = 26E0FCF05DDC67CAF4E35DDF4A77DEE6 /* CTInAppUtils.h */; settings = {ATTRIBUTES = (Project, ); }; }; + 56206664BD6EC603AA524EF95CCC11D0 /* CTUtils.m in Sources */ = {isa = PBXBuildFile; fileRef = DC19136B0C1E4689553A5D390651A66E /* CTUtils.m */; }; + 5649175CFFDDDFE7EC38B547ABA3A0A4 /* CleverTapEventDetail.h in Headers */ = {isa = PBXBuildFile; fileRef = EADC96D6503F757AEEA9575AC91837F4 /* CleverTapEventDetail.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 56A28503DEE8311715FE53BC0CB9BCE4 /* ic_play@1x.png in Resources */ = {isa = PBXBuildFile; fileRef = A86E965C038024D41C727BCF7FF3A4A0 /* ic_play@1x.png */; }; + 59BCD23082334BF91EA0F514C21FF879 /* CTFooterViewController~iphoneport.xib in Resources */ = {isa = PBXBuildFile; fileRef = 84280E78531213F9B2AD7DC3250D3CA7 /* CTFooterViewController~iphoneport.xib */; }; + 5D504EC3775FF00EDEB306A50E6B531B /* CleverTapSyncDelegate.h in Headers */ = {isa = PBXBuildFile; fileRef = DD445C34E2FFBDBD55D11E062BCABEC7 /* CleverTapSyncDelegate.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 5F547C33247713DB7A5930AE38DBF30B /* CleverTap.m in Sources */ = {isa = PBXBuildFile; fileRef = B7539C9A641D878ACA3BA5CE9E8E935F /* CleverTap.m */; }; + 5FAB1F228D9D129C5641A66EC374E6C5 /* CTNotificationButton.h in Headers */ = {isa = PBXBuildFile; fileRef = AAF60C279F13F1DB3A95FC743422A730 /* CTNotificationButton.h */; settings = {ATTRIBUTES = (Project, ); }; }; + 5FCFC9204F67041BD9EA52F0211B95B0 /* CTCertificatePinning.h in Headers */ = {isa = PBXBuildFile; fileRef = C010200A8014573D94479818B25785F4 /* CTCertificatePinning.h */; settings = {ATTRIBUTES = (Project, ); }; }; + 616308FB93CF9ACED564092A5D311412 /* CTValidator.h in Headers */ = {isa = PBXBuildFile; fileRef = 0D6BD2A41B8236709F497323814CF069 /* CTValidator.h */; settings = {ATTRIBUTES = (Project, ); }; }; + 627C156452099451B5FE4A23BB7DA8C1 /* CTDismissButton.m in Sources */ = {isa = PBXBuildFile; fileRef = D2D3A8C820C331705A297AE9F3B31537 /* CTDismissButton.m */; }; + 635D0763858AF1658263298750A1E979 /* CTHalfInterstitialImageViewController~ipad.xib in Resources */ = {isa = PBXBuildFile; fileRef = 6581711E1296F61D5FE08D3C4DA8F3E2 /* CTHalfInterstitialImageViewController~ipad.xib */; }; + 6510934118D201EF143AF623A0D68547 /* CTLocationManager.h in Headers */ = {isa = PBXBuildFile; fileRef = A36E887DC0B59FF9A9EE45D0E549E860 /* CTLocationManager.h */; settings = {ATTRIBUTES = (Project, ); }; }; + 67937F0331DDCDBFF9AA3E54A58C1D00 /* CleverTapSyncDelegate.h in Headers */ = {isa = PBXBuildFile; fileRef = DD445C34E2FFBDBD55D11E062BCABEC7 /* CleverTapSyncDelegate.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 68BCACC43B126533207440FCCAD5DC76 /* CTDeviceInfo.h in Headers */ = {isa = PBXBuildFile; fileRef = FDA9A742205E3C9BFDEB898D3CBE3D62 /* CTDeviceInfo.h */; settings = {ATTRIBUTES = (Project, ); }; }; + 69DB9536707021424F7E28AB25604A9F /* CTDeviceInfo.h in Headers */ = {isa = PBXBuildFile; fileRef = FDA9A742205E3C9BFDEB898D3CBE3D62 /* CTDeviceInfo.h */; settings = {ATTRIBUTES = (Project, ); }; }; + 6AD749D5249509F7AD35E5A5FA7F75E2 /* CTConstants.m in Sources */ = {isa = PBXBuildFile; fileRef = C3C975F4DF130B3E7F3A719BA6189696 /* CTConstants.m */; }; + 6B1BFD349803B8193167AD98F9035057 /* CleverTapInstanceConfig.m in Sources */ = {isa = PBXBuildFile; fileRef = 3C860F6F466673568602392C80F1FC3D /* CleverTapInstanceConfig.m */; }; + 6B78BC4B3D25C64F74205BF8269E279E /* CTAVPlayerControlsViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 40D4581A4A4B7C9BDBAC171A2CC79D7F /* CTAVPlayerControlsViewController.xib */; }; 6C8849990CCE3884DF490E57906F28CE /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 2D154F4805B9715F0E6D79B0363CE280 /* Foundation.framework */; }; - 6EFC05A0EB224C433384A41D3877A695 /* CTPlistInfo.h in Headers */ = {isa = PBXBuildFile; fileRef = 095E9ACB3D337FC5CB51FA124FA9ADB1 /* CTPlistInfo.h */; settings = {ATTRIBUTES = (Project, ); }; }; + 6DBA7B6BDBB696F5C8A075D491414DAE /* CTInAppFCManager.m in Sources */ = {isa = PBXBuildFile; fileRef = F9A6CF69AE466F2A779ACF83EDBE1AE0 /* CTInAppFCManager.m */; }; + 6E88DB279A702C331BB5E0D9630809DD /* CTCoverViewController~iphoneport.xib in Resources */ = {isa = PBXBuildFile; fileRef = 78FED9B66DB201853EE7677DFF389D7B /* CTCoverViewController~iphoneport.xib */; }; + 6F624247548BDDECC5DFD411F4EC99DA /* CTPlistInfo.h in Headers */ = {isa = PBXBuildFile; fileRef = E7B097A182A433F871E63ED6A8A53E52 /* CTPlistInfo.h */; settings = {ATTRIBUTES = (Project, ); }; }; 7074E3768AFE3F4B39D448D71C59B04C /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 572DBE63D5360AB71E5F80F979738FD0 /* Foundation.framework */; }; - 70E21D58C2FD474861F51635C2C8F760 /* CleverTap.h in Headers */ = {isa = PBXBuildFile; fileRef = 4CCE23D23ACB76F6510C05C54F533854 /* CleverTap.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 721F77826B1AF9D3B6EF240FBD7CEA42 /* CTLogger.h in Headers */ = {isa = PBXBuildFile; fileRef = FEAAD18188F20412C606B38176BF2F07 /* CTLogger.h */; settings = {ATTRIBUTES = (Project, ); }; }; - 73B29E7AFDD8D51D5E7722C4E5D57D37 /* CTUtils.h in Headers */ = {isa = PBXBuildFile; fileRef = BA2A4793D7FCFC13CE798ABB45E5D326 /* CTUtils.h */; settings = {ATTRIBUTES = (Project, ); }; }; - 742891B84E27B040A169D3CCAB2F70DB /* CTInAppFCManager.h in Headers */ = {isa = PBXBuildFile; fileRef = 9BF3DA18F0CECB3E18ED486A49CAFDEB /* CTInAppFCManager.h */; settings = {ATTRIBUTES = (Project, ); }; }; - 74431C6D4245EBFB50CFDCF3F520E2FE /* CleverTapSyncDelegate.h in Headers */ = {isa = PBXBuildFile; fileRef = 2716FFA5E99ADF21128485D375BFF395 /* CleverTapSyncDelegate.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 7537FEE99CDB2B164A5DA6397577EAE3 /* CTInAppHTMLViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 272EBAFE1BA6DCF628A53EFD5BB9DC11 /* CTInAppHTMLViewController.m */; }; - 76729D45FDF726BAA7A1AAF3ECD68CE5 /* CTLogger.m in Sources */ = {isa = PBXBuildFile; fileRef = 6CE4722E30C333E5A8FADDE1D3FAAC9D /* CTLogger.m */; }; - 77A82ED0386C98E7DA288345D1365BD6 /* CTPreferences.h in Headers */ = {isa = PBXBuildFile; fileRef = 51794A3A22CE711794B5CDA5C08D1565 /* CTPreferences.h */; settings = {ATTRIBUTES = (Project, ); }; }; - 7868CD7E08A201DA0B731CFBD5CB2EAD /* CleverTapBuildInfo.h in Headers */ = {isa = PBXBuildFile; fileRef = B0B31B4E8E2A3A32CF576BA255441DA5 /* CleverTapBuildInfo.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 78B8928B9DEB21EFB68B906ECE08EFC3 /* CTConstants.h in Headers */ = {isa = PBXBuildFile; fileRef = E7A3113809CF827418939E59F8810F7F /* CTConstants.h */; settings = {ATTRIBUTES = (Project, ); }; }; - 7ACD4F6C240300D11C5A5B7DDF5D8964 /* CleverTapBuildInfo.h in Headers */ = {isa = PBXBuildFile; fileRef = B0B31B4E8E2A3A32CF576BA255441DA5 /* CleverTapBuildInfo.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 7F56BDC2777F150AFD63ACF4060F586D /* CTValidator.h in Headers */ = {isa = PBXBuildFile; fileRef = 8EDC42319924402E70B4EB184DE336A1 /* CTValidator.h */; settings = {ATTRIBUTES = (Project, ); }; }; - 814B222FB4E53DE37EA7F9D26B60A6BC /* CTLocalDataStore.m in Sources */ = {isa = PBXBuildFile; fileRef = 08EA26EAADB3F8FCE62B4707A4B67727 /* CTLocalDataStore.m */; }; - 82835564E69306D37EA65AE7C378DE5B /* CTPinnedNSURLSessionDelegate.h in Headers */ = {isa = PBXBuildFile; fileRef = C9348135E640B69B3CA9227C26CADDF4 /* CTPinnedNSURLSessionDelegate.h */; settings = {ATTRIBUTES = (Project, ); }; }; - 841014D8336C2FF9F023C46F5F00FFED /* CTPlistInfo.m in Sources */ = {isa = PBXBuildFile; fileRef = E919357EDC1A7A4EA54D9D065038D53E /* CTPlistInfo.m */; }; - 84B10EB45D62362F37C660451378537D /* CTInAppDisplayViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 2617A3A815A6114348D59341F0247FD5 /* CTInAppDisplayViewController.m */; }; - 864064965309DDE054274B55B7B886E4 /* CleverTapEventDetail.h in Headers */ = {isa = PBXBuildFile; fileRef = 9A8FD5E5181EA2EE244121730F9C7666 /* CleverTapEventDetail.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 70E3B81E9B80B2C8F05BEC9979B91FC9 /* CTInAppUtils.h in Headers */ = {isa = PBXBuildFile; fileRef = 26E0FCF05DDC67CAF4E35DDF4A77DEE6 /* CTInAppUtils.h */; settings = {ATTRIBUTES = (Project, ); }; }; + 71F8C047665D98024A518822024D9974 /* CTPlistInfo.m in Sources */ = {isa = PBXBuildFile; fileRef = E4B52C105964295DFD36A013FD29A697 /* CTPlistInfo.m */; }; + 7202BC70B8B4C79614154422A1CBFAC4 /* ic_shrink@3x.png in Resources */ = {isa = PBXBuildFile; fileRef = A8E6B9FAC29A5B3553FCAFDA211AC2AC /* ic_shrink@3x.png */; }; + 72BBEC03FD3DFBFD5833B750F55D0A24 /* CTInAppNotification.h in Headers */ = {isa = PBXBuildFile; fileRef = 551D5602237989DE6A8582739E068591 /* CTInAppNotification.h */; settings = {ATTRIBUTES = (Project, ); }; }; + 72C4CD62DCE08667D8A3A7EF2D6D50BB /* CTDeviceInfo.m in Sources */ = {isa = PBXBuildFile; fileRef = DDDA4431D593E23534E0F0B9529763D4 /* CTDeviceInfo.m */; }; + 72DF403F695F2567C544ADB0319D8E6E /* CleverTapEventDetail.h in Headers */ = {isa = PBXBuildFile; fileRef = EADC96D6503F757AEEA9575AC91837F4 /* CleverTapEventDetail.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 74311CA47AD2492C2E8986626ED39677 /* CTUriHelper.h in Headers */ = {isa = PBXBuildFile; fileRef = 8494992EC4204CD25669D9D750A6960D /* CTUriHelper.h */; settings = {ATTRIBUTES = (Project, ); }; }; + 74460F5CE98A702959AF4418AA14C686 /* CTNotificationButton.m in Sources */ = {isa = PBXBuildFile; fileRef = ED99091080FADDCF718061EC1F67E53D /* CTNotificationButton.m */; }; + 790B802773FBD1D44CA2D6E870462B57 /* CTInAppDisplayViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = CCB8B1BFEA8A95724A14FE93EE0E0778 /* CTInAppDisplayViewController.m */; }; + 79116F45BD9F69167577A2385D605E6E /* CTInAppDisplayViewController.h in Headers */ = {isa = PBXBuildFile; fileRef = 365E913B9862CD84C58F3C93A99AC5C3 /* CTInAppDisplayViewController.h */; settings = {ATTRIBUTES = (Project, ); }; }; + 79F5A7DCBBB01A028C9CDD0BEF570400 /* CTPreferences.h in Headers */ = {isa = PBXBuildFile; fileRef = E47022E886F10A61A9610F5B4BF81135 /* CTPreferences.h */; settings = {ATTRIBUTES = (Project, ); }; }; + 7B1EE878A21AA78766C3B301A074C996 /* CTCoverImageViewController.h in Headers */ = {isa = PBXBuildFile; fileRef = 42DAD87607037825561E18A00ED625C5 /* CTCoverImageViewController.h */; settings = {ATTRIBUTES = (Project, ); }; }; + 7B5704185C472AE4FDA056BAFE146878 /* CleverTapTrackedViewController.h in Headers */ = {isa = PBXBuildFile; fileRef = 04B24CAE757AD99AE1E15EF7A2566A76 /* CleverTapTrackedViewController.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 7CF7A8B79A4004282A42EE879411F263 /* CleverTap.m in Sources */ = {isa = PBXBuildFile; fileRef = B7539C9A641D878ACA3BA5CE9E8E935F /* CleverTap.m */; }; + 7D852A54F6E87CBC64B2B9A4C9D34D10 /* CTConstants.h in Headers */ = {isa = PBXBuildFile; fileRef = D8D7C44097D696CEE74C43DFE1AD4D9F /* CTConstants.h */; settings = {ATTRIBUTES = (Project, ); }; }; + 7DAA9ADEF7F2DF6E99138766B9FF8EB8 /* CTValidator.m in Sources */ = {isa = PBXBuildFile; fileRef = 1A18F6574C9217CDA4A55964C6E6E547 /* CTValidator.m */; }; + 7DE86E771737F6D9FEA0F30442836914 /* CTAVPlayerViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 85CF1030F7DEE65B04947F6E7C0B51CC /* CTAVPlayerViewController.m */; }; + 7F5B464BDEC5BD90A0CF04FBAC7B0C3D /* CTNotificationButton.m in Sources */ = {isa = PBXBuildFile; fileRef = ED99091080FADDCF718061EC1F67E53D /* CTNotificationButton.m */; }; + 84ED2016F470CC060A6F0A587BDD8F30 /* CTUtils.m in Sources */ = {isa = PBXBuildFile; fileRef = DC19136B0C1E4689553A5D390651A66E /* CTUtils.m */; }; 873BA4CD321479A0F6A5EDA64ECABC6C /* Pods-ObjCStarter-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 3B2ADC14B3707AE7D7C5275F43B78701 /* Pods-ObjCStarter-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 8976FE804BD35F0D60E272B5C250B5F2 /* CleverTapTrackedViewController.h in Headers */ = {isa = PBXBuildFile; fileRef = 63BDF9283E9E8FA5C9EAE05B850C6710 /* CleverTapTrackedViewController.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 89856851FA41400B220E796422A2DFFC /* CTValidationResult.m in Sources */ = {isa = PBXBuildFile; fileRef = 395F098F17AAB478E5B337467CB3B067 /* CTValidationResult.m */; }; - 931CA895B59AB29BC7789B47956130FB /* CTProfileBuilder.m in Sources */ = {isa = PBXBuildFile; fileRef = 77590200341E346BF3FC105D215BDDF7 /* CTProfileBuilder.m */; }; - 937836A335C329531FC3665DFBB005BD /* CTSwizzle.h in Headers */ = {isa = PBXBuildFile; fileRef = 97930524EE3D19339865725DE83F96CE /* CTSwizzle.h */; settings = {ATTRIBUTES = (Project, ); }; }; - 95FB11EC7A370EA872CF76A72D279E51 /* CTEventBuilder.m in Sources */ = {isa = PBXBuildFile; fileRef = 8F569C3501AF97E8E65D4966A315D7B1 /* CTEventBuilder.m */; }; - 96A3DDCF1939A46928E11DEA28A6A185 /* CTInAppUtils.m in Sources */ = {isa = PBXBuildFile; fileRef = 850DBA2917DC5D9056276B4AA92DE843 /* CTInAppUtils.m */; }; - 9A71E59EDF4F1AB8A0CE1911EFDB68E9 /* CTCertificatePinning.m in Sources */ = {isa = PBXBuildFile; fileRef = 6E52EF509E795DD83F6904925E7F9C24 /* CTCertificatePinning.m */; }; - 9AF984C39769055CF477E56B67CE6F3D /* CleverTap+SSLPinning.h in Headers */ = {isa = PBXBuildFile; fileRef = BE5235CD66480A1FF23623B50273F8EE /* CleverTap+SSLPinning.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 9BF1D11BBB38DC9FF670ECDF326C6AB0 /* CTDismissButton.h in Headers */ = {isa = PBXBuildFile; fileRef = 639325DB8803A3AEE14E2D7F805B96A1 /* CTDismissButton.h */; settings = {ATTRIBUTES = (Project, ); }; }; - 9CAD1A44AAED11062BEF1A3D07E375AB /* CTCertificatePinning.m in Sources */ = {isa = PBXBuildFile; fileRef = 6E52EF509E795DD83F6904925E7F9C24 /* CTCertificatePinning.m */; }; - 9CB167E08A2BAA0F105406124CFFA10F /* CleverTap+SSLPinning.h in Headers */ = {isa = PBXBuildFile; fileRef = BE5235CD66480A1FF23623B50273F8EE /* CleverTap+SSLPinning.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 9D21B80A2BADB3E4598DB0CA7FFC65BA /* CTUriHelper.m in Sources */ = {isa = PBXBuildFile; fileRef = AD862D8CC6FDBE7AF873BBD44C103489 /* CTUriHelper.m */; }; - 9DDA97748F5D7E1796FD898A48DB4202 /* CTInAppDisplayViewController.h in Headers */ = {isa = PBXBuildFile; fileRef = A5EACC1686FBE138806D4FF34D0FD8E0 /* CTInAppDisplayViewController.h */; settings = {ATTRIBUTES = (Project, ); }; }; + 888EE78D8C760A5A354920848439B301 /* CTEventBuilder.h in Headers */ = {isa = PBXBuildFile; fileRef = B58A26B633EB1902650D41D076C55DA9 /* CTEventBuilder.h */; settings = {ATTRIBUTES = (Project, ); }; }; + 88ADC992D4EA12209FA9F64E5152F546 /* FLAnimatedImageView.h in Headers */ = {isa = PBXBuildFile; fileRef = 758F33C54F35570FC766C43728CE7B46 /* FLAnimatedImageView.h */; settings = {ATTRIBUTES = (Project, ); }; }; + 899B170BD0F4D964092AB4EDC9AF6650 /* CTConstants.m in Sources */ = {isa = PBXBuildFile; fileRef = C3C975F4DF130B3E7F3A719BA6189696 /* CTConstants.m */; }; + 8F0CDD3D32FEE74809D309518CE00D2A /* DigiCertSHA2SecureServerCA.crt in Resources */ = {isa = PBXBuildFile; fileRef = 527BF21FF6FC41547E18EFD6A8F1305F /* DigiCertSHA2SecureServerCA.crt */; }; + 8F0D9BBFAED4F6286FDCF9F7FA28A0E8 /* CTHeaderViewController~ipad.xib in Resources */ = {isa = PBXBuildFile; fileRef = 45431EA0772880AB5904391D43BF921A /* CTHeaderViewController~ipad.xib */; }; + 8F32D07A87539709096403303AC2F8AF /* CTInterstitialImageViewController~ipad.xib in Resources */ = {isa = PBXBuildFile; fileRef = 9971A335A4996920FB8B3F4FD0850409 /* CTInterstitialImageViewController~ipad.xib */; }; + 90EA6AB5E392F91A37C506E653411F4A /* FLAnimatedImage.h in Headers */ = {isa = PBXBuildFile; fileRef = 9870D51A47AC79E23EA87DC4A00244DC /* FLAnimatedImage.h */; settings = {ATTRIBUTES = (Project, ); }; }; + 91B81F7091534A75A312209AECACB31C /* CTProfileBuilder.m in Sources */ = {isa = PBXBuildFile; fileRef = 3132311D86866710BD636E787EAC5C8E /* CTProfileBuilder.m */; }; + 91F6F789F99F4B1C979253D8926777CA /* CTAVPlayerControlsViewController.h in Headers */ = {isa = PBXBuildFile; fileRef = F95BDEE1CDAAF02059A8F66E87A1A34D /* CTAVPlayerControlsViewController.h */; settings = {ATTRIBUTES = (Project, ); }; }; + 95EFC98C1F3A60575647C4858027AF49 /* CTPinnedNSURLSessionDelegate.h in Headers */ = {isa = PBXBuildFile; fileRef = B4E9FCC817D4B3B2AD7F2014AFD1E4EB /* CTPinnedNSURLSessionDelegate.h */; settings = {ATTRIBUTES = (Project, ); }; }; + 9A6779C68950304A180037F42067B2F0 /* CleverTapUTMDetail.h in Headers */ = {isa = PBXBuildFile; fileRef = 8BD0FDCE50661AA79B4A851D8A873663 /* CleverTapUTMDetail.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 9AF7309570D6FA3D6AA3B6996855CD17 /* CTHalfInterstitialViewController~ipad.xib in Resources */ = {isa = PBXBuildFile; fileRef = 0325EA533BD6E64A4EC350006AAACA37 /* CTHalfInterstitialViewController~ipad.xib */; }; + 9E39AD03EB04F2558E3B015675ACD707 /* CTHalfInterstitialViewController~iphoneport.xib in Resources */ = {isa = PBXBuildFile; fileRef = 25C38BB213F87B747D1E560F459247C1 /* CTHalfInterstitialViewController~iphoneport.xib */; }; 9EB468DB842C2BA2C3107B68919E33F2 /* Pods-ObjCTvOS-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 9754D8995F8E12C0969DEA754F217585 /* Pods-ObjCTvOS-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 9ECA235A95DEF80D54EBCAC5D6CCEEAA /* CTKnownProfileFields.h in Headers */ = {isa = PBXBuildFile; fileRef = BBB849FB0102D7377F6D65E8015C997C /* CTKnownProfileFields.h */; settings = {ATTRIBUTES = (Project, ); }; }; + 9F8A5988550A83A50B5D62455E78905A /* CTLocationManager.m in Sources */ = {isa = PBXBuildFile; fileRef = BCC5282D081707857B3A015F9A462C3E /* CTLocationManager.m */; }; + A048D31965D0FAAAFF23C5151625498B /* CleverTapEventDetail.m in Sources */ = {isa = PBXBuildFile; fileRef = 835627291937792A21124FD4AB4A18DC /* CleverTapEventDetail.m */; }; + A05A70956819445A57C123EFA93E9355 /* CleverTapInAppNotificationDelegate.h in Headers */ = {isa = PBXBuildFile; fileRef = 484888D6574B6AC25D0E4E33CA78B4DE /* CleverTapInAppNotificationDelegate.h */; settings = {ATTRIBUTES = (Project, ); }; }; + A07032BA132125D65327FE71E6B97F14 /* CTProfileBuilder.h in Headers */ = {isa = PBXBuildFile; fileRef = 2F71D8061FA3E0F943E5E4C85DB9EC24 /* CTProfileBuilder.h */; settings = {ATTRIBUTES = (Project, ); }; }; + A1353CE9ED04791C1A9437E7C1C115A9 /* CTInterstitialImageViewController~iphoneport.xib in Resources */ = {isa = PBXBuildFile; fileRef = 1D4376416EE1471177BC486DA96D512E /* CTInterstitialImageViewController~iphoneport.xib */; }; + A1D70D42C84A3D23CD5C9FEAE284726D /* CTEventBuilder.m in Sources */ = {isa = PBXBuildFile; fileRef = 3095E807A11FB6375FCA4AA260BBA802 /* CTEventBuilder.m */; }; A21387232BA8562F7EB7C84715C15B1D /* Pods-ObjCStarterTests-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 056C18E94B1C02BF7976575860C22EFF /* Pods-ObjCStarterTests-dummy.m */; }; - A562B2ABBF464B20EBB5336C69AFC025 /* CTConstants.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C0ED5A580CAEA63A56F9146BBA72617 /* CTConstants.m */; }; - A63E05492B4C83D952ED4ADC0C13A690 /* CTEventBuilder.m in Sources */ = {isa = PBXBuildFile; fileRef = 8F569C3501AF97E8E65D4966A315D7B1 /* CTEventBuilder.m */; }; - A880AA02ECDE61BEC6BBB19E971A7250 /* CTInAppUtils.h in Headers */ = {isa = PBXBuildFile; fileRef = A4C8FA6B0477CB80281C2AE55279768F /* CTInAppUtils.h */; settings = {ATTRIBUTES = (Project, ); }; }; + A3139F9E7A462B56EF249B2D99CE361B /* CTCoverViewController.h in Headers */ = {isa = PBXBuildFile; fileRef = 668094278340A9E53DF66B11F0CD3191 /* CTCoverViewController.h */; settings = {ATTRIBUTES = (Project, ); }; }; + A351370ECBCA236ED79A5C9C19F7794F /* CTConstants.h in Headers */ = {isa = PBXBuildFile; fileRef = D8D7C44097D696CEE74C43DFE1AD4D9F /* CTConstants.h */; settings = {ATTRIBUTES = (Project, ); }; }; + A5F0A130541CE11E6D7FDF8FB8B19D93 /* CleverTapInAppNotificationDelegate.h in Headers */ = {isa = PBXBuildFile; fileRef = 484888D6574B6AC25D0E4E33CA78B4DE /* CleverTapInAppNotificationDelegate.h */; settings = {ATTRIBUTES = (Public, ); }; }; + AA3BFF4E465154C76F54CFB74428E1DA /* FLAnimatedImage.m in Sources */ = {isa = PBXBuildFile; fileRef = 7018F5597CE34DFCDEF5D795A2796EA9 /* FLAnimatedImage.m */; }; AA697D7F464E8CA206344CE492F32374 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 2D154F4805B9715F0E6D79B0363CE280 /* Foundation.framework */; }; - AB52A6B85B2CC199B14231956CA6B0EE /* CTDeviceInfo.m in Sources */ = {isa = PBXBuildFile; fileRef = 729B0E94993BF08B95873A5A54DB2554 /* CTDeviceInfo.m */; }; - AF5BCF98B8A9770BE7E47240CA4E3CB9 /* CTKnownProfileFields.m in Sources */ = {isa = PBXBuildFile; fileRef = CCDC6232B4591787A62D0E8D6A8EC0E3 /* CTKnownProfileFields.m */; }; - AF8932C6601E8DBAF35EFB685E28243D /* CTInAppDisplayViewControllerPrivate.h in Headers */ = {isa = PBXBuildFile; fileRef = F39F164DB168FD4CD6A4908C4B715EB9 /* CTInAppDisplayViewControllerPrivate.h */; settings = {ATTRIBUTES = (Project, ); }; }; - B186AF019B160F9679257F32AE3DF202 /* CTPinnedNSURLSessionDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 69D749DD39B3D16B2013F75853347406 /* CTPinnedNSURLSessionDelegate.m */; }; - B1A350DCA350D5B66C2AACF137E4A50D /* CTInAppNotification.m in Sources */ = {isa = PBXBuildFile; fileRef = CCCBB314EACC41F011F0265E7D043A34 /* CTInAppNotification.m */; }; - B23D6007BDA22E716383503CEBA4F9B4 /* CleverTap.m in Sources */ = {isa = PBXBuildFile; fileRef = 07981E535135904FDBD4AB0287274566 /* CleverTap.m */; }; - B6363BF6B2B36A87AE50CF0A9D8C0344 /* DigiCertGlobalRootCA.crt in Resources */ = {isa = PBXBuildFile; fileRef = 3CC67043DED88D351310185E6BCD1857 /* DigiCertGlobalRootCA.crt */; }; - BC44FE9E02EB079A29FECB7D15661D6E /* CleverTapInAppNotificationDelegate.h in Headers */ = {isa = PBXBuildFile; fileRef = E0C00A606A2590B73F04B937EAA81178 /* CleverTapInAppNotificationDelegate.h */; settings = {ATTRIBUTES = (Project, ); }; }; - C0013202297A81BD7C384B235C161EDA /* CTLocalDataStore.h in Headers */ = {isa = PBXBuildFile; fileRef = BD4449C0B5C27D2AD66111F894764B75 /* CTLocalDataStore.h */; settings = {ATTRIBUTES = (Project, ); }; }; - C2697D881CE0D2B5E4999A735A03C59F /* CleverTapEventDetail.m in Sources */ = {isa = PBXBuildFile; fileRef = 963EBF5C91F6EA2D7528D028B1CE29B7 /* CleverTapEventDetail.m */; }; - C2DD0D2D1A7A0090F3848CA0AF7532BC /* CleverTapTrackedViewController.h in Headers */ = {isa = PBXBuildFile; fileRef = 63BDF9283E9E8FA5C9EAE05B850C6710 /* CleverTapTrackedViewController.h */; settings = {ATTRIBUTES = (Public, ); }; }; - C5F299639FE7B58177C0FD02BA840958 /* CTKnownProfileFields.h in Headers */ = {isa = PBXBuildFile; fileRef = 078CBD2F2B7E20498F5A1EE7977A9813 /* CTKnownProfileFields.h */; settings = {ATTRIBUTES = (Project, ); }; }; - C62F8CFC1C60213122A4E4CAC96630A5 /* CTInAppDisplayViewController.h in Headers */ = {isa = PBXBuildFile; fileRef = A5EACC1686FBE138806D4FF34D0FD8E0 /* CTInAppDisplayViewController.h */; settings = {ATTRIBUTES = (Project, ); }; }; + AB87E3D7675221E6A27B0428B2154A6D /* CTInAppFCManager.m in Sources */ = {isa = PBXBuildFile; fileRef = F9A6CF69AE466F2A779ACF83EDBE1AE0 /* CTInAppFCManager.m */; }; + ACADFF03741D939F8B61BA9E5F5A1EC5 /* CTHeaderViewController.h in Headers */ = {isa = PBXBuildFile; fileRef = F1F213F4BB19D9B0BD3EE682DE52570E /* CTHeaderViewController.h */; settings = {ATTRIBUTES = (Project, ); }; }; + ACF5ED3E237A32F738E4E0705E0432AA /* CTProfileBuilder.h in Headers */ = {isa = PBXBuildFile; fileRef = 2F71D8061FA3E0F943E5E4C85DB9EC24 /* CTProfileBuilder.h */; settings = {ATTRIBUTES = (Project, ); }; }; + AD40A5DBDE7FFEF84ACEAFC067A7C6C8 /* CTUtils.h in Headers */ = {isa = PBXBuildFile; fileRef = 4DD10F967555B9910D22C26C7C80730E /* CTUtils.h */; settings = {ATTRIBUTES = (Project, ); }; }; + B36808604CC08B314466DB0F428AB5A3 /* CTDeviceInfo.m in Sources */ = {isa = PBXBuildFile; fileRef = DDDA4431D593E23534E0F0B9529763D4 /* CTDeviceInfo.m */; }; + B6962AAD6F0AA2C41341635BBC9C71C1 /* CleverTap.h in Headers */ = {isa = PBXBuildFile; fileRef = C71FD0730A6C95382CAEAE8EA6D6C075 /* CleverTap.h */; settings = {ATTRIBUTES = (Public, ); }; }; + B729BC9D3DA41F1E75A99A1CE368B0E4 /* CTEventBuilder.h in Headers */ = {isa = PBXBuildFile; fileRef = B58A26B633EB1902650D41D076C55DA9 /* CTEventBuilder.h */; settings = {ATTRIBUTES = (Project, ); }; }; + B72FF04D2204D25A99D96306F6CC2647 /* CleverTapInstanceConfig.m in Sources */ = {isa = PBXBuildFile; fileRef = 3C860F6F466673568602392C80F1FC3D /* CleverTapInstanceConfig.m */; }; + B959AA3B288D2FCD7CAB8FEF4282D6AF /* ic_thumb.png in Resources */ = {isa = PBXBuildFile; fileRef = 9DB788D44D5BCD075138EB1CA016168A /* ic_thumb.png */; }; + BB6B60B7D2640AC505D7AD1712ADC54E /* CTValidator.h in Headers */ = {isa = PBXBuildFile; fileRef = 0D6BD2A41B8236709F497323814CF069 /* CTValidator.h */; settings = {ATTRIBUTES = (Project, ); }; }; + BBC350487638B71E7A9B9B092A3583EF /* CTUriHelper.h in Headers */ = {isa = PBXBuildFile; fileRef = 8494992EC4204CD25669D9D750A6960D /* CTUriHelper.h */; settings = {ATTRIBUTES = (Project, ); }; }; + BCEE377821B41AF4001C660D327B79AD /* CTPreferences.m in Sources */ = {isa = PBXBuildFile; fileRef = DC1A354B989FD32E783116138E5A68B4 /* CTPreferences.m */; }; + BDD606F72C327DD92905841E6E35C579 /* ic_shrink@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 5391BC1322843B8F86EF9763089C1B03 /* ic_shrink@2x.png */; }; + C0041336E4336AC558C778ED77C83CA2 /* CleverTapInstanceConfig.h in Headers */ = {isa = PBXBuildFile; fileRef = DB84FB167B0C3E3F9F4C645511833153 /* CleverTapInstanceConfig.h */; settings = {ATTRIBUTES = (Public, ); }; }; + C306725BFF8BED527CAF9C5DF347582B /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 2D154F4805B9715F0E6D79B0363CE280 /* Foundation.framework */; }; + C5B1CA09FBA14E9F1BDC2C9E7DCA6F3A /* CTFooterViewController.h in Headers */ = {isa = PBXBuildFile; fileRef = 6AF23D75FC9BF3A5DDBB77028BC8012E /* CTFooterViewController.h */; settings = {ATTRIBUTES = (Project, ); }; }; + C6FD55E7E480098EE7F7D9A44BDFF8DB /* CTInAppUtils.m in Sources */ = {isa = PBXBuildFile; fileRef = 7BB62C49A14987C6FC89120F7AB770A9 /* CTInAppUtils.m */; }; C70540930C6D8F38AF1ACEF8947D614F /* Pods-ObjCStarterUITests-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = D8C560BD9B4A139571369CEA5F65CDE4 /* Pods-ObjCStarterUITests-dummy.m */; }; - C80D01D1855BF1CBA2C856030EACC7BE /* CleverTapInstanceConfig.h in Headers */ = {isa = PBXBuildFile; fileRef = AF494C58C071ED207A181EB7D44D8BB6 /* CleverTapInstanceConfig.h */; settings = {ATTRIBUTES = (Public, ); }; }; - C948ECC744AAD5480FA39D945E340215 /* CTPlistInfo.m in Sources */ = {isa = PBXBuildFile; fileRef = E919357EDC1A7A4EA54D9D065038D53E /* CTPlistInfo.m */; }; - CB3684C159C0A0CCEC65A4B04F94B28B /* CTValidationResult.h in Headers */ = {isa = PBXBuildFile; fileRef = 0D3EAE1F8B2726519BC21CDDD48B65A9 /* CTValidationResult.h */; settings = {ATTRIBUTES = (Project, ); }; }; - CDEF14B4D080AEA25D30AF7B5AA1FD9C /* CTPreferences.m in Sources */ = {isa = PBXBuildFile; fileRef = 501D22ACF66B2A82BE966C199198CAE6 /* CTPreferences.m */; }; - D20383BFA93D8AB3D92D0B1B3FBA10E1 /* CleverTapInstanceConfigPrivate.h in Headers */ = {isa = PBXBuildFile; fileRef = EE2C815B70A0C03AADDC8DC9E5344C75 /* CleverTapInstanceConfigPrivate.h */; settings = {ATTRIBUTES = (Project, ); }; }; + C87655F28E553920D7A9FB7415917B43 /* CTPinnedNSURLSessionDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 394EBE80516139F64F6FC71DD9B6B23E /* CTPinnedNSURLSessionDelegate.m */; }; + C8DF9FB1DA3FE2FCFDECF359CDF5247E /* CTAlertViewController.h in Headers */ = {isa = PBXBuildFile; fileRef = 69BBF7AA271EC79F64925132ED4ECB31 /* CTAlertViewController.h */; settings = {ATTRIBUTES = (Project, ); }; }; + CA90645B88381F070AAF8B0724587F31 /* CTHeaderViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = B1F79A33FCF950B21A4C5F785FBF7247 /* CTHeaderViewController.m */; }; + CB0C8D00CD4D34DAEE1105072C4D6233 /* CTInAppResources.m in Sources */ = {isa = PBXBuildFile; fileRef = 6C2E2044A2F88E9B43BF8386D047D1BF /* CTInAppResources.m */; }; + CC59FF7DEB255AF868CEFE686115EA65 /* CleverTap+SSLPinning.h in Headers */ = {isa = PBXBuildFile; fileRef = F2E38FED1F744E4A2B8D59E388D2FFD3 /* CleverTap+SSLPinning.h */; settings = {ATTRIBUTES = (Public, ); }; }; + CDD761EF75751FAA1FDB053014E98C68 /* CTPreferences.h in Headers */ = {isa = PBXBuildFile; fileRef = E47022E886F10A61A9610F5B4BF81135 /* CTPreferences.h */; settings = {ATTRIBUTES = (Project, ); }; }; + CE8E188374AE7252235F3F04F30B24BA /* CTUriHelper.m in Sources */ = {isa = PBXBuildFile; fileRef = 965306BE46850E4476C1EA58AB08EED7 /* CTUriHelper.m */; }; + D161BA4B399CF3EDC46471C2B64E496D /* sound-wave-headphones.png in Resources */ = {isa = PBXBuildFile; fileRef = 0F31D96F4D5B2355EFA3E3D605732B07 /* sound-wave-headphones.png */; }; + D1F990017691B4A56C1EF86433ED3ED4 /* CTInterstitialImageViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 981824D917EE4453413334C02C4F2168 /* CTInterstitialImageViewController.m */; }; + D2323EEC5925346D09DE2E93245A7FA0 /* CTInAppHTMLViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = A8616DCF6DA7AC23DBA8AF14034CC2B8 /* CTInAppHTMLViewController.m */; }; + D30526E561464313871D50B33E087C75 /* CTDismissButton.h in Headers */ = {isa = PBXBuildFile; fileRef = 4BF77EEE06AF0E52212BE4206B451FF3 /* CTDismissButton.h */; settings = {ATTRIBUTES = (Project, ); }; }; + D34FC5C385E6E194E6EAD2F83DA4A2D1 /* CTPinnedNSURLSessionDelegate.h in Headers */ = {isa = PBXBuildFile; fileRef = B4E9FCC817D4B3B2AD7F2014AFD1E4EB /* CTPinnedNSURLSessionDelegate.h */; settings = {ATTRIBUTES = (Project, ); }; }; D38D5438D495EE1F884D28EEB0792F61 /* Pods-ObjCStarter-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = D711D2A6369B55CBAD14B9E0BF8F1B2D /* Pods-ObjCStarter-dummy.m */; }; - D65D7AF25F72583C0C1B18B0E2D3E02D /* CTConstants.h in Headers */ = {isa = PBXBuildFile; fileRef = E7A3113809CF827418939E59F8810F7F /* CTConstants.h */; settings = {ATTRIBUTES = (Project, ); }; }; - DEA0BC2CA6B31739E6346000E4A5EE2F /* CleverTap-iOS-SDK-iOS-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = DBD8453DE4991F5994725DF4DDEAE275 /* CleverTap-iOS-SDK-iOS-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; - DF3C90F565FF070DCDBD55DCF1B9B529 /* CTCertificatePinning.h in Headers */ = {isa = PBXBuildFile; fileRef = CD1AF2425B398594084683B46E53C832 /* CTCertificatePinning.h */; settings = {ATTRIBUTES = (Project, ); }; }; - E0EAFEB825D62C995901F2462C0DE195 /* CTDeviceInfo.h in Headers */ = {isa = PBXBuildFile; fileRef = 4D8AA26A1735494E601DC80F56B9412F /* CTDeviceInfo.h */; settings = {ATTRIBUTES = (Project, ); }; }; - E1AFF55DF28EAF5BB4365AF9F7521282 /* CleverTapUTMDetail.h in Headers */ = {isa = PBXBuildFile; fileRef = 9A930523BB28D25AB16BACE947B1979C /* CleverTapUTMDetail.h */; settings = {ATTRIBUTES = (Public, ); }; }; - E3134A8611B07698C88A43B4630C9A03 /* DigiCertSHA2SecureServerCA.crt in Resources */ = {isa = PBXBuildFile; fileRef = 4F1F32D5B355D498183AE8B616433193 /* DigiCertSHA2SecureServerCA.crt */; }; - E3CB89B99BB1BDB2038B330002FBCEEC /* CTUtils.h in Headers */ = {isa = PBXBuildFile; fileRef = BA2A4793D7FCFC13CE798ABB45E5D326 /* CTUtils.h */; settings = {ATTRIBUTES = (Project, ); }; }; - E62F84BA71337C6977D1F84ACBFA6BD5 /* CTUtils.m in Sources */ = {isa = PBXBuildFile; fileRef = 1661589AB26E97676CB37F8C7CF394D4 /* CTUtils.m */; }; - E6EF5524ABEA0DAE7EFDC2F8234055D9 /* CleverTapUTMDetail.h in Headers */ = {isa = PBXBuildFile; fileRef = 9A930523BB28D25AB16BACE947B1979C /* CleverTapUTMDetail.h */; settings = {ATTRIBUTES = (Public, ); }; }; - E75D21C500F3A506E596AAA38679EAC2 /* CTInAppNotification.h in Headers */ = {isa = PBXBuildFile; fileRef = 97ACCF6EED3EE851EEFF4C291CB3AF24 /* CTInAppNotification.h */; settings = {ATTRIBUTES = (Project, ); }; }; - E81B5E49285FCF95FAA10CE5E4F35595 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 572DBE63D5360AB71E5F80F979738FD0 /* Foundation.framework */; }; - E8BB545C670496AE3814F7FF5FE0E503 /* CTSwizzle.h in Headers */ = {isa = PBXBuildFile; fileRef = 97930524EE3D19339865725DE83F96CE /* CTSwizzle.h */; settings = {ATTRIBUTES = (Project, ); }; }; + DADC7EA41BDDD0377D3F499CA2D29CDE /* CTNotificationButton.h in Headers */ = {isa = PBXBuildFile; fileRef = AAF60C279F13F1DB3A95FC743422A730 /* CTNotificationButton.h */; settings = {ATTRIBUTES = (Project, ); }; }; + DBE0F67C0718CA0884AD2648A67F91A1 /* CleverTapTrackedViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = BD6775DF39FF68998363AF544CCF19DC /* CleverTapTrackedViewController.m */; }; + DCDDE491C770798D138BAD61D631C8EA /* CTCoverImageViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 83CE8F87209C65D9F5AB52176593AFBD /* CTCoverImageViewController.m */; }; + DFDD41F32C16925B73BE1D5D3D7638CC /* CTValidator.m in Sources */ = {isa = PBXBuildFile; fileRef = 1A18F6574C9217CDA4A55964C6E6E547 /* CTValidator.m */; }; + E0EAD32DDDDD4DCB115090992F820561 /* CTCoverImageViewController~iphoneport.xib in Resources */ = {isa = PBXBuildFile; fileRef = DDEA93B4380A7DB3FE36D04CAD3CE4BD /* CTCoverImageViewController~iphoneport.xib */; }; + E37A133274C9C507FDDFB8386E5AF8F8 /* CTInAppDisplayViewController.h in Headers */ = {isa = PBXBuildFile; fileRef = 365E913B9862CD84C58F3C93A99AC5C3 /* CTInAppDisplayViewController.h */; settings = {ATTRIBUTES = (Project, ); }; }; + E42BAC88B86E51E7B38F0C8AE4105EC5 /* CTBaseHeaderFooterViewControllerPrivate.h in Headers */ = {isa = PBXBuildFile; fileRef = 3983F73A2985C565EF3062CCC0DEF861 /* CTBaseHeaderFooterViewControllerPrivate.h */; settings = {ATTRIBUTES = (Project, ); }; }; + E5C5B38B151A406926445D1C1B9F43A2 /* CTLocalDataStore.m in Sources */ = {isa = PBXBuildFile; fileRef = 2707C7EDD1BE135A727A8CE17C7E3B4B /* CTLocalDataStore.m */; }; + E6DDB1EE504627765E67A7BBD99F14C8 /* CleverTap-iOS-SDK-iOS-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 8AD3460503203660A1D872CC947CC2F2 /* CleverTap-iOS-SDK-iOS-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; E9180B95131D04BD35544A6FC76A9214 /* Pods-ObjCTvOS-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 3281F7ADF3403F43FF715E8AD11F9CC4 /* Pods-ObjCTvOS-dummy.m */; }; - EA7543408C1A3FC0B092F268B993D063 /* CTPinnedNSURLSessionDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 69D749DD39B3D16B2013F75853347406 /* CTPinnedNSURLSessionDelegate.m */; }; - F197D6B5457109F344279DF82964372C /* CTValidator.m in Sources */ = {isa = PBXBuildFile; fileRef = 2D030191BC682E7E802973AC81F31E2E /* CTValidator.m */; }; - F26647D4579A405AC66D2A49594E1133 /* CTPreferences.h in Headers */ = {isa = PBXBuildFile; fileRef = 51794A3A22CE711794B5CDA5C08D1565 /* CTPreferences.h */; settings = {ATTRIBUTES = (Project, ); }; }; - F2D76328EDE2B9A16F26E6922957CF7D /* CTInAppUtils.m in Sources */ = {isa = PBXBuildFile; fileRef = 850DBA2917DC5D9056276B4AA92DE843 /* CTInAppUtils.m */; }; + E97B78D40C6FA6D7C3492F47B96AE062 /* CTSlider.h in Headers */ = {isa = PBXBuildFile; fileRef = 96B0A82CBC7A95E64224EE63100BAF63 /* CTSlider.h */; settings = {ATTRIBUTES = (Project, ); }; }; + EC1155E313A6F5DB9A6E7EA58D011C9D /* CTCertificatePinning.m in Sources */ = {isa = PBXBuildFile; fileRef = E09FE9E56679DE709F6B24480C23EE1D /* CTCertificatePinning.m */; }; + EE783FDA606E146C5C7D2AB48253059A /* CTAVPlayerViewController.h in Headers */ = {isa = PBXBuildFile; fileRef = 800826EF4ADF3BB9D82B24E88C91E0DC /* CTAVPlayerViewController.h */; settings = {ATTRIBUTES = (Project, ); }; }; + EF45F811330A889448FF7D0B1AB02B79 /* CTHeaderViewController~iphoneport.xib in Resources */ = {isa = PBXBuildFile; fileRef = F100E1C83B1EB518F65C86C210AA68B8 /* CTHeaderViewController~iphoneport.xib */; }; + EFC5F77BDF9E328568B2B8E7493EAF48 /* CleverTapTrackedViewController.h in Headers */ = {isa = PBXBuildFile; fileRef = 04B24CAE757AD99AE1E15EF7A2566A76 /* CleverTapTrackedViewController.h */; settings = {ATTRIBUTES = (Public, ); }; }; + F0BC8A6F9A54037CBEC88954FB3CCAE1 /* ic_play@3x.png in Resources */ = {isa = PBXBuildFile; fileRef = 38E248FC6D75DB2E42BF0AA88D8B141B /* ic_play@3x.png */; }; + F1CF5121C919DAA8A6DB55B308202D36 /* CleverTapTrackedViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = BD6775DF39FF68998363AF544CCF19DC /* CleverTapTrackedViewController.m */; }; + F3021547BA0EF8C310614E2FD6D5DF51 /* CTInterstitialImageViewController.h in Headers */ = {isa = PBXBuildFile; fileRef = D73DFF5E5060F0EA01EED6CCFA97DB4E /* CTInterstitialImageViewController.h */; settings = {ATTRIBUTES = (Project, ); }; }; + F3263D4C18A43009F8A8027716A717C8 /* CleverTapInstanceConfig.h in Headers */ = {isa = PBXBuildFile; fileRef = DB84FB167B0C3E3F9F4C645511833153 /* CleverTapInstanceConfig.h */; settings = {ATTRIBUTES = (Public, ); }; }; F37D2341EA17628C9C530215C07F87C9 /* Pods-ObjCStarterTests-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 0A7F0438C3F54009C45629BBB4574345 /* Pods-ObjCStarterTests-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; - F7ED2D3062D30A0E7734F58C8B095FD3 /* CTProfileBuilder.h in Headers */ = {isa = PBXBuildFile; fileRef = C789D3F7D1871F098BBA2039D49C2863 /* CTProfileBuilder.h */; settings = {ATTRIBUTES = (Project, ); }; }; - F8337270356E255A3C6D68AC9F06A71F /* CTUriHelper.h in Headers */ = {isa = PBXBuildFile; fileRef = B348031FEFB1EA79566F0D55DE15B182 /* CTUriHelper.h */; settings = {ATTRIBUTES = (Project, ); }; }; - F98E6EDD596AC14860E48B92CD76C8A9 /* CTInAppNotification.m in Sources */ = {isa = PBXBuildFile; fileRef = CCCBB314EACC41F011F0265E7D043A34 /* CTInAppNotification.m */; }; - FA25369C4B77806C11B2B2833C694F3E /* CTInAppFCManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 091B30FA1A8C64AE90397D1CA497738C /* CTInAppFCManager.m */; }; - FC246B6125BF9F700DF05152A86D8FB9 /* CTLocalDataStore.m in Sources */ = {isa = PBXBuildFile; fileRef = 08EA26EAADB3F8FCE62B4707A4B67727 /* CTLocalDataStore.m */; }; - FFF0BCDD25873F159C31C5F94343DDC2 /* CTEventBuilder.h in Headers */ = {isa = PBXBuildFile; fileRef = D87C4FEA24B9F4CB8E5D386C7CE6251E /* CTEventBuilder.h */; settings = {ATTRIBUTES = (Project, ); }; }; + F41E6938C7B782DC21221F54FC3F728D /* CleverTapBuildInfo.h in Headers */ = {isa = PBXBuildFile; fileRef = BB9F312E74BF39FF075418DA1A21B000 /* CleverTapBuildInfo.h */; settings = {ATTRIBUTES = (Public, ); }; }; + F5017FE1D8695211C12BE86DA2830B77 /* FLAnimatedImage.h in Headers */ = {isa = PBXBuildFile; fileRef = 9870D51A47AC79E23EA87DC4A00244DC /* FLAnimatedImage.h */; settings = {ATTRIBUTES = (Project, ); }; }; + F757706DE9BC79D2C9562AACB286CEE9 /* CTCertificatePinning.h in Headers */ = {isa = PBXBuildFile; fileRef = C010200A8014573D94479818B25785F4 /* CTCertificatePinning.h */; settings = {ATTRIBUTES = (Project, ); }; }; + F998A823031990817FFA4414CDD792ED /* CTInAppFCManager.h in Headers */ = {isa = PBXBuildFile; fileRef = B70AE09F30139285706D87B96B514D7F /* CTInAppFCManager.h */; settings = {ATTRIBUTES = (Project, ); }; }; + FA1F426971F336D0F39AB85B4EE6F07B /* CTInterstitialViewController.h in Headers */ = {isa = PBXBuildFile; fileRef = B065E877EA908F82722367DFDA6884DC /* CTInterstitialViewController.h */; settings = {ATTRIBUTES = (Project, ); }; }; + FA76E49B0DEEC43525502122DB457CE9 /* CTInterstitialViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = AEFD8562C8F427EFCDC8B819A95AD639 /* CTInterstitialViewController.m */; }; + FDD640B97AF0308F2705A23DFD557E88 /* CTKnownProfileFields.h in Headers */ = {isa = PBXBuildFile; fileRef = BBB849FB0102D7377F6D65E8015C997C /* CTKnownProfileFields.h */; settings = {ATTRIBUTES = (Project, ); }; }; + FE3E08D0ACA4F2BB8D400F5F16B6B7B6 /* CTBaseHeaderFooterViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = DF0EE0328A03BDB05173DA3C27AF9638 /* CTBaseHeaderFooterViewController.m */; }; + FE8A3FBFF0F820162F3F750F6576B047 /* CTCoverImageViewController~ipad.xib in Resources */ = {isa = PBXBuildFile; fileRef = C57C9D71D6FF3E199EE0CA62BD69D596 /* CTCoverImageViewController~ipad.xib */; }; + FF6E82549A9D9ED498DCFE0683BA47EB /* CTCoverViewController~ipad.xib in Resources */ = {isa = PBXBuildFile; fileRef = F70EC8312DD7BF3115BF22DF3BF8202C /* CTCoverViewController~ipad.xib */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -158,7 +230,7 @@ isa = PBXContainerItemProxy; containerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */; proxyType = 1; - remoteGlobalIDString = 84710807FC10B8B2673796CA61608A06; + remoteGlobalIDString = D232BB786801B0F13E163425C6758475; remoteInfo = "CleverTap-iOS-SDK-tvOS"; }; 85CC18945347C350CDD3AF44AB560D4E /* PBXContainerItemProxy */ = { @@ -179,178 +251,244 @@ isa = PBXContainerItemProxy; containerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */; proxyType = 1; - remoteGlobalIDString = D101C7BCB05F1A764AD0A07B90ADAE07; + remoteGlobalIDString = 82EB401F9EF03080E9CC9290A678FE92; remoteInfo = "CleverTap-iOS-SDK-iOS"; }; /* End PBXContainerItemProxy section */ /* Begin PBXFileReference section */ 00431C7E823917BED274DA62D96CCA32 /* Pods-ObjCStarter-acknowledgements.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Pods-ObjCStarter-acknowledgements.plist"; sourceTree = ""; }; + 0325EA533BD6E64A4EC350006AAACA37 /* CTHalfInterstitialViewController~ipad.xib */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = file.xib; path = "CTHalfInterstitialViewController~ipad.xib"; sourceTree = ""; }; + 04B24CAE757AD99AE1E15EF7A2566A76 /* CleverTapTrackedViewController.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = CleverTapTrackedViewController.h; path = CleverTapSDK/CleverTapTrackedViewController.h; sourceTree = ""; }; 0529C4DD1C416E5E0820C435D8F75C2E /* CleverTapSDK.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = CleverTapSDK.framework; path = "CleverTap-iOS-SDK-iOS.framework"; sourceTree = BUILT_PRODUCTS_DIR; }; 056C18E94B1C02BF7976575860C22EFF /* Pods-ObjCStarterTests-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Pods-ObjCStarterTests-dummy.m"; sourceTree = ""; }; - 078CBD2F2B7E20498F5A1EE7977A9813 /* CTKnownProfileFields.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = CTKnownProfileFields.h; path = CleverTapSDK/CTKnownProfileFields.h; sourceTree = ""; }; - 07981E535135904FDBD4AB0287274566 /* CleverTap.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = CleverTap.m; path = CleverTapSDK/CleverTap.m; sourceTree = ""; }; - 08EA26EAADB3F8FCE62B4707A4B67727 /* CTLocalDataStore.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = CTLocalDataStore.m; path = CleverTapSDK/CTLocalDataStore.m; sourceTree = ""; }; - 091B30FA1A8C64AE90397D1CA497738C /* CTInAppFCManager.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = CTInAppFCManager.m; path = CleverTapSDK/CTInAppFCManager.m; sourceTree = ""; }; - 095E9ACB3D337FC5CB51FA124FA9ADB1 /* CTPlistInfo.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = CTPlistInfo.h; path = CleverTapSDK/CTPlistInfo.h; sourceTree = ""; }; + 05B0B48AF845DC78378BEF56822A0B5D /* CTLogger.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = CTLogger.m; path = CleverTapSDK/CTLogger.m; sourceTree = ""; }; + 0840C9BDE124A93F680EC32D84FB6B2A /* CTAlertViewController.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = CTAlertViewController.m; sourceTree = ""; }; + 0918E7E399418A0676DE86AFBF3C5B14 /* Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 0A4ABE1ED3A0E08A57B676413A390C69 /* CTHalfInterstitialImageViewController~iphoneport.xib */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = file.xib; path = "CTHalfInterstitialImageViewController~iphoneport.xib"; sourceTree = ""; }; + 0A5EEB21D9290E778E5062E11A51EF16 /* CleverTap-iOS-SDK.podspec */ = {isa = PBXFileReference; explicitFileType = text.script.ruby; includeInIndex = 1; lastKnownFileType = text; path = "CleverTap-iOS-SDK.podspec"; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.ruby; }; 0A7F0438C3F54009C45629BBB4574345 /* Pods-ObjCStarterTests-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Pods-ObjCStarterTests-umbrella.h"; sourceTree = ""; }; - 0C01A16579ABF46C33AE6ED1A2F7394B /* CTSwizzle.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = CTSwizzle.m; path = CleverTapSDK/CTSwizzle.m; sourceTree = ""; }; - 0D3EAE1F8B2726519BC21CDDD48B65A9 /* CTValidationResult.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = CTValidationResult.h; path = CleverTapSDK/CTValidationResult.h; sourceTree = ""; }; - 0DC97F613A2F9B31344CD6AFE8F5A93E /* CTInAppHTMLViewController.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = CTInAppHTMLViewController.h; path = CleverTapSDK/CTInAppHTMLViewController.h; sourceTree = ""; }; - 15070C4566FBE45EFBDB5451C038B7C8 /* CTDismissButton.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = CTDismissButton.m; path = CleverTapSDK/CTDismissButton.m; sourceTree = ""; }; - 1661589AB26E97676CB37F8C7CF394D4 /* CTUtils.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = CTUtils.m; path = CleverTapSDK/CTUtils.m; sourceTree = ""; }; - 1AF104A73F5822FB29F9D0ECB5B7458A /* Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; name = Info.plist; path = "../CleverTap-iOS-SDK-tvOS/Info.plist"; sourceTree = ""; }; + 0D6BD2A41B8236709F497323814CF069 /* CTValidator.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = CTValidator.h; path = CleverTapSDK/CTValidator.h; sourceTree = ""; }; + 0E0BEAE127D9CD35932A1C796551FB0E /* CleverTap-iOS-SDK-iOS-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "CleverTap-iOS-SDK-iOS-prefix.pch"; sourceTree = ""; }; + 0F31D96F4D5B2355EFA3E3D605732B07 /* sound-wave-headphones.png */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = image.png; path = "sound-wave-headphones.png"; sourceTree = ""; }; + 136304F58B055F4508F3B3A8DE97C896 /* ic_expand@1x.png */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = image.png; path = "ic_expand@1x.png"; sourceTree = ""; }; + 14F941163E688FD29B138F651C992A23 /* CTHalfInterstitialImageViewController.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = CTHalfInterstitialImageViewController.h; sourceTree = ""; }; + 193DA46A0F654B10C230EFD1EDE441DB /* Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; name = Info.plist; path = "../CleverTap-iOS-SDK-tvOS/Info.plist"; sourceTree = ""; }; + 1A18F6574C9217CDA4A55964C6E6E547 /* CTValidator.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = CTValidator.m; path = CleverTapSDK/CTValidator.m; sourceTree = ""; }; + 1BC7CEF8654D75A7AD597BD5B60FE313 /* CleverTap-iOS-SDK-iOS.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = "CleverTap-iOS-SDK-iOS.modulemap"; sourceTree = ""; }; + 1D4376416EE1471177BC486DA96D512E /* CTInterstitialImageViewController~iphoneport.xib */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = file.xib; path = "CTInterstitialImageViewController~iphoneport.xib"; sourceTree = ""; }; 1DE9BAA73CE91BC04CFAA245C582B9FE /* Pods-ObjCStarter-resources.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = "Pods-ObjCStarter-resources.sh"; sourceTree = ""; }; 20D23DDEDE4D2DFB75030BF8388E7097 /* Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - 2617A3A815A6114348D59341F0247FD5 /* CTInAppDisplayViewController.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = CTInAppDisplayViewController.m; path = CleverTapSDK/CTInAppDisplayViewController.m; sourceTree = ""; }; - 2716FFA5E99ADF21128485D375BFF395 /* CleverTapSyncDelegate.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = CleverTapSyncDelegate.h; path = CleverTapSDK/CleverTapSyncDelegate.h; sourceTree = ""; }; - 272EBAFE1BA6DCF628A53EFD5BB9DC11 /* CTInAppHTMLViewController.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = CTInAppHTMLViewController.m; path = CleverTapSDK/CTInAppHTMLViewController.m; sourceTree = ""; }; + 25C38BB213F87B747D1E560F459247C1 /* CTHalfInterstitialViewController~iphoneport.xib */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = file.xib; path = "CTHalfInterstitialViewController~iphoneport.xib"; sourceTree = ""; }; + 269AC7FB0C4CED99C25D10B760FAACD4 /* CTCoverViewController.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = CTCoverViewController.m; sourceTree = ""; }; + 26E0FCF05DDC67CAF4E35DDF4A77DEE6 /* CTInAppUtils.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = CTInAppUtils.h; path = CleverTapSDK/CTInAppUtils.h; sourceTree = ""; }; + 2707C7EDD1BE135A727A8CE17C7E3B4B /* CTLocalDataStore.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = CTLocalDataStore.m; path = CleverTapSDK/CTLocalDataStore.m; sourceTree = ""; }; 273B4A50F46B535C444BD94D391152B9 /* Pods-ObjCTvOS-frameworks.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = "Pods-ObjCTvOS-frameworks.sh"; sourceTree = ""; }; - 2D030191BC682E7E802973AC81F31E2E /* CTValidator.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = CTValidator.m; path = CleverTapSDK/CTValidator.m; sourceTree = ""; }; + 2C22CD81AB7B7AE5CAE4280B119AA9F7 /* CTInAppDisplayViewControllerPrivate.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = CTInAppDisplayViewControllerPrivate.h; path = CleverTapSDK/CTInAppDisplayViewControllerPrivate.h; sourceTree = ""; }; 2D154F4805B9715F0E6D79B0363CE280 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS10.3.sdk/System/Library/Frameworks/Foundation.framework; sourceTree = DEVELOPER_DIR; }; - 2E67239CA03C869B404DFF7F92FA1030 /* CleverTap-iOS-SDK-iOS-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "CleverTap-iOS-SDK-iOS-prefix.pch"; sourceTree = ""; }; + 2DC25E7418C1C7F3CB29C3D87771977A /* CleverTapInstanceConfigPrivate.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = CleverTapInstanceConfigPrivate.h; path = CleverTapSDK/CleverTapInstanceConfigPrivate.h; sourceTree = ""; }; + 2F71D8061FA3E0F943E5E4C85DB9EC24 /* CTProfileBuilder.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = CTProfileBuilder.h; path = CleverTapSDK/CTProfileBuilder.h; sourceTree = ""; }; + 3095E807A11FB6375FCA4AA260BBA802 /* CTEventBuilder.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = CTEventBuilder.m; path = CleverTapSDK/CTEventBuilder.m; sourceTree = ""; }; + 3132311D86866710BD636E787EAC5C8E /* CTProfileBuilder.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = CTProfileBuilder.m; path = CleverTapSDK/CTProfileBuilder.m; sourceTree = ""; }; 3281F7ADF3403F43FF715E8AD11F9CC4 /* Pods-ObjCTvOS-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Pods-ObjCTvOS-dummy.m"; sourceTree = ""; }; + 33C56B9DD164BD1C2F223DD9E57A8D9B /* CTKnownProfileFields.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = CTKnownProfileFields.m; path = CleverTapSDK/CTKnownProfileFields.m; sourceTree = ""; }; + 365E913B9862CD84C58F3C93A99AC5C3 /* CTInAppDisplayViewController.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = CTInAppDisplayViewController.h; path = CleverTapSDK/CTInAppDisplayViewController.h; sourceTree = ""; }; 37319506AA308073114C9BBC07E4AC62 /* Pods-ObjCStarterUITests-frameworks.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = "Pods-ObjCStarterUITests-frameworks.sh"; sourceTree = ""; }; - 38D4AFCC18E575326EC924033BE82276 /* CleverTapInstanceConfig.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = CleverTapInstanceConfig.m; path = CleverTapSDK/CleverTapInstanceConfig.m; sourceTree = ""; }; - 395F098F17AAB478E5B337467CB3B067 /* CTValidationResult.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = CTValidationResult.m; path = CleverTapSDK/CTValidationResult.m; sourceTree = ""; }; + 376B695692765017D38B6B7165CA71B4 /* CleverTap-iOS-SDK-tvOS.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; name = "CleverTap-iOS-SDK-tvOS.modulemap"; path = "../CleverTap-iOS-SDK-tvOS/CleverTap-iOS-SDK-tvOS.modulemap"; sourceTree = ""; }; + 38E248FC6D75DB2E42BF0AA88D8B141B /* ic_play@3x.png */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = image.png; path = "ic_play@3x.png"; sourceTree = ""; }; + 394EBE80516139F64F6FC71DD9B6B23E /* CTPinnedNSURLSessionDelegate.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = CTPinnedNSURLSessionDelegate.m; path = CleverTapSDK/CTPinnedNSURLSessionDelegate.m; sourceTree = ""; }; + 3983F73A2985C565EF3062CCC0DEF861 /* CTBaseHeaderFooterViewControllerPrivate.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = CTBaseHeaderFooterViewControllerPrivate.h; sourceTree = ""; }; 3B2ADC14B3707AE7D7C5275F43B78701 /* Pods-ObjCStarter-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Pods-ObjCStarter-umbrella.h"; sourceTree = ""; }; - 3BDBA3C0069913E7D76111DB4FCA8430 /* CleverTap-iOS-SDK-iOS.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = "CleverTap-iOS-SDK-iOS.modulemap"; sourceTree = ""; }; - 3CC67043DED88D351310185E6BCD1857 /* DigiCertGlobalRootCA.crt */ = {isa = PBXFileReference; includeInIndex = 1; name = DigiCertGlobalRootCA.crt; path = CleverTapSDK/DigiCertGlobalRootCA.crt; sourceTree = ""; }; - 3ECDE95653ED3EBF521D77E802776046 /* CleverTap-iOS-SDK-tvOS.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; name = "CleverTap-iOS-SDK-tvOS.modulemap"; path = "../CleverTap-iOS-SDK-tvOS/CleverTap-iOS-SDK-tvOS.modulemap"; sourceTree = ""; }; - 4233F49AA0AF6CC595606FBD1FC6DB06 /* CleverTap-iOS-SDK.podspec */ = {isa = PBXFileReference; explicitFileType = text.script.ruby; includeInIndex = 1; lastKnownFileType = text; path = "CleverTap-iOS-SDK.podspec"; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.ruby; }; + 3C860F6F466673568602392C80F1FC3D /* CleverTapInstanceConfig.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = CleverTapInstanceConfig.m; path = CleverTapSDK/CleverTapInstanceConfig.m; sourceTree = ""; }; + 3FB139938EEC7D267F6C1DC5F4650FC8 /* CTInterstitialViewController~ipad.xib */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = file.xib; path = "CTInterstitialViewController~ipad.xib"; sourceTree = ""; }; + 40D4581A4A4B7C9BDBAC171A2CC79D7F /* CTAVPlayerControlsViewController.xib */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = file.xib; path = CTAVPlayerControlsViewController.xib; sourceTree = ""; }; + 42DAD87607037825561E18A00ED625C5 /* CTCoverImageViewController.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = CTCoverImageViewController.h; sourceTree = ""; }; 436B10A9D4D322EF761627E582AD0E6B /* Pods-ObjCStarterUITests-acknowledgements.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Pods-ObjCStarterUITests-acknowledgements.plist"; sourceTree = ""; }; + 45431EA0772880AB5904391D43BF921A /* CTHeaderViewController~ipad.xib */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = file.xib; path = "CTHeaderViewController~ipad.xib"; sourceTree = ""; }; 470FF519B33DE8AECC2BEDEBAE54AF5B /* Pods-ObjCStarterTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-ObjCStarterTests.release.xcconfig"; sourceTree = ""; }; - 47631EE9479492A3346E591EA49F3F13 /* CTLocationManager.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = CTLocationManager.m; path = CleverTapSDK/CTLocationManager.m; sourceTree = ""; }; 477EB3BE3BAE603FF85D859A92B5C5B6 /* Pods-ObjCTvOS-resources.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = "Pods-ObjCTvOS-resources.sh"; sourceTree = ""; }; - 4C0ED5A580CAEA63A56F9146BBA72617 /* CTConstants.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = CTConstants.m; path = CleverTapSDK/CTConstants.m; sourceTree = ""; }; + 484888D6574B6AC25D0E4E33CA78B4DE /* CleverTapInAppNotificationDelegate.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = CleverTapInAppNotificationDelegate.h; path = CleverTapSDK/CleverTapInAppNotificationDelegate.h; sourceTree = ""; }; + 49EB62718778444E487FF6AF62CDD169 /* CTValidationResult.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = CTValidationResult.h; path = CleverTapSDK/CTValidationResult.h; sourceTree = ""; }; + 4BF77EEE06AF0E52212BE4206B451FF3 /* CTDismissButton.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = CTDismissButton.h; sourceTree = ""; }; 4C637F8CE560FD47861DC6DC8A6AC9C1 /* Pods-ObjCStarter.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = "Pods-ObjCStarter.modulemap"; sourceTree = ""; }; - 4CCE23D23ACB76F6510C05C54F533854 /* CleverTap.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = CleverTap.h; path = CleverTapSDK/CleverTap.h; sourceTree = ""; }; - 4D8AA26A1735494E601DC80F56B9412F /* CTDeviceInfo.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = CTDeviceInfo.h; path = CleverTapSDK/CTDeviceInfo.h; sourceTree = ""; }; - 4F1F32D5B355D498183AE8B616433193 /* DigiCertSHA2SecureServerCA.crt */ = {isa = PBXFileReference; includeInIndex = 1; name = DigiCertSHA2SecureServerCA.crt; path = CleverTapSDK/DigiCertSHA2SecureServerCA.crt; sourceTree = ""; }; - 501D22ACF66B2A82BE966C199198CAE6 /* CTPreferences.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = CTPreferences.m; path = CleverTapSDK/CTPreferences.m; sourceTree = ""; }; - 51794A3A22CE711794B5CDA5C08D1565 /* CTPreferences.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = CTPreferences.h; path = CleverTapSDK/CTPreferences.h; sourceTree = ""; }; + 4DD10F967555B9910D22C26C7C80730E /* CTUtils.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = CTUtils.h; path = CleverTapSDK/CTUtils.h; sourceTree = ""; }; 5262C19475FE48FAF9C88EF1DAFC0C99 /* Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - 56C24BBB26619F58DFB7F0E1841F54F8 /* Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 527BF21FF6FC41547E18EFD6A8F1305F /* DigiCertSHA2SecureServerCA.crt */ = {isa = PBXFileReference; includeInIndex = 1; name = DigiCertSHA2SecureServerCA.crt; path = CleverTapSDK/DigiCertSHA2SecureServerCA.crt; sourceTree = ""; }; + 5391BC1322843B8F86EF9763089C1B03 /* ic_shrink@2x.png */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = image.png; path = "ic_shrink@2x.png"; sourceTree = ""; }; + 551D5602237989DE6A8582739E068591 /* CTInAppNotification.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = CTInAppNotification.h; path = CleverTapSDK/CTInAppNotification.h; sourceTree = ""; }; + 56A49FBC0EFE520AC706E69F46E001CC /* CTSwizzle.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = CTSwizzle.m; path = CleverTapSDK/CTSwizzle.m; sourceTree = ""; }; + 56D478D07B27BFFFB796B200CE5B2BA2 /* CTLogger.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = CTLogger.h; path = CleverTapSDK/CTLogger.h; sourceTree = ""; }; 5728456F8BE0DEEB64054DB1C14E9B98 /* Pods_ObjCTvOS.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = Pods_ObjCTvOS.framework; path = "Pods-ObjCTvOS.framework"; sourceTree = BUILT_PRODUCTS_DIR; }; 572DBE63D5360AB71E5F80F979738FD0 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = Platforms/AppleTVOS.platform/Developer/SDKs/AppleTVOS10.2.sdk/System/Library/Frameworks/Foundation.framework; sourceTree = DEVELOPER_DIR; }; - 59462084C7E04F4769F8574724A12D55 /* CleverTapUTMDetail.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = CleverTapUTMDetail.m; path = CleverTapSDK/CleverTapUTMDetail.m; sourceTree = ""; }; 59586433960972D1F918FB8B690AF0FE /* Pods-ObjCStarterUITests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-ObjCStarterUITests.release.xcconfig"; sourceTree = ""; }; 5E40E87DAB768FDDBFC8EC12A80CD980 /* Pods-ObjCTvOS.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = "Pods-ObjCTvOS.modulemap"; sourceTree = ""; }; - 639325DB8803A3AEE14E2D7F805B96A1 /* CTDismissButton.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = CTDismissButton.h; path = CleverTapSDK/CTDismissButton.h; sourceTree = ""; }; - 63BDF9283E9E8FA5C9EAE05B850C6710 /* CleverTapTrackedViewController.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = CleverTapTrackedViewController.h; path = CleverTapSDK/CleverTapTrackedViewController.h; sourceTree = ""; }; - 646D615B9BC65FECDB0A825610E53740 /* CleverTapTrackedViewController.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = CleverTapTrackedViewController.m; path = CleverTapSDK/CleverTapTrackedViewController.m; sourceTree = ""; }; + 65026832BA761398F290AE5EA311FA55 /* CTFooterViewController.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = CTFooterViewController.m; sourceTree = ""; }; 65062A0C9E63EE868212890221C99394 /* Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - 69D749DD39B3D16B2013F75853347406 /* CTPinnedNSURLSessionDelegate.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = CTPinnedNSURLSessionDelegate.m; path = CleverTapSDK/CTPinnedNSURLSessionDelegate.m; sourceTree = ""; }; + 6581711E1296F61D5FE08D3C4DA8F3E2 /* CTHalfInterstitialImageViewController~ipad.xib */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = file.xib; path = "CTHalfInterstitialImageViewController~ipad.xib"; sourceTree = ""; }; + 668094278340A9E53DF66B11F0CD3191 /* CTCoverViewController.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = CTCoverViewController.h; sourceTree = ""; }; + 69BBF7AA271EC79F64925132ED4ECB31 /* CTAlertViewController.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = CTAlertViewController.h; sourceTree = ""; }; 6AC6BA9296B6DEC8429B07238A8ABD5C /* Pods_ObjCStarter.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = Pods_ObjCStarter.framework; path = "Pods-ObjCStarter.framework"; sourceTree = BUILT_PRODUCTS_DIR; }; - 6CE4722E30C333E5A8FADDE1D3FAAC9D /* CTLogger.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = CTLogger.m; path = CleverTapSDK/CTLogger.m; sourceTree = ""; }; - 6E52EF509E795DD83F6904925E7F9C24 /* CTCertificatePinning.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = CTCertificatePinning.m; path = CleverTapSDK/CTCertificatePinning.m; sourceTree = ""; }; - 703D1BA587AF7A9E2C82DDAADC67FB38 /* CleverTap-iOS-SDK-tvOS-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "CleverTap-iOS-SDK-tvOS-prefix.pch"; path = "../CleverTap-iOS-SDK-tvOS/CleverTap-iOS-SDK-tvOS-prefix.pch"; sourceTree = ""; }; - 729B0E94993BF08B95873A5A54DB2554 /* CTDeviceInfo.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = CTDeviceInfo.m; path = CleverTapSDK/CTDeviceInfo.m; sourceTree = ""; }; + 6AF23D75FC9BF3A5DDBB77028BC8012E /* CTFooterViewController.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = CTFooterViewController.h; sourceTree = ""; }; + 6C2E2044A2F88E9B43BF8386D047D1BF /* CTInAppResources.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = CTInAppResources.m; path = CleverTapSDK/CTInAppResources.m; sourceTree = ""; }; + 6D58B3FF37F9AFFABD98A10766BDD44D /* ic_pause@2x.png */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = image.png; path = "ic_pause@2x.png"; sourceTree = ""; }; + 6D5D76B445EF5FA681BE76EECC0109C8 /* CTInterstitialViewController~iphoneport.xib */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = file.xib; path = "CTInterstitialViewController~iphoneport.xib"; sourceTree = ""; }; + 7018F5597CE34DFCDEF5D795A2796EA9 /* FLAnimatedImage.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FLAnimatedImage.m; path = CleverTapSDK/FLAnimatedImage.m; sourceTree = ""; }; + 73D9D8A160193092345354E99A7EDC60 /* CTInAppHTMLViewController.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = CTInAppHTMLViewController.h; sourceTree = ""; }; 74ED40FB5806A783DC3A1D6D36332A13 /* Pods-ObjCStarterTests-acknowledgements.markdown */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; path = "Pods-ObjCStarterTests-acknowledgements.markdown"; sourceTree = ""; }; - 77590200341E346BF3FC105D215BDDF7 /* CTProfileBuilder.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = CTProfileBuilder.m; path = CleverTapSDK/CTProfileBuilder.m; sourceTree = ""; }; - 7E503BE6D6E8440104353881FECC1BBC /* CleverTap-iOS-SDK-tvOS.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "CleverTap-iOS-SDK-tvOS.xcconfig"; path = "../CleverTap-iOS-SDK-tvOS/CleverTap-iOS-SDK-tvOS.xcconfig"; sourceTree = ""; }; + 758F33C54F35570FC766C43728CE7B46 /* FLAnimatedImageView.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FLAnimatedImageView.h; path = CleverTapSDK/FLAnimatedImageView.h; sourceTree = ""; }; + 78FED9B66DB201853EE7677DFF389D7B /* CTCoverViewController~iphoneport.xib */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = file.xib; path = "CTCoverViewController~iphoneport.xib"; sourceTree = ""; }; + 7A897B06A248522C3F268A4BD2C9F8D6 /* CleverTap-iOS-SDK-tvOS.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "CleverTap-iOS-SDK-tvOS.xcconfig"; path = "../CleverTap-iOS-SDK-tvOS/CleverTap-iOS-SDK-tvOS.xcconfig"; sourceTree = ""; }; + 7BB62C49A14987C6FC89120F7AB770A9 /* CTInAppUtils.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = CTInAppUtils.m; path = CleverTapSDK/CTInAppUtils.m; sourceTree = ""; }; 7FC805B3EF57A8B6D6CDB67AFD0C9ACF /* Pods-ObjCStarterTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-ObjCStarterTests.debug.xcconfig"; sourceTree = ""; }; + 800826EF4ADF3BB9D82B24E88C91E0DC /* CTAVPlayerViewController.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = CTAVPlayerViewController.h; sourceTree = ""; }; + 8107BA1260CE21C0A21F8119FC0D8095 /* CleverTap-iOS-SDK-iOS.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "CleverTap-iOS-SDK-iOS.xcconfig"; sourceTree = ""; }; + 835627291937792A21124FD4AB4A18DC /* CleverTapEventDetail.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = CleverTapEventDetail.m; path = CleverTapSDK/CleverTapEventDetail.m; sourceTree = ""; }; + 83CE8F87209C65D9F5AB52176593AFBD /* CTCoverImageViewController.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = CTCoverImageViewController.m; sourceTree = ""; }; + 84280E78531213F9B2AD7DC3250D3CA7 /* CTFooterViewController~iphoneport.xib */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = file.xib; path = "CTFooterViewController~iphoneport.xib"; sourceTree = ""; }; + 8494992EC4204CD25669D9D750A6960D /* CTUriHelper.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = CTUriHelper.h; path = CleverTapSDK/CTUriHelper.h; sourceTree = ""; }; 84CC5217460F12390416A1E084F38F08 /* Pods-ObjCTvOS.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-ObjCTvOS.release.xcconfig"; sourceTree = ""; }; - 850DBA2917DC5D9056276B4AA92DE843 /* CTInAppUtils.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = CTInAppUtils.m; path = CleverTapSDK/CTInAppUtils.m; sourceTree = ""; }; + 85CF1030F7DEE65B04947F6E7C0B51CC /* CTAVPlayerViewController.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = CTAVPlayerViewController.m; sourceTree = ""; }; 88FD612A1F066AC7DFF25A41473B5FD3 /* Pods-ObjCTvOS-acknowledgements.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Pods-ObjCTvOS-acknowledgements.plist"; sourceTree = ""; }; + 8AD3460503203660A1D872CC947CC2F2 /* CleverTap-iOS-SDK-iOS-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "CleverTap-iOS-SDK-iOS-umbrella.h"; sourceTree = ""; }; + 8BD0FDCE50661AA79B4A851D8A873663 /* CleverTapUTMDetail.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = CleverTapUTMDetail.h; path = CleverTapSDK/CleverTapUTMDetail.h; sourceTree = ""; }; + 8DFD1499A9C6494C71D55AFB666C110A /* CleverTap-iOS-SDK-iOS-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "CleverTap-iOS-SDK-iOS-dummy.m"; sourceTree = ""; }; 8ED676D1C38125A06E12257A1D0E9D6D /* Pods-ObjCStarter-frameworks.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = "Pods-ObjCStarter-frameworks.sh"; sourceTree = ""; }; - 8EDC42319924402E70B4EB184DE336A1 /* CTValidator.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = CTValidator.h; path = CleverTapSDK/CTValidator.h; sourceTree = ""; }; - 8F569C3501AF97E8E65D4966A315D7B1 /* CTEventBuilder.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = CTEventBuilder.m; path = CleverTapSDK/CTEventBuilder.m; sourceTree = ""; }; - 8F6ECD2BE49C4D4CAE10650C788F33CD /* CleverTap-iOS-SDK-tvOS-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "CleverTap-iOS-SDK-tvOS-umbrella.h"; path = "../CleverTap-iOS-SDK-tvOS/CleverTap-iOS-SDK-tvOS-umbrella.h"; sourceTree = ""; }; + 8F73014FC6D0633BC655951F07E5E015 /* CTHalfInterstitialViewController.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = CTHalfInterstitialViewController.m; sourceTree = ""; }; + 92F5FD5B43281CD40EDFDDE0BFE50E9B /* CTAVPlayerControlsViewController.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = CTAVPlayerControlsViewController.m; sourceTree = ""; }; + 931955FA97D3AD073FDC034F68777212 /* CTLocalDataStore.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = CTLocalDataStore.h; path = CleverTapSDK/CTLocalDataStore.h; sourceTree = ""; }; 93A4A3777CF96A4AAC1D13BA6DCCEA73 /* Podfile */ = {isa = PBXFileReference; explicitFileType = text.script.ruby; includeInIndex = 1; lastKnownFileType = text; name = Podfile; path = ../Podfile; sourceTree = SOURCE_ROOT; xcLanguageSpecificationIdentifier = xcode.lang.ruby; }; + 94807550BD47C9E4AAD8B075C0E3C5B2 /* ic_pause@3x.png */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = image.png; path = "ic_pause@3x.png"; sourceTree = ""; }; 957B8D09156900E78EF3EB06F4017FF6 /* Pods-ObjCStarterUITests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-ObjCStarterUITests.debug.xcconfig"; sourceTree = ""; }; - 963EBF5C91F6EA2D7528D028B1CE29B7 /* CleverTapEventDetail.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = CleverTapEventDetail.m; path = CleverTapSDK/CleverTapEventDetail.m; sourceTree = ""; }; + 965306BE46850E4476C1EA58AB08EED7 /* CTUriHelper.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = CTUriHelper.m; path = CleverTapSDK/CTUriHelper.m; sourceTree = ""; }; + 9695D83BF46B823360ACAF210134EC68 /* CTSwizzle.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = CTSwizzle.h; path = CleverTapSDK/CTSwizzle.h; sourceTree = ""; }; 969DC1FB9B3A86BCDCE799B3C7529588 /* CleverTapSDK.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = CleverTapSDK.framework; path = "CleverTap-iOS-SDK-tvOS.framework"; sourceTree = BUILT_PRODUCTS_DIR; }; - 96FA7F8F9A1080D8AA7A4254743B7A1F /* CleverTap-iOS-SDK-iOS.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "CleverTap-iOS-SDK-iOS.xcconfig"; sourceTree = ""; }; + 96B0A82CBC7A95E64224EE63100BAF63 /* CTSlider.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = CTSlider.h; sourceTree = ""; }; 9754D8995F8E12C0969DEA754F217585 /* Pods-ObjCTvOS-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Pods-ObjCTvOS-umbrella.h"; sourceTree = ""; }; - 97930524EE3D19339865725DE83F96CE /* CTSwizzle.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = CTSwizzle.h; path = CleverTapSDK/CTSwizzle.h; sourceTree = ""; }; - 97ACCF6EED3EE851EEFF4C291CB3AF24 /* CTInAppNotification.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = CTInAppNotification.h; path = CleverTapSDK/CTInAppNotification.h; sourceTree = ""; }; + 981824D917EE4453413334C02C4F2168 /* CTInterstitialImageViewController.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = CTInterstitialImageViewController.m; sourceTree = ""; }; + 9870D51A47AC79E23EA87DC4A00244DC /* FLAnimatedImage.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FLAnimatedImage.h; path = CleverTapSDK/FLAnimatedImage.h; sourceTree = ""; }; 98EC1FDA275DE9B338CCEBF65A2675FD /* Pods-ObjCTvOS.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-ObjCTvOS.debug.xcconfig"; sourceTree = ""; }; - 9A8FD5E5181EA2EE244121730F9C7666 /* CleverTapEventDetail.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = CleverTapEventDetail.h; path = CleverTapSDK/CleverTapEventDetail.h; sourceTree = ""; }; - 9A930523BB28D25AB16BACE947B1979C /* CleverTapUTMDetail.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = CleverTapUTMDetail.h; path = CleverTapSDK/CleverTapUTMDetail.h; sourceTree = ""; }; - 9BF3DA18F0CECB3E18ED486A49CAFDEB /* CTInAppFCManager.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = CTInAppFCManager.h; path = CleverTapSDK/CTInAppFCManager.h; sourceTree = ""; }; + 995A6677E2991BD72791806C4F9A7FBC /* CTBaseHeaderFooterViewController.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = CTBaseHeaderFooterViewController.h; sourceTree = ""; }; + 9971A335A4996920FB8B3F4FD0850409 /* CTInterstitialImageViewController~ipad.xib */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = file.xib; path = "CTInterstitialImageViewController~ipad.xib"; sourceTree = ""; }; + 9DB788D44D5BCD075138EB1CA016168A /* ic_thumb.png */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = image.png; path = ic_thumb.png; sourceTree = ""; }; + A0614CA4BC8D032872F1843DEC4BCFFD /* CleverTapUTMDetail.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = CleverTapUTMDetail.m; path = CleverTapSDK/CleverTapUTMDetail.m; sourceTree = ""; }; A08E40B08FB94338A35A298AB9437ABF /* Pods-ObjCStarterTests-acknowledgements.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Pods-ObjCStarterTests-acknowledgements.plist"; sourceTree = ""; }; + A36E887DC0B59FF9A9EE45D0E549E860 /* CTLocationManager.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = CTLocationManager.h; path = CleverTapSDK/CTLocationManager.h; sourceTree = ""; }; A4AB3B9AA88EB1B325426DBDFF72245F /* Pods-ObjCStarter.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-ObjCStarter.release.xcconfig"; sourceTree = ""; }; - A4C8FA6B0477CB80281C2AE55279768F /* CTInAppUtils.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = CTInAppUtils.h; path = CleverTapSDK/CTInAppUtils.h; sourceTree = ""; }; - A5EACC1686FBE138806D4FF34D0FD8E0 /* CTInAppDisplayViewController.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = CTInAppDisplayViewController.h; path = CleverTapSDK/CTInAppDisplayViewController.h; sourceTree = ""; }; A82DF58913D09EA39E314E1A24E023BE /* Pods_ObjCStarterUITests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = Pods_ObjCStarterUITests.framework; path = "Pods-ObjCStarterUITests.framework"; sourceTree = BUILT_PRODUCTS_DIR; }; + A8616DCF6DA7AC23DBA8AF14034CC2B8 /* CTInAppHTMLViewController.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = CTInAppHTMLViewController.m; sourceTree = ""; }; + A86E965C038024D41C727BCF7FF3A4A0 /* ic_play@1x.png */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = image.png; path = "ic_play@1x.png"; sourceTree = ""; }; + A8E6B9FAC29A5B3553FCAFDA211AC2AC /* ic_shrink@3x.png */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = image.png; path = "ic_shrink@3x.png"; sourceTree = ""; }; A8E785FF67399CF72809B3F3425D3D2E /* Pods-ObjCTvOS-acknowledgements.markdown */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; path = "Pods-ObjCTvOS-acknowledgements.markdown"; sourceTree = ""; }; - AD862D8CC6FDBE7AF873BBD44C103489 /* CTUriHelper.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = CTUriHelper.m; path = CleverTapSDK/CTUriHelper.m; sourceTree = ""; }; + AAF60C279F13F1DB3A95FC743422A730 /* CTNotificationButton.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = CTNotificationButton.h; path = CleverTapSDK/CTNotificationButton.h; sourceTree = ""; }; + AD7CCAF8E73FA20B1585DF553A57C5A2 /* CTHalfInterstitialImageViewController.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = CTHalfInterstitialImageViewController.m; sourceTree = ""; }; AE6F7EB591E639FE72498BF798ACBC33 /* Pods-ObjCStarter-acknowledgements.markdown */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; path = "Pods-ObjCStarter-acknowledgements.markdown"; sourceTree = ""; }; AEEBD51F70E3334C5E426C9E4044817F /* Pods-ObjCStarterTests.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = "Pods-ObjCStarterTests.modulemap"; sourceTree = ""; }; - AF494C58C071ED207A181EB7D44D8BB6 /* CleverTapInstanceConfig.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = CleverTapInstanceConfig.h; path = CleverTapSDK/CleverTapInstanceConfig.h; sourceTree = ""; }; - B0B31B4E8E2A3A32CF576BA255441DA5 /* CleverTapBuildInfo.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = CleverTapBuildInfo.h; path = CleverTapSDK/CleverTapBuildInfo.h; sourceTree = ""; }; - B245513B6CFF684B16E20B5A8AD3834C /* CleverTap-iOS-SDK-iOS-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "CleverTap-iOS-SDK-iOS-dummy.m"; sourceTree = ""; }; - B348031FEFB1EA79566F0D55DE15B182 /* CTUriHelper.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = CTUriHelper.h; path = CleverTapSDK/CTUriHelper.h; sourceTree = ""; }; + AEFD8562C8F427EFCDC8B819A95AD639 /* CTInterstitialViewController.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = CTInterstitialViewController.m; sourceTree = ""; }; + B065E877EA908F82722367DFDA6884DC /* CTInterstitialViewController.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = CTInterstitialViewController.h; sourceTree = ""; }; + B1F79A33FCF950B21A4C5F785FBF7247 /* CTHeaderViewController.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = CTHeaderViewController.m; sourceTree = ""; }; B4876E7721DB180A91E5745910167A85 /* Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; B4D611C05564FC805FE95EB91A4D924B /* Pods-ObjCStarterUITests-acknowledgements.markdown */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; path = "Pods-ObjCStarterUITests-acknowledgements.markdown"; sourceTree = ""; }; + B4E9FCC817D4B3B2AD7F2014AFD1E4EB /* CTPinnedNSURLSessionDelegate.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = CTPinnedNSURLSessionDelegate.h; path = CleverTapSDK/CTPinnedNSURLSessionDelegate.h; sourceTree = ""; }; + B578D16CCCC441532AF206BA826DEAE6 /* CleverTap-iOS-SDK-tvOS-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "CleverTap-iOS-SDK-tvOS-prefix.pch"; path = "../CleverTap-iOS-SDK-tvOS/CleverTap-iOS-SDK-tvOS-prefix.pch"; sourceTree = ""; }; + B58A26B633EB1902650D41D076C55DA9 /* CTEventBuilder.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = CTEventBuilder.h; path = CleverTapSDK/CTEventBuilder.h; sourceTree = ""; }; + B70AE09F30139285706D87B96B514D7F /* CTInAppFCManager.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = CTInAppFCManager.h; path = CleverTapSDK/CTInAppFCManager.h; sourceTree = ""; }; + B7539C9A641D878ACA3BA5CE9E8E935F /* CleverTap.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = CleverTap.m; path = CleverTapSDK/CleverTap.m; sourceTree = ""; }; B7B0A7CCD29C486E423A4E853484CFA8 /* Pods-ObjCStarterTests-frameworks.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = "Pods-ObjCStarterTests-frameworks.sh"; sourceTree = ""; }; - BA2A4793D7FCFC13CE798ABB45E5D326 /* CTUtils.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = CTUtils.h; path = CleverTapSDK/CTUtils.h; sourceTree = ""; }; - BD4449C0B5C27D2AD66111F894764B75 /* CTLocalDataStore.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = CTLocalDataStore.h; path = CleverTapSDK/CTLocalDataStore.h; sourceTree = ""; }; - BE5235CD66480A1FF23623B50273F8EE /* CleverTap+SSLPinning.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "CleverTap+SSLPinning.h"; path = "CleverTapSDK/CleverTap+SSLPinning.h"; sourceTree = ""; }; - C789D3F7D1871F098BBA2039D49C2863 /* CTProfileBuilder.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = CTProfileBuilder.h; path = CleverTapSDK/CTProfileBuilder.h; sourceTree = ""; }; - C9348135E640B69B3CA9227C26CADDF4 /* CTPinnedNSURLSessionDelegate.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = CTPinnedNSURLSessionDelegate.h; path = CleverTapSDK/CTPinnedNSURLSessionDelegate.h; sourceTree = ""; }; - CCCBB314EACC41F011F0265E7D043A34 /* CTInAppNotification.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = CTInAppNotification.m; path = CleverTapSDK/CTInAppNotification.m; sourceTree = ""; }; - CCDC6232B4591787A62D0E8D6A8EC0E3 /* CTKnownProfileFields.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = CTKnownProfileFields.m; path = CleverTapSDK/CTKnownProfileFields.m; sourceTree = ""; }; - CD1AF2425B398594084683B46E53C832 /* CTCertificatePinning.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = CTCertificatePinning.h; path = CleverTapSDK/CTCertificatePinning.h; sourceTree = ""; }; + BB9F312E74BF39FF075418DA1A21B000 /* CleverTapBuildInfo.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = CleverTapBuildInfo.h; path = CleverTapSDK/CleverTapBuildInfo.h; sourceTree = ""; }; + BBB849FB0102D7377F6D65E8015C997C /* CTKnownProfileFields.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = CTKnownProfileFields.h; path = CleverTapSDK/CTKnownProfileFields.h; sourceTree = ""; }; + BCC5282D081707857B3A015F9A462C3E /* CTLocationManager.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = CTLocationManager.m; path = CleverTapSDK/CTLocationManager.m; sourceTree = ""; }; + BD6775DF39FF68998363AF544CCF19DC /* CleverTapTrackedViewController.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = CleverTapTrackedViewController.m; path = CleverTapSDK/CleverTapTrackedViewController.m; sourceTree = ""; }; + BE4FF7D92BDF0E1D568D53C65596AF89 /* CleverTap-iOS-SDK-tvOS-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "CleverTap-iOS-SDK-tvOS-dummy.m"; path = "../CleverTap-iOS-SDK-tvOS/CleverTap-iOS-SDK-tvOS-dummy.m"; sourceTree = ""; }; + C010200A8014573D94479818B25785F4 /* CTCertificatePinning.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = CTCertificatePinning.h; path = CleverTapSDK/CTCertificatePinning.h; sourceTree = ""; }; + C3C975F4DF130B3E7F3A719BA6189696 /* CTConstants.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = CTConstants.m; path = CleverTapSDK/CTConstants.m; sourceTree = ""; }; + C57C9D71D6FF3E199EE0CA62BD69D596 /* CTCoverImageViewController~ipad.xib */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = file.xib; path = "CTCoverImageViewController~ipad.xib"; sourceTree = ""; }; + C71FD0730A6C95382CAEAE8EA6D6C075 /* CleverTap.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = CleverTap.h; path = CleverTapSDK/CleverTap.h; sourceTree = ""; }; + CC5D0B8692C53314758FCF655C9DA029 /* CTInAppNotification.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = CTInAppNotification.m; path = CleverTapSDK/CTInAppNotification.m; sourceTree = ""; }; + CCB8B1BFEA8A95724A14FE93EE0E0778 /* CTInAppDisplayViewController.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = CTInAppDisplayViewController.m; path = CleverTapSDK/CTInAppDisplayViewController.m; sourceTree = ""; }; + CDE6846D50B94A5F6CD61BC0AAAFBF8D /* ic_shrink@1x.png */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = image.png; path = "ic_shrink@1x.png"; sourceTree = ""; }; + CE834314A265333D84FD03B767B6DD42 /* CTHalfInterstitialViewController.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = CTHalfInterstitialViewController.h; sourceTree = ""; }; + CEF1718498368EF535C233136C98D138 /* CTSlider.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = CTSlider.m; sourceTree = ""; }; + D0AA251E8D333CA7A8821F8ED025E60D /* ic_expand@3x.png */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = image.png; path = "ic_expand@3x.png"; sourceTree = ""; }; + D2D3A8C820C331705A297AE9F3B31537 /* CTDismissButton.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = CTDismissButton.m; sourceTree = ""; }; + D543C5BF50378C1B8A23F6976D478067 /* CTInAppResources.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = CTInAppResources.h; path = CleverTapSDK/CTInAppResources.h; sourceTree = ""; }; + D5A9DC6C6A7FDC1F1B96185ABE022098 /* CTFooterViewController~ipad.xib */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = file.xib; path = "CTFooterViewController~ipad.xib"; sourceTree = ""; }; + D61F229BD7097404A09463DBF6F7EBC0 /* ic_pause@1x.png */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = image.png; path = "ic_pause@1x.png"; sourceTree = ""; }; D711D2A6369B55CBAD14B9E0BF8F1B2D /* Pods-ObjCStarter-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Pods-ObjCStarter-dummy.m"; sourceTree = ""; }; - D87C4FEA24B9F4CB8E5D386C7CE6251E /* CTEventBuilder.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = CTEventBuilder.h; path = CleverTapSDK/CTEventBuilder.h; sourceTree = ""; }; + D73DFF5E5060F0EA01EED6CCFA97DB4E /* CTInterstitialImageViewController.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = CTInterstitialImageViewController.h; sourceTree = ""; }; + D7BC8D68CD0E1295BCE67A4EAC94CB11 /* CleverTap-iOS-SDK-tvOS-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "CleverTap-iOS-SDK-tvOS-umbrella.h"; path = "../CleverTap-iOS-SDK-tvOS/CleverTap-iOS-SDK-tvOS-umbrella.h"; sourceTree = ""; }; D8C560BD9B4A139571369CEA5F65CDE4 /* Pods-ObjCStarterUITests-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Pods-ObjCStarterUITests-dummy.m"; sourceTree = ""; }; - DBD8453DE4991F5994725DF4DDEAE275 /* CleverTap-iOS-SDK-iOS-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "CleverTap-iOS-SDK-iOS-umbrella.h"; sourceTree = ""; }; - E0C00A606A2590B73F04B937EAA81178 /* CleverTapInAppNotificationDelegate.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = CleverTapInAppNotificationDelegate.h; path = CleverTapSDK/CleverTapInAppNotificationDelegate.h; sourceTree = ""; }; + D8D7C44097D696CEE74C43DFE1AD4D9F /* CTConstants.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = CTConstants.h; path = CleverTapSDK/CTConstants.h; sourceTree = ""; }; + DB84FB167B0C3E3F9F4C645511833153 /* CleverTapInstanceConfig.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = CleverTapInstanceConfig.h; path = CleverTapSDK/CleverTapInstanceConfig.h; sourceTree = ""; }; + DC19136B0C1E4689553A5D390651A66E /* CTUtils.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = CTUtils.m; path = CleverTapSDK/CTUtils.m; sourceTree = ""; }; + DC1A354B989FD32E783116138E5A68B4 /* CTPreferences.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = CTPreferences.m; path = CleverTapSDK/CTPreferences.m; sourceTree = ""; }; + DD445C34E2FFBDBD55D11E062BCABEC7 /* CleverTapSyncDelegate.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = CleverTapSyncDelegate.h; path = CleverTapSDK/CleverTapSyncDelegate.h; sourceTree = ""; }; + DDDA4431D593E23534E0F0B9529763D4 /* CTDeviceInfo.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = CTDeviceInfo.m; path = CleverTapSDK/CTDeviceInfo.m; sourceTree = ""; }; + DDEA93B4380A7DB3FE36D04CAD3CE4BD /* CTCoverImageViewController~iphoneport.xib */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = file.xib; path = "CTCoverImageViewController~iphoneport.xib"; sourceTree = ""; }; + DF0EE0328A03BDB05173DA3C27AF9638 /* CTBaseHeaderFooterViewController.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = CTBaseHeaderFooterViewController.m; sourceTree = ""; }; + E069B9D9C5E39F08226BD77D7ADFACC7 /* CTValidationResult.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = CTValidationResult.m; path = CleverTapSDK/CTValidationResult.m; sourceTree = ""; }; + E09FE9E56679DE709F6B24480C23EE1D /* CTCertificatePinning.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = CTCertificatePinning.m; path = CleverTapSDK/CTCertificatePinning.m; sourceTree = ""; }; + E1AE0962382D63E3BD800F113259D28A /* ic_play@2x.png */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = image.png; path = "ic_play@2x.png"; sourceTree = ""; }; + E47022E886F10A61A9610F5B4BF81135 /* CTPreferences.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = CTPreferences.h; path = CleverTapSDK/CTPreferences.h; sourceTree = ""; }; + E4B52C105964295DFD36A013FD29A697 /* CTPlistInfo.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = CTPlistInfo.m; path = CleverTapSDK/CTPlistInfo.m; sourceTree = ""; }; E5E604C1E447C1A011859B32CEAEA968 /* Pods_ObjCStarterTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = Pods_ObjCStarterTests.framework; path = "Pods-ObjCStarterTests.framework"; sourceTree = BUILT_PRODUCTS_DIR; }; - E7A3113809CF827418939E59F8810F7F /* CTConstants.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = CTConstants.h; path = CleverTapSDK/CTConstants.h; sourceTree = ""; }; - E919357EDC1A7A4EA54D9D065038D53E /* CTPlistInfo.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = CTPlistInfo.m; path = CleverTapSDK/CTPlistInfo.m; sourceTree = ""; }; - EE2C815B70A0C03AADDC8DC9E5344C75 /* CleverTapInstanceConfigPrivate.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = CleverTapInstanceConfigPrivate.h; path = CleverTapSDK/CleverTapInstanceConfigPrivate.h; sourceTree = ""; }; - F05E9E3E67196CBCD176D2951D6ED70C /* CleverTap-iOS-SDK-tvOS-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "CleverTap-iOS-SDK-tvOS-dummy.m"; path = "../CleverTap-iOS-SDK-tvOS/CleverTap-iOS-SDK-tvOS-dummy.m"; sourceTree = ""; }; - F39F164DB168FD4CD6A4908C4B715EB9 /* CTInAppDisplayViewControllerPrivate.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = CTInAppDisplayViewControllerPrivate.h; path = CleverTapSDK/CTInAppDisplayViewControllerPrivate.h; sourceTree = ""; }; - F733563AAC6D9A040A2B545A5C716EB5 /* CTLocationManager.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = CTLocationManager.h; path = CleverTapSDK/CTLocationManager.h; sourceTree = ""; }; + E7B097A182A433F871E63ED6A8A53E52 /* CTPlistInfo.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = CTPlistInfo.h; path = CleverTapSDK/CTPlistInfo.h; sourceTree = ""; }; + EADC96D6503F757AEEA9575AC91837F4 /* CleverTapEventDetail.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = CleverTapEventDetail.h; path = CleverTapSDK/CleverTapEventDetail.h; sourceTree = ""; }; + EC9C697FCA78C0EC2162488EF7230820 /* DigiCertGlobalRootCA.crt */ = {isa = PBXFileReference; includeInIndex = 1; name = DigiCertGlobalRootCA.crt; path = CleverTapSDK/DigiCertGlobalRootCA.crt; sourceTree = ""; }; + ED99091080FADDCF718061EC1F67E53D /* CTNotificationButton.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = CTNotificationButton.m; path = CleverTapSDK/CTNotificationButton.m; sourceTree = ""; }; + EE74DE7CE2CAEF199A4F2E736B5444D6 /* FLAnimatedImageView.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FLAnimatedImageView.m; path = CleverTapSDK/FLAnimatedImageView.m; sourceTree = ""; }; + F100E1C83B1EB518F65C86C210AA68B8 /* CTHeaderViewController~iphoneport.xib */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = file.xib; path = "CTHeaderViewController~iphoneport.xib"; sourceTree = ""; }; + F1F213F4BB19D9B0BD3EE682DE52570E /* CTHeaderViewController.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = CTHeaderViewController.h; sourceTree = ""; }; + F2E38FED1F744E4A2B8D59E388D2FFD3 /* CleverTap+SSLPinning.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "CleverTap+SSLPinning.h"; path = "CleverTapSDK/CleverTap+SSLPinning.h"; sourceTree = ""; }; + F70EC8312DD7BF3115BF22DF3BF8202C /* CTCoverViewController~ipad.xib */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = file.xib; path = "CTCoverViewController~ipad.xib"; sourceTree = ""; }; F7A713B39951B16C13623949106C37BD /* Pods-ObjCStarterUITests.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = "Pods-ObjCStarterUITests.modulemap"; sourceTree = ""; }; + F95BDEE1CDAAF02059A8F66E87A1A34D /* CTAVPlayerControlsViewController.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = CTAVPlayerControlsViewController.h; sourceTree = ""; }; + F9A6CF69AE466F2A779ACF83EDBE1AE0 /* CTInAppFCManager.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = CTInAppFCManager.m; path = CleverTapSDK/CTInAppFCManager.m; sourceTree = ""; }; + FA50D8E5A8C18EBA0CE4DF069730B2DE /* ic_expand@2x.png */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = image.png; path = "ic_expand@2x.png"; sourceTree = ""; }; FAA418D7D4BFA30C6EEDB1FA24028A1A /* Pods-ObjCStarterTests-resources.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = "Pods-ObjCStarterTests-resources.sh"; sourceTree = ""; }; FBC5915F32DE4E5C1640B391D3C8E2EC /* Pods-ObjCStarterUITests-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Pods-ObjCStarterUITests-umbrella.h"; sourceTree = ""; }; FCA06466C846332DA5637FCCC5045009 /* Pods-ObjCStarter.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-ObjCStarter.debug.xcconfig"; sourceTree = ""; }; - FEAAD18188F20412C606B38176BF2F07 /* CTLogger.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = CTLogger.h; path = CleverTapSDK/CTLogger.h; sourceTree = ""; }; + FDA9A742205E3C9BFDEB898D3CBE3D62 /* CTDeviceInfo.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = CTDeviceInfo.h; path = CleverTapSDK/CTDeviceInfo.h; sourceTree = ""; }; FEF6550C1E58242F54E9AF428E8D61E2 /* Pods-ObjCStarterUITests-resources.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = "Pods-ObjCStarterUITests-resources.sh"; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ - 51293121EF415CF74E27C448B048DFD9 /* Frameworks */ = { + 2E7F868D17C05D84C8D1A165CE4AF7E3 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 11730CA73EC917C5DCA49F9142B88485 /* Foundation.framework in Frameworks */, + C306725BFF8BED527CAF9C5DF347582B /* Foundation.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; - 7587BCB4E2F1F4E54CEC0E6AE8D2CC0B /* Frameworks */ = { + 3593A6AF19A3064BA50B0246A9E14B5A /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 6C8849990CCE3884DF490E57906F28CE /* Foundation.framework in Frameworks */, + 2BD81FEB113E79A5B2AC42FBA78BC581 /* Foundation.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; - 91255518CD17795FA38A551F8701B924 /* Frameworks */ = { + 7587BCB4E2F1F4E54CEC0E6AE8D2CC0B /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 4AAB1998FDD2C1A3A045AAE63DF6CC74 /* Foundation.framework in Frameworks */, + 6C8849990CCE3884DF490E57906F28CE /* Foundation.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; - 988ACE4717A22762C71CCD03D9C2FD4E /* Frameworks */ = { + 91255518CD17795FA38A551F8701B924 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - AA697D7F464E8CA206344CE492F32374 /* Foundation.framework in Frameworks */, + 4AAB1998FDD2C1A3A045AAE63DF6CC74 /* Foundation.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; - A437269C5189FD744F5BCAAD8B89817C /* Frameworks */ = { + 988ACE4717A22762C71CCD03D9C2FD4E /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - E81B5E49285FCF95FAA10CE5E4F35595 /* Foundation.framework in Frameworks */, + AA697D7F464E8CA206344CE492F32374 /* Foundation.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -402,33 +540,30 @@ name = tvOS; sourceTree = ""; }; - 2F15650E41E344525BC1ABFAA833A51C /* Resources */ = { - isa = PBXGroup; - children = ( - 3CC67043DED88D351310185E6BCD1857 /* DigiCertGlobalRootCA.crt */, - 4F1F32D5B355D498183AE8B616433193 /* DigiCertSHA2SecureServerCA.crt */, - ); - name = Resources; - sourceTree = ""; - }; - 350193BBB88BA7D01567238C4930B163 /* Support Files */ = { + 22A8F03AFCC2E17A3CEC6EF1ED73F9C9 /* InApps */ = { isa = PBXGroup; children = ( - 3BDBA3C0069913E7D76111DB4FCA8430 /* CleverTap-iOS-SDK-iOS.modulemap */, - 96FA7F8F9A1080D8AA7A4254743B7A1F /* CleverTap-iOS-SDK-iOS.xcconfig */, - B245513B6CFF684B16E20B5A8AD3834C /* CleverTap-iOS-SDK-iOS-dummy.m */, - 2E67239CA03C869B404DFF7F92FA1030 /* CleverTap-iOS-SDK-iOS-prefix.pch */, - DBD8453DE4991F5994725DF4DDEAE275 /* CleverTap-iOS-SDK-iOS-umbrella.h */, - 3ECDE95653ED3EBF521D77E802776046 /* CleverTap-iOS-SDK-tvOS.modulemap */, - 7E503BE6D6E8440104353881FECC1BBC /* CleverTap-iOS-SDK-tvOS.xcconfig */, - F05E9E3E67196CBCD176D2951D6ED70C /* CleverTap-iOS-SDK-tvOS-dummy.m */, - 703D1BA587AF7A9E2C82DDAADC67FB38 /* CleverTap-iOS-SDK-tvOS-prefix.pch */, - 8F6ECD2BE49C4D4CAE10650C788F33CD /* CleverTap-iOS-SDK-tvOS-umbrella.h */, - 56C24BBB26619F58DFB7F0E1841F54F8 /* Info.plist */, - 1AF104A73F5822FB29F9D0ECB5B7458A /* Info.plist */, + 40D4581A4A4B7C9BDBAC171A2CC79D7F /* CTAVPlayerControlsViewController.xib */, + C57C9D71D6FF3E199EE0CA62BD69D596 /* CTCoverImageViewController~ipad.xib */, + DDEA93B4380A7DB3FE36D04CAD3CE4BD /* CTCoverImageViewController~iphoneport.xib */, + F70EC8312DD7BF3115BF22DF3BF8202C /* CTCoverViewController~ipad.xib */, + 78FED9B66DB201853EE7677DFF389D7B /* CTCoverViewController~iphoneport.xib */, + D5A9DC6C6A7FDC1F1B96185ABE022098 /* CTFooterViewController~ipad.xib */, + 84280E78531213F9B2AD7DC3250D3CA7 /* CTFooterViewController~iphoneport.xib */, + 6581711E1296F61D5FE08D3C4DA8F3E2 /* CTHalfInterstitialImageViewController~ipad.xib */, + 0A4ABE1ED3A0E08A57B676413A390C69 /* CTHalfInterstitialImageViewController~iphoneport.xib */, + 0325EA533BD6E64A4EC350006AAACA37 /* CTHalfInterstitialViewController~ipad.xib */, + 25C38BB213F87B747D1E560F459247C1 /* CTHalfInterstitialViewController~iphoneport.xib */, + 45431EA0772880AB5904391D43BF921A /* CTHeaderViewController~ipad.xib */, + F100E1C83B1EB518F65C86C210AA68B8 /* CTHeaderViewController~iphoneport.xib */, + 9971A335A4996920FB8B3F4FD0850409 /* CTInterstitialImageViewController~ipad.xib */, + 1D4376416EE1471177BC486DA96D512E /* CTInterstitialImageViewController~iphoneport.xib */, + 3FB139938EEC7D267F6C1DC5F4650FC8 /* CTInterstitialViewController~ipad.xib */, + 6D5D76B445EF5FA681BE76EECC0109C8 /* CTInterstitialViewController~iphoneport.xib */, + D284672B40CF76460C2E62D3B796FA29 /* images */, ); - name = "Support Files"; - path = "ObjCStarter/Pods/Target Support Files/CleverTap-iOS-SDK-iOS"; + name = InApps; + path = CleverTapSDK/InApps; sourceTree = ""; }; 427155A2DD9656E37EC6B13D9B6F120C /* Products */ = { @@ -462,6 +597,14 @@ path = "Target Support Files/Pods-ObjCStarter"; sourceTree = ""; }; + 4E91D3588D6469F41D1C0EAE71EC62E8 /* Pod */ = { + isa = PBXGroup; + children = ( + 0A5EEB21D9290E778E5062E11A51EF16 /* CleverTap-iOS-SDK.podspec */, + ); + name = Pod; + sourceTree = ""; + }; 58996781A54EE964D7111D73083A18A5 /* iOS */ = { isa = PBXGroup; children = ( @@ -474,7 +617,7 @@ isa = PBXGroup; children = ( 93A4A3777CF96A4AAC1D13BA6DCCEA73 /* Podfile */, - DD0D0ED2401A36E380CBE4CB13F22407 /* Development Pods */, + A2B5CAD5091EF0D36C2777C635DA8EF4 /* Development Pods */, A42F72DC1D780481325DD00969B19BB6 /* Frameworks */, 427155A2DD9656E37EC6B13D9B6F120C /* Products */, 0F1AAA91B6F7DA0268497F3F77589AA5 /* Targets Support Files */, @@ -499,6 +642,53 @@ path = "Target Support Files/Pods-ObjCStarterTests"; sourceTree = ""; }; + 8DA65038CAEB0F8F9E89F2FA64CFBA16 /* InApps */ = { + isa = PBXGroup; + children = ( + 69BBF7AA271EC79F64925132ED4ECB31 /* CTAlertViewController.h */, + 0840C9BDE124A93F680EC32D84FB6B2A /* CTAlertViewController.m */, + F95BDEE1CDAAF02059A8F66E87A1A34D /* CTAVPlayerControlsViewController.h */, + 92F5FD5B43281CD40EDFDDE0BFE50E9B /* CTAVPlayerControlsViewController.m */, + 800826EF4ADF3BB9D82B24E88C91E0DC /* CTAVPlayerViewController.h */, + 85CF1030F7DEE65B04947F6E7C0B51CC /* CTAVPlayerViewController.m */, + 995A6677E2991BD72791806C4F9A7FBC /* CTBaseHeaderFooterViewController.h */, + DF0EE0328A03BDB05173DA3C27AF9638 /* CTBaseHeaderFooterViewController.m */, + 3983F73A2985C565EF3062CCC0DEF861 /* CTBaseHeaderFooterViewControllerPrivate.h */, + 42DAD87607037825561E18A00ED625C5 /* CTCoverImageViewController.h */, + 83CE8F87209C65D9F5AB52176593AFBD /* CTCoverImageViewController.m */, + 668094278340A9E53DF66B11F0CD3191 /* CTCoverViewController.h */, + 269AC7FB0C4CED99C25D10B760FAACD4 /* CTCoverViewController.m */, + 4BF77EEE06AF0E52212BE4206B451FF3 /* CTDismissButton.h */, + D2D3A8C820C331705A297AE9F3B31537 /* CTDismissButton.m */, + 6AF23D75FC9BF3A5DDBB77028BC8012E /* CTFooterViewController.h */, + 65026832BA761398F290AE5EA311FA55 /* CTFooterViewController.m */, + 14F941163E688FD29B138F651C992A23 /* CTHalfInterstitialImageViewController.h */, + AD7CCAF8E73FA20B1585DF553A57C5A2 /* CTHalfInterstitialImageViewController.m */, + CE834314A265333D84FD03B767B6DD42 /* CTHalfInterstitialViewController.h */, + 8F73014FC6D0633BC655951F07E5E015 /* CTHalfInterstitialViewController.m */, + F1F213F4BB19D9B0BD3EE682DE52570E /* CTHeaderViewController.h */, + B1F79A33FCF950B21A4C5F785FBF7247 /* CTHeaderViewController.m */, + 73D9D8A160193092345354E99A7EDC60 /* CTInAppHTMLViewController.h */, + A8616DCF6DA7AC23DBA8AF14034CC2B8 /* CTInAppHTMLViewController.m */, + D73DFF5E5060F0EA01EED6CCFA97DB4E /* CTInterstitialImageViewController.h */, + 981824D917EE4453413334C02C4F2168 /* CTInterstitialImageViewController.m */, + B065E877EA908F82722367DFDA6884DC /* CTInterstitialViewController.h */, + AEFD8562C8F427EFCDC8B819A95AD639 /* CTInterstitialViewController.m */, + 96B0A82CBC7A95E64224EE63100BAF63 /* CTSlider.h */, + CEF1718498368EF535C233136C98D138 /* CTSlider.m */, + ); + name = InApps; + path = CleverTapSDK/InApps; + sourceTree = ""; + }; + A2B5CAD5091EF0D36C2777C635DA8EF4 /* Development Pods */ = { + isa = PBXGroup; + children = ( + BDD22B82C5B4750CD1D5A28E9DA90220 /* CleverTap-iOS-SDK */, + ); + name = "Development Pods"; + sourceTree = ""; + }; A42F72DC1D780481325DD00969B19BB6 /* Frameworks */ = { isa = PBXGroup; children = ( @@ -508,6 +698,114 @@ name = Frameworks; sourceTree = ""; }; + AFE1A82BC9648FAB15E2E74F9274041D /* Support Files */ = { + isa = PBXGroup; + children = ( + 1BC7CEF8654D75A7AD597BD5B60FE313 /* CleverTap-iOS-SDK-iOS.modulemap */, + 8107BA1260CE21C0A21F8119FC0D8095 /* CleverTap-iOS-SDK-iOS.xcconfig */, + 8DFD1499A9C6494C71D55AFB666C110A /* CleverTap-iOS-SDK-iOS-dummy.m */, + 0E0BEAE127D9CD35932A1C796551FB0E /* CleverTap-iOS-SDK-iOS-prefix.pch */, + 8AD3460503203660A1D872CC947CC2F2 /* CleverTap-iOS-SDK-iOS-umbrella.h */, + 376B695692765017D38B6B7165CA71B4 /* CleverTap-iOS-SDK-tvOS.modulemap */, + 7A897B06A248522C3F268A4BD2C9F8D6 /* CleverTap-iOS-SDK-tvOS.xcconfig */, + BE4FF7D92BDF0E1D568D53C65596AF89 /* CleverTap-iOS-SDK-tvOS-dummy.m */, + B578D16CCCC441532AF206BA826DEAE6 /* CleverTap-iOS-SDK-tvOS-prefix.pch */, + D7BC8D68CD0E1295BCE67A4EAC94CB11 /* CleverTap-iOS-SDK-tvOS-umbrella.h */, + 0918E7E399418A0676DE86AFBF3C5B14 /* Info.plist */, + 193DA46A0F654B10C230EFD1EDE441DB /* Info.plist */, + ); + name = "Support Files"; + path = "ObjCStarter/Pods/Target Support Files/CleverTap-iOS-SDK-iOS"; + sourceTree = ""; + }; + BDD22B82C5B4750CD1D5A28E9DA90220 /* CleverTap-iOS-SDK */ = { + isa = PBXGroup; + children = ( + C71FD0730A6C95382CAEAE8EA6D6C075 /* CleverTap.h */, + B7539C9A641D878ACA3BA5CE9E8E935F /* CleverTap.m */, + F2E38FED1F744E4A2B8D59E388D2FFD3 /* CleverTap+SSLPinning.h */, + BB9F312E74BF39FF075418DA1A21B000 /* CleverTapBuildInfo.h */, + EADC96D6503F757AEEA9575AC91837F4 /* CleverTapEventDetail.h */, + 835627291937792A21124FD4AB4A18DC /* CleverTapEventDetail.m */, + 484888D6574B6AC25D0E4E33CA78B4DE /* CleverTapInAppNotificationDelegate.h */, + DB84FB167B0C3E3F9F4C645511833153 /* CleverTapInstanceConfig.h */, + 3C860F6F466673568602392C80F1FC3D /* CleverTapInstanceConfig.m */, + 2DC25E7418C1C7F3CB29C3D87771977A /* CleverTapInstanceConfigPrivate.h */, + DD445C34E2FFBDBD55D11E062BCABEC7 /* CleverTapSyncDelegate.h */, + 04B24CAE757AD99AE1E15EF7A2566A76 /* CleverTapTrackedViewController.h */, + BD6775DF39FF68998363AF544CCF19DC /* CleverTapTrackedViewController.m */, + 8BD0FDCE50661AA79B4A851D8A873663 /* CleverTapUTMDetail.h */, + A0614CA4BC8D032872F1843DEC4BCFFD /* CleverTapUTMDetail.m */, + C010200A8014573D94479818B25785F4 /* CTCertificatePinning.h */, + E09FE9E56679DE709F6B24480C23EE1D /* CTCertificatePinning.m */, + D8D7C44097D696CEE74C43DFE1AD4D9F /* CTConstants.h */, + C3C975F4DF130B3E7F3A719BA6189696 /* CTConstants.m */, + FDA9A742205E3C9BFDEB898D3CBE3D62 /* CTDeviceInfo.h */, + DDDA4431D593E23534E0F0B9529763D4 /* CTDeviceInfo.m */, + B58A26B633EB1902650D41D076C55DA9 /* CTEventBuilder.h */, + 3095E807A11FB6375FCA4AA260BBA802 /* CTEventBuilder.m */, + 365E913B9862CD84C58F3C93A99AC5C3 /* CTInAppDisplayViewController.h */, + CCB8B1BFEA8A95724A14FE93EE0E0778 /* CTInAppDisplayViewController.m */, + 2C22CD81AB7B7AE5CAE4280B119AA9F7 /* CTInAppDisplayViewControllerPrivate.h */, + B70AE09F30139285706D87B96B514D7F /* CTInAppFCManager.h */, + F9A6CF69AE466F2A779ACF83EDBE1AE0 /* CTInAppFCManager.m */, + 551D5602237989DE6A8582739E068591 /* CTInAppNotification.h */, + CC5D0B8692C53314758FCF655C9DA029 /* CTInAppNotification.m */, + D543C5BF50378C1B8A23F6976D478067 /* CTInAppResources.h */, + 6C2E2044A2F88E9B43BF8386D047D1BF /* CTInAppResources.m */, + 26E0FCF05DDC67CAF4E35DDF4A77DEE6 /* CTInAppUtils.h */, + 7BB62C49A14987C6FC89120F7AB770A9 /* CTInAppUtils.m */, + BBB849FB0102D7377F6D65E8015C997C /* CTKnownProfileFields.h */, + 33C56B9DD164BD1C2F223DD9E57A8D9B /* CTKnownProfileFields.m */, + 931955FA97D3AD073FDC034F68777212 /* CTLocalDataStore.h */, + 2707C7EDD1BE135A727A8CE17C7E3B4B /* CTLocalDataStore.m */, + A36E887DC0B59FF9A9EE45D0E549E860 /* CTLocationManager.h */, + BCC5282D081707857B3A015F9A462C3E /* CTLocationManager.m */, + 56D478D07B27BFFFB796B200CE5B2BA2 /* CTLogger.h */, + 05B0B48AF845DC78378BEF56822A0B5D /* CTLogger.m */, + AAF60C279F13F1DB3A95FC743422A730 /* CTNotificationButton.h */, + ED99091080FADDCF718061EC1F67E53D /* CTNotificationButton.m */, + B4E9FCC817D4B3B2AD7F2014AFD1E4EB /* CTPinnedNSURLSessionDelegate.h */, + 394EBE80516139F64F6FC71DD9B6B23E /* CTPinnedNSURLSessionDelegate.m */, + E7B097A182A433F871E63ED6A8A53E52 /* CTPlistInfo.h */, + E4B52C105964295DFD36A013FD29A697 /* CTPlistInfo.m */, + E47022E886F10A61A9610F5B4BF81135 /* CTPreferences.h */, + DC1A354B989FD32E783116138E5A68B4 /* CTPreferences.m */, + 2F71D8061FA3E0F943E5E4C85DB9EC24 /* CTProfileBuilder.h */, + 3132311D86866710BD636E787EAC5C8E /* CTProfileBuilder.m */, + 9695D83BF46B823360ACAF210134EC68 /* CTSwizzle.h */, + 56A49FBC0EFE520AC706E69F46E001CC /* CTSwizzle.m */, + 8494992EC4204CD25669D9D750A6960D /* CTUriHelper.h */, + 965306BE46850E4476C1EA58AB08EED7 /* CTUriHelper.m */, + 4DD10F967555B9910D22C26C7C80730E /* CTUtils.h */, + DC19136B0C1E4689553A5D390651A66E /* CTUtils.m */, + 49EB62718778444E487FF6AF62CDD169 /* CTValidationResult.h */, + E069B9D9C5E39F08226BD77D7ADFACC7 /* CTValidationResult.m */, + 0D6BD2A41B8236709F497323814CF069 /* CTValidator.h */, + 1A18F6574C9217CDA4A55964C6E6E547 /* CTValidator.m */, + 9870D51A47AC79E23EA87DC4A00244DC /* FLAnimatedImage.h */, + 7018F5597CE34DFCDEF5D795A2796EA9 /* FLAnimatedImage.m */, + 758F33C54F35570FC766C43728CE7B46 /* FLAnimatedImageView.h */, + EE74DE7CE2CAEF199A4F2E736B5444D6 /* FLAnimatedImageView.m */, + 8DA65038CAEB0F8F9E89F2FA64CFBA16 /* InApps */, + 4E91D3588D6469F41D1C0EAE71EC62E8 /* Pod */, + C2D5BC14A57F9DFDE82DF5737204DE82 /* Resources */, + AFE1A82BC9648FAB15E2E74F9274041D /* Support Files */, + ); + name = "CleverTap-iOS-SDK"; + path = ../..; + sourceTree = ""; + }; + C2D5BC14A57F9DFDE82DF5737204DE82 /* Resources */ = { + isa = PBXGroup; + children = ( + EC9C697FCA78C0EC2162488EF7230820 /* DigiCertGlobalRootCA.crt */, + 527BF21FF6FC41547E18EFD6A8F1305F /* DigiCertSHA2SecureServerCA.crt */, + 22A8F03AFCC2E17A3CEC6EF1ED73F9C9 /* InApps */, + ); + name = Resources; + sourceTree = ""; + }; CE3F1ED9F110CF0EFDA291EA611CB544 /* Pods-ObjCStarterUITests */ = { isa = PBXGroup; children = ( @@ -526,178 +824,72 @@ path = "Target Support Files/Pods-ObjCStarterUITests"; sourceTree = ""; }; - DC6F8AE5AAB8C7BCF7656FF27F22D28F /* CleverTap-iOS-SDK */ = { - isa = PBXGroup; - children = ( - 4CCE23D23ACB76F6510C05C54F533854 /* CleverTap.h */, - 07981E535135904FDBD4AB0287274566 /* CleverTap.m */, - BE5235CD66480A1FF23623B50273F8EE /* CleverTap+SSLPinning.h */, - B0B31B4E8E2A3A32CF576BA255441DA5 /* CleverTapBuildInfo.h */, - 9A8FD5E5181EA2EE244121730F9C7666 /* CleverTapEventDetail.h */, - 963EBF5C91F6EA2D7528D028B1CE29B7 /* CleverTapEventDetail.m */, - E0C00A606A2590B73F04B937EAA81178 /* CleverTapInAppNotificationDelegate.h */, - AF494C58C071ED207A181EB7D44D8BB6 /* CleverTapInstanceConfig.h */, - 38D4AFCC18E575326EC924033BE82276 /* CleverTapInstanceConfig.m */, - EE2C815B70A0C03AADDC8DC9E5344C75 /* CleverTapInstanceConfigPrivate.h */, - 2716FFA5E99ADF21128485D375BFF395 /* CleverTapSyncDelegate.h */, - 63BDF9283E9E8FA5C9EAE05B850C6710 /* CleverTapTrackedViewController.h */, - 646D615B9BC65FECDB0A825610E53740 /* CleverTapTrackedViewController.m */, - 9A930523BB28D25AB16BACE947B1979C /* CleverTapUTMDetail.h */, - 59462084C7E04F4769F8574724A12D55 /* CleverTapUTMDetail.m */, - CD1AF2425B398594084683B46E53C832 /* CTCertificatePinning.h */, - 6E52EF509E795DD83F6904925E7F9C24 /* CTCertificatePinning.m */, - E7A3113809CF827418939E59F8810F7F /* CTConstants.h */, - 4C0ED5A580CAEA63A56F9146BBA72617 /* CTConstants.m */, - 4D8AA26A1735494E601DC80F56B9412F /* CTDeviceInfo.h */, - 729B0E94993BF08B95873A5A54DB2554 /* CTDeviceInfo.m */, - 639325DB8803A3AEE14E2D7F805B96A1 /* CTDismissButton.h */, - 15070C4566FBE45EFBDB5451C038B7C8 /* CTDismissButton.m */, - D87C4FEA24B9F4CB8E5D386C7CE6251E /* CTEventBuilder.h */, - 8F569C3501AF97E8E65D4966A315D7B1 /* CTEventBuilder.m */, - A5EACC1686FBE138806D4FF34D0FD8E0 /* CTInAppDisplayViewController.h */, - 2617A3A815A6114348D59341F0247FD5 /* CTInAppDisplayViewController.m */, - F39F164DB168FD4CD6A4908C4B715EB9 /* CTInAppDisplayViewControllerPrivate.h */, - 9BF3DA18F0CECB3E18ED486A49CAFDEB /* CTInAppFCManager.h */, - 091B30FA1A8C64AE90397D1CA497738C /* CTInAppFCManager.m */, - 0DC97F613A2F9B31344CD6AFE8F5A93E /* CTInAppHTMLViewController.h */, - 272EBAFE1BA6DCF628A53EFD5BB9DC11 /* CTInAppHTMLViewController.m */, - 97ACCF6EED3EE851EEFF4C291CB3AF24 /* CTInAppNotification.h */, - CCCBB314EACC41F011F0265E7D043A34 /* CTInAppNotification.m */, - A4C8FA6B0477CB80281C2AE55279768F /* CTInAppUtils.h */, - 850DBA2917DC5D9056276B4AA92DE843 /* CTInAppUtils.m */, - 078CBD2F2B7E20498F5A1EE7977A9813 /* CTKnownProfileFields.h */, - CCDC6232B4591787A62D0E8D6A8EC0E3 /* CTKnownProfileFields.m */, - BD4449C0B5C27D2AD66111F894764B75 /* CTLocalDataStore.h */, - 08EA26EAADB3F8FCE62B4707A4B67727 /* CTLocalDataStore.m */, - F733563AAC6D9A040A2B545A5C716EB5 /* CTLocationManager.h */, - 47631EE9479492A3346E591EA49F3F13 /* CTLocationManager.m */, - FEAAD18188F20412C606B38176BF2F07 /* CTLogger.h */, - 6CE4722E30C333E5A8FADDE1D3FAAC9D /* CTLogger.m */, - C9348135E640B69B3CA9227C26CADDF4 /* CTPinnedNSURLSessionDelegate.h */, - 69D749DD39B3D16B2013F75853347406 /* CTPinnedNSURLSessionDelegate.m */, - 095E9ACB3D337FC5CB51FA124FA9ADB1 /* CTPlistInfo.h */, - E919357EDC1A7A4EA54D9D065038D53E /* CTPlistInfo.m */, - 51794A3A22CE711794B5CDA5C08D1565 /* CTPreferences.h */, - 501D22ACF66B2A82BE966C199198CAE6 /* CTPreferences.m */, - C789D3F7D1871F098BBA2039D49C2863 /* CTProfileBuilder.h */, - 77590200341E346BF3FC105D215BDDF7 /* CTProfileBuilder.m */, - 97930524EE3D19339865725DE83F96CE /* CTSwizzle.h */, - 0C01A16579ABF46C33AE6ED1A2F7394B /* CTSwizzle.m */, - B348031FEFB1EA79566F0D55DE15B182 /* CTUriHelper.h */, - AD862D8CC6FDBE7AF873BBD44C103489 /* CTUriHelper.m */, - BA2A4793D7FCFC13CE798ABB45E5D326 /* CTUtils.h */, - 1661589AB26E97676CB37F8C7CF394D4 /* CTUtils.m */, - 0D3EAE1F8B2726519BC21CDDD48B65A9 /* CTValidationResult.h */, - 395F098F17AAB478E5B337467CB3B067 /* CTValidationResult.m */, - 8EDC42319924402E70B4EB184DE336A1 /* CTValidator.h */, - 2D030191BC682E7E802973AC81F31E2E /* CTValidator.m */, - E16F098E7D0F7D161385AA2C9539A522 /* Pod */, - 2F15650E41E344525BC1ABFAA833A51C /* Resources */, - 350193BBB88BA7D01567238C4930B163 /* Support Files */, - ); - name = "CleverTap-iOS-SDK"; - path = ../..; - sourceTree = ""; - }; - DD0D0ED2401A36E380CBE4CB13F22407 /* Development Pods */ = { + D284672B40CF76460C2E62D3B796FA29 /* images */ = { isa = PBXGroup; children = ( - DC6F8AE5AAB8C7BCF7656FF27F22D28F /* CleverTap-iOS-SDK */, + 136304F58B055F4508F3B3A8DE97C896 /* ic_expand@1x.png */, + FA50D8E5A8C18EBA0CE4DF069730B2DE /* ic_expand@2x.png */, + D0AA251E8D333CA7A8821F8ED025E60D /* ic_expand@3x.png */, + D61F229BD7097404A09463DBF6F7EBC0 /* ic_pause@1x.png */, + 6D58B3FF37F9AFFABD98A10766BDD44D /* ic_pause@2x.png */, + 94807550BD47C9E4AAD8B075C0E3C5B2 /* ic_pause@3x.png */, + A86E965C038024D41C727BCF7FF3A4A0 /* ic_play@1x.png */, + E1AE0962382D63E3BD800F113259D28A /* ic_play@2x.png */, + 38E248FC6D75DB2E42BF0AA88D8B141B /* ic_play@3x.png */, + CDE6846D50B94A5F6CD61BC0AAAFBF8D /* ic_shrink@1x.png */, + 5391BC1322843B8F86EF9763089C1B03 /* ic_shrink@2x.png */, + A8E6B9FAC29A5B3553FCAFDA211AC2AC /* ic_shrink@3x.png */, + 9DB788D44D5BCD075138EB1CA016168A /* ic_thumb.png */, + 0F31D96F4D5B2355EFA3E3D605732B07 /* sound-wave-headphones.png */, ); - name = "Development Pods"; - sourceTree = ""; - }; - E16F098E7D0F7D161385AA2C9539A522 /* Pod */ = { - isa = PBXGroup; - children = ( - 4233F49AA0AF6CC595606FBD1FC6DB06 /* CleverTap-iOS-SDK.podspec */, - ); - name = Pod; + name = images; + path = images; sourceTree = ""; }; /* End PBXGroup section */ /* Begin PBXHeadersBuildPhase section */ - 0C1E5A0259EC3CC0EF19D39E43C97D54 /* Headers */ = { - isa = PBXHeadersBuildPhase; - buildActionMask = 2147483647; - files = ( - 9AF984C39769055CF477E56B67CE6F3D /* CleverTap+SSLPinning.h in Headers */, - DEA0BC2CA6B31739E6346000E4A5EE2F /* CleverTap-iOS-SDK-iOS-umbrella.h in Headers */, - 70E21D58C2FD474861F51635C2C8F760 /* CleverTap.h in Headers */, - 7868CD7E08A201DA0B731CFBD5CB2EAD /* CleverTapBuildInfo.h in Headers */, - 46BD5EA9F4D80202D4FE29FE5C870DF9 /* CleverTapEventDetail.h in Headers */, - 48AF0926B4AEB7E1DB05D7E0AF3AAD81 /* CleverTapInAppNotificationDelegate.h in Headers */, - 3790216AC027F4716A9FFE0C2730CA67 /* CleverTapInstanceConfig.h in Headers */, - 3D4E4F59C2C83F7E8A338FDCBE09E03B /* CleverTapInstanceConfigPrivate.h in Headers */, - 38FE9700A306CB6CEBA7247140520531 /* CleverTapSyncDelegate.h in Headers */, - C2DD0D2D1A7A0090F3848CA0AF7532BC /* CleverTapTrackedViewController.h in Headers */, - E6EF5524ABEA0DAE7EFDC2F8234055D9 /* CleverTapUTMDetail.h in Headers */, - 4BE674AE0E1C84B33FD2CAC1F24684C8 /* CTCertificatePinning.h in Headers */, - D65D7AF25F72583C0C1B18B0E2D3E02D /* CTConstants.h in Headers */, - 3F0F18CA203B33DB111264ED383724E6 /* CTDeviceInfo.h in Headers */, - 4354F76EC42B1C1719384424142B2767 /* CTDismissButton.h in Headers */, - 672D5CEDA1404791A857BB86DAFC58F3 /* CTEventBuilder.h in Headers */, - 9DDA97748F5D7E1796FD898A48DB4202 /* CTInAppDisplayViewController.h in Headers */, - AF8932C6601E8DBAF35EFB685E28243D /* CTInAppDisplayViewControllerPrivate.h in Headers */, - 742891B84E27B040A169D3CCAB2F70DB /* CTInAppFCManager.h in Headers */, - 60961E47C8D896106515607D3CCE939A /* CTInAppHTMLViewController.h in Headers */, - 2DA6C4F740D35103261716D3A05A6B6F /* CTInAppNotification.h in Headers */, - 2BD035C6BF0FD3D9B92162E1A43D6734 /* CTInAppUtils.h in Headers */, - 5F1C56ABD7F1F0A3A8681E90F5C947EE /* CTKnownProfileFields.h in Headers */, - 2C57356E3B3DB1BB090B054761D2D4C4 /* CTLocalDataStore.h in Headers */, - 489F9079B8885ECA90F106256BFD8E9B /* CTLocationManager.h in Headers */, - 721F77826B1AF9D3B6EF240FBD7CEA42 /* CTLogger.h in Headers */, - 82835564E69306D37EA65AE7C378DE5B /* CTPinnedNSURLSessionDelegate.h in Headers */, - 3E109618B0EB8883A2B21E56BABF8839 /* CTPlistInfo.h in Headers */, - F26647D4579A405AC66D2A49594E1133 /* CTPreferences.h in Headers */, - F7ED2D3062D30A0E7734F58C8B095FD3 /* CTProfileBuilder.h in Headers */, - E8BB545C670496AE3814F7FF5FE0E503 /* CTSwizzle.h in Headers */, - F8337270356E255A3C6D68AC9F06A71F /* CTUriHelper.h in Headers */, - 73B29E7AFDD8D51D5E7722C4E5D57D37 /* CTUtils.h in Headers */, - CB3684C159C0A0CCEC65A4B04F94B28B /* CTValidationResult.h in Headers */, - 40525BB0C277D41762F6ED6C6D828B5A /* CTValidator.h in Headers */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 2DC33F3B31A7974B67F065DA912C984E /* Headers */ = { + 0D34EC179BBC2F482B5E35A7E266880E /* Headers */ = { isa = PBXHeadersBuildPhase; buildActionMask = 2147483647; files = ( - 9CB167E08A2BAA0F105406124CFFA10F /* CleverTap+SSLPinning.h in Headers */, - 63763D8589CF9FDDC3ADCCD304E7F8BF /* CleverTap-iOS-SDK-tvOS-umbrella.h in Headers */, - 5F7DBE42ED3A162863119CD19EC12F7A /* CleverTap.h in Headers */, - 7ACD4F6C240300D11C5A5B7DDF5D8964 /* CleverTapBuildInfo.h in Headers */, - 864064965309DDE054274B55B7B886E4 /* CleverTapEventDetail.h in Headers */, - BC44FE9E02EB079A29FECB7D15661D6E /* CleverTapInAppNotificationDelegate.h in Headers */, - C80D01D1855BF1CBA2C856030EACC7BE /* CleverTapInstanceConfig.h in Headers */, - D20383BFA93D8AB3D92D0B1B3FBA10E1 /* CleverTapInstanceConfigPrivate.h in Headers */, - 74431C6D4245EBFB50CFDCF3F520E2FE /* CleverTapSyncDelegate.h in Headers */, - 8976FE804BD35F0D60E272B5C250B5F2 /* CleverTapTrackedViewController.h in Headers */, - E1AFF55DF28EAF5BB4365AF9F7521282 /* CleverTapUTMDetail.h in Headers */, - DF3C90F565FF070DCDBD55DCF1B9B529 /* CTCertificatePinning.h in Headers */, - 78B8928B9DEB21EFB68B906ECE08EFC3 /* CTConstants.h in Headers */, - E0EAFEB825D62C995901F2462C0DE195 /* CTDeviceInfo.h in Headers */, - 9BF1D11BBB38DC9FF670ECDF326C6AB0 /* CTDismissButton.h in Headers */, - FFF0BCDD25873F159C31C5F94343DDC2 /* CTEventBuilder.h in Headers */, - C62F8CFC1C60213122A4E4CAC96630A5 /* CTInAppDisplayViewController.h in Headers */, - 2E5B80DD430804FA9EC4BF5F37702990 /* CTInAppDisplayViewControllerPrivate.h in Headers */, - 6034E4F7C276ECB8990EDA775E56912B /* CTInAppFCManager.h in Headers */, - E75D21C500F3A506E596AAA38679EAC2 /* CTInAppNotification.h in Headers */, - A880AA02ECDE61BEC6BBB19E971A7250 /* CTInAppUtils.h in Headers */, - C5F299639FE7B58177C0FD02BA840958 /* CTKnownProfileFields.h in Headers */, - C0013202297A81BD7C384B235C161EDA /* CTLocalDataStore.h in Headers */, - 55D7F67BAFDC21C446ECC0F52F1C197C /* CTLocationManager.h in Headers */, - 136F8447F2DA3665E1104AD3A1545DC0 /* CTLogger.h in Headers */, - 598388878066C29540DF97FD55B557A0 /* CTPinnedNSURLSessionDelegate.h in Headers */, - 6EFC05A0EB224C433384A41D3877A695 /* CTPlistInfo.h in Headers */, - 77A82ED0386C98E7DA288345D1365BD6 /* CTPreferences.h in Headers */, - 10776E4668476D85EE0060FCAD7CD07D /* CTProfileBuilder.h in Headers */, - 937836A335C329531FC3665DFBB005BD /* CTSwizzle.h in Headers */, - 010B1E0E4BD95B6AE78E4F8986B091C9 /* CTUriHelper.h in Headers */, - E3CB89B99BB1BDB2038B330002FBCEEC /* CTUtils.h in Headers */, - 03B0DC0E9E5B257E0660555CF4D70960 /* CTValidationResult.h in Headers */, - 7F56BDC2777F150AFD63ACF4060F586D /* CTValidator.h in Headers */, + CC59FF7DEB255AF868CEFE686115EA65 /* CleverTap+SSLPinning.h in Headers */, + 1BFCDB17546E2782D2BE747920739658 /* CleverTap-iOS-SDK-tvOS-umbrella.h in Headers */, + B6962AAD6F0AA2C41341635BBC9C71C1 /* CleverTap.h in Headers */, + 0F5EBCE2BC3C3CCE83686E2E0B3BB229 /* CleverTapBuildInfo.h in Headers */, + 5649175CFFDDDFE7EC38B547ABA3A0A4 /* CleverTapEventDetail.h in Headers */, + A05A70956819445A57C123EFA93E9355 /* CleverTapInAppNotificationDelegate.h in Headers */, + F3263D4C18A43009F8A8027716A717C8 /* CleverTapInstanceConfig.h in Headers */, + 32C3A35DE4655CA339093A4540B20966 /* CleverTapInstanceConfigPrivate.h in Headers */, + 67937F0331DDCDBFF9AA3E54A58C1D00 /* CleverTapSyncDelegate.h in Headers */, + 7B5704185C472AE4FDA056BAFE146878 /* CleverTapTrackedViewController.h in Headers */, + 40664B8A0697EF161D85C8AE74F9CECB /* CleverTapUTMDetail.h in Headers */, + F757706DE9BC79D2C9562AACB286CEE9 /* CTCertificatePinning.h in Headers */, + A351370ECBCA236ED79A5C9C19F7794F /* CTConstants.h in Headers */, + 69DB9536707021424F7E28AB25604A9F /* CTDeviceInfo.h in Headers */, + 888EE78D8C760A5A354920848439B301 /* CTEventBuilder.h in Headers */, + E37A133274C9C507FDDFB8386E5AF8F8 /* CTInAppDisplayViewController.h in Headers */, + 3D2507AE9B75F8129E3FF909A48AB372 /* CTInAppDisplayViewControllerPrivate.h in Headers */, + F998A823031990817FFA4414CDD792ED /* CTInAppFCManager.h in Headers */, + 72BBEC03FD3DFBFD5833B750F55D0A24 /* CTInAppNotification.h in Headers */, + 019966732D030AB16972BCCB9CC259F7 /* CTInAppResources.h in Headers */, + 55BCBF03AC573DB45CAF3E1A599294EA /* CTInAppUtils.h in Headers */, + FDD640B97AF0308F2705A23DFD557E88 /* CTKnownProfileFields.h in Headers */, + 2941CD022D8B2CCEA1A6A31727C61042 /* CTLocalDataStore.h in Headers */, + 6510934118D201EF143AF623A0D68547 /* CTLocationManager.h in Headers */, + 2228EA0868EC399661350A546B7FD6E2 /* CTLogger.h in Headers */, + DADC7EA41BDDD0377D3F499CA2D29CDE /* CTNotificationButton.h in Headers */, + D34FC5C385E6E194E6EAD2F83DA4A2D1 /* CTPinnedNSURLSessionDelegate.h in Headers */, + 6F624247548BDDECC5DFD411F4EC99DA /* CTPlistInfo.h in Headers */, + 79F5A7DCBBB01A028C9CDD0BEF570400 /* CTPreferences.h in Headers */, + A07032BA132125D65327FE71E6B97F14 /* CTProfileBuilder.h in Headers */, + 04383408B0ECBDD7A75116AFBD8B850E /* CTSwizzle.h in Headers */, + BBC350487638B71E7A9B9B092A3583EF /* CTUriHelper.h in Headers */, + AD40A5DBDE7FFEF84ACEAFC067A7C6C8 /* CTUtils.h in Headers */, + 076EDBF4B55369F074DABA5C7B83AF92 /* CTValidationResult.h in Headers */, + 616308FB93CF9ACED564092A5D311412 /* CTValidator.h in Headers */, + 90EA6AB5E392F91A37C506E653411F4A /* FLAnimatedImage.h in Headers */, + 4C7AC7B8D45E481EA7327429747D530A /* FLAnimatedImageView.h in Headers */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -725,6 +917,66 @@ ); runOnlyForDeploymentPostprocessing = 0; }; + C5EF6DDA144EC0BCF687C03BAD684229 /* Headers */ = { + isa = PBXHeadersBuildPhase; + buildActionMask = 2147483647; + files = ( + 45227132853B3293ECC629ABB3032F3B /* CleverTap+SSLPinning.h in Headers */, + E6DDB1EE504627765E67A7BBD99F14C8 /* CleverTap-iOS-SDK-iOS-umbrella.h in Headers */, + 1EA156FB080FC5AAA17DF148BFF48539 /* CleverTap.h in Headers */, + F41E6938C7B782DC21221F54FC3F728D /* CleverTapBuildInfo.h in Headers */, + 72DF403F695F2567C544ADB0319D8E6E /* CleverTapEventDetail.h in Headers */, + A5F0A130541CE11E6D7FDF8FB8B19D93 /* CleverTapInAppNotificationDelegate.h in Headers */, + C0041336E4336AC558C778ED77C83CA2 /* CleverTapInstanceConfig.h in Headers */, + 483D6BBFE052BB6223662C3F32CDCAA0 /* CleverTapInstanceConfigPrivate.h in Headers */, + 5D504EC3775FF00EDEB306A50E6B531B /* CleverTapSyncDelegate.h in Headers */, + EFC5F77BDF9E328568B2B8E7493EAF48 /* CleverTapTrackedViewController.h in Headers */, + 9A6779C68950304A180037F42067B2F0 /* CleverTapUTMDetail.h in Headers */, + C8DF9FB1DA3FE2FCFDECF359CDF5247E /* CTAlertViewController.h in Headers */, + 91F6F789F99F4B1C979253D8926777CA /* CTAVPlayerControlsViewController.h in Headers */, + EE783FDA606E146C5C7D2AB48253059A /* CTAVPlayerViewController.h in Headers */, + 37929862226FBC933E3F29D0F449C7A4 /* CTBaseHeaderFooterViewController.h in Headers */, + E42BAC88B86E51E7B38F0C8AE4105EC5 /* CTBaseHeaderFooterViewControllerPrivate.h in Headers */, + 5FCFC9204F67041BD9EA52F0211B95B0 /* CTCertificatePinning.h in Headers */, + 7D852A54F6E87CBC64B2B9A4C9D34D10 /* CTConstants.h in Headers */, + 7B1EE878A21AA78766C3B301A074C996 /* CTCoverImageViewController.h in Headers */, + A3139F9E7A462B56EF249B2D99CE361B /* CTCoverViewController.h in Headers */, + 68BCACC43B126533207440FCCAD5DC76 /* CTDeviceInfo.h in Headers */, + D30526E561464313871D50B33E087C75 /* CTDismissButton.h in Headers */, + B729BC9D3DA41F1E75A99A1CE368B0E4 /* CTEventBuilder.h in Headers */, + C5B1CA09FBA14E9F1BDC2C9E7DCA6F3A /* CTFooterViewController.h in Headers */, + 4D56362CE17CA396E49E461E13962DDA /* CTHalfInterstitialImageViewController.h in Headers */, + 3ADF561410FB575959611F0EDAE149E3 /* CTHalfInterstitialViewController.h in Headers */, + ACADFF03741D939F8B61BA9E5F5A1EC5 /* CTHeaderViewController.h in Headers */, + 79116F45BD9F69167577A2385D605E6E /* CTInAppDisplayViewController.h in Headers */, + 156CF49F1F7D157635D33387D9AB3835 /* CTInAppDisplayViewControllerPrivate.h in Headers */, + 075DC436FB19AE0C496456FBBBBCA3DC /* CTInAppFCManager.h in Headers */, + 5047CD6AD90B3EEB4419F4ED876E079B /* CTInAppHTMLViewController.h in Headers */, + 1874B74CAA7711561DAE59624B17E435 /* CTInAppNotification.h in Headers */, + 2DF403615FA15E305D4CF8DF3B7FDFB8 /* CTInAppResources.h in Headers */, + 70E3B81E9B80B2C8F05BEC9979B91FC9 /* CTInAppUtils.h in Headers */, + F3021547BA0EF8C310614E2FD6D5DF51 /* CTInterstitialImageViewController.h in Headers */, + FA1F426971F336D0F39AB85B4EE6F07B /* CTInterstitialViewController.h in Headers */, + 9ECA235A95DEF80D54EBCAC5D6CCEEAA /* CTKnownProfileFields.h in Headers */, + 2257DDA5713716047A1287CBC0C3BF43 /* CTLocalDataStore.h in Headers */, + 20EE9A8D8CB60D116193950DDA21D976 /* CTLocationManager.h in Headers */, + 39DCC474DBE62620A15E113CBF4D4048 /* CTLogger.h in Headers */, + 5FAB1F228D9D129C5641A66EC374E6C5 /* CTNotificationButton.h in Headers */, + 95EFC98C1F3A60575647C4858027AF49 /* CTPinnedNSURLSessionDelegate.h in Headers */, + 08B444D113C4688A4AD491C1C0C90CAA /* CTPlistInfo.h in Headers */, + CDD761EF75751FAA1FDB053014E98C68 /* CTPreferences.h in Headers */, + ACF5ED3E237A32F738E4E0705E0432AA /* CTProfileBuilder.h in Headers */, + E97B78D40C6FA6D7C3492F47B96AE062 /* CTSlider.h in Headers */, + 321C8D98A3A70F08356D695DC24E606D /* CTSwizzle.h in Headers */, + 74311CA47AD2492C2E8986626ED39677 /* CTUriHelper.h in Headers */, + 1DE8B5C56C90DDA315D39EAFB2FEC844 /* CTUtils.h in Headers */, + 04A94BBBFC01C559A0252A56C1B29385 /* CTValidationResult.h in Headers */, + BB6B60B7D2640AC505D7AD1712ADC54E /* CTValidator.h in Headers */, + F5017FE1D8695211C12BE86DA2830B77 /* FLAnimatedImage.h in Headers */, + 88ADC992D4EA12209FA9F64E5152F546 /* FLAnimatedImageView.h in Headers */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; E31C679DD14CDB04205E8ED0753099E0 /* Headers */ = { isa = PBXHeadersBuildPhase; buildActionMask = 2147483647; @@ -772,22 +1024,22 @@ productReference = 5728456F8BE0DEEB64054DB1C14E9B98 /* Pods_ObjCTvOS.framework */; productType = "com.apple.product-type.framework"; }; - 84710807FC10B8B2673796CA61608A06 /* CleverTap-iOS-SDK-tvOS */ = { + 82EB401F9EF03080E9CC9290A678FE92 /* CleverTap-iOS-SDK-iOS */ = { isa = PBXNativeTarget; - buildConfigurationList = 76613A7A3C3BE3B35ECA55292AC29F3E /* Build configuration list for PBXNativeTarget "CleverTap-iOS-SDK-tvOS" */; + buildConfigurationList = F7968B2F653E5140F25B9FD5FBEAA97D /* Build configuration list for PBXNativeTarget "CleverTap-iOS-SDK-iOS" */; buildPhases = ( - 8C7CD79CBE7D5BF7EF43DAA91A27F5E3 /* Sources */, - A437269C5189FD744F5BCAAD8B89817C /* Frameworks */, - 2DC33F3B31A7974B67F065DA912C984E /* Headers */, - 4C15BA167D75DF011F3D4E6C7C677666 /* Resources */, + 51E7FEF757AA945D714A1D8A2CE6A63E /* Sources */, + 2E7F868D17C05D84C8D1A165CE4AF7E3 /* Frameworks */, + C5EF6DDA144EC0BCF687C03BAD684229 /* Headers */, + E058B489A0AB0DA25CFAC66D1455B975 /* Resources */, ); buildRules = ( ); dependencies = ( ); - name = "CleverTap-iOS-SDK-tvOS"; - productName = "CleverTap-iOS-SDK-tvOS"; - productReference = 969DC1FB9B3A86BCDCE799B3C7529588 /* CleverTapSDK.framework */; + name = "CleverTap-iOS-SDK-iOS"; + productName = "CleverTap-iOS-SDK-iOS"; + productReference = 0529C4DD1C416E5E0820C435D8F75C2E /* CleverTapSDK.framework */; productType = "com.apple.product-type.framework"; }; C8B826D62DA9507F60A36408680F297C /* Pods-ObjCStarterUITests */ = { @@ -808,22 +1060,22 @@ productReference = A82DF58913D09EA39E314E1A24E023BE /* Pods_ObjCStarterUITests.framework */; productType = "com.apple.product-type.framework"; }; - D101C7BCB05F1A764AD0A07B90ADAE07 /* CleverTap-iOS-SDK-iOS */ = { + D232BB786801B0F13E163425C6758475 /* CleverTap-iOS-SDK-tvOS */ = { isa = PBXNativeTarget; - buildConfigurationList = 2366BD3B02476A1D7EADEE5F11F130F4 /* Build configuration list for PBXNativeTarget "CleverTap-iOS-SDK-iOS" */; + buildConfigurationList = 152F98594A78642C26677AEDF5EC18C7 /* Build configuration list for PBXNativeTarget "CleverTap-iOS-SDK-tvOS" */; buildPhases = ( - 5C7E67EC81B0E2B1366F9CEF9E66A930 /* Sources */, - 51293121EF415CF74E27C448B048DFD9 /* Frameworks */, - 0C1E5A0259EC3CC0EF19D39E43C97D54 /* Headers */, - 37A1B4D1ED1238150909C608DE09F2C1 /* Resources */, + 9078B5BA76C33B1A0C00B119FB069E65 /* Sources */, + 3593A6AF19A3064BA50B0246A9E14B5A /* Frameworks */, + 0D34EC179BBC2F482B5E35A7E266880E /* Headers */, + FEEE6AE157CC48A65A448B6449F92837 /* Resources */, ); buildRules = ( ); dependencies = ( ); - name = "CleverTap-iOS-SDK-iOS"; - productName = "CleverTap-iOS-SDK-iOS"; - productReference = 0529C4DD1C416E5E0820C435D8F75C2E /* CleverTapSDK.framework */; + name = "CleverTap-iOS-SDK-tvOS"; + productName = "CleverTap-iOS-SDK-tvOS"; + productReference = 969DC1FB9B3A86BCDCE799B3C7529588 /* CleverTapSDK.framework */; productType = "com.apple.product-type.framework"; }; D560E156203438D400C14AEA571513BC /* Pods-ObjCStarterTests */ = { @@ -865,8 +1117,8 @@ projectDirPath = ""; projectRoot = ""; targets = ( - D101C7BCB05F1A764AD0A07B90ADAE07 /* CleverTap-iOS-SDK-iOS */, - 84710807FC10B8B2673796CA61608A06 /* CleverTap-iOS-SDK-tvOS */, + 82EB401F9EF03080E9CC9290A678FE92 /* CleverTap-iOS-SDK-iOS */, + D232BB786801B0F13E163425C6758475 /* CleverTap-iOS-SDK-tvOS */, 15A2154784E1253CC3BE0FD49723562E /* Pods-ObjCStarter */, D560E156203438D400C14AEA571513BC /* Pods-ObjCStarterTests */, C8B826D62DA9507F60A36408680F297C /* Pods-ObjCStarterUITests */, @@ -876,21 +1128,52 @@ /* End PBXProject section */ /* Begin PBXResourcesBuildPhase section */ - 37A1B4D1ED1238150909C608DE09F2C1 /* Resources */ = { + E058B489A0AB0DA25CFAC66D1455B975 /* Resources */ = { isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( - B6363BF6B2B36A87AE50CF0A9D8C0344 /* DigiCertGlobalRootCA.crt in Resources */, - 2BF072A3C89F91C915FDF605F0F776CA /* DigiCertSHA2SecureServerCA.crt in Resources */, + 6B78BC4B3D25C64F74205BF8269E279E /* CTAVPlayerControlsViewController.xib in Resources */, + FE8A3FBFF0F820162F3F750F6576B047 /* CTCoverImageViewController~ipad.xib in Resources */, + E0EAD32DDDDD4DCB115090992F820561 /* CTCoverImageViewController~iphoneport.xib in Resources */, + FF6E82549A9D9ED498DCFE0683BA47EB /* CTCoverViewController~ipad.xib in Resources */, + 6E88DB279A702C331BB5E0D9630809DD /* CTCoverViewController~iphoneport.xib in Resources */, + 3B3CAA501029A009377E190662B36DDE /* CTFooterViewController~ipad.xib in Resources */, + 59BCD23082334BF91EA0F514C21FF879 /* CTFooterViewController~iphoneport.xib in Resources */, + 635D0763858AF1658263298750A1E979 /* CTHalfInterstitialImageViewController~ipad.xib in Resources */, + 296E072D627DD14E7E42213457F5F614 /* CTHalfInterstitialImageViewController~iphoneport.xib in Resources */, + 9AF7309570D6FA3D6AA3B6996855CD17 /* CTHalfInterstitialViewController~ipad.xib in Resources */, + 9E39AD03EB04F2558E3B015675ACD707 /* CTHalfInterstitialViewController~iphoneport.xib in Resources */, + 8F0D9BBFAED4F6286FDCF9F7FA28A0E8 /* CTHeaderViewController~ipad.xib in Resources */, + EF45F811330A889448FF7D0B1AB02B79 /* CTHeaderViewController~iphoneport.xib in Resources */, + 8F32D07A87539709096403303AC2F8AF /* CTInterstitialImageViewController~ipad.xib in Resources */, + A1353CE9ED04791C1A9437E7C1C115A9 /* CTInterstitialImageViewController~iphoneport.xib in Resources */, + 45BD171ABEE9497AF46E036AD736E775 /* CTInterstitialViewController~ipad.xib in Resources */, + 160BE77DF345665361FB4B53C75F4BAA /* CTInterstitialViewController~iphoneport.xib in Resources */, + 1B9E4B4A3D13E04B9CDDE8067735E007 /* DigiCertGlobalRootCA.crt in Resources */, + 097DCCA74CE1A4101AC2AFF977FED231 /* DigiCertSHA2SecureServerCA.crt in Resources */, + 025318C726D140C576C0CEF618BA22E0 /* ic_expand@1x.png in Resources */, + 3C9D8BC08682BAF56046B519F9E5D884 /* ic_expand@2x.png in Resources */, + 1FBFEC1199EC6702EF9667E8FDE94BA5 /* ic_expand@3x.png in Resources */, + 06F5F0B8E27B3224174DDBA8F0DA11CA /* ic_pause@1x.png in Resources */, + 23E40774FBD23725875ED1080225D71B /* ic_pause@2x.png in Resources */, + 1CD9A5F614B585ADC4D85282CC63F9C2 /* ic_pause@3x.png in Resources */, + 56A28503DEE8311715FE53BC0CB9BCE4 /* ic_play@1x.png in Resources */, + 189C13AA533C9EA91E0FA1004E5596BF /* ic_play@2x.png in Resources */, + F0BC8A6F9A54037CBEC88954FB3CCAE1 /* ic_play@3x.png in Resources */, + 050B115BD9DF3D531DB1C35800D99C9A /* ic_shrink@1x.png in Resources */, + BDD606F72C327DD92905841E6E35C579 /* ic_shrink@2x.png in Resources */, + 7202BC70B8B4C79614154422A1CBFAC4 /* ic_shrink@3x.png in Resources */, + B959AA3B288D2FCD7CAB8FEF4282D6AF /* ic_thumb.png in Resources */, + D161BA4B399CF3EDC46471C2B64E496D /* sound-wave-headphones.png in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; - 4C15BA167D75DF011F3D4E6C7C677666 /* Resources */ = { + FEEE6AE157CC48A65A448B6449F92837 /* Resources */ = { isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( - 3C9FF88B66130018F0E913A8F19D56D7 /* DigiCertGlobalRootCA.crt in Resources */, - E3134A8611B07698C88A43B4630C9A03 /* DigiCertSHA2SecureServerCA.crt in Resources */, + 0356DDAC53D1FF3BB76C2FEF4DE919D8 /* DigiCertGlobalRootCA.crt in Resources */, + 8F0CDD3D32FEE74809D309518CE00D2A /* DigiCertSHA2SecureServerCA.crt in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -905,39 +1188,56 @@ ); runOnlyForDeploymentPostprocessing = 0; }; - 5C7E67EC81B0E2B1366F9CEF9E66A930 /* Sources */ = { + 51E7FEF757AA945D714A1D8A2CE6A63E /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( - 5752A3B55A136E9581818D12D2A469AB /* CleverTap-iOS-SDK-iOS-dummy.m in Sources */, - B23D6007BDA22E716383503CEBA4F9B4 /* CleverTap.m in Sources */, - C2697D881CE0D2B5E4999A735A03C59F /* CleverTapEventDetail.m in Sources */, - 04475821C7F3ADA742DD3CCF5EE1CC9C /* CleverTapInstanceConfig.m in Sources */, - 3113E3EC4976B22E43DB58671B8E6AED /* CleverTapTrackedViewController.m in Sources */, - 07C75CA5FC1C76FFF8C72123661A12A2 /* CleverTapUTMDetail.m in Sources */, - 9A71E59EDF4F1AB8A0CE1911EFDB68E9 /* CTCertificatePinning.m in Sources */, - A562B2ABBF464B20EBB5336C69AFC025 /* CTConstants.m in Sources */, - AB52A6B85B2CC199B14231956CA6B0EE /* CTDeviceInfo.m in Sources */, - 106868C0DFDEE68B39D9FA365E70A91B /* CTDismissButton.m in Sources */, - A63E05492B4C83D952ED4ADC0C13A690 /* CTEventBuilder.m in Sources */, - 039D14DC50391D8207DADDA668D9A349 /* CTInAppDisplayViewController.m in Sources */, - FA25369C4B77806C11B2B2833C694F3E /* CTInAppFCManager.m in Sources */, - 7537FEE99CDB2B164A5DA6397577EAE3 /* CTInAppHTMLViewController.m in Sources */, - F98E6EDD596AC14860E48B92CD76C8A9 /* CTInAppNotification.m in Sources */, - 96A3DDCF1939A46928E11DEA28A6A185 /* CTInAppUtils.m in Sources */, - AF5BCF98B8A9770BE7E47240CA4E3CB9 /* CTKnownProfileFields.m in Sources */, - 814B222FB4E53DE37EA7F9D26B60A6BC /* CTLocalDataStore.m in Sources */, - 56ABDCA8359002FA4EAC6A67FC4C583C /* CTLocationManager.m in Sources */, - 76729D45FDF726BAA7A1AAF3ECD68CE5 /* CTLogger.m in Sources */, - EA7543408C1A3FC0B092F268B993D063 /* CTPinnedNSURLSessionDelegate.m in Sources */, - 841014D8336C2FF9F023C46F5F00FFED /* CTPlistInfo.m in Sources */, - CDEF14B4D080AEA25D30AF7B5AA1FD9C /* CTPreferences.m in Sources */, - 383FBFE4E1D65DA8B837CFEEFF208742 /* CTProfileBuilder.m in Sources */, - 083BB426FC4841FC1B226947E180BFDF /* CTSwizzle.m in Sources */, - 9D21B80A2BADB3E4598DB0CA7FFC65BA /* CTUriHelper.m in Sources */, - E62F84BA71337C6977D1F84ACBFA6BD5 /* CTUtils.m in Sources */, - 89856851FA41400B220E796422A2DFFC /* CTValidationResult.m in Sources */, - F197D6B5457109F344279DF82964372C /* CTValidator.m in Sources */, + 46DEEB62D4DC2734FF6A6DB20BAC98D6 /* CleverTap-iOS-SDK-iOS-dummy.m in Sources */, + 5F547C33247713DB7A5930AE38DBF30B /* CleverTap.m in Sources */, + A048D31965D0FAAAFF23C5151625498B /* CleverTapEventDetail.m in Sources */, + B72FF04D2204D25A99D96306F6CC2647 /* CleverTapInstanceConfig.m in Sources */, + F1CF5121C919DAA8A6DB55B308202D36 /* CleverTapTrackedViewController.m in Sources */, + 43DD5DFFD7B75129551B7BF4FA467AD0 /* CleverTapUTMDetail.m in Sources */, + 510A04A1B183505F7BD59C955D8A161E /* CTAlertViewController.m in Sources */, + 20E584334BC490EE9148DDC360F9CCBB /* CTAVPlayerControlsViewController.m in Sources */, + 7DE86E771737F6D9FEA0F30442836914 /* CTAVPlayerViewController.m in Sources */, + FE3E08D0ACA4F2BB8D400F5F16B6B7B6 /* CTBaseHeaderFooterViewController.m in Sources */, + EC1155E313A6F5DB9A6E7EA58D011C9D /* CTCertificatePinning.m in Sources */, + 899B170BD0F4D964092AB4EDC9AF6650 /* CTConstants.m in Sources */, + DCDDE491C770798D138BAD61D631C8EA /* CTCoverImageViewController.m in Sources */, + 2931AC44B9FA8080E78FC5A6CF868E4D /* CTCoverViewController.m in Sources */, + B36808604CC08B314466DB0F428AB5A3 /* CTDeviceInfo.m in Sources */, + 627C156452099451B5FE4A23BB7DA8C1 /* CTDismissButton.m in Sources */, + 2FBBEC07A86FBA7283F22D628D81276E /* CTEventBuilder.m in Sources */, + 555C7939AF6D75A6C6FE7ED073A850B4 /* CTFooterViewController.m in Sources */, + 30BC4CB4CE59D3546E6D71B2461B834C /* CTHalfInterstitialImageViewController.m in Sources */, + 327C0DC095145389EA92CCB4098E3FD4 /* CTHalfInterstitialViewController.m in Sources */, + CA90645B88381F070AAF8B0724587F31 /* CTHeaderViewController.m in Sources */, + 464333947A06BF1A097ECA3571E326E2 /* CTInAppDisplayViewController.m in Sources */, + AB87E3D7675221E6A27B0428B2154A6D /* CTInAppFCManager.m in Sources */, + D2323EEC5925346D09DE2E93245A7FA0 /* CTInAppHTMLViewController.m in Sources */, + 0CEB894A42167717B0DD0B88965BB8B5 /* CTInAppNotification.m in Sources */, + 552F43140AE88F4EBFB859BFB84FCFB9 /* CTInAppResources.m in Sources */, + 32C2095C462E3DF82294822A6D06E52A /* CTInAppUtils.m in Sources */, + D1F990017691B4A56C1EF86433ED3ED4 /* CTInterstitialImageViewController.m in Sources */, + FA76E49B0DEEC43525502122DB457CE9 /* CTInterstitialViewController.m in Sources */, + 4F9E60F5627F08B5DD7A6E2AA9A09999 /* CTKnownProfileFields.m in Sources */, + E5C5B38B151A406926445D1C1B9F43A2 /* CTLocalDataStore.m in Sources */, + 9F8A5988550A83A50B5D62455E78905A /* CTLocationManager.m in Sources */, + 26C3E7B2CDABB8A32E799A5424B02ED8 /* CTLogger.m in Sources */, + 7F5B464BDEC5BD90A0CF04FBAC7B0C3D /* CTNotificationButton.m in Sources */, + 0B9604E8639FC280AFCE5525C0DF72DE /* CTPinnedNSURLSessionDelegate.m in Sources */, + 0EA6497E515BBF774E12927B4F58FE09 /* CTPlistInfo.m in Sources */, + 127DD67C05F173C125D7FB7EA81D97F1 /* CTPreferences.m in Sources */, + 91B81F7091534A75A312209AECACB31C /* CTProfileBuilder.m in Sources */, + 4D97A497E52F42E0025BFB48E47311D4 /* CTSlider.m in Sources */, + 321D7E47128A04961D0BA327BA2CBF3D /* CTSwizzle.m in Sources */, + 26710F78640D6C950D46145F5F71C2EF /* CTUriHelper.m in Sources */, + 84ED2016F470CC060A6F0A587BDD8F30 /* CTUtils.m in Sources */, + 33A40BD65EAD1F62B4A2D378F3A12DB1 /* CTValidationResult.m in Sources */, + 7DAA9ADEF7F2DF6E99138766B9FF8EB8 /* CTValidator.m in Sources */, + AA3BFF4E465154C76F54CFB74428E1DA /* FLAnimatedImage.m in Sources */, + 2B6FC734C6CA2584BB66B4EEA276D076 /* FLAnimatedImageView.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -949,38 +1249,41 @@ ); runOnlyForDeploymentPostprocessing = 0; }; - 8C7CD79CBE7D5BF7EF43DAA91A27F5E3 /* Sources */ = { + 9078B5BA76C33B1A0C00B119FB069E65 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( - 5FBF3A4086B746F117C51B33BBB3B1C7 /* CleverTap-iOS-SDK-tvOS-dummy.m in Sources */, - 30CEAE6A2BA0FE5725A2096FD853E7E2 /* CleverTap.m in Sources */, - 401AA19F26F9A66A2E02B689E0CFF757 /* CleverTapEventDetail.m in Sources */, - 1D6953F948580CAE3E6F29E2D94AEFFA /* CleverTapInstanceConfig.m in Sources */, - 18BA64D879457ACDD15252C795728B52 /* CleverTapTrackedViewController.m in Sources */, - 10811375401EFCF85D52583E8123B8A2 /* CleverTapUTMDetail.m in Sources */, - 9CAD1A44AAED11062BEF1A3D07E375AB /* CTCertificatePinning.m in Sources */, - 05648D895C339F479535D8E7912F3018 /* CTConstants.m in Sources */, - 668B0FB9CBC1CAB96C7469E2794D2F8F /* CTDeviceInfo.m in Sources */, - 55F91F04CB07C42A24A845D97E9EFB9E /* CTDismissButton.m in Sources */, - 95FB11EC7A370EA872CF76A72D279E51 /* CTEventBuilder.m in Sources */, - 84B10EB45D62362F37C660451378537D /* CTInAppDisplayViewController.m in Sources */, - 1A02D5986CEB1C94F6E0441D1C381283 /* CTInAppFCManager.m in Sources */, - B1A350DCA350D5B66C2AACF137E4A50D /* CTInAppNotification.m in Sources */, - F2D76328EDE2B9A16F26E6922957CF7D /* CTInAppUtils.m in Sources */, - 5E4BB7955284AADDE2A1B5B633BB38C9 /* CTKnownProfileFields.m in Sources */, - FC246B6125BF9F700DF05152A86D8FB9 /* CTLocalDataStore.m in Sources */, - 50CFE1F669BA7782322802057D2CD541 /* CTLocationManager.m in Sources */, - 366DA2DB7FCE94ED288F5E4873268890 /* CTLogger.m in Sources */, - B186AF019B160F9679257F32AE3DF202 /* CTPinnedNSURLSessionDelegate.m in Sources */, - C948ECC744AAD5480FA39D945E340215 /* CTPlistInfo.m in Sources */, - 1DFCBD616D55C825CB2211CC00540F48 /* CTPreferences.m in Sources */, - 931CA895B59AB29BC7789B47956130FB /* CTProfileBuilder.m in Sources */, - 1B571069D1BC61C1F0BA09D8776A7793 /* CTSwizzle.m in Sources */, - 45AF7BB1BDBA6BD644663D9ADFA9E39A /* CTUriHelper.m in Sources */, - 4E74597E88A50E02CD0F255D2AFF85C7 /* CTUtils.m in Sources */, - 1BB3B0810C28144C2A35795C7955A80C /* CTValidationResult.m in Sources */, - 088F0F5E395CFF7D4BBB469B37268B67 /* CTValidator.m in Sources */, + 411378120CA0A042F812BA05E04A25C1 /* CleverTap-iOS-SDK-tvOS-dummy.m in Sources */, + 7CF7A8B79A4004282A42EE879411F263 /* CleverTap.m in Sources */, + 32532E93FF9A84C8C9890DC63A3BE318 /* CleverTapEventDetail.m in Sources */, + 6B1BFD349803B8193167AD98F9035057 /* CleverTapInstanceConfig.m in Sources */, + DBE0F67C0718CA0884AD2648A67F91A1 /* CleverTapTrackedViewController.m in Sources */, + 145E734BBC07C74F9683CC957C3AE67D /* CleverTapUTMDetail.m in Sources */, + 26EFE33BA60630AF279DBC79E62B7920 /* CTCertificatePinning.m in Sources */, + 6AD749D5249509F7AD35E5A5FA7F75E2 /* CTConstants.m in Sources */, + 72C4CD62DCE08667D8A3A7EF2D6D50BB /* CTDeviceInfo.m in Sources */, + A1D70D42C84A3D23CD5C9FEAE284726D /* CTEventBuilder.m in Sources */, + 790B802773FBD1D44CA2D6E870462B57 /* CTInAppDisplayViewController.m in Sources */, + 6DBA7B6BDBB696F5C8A075D491414DAE /* CTInAppFCManager.m in Sources */, + 159C0881A84A2B1F2223EC0DB904322A /* CTInAppNotification.m in Sources */, + CB0C8D00CD4D34DAEE1105072C4D6233 /* CTInAppResources.m in Sources */, + C6FD55E7E480098EE7F7D9A44BDFF8DB /* CTInAppUtils.m in Sources */, + 3DE2B72606B061F05488BF535B890223 /* CTKnownProfileFields.m in Sources */, + 4A311153F88D539B6F88D76C743D1552 /* CTLocalDataStore.m in Sources */, + 3ADAE255C58798E4D39115CA1888C516 /* CTLocationManager.m in Sources */, + 2E1B67FA5825CC43873CCCCC9A8C87AB /* CTLogger.m in Sources */, + 74460F5CE98A702959AF4418AA14C686 /* CTNotificationButton.m in Sources */, + C87655F28E553920D7A9FB7415917B43 /* CTPinnedNSURLSessionDelegate.m in Sources */, + 71F8C047665D98024A518822024D9974 /* CTPlistInfo.m in Sources */, + BCEE377821B41AF4001C660D327B79AD /* CTPreferences.m in Sources */, + 47E76CA4E5E8A2008F088EF3E8B339D4 /* CTProfileBuilder.m in Sources */, + 3AB39EB03DF665D6B08BD64BCC9A20FB /* CTSwizzle.m in Sources */, + CE8E188374AE7252235F3F04F30B24BA /* CTUriHelper.m in Sources */, + 56206664BD6EC603AA524EF95CCC11D0 /* CTUtils.m in Sources */, + 4B9E321C86BB8FA4CB1B577078B6DADB /* CTValidationResult.m in Sources */, + DFDD41F32C16925B73BE1D5D3D7638CC /* CTValidator.m in Sources */, + 35A14A069C9FCC9AFE9E3FB2BEC12075 /* FLAnimatedImage.m in Sources */, + 47421FBD8FCEEC460C7F346086DB4B27 /* FLAnimatedImageView.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -1012,13 +1315,13 @@ 544025B63D2952CCC4F95480DC296E60 /* PBXTargetDependency */ = { isa = PBXTargetDependency; name = "CleverTap-iOS-SDK-tvOS"; - target = 84710807FC10B8B2673796CA61608A06 /* CleverTap-iOS-SDK-tvOS */; + target = D232BB786801B0F13E163425C6758475 /* CleverTap-iOS-SDK-tvOS */; targetProxy = 6355539A8E6B214EB333693782F206D4 /* PBXContainerItemProxy */; }; A8FE32EA9EF5C7EAC7C3DCAEAE63BB8C /* PBXTargetDependency */ = { isa = PBXTargetDependency; name = "CleverTap-iOS-SDK-iOS"; - target = D101C7BCB05F1A764AD0A07B90ADAE07 /* CleverTap-iOS-SDK-iOS */; + target = 82EB401F9EF03080E9CC9290A678FE92 /* CleverTap-iOS-SDK-iOS */; targetProxy = E67FD72B0E4A751792BA023346C9031C /* PBXContainerItemProxy */; }; B738104469A8567A88F1E362D8C13A73 /* PBXTargetDependency */ = { @@ -1030,36 +1333,6 @@ /* End PBXTargetDependency section */ /* Begin XCBuildConfiguration section */ - 27DB542EEAAC06400FB893AE8DC408BC /* Debug */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 7E503BE6D6E8440104353881FECC1BBC /* CleverTap-iOS-SDK-tvOS.xcconfig */; - buildSettings = { - CODE_SIGN_IDENTITY = ""; - "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; - "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; - CURRENT_PROJECT_VERSION = 1; - DEFINES_MODULE = YES; - DYLIB_COMPATIBILITY_VERSION = 1; - DYLIB_CURRENT_VERSION = 1; - DYLIB_INSTALL_NAME_BASE = "@rpath"; - GCC_PREFIX_HEADER = "Target Support Files/CleverTap-iOS-SDK-tvOS/CleverTap-iOS-SDK-tvOS-prefix.pch"; - INFOPLIST_FILE = "Target Support Files/CleverTap-iOS-SDK-tvOS/Info.plist"; - INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; - MODULEMAP_FILE = "Target Support Files/CleverTap-iOS-SDK-tvOS/CleverTap-iOS-SDK-tvOS.modulemap"; - PRODUCT_MODULE_NAME = CleverTapSDK; - PRODUCT_NAME = CleverTapSDK; - SDKROOT = appletvos; - SKIP_INSTALL = YES; - SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; - TARGETED_DEVICE_FAMILY = 3; - TVOS_DEPLOYMENT_TARGET = 9.0; - VERSIONING_SYSTEM = "apple-generic"; - VERSION_INFO_PREFIX = ""; - }; - name = Debug; - }; 3205C2DE211CDD92034B5AE563E2336E /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { @@ -1124,12 +1397,10 @@ }; name = Debug; }; - 4CFD3FCBAC84EE2BBBC61E87DB1645C9 /* Debug */ = { + 347D0F679FEC3DCC24A6BD1D3C88BCC5 /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 7FC805B3EF57A8B6D6CDB67AFD0C9ACF /* Pods-ObjCStarterTests.debug.xcconfig */; + baseConfigurationReference = 7A897B06A248522C3F268A4BD2C9F8D6 /* CleverTap-iOS-SDK-tvOS.xcconfig */; buildSettings = { - ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = NO; - CLANG_ENABLE_OBJC_WEAK = NO; CODE_SIGN_IDENTITY = ""; "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; @@ -1139,31 +1410,28 @@ DYLIB_COMPATIBILITY_VERSION = 1; DYLIB_CURRENT_VERSION = 1; DYLIB_INSTALL_NAME_BASE = "@rpath"; - INFOPLIST_FILE = "Target Support Files/Pods-ObjCStarterTests/Info.plist"; + GCC_PREFIX_HEADER = "Target Support Files/CleverTap-iOS-SDK-tvOS/CleverTap-iOS-SDK-tvOS-prefix.pch"; + INFOPLIST_FILE = "Target Support Files/CleverTap-iOS-SDK-tvOS/Info.plist"; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - IPHONEOS_DEPLOYMENT_TARGET = 10.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; - MACH_O_TYPE = staticlib; - MODULEMAP_FILE = "Target Support Files/Pods-ObjCStarterTests/Pods-ObjCStarterTests.modulemap"; - OTHER_LDFLAGS = ""; - OTHER_LIBTOOLFLAGS = ""; - PODS_ROOT = "$(SRCROOT)"; - PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.${PRODUCT_NAME:rfc1034identifier}"; - PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; - SDKROOT = iphoneos; + MODULEMAP_FILE = "Target Support Files/CleverTap-iOS-SDK-tvOS/CleverTap-iOS-SDK-tvOS.modulemap"; + PRODUCT_MODULE_NAME = CleverTapSDK; + PRODUCT_NAME = CleverTapSDK; + SDKROOT = appletvos; SKIP_INSTALL = YES; - TARGETED_DEVICE_FAMILY = "1,2"; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; + TARGETED_DEVICE_FAMILY = 3; + TVOS_DEPLOYMENT_TARGET = 9.0; + VALIDATE_PRODUCT = YES; VERSIONING_SYSTEM = "apple-generic"; VERSION_INFO_PREFIX = ""; }; - name = Debug; + name = Release; }; - 58DE9CFAF95B98BC859B0B1752CD83E0 /* Release */ = { + 4C9F4FE39509B0D6C44610228880F47B /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 470FF519B33DE8AECC2BEDEBAE54AF5B /* Pods-ObjCStarterTests.release.xcconfig */; + baseConfigurationReference = 8107BA1260CE21C0A21F8119FC0D8095 /* CleverTap-iOS-SDK-iOS.xcconfig */; buildSettings = { - ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = NO; - CLANG_ENABLE_OBJC_WEAK = NO; CODE_SIGN_IDENTITY = ""; "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; @@ -1173,19 +1441,17 @@ DYLIB_COMPATIBILITY_VERSION = 1; DYLIB_CURRENT_VERSION = 1; DYLIB_INSTALL_NAME_BASE = "@rpath"; - INFOPLIST_FILE = "Target Support Files/Pods-ObjCStarterTests/Info.plist"; + GCC_PREFIX_HEADER = "Target Support Files/CleverTap-iOS-SDK-iOS/CleverTap-iOS-SDK-iOS-prefix.pch"; + INFOPLIST_FILE = "Target Support Files/CleverTap-iOS-SDK-iOS/Info.plist"; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - IPHONEOS_DEPLOYMENT_TARGET = 10.0; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; - MACH_O_TYPE = staticlib; - MODULEMAP_FILE = "Target Support Files/Pods-ObjCStarterTests/Pods-ObjCStarterTests.modulemap"; - OTHER_LDFLAGS = ""; - OTHER_LIBTOOLFLAGS = ""; - PODS_ROOT = "$(SRCROOT)"; - PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.${PRODUCT_NAME:rfc1034identifier}"; - PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; + MODULEMAP_FILE = "Target Support Files/CleverTap-iOS-SDK-iOS/CleverTap-iOS-SDK-iOS.modulemap"; + PRODUCT_MODULE_NAME = CleverTapSDK; + PRODUCT_NAME = CleverTapSDK; SDKROOT = iphoneos; SKIP_INSTALL = YES; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; TARGETED_DEVICE_FAMILY = "1,2"; VALIDATE_PRODUCT = YES; VERSIONING_SYSTEM = "apple-generic"; @@ -1193,10 +1459,12 @@ }; name = Release; }; - 59B7A054355E30EF945D57366A0B89DB /* Release */ = { + 4CFD3FCBAC84EE2BBBC61E87DB1645C9 /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 7E503BE6D6E8440104353881FECC1BBC /* CleverTap-iOS-SDK-tvOS.xcconfig */; + baseConfigurationReference = 7FC805B3EF57A8B6D6CDB67AFD0C9ACF /* Pods-ObjCStarterTests.debug.xcconfig */; buildSettings = { + ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = NO; + CLANG_ENABLE_OBJC_WEAK = NO; CODE_SIGN_IDENTITY = ""; "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; @@ -1206,28 +1474,31 @@ DYLIB_COMPATIBILITY_VERSION = 1; DYLIB_CURRENT_VERSION = 1; DYLIB_INSTALL_NAME_BASE = "@rpath"; - GCC_PREFIX_HEADER = "Target Support Files/CleverTap-iOS-SDK-tvOS/CleverTap-iOS-SDK-tvOS-prefix.pch"; - INFOPLIST_FILE = "Target Support Files/CleverTap-iOS-SDK-tvOS/Info.plist"; + INFOPLIST_FILE = "Target Support Files/Pods-ObjCStarterTests/Info.plist"; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 10.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; - MODULEMAP_FILE = "Target Support Files/CleverTap-iOS-SDK-tvOS/CleverTap-iOS-SDK-tvOS.modulemap"; - PRODUCT_MODULE_NAME = CleverTapSDK; - PRODUCT_NAME = CleverTapSDK; - SDKROOT = appletvos; + MACH_O_TYPE = staticlib; + MODULEMAP_FILE = "Target Support Files/Pods-ObjCStarterTests/Pods-ObjCStarterTests.modulemap"; + OTHER_LDFLAGS = ""; + OTHER_LIBTOOLFLAGS = ""; + PODS_ROOT = "$(SRCROOT)"; + PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.${PRODUCT_NAME:rfc1034identifier}"; + PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; + SDKROOT = iphoneos; SKIP_INSTALL = YES; - SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; - TARGETED_DEVICE_FAMILY = 3; - TVOS_DEPLOYMENT_TARGET = 9.0; - VALIDATE_PRODUCT = YES; + TARGETED_DEVICE_FAMILY = "1,2"; VERSIONING_SYSTEM = "apple-generic"; VERSION_INFO_PREFIX = ""; }; - name = Release; + name = Debug; }; - 744410647288BDEBBEDD076C3B0598A1 /* Debug */ = { + 58DE9CFAF95B98BC859B0B1752CD83E0 /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 96FA7F8F9A1080D8AA7A4254743B7A1F /* CleverTap-iOS-SDK-iOS.xcconfig */; + baseConfigurationReference = 470FF519B33DE8AECC2BEDEBAE54AF5B /* Pods-ObjCStarterTests.release.xcconfig */; buildSettings = { + ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = NO; + CLANG_ENABLE_OBJC_WEAK = NO; CODE_SIGN_IDENTITY = ""; "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; @@ -1237,22 +1508,25 @@ DYLIB_COMPATIBILITY_VERSION = 1; DYLIB_CURRENT_VERSION = 1; DYLIB_INSTALL_NAME_BASE = "@rpath"; - GCC_PREFIX_HEADER = "Target Support Files/CleverTap-iOS-SDK-iOS/CleverTap-iOS-SDK-iOS-prefix.pch"; - INFOPLIST_FILE = "Target Support Files/CleverTap-iOS-SDK-iOS/Info.plist"; + INFOPLIST_FILE = "Target Support Files/Pods-ObjCStarterTests/Info.plist"; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - IPHONEOS_DEPLOYMENT_TARGET = 8.0; + IPHONEOS_DEPLOYMENT_TARGET = 10.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; - MODULEMAP_FILE = "Target Support Files/CleverTap-iOS-SDK-iOS/CleverTap-iOS-SDK-iOS.modulemap"; - PRODUCT_MODULE_NAME = CleverTapSDK; - PRODUCT_NAME = CleverTapSDK; + MACH_O_TYPE = staticlib; + MODULEMAP_FILE = "Target Support Files/Pods-ObjCStarterTests/Pods-ObjCStarterTests.modulemap"; + OTHER_LDFLAGS = ""; + OTHER_LIBTOOLFLAGS = ""; + PODS_ROOT = "$(SRCROOT)"; + PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.${PRODUCT_NAME:rfc1034identifier}"; + PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; SDKROOT = iphoneos; SKIP_INSTALL = YES; - SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; TARGETED_DEVICE_FAMILY = "1,2"; + VALIDATE_PRODUCT = YES; VERSIONING_SYSTEM = "apple-generic"; VERSION_INFO_PREFIX = ""; }; - name = Debug; + name = Release; }; 7FF9BABAF6B9E34590C802AF5EB588F8 /* Release */ = { isa = XCBuildConfiguration; @@ -1449,10 +1723,12 @@ }; name = Debug; }; - B47C33221F1DFB86B98CBFD2DFC35D5F /* Release */ = { + E1E09323831AB5BBB8A10408DE68A842 /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 96FA7F8F9A1080D8AA7A4254743B7A1F /* CleverTap-iOS-SDK-iOS.xcconfig */; + baseConfigurationReference = 59586433960972D1F918FB8B690AF0FE /* Pods-ObjCStarterUITests.release.xcconfig */; buildSettings = { + ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = NO; + CLANG_ENABLE_OBJC_WEAK = NO; CODE_SIGN_IDENTITY = ""; "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; @@ -1462,17 +1738,19 @@ DYLIB_COMPATIBILITY_VERSION = 1; DYLIB_CURRENT_VERSION = 1; DYLIB_INSTALL_NAME_BASE = "@rpath"; - GCC_PREFIX_HEADER = "Target Support Files/CleverTap-iOS-SDK-iOS/CleverTap-iOS-SDK-iOS-prefix.pch"; - INFOPLIST_FILE = "Target Support Files/CleverTap-iOS-SDK-iOS/Info.plist"; + INFOPLIST_FILE = "Target Support Files/Pods-ObjCStarterUITests/Info.plist"; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - IPHONEOS_DEPLOYMENT_TARGET = 8.0; + IPHONEOS_DEPLOYMENT_TARGET = 10.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; - MODULEMAP_FILE = "Target Support Files/CleverTap-iOS-SDK-iOS/CleverTap-iOS-SDK-iOS.modulemap"; - PRODUCT_MODULE_NAME = CleverTapSDK; - PRODUCT_NAME = CleverTapSDK; + MACH_O_TYPE = staticlib; + MODULEMAP_FILE = "Target Support Files/Pods-ObjCStarterUITests/Pods-ObjCStarterUITests.modulemap"; + OTHER_LDFLAGS = ""; + OTHER_LIBTOOLFLAGS = ""; + PODS_ROOT = "$(SRCROOT)"; + PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.${PRODUCT_NAME:rfc1034identifier}"; + PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; SDKROOT = iphoneos; SKIP_INSTALL = YES; - SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; TARGETED_DEVICE_FAMILY = "1,2"; VALIDATE_PRODUCT = YES; VERSIONING_SYSTEM = "apple-generic"; @@ -1480,12 +1758,10 @@ }; name = Release; }; - E1E09323831AB5BBB8A10408DE68A842 /* Release */ = { + E1E4298B42DB30B53CE81501207B2599 /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 59586433960972D1F918FB8B690AF0FE /* Pods-ObjCStarterUITests.release.xcconfig */; + baseConfigurationReference = 7A897B06A248522C3F268A4BD2C9F8D6 /* CleverTap-iOS-SDK-tvOS.xcconfig */; buildSettings = { - ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = NO; - CLANG_ENABLE_OBJC_WEAK = NO; CODE_SIGN_IDENTITY = ""; "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; @@ -1495,25 +1771,22 @@ DYLIB_COMPATIBILITY_VERSION = 1; DYLIB_CURRENT_VERSION = 1; DYLIB_INSTALL_NAME_BASE = "@rpath"; - INFOPLIST_FILE = "Target Support Files/Pods-ObjCStarterUITests/Info.plist"; + GCC_PREFIX_HEADER = "Target Support Files/CleverTap-iOS-SDK-tvOS/CleverTap-iOS-SDK-tvOS-prefix.pch"; + INFOPLIST_FILE = "Target Support Files/CleverTap-iOS-SDK-tvOS/Info.plist"; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - IPHONEOS_DEPLOYMENT_TARGET = 10.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; - MACH_O_TYPE = staticlib; - MODULEMAP_FILE = "Target Support Files/Pods-ObjCStarterUITests/Pods-ObjCStarterUITests.modulemap"; - OTHER_LDFLAGS = ""; - OTHER_LIBTOOLFLAGS = ""; - PODS_ROOT = "$(SRCROOT)"; - PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.${PRODUCT_NAME:rfc1034identifier}"; - PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; - SDKROOT = iphoneos; + MODULEMAP_FILE = "Target Support Files/CleverTap-iOS-SDK-tvOS/CleverTap-iOS-SDK-tvOS.modulemap"; + PRODUCT_MODULE_NAME = CleverTapSDK; + PRODUCT_NAME = CleverTapSDK; + SDKROOT = appletvos; SKIP_INSTALL = YES; - TARGETED_DEVICE_FAMILY = "1,2"; - VALIDATE_PRODUCT = YES; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; + TARGETED_DEVICE_FAMILY = 3; + TVOS_DEPLOYMENT_TARGET = 9.0; VERSIONING_SYSTEM = "apple-generic"; VERSION_INFO_PREFIX = ""; }; - name = Release; + name = Debug; }; E64BE88F1CA90EF96AF9CDAF42F09761 /* Debug */ = { isa = XCBuildConfiguration; @@ -1549,6 +1822,36 @@ }; name = Debug; }; + F60560D5F12C2572DAA289E2D8763065 /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 8107BA1260CE21C0A21F8119FC0D8095 /* CleverTap-iOS-SDK-iOS.xcconfig */; + buildSettings = { + CODE_SIGN_IDENTITY = ""; + "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; + CURRENT_PROJECT_VERSION = 1; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + GCC_PREFIX_HEADER = "Target Support Files/CleverTap-iOS-SDK-iOS/CleverTap-iOS-SDK-iOS-prefix.pch"; + INFOPLIST_FILE = "Target Support Files/CleverTap-iOS-SDK-iOS/Info.plist"; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + MODULEMAP_FILE = "Target Support Files/CleverTap-iOS-SDK-iOS/CleverTap-iOS-SDK-iOS.modulemap"; + PRODUCT_MODULE_NAME = CleverTapSDK; + PRODUCT_NAME = CleverTapSDK; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; + TARGETED_DEVICE_FAMILY = "1,2"; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Debug; + }; /* End XCBuildConfiguration section */ /* Begin XCConfigurationList section */ @@ -1561,11 +1864,11 @@ defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; - 2366BD3B02476A1D7EADEE5F11F130F4 /* Build configuration list for PBXNativeTarget "CleverTap-iOS-SDK-iOS" */ = { + 152F98594A78642C26677AEDF5EC18C7 /* Build configuration list for PBXNativeTarget "CleverTap-iOS-SDK-tvOS" */ = { isa = XCConfigurationList; buildConfigurations = ( - 744410647288BDEBBEDD076C3B0598A1 /* Debug */, - B47C33221F1DFB86B98CBFD2DFC35D5F /* Release */, + E1E4298B42DB30B53CE81501207B2599 /* Debug */, + 347D0F679FEC3DCC24A6BD1D3C88BCC5 /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; @@ -1588,15 +1891,6 @@ defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; - 76613A7A3C3BE3B35ECA55292AC29F3E /* Build configuration list for PBXNativeTarget "CleverTap-iOS-SDK-tvOS" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 27DB542EEAAC06400FB893AE8DC408BC /* Debug */, - 59B7A054355E30EF945D57366A0B89DB /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; BD292037101A248D8AA3572F408CCA75 /* Build configuration list for PBXNativeTarget "Pods-ObjCStarterUITests" */ = { isa = XCConfigurationList; buildConfigurations = ( @@ -1615,6 +1909,15 @@ defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; + F7968B2F653E5140F25B9FD5FBEAA97D /* Build configuration list for PBXNativeTarget "CleverTap-iOS-SDK-iOS" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + F60560D5F12C2572DAA289E2D8763065 /* Debug */, + 4C9F4FE39509B0D6C44610228880F47B /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; /* End XCConfigurationList section */ }; rootObject = D41D8CD98F00B204E9800998ECF8427E /* Project object */; diff --git a/ObjCStarter/Pods/Target Support Files/CleverTap-iOS-SDK-iOS/Info.plist b/ObjCStarter/Pods/Target Support Files/CleverTap-iOS-SDK-iOS/Info.plist index 9ae03a0c..3ac477e6 100644 --- a/ObjCStarter/Pods/Target Support Files/CleverTap-iOS-SDK-iOS/Info.plist +++ b/ObjCStarter/Pods/Target Support Files/CleverTap-iOS-SDK-iOS/Info.plist @@ -15,7 +15,7 @@ CFBundlePackageType FMWK CFBundleShortVersionString - 3.2.0 + 3.3.0 CFBundleSignature ???? CFBundleVersion diff --git a/ObjCStarter/Pods/Target Support Files/CleverTap-iOS-SDK-tvOS/Info.plist b/ObjCStarter/Pods/Target Support Files/CleverTap-iOS-SDK-tvOS/Info.plist index 9ae03a0c..3ac477e6 100644 --- a/ObjCStarter/Pods/Target Support Files/CleverTap-iOS-SDK-tvOS/Info.plist +++ b/ObjCStarter/Pods/Target Support Files/CleverTap-iOS-SDK-tvOS/Info.plist @@ -15,7 +15,7 @@ CFBundlePackageType FMWK CFBundleShortVersionString - 3.2.0 + 3.3.0 CFBundleSignature ???? CFBundleVersion