diff --git a/.gitignore b/.gitignore index d48de0bc..7d35ed6d 100644 --- a/.gitignore +++ b/.gitignore @@ -1,5 +1,6 @@ *.xcuserstate Samples/Cordova/ExampleProject/platforms/android/.idea/ +Samples/Cordova/ExampleProject/plugins/ Samples/Cordova/ExampleProject/platforms/android/.gradle/ Samples/Cordova/ExampleProject/platforms/android/build/ Samples/Cordova/ExampleProject/platforms/android/CordovaLib/build/ diff --git a/CHANGELOG.md b/CHANGELOG.md index b03ecc11..3e52802a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,68 @@ Change Log ========== +Version 2.7.0 *(August 2, 2023)* +------------------------------------------- +#### New Features + +**Android specific** +* Supports [CleverTap Android SDK v5.1.0](https://github.com/CleverTap/clevertap-android-sdk/releases/tag/corev5.1.0_ptv1.1.0). +* Supports [cordova android 12.0.0](https://cordova.apache.org/announcements/2023/05/22/cordova-android-12.0.0.html) +* `deleteInboxMessagesForIds(messageIDs)` is now supported in Android as well. +* New callback `onCleverTapInAppNotificationShow(JSONObject)` +* **Behavioral change of `onCleverTapInboxItemClick`**: + - Previously, the callback was raised when the App Inbox Item is clicked. + - Now, it is also raised when the App Inbox button and Item is clicked. + + +**iOS specific** +* Supports [CleverTap iOS SDK v5.1.2](https://github.com/CleverTap/clevertap-ios-sdk/releases/tag/5.1.2). +* Supports [cordova ios 7.0.0](https://cordova.apache.org/announcements/2023/07/10/cordova-ios-7.0.0.html) + +**Common for both android and iOS** +* Adds below new public APIs for supporting [Android 13 notification runtime permission](https://developer.android.com/develop/ui/views/notifications/notification-permission) + * `isPushPermissionGranted(successCallback)` [Usage can be found here](docs/pushprimer.md#get-the-push-notification-permission-status) + * `promptPushPrimer(JSONObject)` [Usage can be found here](docs/pushprimer.md#push-primer-using-half-interstitial-local-in-app) + * `promptForPushPermission(boolean)` [Usage can be found here](docs/pushprimer.md#prompt-the-notification-permission-dialog-without-push-primer) + * New callback `onCleverTapPushPermissionResponseReceived` available which returns after user Allows/Denies notification permission [Usage can be found here](docs/pushprimer.md#available-callbacks-for-push-primer) +* Adds support for Remote Config Variables. Please refer to the [Variables.md](docs/Variables.md) file to + read more on how to integrate this to your app. +* Adds new API, `markReadInboxMessagesForIds(messageIDs)` to mark read an array of + Inbox Messages. +* Adds new API, `dismissInbox()` to dismiss the App Inbox. + +#### API Changes + +* **Deprecated:** The following methods and callbacks related to Product Config and Feature Flags have + been marked as deprecated in this release, instead use new remote config variables feature. These + methods and callbacks will be removed in the future versions with prior notice. + * Product config + - `setDefaultsMap()` + - `fetch()` + - `fetchWithMinimumFetchIntervalInSeconds()` + - `activate()` + - `fetchAndActivate()` + - `setMinimumFetchIntervalInSeconds()` + - `getLastFetchTimeStampInMillis()` + - `getString()` + - `getBoolean()` + - `getLong()` + - `getDouble()` + - `reset()` + - callback `onCleverTapProductConfigDidInitialize` + - callback `onCleverTapProductConfigDidFetch` + - callback `onCleverTapProductConfigDidActivate` + + * Feature flags + - `getFeatureFlag()` + - callback `onCleverTapFeatureFlagsDidUpdate` + +#### Breaking API Changes + +* **Return value change of `onCleverTapInboxItemClick` callback in android and `messageDidSelect` callback in iOS**: callback returns `JSONObject` with below entries + - `data` corresponds to the payload of clicked inbox item + - The `contentPageIndex` corresponds to the page index of the content, which ranges from 0 to the total number of pages for carousel templates. For non-carousel templates, the value is always 0, as they only have one page of content. + - The `buttonIndex` represents the index of the App Inbox button clicked (0, 1, or 2). A value of -1 indicates the App Inbox item is clicked. + Version 2.6.2 *(April 18, 2023)* ------------------------------------------- - Fixed compilation errors in xcode 14.3+ in iOS. diff --git a/README.md b/README.md index 4663a0eb..2b111e10 100644 --- a/README.md +++ b/README.md @@ -19,8 +19,8 @@ To get started, sign up [here](https://clevertap.com/live-product-demo/). ## ✅ Supported Versions -- [CleverTap Android SDK version 4.6.6](https://github.com/CleverTap/clevertap-android-sdk/releases/tag/corev4.6.6) -- [CleverTap iOS SDK version 4.2.2](https://github.com/CleverTap/clevertap-ios-sdk/releases/tag/4.2.2) +- [CleverTap Android SDK version 5.1.0](https://github.com/CleverTap/clevertap-android-sdk/releases/tag/corev5.1.0_ptv1.1.0) +- [CleverTap iOS SDK version 5.1.2](https://github.com/CleverTap/clevertap-ios-sdk/releases/tag/5.1.2) ## 🚀 Installation and Quick Start diff --git a/Samples/Cordova/ExampleProject/package-lock.json b/Samples/Cordova/ExampleProject/package-lock.json index 5b647be2..38da14cf 100644 --- a/Samples/Cordova/ExampleProject/package-lock.json +++ b/Samples/Cordova/ExampleProject/package-lock.json @@ -41,6 +41,12 @@ "fastq": "^1.6.0" } }, + "@xmldom/xmldom": { + "version": "0.8.10", + "resolved": "https://registry.npmjs.org/@xmldom/xmldom/-/xmldom-0.8.10.tgz", + "integrity": "sha512-2WALfTl4xo2SkGCYRt6rDTFfk9R1czmBvUQy12gK2KuRKIpWEhcbbzy8EZXtz/jkRqHX8bFEc6FC1HjX4TUWYw==", + "dev": true + }, "abbrev": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", @@ -48,20 +54,12 @@ "dev": true }, "android-versions": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/android-versions/-/android-versions-1.8.1.tgz", - "integrity": "sha512-5a0YyylAk6pPM2Ezi0vWaPPNbS6tSNRs+micbgk5NpHEN5YW1ez+T94G5orysfwBEBDMHoxm5GNc5ZDUPgRrhw==", + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/android-versions/-/android-versions-1.8.2.tgz", + "integrity": "sha512-2MT/Y/mR3BLSbR9E3ugwvE/aA4k84XtjG2Iusu4pRKt4FwfpEvIEAHzm7ZBhL3/aTVNdx3PzZ+sAiK+Dbc4r9A==", "dev": true, "requires": { - "semver": "^5.7.1" - }, - "dependencies": { - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true - } + "semver": "^7.5.2" } }, "ansi": { @@ -138,8 +136,8 @@ } }, "clevertap-cordova": { - "version": "git+https://github.com/CleverTap/clevertap-cordova.git#d6485d722e99910e345587c41377496edabd311b", - "from": "git+https://github.com/CleverTap/clevertap-cordova.git#SDK-2617-FixInboxCallback", + "version": "git+https://github.com/CleverTap/clevertap-cordova.git#159e01de050f808b19300d0bdf33fb394a440a8e", + "from": "git+https://github.com/CleverTap/clevertap-cordova.git#SDK-3108-Support_iOS_SDK_5.1.1", "dev": true }, "concat-map": { @@ -222,34 +220,103 @@ } }, "cordova-ios": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/cordova-ios/-/cordova-ios-6.2.0.tgz", - "integrity": "sha512-sLjZg2QBI1SpQVwfe0MSn89YNVkBGLW9Q1vcFJBsqKBrhvoEOJ5Ytq0gwqdhgTOGzlwJUfxC6OHM3jcsRjtYrw==", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/cordova-ios/-/cordova-ios-7.0.0.tgz", + "integrity": "sha512-uMeGZZa2NBRx8xbM4kgt3aQW72XxS3lkyJhWS3j31+4epLtxthsMkWZ/IdjovHWL4Ibmq3E6/PQYL5SURUIuwQ==", "dev": true, "requires": { - "cordova-common": "^4.0.2", - "fs-extra": "^9.1.0", + "cordova-common": "^5.0.0", + "execa": "^5.1.1", + "fs-extra": "^11.1.1", "ios-sim": "^8.0.2", - "nopt": "^5.0.0", - "plist": "^3.0.1", - "semver": "^7.3.4", + "nopt": "^7.1.0", + "plist": "^3.0.6", + "semver": "^7.4.0", "unorm": "^1.6.0", - "which": "^2.0.2", + "which": "^3.0.0", "xcode": "^3.0.1", "xml-escape": "^1.1.0" }, "dependencies": { + "abbrev": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-2.0.0.tgz", + "integrity": "sha512-6/mh1E2u2YgEsCHdY0Yx5oW+61gZU+1vXaoiHHrpKeuRNNgFvS+/jrwHiQhB5apAf5oB7UB7E19ol2R2LKH8hQ==", + "dev": true + }, + "bplist-parser": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/bplist-parser/-/bplist-parser-0.3.2.tgz", + "integrity": "sha512-apC2+fspHGI3mMKj+dGevkGo/tCqVB8jMb6i+OX+E29p0Iposz07fABkRIfVUPNd5A5VbuOz1bZbnmkKLYF+wQ==", + "dev": true, + "requires": { + "big-integer": "1.6.x" + } + }, + "cordova-common": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/cordova-common/-/cordova-common-5.0.0.tgz", + "integrity": "sha512-6Aa7o52/iEvsKx6K94ijzFel5acCULR49KL27OUVhEpJ4oS7Dc3y2eOP1Eu0P4Wmiw/eLEDQjGXGiAa2D5zFZA==", + "dev": true, + "requires": { + "@netflix/nerror": "^1.1.3", + "ansi": "^0.3.1", + "bplist-parser": "^0.3.2", + "cross-spawn": "^7.0.3", + "elementtree": "^0.1.7", + "endent": "^2.1.0", + "fast-glob": "^3.2.12", + "fs-extra": "^11.1.0", + "glob": "^7.1.6", + "lodash.assign": "^4.2.0", + "lodash.isdate": "^4.0.1", + "lodash.isobject": "^3.0.2", + "lodash.zip": "^4.2.0", + "plist": "^3.0.6", + "q": "^1.5.1", + "read-chunk": "^3.2.0", + "strip-bom": "^4.0.0" + } + }, + "endent": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/endent/-/endent-2.1.0.tgz", + "integrity": "sha512-r8VyPX7XL8U01Xgnb1CjZ3XV+z90cXIJ9JPE/R9SEC9vpw2P6CfsRPJmp20DppC5N7ZAMCmjYkJIa744Iyg96w==", + "dev": true, + "requires": { + "dedent": "^0.7.0", + "fast-json-parse": "^1.0.3", + "objectorarray": "^1.0.5" + } + }, "fs-extra": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", - "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", + "version": "11.1.1", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.1.1.tgz", + "integrity": "sha512-MGIE4HOvQCeUCzmlHs0vXpih4ysz4wg9qiSAu6cd42lVwPbTM1TjV7RusoyQqMmk/95gdQZX72u+YW+c3eEpFQ==", "dev": true, "requires": { - "at-least-node": "^1.0.0", "graceful-fs": "^4.2.0", "jsonfile": "^6.0.1", "universalify": "^2.0.0" } + }, + "nopt": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-7.2.0.tgz", + "integrity": "sha512-CVDtwCdhYIvnAzFoJ6NJ6dX3oga9/HyciQDnG1vQDjSLMeKLJ4A93ZqYKDrgYSr1FBY5/hMYC+2VCi24pgpkGA==", + "dev": true, + "requires": { + "abbrev": "^2.0.0" + } + }, + "which": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/which/-/which-3.0.1.tgz", + "integrity": "sha512-XA1b62dzQzLfaEOSQFTCOd5KFf/1VSzZo7/7TUjnya6u0vGGKzU96UQBZTAThCb2j4/xjBAyii1OhRLJEivHvg==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } } } }, @@ -314,9 +381,9 @@ "dev": true }, "fast-glob": { - "version": "3.2.12", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.12.tgz", - "integrity": "sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==", + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.1.tgz", + "integrity": "sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==", "dev": true, "requires": { "@nodelib/fs.stat": "^2.0.2", @@ -403,9 +470,9 @@ } }, "graceful-fs": { - "version": "4.2.10", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", - "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==", + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", "dev": true }, "has": { @@ -481,9 +548,9 @@ } }, "is-core-module": { - "version": "2.11.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.11.0.tgz", - "integrity": "sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw==", + "version": "2.12.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.12.1.tgz", + "integrity": "sha512-Q4ZuBAe2FUsKtyQJoQHlvP8OvBERxO3jEmy1I7hcRXcJBGGHFh/aJBswbXuS9sgrDH2QUO8ilkwNPHvHMd8clg==", "dev": true, "requires": { "has": "^1.0.3" @@ -544,6 +611,30 @@ "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", "dev": true }, + "lodash.assign": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/lodash.assign/-/lodash.assign-4.2.0.tgz", + "integrity": "sha512-hFuH8TY+Yji7Eja3mGiuAxBqLagejScbG8GbG0j6o9vzn0YL14My+ktnqtZgFTosKymC9/44wP6s7xyuLfnClw==", + "dev": true + }, + "lodash.isdate": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/lodash.isdate/-/lodash.isdate-4.0.1.tgz", + "integrity": "sha512-hg5B1GD+R9egsBgMwmAhk+V53Us03TVvXT4dnyKugEfsD4QKuG9Wlyvxq8OGy2nu7qVGsh4DRSnMk33hoWBq/Q==", + "dev": true + }, + "lodash.isobject": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/lodash.isobject/-/lodash.isobject-3.0.2.tgz", + "integrity": "sha512-3/Qptq2vr7WeJbB4KHUSKlq8Pl7ASXi3UG6CMbBm8WRtXi8+GHm7mKaU3urfpSEzWe2wCIChs6/sdocUsTKJiA==", + "dev": true + }, + "lodash.zip": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/lodash.zip/-/lodash.zip-4.2.0.tgz", + "integrity": "sha512-C7IOaBBK/0gMORRBd8OETNx3kmOkgIWIPvyDpZSCTwUrpYmgZwJkjZeOD8ww4xbOUOs4/attY+pciKvadNfFbg==", + "dev": true + }, "lru-cache": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", @@ -674,11 +765,12 @@ "dev": true }, "plist": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/plist/-/plist-3.0.6.tgz", - "integrity": "sha512-WiIVYyrp8TD4w8yCvyeIr+lkmrGRd5u0VbRnU+tP/aRLxP/YadJUYOMZJ/6hIa3oUyVCsycXvtNRgd5XBJIbiA==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/plist/-/plist-3.1.0.tgz", + "integrity": "sha512-uysumyrvkUX0rX/dEVqt8gC3sTBzd4zoWfLeS29nb53imdaXVvLINYXTI2GNqzaMuvacNx4uJQ8+b3zXR0pkgQ==", "dev": true, "requires": { + "@xmldom/xmldom": "^0.8.8", "base64-js": "^1.5.1", "xmlbuilder": "^15.1.1" } @@ -723,12 +815,12 @@ } }, "resolve": { - "version": "1.22.1", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz", - "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==", + "version": "1.22.2", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.2.tgz", + "integrity": "sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g==", "dev": true, "requires": { - "is-core-module": "^2.9.0", + "is-core-module": "^2.11.0", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" } @@ -755,9 +847,9 @@ "dev": true }, "semver": { - "version": "7.3.8", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", - "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", "dev": true, "requires": { "lru-cache": "^6.0.0" diff --git a/Samples/Cordova/ExampleProject/package.json b/Samples/Cordova/ExampleProject/package.json index 258d93bb..7c9c0578 100644 --- a/Samples/Cordova/ExampleProject/package.json +++ b/Samples/Cordova/ExampleProject/package.json @@ -13,10 +13,10 @@ "author": "CleverTap", "license": "Apache-2.0", "devDependencies": { - "clevertap-cordova": "git+https://github.com/CleverTap/clevertap-cordova.git#SDK-2617-FixInboxCallback", + "clevertap-cordova": "git+https://github.com/CleverTap/clevertap-cordova.git#SDK-3108-Support_iOS_SDK_5.1.1", "cordova-android": "^11.0.0", "cordova-android-support-gradle-release": "^3.0.1", - "cordova-ios": "^6.2.0", + "cordova-ios": "^7.0.0", "ios": "0.0.1" }, "cordova": { @@ -25,17 +25,17 @@ "ANDROID_SUPPORT_VERSION": "27.+" }, "clevertap-cordova": { - "CLEVERTAP_ACCOUNT_ID": "TEST-R78-ZZK-955Z", - "CLEVERTAP_TOKEN": "TEST-311-ba2" + "CLEVERTAP_ACCOUNT_ID": "TEST-R55-999-486Z", + "CLEVERTAP_TOKEN": "TEST-ccc-552" } }, "platforms": [ - "ios", - "android" + "android", + "ios" ] }, "dependencies": { "lru-cache": "^6.0.0", "q": "^1.5.1" } -} +} \ No newline at end of file diff --git a/Samples/Cordova/ExampleProject/platforms/android/app/src/main/AndroidManifest.xml b/Samples/Cordova/ExampleProject/platforms/android/app/src/main/AndroidManifest.xml index d59e7c12..521664fd 100644 --- a/Samples/Cordova/ExampleProject/platforms/android/app/src/main/AndroidManifest.xml +++ b/Samples/Cordova/ExampleProject/platforms/android/app/src/main/AndroidManifest.xml @@ -22,6 +22,8 @@ + + diff --git a/Samples/Cordova/ExampleProject/platforms/android/app/src/main/assets/www/js/index.js b/Samples/Cordova/ExampleProject/platforms/android/app/src/main/assets/www/js/index.js index 54a5f12d..c481d9db 100644 --- a/Samples/Cordova/ExampleProject/platforms/android/app/src/main/assets/www/js/index.js +++ b/Samples/Cordova/ExampleProject/platforms/android/app/src/main/assets/www/js/index.js @@ -94,7 +94,14 @@ function setupButtons() { ["title","Feature flag"], ["get Feature Flag", () => CleverTap.getFeatureFlag("test", true, val => log("Value is " + val))], - + + ["title","Product Experiences"], + ["get Feature Flag", () => CleverTap.getFeatureFlag("test", true, val => log("Value is " + val))], + +// defineVariables({ +// "cordova_var_string": "cordova_var_string_value" +// })], + ["title","Device Identifiers"], ["get CleverTap ID", () => CleverTap.getCleverTapID(val => log("getCleverTapID is " + val))], @@ -281,6 +288,7 @@ function initListeners() { CleverTap.getAllInboxMessages(val => log("Inbox messages are " + val)) CleverTap.getUnreadInboxMessages(val => log("Unread Inbox messages are " + val)) CleverTap.deleteInboxMessageForId("messageId") + CleverTap.deleteInboxMessagesForIds(["id1", "id2"]) CleverTap.markReadInboxMessageForId("messageId") CleverTap.pushInboxNotificationViewedEventForId("messageId") CleverTap.pushInboxNotificationClickedEventForId("messageId") @@ -357,4 +365,4 @@ document.addEventListener( false ) //TEST-R78-ZZK-955Z TEST-311-ba2 -// following tag combination gives a very clean log stream under logcat(make sure to check regex) : chromium|CleverTap \ No newline at end of file +// following tag combination gives a very clean log stream under logcat(make sure to check regex) : chromium|CleverTap diff --git a/Samples/Cordova/ExampleProject/platforms/ios/CordovaLib/Classes/Private/CDVJSON_private.h b/Samples/Cordova/ExampleProject/platforms/ios/CordovaLib/Classes/Private/CDVJSON_private.h index afb5cc66..fab728ff 100644 --- a/Samples/Cordova/ExampleProject/platforms/ios/CordovaLib/Classes/Private/CDVJSON_private.h +++ b/Samples/Cordova/ExampleProject/platforms/ios/CordovaLib/Classes/Private/CDVJSON_private.h @@ -17,6 +17,8 @@ under the License. */ +@import Foundation; + @interface NSArray (CDVJSONSerializingPrivate) - (NSString*)cdv_JSONString; @end diff --git a/Samples/Cordova/ExampleProject/platforms/ios/CordovaLib/Classes/Private/CDVJSON_private.m b/Samples/Cordova/ExampleProject/platforms/ios/CordovaLib/Classes/Private/CDVJSON_private.m index 175ed398..5c13593e 100644 --- a/Samples/Cordova/ExampleProject/platforms/ios/CordovaLib/Classes/Private/CDVJSON_private.m +++ b/Samples/Cordova/ExampleProject/platforms/ios/CordovaLib/Classes/Private/CDVJSON_private.m @@ -17,8 +17,9 @@ Licensed to the Apache Software Foundation (ASF) under one under the License. */ +@import Foundation; + #import "CDVJSON_private.h" -#import @implementation NSArray (CDVJSONSerializingPrivate) diff --git a/Samples/Cordova/ExampleProject/platforms/ios/CordovaLib/Classes/Private/Plugins/CDVIntentAndNavigationFilter/CDVIntentAndNavigationFilter.h b/Samples/Cordova/ExampleProject/platforms/ios/CordovaLib/Classes/Private/Plugins/CDVIntentAndNavigationFilter/CDVIntentAndNavigationFilter.h index 14c6a66d..652cb39a 100644 --- a/Samples/Cordova/ExampleProject/platforms/ios/CordovaLib/Classes/Private/Plugins/CDVIntentAndNavigationFilter/CDVIntentAndNavigationFilter.h +++ b/Samples/Cordova/ExampleProject/platforms/ios/CordovaLib/Classes/Private/Plugins/CDVIntentAndNavigationFilter/CDVIntentAndNavigationFilter.h @@ -18,7 +18,7 @@ */ #import -#import +#import #define CDVWebViewNavigationType int @@ -30,7 +30,7 @@ typedef NS_ENUM(NSInteger, CDVIntentAndNavigationFilterValue) { @interface CDVIntentAndNavigationFilter : CDVPlugin -+ (CDVIntentAndNavigationFilterValue) filterUrl:(NSURL*)url intentsWhitelist:(CDVWhitelist*)intentsWhitelist navigationsWhitelist:(CDVWhitelist*)navigationsWhitelist; ++ (CDVIntentAndNavigationFilterValue) filterUrl:(NSURL*)url allowIntentsList:(CDVAllowList*)allowIntentsList navigationsAllowList:(CDVAllowList*)navigationsAllowList; + (BOOL)shouldOverrideLoadWithRequest:(NSURLRequest*)request navigationType:(CDVWebViewNavigationType)navigationType filterValue:(CDVIntentAndNavigationFilterValue)filterValue; + (BOOL)shouldOpenURLRequest:(NSURLRequest*)request navigationType:(CDVWebViewNavigationType)navigationType; @end diff --git a/Samples/Cordova/ExampleProject/platforms/ios/CordovaLib/Classes/Private/Plugins/CDVIntentAndNavigationFilter/CDVIntentAndNavigationFilter.m b/Samples/Cordova/ExampleProject/platforms/ios/CordovaLib/Classes/Private/Plugins/CDVIntentAndNavigationFilter/CDVIntentAndNavigationFilter.m index 3021f8f5..4430426a 100644 --- a/Samples/Cordova/ExampleProject/platforms/ios/CordovaLib/Classes/Private/Plugins/CDVIntentAndNavigationFilter/CDVIntentAndNavigationFilter.m +++ b/Samples/Cordova/ExampleProject/platforms/ios/CordovaLib/Classes/Private/Plugins/CDVIntentAndNavigationFilter/CDVIntentAndNavigationFilter.m @@ -24,8 +24,8 @@ @interface CDVIntentAndNavigationFilter () @property (nonatomic, readwrite) NSMutableArray* allowIntents; @property (nonatomic, readwrite) NSMutableArray* allowNavigations; -@property (nonatomic, readwrite) CDVWhitelist* allowIntentsWhitelist; -@property (nonatomic, readwrite) CDVWhitelist* allowNavigationsWhitelist; +@property (nonatomic, readwrite) CDVAllowList* allowIntentsList; +@property (nonatomic, readwrite) CDVAllowList* allowNavigationsList; @end @@ -61,8 +61,8 @@ - (void)parserDidStartDocument:(NSXMLParser*)parser - (void)parserDidEndDocument:(NSXMLParser*)parser { - self.allowIntentsWhitelist = [[CDVWhitelist alloc] initWithArray:self.allowIntents]; - self.allowNavigationsWhitelist = [[CDVWhitelist alloc] initWithArray:self.allowNavigations]; + self.allowIntentsList = [[CDVAllowList alloc] initWithArray:self.allowIntents]; + self.allowNavigationsList = [[CDVAllowList alloc] initWithArray:self.allowNavigations]; } - (void)parser:(NSXMLParser*)parser parseErrorOccurred:(NSError*)parseError @@ -79,13 +79,13 @@ - (void)pluginInitialize } } -+ (CDVIntentAndNavigationFilterValue) filterUrl:(NSURL*)url intentsWhitelist:(CDVWhitelist*)intentsWhitelist navigationsWhitelist:(CDVWhitelist*)navigationsWhitelist ++ (CDVIntentAndNavigationFilterValue) filterUrl:(NSURL*)url allowIntentsList:(CDVAllowList*)allowIntentsList navigationsAllowList:(CDVAllowList*)navigationsAllowList { // a URL can only allow-intent OR allow-navigation, if both are specified, // only allow-navigation is allowed - BOOL allowNavigationsPass = [navigationsWhitelist URLIsAllowed:url logFailure:NO]; - BOOL allowIntentPass = [intentsWhitelist URLIsAllowed:url logFailure:NO]; + BOOL allowNavigationsPass = [navigationsAllowList URLIsAllowed:url logFailure:NO]; + BOOL allowIntentPass = [allowIntentsList URLIsAllowed:url logFailure:NO]; if (allowNavigationsPass && allowIntentPass) { return CDVIntentAndNavigationFilterValueNavigationAllowed; @@ -100,7 +100,7 @@ + (CDVIntentAndNavigationFilterValue) filterUrl:(NSURL*)url intentsWhitelist:(CD - (CDVIntentAndNavigationFilterValue) filterUrl:(NSURL*)url { - return [[self class] filterUrl:url intentsWhitelist:self.allowIntentsWhitelist navigationsWhitelist:self.allowNavigationsWhitelist]; + return [[self class] filterUrl:url allowIntentsList:self.allowIntentsList navigationsAllowList:self.allowNavigationsList]; } #define CDVWebViewNavigationTypeLinkClicked 0 @@ -118,8 +118,8 @@ + (BOOL)shouldOpenURLRequest:(NSURLRequest*)request navigationType:(CDVWebViewNa + (BOOL)shouldOverrideLoadWithRequest:(NSURLRequest*)request navigationType:(CDVWebViewNavigationType)navigationType filterValue:(CDVIntentAndNavigationFilterValue)filterValue { - NSString* allowIntents_whitelistRejectionFormatString = @"ERROR External navigation rejected - not set for url='%@'"; - NSString* allowNavigations_whitelistRejectionFormatString = @"ERROR Internal navigation rejected - not set for url='%@'"; + NSString* allowIntents_allowListRejectionFormatString = @"ERROR External navigation rejected - not set for url='%@'"; + NSString* allowNavigations_allowListRejectionFormatString = @"ERROR Internal navigation rejected - not set for url='%@'"; NSURL* url = [request URL]; @@ -136,10 +136,10 @@ + (BOOL)shouldOverrideLoadWithRequest:(NSURLRequest*)request navigationType:(CDV return NO; case CDVIntentAndNavigationFilterValueNoneAllowed: // allow-navigation attempt failed for sure - NSLog(@"%@", [NSString stringWithFormat:allowNavigations_whitelistRejectionFormatString, [url absoluteString]]); + NSLog(@"%@", [NSString stringWithFormat:allowNavigations_allowListRejectionFormatString, [url absoluteString]]); // anchor tag link means it was an allow-intent attempt that failed as well if (CDVWebViewNavigationTypeLinkClicked == navigationType) { - NSLog(@"%@", [NSString stringWithFormat:allowIntents_whitelistRejectionFormatString, [url absoluteString]]); + NSLog(@"%@", [NSString stringWithFormat:allowIntents_allowListRejectionFormatString, [url absoluteString]]); } return NO; } diff --git a/Samples/Cordova/ExampleProject/platforms/ios/CordovaLib/Classes/Private/Plugins/CDVWebViewEngine/CDVWebViewEngine.h b/Samples/Cordova/ExampleProject/platforms/ios/CordovaLib/Classes/Private/Plugins/CDVWebViewEngine/CDVWebViewEngine.h index 47e26d1e..5725a9e8 100644 --- a/Samples/Cordova/ExampleProject/platforms/ios/CordovaLib/Classes/Private/Plugins/CDVWebViewEngine/CDVWebViewEngine.h +++ b/Samples/Cordova/ExampleProject/platforms/ios/CordovaLib/Classes/Private/Plugins/CDVWebViewEngine/CDVWebViewEngine.h @@ -17,7 +17,7 @@ under the License. */ -#import +@import WebKit; #import @interface CDVWebViewEngine : CDVPlugin diff --git a/Samples/Cordova/ExampleProject/platforms/ios/CordovaLib/Classes/Private/Plugins/CDVWebViewEngine/CDVWebViewEngine.m b/Samples/Cordova/ExampleProject/platforms/ios/CordovaLib/Classes/Private/Plugins/CDVWebViewEngine/CDVWebViewEngine.m index a07bf290..0efdf958 100644 --- a/Samples/Cordova/ExampleProject/platforms/ios/CordovaLib/Classes/Private/Plugins/CDVWebViewEngine/CDVWebViewEngine.m +++ b/Samples/Cordova/ExampleProject/platforms/ios/CordovaLib/Classes/Private/Plugins/CDVWebViewEngine/CDVWebViewEngine.m @@ -19,9 +19,9 @@ Licensed to the Apache Software Foundation (ASF) under one #import "CDVWebViewEngine.h" #import "CDVWebViewUIDelegate.h" -#import "CDVWebViewProcessPoolFactory.h" +#import #import -#import "CDVURLSchemeHandler.h" +#import #import @@ -45,6 +45,7 @@ @interface CDVWebViewEngine () @property (nonatomic, strong) CDVURLSchemeHandler * schemeHandler; @property (nonatomic, readwrite) NSString *CDV_ASSETS_URL; @property (nonatomic, readwrite) Boolean cdvIsFileScheme; +@property (nullable, nonatomic, strong, readwrite) WKWebViewConfiguration *configuration; @end @@ -55,24 +56,36 @@ @implementation CDVWebViewEngine @synthesize engineWebView = _engineWebView; -- (instancetype)initWithFrame:(CGRect)frame +- (nullable instancetype)initWithFrame:(CGRect)frame configuration:(nullable WKWebViewConfiguration *)configuration { self = [super init]; if (self) { if (NSClassFromString(@"WKWebView") == nil) { return nil; } - - self.engineWebView = [[WKWebView alloc] initWithFrame:frame]; + + self.configuration = configuration; + self.engineWebView = configuration ? [[WKWebView alloc] initWithFrame:frame configuration:configuration] : [[WKWebView alloc] initWithFrame:frame]; } return self; } +- (nullable instancetype)initWithFrame:(CGRect)frame +{ + return [self initWithFrame:frame configuration:nil]; +} + - (WKWebViewConfiguration*) createConfigurationFromSettings:(NSDictionary*)settings { - WKWebViewConfiguration* configuration = [[WKWebViewConfiguration alloc] init]; - configuration.processPool = [[CDVWebViewProcessPoolFactory sharedFactory] sharedProcessPool]; + WKWebViewConfiguration* configuration; + if (_configuration) { + configuration = _configuration; + } else { + configuration = [[WKWebViewConfiguration alloc] init]; + configuration.processPool = [[CDVWebViewProcessPoolFactory sharedFactory] sharedProcessPool]; + } + if (settings == nil) { return configuration; } @@ -145,6 +158,10 @@ - (WKWebViewConfiguration*) createConfigurationFromSettings:(NSDictionary*)setti } + if (@available(iOS 14.0, *)) { + configuration.limitsNavigationsToAppBoundDomains = [settings cordovaBoolSettingForKey:@"LimitsNavigationsToAppBoundDomains" defaultValue:NO]; + } + return configuration; } @@ -205,6 +222,20 @@ - (void)pluginInitialize WKWebView* wkWebView = [[WKWebView alloc] initWithFrame:self.engineWebView.frame configuration:configuration]; wkWebView.UIDelegate = self.uiDelegate; +#if __IPHONE_OS_VERSION_MAX_ALLOWED >= 160400 + // With the introduction of iOS 16.4 the webview is no longer inspectable by default. + // We'll honor that change for release builds, but will still allow inspection on debug builds by default. + // We also introduce an override option, so consumers can influence this decision in their own build. + if (@available(iOS 16.4, *)) { +#ifdef DEBUG + BOOL allowWebviewInspectionDefault = YES; +#else + BOOL allowWebviewInspectionDefault = NO; +#endif + wkWebView.inspectable = [settings cordovaBoolSettingForKey:@"InspectableWebview" defaultValue:allowWebviewInspectionDefault]; + } +#endif + /* * This is where the "OverrideUserAgent" is handled. This will replace the entire UserAgent * with the user defined custom UserAgent. @@ -376,7 +407,10 @@ - (void)updateSettings:(NSDictionary*)settings // prevent webView from bouncing if (!bounceAllowed) { if ([wkWebView respondsToSelector:@selector(scrollView)]) { - ((UIScrollView*)[wkWebView scrollView]).bounces = NO; + UIScrollView* scrollView = [wkWebView scrollView]; + scrollView.bounces = NO; + scrollView.alwaysBounceVertical = NO; /* iOS 16 workaround */ + scrollView.alwaysBounceHorizontal = NO; /* iOS 16 workaround */ } else { for (id subview in wkWebView.subviews) { if ([[subview class] isSubclassOfClass:[UIScrollView class]]) { diff --git a/Samples/Cordova/ExampleProject/platforms/ios/CordovaLib/Classes/Private/Plugins/CDVWebViewEngine/CDVWebViewUIDelegate.h b/Samples/Cordova/ExampleProject/platforms/ios/CordovaLib/Classes/Private/Plugins/CDVWebViewEngine/CDVWebViewUIDelegate.h index 8ae39b67..c5f85fd7 100644 --- a/Samples/Cordova/ExampleProject/platforms/ios/CordovaLib/Classes/Private/Plugins/CDVWebViewEngine/CDVWebViewUIDelegate.h +++ b/Samples/Cordova/ExampleProject/platforms/ios/CordovaLib/Classes/Private/Plugins/CDVWebViewEngine/CDVWebViewUIDelegate.h @@ -17,7 +17,7 @@ under the License. */ -#import +@import WebKit; @interface CDVWebViewUIDelegate : NSObject { diff --git a/Samples/Cordova/ExampleProject/platforms/ios/CordovaLib/Classes/Public/CDVAppDelegate.m b/Samples/Cordova/ExampleProject/platforms/ios/CordovaLib/Classes/Public/CDVAppDelegate.m index 9188be79..a77fd2b4 100644 --- a/Samples/Cordova/ExampleProject/platforms/ios/CordovaLib/Classes/Public/CDVAppDelegate.m +++ b/Samples/Cordova/ExampleProject/platforms/ios/CordovaLib/Classes/Public/CDVAppDelegate.m @@ -17,24 +17,25 @@ Licensed to the Apache Software Foundation (ASF) under one under the License. */ -#import "CDVAppDelegate.h" +#import @implementation CDVAppDelegate @synthesize window, viewController; -- (id)init +- (BOOL)application:(UIApplication *)application willFinishLaunchingWithOptions:(NSDictionary *)launchOptions { - self = [super init]; - return self; -} +#if DEBUG + NSLog(@"Apache Cordova iOS platform version %@ is starting.", CDV_VERSION); +#endif -#pragma mark UIApplicationDelegate implementation + return YES; +} /** * This is main kick off after the app inits, the views and Settings are setup here. (preferred - iOS4 and up) */ -- (BOOL)application:(UIApplication*)application didFinishLaunchingWithOptions:(NSDictionary*)launchOptions +- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { CGRect screenBounds = [[UIScreen mainScreen] bounds]; @@ -60,7 +61,7 @@ - (BOOL)application:(UIApplication*)application didFinishLaunchingWithOptions:(N } // this happens while we are running ( in the background, or from within our own app ) -// only valid if 40x-Info.plist specifies a protocol to handle +// only valid if Info.plist specifies a protocol to handle - (BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary *)options { if (!url) { @@ -86,12 +87,4 @@ - (BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDiction return YES; } -- (UIInterfaceOrientationMask)application:(UIApplication*)application supportedInterfaceOrientationsForWindow:(UIWindow*)window -{ - // iPhone doesn't support upside down by default, while the iPad does. Override to allow all orientations always, and let the root view controller decide what's allowed (the supported orientations mask gets intersected). - NSUInteger supportedInterfaceOrientations = (1 << UIInterfaceOrientationPortrait) | (1 << UIInterfaceOrientationLandscapeLeft) | (1 << UIInterfaceOrientationLandscapeRight) | (1 << UIInterfaceOrientationPortraitUpsideDown); - - return supportedInterfaceOrientations; -} - @end diff --git a/Samples/Cordova/ExampleProject/platforms/ios/CordovaLib/Classes/Public/CDVCommandQueue.m b/Samples/Cordova/ExampleProject/platforms/ios/CordovaLib/Classes/Public/CDVCommandQueue.m index b78ed833..98ad3deb 100644 --- a/Samples/Cordova/ExampleProject/platforms/ios/CordovaLib/Classes/Public/CDVCommandQueue.m +++ b/Samples/Cordova/ExampleProject/platforms/ios/CordovaLib/Classes/Public/CDVCommandQueue.m @@ -18,8 +18,8 @@ Licensed to the Apache Software Foundation (ASF) under one */ #include -#import "CDVCommandQueue.h" -#import "CDVViewController.h" +#import +#import #import "CDVCommandDelegateImpl.h" #import "CDVJSON_private.h" #import "CDVDebug.h" diff --git a/Samples/Cordova/ExampleProject/platforms/ios/CordovaLib/Classes/Public/CDVConfigParser.m b/Samples/Cordova/ExampleProject/platforms/ios/CordovaLib/Classes/Public/CDVConfigParser.m index ab32b4a7..a5663e59 100644 --- a/Samples/Cordova/ExampleProject/platforms/ios/CordovaLib/Classes/Public/CDVConfigParser.m +++ b/Samples/Cordova/ExampleProject/platforms/ios/CordovaLib/Classes/Public/CDVConfigParser.m @@ -17,7 +17,7 @@ Licensed to the Apache Software Foundation (ASF) under one under the License. */ -#import "CDVConfigParser.h" +#import @interface CDVConfigParser () diff --git a/Samples/Cordova/ExampleProject/platforms/ios/CordovaLib/Classes/Public/CDVInvokedUrlCommand.m b/Samples/Cordova/ExampleProject/platforms/ios/CordovaLib/Classes/Public/CDVInvokedUrlCommand.m index 5b4281df..c0e6b79f 100644 --- a/Samples/Cordova/ExampleProject/platforms/ios/CordovaLib/Classes/Public/CDVInvokedUrlCommand.m +++ b/Samples/Cordova/ExampleProject/platforms/ios/CordovaLib/Classes/Public/CDVInvokedUrlCommand.m @@ -17,7 +17,7 @@ Licensed to the Apache Software Foundation (ASF) under one under the License. */ -#import "CDVInvokedUrlCommand.h" +#import #import "CDVJSON_private.h" @implementation CDVInvokedUrlCommand diff --git a/Samples/Cordova/ExampleProject/platforms/ios/CordovaLib/Classes/Public/CDVPlugin+Resources.m b/Samples/Cordova/ExampleProject/platforms/ios/CordovaLib/Classes/Public/CDVPlugin+Resources.m index 56907385..f18f7429 100644 --- a/Samples/Cordova/ExampleProject/platforms/ios/CordovaLib/Classes/Public/CDVPlugin+Resources.m +++ b/Samples/Cordova/ExampleProject/platforms/ios/CordovaLib/Classes/Public/CDVPlugin+Resources.m @@ -17,7 +17,7 @@ Licensed to the Apache Software Foundation (ASF) under one under the License. */ -#import "CDVPlugin+Resources.h" +#import @implementation CDVPlugin (CDVPluginResources) diff --git a/Samples/Cordova/ExampleProject/platforms/ios/CordovaLib/Classes/Public/CDVPlugin.m b/Samples/Cordova/ExampleProject/platforms/ios/CordovaLib/Classes/Public/CDVPlugin.m index 6af03e9c..275f52e9 100644 --- a/Samples/Cordova/ExampleProject/platforms/ios/CordovaLib/Classes/Public/CDVPlugin.m +++ b/Samples/Cordova/ExampleProject/platforms/ios/CordovaLib/Classes/Public/CDVPlugin.m @@ -17,10 +17,10 @@ Licensed to the Apache Software Foundation (ASF) under one under the License. */ -#import "CDVPlugin.h" +#import #import "CDVPlugin+Private.h" -#import "CDVPlugin+Resources.h" -#import "CDVViewController.h" +#import +#import #include @implementation UIView (org_apache_cordova_UIView_Extension) @@ -66,7 +66,7 @@ @implementation CDVPlugin // Do not override these methods. Use pluginInitialize instead. - (instancetype)initWithWebViewEngine:(id )theWebViewEngine { - self = [super init]; + self = [self init]; if (self) { [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(onAppTerminate) name:UIApplicationWillTerminateNotification object:nil]; [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(onMemoryWarning) name:UIApplicationDidReceiveMemoryWarningNotification object:nil]; diff --git a/Samples/Cordova/ExampleProject/platforms/ios/CordovaLib/Classes/Public/CDVPluginResult.m b/Samples/Cordova/ExampleProject/platforms/ios/CordovaLib/Classes/Public/CDVPluginResult.m index 930aeaba..1a5ab024 100644 --- a/Samples/Cordova/ExampleProject/platforms/ios/CordovaLib/Classes/Public/CDVPluginResult.m +++ b/Samples/Cordova/ExampleProject/platforms/ios/CordovaLib/Classes/Public/CDVPluginResult.m @@ -17,7 +17,7 @@ Licensed to the Apache Software Foundation (ASF) under one under the License. */ -#import "CDVPluginResult.h" +#import #import "CDVJSON_private.h" #import "CDVDebug.h" diff --git a/Samples/Cordova/ExampleProject/platforms/ios/CordovaLib/Classes/Public/CDVTimer.m b/Samples/Cordova/ExampleProject/platforms/ios/CordovaLib/Classes/Public/CDVTimer.m index 784e94d3..1d62f952 100644 --- a/Samples/Cordova/ExampleProject/platforms/ios/CordovaLib/Classes/Public/CDVTimer.m +++ b/Samples/Cordova/ExampleProject/platforms/ios/CordovaLib/Classes/Public/CDVTimer.m @@ -17,7 +17,7 @@ Licensed to the Apache Software Foundation (ASF) under one under the License. */ -#import "CDVTimer.h" +#import #pragma mark CDVTimerItem diff --git a/Samples/Cordova/ExampleProject/platforms/ios/CordovaLib/Classes/Public/CDVURLSchemeHandler.m b/Samples/Cordova/ExampleProject/platforms/ios/CordovaLib/Classes/Public/CDVURLSchemeHandler.m index 333124c2..ec9fcb1c 100644 --- a/Samples/Cordova/ExampleProject/platforms/ios/CordovaLib/Classes/Public/CDVURLSchemeHandler.m +++ b/Samples/Cordova/ExampleProject/platforms/ios/CordovaLib/Classes/Public/CDVURLSchemeHandler.m @@ -18,7 +18,7 @@ Licensed to the Apache Software Foundation (ASF) under one */ -#import "CDVURLSchemeHandler.h" +#import #import #import diff --git a/Samples/Cordova/ExampleProject/platforms/ios/CordovaLib/Classes/Public/CDVViewController.m b/Samples/Cordova/ExampleProject/platforms/ios/CordovaLib/Classes/Public/CDVViewController.m index dcec9589..dd8ba165 100644 --- a/Samples/Cordova/ExampleProject/platforms/ios/CordovaLib/Classes/Public/CDVViewController.m +++ b/Samples/Cordova/ExampleProject/platforms/ios/CordovaLib/Classes/Public/CDVViewController.m @@ -17,17 +17,19 @@ Licensed to the Apache Software Foundation (ASF) under one under the License. */ +@import AVFoundation; +@import Foundation; +@import WebKit; + #import -#import "CDV.h" +#import +#import #import "CDVPlugin+Private.h" -#import "CDVWebViewUIDelegate.h" -#import "CDVConfigParser.h" -#import -#import "NSDictionary+CordovaPreferences.h" +#import +#import #import "CDVCommandDelegateImpl.h" -#import -@interface CDVViewController () { } +@interface CDVViewController () { } @property (nonatomic, readwrite, strong) NSXMLParser* configParser; @property (nonatomic, readwrite, strong) NSMutableDictionary* settings; @@ -78,9 +80,6 @@ - (void)__init self.supportedOrientations = [self parseInterfaceOrientations: [[[NSBundle mainBundle] infoDictionary] objectForKey:@"UISupportedInterfaceOrientations"]]; - [self printVersion]; - [self printMultitaskingInfo]; - [self printPlatformVersionWarning]; self.initialized = YES; } } @@ -106,37 +105,6 @@ - (id)init return self; } -- (void)printVersion -{ - NSLog(@"Apache Cordova native platform version %@ is starting.", CDV_VERSION); -} - -- (void)printPlatformVersionWarning -{ - if (!IsAtLeastiOSVersion(@"8.0")) { - NSLog(@"CRITICAL: For Cordova 4.0.0 and above, you will need to upgrade to at least iOS 8.0 or greater. Your current version of iOS is %@.", - [[UIDevice currentDevice] systemVersion] - ); - } -} - -- (void)printMultitaskingInfo -{ - UIDevice* device = [UIDevice currentDevice]; - BOOL backgroundSupported = NO; - - if ([device respondsToSelector:@selector(isMultitaskingSupported)]) { - backgroundSupported = device.multitaskingSupported; - } - - NSNumber* exitsOnSuspend = [[NSBundle mainBundle] objectForInfoDictionaryKey:@"UIApplicationExitsOnSuspend"]; - if (exitsOnSuspend == nil) { // if it's missing, it should be NO (i.e. multi-tasking on by default) - exitsOnSuspend = [NSNumber numberWithBool:NO]; - } - - NSLog(@"Multi-tasking -> Device: %@, App: %@", (backgroundSupported ? @"YES" : @"NO"), (![exitsOnSuspend intValue]) ? @"YES" : @"NO"); -} - -(NSString*)configFilePath{ NSString* path = self.configFile ?: @"config.xml"; @@ -180,7 +148,7 @@ - (void)loadSettings [self parseSettingsWithParser:delegate]; - // Get the plugin dictionary, whitelist and settings from the delegate. + // Get the plugin dictionary, allowList and settings from the delegate. self.pluginsMap = delegate.pluginsDict; self.startupPluginNames = delegate.startupPluginNames; self.settings = delegate.settings; @@ -238,7 +206,7 @@ - (NSURL*)appUrl return appURL; } -- (NSURL*)errorURL +- (nullable NSURL*)errorURL { NSURL* errorUrl = nil; @@ -277,14 +245,6 @@ - (void)viewDidLoad // Load settings [self loadSettings]; - NSString* backupWebStorageType = @"cloud"; // default value - - id backupWebStorage = [self.settings cordovaSettingForKey:@"BackupWebStorage"]; - if ([backupWebStorage isKindOfClass:[NSString class]]) { - backupWebStorageType = backupWebStorage; - } - [self.settings setCordovaSetting:backupWebStorageType forKey:@"BackupWebStorage"]; - // // Instantiate the Launch screen ///////// if (!self.launchView) { @@ -380,52 +340,6 @@ -(void)viewWillTransitionToSize:(CGSize)size withTransitionCoordinator:(id> 16))/255.0 - green:((float)((colorValue & 0x0000FF00) >> 8))/255.0 - blue:((float)((colorValue & 0x000000FF) >> 0))/255.0 - alpha:((float)((colorValue & 0xFF000000) >> 24))/255.0]; -} - - (NSArray*)parseInterfaceOrientations:(NSArray*)orientations { NSMutableArray* result = [[NSMutableArray alloc] init]; @@ -485,54 +399,97 @@ - (BOOL)supportsOrientation:(UIInterfaceOrientation)orientation return [self.supportedOrientations containsObject:@(orientation)]; } -- (UIView*)newCordovaViewWithFrame:(CGRect)bounds +/// Retrieves the view from a newwly initialized webViewEngine +/// @param bounds The bounds with which the webViewEngine will be initialized +- (nonnull UIView*)newCordovaViewWithFrame:(CGRect)bounds { - NSString* defaultWebViewEngineClass = [self.settings cordovaSettingForKey:@"CordovaDefaultWebViewEngine"]; - NSString* webViewEngineClass = [self.settings cordovaSettingForKey:@"CordovaWebViewEngine"]; + NSString* defaultWebViewEngineClassName = [self.settings cordovaSettingForKey:@"CordovaDefaultWebViewEngine"]; + NSString* webViewEngineClassName = [self.settings cordovaSettingForKey:@"CordovaWebViewEngine"]; - if (!defaultWebViewEngineClass) { - defaultWebViewEngineClass = @"CDVWebViewEngine"; + if (!defaultWebViewEngineClassName) { + defaultWebViewEngineClassName = @"CDVWebViewEngine"; } - if (!webViewEngineClass) { - webViewEngineClass = defaultWebViewEngineClass; + if (!webViewEngineClassName) { + webViewEngineClassName = defaultWebViewEngineClassName; } - // Find webViewEngine - if (NSClassFromString(webViewEngineClass)) { - self.webViewEngine = [[NSClassFromString(webViewEngineClass) alloc] initWithFrame:bounds]; - // if a webView engine returns nil (not supported by the current iOS version) or doesn't conform to the protocol, or can't load the request, we use WKWebView - if (!self.webViewEngine || ![self.webViewEngine conformsToProtocol:@protocol(CDVWebViewEngineProtocol)] || ![self.webViewEngine canLoadRequest:[NSURLRequest requestWithURL:self.appUrl]]) { - self.webViewEngine = [[NSClassFromString(defaultWebViewEngineClass) alloc] initWithFrame:bounds]; + // Determine if a provided custom web view engine is sufficient + id engine; + Class customWebViewEngineClass = NSClassFromString(webViewEngineClassName); + if (customWebViewEngineClass) { + id customWebViewEngine = [self initWebViewEngine:customWebViewEngineClass bounds:bounds]; + BOOL customConformsToProtocol = [customWebViewEngine conformsToProtocol:@protocol(CDVWebViewEngineProtocol)]; + BOOL customCanLoad = [customWebViewEngine canLoadRequest:[NSURLRequest requestWithURL:self.appUrl]]; + if (customConformsToProtocol && customCanLoad) { + engine = customWebViewEngine; } - } else { - self.webViewEngine = [[NSClassFromString(defaultWebViewEngineClass) alloc] initWithFrame:bounds]; } - - if ([self.webViewEngine isKindOfClass:[CDVPlugin class]]) { - [self registerPlugin:(CDVPlugin*)self.webViewEngine withClassName:webViewEngineClass]; + + // Otherwise use the default web view engine + if (!engine) { + Class defaultWebViewEngineClass = NSClassFromString(defaultWebViewEngineClassName); + id defaultWebViewEngine = [self initWebViewEngine:defaultWebViewEngineClass bounds:bounds]; + NSAssert([defaultWebViewEngine conformsToProtocol:@protocol(CDVWebViewEngineProtocol)], + @"we expected the default web view engine to conform to the CDVWebViewEngineProtocol"); + engine = defaultWebViewEngine; + } + + if ([engine isKindOfClass:[CDVPlugin class]]) { + [self registerPlugin:(CDVPlugin*)engine withClassName:webViewEngineClassName]; } + self.webViewEngine = engine; return self.webViewEngine.engineWebView; } +/// Initialiizes the webViewEngine, with config, if supported and provided +/// @param engineClass A class that must conform to the `CDVWebViewEngineProtocol` +/// @param bounds with which the webview will be initialized +- (id _Nullable) initWebViewEngine:(nonnull Class)engineClass bounds:(CGRect)bounds { + WKWebViewConfiguration *config = [self respondsToSelector:@selector(configuration)] ? [self configuration] : nil; + if (config && [engineClass respondsToSelector:@selector(initWithFrame:configuration:)]) { + return [[engineClass alloc] initWithFrame:bounds configuration:config]; + } else { + return [[engineClass alloc] initWithFrame:bounds]; + } +} + - (void)createLaunchView { CGRect webViewBounds = self.view.bounds; webViewBounds.origin = self.view.bounds.origin; UIView* view = [[UIView alloc] initWithFrame:webViewBounds]; + view.translatesAutoresizingMaskIntoConstraints = NO; [view setAlpha:0]; NSString* launchStoryboardName = [[NSBundle mainBundle] objectForInfoDictionaryKey:@"UILaunchStoryboardName"]; if (launchStoryboardName != nil) { UIStoryboard* storyboard = [UIStoryboard storyboardWithName:launchStoryboardName bundle:[NSBundle mainBundle]]; UIViewController* vc = [storyboard instantiateInitialViewController]; + [self addChildViewController:vc]; + + UIView* imgView = vc.view; + imgView.translatesAutoresizingMaskIntoConstraints = NO; + [view addSubview:imgView]; - [view addSubview:vc.view]; + [NSLayoutConstraint activateConstraints:@[ + [NSLayoutConstraint constraintWithItem:imgView attribute:NSLayoutAttributeWidth relatedBy:NSLayoutRelationEqual toItem:view attribute:NSLayoutAttributeWidth multiplier:1 constant:0], + [NSLayoutConstraint constraintWithItem:imgView attribute:NSLayoutAttributeHeight relatedBy:NSLayoutRelationEqual toItem:view attribute:NSLayoutAttributeHeight multiplier:1 constant:0], + [NSLayoutConstraint constraintWithItem:imgView attribute:NSLayoutAttributeCenterY relatedBy:NSLayoutRelationEqual toItem:view attribute:NSLayoutAttributeCenterY multiplier:1 constant:0], + [NSLayoutConstraint constraintWithItem:imgView attribute:NSLayoutAttributeCenterX relatedBy:NSLayoutRelationEqual toItem:view attribute:NSLayoutAttributeCenterX multiplier:1 constant:0] + ]]; } self.launchView = view; [self.view addSubview:view]; + + [NSLayoutConstraint activateConstraints:@[ + [NSLayoutConstraint constraintWithItem:view attribute:NSLayoutAttributeWidth relatedBy:NSLayoutRelationEqual toItem:self.view attribute:NSLayoutAttributeWidth multiplier:1 constant:0], + [NSLayoutConstraint constraintWithItem:view attribute:NSLayoutAttributeHeight relatedBy:NSLayoutRelationEqual toItem:self.view attribute:NSLayoutAttributeHeight multiplier:1 constant:0], + [NSLayoutConstraint constraintWithItem:view attribute:NSLayoutAttributeCenterY relatedBy:NSLayoutRelationEqual toItem:self.view attribute:NSLayoutAttributeCenterY multiplier:1 constant:0], + [NSLayoutConstraint constraintWithItem:view attribute:NSLayoutAttributeCenterX relatedBy:NSLayoutRelationEqual toItem:self.view attribute:NSLayoutAttributeCenterX multiplier:1 constant:0] + ]]; } - (void)createGapView @@ -608,10 +565,10 @@ - (void)registerPlugin:(CDVPlugin*)plugin withPluginName:(NSString*)pluginName /** Returns an instance of a CordovaCommand object, based on its name. If one exists already, it is returned. */ -- (id)getCommandInstance:(NSString*)pluginName +- (nullable id)getCommandInstance:(NSString*)pluginName { // first, we try to find the pluginName in the pluginsMap - // (acts as a whitelist as well) if it does not exist, we return nil + // (acts as a allowList as well) if it does not exist, we return nil // NOTE: plugin names are matched as lowercase to avoid problems - however, a // possible issue is there can be duplicates possible if you had: // "org.apache.cordova.Foo" and "org.apache.cordova.foo" - only the lower-cased entry will match @@ -642,7 +599,7 @@ - (id)getCommandInstance:(NSString*)pluginName #pragma mark - -- (NSString*)appURLScheme +- (nullable NSString*)appURLScheme { NSString* URLScheme = nil; @@ -798,6 +755,10 @@ - (void)showLaunchScreen:(BOOL)visible [UIView animateWithDuration:fadeDuration animations:^{ [self.launchView setAlpha:(visible ? 1 : 0)]; + + if (!visible) { + [self.webView becomeFirstResponder]; + } }]; } diff --git a/Samples/Cordova/ExampleProject/platforms/ios/CordovaLib/Classes/Public/CDVWebViewProcessPoolFactory.m b/Samples/Cordova/ExampleProject/platforms/ios/CordovaLib/Classes/Public/CDVWebViewProcessPoolFactory.m index 577624e0..3781f48a 100644 --- a/Samples/Cordova/ExampleProject/platforms/ios/CordovaLib/Classes/Public/CDVWebViewProcessPoolFactory.m +++ b/Samples/Cordova/ExampleProject/platforms/ios/CordovaLib/Classes/Public/CDVWebViewProcessPoolFactory.m @@ -17,9 +17,9 @@ Licensed to the Apache Software Foundation (ASF) under one under the License. */ -#import -#import -#import "CDVWebViewProcessPoolFactory.h" +@import Foundation; +@import WebKit; +#import static CDVWebViewProcessPoolFactory *factory = nil; diff --git a/Samples/Cordova/ExampleProject/platforms/ios/CordovaLib/Classes/Public/NSDictionary+CordovaPreferences.m b/Samples/Cordova/ExampleProject/platforms/ios/CordovaLib/Classes/Public/NSDictionary+CordovaPreferences.m index 1266ba20..a60004d9 100644 --- a/Samples/Cordova/ExampleProject/platforms/ios/CordovaLib/Classes/Public/NSDictionary+CordovaPreferences.m +++ b/Samples/Cordova/ExampleProject/platforms/ios/CordovaLib/Classes/Public/NSDictionary+CordovaPreferences.m @@ -17,8 +17,9 @@ Licensed to the Apache Software Foundation (ASF) under one under the License. */ -#import "NSDictionary+CordovaPreferences.h" -#import +@import Foundation; + +#import @implementation NSDictionary (CordovaPreferences) diff --git a/Samples/Cordova/ExampleProject/platforms/ios/CordovaLib/Classes/Public/NSMutableArray+QueueAdditions.m b/Samples/Cordova/ExampleProject/platforms/ios/CordovaLib/Classes/Public/NSMutableArray+QueueAdditions.m index 2b3acdc0..65b97a0e 100644 --- a/Samples/Cordova/ExampleProject/platforms/ios/CordovaLib/Classes/Public/NSMutableArray+QueueAdditions.m +++ b/Samples/Cordova/ExampleProject/platforms/ios/CordovaLib/Classes/Public/NSMutableArray+QueueAdditions.m @@ -17,7 +17,7 @@ Licensed to the Apache Software Foundation (ASF) under one under the License. */ -#import "NSMutableArray+QueueAdditions.h" +#import @implementation NSMutableArray (QueueAdditions) diff --git a/Samples/Cordova/ExampleProject/platforms/ios/CordovaLib/CordovaLib.xcodeproj/project.pbxproj b/Samples/Cordova/ExampleProject/platforms/ios/CordovaLib/CordovaLib.xcodeproj/project.pbxproj index f0958e47..04a7b35c 100644 --- a/Samples/Cordova/ExampleProject/platforms/ios/CordovaLib/CordovaLib.xcodeproj/project.pbxproj +++ b/Samples/Cordova/ExampleProject/platforms/ios/CordovaLib/CordovaLib.xcodeproj/project.pbxproj @@ -9,26 +9,26 @@ /* Begin PBXBuildFile section */ 28BFF9141F355A4E00DDF01A /* CDVLogger.h in Headers */ = {isa = PBXBuildFile; fileRef = 28BFF9121F355A4E00DDF01A /* CDVLogger.h */; }; 28BFF9151F355A4E00DDF01A /* CDVLogger.m in Sources */ = {isa = PBXBuildFile; fileRef = 28BFF9131F355A4E00DDF01A /* CDVLogger.m */; }; - 2F4D42BC23F218BA00501999 /* CDVURLSchemeHandler.h in Headers */ = {isa = PBXBuildFile; fileRef = 2F4D42BA23F218BA00501999 /* CDVURLSchemeHandler.h */; }; + 2F4D42BC23F218BA00501999 /* CDVURLSchemeHandler.h in Headers */ = {isa = PBXBuildFile; fileRef = 2F4D42BA23F218BA00501999 /* CDVURLSchemeHandler.h */; settings = {ATTRIBUTES = (Public, ); }; }; 2F4D42BD23F218BA00501999 /* CDVURLSchemeHandler.m in Sources */ = {isa = PBXBuildFile; fileRef = 2F4D42BB23F218BA00501999 /* CDVURLSchemeHandler.m */; }; 2FCCEA17247E7366007276A8 /* CDVLaunchScreen.m in Sources */ = {isa = PBXBuildFile; fileRef = 4E714D3423F535B500A321AF /* CDVLaunchScreen.m */; }; 2FCCEA18247E7366007276A8 /* CDVLaunchScreen.h in Headers */ = {isa = PBXBuildFile; fileRef = 4E714D3223F535B500A321AF /* CDVLaunchScreen.h */; }; 3093E2231B16D6A3003F381A /* CDVIntentAndNavigationFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = 3093E2211B16D6A3003F381A /* CDVIntentAndNavigationFilter.h */; }; 3093E2241B16D6A3003F381A /* CDVIntentAndNavigationFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = 3093E2221B16D6A3003F381A /* CDVIntentAndNavigationFilter.m */; }; 4E23F8FB23E16E96006CD852 /* CDVWebViewProcessPoolFactory.m in Sources */ = {isa = PBXBuildFile; fileRef = 4E23F8F523E16E96006CD852 /* CDVWebViewProcessPoolFactory.m */; }; - 4E23F8FC23E16E96006CD852 /* CDVWebViewUIDelegate.h in Headers */ = {isa = PBXBuildFile; fileRef = 4E23F8F623E16E96006CD852 /* CDVWebViewUIDelegate.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 4E23F8FC23E16E96006CD852 /* CDVWebViewUIDelegate.h in Headers */ = {isa = PBXBuildFile; fileRef = 4E23F8F623E16E96006CD852 /* CDVWebViewUIDelegate.h */; }; 4E23F8FD23E16E96006CD852 /* CDVWebViewUIDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 4E23F8F723E16E96006CD852 /* CDVWebViewUIDelegate.m */; }; 4E23F8FE23E16E96006CD852 /* CDVWebViewEngine.m in Sources */ = {isa = PBXBuildFile; fileRef = 4E23F8F823E16E96006CD852 /* CDVWebViewEngine.m */; }; 4E23F8FF23E16E96006CD852 /* CDVWebViewProcessPoolFactory.h in Headers */ = {isa = PBXBuildFile; fileRef = 4E23F8F923E16E96006CD852 /* CDVWebViewProcessPoolFactory.h */; settings = {ATTRIBUTES = (Public, ); }; }; 4E23F90023E16E96006CD852 /* CDVWebViewEngine.h in Headers */ = {isa = PBXBuildFile; fileRef = 4E23F8FA23E16E96006CD852 /* CDVWebViewEngine.h */; }; - 4E23F90323E17FFA006CD852 /* CDVWebViewUIDelegate.h in Headers */ = {isa = PBXBuildFile; fileRef = 4E23F8F623E16E96006CD852 /* CDVWebViewUIDelegate.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 4E23F90323E17FFA006CD852 /* CDVWebViewUIDelegate.h in Headers */ = {isa = PBXBuildFile; fileRef = 4E23F8F623E16E96006CD852 /* CDVWebViewUIDelegate.h */; }; 4E714D3623F535B500A321AF /* CDVLaunchScreen.h in Headers */ = {isa = PBXBuildFile; fileRef = 4E714D3223F535B500A321AF /* CDVLaunchScreen.h */; }; 4E714D3823F535B500A321AF /* CDVLaunchScreen.m in Sources */ = {isa = PBXBuildFile; fileRef = 4E714D3423F535B500A321AF /* CDVLaunchScreen.m */; }; 4F56D82D254A2EB50063F1D6 /* CDVWebViewEngine.m in Sources */ = {isa = PBXBuildFile; fileRef = 4E23F8F823E16E96006CD852 /* CDVWebViewEngine.m */; }; 4F56D830254A2ED70063F1D6 /* CDVWebViewUIDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 4E23F8F723E16E96006CD852 /* CDVWebViewUIDelegate.m */; }; 4F56D833254A2ED90063F1D6 /* CDVWebViewProcessPoolFactory.m in Sources */ = {isa = PBXBuildFile; fileRef = 4E23F8F523E16E96006CD852 /* CDVWebViewProcessPoolFactory.m */; }; 4F56D836254A2EE10063F1D6 /* CDVWebViewEngine.h in Headers */ = {isa = PBXBuildFile; fileRef = 4E23F8FA23E16E96006CD852 /* CDVWebViewEngine.h */; }; - 4F56D839254A2EE40063F1D6 /* CDVWebViewProcessPoolFactory.h in Headers */ = {isa = PBXBuildFile; fileRef = 4E23F8F923E16E96006CD852 /* CDVWebViewProcessPoolFactory.h */; }; + 4F56D839254A2EE40063F1D6 /* CDVWebViewProcessPoolFactory.h in Headers */ = {isa = PBXBuildFile; fileRef = 4E23F8F923E16E96006CD852 /* CDVWebViewProcessPoolFactory.h */; settings = {ATTRIBUTES = (Public, ); }; }; 4F56D83C254A2F2F0063F1D6 /* CDVURLSchemeHandler.m in Sources */ = {isa = PBXBuildFile; fileRef = 2F4D42BB23F218BA00501999 /* CDVURLSchemeHandler.m */; }; 7E7F69B91ABA3692007546F4 /* CDVHandleOpenURL.h in Headers */ = {isa = PBXBuildFile; fileRef = 7ED95CF81AB9028C008C4574 /* CDVHandleOpenURL.h */; }; 7ED95D021AB9028C008C4574 /* CDVDebug.h in Headers */ = {isa = PBXBuildFile; fileRef = 7ED95CF21AB9028C008C4574 /* CDVDebug.h */; }; @@ -42,7 +42,7 @@ 7ED95D381AB9029B008C4574 /* CDVAvailability.h in Headers */ = {isa = PBXBuildFile; fileRef = 7ED95D121AB9029B008C4574 /* CDVAvailability.h */; settings = {ATTRIBUTES = (Public, ); }; }; 7ED95D391AB9029B008C4574 /* CDVAvailabilityDeprecated.h in Headers */ = {isa = PBXBuildFile; fileRef = 7ED95D131AB9029B008C4574 /* CDVAvailabilityDeprecated.h */; settings = {ATTRIBUTES = (Public, ); }; }; 7ED95D3A1AB9029B008C4574 /* CDVCommandDelegate.h in Headers */ = {isa = PBXBuildFile; fileRef = 7ED95D141AB9029B008C4574 /* CDVCommandDelegate.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 7ED95D3B1AB9029B008C4574 /* CDVCommandDelegateImpl.h in Headers */ = {isa = PBXBuildFile; fileRef = 7ED95D151AB9029B008C4574 /* CDVCommandDelegateImpl.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 7ED95D3B1AB9029B008C4574 /* CDVCommandDelegateImpl.h in Headers */ = {isa = PBXBuildFile; fileRef = 7ED95D151AB9029B008C4574 /* CDVCommandDelegateImpl.h */; }; 7ED95D3C1AB9029B008C4574 /* CDVCommandDelegateImpl.m in Sources */ = {isa = PBXBuildFile; fileRef = 7ED95D161AB9029B008C4574 /* CDVCommandDelegateImpl.m */; }; 7ED95D3D1AB9029B008C4574 /* CDVCommandQueue.h in Headers */ = {isa = PBXBuildFile; fileRef = 7ED95D171AB9029B008C4574 /* CDVCommandQueue.h */; settings = {ATTRIBUTES = (Public, ); }; }; 7ED95D3E1AB9029B008C4574 /* CDVCommandQueue.m in Sources */ = {isa = PBXBuildFile; fileRef = 7ED95D181AB9029B008C4574 /* CDVCommandQueue.m */; }; @@ -62,8 +62,8 @@ 7ED95D501AB9029B008C4574 /* CDVViewController.h in Headers */ = {isa = PBXBuildFile; fileRef = 7ED95D2A1AB9029B008C4574 /* CDVViewController.h */; settings = {ATTRIBUTES = (Public, ); }; }; 7ED95D511AB9029B008C4574 /* CDVViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 7ED95D2B1AB9029B008C4574 /* CDVViewController.m */; }; 7ED95D521AB9029B008C4574 /* CDVWebViewEngineProtocol.h in Headers */ = {isa = PBXBuildFile; fileRef = 7ED95D2C1AB9029B008C4574 /* CDVWebViewEngineProtocol.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 7ED95D531AB9029B008C4574 /* CDVWhitelist.h in Headers */ = {isa = PBXBuildFile; fileRef = 7ED95D2D1AB9029B008C4574 /* CDVWhitelist.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 7ED95D541AB9029B008C4574 /* CDVWhitelist.m in Sources */ = {isa = PBXBuildFile; fileRef = 7ED95D2E1AB9029B008C4574 /* CDVWhitelist.m */; }; + 7ED95D531AB9029B008C4574 /* CDVAllowList.h in Headers */ = {isa = PBXBuildFile; fileRef = 7ED95D2D1AB9029B008C4574 /* CDVAllowList.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 7ED95D541AB9029B008C4574 /* CDVAllowList.m in Sources */ = {isa = PBXBuildFile; fileRef = 7ED95D2E1AB9029B008C4574 /* CDVAllowList.m */; }; 7ED95D571AB9029B008C4574 /* NSDictionary+CordovaPreferences.h in Headers */ = {isa = PBXBuildFile; fileRef = 7ED95D311AB9029B008C4574 /* NSDictionary+CordovaPreferences.h */; settings = {ATTRIBUTES = (Public, ); }; }; 7ED95D581AB9029B008C4574 /* NSDictionary+CordovaPreferences.m in Sources */ = {isa = PBXBuildFile; fileRef = 7ED95D321AB9029B008C4574 /* NSDictionary+CordovaPreferences.m */; }; 7ED95D591AB9029B008C4574 /* NSMutableArray+QueueAdditions.h in Headers */ = {isa = PBXBuildFile; fileRef = 7ED95D331AB9029B008C4574 /* NSMutableArray+QueueAdditions.h */; settings = {ATTRIBUTES = (Public, ); }; }; @@ -78,7 +78,7 @@ 9052DE782150D040008E83D4 /* CDVPluginResult.m in Sources */ = {isa = PBXBuildFile; fileRef = 7ED95D221AB9029B008C4574 /* CDVPluginResult.m */; }; 9052DE792150D040008E83D4 /* CDVTimer.m in Sources */ = {isa = PBXBuildFile; fileRef = 7ED95D251AB9029B008C4574 /* CDVTimer.m */; }; 9052DE7C2150D040008E83D4 /* CDVViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 7ED95D2B1AB9029B008C4574 /* CDVViewController.m */; }; - 9052DE7D2150D040008E83D4 /* CDVWhitelist.m in Sources */ = {isa = PBXBuildFile; fileRef = 7ED95D2E1AB9029B008C4574 /* CDVWhitelist.m */; }; + 9052DE7D2150D040008E83D4 /* CDVAllowList.m in Sources */ = {isa = PBXBuildFile; fileRef = 7ED95D2E1AB9029B008C4574 /* CDVAllowList.m */; }; 9052DE7E2150D040008E83D4 /* NSDictionary+CordovaPreferences.m in Sources */ = {isa = PBXBuildFile; fileRef = 7ED95D321AB9029B008C4574 /* NSDictionary+CordovaPreferences.m */; }; 9052DE7F2150D040008E83D4 /* NSMutableArray+QueueAdditions.m in Sources */ = {isa = PBXBuildFile; fileRef = 7ED95D341AB9029B008C4574 /* NSMutableArray+QueueAdditions.m */; }; 9052DE802150D040008E83D4 /* CDVJSON_private.m in Sources */ = {isa = PBXBuildFile; fileRef = 7ED95CF41AB9028C008C4574 /* CDVJSON_private.m */; }; @@ -93,6 +93,7 @@ 9052DE8D2150D06B008E83D4 /* CDVGestureHandler.h in Headers */ = {isa = PBXBuildFile; fileRef = A3B082D21BB15CEA00D8DC35 /* CDVGestureHandler.h */; }; 9052DE8E2150D06B008E83D4 /* CDVIntentAndNavigationFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = 3093E2211B16D6A3003F381A /* CDVIntentAndNavigationFilter.h */; }; 9052DE8F2150D06B008E83D4 /* CDVHandleOpenURL.h in Headers */ = {isa = PBXBuildFile; fileRef = 7ED95CF81AB9028C008C4574 /* CDVHandleOpenURL.h */; }; + 9059F51C26F2CE2400B3B2B7 /* CDVURLSchemeHandler.h in Headers */ = {isa = PBXBuildFile; fileRef = 2F4D42BA23F218BA00501999 /* CDVURLSchemeHandler.h */; settings = {ATTRIBUTES = (Public, ); }; }; A3B082D41BB15CEA00D8DC35 /* CDVGestureHandler.h in Headers */ = {isa = PBXBuildFile; fileRef = A3B082D21BB15CEA00D8DC35 /* CDVGestureHandler.h */; }; A3B082D51BB15CEA00D8DC35 /* CDVGestureHandler.m in Sources */ = {isa = PBXBuildFile; fileRef = A3B082D31BB15CEA00D8DC35 /* CDVGestureHandler.m */; }; C0C01EB61E3911D50056E6CB /* Cordova.h in Headers */ = {isa = PBXBuildFile; fileRef = C0C01EB41E3911D50056E6CB /* Cordova.h */; settings = {ATTRIBUTES = (Public, ); }; }; @@ -101,7 +102,7 @@ C0C01EBD1E39131A0056E6CB /* CDVAvailability.h in Headers */ = {isa = PBXBuildFile; fileRef = 7ED95D121AB9029B008C4574 /* CDVAvailability.h */; settings = {ATTRIBUTES = (Public, ); }; }; C0C01EBE1E39131A0056E6CB /* CDVAvailabilityDeprecated.h in Headers */ = {isa = PBXBuildFile; fileRef = 7ED95D131AB9029B008C4574 /* CDVAvailabilityDeprecated.h */; settings = {ATTRIBUTES = (Public, ); }; }; C0C01EBF1E39131A0056E6CB /* CDVCommandDelegate.h in Headers */ = {isa = PBXBuildFile; fileRef = 7ED95D141AB9029B008C4574 /* CDVCommandDelegate.h */; settings = {ATTRIBUTES = (Public, ); }; }; - C0C01EC01E39131A0056E6CB /* CDVCommandDelegateImpl.h in Headers */ = {isa = PBXBuildFile; fileRef = 7ED95D151AB9029B008C4574 /* CDVCommandDelegateImpl.h */; settings = {ATTRIBUTES = (Public, ); }; }; + C0C01EC01E39131A0056E6CB /* CDVCommandDelegateImpl.h in Headers */ = {isa = PBXBuildFile; fileRef = 7ED95D151AB9029B008C4574 /* CDVCommandDelegateImpl.h */; }; C0C01EC11E39131A0056E6CB /* CDVCommandQueue.h in Headers */ = {isa = PBXBuildFile; fileRef = 7ED95D171AB9029B008C4574 /* CDVCommandQueue.h */; settings = {ATTRIBUTES = (Public, ); }; }; C0C01EC21E39131A0056E6CB /* CDVConfigParser.h in Headers */ = {isa = PBXBuildFile; fileRef = 7ED95D191AB9029B008C4574 /* CDVConfigParser.h */; settings = {ATTRIBUTES = (Public, ); }; }; C0C01EC31E39131A0056E6CB /* CDVInvokedUrlCommand.h in Headers */ = {isa = PBXBuildFile; fileRef = 7ED95D1B1AB9029B008C4574 /* CDVInvokedUrlCommand.h */; settings = {ATTRIBUTES = (Public, ); }; }; @@ -112,7 +113,7 @@ C0C01EC81E39131A0056E6CB /* CDVTimer.h in Headers */ = {isa = PBXBuildFile; fileRef = 7ED95D241AB9029B008C4574 /* CDVTimer.h */; settings = {ATTRIBUTES = (Public, ); }; }; C0C01ECB1E39131A0056E6CB /* CDVViewController.h in Headers */ = {isa = PBXBuildFile; fileRef = 7ED95D2A1AB9029B008C4574 /* CDVViewController.h */; settings = {ATTRIBUTES = (Public, ); }; }; C0C01ECC1E39131A0056E6CB /* CDVWebViewEngineProtocol.h in Headers */ = {isa = PBXBuildFile; fileRef = 7ED95D2C1AB9029B008C4574 /* CDVWebViewEngineProtocol.h */; settings = {ATTRIBUTES = (Public, ); }; }; - C0C01ECD1E39131A0056E6CB /* CDVWhitelist.h in Headers */ = {isa = PBXBuildFile; fileRef = 7ED95D2D1AB9029B008C4574 /* CDVWhitelist.h */; settings = {ATTRIBUTES = (Public, ); }; }; + C0C01ECD1E39131A0056E6CB /* CDVAllowList.h in Headers */ = {isa = PBXBuildFile; fileRef = 7ED95D2D1AB9029B008C4574 /* CDVAllowList.h */; settings = {ATTRIBUTES = (Public, ); }; }; C0C01ECE1E39131A0056E6CB /* NSDictionary+CordovaPreferences.h in Headers */ = {isa = PBXBuildFile; fileRef = 7ED95D311AB9029B008C4574 /* NSDictionary+CordovaPreferences.h */; settings = {ATTRIBUTES = (Public, ); }; }; C0C01ECF1E39131A0056E6CB /* NSMutableArray+QueueAdditions.h in Headers */ = {isa = PBXBuildFile; fileRef = 7ED95D331AB9029B008C4574 /* NSMutableArray+QueueAdditions.h */; settings = {ATTRIBUTES = (Public, ); }; }; /* End PBXBuildFile section */ @@ -165,15 +166,14 @@ 7ED95D2A1AB9029B008C4574 /* CDVViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CDVViewController.h; sourceTree = ""; }; 7ED95D2B1AB9029B008C4574 /* CDVViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CDVViewController.m; sourceTree = ""; }; 7ED95D2C1AB9029B008C4574 /* CDVWebViewEngineProtocol.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CDVWebViewEngineProtocol.h; sourceTree = ""; }; - 7ED95D2D1AB9029B008C4574 /* CDVWhitelist.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CDVWhitelist.h; sourceTree = ""; }; - 7ED95D2E1AB9029B008C4574 /* CDVWhitelist.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CDVWhitelist.m; sourceTree = ""; }; + 7ED95D2D1AB9029B008C4574 /* CDVAllowList.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CDVAllowList.h; sourceTree = ""; }; + 7ED95D2E1AB9029B008C4574 /* CDVAllowList.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CDVAllowList.m; sourceTree = ""; }; 7ED95D311AB9029B008C4574 /* NSDictionary+CordovaPreferences.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "NSDictionary+CordovaPreferences.h"; sourceTree = ""; }; 7ED95D321AB9029B008C4574 /* NSDictionary+CordovaPreferences.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "NSDictionary+CordovaPreferences.m"; sourceTree = ""; }; 7ED95D331AB9029B008C4574 /* NSMutableArray+QueueAdditions.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "NSMutableArray+QueueAdditions.h"; sourceTree = ""; }; 7ED95D341AB9029B008C4574 /* NSMutableArray+QueueAdditions.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "NSMutableArray+QueueAdditions.m"; sourceTree = ""; }; A3B082D21BB15CEA00D8DC35 /* CDVGestureHandler.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CDVGestureHandler.h; sourceTree = ""; }; A3B082D31BB15CEA00D8DC35 /* CDVGestureHandler.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CDVGestureHandler.m; sourceTree = ""; }; - AA747D9E0F9514B9006C5449 /* CordovaLib_Prefix.pch */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CordovaLib_Prefix.pch; sourceTree = SOURCE_ROOT; }; C0C01EB21E3911D50056E6CB /* Cordova.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Cordova.framework; sourceTree = BUILT_PRODUCTS_DIR; }; C0C01EB41E3911D50056E6CB /* Cordova.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = Cordova.h; sourceTree = ""; }; C0C01EB51E3911D50056E6CB /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; @@ -209,6 +209,7 @@ 0867D691FE84028FC02AAC07 = { isa = PBXGroup; children = ( + 9064EF5E26FAB74200C9D65B /* include */, 7ED95D0E1AB9029B008C4574 /* Public */, 7ED95CF11AB9028C008C4574 /* Private */, C0C01EB31E3911D50056E6CB /* Cordova */, @@ -257,7 +258,8 @@ 7ED95CF11AB9028C008C4574 /* Private */ = { isa = PBXGroup; children = ( - AA747D9E0F9514B9006C5449 /* CordovaLib_Prefix.pch */, + 7ED95D151AB9029B008C4574 /* CDVCommandDelegateImpl.h */, + 7ED95D161AB9029B008C4574 /* CDVCommandDelegateImpl.m */, 7ED95CF21AB9028C008C4574 /* CDVDebug.h */, 7ED95CF31AB9028C008C4574 /* CDVJSON_private.h */, 7ED95CF41AB9028C008C4574 /* CDVJSON_private.m */, @@ -291,47 +293,60 @@ sourceTree = ""; }; 7ED95D0E1AB9029B008C4574 /* Public */ = { + isa = PBXGroup; + children = ( + 7ED95D111AB9029B008C4574 /* CDVAppDelegate.m */, + 7ED95D181AB9029B008C4574 /* CDVCommandQueue.m */, + 7ED95D1A1AB9029B008C4574 /* CDVConfigParser.m */, + 7ED95D1C1AB9029B008C4574 /* CDVInvokedUrlCommand.m */, + 7ED95D1E1AB9029B008C4574 /* CDVPlugin+Resources.m */, + 7ED95D201AB9029B008C4574 /* CDVPlugin.m */, + 7ED95D221AB9029B008C4574 /* CDVPluginResult.m */, + 7ED95D251AB9029B008C4574 /* CDVTimer.m */, + 4E23F8F523E16E96006CD852 /* CDVWebViewProcessPoolFactory.m */, + 7ED95D2B1AB9029B008C4574 /* CDVViewController.m */, + 7ED95D2E1AB9029B008C4574 /* CDVAllowList.m */, + 7ED95D321AB9029B008C4574 /* NSDictionary+CordovaPreferences.m */, + 7ED95D341AB9029B008C4574 /* NSMutableArray+QueueAdditions.m */, + 2F4D42BB23F218BA00501999 /* CDVURLSchemeHandler.m */, + ); + name = Public; + path = Classes/Public; + sourceTree = ""; + }; + 9064EF5E26FAB74200C9D65B /* include */ = { + isa = PBXGroup; + children = ( + 9064EF5F26FAB74800C9D65B /* Cordova */, + ); + path = include; + sourceTree = ""; + }; + 9064EF5F26FAB74800C9D65B /* Cordova */ = { isa = PBXGroup; children = ( 7ED95D0F1AB9029B008C4574 /* CDV.h */, 7ED95D101AB9029B008C4574 /* CDVAppDelegate.h */, - 7ED95D111AB9029B008C4574 /* CDVAppDelegate.m */, 7ED95D121AB9029B008C4574 /* CDVAvailability.h */, 7ED95D131AB9029B008C4574 /* CDVAvailabilityDeprecated.h */, 7ED95D141AB9029B008C4574 /* CDVCommandDelegate.h */, - 7ED95D151AB9029B008C4574 /* CDVCommandDelegateImpl.h */, - 7ED95D161AB9029B008C4574 /* CDVCommandDelegateImpl.m */, 7ED95D171AB9029B008C4574 /* CDVCommandQueue.h */, - 7ED95D181AB9029B008C4574 /* CDVCommandQueue.m */, 7ED95D191AB9029B008C4574 /* CDVConfigParser.h */, - 7ED95D1A1AB9029B008C4574 /* CDVConfigParser.m */, 7ED95D1B1AB9029B008C4574 /* CDVInvokedUrlCommand.h */, - 7ED95D1C1AB9029B008C4574 /* CDVInvokedUrlCommand.m */, 7ED95D1D1AB9029B008C4574 /* CDVPlugin+Resources.h */, - 7ED95D1E1AB9029B008C4574 /* CDVPlugin+Resources.m */, 7ED95D1F1AB9029B008C4574 /* CDVPlugin.h */, - 7ED95D201AB9029B008C4574 /* CDVPlugin.m */, 7ED95D211AB9029B008C4574 /* CDVPluginResult.h */, - 7ED95D221AB9029B008C4574 /* CDVPluginResult.m */, 7ED95D231AB9029B008C4574 /* CDVScreenOrientationDelegate.h */, 7ED95D241AB9029B008C4574 /* CDVTimer.h */, - 7ED95D251AB9029B008C4574 /* CDVTimer.m */, 7ED95D2A1AB9029B008C4574 /* CDVViewController.h */, 4E23F8F923E16E96006CD852 /* CDVWebViewProcessPoolFactory.h */, - 4E23F8F523E16E96006CD852 /* CDVWebViewProcessPoolFactory.m */, - 7ED95D2B1AB9029B008C4574 /* CDVViewController.m */, 7ED95D2C1AB9029B008C4574 /* CDVWebViewEngineProtocol.h */, - 7ED95D2D1AB9029B008C4574 /* CDVWhitelist.h */, - 7ED95D2E1AB9029B008C4574 /* CDVWhitelist.m */, + 7ED95D2D1AB9029B008C4574 /* CDVAllowList.h */, 7ED95D311AB9029B008C4574 /* NSDictionary+CordovaPreferences.h */, - 7ED95D321AB9029B008C4574 /* NSDictionary+CordovaPreferences.m */, 7ED95D331AB9029B008C4574 /* NSMutableArray+QueueAdditions.h */, - 7ED95D341AB9029B008C4574 /* NSMutableArray+QueueAdditions.m */, 2F4D42BA23F218BA00501999 /* CDVURLSchemeHandler.h */, - 2F4D42BB23F218BA00501999 /* CDVURLSchemeHandler.m */, ); - name = Public; - path = Classes/Public; + path = Cordova; sourceTree = ""; }; A3B082D11BB15CEA00D8DC35 /* CDVGestureHandler */ = { @@ -373,12 +388,13 @@ C0C01EC41E39131A0056E6CB /* CDVPlugin+Resources.h in Headers */, C0C01EC51E39131A0056E6CB /* CDVPlugin.h in Headers */, C0C01EC61E39131A0056E6CB /* CDVPluginResult.h in Headers */, + 9059F51C26F2CE2400B3B2B7 /* CDVURLSchemeHandler.h in Headers */, C0C01EC71E39131A0056E6CB /* CDVScreenOrientationDelegate.h in Headers */, 4F56D836254A2EE10063F1D6 /* CDVWebViewEngine.h in Headers */, C0C01EC81E39131A0056E6CB /* CDVTimer.h in Headers */, C0C01ECB1E39131A0056E6CB /* CDVViewController.h in Headers */, C0C01ECC1E39131A0056E6CB /* CDVWebViewEngineProtocol.h in Headers */, - C0C01ECD1E39131A0056E6CB /* CDVWhitelist.h in Headers */, + C0C01ECD1E39131A0056E6CB /* CDVAllowList.h in Headers */, C0C01ECE1E39131A0056E6CB /* NSDictionary+CordovaPreferences.h in Headers */, 4E23F90323E17FFA006CD852 /* CDVWebViewUIDelegate.h in Headers */, C0C01ECF1E39131A0056E6CB /* NSMutableArray+QueueAdditions.h in Headers */, @@ -417,7 +433,7 @@ 7ED95D501AB9029B008C4574 /* CDVViewController.h in Headers */, 7ED95D521AB9029B008C4574 /* CDVWebViewEngineProtocol.h in Headers */, 4E23F90023E16E96006CD852 /* CDVWebViewEngine.h in Headers */, - 7ED95D531AB9029B008C4574 /* CDVWhitelist.h in Headers */, + 7ED95D531AB9029B008C4574 /* CDVAllowList.h in Headers */, 7ED95D571AB9029B008C4574 /* NSDictionary+CordovaPreferences.h in Headers */, 7ED95D591AB9029B008C4574 /* NSMutableArray+QueueAdditions.h in Headers */, 7ED95D021AB9028C008C4574 /* CDVDebug.h in Headers */, @@ -438,10 +454,9 @@ isa = PBXNativeTarget; buildConfigurationList = C0C01EB91E3911D50056E6CB /* Build configuration list for PBXNativeTarget "Cordova" */; buildPhases = ( + C0C01EAF1E3911D50056E6CB /* Headers */, C0C01EAD1E3911D50056E6CB /* Sources */, C0C01EAE1E3911D50056E6CB /* Frameworks */, - C0C01EAF1E3911D50056E6CB /* Headers */, - CEDDBB5523948D4C00506451 /* ShellScript */, ); buildRules = ( ); @@ -475,6 +490,7 @@ 0867D690FE84028FC02AAC07 /* Project object */ = { isa = PBXProject; attributes = { + BuildIndependentTargetsInParallel = YES; LastUpgradeCheck = 1010; TargetAttributes = { C0C01EB11E3911D50056E6CB = { @@ -506,26 +522,6 @@ }; /* End PBXProject section */ -/* Begin PBXShellScriptBuildPhase section */ - CEDDBB5523948D4C00506451 /* ShellScript */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputFileListPaths = ( - ); - inputPaths = ( - ); - outputFileListPaths = ( - ); - outputPaths = ( - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "\"${PROJECT_DIR}/../update_podspec.sh\" -s cordova\n"; - }; -/* End PBXShellScriptBuildPhase section */ - /* Begin PBXSourcesBuildPhase section */ C0C01EAD1E3911D50056E6CB /* Sources */ = { isa = PBXSourcesBuildPhase; @@ -545,7 +541,7 @@ 4F56D82D254A2EB50063F1D6 /* CDVWebViewEngine.m in Sources */, 9052DE7C2150D040008E83D4 /* CDVViewController.m in Sources */, 4F56D83C254A2F2F0063F1D6 /* CDVURLSchemeHandler.m in Sources */, - 9052DE7D2150D040008E83D4 /* CDVWhitelist.m in Sources */, + 9052DE7D2150D040008E83D4 /* CDVAllowList.m in Sources */, 9052DE7E2150D040008E83D4 /* NSDictionary+CordovaPreferences.m in Sources */, 9052DE7F2150D040008E83D4 /* NSMutableArray+QueueAdditions.m in Sources */, 9052DE802150D040008E83D4 /* CDVJSON_private.m in Sources */, @@ -574,7 +570,7 @@ 4E23F8FE23E16E96006CD852 /* CDVWebViewEngine.m in Sources */, 4E23F8FB23E16E96006CD852 /* CDVWebViewProcessPoolFactory.m in Sources */, 7ED95D511AB9029B008C4574 /* CDVViewController.m in Sources */, - 7ED95D541AB9029B008C4574 /* CDVWhitelist.m in Sources */, + 7ED95D541AB9029B008C4574 /* CDVAllowList.m in Sources */, 7ED95D581AB9029B008C4574 /* NSDictionary+CordovaPreferences.m in Sources */, 7ED95D5A1AB9029B008C4574 /* NSMutableArray+QueueAdditions.m in Sources */, 7ED95D041AB9028C008C4574 /* CDVJSON_private.m in Sources */, @@ -593,6 +589,9 @@ 1DEB921F08733DC00010E9CD /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { + ENABLE_MODULE_VERIFIER = YES; + MODULE_VERIFIER_SUPPORTED_LANGUAGES = "objective-c objective-c++"; + MODULE_VERIFIER_SUPPORTED_LANGUAGE_STANDARDS = "gnu11 gnu++14"; PUBLIC_HEADERS_FOLDER_PATH = include/Cordova; TARGETED_DEVICE_FAMILY = "1,2"; }; @@ -601,6 +600,9 @@ 1DEB922008733DC00010E9CD /* Release */ = { isa = XCBuildConfiguration; buildSettings = { + ENABLE_MODULE_VERIFIER = YES; + MODULE_VERIFIER_SUPPORTED_LANGUAGES = "objective-c objective-c++"; + MODULE_VERIFIER_SUPPORTED_LANGUAGE_STANDARDS = "gnu11 gnu++14"; PUBLIC_HEADERS_FOLDER_PATH = include/Cordova; TARGETED_DEVICE_FAMILY = "1,2"; }; @@ -632,6 +634,7 @@ CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; CLANG_WARN_STRICT_PROTOTYPES = YES; CLANG_WARN_SUSPICIOUS_MOVE = YES; @@ -641,14 +644,15 @@ CODE_SIGN_IDENTITY = ""; COPY_PHASE_STRIP = NO; DEBUG_INFORMATION_FORMAT = dwarf; + DEFINES_MODULE = YES; ENABLE_STRICT_OBJC_MSGSEND = YES; ENABLE_TESTABILITY = YES; + ENABLE_USER_SCRIPT_SANDBOXING = YES; GCC_C_LANGUAGE_STANDARD = gnu11; GCC_DYNAMIC_NO_PIC = NO; GCC_NO_COMMON_BLOCKS = YES; GCC_OPTIMIZATION_LEVEL = 0; GCC_PRECOMPILE_PREFIX_HEADER = YES; - GCC_PREFIX_HEADER = CordovaLib_Prefix.pch; GCC_PREPROCESSOR_DEFINITIONS = ( "DEBUG=1", "$(inherited)", @@ -660,6 +664,7 @@ GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; IPHONEOS_DEPLOYMENT_TARGET = 11.0; + MERGEABLE_LIBRARY = YES; MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; MTL_FAST_MATH = YES; ONLY_ACTIVE_ARCH = YES; @@ -696,6 +701,7 @@ CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; CLANG_WARN_STRICT_PROTOTYPES = YES; CLANG_WARN_SUSPICIOUS_MOVE = YES; @@ -705,12 +711,13 @@ CODE_SIGN_IDENTITY = ""; COPY_PHASE_STRIP = NO; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + DEFINES_MODULE = YES; ENABLE_NS_ASSERTIONS = NO; ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_USER_SCRIPT_SANDBOXING = YES; GCC_C_LANGUAGE_STANDARD = gnu11; GCC_NO_COMMON_BLOCKS = YES; GCC_PRECOMPILE_PREFIX_HEADER = YES; - GCC_PREFIX_HEADER = CordovaLib_Prefix.pch; GCC_PREPROCESSOR_DEFINITIONS = "$(inherited)"; GCC_WARN_64_TO_32_BIT_CONVERSION = YES; GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; @@ -719,6 +726,7 @@ GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; IPHONEOS_DEPLOYMENT_TARGET = 11.0; + MERGEABLE_LIBRARY = YES; MTL_ENABLE_DEBUG_INFO = NO; MTL_FAST_MATH = YES; OTHER_LDFLAGS = "-ObjC"; @@ -732,8 +740,8 @@ C0C01EB71E3911D50056E6CB /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { - DEFINES_MODULE = YES; DYLIB_INSTALL_NAME_BASE = "@rpath"; + ENABLE_MODULE_VERIFIER = YES; INFOPLIST_FILE = Cordova/Info.plist; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; LD_RUNPATH_SEARCH_PATHS = ( @@ -741,6 +749,8 @@ "@executable_path/Frameworks", "@loader_path/Frameworks", ); + MODULE_VERIFIER_SUPPORTED_LANGUAGES = "objective-c objective-c++"; + MODULE_VERIFIER_SUPPORTED_LANGUAGE_STANDARDS = "gnu11 gnu++14"; PRODUCT_BUNDLE_IDENTIFIER = org.apache.cordova.Cordova; TARGETED_DEVICE_FAMILY = "1,2"; VERSIONING_SYSTEM = "apple-generic"; @@ -751,8 +761,8 @@ C0C01EB81E3911D50056E6CB /* Release */ = { isa = XCBuildConfiguration; buildSettings = { - DEFINES_MODULE = YES; DYLIB_INSTALL_NAME_BASE = "@rpath"; + ENABLE_MODULE_VERIFIER = YES; INFOPLIST_FILE = Cordova/Info.plist; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; LD_RUNPATH_SEARCH_PATHS = ( @@ -760,6 +770,8 @@ "@executable_path/Frameworks", "@loader_path/Frameworks", ); + MODULE_VERIFIER_SUPPORTED_LANGUAGES = "objective-c objective-c++"; + MODULE_VERIFIER_SUPPORTED_LANGUAGE_STANDARDS = "gnu11 gnu++14"; PRODUCT_BUNDLE_IDENTIFIER = org.apache.cordova.Cordova; TARGETED_DEVICE_FAMILY = "1,2"; VERSIONING_SYSTEM = "apple-generic"; diff --git a/Samples/Cordova/ExampleProject/platforms/ios/CordovaLib/VERSION b/Samples/Cordova/ExampleProject/platforms/ios/CordovaLib/VERSION index 6abaeb2f..798e3899 100644 --- a/Samples/Cordova/ExampleProject/platforms/ios/CordovaLib/VERSION +++ b/Samples/Cordova/ExampleProject/platforms/ios/CordovaLib/VERSION @@ -1 +1 @@ -6.2.0 +6.3.0 diff --git a/Samples/Cordova/ExampleProject/platforms/ios/CordovaLib/cordova.js b/Samples/Cordova/ExampleProject/platforms/ios/CordovaLib/cordova.js index 37f329f5..c1005068 100644 --- a/Samples/Cordova/ExampleProject/platforms/ios/CordovaLib/cordova.js +++ b/Samples/Cordova/ExampleProject/platforms/ios/CordovaLib/cordova.js @@ -19,7 +19,7 @@ under the License. */ ;(function() { -var PLATFORM_VERSION_BUILD_LABEL = '6.2.0'; +var PLATFORM_VERSION_BUILD_LABEL = '6.3.0'; // file: src/scripts/require.js var require; var define; diff --git a/Samples/Cordova/ExampleProject/platforms/ios/ExampleProject.xcodeproj/project.pbxproj b/Samples/Cordova/ExampleProject/platforms/ios/ExampleProject.xcodeproj/project.pbxproj index 1c3612b0..61fae620 100644 --- a/Samples/Cordova/ExampleProject/platforms/ios/ExampleProject.xcodeproj/project.pbxproj +++ b/Samples/Cordova/ExampleProject/platforms/ios/ExampleProject.xcodeproj/project.pbxproj @@ -7,16 +7,18 @@ objects = { /* Begin PBXBuildFile section */ - 0207DA581B56EA530066E2B4 /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 0207DA571B56EA530066E2B4 /* Images.xcassets */; }; + 0207DA581B56EA530066E2B4 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 0207DA571B56EA530066E2B4 /* Assets.xcassets */; }; 1D3623260D0F684500981E51 /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 1D3623250D0F684500981E51 /* AppDelegate.m */; }; 1D60589B0D05DD56006BFB54 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 29B97316FDCFA39411CA2CEA /* main.m */; }; 301BF552109A68D80062928A /* libCordova.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 301BF535109A57CC0062928A /* libCordova.a */; settings = {ATTRIBUTES = (Required, ); }; }; 302D95F114D2391D003F00A1 /* MainViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 302D95EF14D2391D003F00A1 /* MainViewController.m */; }; 302D95F214D2391D003F00A1 /* MainViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 302D95F014D2391D003F00A1 /* MainViewController.xib */; }; + 4E7CA2B6272ABB0D00177EF9 /* config.xml in Copy Staging Resources */ = {isa = PBXBuildFile; fileRef = F840E1F0165FE0F500CFE078 /* config.xml */; }; + 4E7CA2B7272ABB0D00177EF9 /* www in Copy Staging Resources */ = {isa = PBXBuildFile; fileRef = 301BF56E109A69640062928A /* www */; }; 6AFF5BF91D6E424B00AB3073 /* CDVLaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 6AFF5BF81D6E424B00AB3073 /* CDVLaunchScreen.storyboard */; }; - AD72400BD15B4D16A8BD05A9 /* AppDelegate+CleverTapPlugin.m in Sources */ = {isa = PBXBuildFile; fileRef = C8520E2D94124E4C9E379DF9 /* AppDelegate+CleverTapPlugin.m */; }; - F443F68E20C643D0B20FDCBD /* CleverTapPlugin.m in Sources */ = {isa = PBXBuildFile; fileRef = C60E37BF58D944AEB25A6BC3 /* CleverTapPlugin.m */; }; - F5C587BEDEEFB99395C0C57D /* libPods-ExampleProject.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 6EDEC84873A4FB62AB153BED /* libPods-ExampleProject.a */; }; + 79E34FAD932141AAAED80323 /* AppDelegate+CleverTapPlugin.m in Sources */ = {isa = PBXBuildFile; fileRef = 9072FE03CBFB4BA1B3D674EF /* AppDelegate+CleverTapPlugin.m */; }; + 8869C715A9AFB9105187968D /* libPods-ExampleProject.a in Frameworks */ = {isa = PBXBuildFile; fileRef = A155B6ECBE7FA5665DB46E27 /* libPods-ExampleProject.a */; }; + D6D7091FE62E4E71A2ECFB0C /* CleverTapPlugin.m in Sources */ = {isa = PBXBuildFile; fileRef = 96D13DA9D5D94C098C714621 /* CleverTapPlugin.m */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -43,8 +45,23 @@ }; /* End PBXContainerItemProxy section */ +/* Begin PBXCopyFilesBuildPhase section */ + 857339E32710CC9700A1C74C /* Copy Staging Resources */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 2147483647; + dstPath = ""; + dstSubfolderSpec = 7; + files = ( + 4E7CA2B6272ABB0D00177EF9 /* config.xml in Copy Staging Resources */, + 4E7CA2B7272ABB0D00177EF9 /* www in Copy Staging Resources */, + ); + name = "Copy Staging Resources"; + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXCopyFilesBuildPhase section */ + /* Begin PBXFileReference section */ - 0207DA571B56EA530066E2B4 /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; name = Images.xcassets; path = ExampleProject/Images.xcassets; sourceTree = SOURCE_ROOT; }; + 0207DA571B56EA530066E2B4 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; name = Assets.xcassets; sourceTree = ""; }; 1D3623240D0F684500981E51 /* AppDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AppDelegate.h; sourceTree = ""; }; 1D3623250D0F684500981E51 /* AppDelegate.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = AppDelegate.m; sourceTree = ""; }; 1D6058910D05DD3D006BFB54 /* ExampleProject.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = ExampleProject.app; sourceTree = BUILT_PRODUCTS_DIR; }; @@ -58,19 +75,19 @@ 3047A5101AB8059700498E2A /* build-release.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = "build-release.xcconfig"; path = "cordova/build-release.xcconfig"; sourceTree = SOURCE_ROOT; }; 3047A5111AB8059700498E2A /* build.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = build.xcconfig; path = cordova/build.xcconfig; sourceTree = SOURCE_ROOT; }; 32CA4F630368D1EE00C91783 /* ExampleProject-Prefix.pch */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "ExampleProject-Prefix.pch"; sourceTree = ""; }; - 34095DC61A85023B420313D0 /* Pods-ExampleProject.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-ExampleProject.release.xcconfig"; path = "Target Support Files/Pods-ExampleProject/Pods-ExampleProject.release.xcconfig"; sourceTree = ""; }; - 36C68E7C744A4B49ADA24C00 /* CleverTapPlugin.h */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 4; includeInIndex = 0; lastKnownFileType = sourcecode.c.h; name = CleverTapPlugin.h; path = "clevertap-cordova/CleverTapPlugin.h"; sourceTree = ""; }; - 6AFF5BF81D6E424B00AB3073 /* CDVLaunchScreen.storyboard */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.storyboard; name = CDVLaunchScreen.storyboard; path = ExampleProject/CDVLaunchScreen.storyboard; sourceTree = SOURCE_ROOT; }; - 6EDEC84873A4FB62AB153BED /* libPods-ExampleProject.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-ExampleProject.a"; sourceTree = BUILT_PRODUCTS_DIR; }; - 8D1107310486CEB800E47090 /* ExampleProject-Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = "ExampleProject-Info.plist"; path = "ExampleProject/ExampleProject-Info.plist"; plistStructureDefinitionIdentifier = "com.apple.xcode.plist.structure-definition.iphone.info-plist"; sourceTree = SOURCE_ROOT; }; - 96822B858E1C4257A69E8942 /* AppDelegate+CleverTapPlugin.h */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 4; includeInIndex = 0; lastKnownFileType = sourcecode.c.h; name = "AppDelegate+CleverTapPlugin.h"; path = "clevertap-cordova/AppDelegate+CleverTapPlugin.h"; sourceTree = ""; }; - C60E37BF58D944AEB25A6BC3 /* CleverTapPlugin.m */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 4; includeInIndex = 0; lastKnownFileType = sourcecode.c.objc; name = CleverTapPlugin.m; path = "clevertap-cordova/CleverTapPlugin.m"; sourceTree = ""; }; - C8520E2D94124E4C9E379DF9 /* AppDelegate+CleverTapPlugin.m */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 4; includeInIndex = 0; lastKnownFileType = sourcecode.c.objc; name = "AppDelegate+CleverTapPlugin.m"; path = "clevertap-cordova/AppDelegate+CleverTapPlugin.m"; sourceTree = ""; }; + 6AFF5BF81D6E424B00AB3073 /* CDVLaunchScreen.storyboard */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.storyboard; name = CDVLaunchScreen.storyboard; sourceTree = ""; }; + 8BA5915B2658EAE4EF9242FE /* Pods-ExampleProject.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-ExampleProject.release.xcconfig"; path = "Target Support Files/Pods-ExampleProject/Pods-ExampleProject.release.xcconfig"; sourceTree = ""; }; + 8D1107310486CEB800E47090 /* ExampleProject-Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = "ExampleProject-Info.plist"; plistStructureDefinitionIdentifier = "com.apple.xcode.plist.structure-definition.iphone.info-plist"; sourceTree = ""; }; + 8F8027E1C1EF4E856A4C7C4B /* Pods-ExampleProject.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-ExampleProject.debug.xcconfig"; path = "Target Support Files/Pods-ExampleProject/Pods-ExampleProject.debug.xcconfig"; sourceTree = ""; }; + 9072FE03CBFB4BA1B3D674EF /* AppDelegate+CleverTapPlugin.m */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 4; includeInIndex = 0; lastKnownFileType = sourcecode.c.objc; name = "AppDelegate+CleverTapPlugin.m"; path = "clevertap-cordova/AppDelegate+CleverTapPlugin.m"; sourceTree = ""; }; + 936745733A0B4FACA19668BC /* CleverTapPlugin.h */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 4; includeInIndex = 0; lastKnownFileType = sourcecode.c.h; name = CleverTapPlugin.h; path = "clevertap-cordova/CleverTapPlugin.h"; sourceTree = ""; }; + 96D13DA9D5D94C098C714621 /* CleverTapPlugin.m */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 4; includeInIndex = 0; lastKnownFileType = sourcecode.c.objc; name = CleverTapPlugin.m; path = "clevertap-cordova/CleverTapPlugin.m"; sourceTree = ""; }; + A155B6ECBE7FA5665DB46E27 /* libPods-ExampleProject.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-ExampleProject.a"; sourceTree = BUILT_PRODUCTS_DIR; }; + BE1F5508A0C346F68965CBE2 /* AppDelegate+CleverTapPlugin.h */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 4; includeInIndex = 0; lastKnownFileType = sourcecode.c.h; name = "AppDelegate+CleverTapPlugin.h"; path = "clevertap-cordova/AppDelegate+CleverTapPlugin.h"; sourceTree = ""; }; EB87FDF31871DA8E0020F90C /* www */ = {isa = PBXFileReference; lastKnownFileType = folder; name = www; path = ../../www; sourceTree = ""; }; EB87FDF41871DAF40020F90C /* config.xml */ = {isa = PBXFileReference; lastKnownFileType = text.xml; name = config.xml; path = ../../config.xml; sourceTree = ""; }; ED33DF2A687741AEAF9F8254 /* Bridging-Header.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "Bridging-Header.h"; sourceTree = ""; }; F840E1F0165FE0F500CFE078 /* config.xml */ = {isa = PBXFileReference; lastKnownFileType = text.xml; name = config.xml; path = ExampleProject/config.xml; sourceTree = ""; }; - FA1E1E296A52A30137B44167 /* Pods-ExampleProject.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-ExampleProject.debug.xcconfig"; path = "Target Support Files/Pods-ExampleProject/Pods-ExampleProject.debug.xcconfig"; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -79,36 +96,13 @@ buildActionMask = 2147483647; files = ( 301BF552109A68D80062928A /* libCordova.a in Frameworks */, - F5C587BEDEEFB99395C0C57D /* libPods-ExampleProject.a in Frameworks */, + 8869C715A9AFB9105187968D /* libPods-ExampleProject.a in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ - 080E96DDFE201D6D7F000001 /* Classes */ = { - isa = PBXGroup; - children = ( - 302D95EE14D2391D003F00A1 /* MainViewController.h */, - 302D95EF14D2391D003F00A1 /* MainViewController.m */, - 302D95F014D2391D003F00A1 /* MainViewController.xib */, - 1D3623240D0F684500981E51 /* AppDelegate.h */, - 1D3623250D0F684500981E51 /* AppDelegate.m */, - ); - name = Classes; - path = ExampleProject/Classes; - sourceTree = SOURCE_ROOT; - }; - 0971A1313E1931542696B3D4 /* Pods */ = { - isa = PBXGroup; - children = ( - FA1E1E296A52A30137B44167 /* Pods-ExampleProject.debug.xcconfig */, - 34095DC61A85023B420313D0 /* Pods-ExampleProject.release.xcconfig */, - ); - name = Pods; - path = Pods; - sourceTree = ""; - }; 19C28FACFE9D520D11CA2CBB /* Products */ = { isa = PBXGroup; children = ( @@ -121,38 +115,42 @@ isa = PBXGroup; children = ( EB87FDF41871DAF40020F90C /* config.xml */, + 3047A50E1AB8057F00498E2A /* config */, EB87FDF31871DA8E0020F90C /* www */, EB87FDF11871DA420020F90C /* Staging */, 301BF52D109A57CC0062928A /* CordovaLib.xcodeproj */, - 080E96DDFE201D6D7F000001 /* Classes */, + 29B97315FDCFA39411CA2CEA /* ExampleProject */, 307C750510C5A3420062BCA9 /* Plugins */, - 29B97315FDCFA39411CA2CEA /* Other Sources */, 29B97317FDCFA39411CA2CEA /* Resources */, 29B97323FDCFA39411CA2CEA /* Frameworks */, 19C28FACFE9D520D11CA2CBB /* Products */, - 0971A1313E1931542696B3D4 /* Pods */, + 536D318C185AA9CF6B12F65E /* Pods */, ); name = CustomTemplate; sourceTree = ""; }; - 29B97315FDCFA39411CA2CEA /* Other Sources */ = { + 29B97315FDCFA39411CA2CEA /* ExampleProject */ = { isa = PBXGroup; children = ( + 8D1107310486CEB800E47090 /* ExampleProject-Info.plist */, 32CA4F630368D1EE00C91783 /* ExampleProject-Prefix.pch */, - 29B97316FDCFA39411CA2CEA /* main.m */, + 6AFF5BF81D6E424B00AB3073 /* CDVLaunchScreen.storyboard */, + 0207DA571B56EA530066E2B4 /* Assets.xcassets */, ED33DF2A687741AEAF9F8254 /* Bridging-Header.h */, + 302D95EE14D2391D003F00A1 /* MainViewController.h */, + 302D95EF14D2391D003F00A1 /* MainViewController.m */, + 302D95F014D2391D003F00A1 /* MainViewController.xib */, + 1D3623240D0F684500981E51 /* AppDelegate.h */, + 1D3623250D0F684500981E51 /* AppDelegate.m */, + 29B97316FDCFA39411CA2CEA /* main.m */, ); - name = "Other Sources"; + name = ExampleProject; path = ExampleProject; sourceTree = ""; }; 29B97317FDCFA39411CA2CEA /* Resources */ = { isa = PBXGroup; children = ( - 0207DA571B56EA530066E2B4 /* Images.xcassets */, - 3047A50E1AB8057F00498E2A /* config */, - 8D1107310486CEB800E47090 /* ExampleProject-Info.plist */, - 6AFF5BF81D6E424B00AB3073 /* CDVLaunchScreen.storyboard */, ); name = Resources; path = ExampleProject/Resources; @@ -161,7 +159,7 @@ 29B97323FDCFA39411CA2CEA /* Frameworks */ = { isa = PBXGroup; children = ( - 6EDEC84873A4FB62AB153BED /* libPods-ExampleProject.a */, + A155B6ECBE7FA5665DB46E27 /* libPods-ExampleProject.a */, ); name = Frameworks; sourceTree = ""; @@ -188,15 +186,25 @@ 307C750510C5A3420062BCA9 /* Plugins */ = { isa = PBXGroup; children = ( - C8520E2D94124E4C9E379DF9 /* AppDelegate+CleverTapPlugin.m */, - C60E37BF58D944AEB25A6BC3 /* CleverTapPlugin.m */, - 96822B858E1C4257A69E8942 /* AppDelegate+CleverTapPlugin.h */, - 36C68E7C744A4B49ADA24C00 /* CleverTapPlugin.h */, + 9072FE03CBFB4BA1B3D674EF /* AppDelegate+CleverTapPlugin.m */, + 96D13DA9D5D94C098C714621 /* CleverTapPlugin.m */, + BE1F5508A0C346F68965CBE2 /* AppDelegate+CleverTapPlugin.h */, + 936745733A0B4FACA19668BC /* CleverTapPlugin.h */, ); name = Plugins; path = ExampleProject/Plugins; sourceTree = SOURCE_ROOT; }; + 536D318C185AA9CF6B12F65E /* Pods */ = { + isa = PBXGroup; + children = ( + 8F8027E1C1EF4E856A4C7C4B /* Pods-ExampleProject.debug.xcconfig */, + 8BA5915B2658EAE4EF9242FE /* Pods-ExampleProject.release.xcconfig */, + ); + name = Pods; + path = Pods; + sourceTree = ""; + }; EB87FDF11871DA420020F90C /* Staging */ = { isa = PBXGroup; children = ( @@ -213,12 +221,12 @@ isa = PBXNativeTarget; buildConfigurationList = 1D6058960D05DD3E006BFB54 /* Build configuration list for PBXNativeTarget "ExampleProject" */; buildPhases = ( - 7F1A6C3AB510EE7B5BAA379D /* [CP] Check Pods Manifest.lock */, - 304B58A110DAC018002A0835 /* Copy www directory */, + 0F6AD5DD9B2AD417C23B3A15 /* [CP] Check Pods Manifest.lock */, + 857339E32710CC9700A1C74C /* Copy Staging Resources */, 1D60588D0D05DD3D006BFB54 /* Resources */, 1D60588E0D05DD3D006BFB54 /* Sources */, 1D60588F0D05DD3D006BFB54 /* Frameworks */, - EE1DE85F4E80EC58910804B9 /* [CP] Copy Pods Resources */, + C9C0AE388FD885C43F4686F6 /* [CP] Copy Pods Resources */, ); buildRules = ( ); @@ -236,6 +244,7 @@ 29B97313FDCFA39411CA2CEA /* Project object */ = { isa = PBXProject; attributes = { + BuildIndependentTargetsInParallel = YES; LastUpgradeCheck = 1130; TargetAttributes = { 1D6058900D05DD3D006BFB54 = { @@ -290,7 +299,7 @@ buildActionMask = 2147483647; files = ( 302D95F214D2391D003F00A1 /* MainViewController.xib in Resources */, - 0207DA581B56EA530066E2B4 /* Images.xcassets in Resources */, + 0207DA581B56EA530066E2B4 /* Assets.xcassets in Resources */, 6AFF5BF91D6E424B00AB3073 /* CDVLaunchScreen.storyboard in Resources */, ); runOnlyForDeploymentPostprocessing = 0; @@ -298,22 +307,7 @@ /* End PBXResourcesBuildPhase section */ /* Begin PBXShellScriptBuildPhase section */ - 304B58A110DAC018002A0835 /* Copy www directory */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputPaths = ( - ); - name = "Copy www directory"; - outputPaths = ( - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "\"$SRCROOT/ExampleProject/Scripts/copy-www-build-step.sh\""; - showEnvVarsInLog = 0; - }; - 7F1A6C3AB510EE7B5BAA379D /* [CP] Check Pods Manifest.lock */ = { + 0F6AD5DD9B2AD417C23B3A15 /* [CP] Check Pods Manifest.lock */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( @@ -335,7 +329,7 @@ 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; }; - EE1DE85F4E80EC58910804B9 /* [CP] Copy Pods Resources */ = { + C9C0AE388FD885C43F4686F6 /* [CP] Copy Pods Resources */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( @@ -362,8 +356,8 @@ 1D60589B0D05DD56006BFB54 /* main.m in Sources */, 1D3623260D0F684500981E51 /* AppDelegate.m in Sources */, 302D95F114D2391D003F00A1 /* MainViewController.m in Sources */, - AD72400BD15B4D16A8BD05A9 /* AppDelegate+CleverTapPlugin.m in Sources */, - F443F68E20C643D0B20FDCBD /* CleverTapPlugin.m in Sources */, + 79E34FAD932141AAAED80323 /* AppDelegate+CleverTapPlugin.m in Sources */, + D6D7091FE62E4E71A2ECFB0C /* CleverTapPlugin.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -398,6 +392,7 @@ LD_RUNPATH_SEARCH_PATHS = "@executable_path/Frameworks"; PRODUCT_BUNDLE_IDENTIFIER = com.clevertap.example; PRODUCT_NAME = "$(TARGET_NAME)"; + SUPPORTS_MACCATALYST = YES; TARGETED_DEVICE_FAMILY = "1,2"; VALIDATE_WORKSPACE = NO; }; @@ -421,6 +416,7 @@ LD_RUNPATH_SEARCH_PATHS = "@executable_path/Frameworks"; PRODUCT_BUNDLE_IDENTIFIER = com.clevertap.example; PRODUCT_NAME = "$(TARGET_NAME)"; + SUPPORTS_MACCATALYST = YES; TARGETED_DEVICE_FAMILY = "1,2"; VALIDATE_WORKSPACE = NO; }; @@ -445,6 +441,7 @@ CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; CLANG_WARN_STRICT_PROTOTYPES = YES; CLANG_WARN_SUSPICIOUS_MOVE = YES; @@ -452,6 +449,7 @@ CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; ENABLE_STRICT_OBJC_MSGSEND = YES; ENABLE_TESTABILITY = YES; + ENABLE_USER_SCRIPT_SANDBOXING = NO; GCC_C_LANGUAGE_STANDARD = c99; GCC_NO_COMMON_BLOCKS = YES; GCC_THUMB_SUPPORT = NO; @@ -462,6 +460,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; + MERGED_BINARY_TYPE = automatic; ONLY_ACTIVE_ARCH = YES; SDKROOT = iphoneos; SKIP_INSTALL = NO; @@ -488,12 +487,14 @@ CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; CLANG_WARN_STRICT_PROTOTYPES = YES; CLANG_WARN_SUSPICIOUS_MOVE = YES; CLANG_WARN_UNREACHABLE_CODE = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_USER_SCRIPT_SANDBOXING = NO; GCC_C_LANGUAGE_STANDARD = c99; GCC_NO_COMMON_BLOCKS = YES; GCC_THUMB_SUPPORT = NO; @@ -504,6 +505,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; + MERGED_BINARY_TYPE = automatic; SDKROOT = iphoneos; SKIP_INSTALL = NO; WK_WEB_VIEW_ONLY = 1; diff --git a/Samples/Cordova/ExampleProject/platforms/ios/ExampleProject/Assets.xcassets/AppIcon.appiconset/Contents.json b/Samples/Cordova/ExampleProject/platforms/ios/ExampleProject/Assets.xcassets/AppIcon.appiconset/Contents.json new file mode 100644 index 00000000..2ce78c1b --- /dev/null +++ b/Samples/Cordova/ExampleProject/platforms/ios/ExampleProject/Assets.xcassets/AppIcon.appiconset/Contents.json @@ -0,0 +1,241 @@ +{ + "images" : [ + { + "size" : "20x20", + "idiom" : "iphone", + "filename" : "icon-20@2x.png", + "scale" : "2x" + }, + { + "size" : "20x20", + "idiom" : "iphone", + "filename" : "icon-20@3x.png", + "scale" : "3x" + }, + { + "size" : "29x29", + "idiom" : "iphone", + "filename" : "icon-29.png", + "scale" : "1x" + }, + { + "size" : "29x29", + "idiom" : "iphone", + "filename" : "icon-29@2x.png", + "scale" : "2x" + }, + { + "size" : "29x29", + "idiom" : "iphone", + "filename" : "icon-29@3x.png", + "scale" : "3x" + }, + { + "size" : "40x40", + "idiom" : "iphone", + "filename" : "icon-40@2x.png", + "scale" : "2x" + }, + { + "size" : "40x40", + "idiom" : "iphone", + "filename" : "icon-60@2x.png", + "scale" : "3x" + }, + { + "size" : "57x57", + "idiom" : "iphone", + "filename" : "icon.png", + "scale" : "1x" + }, + { + "size" : "57x57", + "idiom" : "iphone", + "filename" : "icon@2x.png", + "scale" : "2x" + }, + { + "size" : "60x60", + "idiom" : "iphone", + "filename" : "icon-60@2x.png", + "scale" : "2x" + }, + { + "size" : "60x60", + "idiom" : "iphone", + "filename" : "icon-60@3x.png", + "scale" : "3x" + }, + { + "size" : "20x20", + "idiom" : "ipad", + "filename" : "icon-20.png", + "scale" : "1x" + }, + { + "size" : "20x20", + "idiom" : "ipad", + "filename" : "icon-20@2x.png", + "scale" : "2x" + }, + { + "size" : "29x29", + "idiom" : "ipad", + "filename" : "icon-29.png", + "scale" : "1x" + }, + { + "size" : "29x29", + "idiom" : "ipad", + "filename" : "icon-29@2x.png", + "scale" : "2x" + }, + { + "size" : "40x40", + "idiom" : "ipad", + "filename" : "icon-40.png", + "scale" : "1x" + }, + { + "size" : "40x40", + "idiom" : "ipad", + "filename" : "icon-40@2x.png", + "scale" : "2x" + }, + { + "size" : "50x50", + "idiom" : "ipad", + "filename" : "icon-50.png", + "scale" : "1x" + }, + { + "size" : "50x50", + "idiom" : "ipad", + "filename" : "icon-50@2x.png", + "scale" : "2x" + }, + { + "size" : "72x72", + "idiom" : "ipad", + "filename" : "icon-72.png", + "scale" : "1x" + }, + { + "size" : "72x72", + "idiom" : "ipad", + "filename" : "icon-72@2x.png", + "scale" : "2x" + }, + { + "size" : "76x76", + "idiom" : "ipad", + "filename" : "icon-76.png", + "scale" : "1x" + }, + { + "size" : "76x76", + "idiom" : "ipad", + "filename" : "icon-76@2x.png", + "scale" : "2x" + }, + { + "size" : "83.5x83.5", + "idiom" : "ipad", + "filename" : "icon-83.5@2x.png", + "scale" : "2x" + }, + { + "size" : "1024x1024", + "idiom" : "ios-marketing", + "filename" : "icon-1024.png", + "scale" : "1x" + }, + { + "size" : "24x24", + "idiom" : "watch", + "filename" : "icon-24@2x.png", + "scale" : "2x", + "role" : "notificationCenter", + "subtype" : "38mm" + }, + { + "size" : "27.5x27.5", + "idiom" : "watch", + "filename" : "icon-27.5@2x.png", + "scale" : "2x", + "role" : "notificationCenter", + "subtype" : "42mm" + }, + { + "size" : "29x29", + "idiom" : "watch", + "filename" : "icon-29@2x.png", + "role" : "companionSettings", + "scale" : "2x" + }, + { + "size" : "29x29", + "idiom" : "watch", + "filename" : "icon-29@3x.png", + "role" : "companionSettings", + "scale" : "3x" + }, + { + "size" : "40x40", + "idiom" : "watch", + "filename" : "icon-40@2x.png", + "scale" : "2x", + "role" : "appLauncher", + "subtype" : "38mm" + }, + { + "size" : "44x44", + "idiom" : "watch", + "filename" : "icon-44@2x.png", + "scale" : "2x", + "role" : "appLauncher", + "subtype" : "40mm" + }, + { + "size" : "50x50", + "idiom" : "watch", + "filename" : "icon-50@2x.png", + "scale" : "2x", + "role" : "appLauncher", + "subtype" : "44mm" + }, + { + "size" : "86x86", + "idiom" : "watch", + "filename" : "icon-86@2x.png", + "scale" : "2x", + "role" : "quickLook", + "subtype" : "38mm" + }, + { + "size" : "98x98", + "idiom" : "watch", + "filename" : "icon-98@2x.png", + "scale" : "2x", + "role" : "quickLook", + "subtype" : "42mm" + }, + { + "size" : "108x108", + "idiom" : "watch", + "scale" : "2x", + "role" : "quickLook", + "subtype" : "44mm" + }, + { + "size" : "1024x1024", + "idiom" : "watch-marketing", + "filename" : "icon-1024.png", + "scale" : "1x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/Samples/Cordova/ExampleProject/platforms/ios/ExampleProject/Assets.xcassets/AppIcon.appiconset/icon-1024.png b/Samples/Cordova/ExampleProject/platforms/ios/ExampleProject/Assets.xcassets/AppIcon.appiconset/icon-1024.png new file mode 100644 index 00000000..1b9cbb91 Binary files /dev/null and b/Samples/Cordova/ExampleProject/platforms/ios/ExampleProject/Assets.xcassets/AppIcon.appiconset/icon-1024.png differ diff --git a/Samples/Cordova/ExampleProject/platforms/ios/ExampleProject/Assets.xcassets/AppIcon.appiconset/icon-20.png b/Samples/Cordova/ExampleProject/platforms/ios/ExampleProject/Assets.xcassets/AppIcon.appiconset/icon-20.png new file mode 100644 index 00000000..5788eed9 Binary files /dev/null and b/Samples/Cordova/ExampleProject/platforms/ios/ExampleProject/Assets.xcassets/AppIcon.appiconset/icon-20.png differ diff --git a/Samples/Cordova/ExampleProject/platforms/ios/ExampleProject/Assets.xcassets/AppIcon.appiconset/icon-20@2x.png b/Samples/Cordova/ExampleProject/platforms/ios/ExampleProject/Assets.xcassets/AppIcon.appiconset/icon-20@2x.png new file mode 100644 index 00000000..4feefdf8 Binary files /dev/null and b/Samples/Cordova/ExampleProject/platforms/ios/ExampleProject/Assets.xcassets/AppIcon.appiconset/icon-20@2x.png differ diff --git a/Samples/Cordova/ExampleProject/platforms/ios/ExampleProject/Assets.xcassets/AppIcon.appiconset/icon-20@3x.png b/Samples/Cordova/ExampleProject/platforms/ios/ExampleProject/Assets.xcassets/AppIcon.appiconset/icon-20@3x.png new file mode 100644 index 00000000..69ce592c Binary files /dev/null and b/Samples/Cordova/ExampleProject/platforms/ios/ExampleProject/Assets.xcassets/AppIcon.appiconset/icon-20@3x.png differ diff --git a/Samples/Cordova/ExampleProject/platforms/ios/ExampleProject/Assets.xcassets/AppIcon.appiconset/icon-24@2x.png b/Samples/Cordova/ExampleProject/platforms/ios/ExampleProject/Assets.xcassets/AppIcon.appiconset/icon-24@2x.png new file mode 100644 index 00000000..f0babf9d Binary files /dev/null and b/Samples/Cordova/ExampleProject/platforms/ios/ExampleProject/Assets.xcassets/AppIcon.appiconset/icon-24@2x.png differ diff --git a/Samples/Cordova/ExampleProject/platforms/ios/ExampleProject/Assets.xcassets/AppIcon.appiconset/icon-27.5@2x.png b/Samples/Cordova/ExampleProject/platforms/ios/ExampleProject/Assets.xcassets/AppIcon.appiconset/icon-27.5@2x.png new file mode 100644 index 00000000..78f21bb3 Binary files /dev/null and b/Samples/Cordova/ExampleProject/platforms/ios/ExampleProject/Assets.xcassets/AppIcon.appiconset/icon-27.5@2x.png differ diff --git a/Samples/Cordova/ExampleProject/platforms/ios/ExampleProject/Assets.xcassets/AppIcon.appiconset/icon-29.png b/Samples/Cordova/ExampleProject/platforms/ios/ExampleProject/Assets.xcassets/AppIcon.appiconset/icon-29.png new file mode 100644 index 00000000..5dff98e9 Binary files /dev/null and b/Samples/Cordova/ExampleProject/platforms/ios/ExampleProject/Assets.xcassets/AppIcon.appiconset/icon-29.png differ diff --git a/Samples/Cordova/ExampleProject/platforms/ios/ExampleProject/Assets.xcassets/AppIcon.appiconset/icon-29@2x.png b/Samples/Cordova/ExampleProject/platforms/ios/ExampleProject/Assets.xcassets/AppIcon.appiconset/icon-29@2x.png new file mode 100644 index 00000000..34b39085 Binary files /dev/null and b/Samples/Cordova/ExampleProject/platforms/ios/ExampleProject/Assets.xcassets/AppIcon.appiconset/icon-29@2x.png differ diff --git a/Samples/Cordova/ExampleProject/platforms/ios/ExampleProject/Assets.xcassets/AppIcon.appiconset/icon-29@3x.png b/Samples/Cordova/ExampleProject/platforms/ios/ExampleProject/Assets.xcassets/AppIcon.appiconset/icon-29@3x.png new file mode 100644 index 00000000..c63fd776 Binary files /dev/null and b/Samples/Cordova/ExampleProject/platforms/ios/ExampleProject/Assets.xcassets/AppIcon.appiconset/icon-29@3x.png differ diff --git a/Samples/Cordova/ExampleProject/platforms/ios/ExampleProject/Assets.xcassets/AppIcon.appiconset/icon-40.png b/Samples/Cordova/ExampleProject/platforms/ios/ExampleProject/Assets.xcassets/AppIcon.appiconset/icon-40.png new file mode 100644 index 00000000..4feefdf8 Binary files /dev/null and b/Samples/Cordova/ExampleProject/platforms/ios/ExampleProject/Assets.xcassets/AppIcon.appiconset/icon-40.png differ diff --git a/Samples/Cordova/ExampleProject/platforms/ios/ExampleProject/Assets.xcassets/AppIcon.appiconset/icon-40@2x.png b/Samples/Cordova/ExampleProject/platforms/ios/ExampleProject/Assets.xcassets/AppIcon.appiconset/icon-40@2x.png new file mode 100644 index 00000000..32897363 Binary files /dev/null and b/Samples/Cordova/ExampleProject/platforms/ios/ExampleProject/Assets.xcassets/AppIcon.appiconset/icon-40@2x.png differ diff --git a/Samples/Cordova/ExampleProject/platforms/ios/ExampleProject/Assets.xcassets/AppIcon.appiconset/icon-44@2x.png b/Samples/Cordova/ExampleProject/platforms/ios/ExampleProject/Assets.xcassets/AppIcon.appiconset/icon-44@2x.png new file mode 100644 index 00000000..01c5af72 Binary files /dev/null and b/Samples/Cordova/ExampleProject/platforms/ios/ExampleProject/Assets.xcassets/AppIcon.appiconset/icon-44@2x.png differ diff --git a/Samples/Cordova/ExampleProject/platforms/ios/ExampleProject/Assets.xcassets/AppIcon.appiconset/icon-50.png b/Samples/Cordova/ExampleProject/platforms/ios/ExampleProject/Assets.xcassets/AppIcon.appiconset/icon-50.png new file mode 100644 index 00000000..81f93f16 Binary files /dev/null and b/Samples/Cordova/ExampleProject/platforms/ios/ExampleProject/Assets.xcassets/AppIcon.appiconset/icon-50.png differ diff --git a/Samples/Cordova/ExampleProject/platforms/ios/ExampleProject/Assets.xcassets/AppIcon.appiconset/icon-50@2x.png b/Samples/Cordova/ExampleProject/platforms/ios/ExampleProject/Assets.xcassets/AppIcon.appiconset/icon-50@2x.png new file mode 100644 index 00000000..a980efe1 Binary files /dev/null and b/Samples/Cordova/ExampleProject/platforms/ios/ExampleProject/Assets.xcassets/AppIcon.appiconset/icon-50@2x.png differ diff --git a/Samples/Cordova/ExampleProject/platforms/ios/ExampleProject/Assets.xcassets/AppIcon.appiconset/icon-60@2x.png b/Samples/Cordova/ExampleProject/platforms/ios/ExampleProject/Assets.xcassets/AppIcon.appiconset/icon-60@2x.png new file mode 100644 index 00000000..1e794a48 Binary files /dev/null and b/Samples/Cordova/ExampleProject/platforms/ios/ExampleProject/Assets.xcassets/AppIcon.appiconset/icon-60@2x.png differ diff --git a/Samples/Cordova/ExampleProject/platforms/ios/ExampleProject/Assets.xcassets/AppIcon.appiconset/icon-60@3x.png b/Samples/Cordova/ExampleProject/platforms/ios/ExampleProject/Assets.xcassets/AppIcon.appiconset/icon-60@3x.png new file mode 100644 index 00000000..db10c553 Binary files /dev/null and b/Samples/Cordova/ExampleProject/platforms/ios/ExampleProject/Assets.xcassets/AppIcon.appiconset/icon-60@3x.png differ diff --git a/Samples/Cordova/ExampleProject/platforms/ios/ExampleProject/Assets.xcassets/AppIcon.appiconset/icon-72.png b/Samples/Cordova/ExampleProject/platforms/ios/ExampleProject/Assets.xcassets/AppIcon.appiconset/icon-72.png new file mode 100644 index 00000000..097f5b40 Binary files /dev/null and b/Samples/Cordova/ExampleProject/platforms/ios/ExampleProject/Assets.xcassets/AppIcon.appiconset/icon-72.png differ diff --git a/Samples/Cordova/ExampleProject/platforms/ios/ExampleProject/Assets.xcassets/AppIcon.appiconset/icon-72@2x.png b/Samples/Cordova/ExampleProject/platforms/ios/ExampleProject/Assets.xcassets/AppIcon.appiconset/icon-72@2x.png new file mode 100644 index 00000000..e3d49a2f Binary files /dev/null and b/Samples/Cordova/ExampleProject/platforms/ios/ExampleProject/Assets.xcassets/AppIcon.appiconset/icon-72@2x.png differ diff --git a/Samples/Cordova/ExampleProject/platforms/ios/ExampleProject/Assets.xcassets/AppIcon.appiconset/icon-76.png b/Samples/Cordova/ExampleProject/platforms/ios/ExampleProject/Assets.xcassets/AppIcon.appiconset/icon-76.png new file mode 100644 index 00000000..aa6810c3 Binary files /dev/null and b/Samples/Cordova/ExampleProject/platforms/ios/ExampleProject/Assets.xcassets/AppIcon.appiconset/icon-76.png differ diff --git a/Samples/Cordova/ExampleProject/platforms/ios/ExampleProject/Assets.xcassets/AppIcon.appiconset/icon-76@2x.png b/Samples/Cordova/ExampleProject/platforms/ios/ExampleProject/Assets.xcassets/AppIcon.appiconset/icon-76@2x.png new file mode 100644 index 00000000..da3a050f Binary files /dev/null and b/Samples/Cordova/ExampleProject/platforms/ios/ExampleProject/Assets.xcassets/AppIcon.appiconset/icon-76@2x.png differ diff --git a/Samples/Cordova/ExampleProject/platforms/ios/ExampleProject/Assets.xcassets/AppIcon.appiconset/icon-83.5@2x.png b/Samples/Cordova/ExampleProject/platforms/ios/ExampleProject/Assets.xcassets/AppIcon.appiconset/icon-83.5@2x.png new file mode 100644 index 00000000..039a02ae Binary files /dev/null and b/Samples/Cordova/ExampleProject/platforms/ios/ExampleProject/Assets.xcassets/AppIcon.appiconset/icon-83.5@2x.png differ diff --git a/Samples/Cordova/ExampleProject/platforms/ios/ExampleProject/Assets.xcassets/AppIcon.appiconset/icon-86@2x.png b/Samples/Cordova/ExampleProject/platforms/ios/ExampleProject/Assets.xcassets/AppIcon.appiconset/icon-86@2x.png new file mode 100644 index 00000000..f32a034a Binary files /dev/null and b/Samples/Cordova/ExampleProject/platforms/ios/ExampleProject/Assets.xcassets/AppIcon.appiconset/icon-86@2x.png differ diff --git a/Samples/Cordova/ExampleProject/platforms/ios/ExampleProject/Assets.xcassets/AppIcon.appiconset/icon-98@2x.png b/Samples/Cordova/ExampleProject/platforms/ios/ExampleProject/Assets.xcassets/AppIcon.appiconset/icon-98@2x.png new file mode 100644 index 00000000..85ec9e36 Binary files /dev/null and b/Samples/Cordova/ExampleProject/platforms/ios/ExampleProject/Assets.xcassets/AppIcon.appiconset/icon-98@2x.png differ diff --git a/Samples/Cordova/ExampleProject/platforms/ios/ExampleProject/Assets.xcassets/AppIcon.appiconset/icon.png b/Samples/Cordova/ExampleProject/platforms/ios/ExampleProject/Assets.xcassets/AppIcon.appiconset/icon.png new file mode 100644 index 00000000..bbdba9ee Binary files /dev/null and b/Samples/Cordova/ExampleProject/platforms/ios/ExampleProject/Assets.xcassets/AppIcon.appiconset/icon.png differ diff --git a/Samples/Cordova/ExampleProject/platforms/ios/ExampleProject/Assets.xcassets/AppIcon.appiconset/icon@2x.png b/Samples/Cordova/ExampleProject/platforms/ios/ExampleProject/Assets.xcassets/AppIcon.appiconset/icon@2x.png new file mode 100644 index 00000000..41e6be4a Binary files /dev/null and b/Samples/Cordova/ExampleProject/platforms/ios/ExampleProject/Assets.xcassets/AppIcon.appiconset/icon@2x.png differ diff --git a/Samples/Cordova/ExampleProject/platforms/ios/ExampleProject/Assets.xcassets/BackgroundColor.colorset/Contents.json b/Samples/Cordova/ExampleProject/platforms/ios/ExampleProject/Assets.xcassets/BackgroundColor.colorset/Contents.json new file mode 100644 index 00000000..38ce5e7c --- /dev/null +++ b/Samples/Cordova/ExampleProject/platforms/ios/ExampleProject/Assets.xcassets/BackgroundColor.colorset/Contents.json @@ -0,0 +1,15 @@ +{ + "colors": [ + { + "idiom": "universal", + "color": { + "platform": "ios", + "reference": "systemBackgroundColor" + } + } + ], + "info": { + "author": "Xcode", + "version": 1 + } +} \ No newline at end of file diff --git a/Samples/Cordova/ExampleProject/platforms/ios/ExampleProject/Assets.xcassets/Contents.json b/Samples/Cordova/ExampleProject/platforms/ios/ExampleProject/Assets.xcassets/Contents.json new file mode 100644 index 00000000..da4a164c --- /dev/null +++ b/Samples/Cordova/ExampleProject/platforms/ios/ExampleProject/Assets.xcassets/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/Samples/Cordova/ExampleProject/platforms/ios/ExampleProject/Assets.xcassets/LaunchStoryboard.imageset/Contents.json b/Samples/Cordova/ExampleProject/platforms/ios/ExampleProject/Assets.xcassets/LaunchStoryboard.imageset/Contents.json new file mode 100644 index 00000000..c0ac4835 --- /dev/null +++ b/Samples/Cordova/ExampleProject/platforms/ios/ExampleProject/Assets.xcassets/LaunchStoryboard.imageset/Contents.json @@ -0,0 +1,872 @@ +{ + "images": [ + { + "idiom": "universal", + "scale": "1x", + "width-class": "compact", + "height-class": "compact" + }, + { + "idiom": "universal", + "scale": "1x", + "width-class": "compact", + "height-class": "compact", + "appearances": [ + { + "appearance": "luminosity", + "value": "dark" + } + ] + }, + { + "idiom": "universal", + "scale": "1x", + "width-class": "compact", + "height-class": "compact", + "appearances": [ + { + "appearance": "luminosity", + "value": "light" + } + ] + }, + { + "idiom": "universal", + "scale": "1x", + "width-class": "compact" + }, + { + "idiom": "universal", + "scale": "1x", + "width-class": "compact", + "appearances": [ + { + "appearance": "luminosity", + "value": "dark" + } + ] + }, + { + "idiom": "universal", + "scale": "1x", + "width-class": "compact", + "appearances": [ + { + "appearance": "luminosity", + "value": "light" + } + ] + }, + { + "idiom": "universal", + "scale": "1x", + "height-class": "compact" + }, + { + "idiom": "universal", + "scale": "1x", + "height-class": "compact", + "appearances": [ + { + "appearance": "luminosity", + "value": "dark" + } + ] + }, + { + "idiom": "universal", + "scale": "1x", + "height-class": "compact", + "appearances": [ + { + "appearance": "luminosity", + "value": "light" + } + ] + }, + { + "idiom": "universal", + "scale": "1x" + }, + { + "idiom": "universal", + "scale": "1x", + "appearances": [ + { + "appearance": "luminosity", + "value": "dark" + } + ] + }, + { + "idiom": "universal", + "scale": "1x", + "appearances": [ + { + "appearance": "luminosity", + "value": "light" + } + ] + }, + { + "idiom": "universal", + "scale": "2x", + "width-class": "compact", + "height-class": "compact" + }, + { + "idiom": "universal", + "scale": "2x", + "width-class": "compact", + "height-class": "compact", + "appearances": [ + { + "appearance": "luminosity", + "value": "dark" + } + ] + }, + { + "idiom": "universal", + "scale": "2x", + "width-class": "compact", + "height-class": "compact", + "appearances": [ + { + "appearance": "luminosity", + "value": "light" + } + ] + }, + { + "idiom": "universal", + "scale": "2x", + "width-class": "compact" + }, + { + "idiom": "universal", + "scale": "2x", + "width-class": "compact", + "appearances": [ + { + "appearance": "luminosity", + "value": "dark" + } + ] + }, + { + "idiom": "universal", + "scale": "2x", + "width-class": "compact", + "appearances": [ + { + "appearance": "luminosity", + "value": "light" + } + ] + }, + { + "idiom": "universal", + "scale": "2x", + "height-class": "compact" + }, + { + "idiom": "universal", + "scale": "2x", + "height-class": "compact", + "appearances": [ + { + "appearance": "luminosity", + "value": "dark" + } + ] + }, + { + "idiom": "universal", + "scale": "2x", + "height-class": "compact", + "appearances": [ + { + "appearance": "luminosity", + "value": "light" + } + ] + }, + { + "idiom": "universal", + "scale": "2x" + }, + { + "idiom": "universal", + "scale": "2x", + "appearances": [ + { + "appearance": "luminosity", + "value": "dark" + } + ] + }, + { + "idiom": "universal", + "scale": "2x", + "appearances": [ + { + "appearance": "luminosity", + "value": "light" + } + ] + }, + { + "idiom": "universal", + "scale": "3x", + "width-class": "compact", + "height-class": "compact" + }, + { + "idiom": "universal", + "scale": "3x", + "width-class": "compact", + "height-class": "compact", + "appearances": [ + { + "appearance": "luminosity", + "value": "dark" + } + ] + }, + { + "idiom": "universal", + "scale": "3x", + "width-class": "compact", + "height-class": "compact", + "appearances": [ + { + "appearance": "luminosity", + "value": "light" + } + ] + }, + { + "idiom": "universal", + "scale": "3x", + "width-class": "compact" + }, + { + "idiom": "universal", + "scale": "3x", + "width-class": "compact", + "appearances": [ + { + "appearance": "luminosity", + "value": "dark" + } + ] + }, + { + "idiom": "universal", + "scale": "3x", + "width-class": "compact", + "appearances": [ + { + "appearance": "luminosity", + "value": "light" + } + ] + }, + { + "idiom": "universal", + "scale": "3x", + "height-class": "compact" + }, + { + "idiom": "universal", + "scale": "3x", + "height-class": "compact", + "appearances": [ + { + "appearance": "luminosity", + "value": "dark" + } + ] + }, + { + "idiom": "universal", + "scale": "3x", + "height-class": "compact", + "appearances": [ + { + "appearance": "luminosity", + "value": "light" + } + ] + }, + { + "idiom": "universal", + "scale": "3x" + }, + { + "idiom": "universal", + "scale": "3x", + "appearances": [ + { + "appearance": "luminosity", + "value": "dark" + } + ] + }, + { + "idiom": "universal", + "scale": "3x", + "appearances": [ + { + "appearance": "luminosity", + "value": "light" + } + ] + }, + { + "idiom": "ipad", + "scale": "1x", + "width-class": "compact", + "height-class": "compact" + }, + { + "idiom": "ipad", + "scale": "1x", + "width-class": "compact", + "height-class": "compact", + "appearances": [ + { + "appearance": "luminosity", + "value": "dark" + } + ] + }, + { + "idiom": "ipad", + "scale": "1x", + "width-class": "compact", + "height-class": "compact", + "appearances": [ + { + "appearance": "luminosity", + "value": "light" + } + ] + }, + { + "idiom": "ipad", + "scale": "1x", + "width-class": "compact" + }, + { + "idiom": "ipad", + "scale": "1x", + "width-class": "compact", + "appearances": [ + { + "appearance": "luminosity", + "value": "dark" + } + ] + }, + { + "idiom": "ipad", + "scale": "1x", + "width-class": "compact", + "appearances": [ + { + "appearance": "luminosity", + "value": "light" + } + ] + }, + { + "idiom": "ipad", + "scale": "1x", + "height-class": "compact" + }, + { + "idiom": "ipad", + "scale": "1x", + "height-class": "compact", + "appearances": [ + { + "appearance": "luminosity", + "value": "dark" + } + ] + }, + { + "idiom": "ipad", + "scale": "1x", + "height-class": "compact", + "appearances": [ + { + "appearance": "luminosity", + "value": "light" + } + ] + }, + { + "idiom": "ipad", + "scale": "1x" + }, + { + "idiom": "ipad", + "scale": "1x", + "appearances": [ + { + "appearance": "luminosity", + "value": "dark" + } + ] + }, + { + "idiom": "ipad", + "scale": "1x", + "appearances": [ + { + "appearance": "luminosity", + "value": "light" + } + ] + }, + { + "idiom": "ipad", + "scale": "2x", + "width-class": "compact", + "height-class": "compact" + }, + { + "idiom": "ipad", + "scale": "2x", + "width-class": "compact", + "height-class": "compact", + "appearances": [ + { + "appearance": "luminosity", + "value": "dark" + } + ] + }, + { + "idiom": "ipad", + "scale": "2x", + "width-class": "compact", + "height-class": "compact", + "appearances": [ + { + "appearance": "luminosity", + "value": "light" + } + ] + }, + { + "idiom": "ipad", + "scale": "2x", + "width-class": "compact" + }, + { + "idiom": "ipad", + "scale": "2x", + "width-class": "compact", + "appearances": [ + { + "appearance": "luminosity", + "value": "dark" + } + ] + }, + { + "idiom": "ipad", + "scale": "2x", + "width-class": "compact", + "appearances": [ + { + "appearance": "luminosity", + "value": "light" + } + ] + }, + { + "idiom": "ipad", + "scale": "2x", + "height-class": "compact" + }, + { + "idiom": "ipad", + "scale": "2x", + "height-class": "compact", + "appearances": [ + { + "appearance": "luminosity", + "value": "dark" + } + ] + }, + { + "idiom": "ipad", + "scale": "2x", + "height-class": "compact", + "appearances": [ + { + "appearance": "luminosity", + "value": "light" + } + ] + }, + { + "idiom": "ipad", + "scale": "2x" + }, + { + "idiom": "ipad", + "scale": "2x", + "appearances": [ + { + "appearance": "luminosity", + "value": "dark" + } + ] + }, + { + "idiom": "ipad", + "scale": "2x", + "appearances": [ + { + "appearance": "luminosity", + "value": "light" + } + ] + }, + { + "idiom": "iphone", + "scale": "1x", + "width-class": "compact", + "height-class": "compact" + }, + { + "idiom": "iphone", + "scale": "1x", + "width-class": "compact", + "height-class": "compact", + "appearances": [ + { + "appearance": "luminosity", + "value": "dark" + } + ] + }, + { + "idiom": "iphone", + "scale": "1x", + "width-class": "compact", + "height-class": "compact", + "appearances": [ + { + "appearance": "luminosity", + "value": "light" + } + ] + }, + { + "idiom": "iphone", + "scale": "1x", + "width-class": "compact" + }, + { + "idiom": "iphone", + "scale": "1x", + "width-class": "compact", + "appearances": [ + { + "appearance": "luminosity", + "value": "dark" + } + ] + }, + { + "idiom": "iphone", + "scale": "1x", + "width-class": "compact", + "appearances": [ + { + "appearance": "luminosity", + "value": "light" + } + ] + }, + { + "idiom": "iphone", + "scale": "1x", + "height-class": "compact" + }, + { + "idiom": "iphone", + "scale": "1x", + "height-class": "compact", + "appearances": [ + { + "appearance": "luminosity", + "value": "dark" + } + ] + }, + { + "idiom": "iphone", + "scale": "1x", + "height-class": "compact", + "appearances": [ + { + "appearance": "luminosity", + "value": "light" + } + ] + }, + { + "idiom": "iphone", + "scale": "1x" + }, + { + "idiom": "iphone", + "scale": "1x", + "appearances": [ + { + "appearance": "luminosity", + "value": "dark" + } + ] + }, + { + "idiom": "iphone", + "scale": "1x", + "appearances": [ + { + "appearance": "luminosity", + "value": "light" + } + ] + }, + { + "idiom": "iphone", + "scale": "2x", + "width-class": "compact", + "height-class": "compact" + }, + { + "idiom": "iphone", + "scale": "2x", + "width-class": "compact", + "height-class": "compact", + "appearances": [ + { + "appearance": "luminosity", + "value": "dark" + } + ] + }, + { + "idiom": "iphone", + "scale": "2x", + "width-class": "compact", + "height-class": "compact", + "appearances": [ + { + "appearance": "luminosity", + "value": "light" + } + ] + }, + { + "idiom": "iphone", + "scale": "2x", + "width-class": "compact" + }, + { + "idiom": "iphone", + "scale": "2x", + "width-class": "compact", + "appearances": [ + { + "appearance": "luminosity", + "value": "dark" + } + ] + }, + { + "idiom": "iphone", + "scale": "2x", + "width-class": "compact", + "appearances": [ + { + "appearance": "luminosity", + "value": "light" + } + ] + }, + { + "idiom": "iphone", + "scale": "2x", + "height-class": "compact" + }, + { + "idiom": "iphone", + "scale": "2x", + "height-class": "compact", + "appearances": [ + { + "appearance": "luminosity", + "value": "dark" + } + ] + }, + { + "idiom": "iphone", + "scale": "2x", + "height-class": "compact", + "appearances": [ + { + "appearance": "luminosity", + "value": "light" + } + ] + }, + { + "idiom": "iphone", + "scale": "2x" + }, + { + "idiom": "iphone", + "scale": "2x", + "appearances": [ + { + "appearance": "luminosity", + "value": "dark" + } + ] + }, + { + "idiom": "iphone", + "scale": "2x", + "appearances": [ + { + "appearance": "luminosity", + "value": "light" + } + ] + }, + { + "idiom": "iphone", + "scale": "3x", + "width-class": "compact", + "height-class": "compact" + }, + { + "idiom": "iphone", + "scale": "3x", + "width-class": "compact", + "height-class": "compact", + "appearances": [ + { + "appearance": "luminosity", + "value": "dark" + } + ] + }, + { + "idiom": "iphone", + "scale": "3x", + "width-class": "compact", + "height-class": "compact", + "appearances": [ + { + "appearance": "luminosity", + "value": "light" + } + ] + }, + { + "idiom": "iphone", + "scale": "3x", + "width-class": "compact" + }, + { + "idiom": "iphone", + "scale": "3x", + "width-class": "compact", + "appearances": [ + { + "appearance": "luminosity", + "value": "dark" + } + ] + }, + { + "idiom": "iphone", + "scale": "3x", + "width-class": "compact", + "appearances": [ + { + "appearance": "luminosity", + "value": "light" + } + ] + }, + { + "idiom": "iphone", + "scale": "3x", + "height-class": "compact" + }, + { + "idiom": "iphone", + "scale": "3x", + "height-class": "compact", + "appearances": [ + { + "appearance": "luminosity", + "value": "dark" + } + ] + }, + { + "idiom": "iphone", + "scale": "3x", + "height-class": "compact", + "appearances": [ + { + "appearance": "luminosity", + "value": "light" + } + ] + }, + { + "idiom": "iphone", + "scale": "3x" + }, + { + "idiom": "iphone", + "scale": "3x", + "appearances": [ + { + "appearance": "luminosity", + "value": "dark" + } + ] + }, + { + "idiom": "iphone", + "scale": "3x", + "appearances": [ + { + "appearance": "luminosity", + "value": "light" + } + ] + } + ], + "info": { + "author": "Xcode", + "version": 1 + } +} \ No newline at end of file diff --git a/Samples/Cordova/ExampleProject/platforms/ios/ExampleProject/ExampleProject-Info.plist b/Samples/Cordova/ExampleProject/platforms/ios/ExampleProject/ExampleProject-Info.plist index dd71dba2..dcf0f904 100644 --- a/Samples/Cordova/ExampleProject/platforms/ios/ExampleProject/ExampleProject-Info.plist +++ b/Samples/Cordova/ExampleProject/platforms/ios/ExampleProject/ExampleProject-Info.plist @@ -51,8 +51,10 @@ CleverTapAccountID - TEST-R78-ZZK-955Z + TEST-R55-999-486Z CleverTapToken - TEST-311-ba2 + TEST-ccc-552 + CleverTapRegion + sk1 diff --git a/Samples/Cordova/ExampleProject/platforms/ios/ExampleProject/Plugins/clevertap-cordova/CleverTapPlugin.h b/Samples/Cordova/ExampleProject/platforms/ios/ExampleProject/Plugins/clevertap-cordova/CleverTapPlugin.h index c59d2d78..2cf1c17f 100644 --- a/Samples/Cordova/ExampleProject/platforms/ios/ExampleProject/Plugins/clevertap-cordova/CleverTapPlugin.h +++ b/Samples/Cordova/ExampleProject/platforms/ios/ExampleProject/Plugins/clevertap-cordova/CleverTapPlugin.h @@ -372,6 +372,16 @@ static NSString * const CTHandleOpenURLNotification = @"CTHandleOpenURLNotificat */ - (void)markReadInboxMessageForId:(CDVInvokedUrlCommand *)command; +/** + This method Mark bulk messages as Read for Given Message Ids + */ +- (void)markReadInboxMessagesForIds:(CDVInvokedUrlCommand *)command; + +/** + Dismisses Appinbox + */ +- (void)dismissInbox:(CDVInvokedUrlCommand *)command; + /** This method Marks Inbox Notification Viewed for Given Message Id */ @@ -448,6 +458,51 @@ static NSString * const CTHandleOpenURLNotification = @"CTHandleOpenURLNotificat */ - (void)getLastFetchTimeStampInMillis: (CDVInvokedUrlCommand *)command; +# pragma mark - Product experiences + +/** + Uploads variables to the server. Requires Development/Debug build/configuration. +*/ +- (void)syncVariables: (CDVInvokedUrlCommand *)command; + +/** +Uploads variables to the server. +@param {boolean} isProduction Provide `true` if variables must be sync in Productuon build/configuration. +*/ +- (void)syncVariablesinProd: (CDVInvokedUrlCommand *)command; + +/** +Forces variables to update from the server. +*/ +- (void)fetchVariables:(CDVInvokedUrlCommand *)command; + +/** +Create variables. +@param {object} variables The JSON Object specifying the varibles to be created. +*/ +- (void)defineVariables: (CDVInvokedUrlCommand *)command; + +/** +Get a variable or a group for the specified name. +@param {string} name - name. +*/ +- (void)getVariable:(CDVInvokedUrlCommand *)command; + +/** +Get all variables via a JSON object. +*/ +- (void)getVariables:(CDVInvokedUrlCommand *)command; + + /** +Adds a callback to be invoked when variables are initialised with server values. Will be called each time new values are fetched. +*/ +- (void)onVariablesChanged:(CDVInvokedUrlCommand *)command; + +/** +Called when the value of the variable changes. +*/ +- (void)onValueChanged:(CDVInvokedUrlCommand *)command; + /** This method fetches String Value for a given key */ @@ -473,5 +528,7 @@ static NSString * const CTHandleOpenURLNotification = @"CTHandleOpenURLNotificat */ - (void)reset; +- (void)setLibrary: (CDVInvokedUrlCommand *)command; + @end diff --git a/Samples/Cordova/ExampleProject/platforms/ios/ExampleProject/Plugins/clevertap-cordova/CleverTapPlugin.m b/Samples/Cordova/ExampleProject/platforms/ios/ExampleProject/Plugins/clevertap-cordova/CleverTapPlugin.m index 7b2b3538..5d56169c 100644 --- a/Samples/Cordova/ExampleProject/platforms/ios/ExampleProject/Plugins/clevertap-cordova/CleverTapPlugin.m +++ b/Samples/Cordova/ExampleProject/platforms/ios/ExampleProject/Plugins/clevertap-cordova/CleverTapPlugin.m @@ -25,13 +25,20 @@ #import "CleverTapPushNotificationDelegate.h" #import "CleverTapInAppNotificationDelegate.h" #import "CleverTap+InAppNotifications.h" +#import "CleverTap+CTVar.h" +#import "CTVar.h" +#import "CTLocalInApp.h" +#import "Clevertap+PushPermission.h" -#import +#if __has_include() +#import +#endif static CleverTap *clevertap; static NSURL *launchDeepLink; static NSDictionary *launchNotification; static NSDateFormatter *dateFormatter; +static NSMutableDictionary *allVariables; @interface CleverTapPlugin () { } @@ -666,7 +673,8 @@ - (void)getEventHistory:(CDVInvokedUrlCommand *)command { - (void)getLocation:(CDVInvokedUrlCommand *)command { - [CleverTap getLocationWithSuccess:^(CLLocationCoordinate2D loc){ +#if __has_include() + [CTLocationManager getLocationWithSuccess:^(CLLocationCoordinate2D loc){ CDVPluginResult *pluginResult = [CDVPluginResult resultWithStatus:CDVCommandStatus_OK messageAsDictionary:@{@"lat":@(loc.latitude), @"lon":@(loc.longitude)}]; [self.commandDelegate sendPluginResult:pluginResult callbackId:command.callbackId]; @@ -674,6 +682,12 @@ - (void)getLocation:(CDVInvokedUrlCommand *)command { CDVPluginResult *pluginResult = [CDVPluginResult resultWithStatus:CDVCommandStatus_ERROR messageAsString:error]; [self.commandDelegate sendPluginResult:pluginResult callbackId:command.callbackId]; }]; +#else + NSString *error = @"Please install the pod CleverTapLocation or intregrate the CleverTapLocation project manually to use the getLocation method. For more details, please refer to the link: https://github.com/CleverTap/clevertap-ios-sdk/blob/location-api/docs/CleverTapLocation.md"; + NSLog(@"%@", error); + CDVPluginResult *pluginResult = [CDVPluginResult resultWithStatus:CDVCommandStatus_ERROR messageAsString:error]; + [self.commandDelegate sendPluginResult:pluginResult callbackId:command.callbackId]; +#endif } - (void)setLocation:(CDVInvokedUrlCommand *)command { @@ -1101,6 +1115,24 @@ - (void)markReadInboxMessageForId:(CDVInvokedUrlCommand *)command { }]; } +/** + Mark Messages as Read in bulk + */ +- (void)markReadInboxMessagesForIds:(CDVInvokedUrlCommand *)command { + + [self.commandDelegate runInBackground:^{ + NSString *messageIds = [command argumentAtIndex:0]; + [clevertap markReadInboxMessagesForIDs: messageIds]; + }]; +} + +/** + Dismisses Appinbox + */ +- (void)dismissInbox:(CDVInvokedUrlCommand *)command { + [clevertap dismissAppInbox]; +} + /** Record Inbox Notification Viewed for MessageID */ @@ -1140,17 +1172,23 @@ - (void)messageButtonTappedWithCustomExtras:(NSDictionary *_Nullable)customExtra } } -- (void)messageDidSelect:(CleverTapInboxMessage *_Nonnull)message{ +- (void)messageDidSelect:(CleverTapInboxMessage *_Nonnull)message atIndex:(int)index withButtonIndex:(int)buttonIndex{ - NSString *jsonString = [self _dictToJson:message.json]; + NSMutableDictionary *jsonObject = [NSMutableDictionary new]; + if ([message json] != nil) { + jsonObject[@"data"] = [NSMutableDictionary dictionaryWithDictionary:[message json]]; + } else { + jsonObject[@"data"] = [NSMutableDictionary new]; + } + jsonObject[@"contentPageIndex"] = @(index); + jsonObject[@"buttonIndex"] = @(buttonIndex); - if (jsonString != nil) { - NSString *js = [NSString stringWithFormat:@"cordova.fireDocumentEvent('onCleverTapInboxItemClick', %@);", jsonString]; + if (jsonObject != nil) { + NSString *js = [NSString stringWithFormat:@"cordova.fireDocumentEvent('onCleverTapInboxItemClick', %@);", jsonObject]; [self.commandDelegate evalJs:js]; } } - #pragma mark - Native Display /** @@ -1348,6 +1386,13 @@ - (void)reset { }]; } +- (void)setLibrary: (CDVInvokedUrlCommand *)command { + NSString *libName = [command argumentAtIndex:0]; + int libVersion = [[command argumentAtIndex:1]intValue]; + [clevertap setLibrary:libName]; + [clevertap setCustomSdkVersion:libName version:libVersion]; +} + #pragma mark Product Config Delegate @@ -1369,6 +1414,262 @@ - (void)ctProductConfigInitialized { [self.commandDelegate evalJs:js]; } +#pragma mark Product Experience + +- (void)syncVariables: (CDVInvokedUrlCommand *)command { + + [self.commandDelegate runInBackground:^{ + [clevertap syncVariables]; + }]; +} + +- (void)syncVariablesinProd: (CDVInvokedUrlCommand *)command { + + [self.commandDelegate runInBackground:^{ + BOOL isProduction = [[command argumentAtIndex:0] boolValue]; + [clevertap syncVariables:isProduction]; + }]; +} + +- (void)fetchVariables:(CDVInvokedUrlCommand *)command { + + [self.commandDelegate runInBackground:^{ + [clevertap fetchVariables:^(BOOL success){ + CDVPluginResult *pluginResult = [CDVPluginResult resultWithStatus:CDVCommandStatus_OK messageAsBool:(BOOL)success]; + [self.commandDelegate sendPluginResult:pluginResult callbackId:command.callbackId]; + }]; + }]; +} + +- (void)defineVariables: (CDVInvokedUrlCommand *)command { + + [self.commandDelegate runInBackground:^{ + NSDictionary *variables = [command argumentAtIndex:0]; + if (!allVariables){ + allVariables = [NSMutableDictionary new]; + } + + if(variables == nil){ + return; + } + [variables enumerateKeysAndObjectsUsingBlock:^(NSString* _Nonnull key, id _Nonnull value, BOOL * _Nonnull stop) { + CTVar *var = [self createVarForName:key andValue:value]; + + if (var) { + allVariables[key] = var; + } + }]; + }]; +} + +- (void)getVariable:(CDVInvokedUrlCommand *)command { + + [self.commandDelegate runInBackground:^{ + NSString *name = [command argumentAtIndex:0]; + CTVar *var = allVariables[name]; + + CDVPluginResult *pluginResult = [CDVPluginResult resultWithStatus:CDVCommandStatus_OK messageAsString:var.value]; + [self.commandDelegate sendPluginResult:pluginResult callbackId:command.callbackId]; + }]; +} + +- (void)getVariables:(CDVInvokedUrlCommand *)command { + + [self.commandDelegate runInBackground:^{ + NSMutableDictionary *varValues = [self getVariableValues]; + + CDVPluginResult *pluginResult = [CDVPluginResult resultWithStatus:CDVCommandStatus_OK messageAsDictionary:varValues]; + [self.commandDelegate sendPluginResult:pluginResult callbackId:command.callbackId]; + }]; +} + +- (void)onVariablesChanged:(CDVInvokedUrlCommand *)command { + + [self.commandDelegate runInBackground:^{ + [clevertap onVariablesChanged:^{ + NSMutableDictionary *varValues = [self getVariableValues]; + CDVPluginResult *pluginResult = [CDVPluginResult resultWithStatus:CDVCommandStatus_OK messageAsDictionary:varValues]; + [self.commandDelegate sendPluginResult:pluginResult callbackId:command.callbackId]; + }]; + }]; +} + +- (void)onValueChanged:(CDVInvokedUrlCommand *)command { + + [self.commandDelegate runInBackground:^{ + NSString *name = [command argumentAtIndex:0]; + CTVar *var = allVariables[name]; + if (var) { + [var onValueChanged:^{ + CDVPluginResult *pluginResult = [CDVPluginResult resultWithStatus:CDVCommandStatus_OK messageAsString:var.value]; + [self.commandDelegate sendPluginResult:pluginResult callbackId:command.callbackId]; + }]; + } + }]; +} + +#pragma mark Push primer + +- (CTLocalInApp*)_localInAppConfigFromReadableMap: (NSDictionary *)json { + CTLocalInApp *inAppBuilder; + CTLocalInAppType inAppType = HALF_INTERSTITIAL; + //Required parameters + NSString *titleText = nil, *messageText = nil, *followDeviceOrientation = nil, *positiveBtnText = nil, *negativeBtnText = nil; + //Additional parameters + NSString *fallbackToSettings = nil, *backgroundColor = nil, *btnBorderColor = nil, *titleTextColor = nil, *messageTextColor = nil, *btnTextColor = nil, *imageUrl = nil, *btnBackgroundColor = nil, *btnBorderRadius = nil; + + if ([json[@"inAppType"] isEqual: @"half-interstitial"]){ + inAppType = HALF_INTERSTITIAL; + } + else { + inAppType = ALERT; + } + if (json[@"titleText"]) { + titleText = [json valueForKey:@"titleText"]; + } + if (json[@"messageText"]) { + messageText = [json valueForKey:@"messageText"]; + } + if (json[@"followDeviceOrientation"]) { + followDeviceOrientation = [json valueForKey:@"followDeviceOrientation"]; + } + if (json[@"positiveBtnText"]) { + positiveBtnText = [json valueForKey:@"positiveBtnText"]; + } + + if (json[@"negativeBtnText"]) { + negativeBtnText = [json valueForKey:@"negativeBtnText"]; + } + + //creates the builder instance with all the required parameters + inAppBuilder = [[CTLocalInApp alloc] initWithInAppType:inAppType + titleText:titleText + messageText:messageText + followDeviceOrientation:followDeviceOrientation + positiveBtnText:positiveBtnText + negativeBtnText:negativeBtnText]; + + //adds optional parameters to the builder instance + if (json[@"fallbackToSettings"]) { + fallbackToSettings = [json valueForKey:@"fallbackToSettings"]; + [inAppBuilder setFallbackToSettings:fallbackToSettings]; + } + if (json[@"backgroundColor"]) { + backgroundColor = [json valueForKey:@"backgroundColor"]; + [inAppBuilder setBackgroundColor:backgroundColor]; + } + if (json[@"btnBorderColor"]) { + btnBorderColor = [json valueForKey:@"btnBorderColor"]; + [inAppBuilder setBtnBorderColor:btnBorderColor]; + } + if (json[@"titleTextColor"]) { + titleTextColor = [json valueForKey:@"titleTextColor"]; + [inAppBuilder setTitleTextColor:titleTextColor]; + } + if (json[@"messageTextColor"]) { + messageTextColor = [json valueForKey:@"messageTextColor"]; + [inAppBuilder setMessageTextColor:messageTextColor]; + } + if (json[@"btnTextColor"]) { + btnTextColor = [json valueForKey:@"btnTextColor"]; + [inAppBuilder setBtnTextColor:btnTextColor]; + } + if (json[@"imageUrl"]) { + imageUrl = [json valueForKey:@"imageUrl"]; + [inAppBuilder setImageUrl:imageUrl]; + } + if (json[@"btnBackgroundColor"]) { + btnBackgroundColor = [json valueForKey:@"btnBackgroundColor"]; + [inAppBuilder setBtnBackgroundColor:btnBackgroundColor]; + } + if (json[@"btnBorderRadius"]) { + btnBorderRadius = [json valueForKey:@"btnBorderRadius"]; + [inAppBuilder setBtnBorderRadius:btnBorderRadius]; + } + return inAppBuilder; +} + +- (void)promptForPushPermission: (CDVInvokedUrlCommand *)command { + + [self.commandDelegate runInBackground:^{ + BOOL showFallbackSettings = [[command argumentAtIndex:0] boolValue]; + [clevertap promptForPushPermission:showFallbackSettings]; + }]; +} + +- (void)promptPushPrimer: (CDVInvokedUrlCommand *)command { + + [self.commandDelegate runInBackground:^{ + NSDictionary *json = [command argumentAtIndex:0]; + if(json == nil){ + return; + } + CTLocalInApp *localInAppBuilder = [self _localInAppConfigFromReadableMap:json]; + [clevertap promptPushPrimer:localInAppBuilder.getLocalInAppSettings]; + }]; +} + +- (void)isPushPermissionGranted:(CDVInvokedUrlCommand *)command { + + [self.commandDelegate runInBackground:^{ + if (@available(iOS 10.0, *)) { + [clevertap getNotificationPermissionStatusWithCompletionHandler:^(UNAuthorizationStatus status) { + BOOL result = (status == UNAuthorizationStatusAuthorized); + NSLog(@"[CleverTap isPushPermissionGranted: %i]", result); + CDVPluginResult *pluginResult = [CDVPluginResult resultWithStatus:CDVCommandStatus_OK messageAsBool:result]; + [self.commandDelegate sendPluginResult:pluginResult callbackId:command.callbackId]; + }]; + } else { + // Fallback on earlier versions + NSLog(@"Push Notification is available from iOS v10.0 or later"); + } + }]; +} + +#pragma mark - CleverTapPushPermissionDelegate + +- (void)onPushPermissionResponse:(BOOL)accepted { + + NSMutableDictionary *json = [NSMutableDictionary new]; + json[@"accepted"] = [NSNumber numberWithBool:accepted]; + + NSString *js = [NSString stringWithFormat:@"cordova.fireDocumentEvent('onCleverTapPushPermissionResponseReceived', %@);", json]; + [self.commandDelegate evalJs:js]; +} + +#pragma mark Helper methods + +- (CTVar *)createVarForName:(NSString *)name andValue:(id)value { + + if ([value isKindOfClass:[NSString class]]) { + return [clevertap defineVar:name withString:value]; + } + if ([value isKindOfClass:[NSDictionary class]]) { + return [clevertap defineVar:name withDictionary:value]; + } + if ([value isKindOfClass:[NSNumber class]]) { + if ([self isBoolNumber:value]) { + return [clevertap defineVar:name withBool:value]; + } + return [clevertap defineVar:name withNumber:value]; + } + return nil; +} + +- (BOOL)isBoolNumber:(NSNumber *)number { + CFTypeID boolID = CFBooleanGetTypeID(); + CFTypeID numID = CFGetTypeID(CFBridgingRetain(number)); + return (numID == boolID); +} + +- (NSMutableDictionary *)getVariableValues { + NSMutableDictionary *varValues = [NSMutableDictionary dictionary]; + [allVariables enumerateKeysAndObjectsUsingBlock:^(id _Nonnull key, CTVar* _Nonnull var, BOOL * _Nonnull stop) { + varValues[key] = var.value; + }]; + return varValues; +} + - (CleverTapInboxStyleConfig*)_dictToInboxStyleConfig: (NSDictionary *)dict { CleverTapInboxStyleConfig *_config = [CleverTapInboxStyleConfig new]; diff --git a/Samples/Cordova/ExampleProject/platforms/ios/ExampleProject/config.xml b/Samples/Cordova/ExampleProject/platforms/ios/ExampleProject/config.xml index d12fee62..b7460537 100644 --- a/Samples/Cordova/ExampleProject/platforms/ios/ExampleProject/config.xml +++ b/Samples/Cordova/ExampleProject/platforms/ios/ExampleProject/config.xml @@ -46,18 +46,12 @@ - - - - - - diff --git a/Samples/Cordova/ExampleProject/platforms/ios/ExampleProject/main.m b/Samples/Cordova/ExampleProject/platforms/ios/ExampleProject/main.m index 67c28c79..a6bff5b6 100644 --- a/Samples/Cordova/ExampleProject/platforms/ios/ExampleProject/main.m +++ b/Samples/Cordova/ExampleProject/platforms/ios/ExampleProject/main.m @@ -16,20 +16,15 @@ Licensed to the Apache Software Foundation (ASF) under one specific language governing permissions and limitations under the License. */ -// -// main.m -// ExampleProject -// -// Created by ___FULLUSERNAME___ on ___DATE___. -// Copyright ___ORGANIZATIONNAME___ ___YEAR___. All rights reserved. -// #import +#import "AppDelegate.h" -int main(int argc, char* argv[]) -{ +int main(int argc, char *argv[]) { + NSString *appDelegateClassName; @autoreleasepool { - int retVal = UIApplicationMain(argc, argv, nil, @"AppDelegate"); - return retVal; + // Setup code that might create autoreleased objects goes here. + appDelegateClassName = NSStringFromClass([AppDelegate class]); } + return UIApplicationMain(argc, argv, nil, appDelegateClassName); } diff --git a/Samples/Cordova/ExampleProject/platforms/ios/Podfile b/Samples/Cordova/ExampleProject/platforms/ios/Podfile index 46206fc7..9f6e943a 100644 --- a/Samples/Cordova/ExampleProject/platforms/ios/Podfile +++ b/Samples/Cordova/ExampleProject/platforms/ios/Podfile @@ -1,8 +1,9 @@ # DO NOT MODIFY -- auto-generated by Apache Cordova - +source 'https://github.com/CleverTap/clevertap-ios-sdk.git' +source 'https://github.com/CocoaPods/Specs.git' platform :ios, '11.0' target 'ExampleProject' do project 'ExampleProject.xcodeproj' - pod 'CleverTap-iOS-SDK', '4.2.0' + pod 'CleverTap-iOS-SDK', '5.1.2' end diff --git a/Samples/Cordova/ExampleProject/platforms/ios/Podfile.lock b/Samples/Cordova/ExampleProject/platforms/ios/Podfile.lock index b144a082..fc60a0a1 100644 --- a/Samples/Cordova/ExampleProject/platforms/ios/Podfile.lock +++ b/Samples/Cordova/ExampleProject/platforms/ios/Podfile.lock @@ -1,22 +1,22 @@ PODS: - - CleverTap-iOS-SDK (4.2.0): + - CleverTap-iOS-SDK (5.1.2): - SDWebImage (~> 5.11) - - SDWebImage (5.15.0): - - SDWebImage/Core (= 5.15.0) - - SDWebImage/Core (5.15.0) + - SDWebImage (5.17.0): + - SDWebImage/Core (= 5.17.0) + - SDWebImage/Core (5.17.0) DEPENDENCIES: - - CleverTap-iOS-SDK (= 4.2.0) + - CleverTap-iOS-SDK (= 5.1.2) SPEC REPOS: - trunk: + https://github.com/CocoaPods/Specs.git: - CleverTap-iOS-SDK - SDWebImage SPEC CHECKSUMS: - CleverTap-iOS-SDK: 124ee0f4bd90c5ffa213b2da05f81496d7339015 - SDWebImage: 9bec4c5cdd9579e1f57104735ee0c37df274d593 + CleverTap-iOS-SDK: 1731f365b7822458c346fb812bd0f0edbf076856 + SDWebImage: 750adf017a315a280c60fde706ab1e552a3ae4e9 -PODFILE CHECKSUM: 9f7ec524782dc2155236da4b7d8dc2188d607019 +PODFILE CHECKSUM: 838d8d904fc779a1bc0bea04c3377f1d39ea9144 COCOAPODS: 1.11.2 diff --git a/Samples/Cordova/ExampleProject/platforms/ios/Pods/CleverTap-iOS-SDK/CleverTapSDK/CTConstants.h b/Samples/Cordova/ExampleProject/platforms/ios/Pods/CleverTap-iOS-SDK/CleverTapSDK/CTConstants.h index 91f38adc..51a702d3 100644 --- a/Samples/Cordova/ExampleProject/platforms/ios/Pods/CleverTap-iOS-SDK/CleverTapSDK/CTConstants.h +++ b/Samples/Cordova/ExampleProject/platforms/ios/Pods/CleverTap-iOS-SDK/CleverTapSDK/CTConstants.h @@ -2,6 +2,24 @@ extern NSString *const kCTApiDomain; extern NSString *const kCTNotifViewedApiDomain; +extern NSString *const kHANDSHAKE_URL; +extern NSString *CT_KIND_INT; +extern NSString *CT_KIND_FLOAT; +extern NSString *CT_KIND_STRING; +extern NSString *CT_KIND_BOOLEAN; +extern NSString *CT_KIND_DICTIONARY; +extern NSString *CLEVERTAP_DEFAULTS_VARIABLES_KEY; +extern NSString *CLEVERTAP_DEFAULTS_VARS_JSON_KEY; + +extern NSString *CT_PE_DEFINE_VARS_ENDPOINT; +extern NSString *CT_PE_VARS_PAYLOAD_TYPE; +extern NSString *CT_PE_VARS_PAYLOAD_KEY; +extern NSString *CT_PE_VAR_TYPE; +extern NSString *CT_PE_NUMBER_TYPE; +extern NSString *CT_PE_BOOL_TYPE; +extern NSString *CT_PE_DEFAULT_VALUE; + +extern NSString *CLTAP_PROFILE_IDENTITY_KEY; #define CleverTapLogInfo(level, fmt, ...) if(level >= 0) { NSLog((@"%@" fmt), @"[CleverTap]: ", ##__VA_ARGS__); } #define CleverTapLogDebug(level, fmt, ...) if(level > 0) { NSLog((@"%@" fmt), @"[CleverTap]: ", ##__VA_ARGS__); } @@ -10,6 +28,13 @@ extern NSString *const kCTNotifViewedApiDomain; #define CleverTapLogStaticDebug(fmt, ...) if([CTLogger getDebugLevel] > 0) { NSLog((@"%@" fmt), @"[CleverTap]: ", ##__VA_ARGS__); } #define CleverTapLogStaticInternal(fmt, ...) if([CTLogger getDebugLevel] > 1) { NSLog((@"%@" fmt), @"[CleverTap]: ", ##__VA_ARGS__); } + + +#define CT_TRY @try { +#define CT_END_TRY }\ +@catch (NSException *e) {\ +[CTLogger logInternalError:e]; } + #define CLTAP_REQUEST_TIME_OUT_INTERVAL 10 #define CLTAP_ACCOUNT_ID_LABEL @"CleverTapAccountID" #define CLTAP_TOKEN_LABEL @"CleverTapToken" @@ -63,6 +88,7 @@ extern NSString *const kCTNotifViewedApiDomain; #define CLTAP_PRODUCT_CONFIG_JSON_RESPONSE_KEY @"pc_notifs" #define CLTAP_PREFS_INAPP_KEY @"inapp_notifs" #define CLTAP_GEOFENCES_JSON_RESPONSE_KEY @"geofences" +#define CLTAP_PE_VARS_RESPONSE_KEY @"vars" #define CLTAP_DISCARDED_EVENT_JSON_KEY @"d_e" #define CLTAP_INAPP_CLOSE_IV_WIDTH 40 #define CLTAP_NOTIFICATION_ID_TAG @"wzrk_id" @@ -124,4 +150,6 @@ extern NSString *const kCTNotifViewedApiDomain; #define CLTAP_PROFILE_IDENTIFIER_KEYS @[@"Identity", @"Email"] // LEGACY KEYS #define CLTAP_ALL_PROFILE_IDENTIFIER_KEYS @[@"Identity", @"Email", @"Phone"] +#define CLTAP_DEFINE_VARS_URL @"/defineVars" + diff --git a/Samples/Cordova/ExampleProject/platforms/ios/Pods/CleverTap-iOS-SDK/CleverTapSDK/CTConstants.m b/Samples/Cordova/ExampleProject/platforms/ios/Pods/CleverTap-iOS-SDK/CleverTapSDK/CTConstants.m index e01145d7..869d64a8 100644 --- a/Samples/Cordova/ExampleProject/platforms/ios/Pods/CleverTap-iOS-SDK/CleverTapSDK/CTConstants.m +++ b/Samples/Cordova/ExampleProject/platforms/ios/Pods/CleverTap-iOS-SDK/CleverTapSDK/CTConstants.m @@ -2,3 +2,23 @@ NSString *const kCTApiDomain = @"clevertap-prod.com"; NSString *const kCTNotifViewedApiDomain = @"spiky.clevertap-prod.com"; +NSString *const kHANDSHAKE_URL = @"https://clevertap-prod.com/hello"; + +NSString *CT_KIND_INT = @"integer"; +NSString *CT_KIND_FLOAT = @"float"; +NSString *CT_KIND_STRING = @"string"; +NSString *CT_KIND_BOOLEAN = @"bool"; +NSString *CT_KIND_DICTIONARY = @"group"; +NSString *CLEVERTAP_DEFAULTS_VARIABLES_KEY = @"__clevertap_variables"; +NSString *CLEVERTAP_DEFAULTS_VARS_JSON_KEY = @"__clevertap_variables_json"; + +NSString *CT_PE_DEFINE_VARS_ENDPOINT = @"defineVars"; + +NSString *CT_PE_VARS_PAYLOAD_TYPE = @"varsPayload"; +NSString *CT_PE_VARS_PAYLOAD_KEY = @"vars"; +NSString *CT_PE_VAR_TYPE = @"type"; +NSString *CT_PE_NUMBER_TYPE = @"number"; +NSString *CT_PE_BOOL_TYPE = @"boolean"; +NSString *CT_PE_DEFAULT_VALUE = @"defaultValue"; + +NSString *CLTAP_PROFILE_IDENTITY_KEY = @"Identity"; diff --git a/Samples/Cordova/ExampleProject/platforms/ios/Pods/CleverTap-iOS-SDK/CleverTapSDK/CTDeviceInfo.h b/Samples/Cordova/ExampleProject/platforms/ios/Pods/CleverTap-iOS-SDK/CleverTapSDK/CTDeviceInfo.h index cf4d9f6f..ebcfc766 100644 --- a/Samples/Cordova/ExampleProject/platforms/ios/Pods/CleverTap-iOS-SDK/CleverTapSDK/CTDeviceInfo.h +++ b/Samples/Cordova/ExampleProject/platforms/ios/Pods/CleverTap-iOS-SDK/CleverTapSDK/CTDeviceInfo.h @@ -25,15 +25,12 @@ @property (atomic, readwrite) NSString *library; @property (assign, readonly) BOOL wifi; @property (strong, readonly) NSMutableArray* validationErrors; -@property (strong, readonly) NSString *signedCallSDKVersion; - (instancetype)initWithConfig:(CleverTapInstanceConfig *)config andCleverTapID:(NSString *)cleverTapID; - (void)forceUpdateDeviceID:(NSString *)newDeviceID; - (void)forceNewDeviceID; - (void)forceUpdateCustomDeviceID:(NSString *)cleverTapID; - (BOOL)isErrorDeviceID; -- (void)setDirectCallSDKVersion: (NSString *)version; - (void)incrementLocalInAppCount; - (int)getLocalInAppCount; -- (void)setSignedCallSDKVersion: (NSString *)version; @end diff --git a/Samples/Cordova/ExampleProject/platforms/ios/Pods/CleverTap-iOS-SDK/CleverTapSDK/CTDeviceInfo.m b/Samples/Cordova/ExampleProject/platforms/ios/Pods/CleverTap-iOS-SDK/CleverTapSDK/CTDeviceInfo.m index 67205939..988db20a 100644 --- a/Samples/Cordova/ExampleProject/platforms/ios/Pods/CleverTap-iOS-SDK/CleverTapSDK/CTDeviceInfo.m +++ b/Samples/Cordova/ExampleProject/platforms/ios/Pods/CleverTap-iOS-SDK/CleverTapSDK/CTDeviceInfo.m @@ -40,7 +40,6 @@ static NSString *_radio; static NSString *_deviceWidth; static NSString *_deviceHeight; -static NSString *_signedCallSDKVersion; #if !CLEVERTAP_NO_REACHABILITY_SUPPORT SCNetworkReachabilityRef _reachability; @@ -472,14 +471,6 @@ - (NSString *)getCurrentRadioAccessTechnology { } #endif -- (void)setSignedCallSDKVersion: (NSString *)version { - _signedCallSDKVersion = version; -} - -- (NSString *)signedCallSDKVersion { - return _signedCallSDKVersion; -} - - (void)incrementLocalInAppCount { self.localInAppCount = self.localInAppCount + 1; [CTPreferences putInt:self.localInAppCount forKey:kCLTAP_LOCAL_INAPP_COUNT]; diff --git a/Samples/Cordova/ExampleProject/platforms/ios/Pods/CleverTap-iOS-SDK/CleverTapSDK/CTDomainFactory.h b/Samples/Cordova/ExampleProject/platforms/ios/Pods/CleverTap-iOS-SDK/CleverTapSDK/CTDomainFactory.h new file mode 100644 index 00000000..40800956 --- /dev/null +++ b/Samples/Cordova/ExampleProject/platforms/ios/Pods/CleverTap-iOS-SDK/CleverTapSDK/CTDomainFactory.h @@ -0,0 +1,31 @@ +// +// CTDomainFactory.h +// CleverTapSDK +// +// Created by Akash Malhotra on 19/01/23. +// Copyright © 2023 CleverTap. All rights reserved. +// + +#import +#import "CleverTapInstanceConfig.h" +#if CLEVERTAP_SSL_PINNING +#import "CTPinnedNSURLSessionDelegate.h" +#endif + + +@interface CTDomainFactory : NSObject +@property (nonatomic, strong, nullable) NSString *redirectDomain; +@property (nonatomic, strong, nullable) NSString *explictEndpointDomain; +@property (nonatomic, strong, nullable) NSString *redirectNotifViewedDomain; +@property (nonatomic, strong, nullable) NSString *explictNotifViewedEndpointDomain; + +- (instancetype _Nonnull)initWithConfig:(CleverTapInstanceConfig* _Nonnull)config; +- (void)persistRedirectDomain; +- (void)persistRedirectNotifViewedDomain; +- (void)clearRedirectDomain; + +#if CLEVERTAP_SSL_PINNING +- (instancetype _Nonnull)initWithConfig:(CleverTapInstanceConfig* _Nonnull)config pinnedNSURLSessionDelegate: (CTPinnedNSURLSessionDelegate* _Nonnull)pinnedNSURLSessionDelegate sslCertNames:(NSArray* _Nonnull)sslCertNames; +#endif +@end + diff --git a/Samples/Cordova/ExampleProject/platforms/ios/Pods/CleverTap-iOS-SDK/CleverTapSDK/CTDomainFactory.m b/Samples/Cordova/ExampleProject/platforms/ios/Pods/CleverTap-iOS-SDK/CleverTapSDK/CTDomainFactory.m new file mode 100644 index 00000000..64a3615f --- /dev/null +++ b/Samples/Cordova/ExampleProject/platforms/ios/Pods/CleverTap-iOS-SDK/CleverTapSDK/CTDomainFactory.m @@ -0,0 +1,137 @@ +// +// CTDomainFactory.m +// CleverTapSDK +// +// Created by Akash Malhotra on 19/01/23. +// Copyright © 2023 CleverTap. All rights reserved. +// + +#import "CTDomainFactory.h" +#import "CTPreferences.h" +#import "CTConstants.h" +#import "CleverTapInstanceConfigPrivate.h" + + +NSString *const REDIRECT_DOMAIN_KEY = @"CLTAP_REDIRECT_DOMAIN_KEY"; +NSString *const REDIRECT_NOTIF_VIEWED_DOMAIN_KEY = @"CLTAP_REDIRECT_NOTIF_VIEWED_DOMAIN_KEY"; + +@interface CTDomainFactory () +@property (nonatomic, strong) CleverTapInstanceConfig *config; + +#if CLEVERTAP_SSL_PINNING +@property(nonatomic, strong) CTPinnedNSURLSessionDelegate *urlSessionDelegate; +@property (nonatomic, strong) NSArray *sslCertNames; +#endif +@end + +@implementation CTDomainFactory + +- (instancetype _Nonnull)initWithConfig:(CleverTapInstanceConfig* _Nonnull)config { + self = [super init]; + if (self) { + self.config = config; + self.redirectDomain = [self loadRedirectDomain]; + self.redirectNotifViewedDomain = [self loadRedirectNotifViewedDomain]; + } + return self; +} + +#if CLEVERTAP_SSL_PINNING +- (instancetype _Nonnull)initWithConfig:(CleverTapInstanceConfig* _Nonnull)config pinnedNSURLSessionDelegate: (CTPinnedNSURLSessionDelegate* _Nonnull)pinnedNSURLSessionDelegate sslCertNames:(NSArray* _Nonnull)sslCertNames{ + self = [super init]; + if (self) { + self.config = config; + self.urlSessionDelegate = pinnedNSURLSessionDelegate; + self.sslCertNames = sslCertNames; + self.redirectDomain = [self loadRedirectDomain]; + self.redirectNotifViewedDomain = [self loadRedirectNotifViewedDomain]; + } + return self; +} +#endif + +- (void)clearRedirectDomain { + self.redirectDomain = nil; + self.redirectNotifViewedDomain = nil; + [self persistRedirectDomain]; // if nil persist will remove + self.redirectDomain = [self loadRedirectDomain]; // reload explicit domain if we have one else will be nil + self.redirectNotifViewedDomain = [self loadRedirectNotifViewedDomain]; // reload explicit notification viewe domain if we have one else will be nil +} + +- (NSString *)loadRedirectDomain { + NSString *region = self.config.accountRegion; + if (region) { + region = [region stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]].lowercaseString; + if (region.length > 0) { + self.explictEndpointDomain = [NSString stringWithFormat:@"%@.%@", region, kCTApiDomain]; + return self.explictEndpointDomain; + } + } + NSString *proxyDomain = self.config.proxyDomain; + if (proxyDomain) { + proxyDomain = [proxyDomain stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]].lowercaseString; + if (proxyDomain.length > 0) { + self.explictEndpointDomain = proxyDomain; + return self.explictEndpointDomain; + } + } + NSString *domain = nil; + if (self.config.isDefaultInstance) { + domain = [CTPreferences getStringForKey:[CTPreferences storageKeyWithSuffix:REDIRECT_DOMAIN_KEY config: self.config] withResetValue:[CTPreferences getStringForKey:REDIRECT_DOMAIN_KEY withResetValue:nil]]; + } else { + domain = [CTPreferences getStringForKey:[CTPreferences storageKeyWithSuffix:REDIRECT_DOMAIN_KEY config: self.config] withResetValue:nil]; + } + return domain; +} + +- (NSString *)loadRedirectNotifViewedDomain { + NSString *region = self.config.accountRegion; + if (region) { + region = [region stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]].lowercaseString; + if (region.length > 0) { + self.explictNotifViewedEndpointDomain = [NSString stringWithFormat:@"%@-%@", region, kCTNotifViewedApiDomain]; + return self.explictNotifViewedEndpointDomain; + } + } + NSString *spikyProxyDomain = self.config.spikyProxyDomain; + if (spikyProxyDomain) { + spikyProxyDomain = [spikyProxyDomain stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]].lowercaseString; + if (spikyProxyDomain.length > 0) { + self.explictNotifViewedEndpointDomain = spikyProxyDomain; + return self.explictNotifViewedEndpointDomain; + } + } + NSString *domain = nil; + if (self.config.isDefaultInstance) { + domain = [CTPreferences getStringForKey:[CTPreferences storageKeyWithSuffix:REDIRECT_NOTIF_VIEWED_DOMAIN_KEY config: self.config] withResetValue:[CTPreferences getStringForKey:REDIRECT_NOTIF_VIEWED_DOMAIN_KEY withResetValue:nil]]; + } else { + domain = [CTPreferences getStringForKey:[CTPreferences storageKeyWithSuffix:REDIRECT_NOTIF_VIEWED_DOMAIN_KEY config: self.config] withResetValue:nil]; + } + return domain; +} + +- (void)persistRedirectDomain { + if (self.redirectDomain != nil) { + [CTPreferences putString:self.redirectDomain forKey:[CTPreferences storageKeyWithSuffix:REDIRECT_DOMAIN_KEY config: self.config]]; +#if CLEVERTAP_SSL_PINNING + [self.urlSessionDelegate pinSSLCerts:self.sslCertNames forDomains:@[kCTApiDomain, self.redirectDomain]]; +#endif + } else { + [CTPreferences removeObjectForKey:REDIRECT_DOMAIN_KEY]; + [CTPreferences removeObjectForKey:[CTPreferences storageKeyWithSuffix:REDIRECT_DOMAIN_KEY config: self.config]]; + } +} + +- (void)persistRedirectNotifViewedDomain { + if (self.redirectNotifViewedDomain != nil) { + [CTPreferences putString:self.redirectNotifViewedDomain forKey:[CTPreferences storageKeyWithSuffix:REDIRECT_NOTIF_VIEWED_DOMAIN_KEY config: self.config]]; +#if CLEVERTAP_SSL_PINNING + [self.urlSessionDelegate pinSSLCerts:self.sslCertNames forDomains:@[kCTNotifViewedApiDomain, self.redirectNotifViewedDomain]]; +#endif + } else { + [CTPreferences removeObjectForKey:REDIRECT_NOTIF_VIEWED_DOMAIN_KEY]; + [CTPreferences removeObjectForKey:[CTPreferences storageKeyWithSuffix:REDIRECT_NOTIF_VIEWED_DOMAIN_KEY config: self.config]]; + } +} + +@end diff --git a/Samples/Cordova/ExampleProject/platforms/ios/Pods/CleverTap-iOS-SDK/CleverTapSDK/CTLocalDataStore.m b/Samples/Cordova/ExampleProject/platforms/ios/Pods/CleverTap-iOS-SDK/CleverTapSDK/CTLocalDataStore.m index 135ef93a..69b73fce 100644 --- a/Samples/Cordova/ExampleProject/platforms/ios/Pods/CleverTap-iOS-SDK/CleverTapSDK/CTLocalDataStore.m +++ b/Samples/Cordova/ExampleProject/platforms/ios/Pods/CleverTap-iOS-SDK/CleverTapSDK/CTLocalDataStore.m @@ -409,6 +409,9 @@ - (NSDictionary*)syncWithRemoteData:(NSDictionary *)responseData { return nil; } } + else { + return nil; + } } @catch (NSException *e) { CleverTapLogInternal(self.config.logLevel, @"%@: Failed to process data sync from upstream: %@", self, e.debugDescription); return nil; @@ -574,7 +577,7 @@ - (void)_removeProfileValueForKey:(NSString *)key fromUpstream:(BOOL)fromUpstrea @try { @synchronized (localProfileForSession) { // DO NOT REMOVE IDENTITY - if ([key isEqualToString:@"Identity"]) { + if ([key isEqualToString:CLTAP_PROFILE_IDENTITY_KEY]) { return; } diff --git a/Samples/Cordova/ExampleProject/platforms/ios/Pods/CleverTap-iOS-SDK/CleverTapSDK/CTLocationManager.h b/Samples/Cordova/ExampleProject/platforms/ios/Pods/CleverTap-iOS-SDK/CleverTapSDK/CTLocationManager.h deleted file mode 100644 index 4c9b1cc5..00000000 --- a/Samples/Cordova/ExampleProject/platforms/ios/Pods/CleverTap-iOS-SDK/CleverTapSDK/CTLocationManager.h +++ /dev/null @@ -1,10 +0,0 @@ -#import -#import - -@interface CTLocationManager : NSObject - -#if defined(CLEVERTAP_LOCATION) -+ (void)getLocationWithSuccess:(void (^)(CLLocationCoordinate2D location))success andError:(void (^)(NSString *reason))error; -#endif - -@end diff --git a/Samples/Cordova/ExampleProject/platforms/ios/Pods/CleverTap-iOS-SDK/CleverTapSDK/CTLocationManager.m b/Samples/Cordova/ExampleProject/platforms/ios/Pods/CleverTap-iOS-SDK/CleverTapSDK/CTLocationManager.m deleted file mode 100644 index 5f89a2a3..00000000 --- a/Samples/Cordova/ExampleProject/platforms/ios/Pods/CleverTap-iOS-SDK/CleverTapSDK/CTLocationManager.m +++ /dev/null @@ -1,206 +0,0 @@ -#import "CTLocationManager.h" - -#define DEFAULT_LOCATION_ACCURACY kCLLocationAccuracyHundredMeters - -typedef void (^CleverTapLocationSuccessBlock)(CLLocationCoordinate2D); -typedef void (^CleverTapLocationErrorBlock)(NSString *); - -@interface CleverTapLocationRequest : NSObject -@property (nonatomic, copy) CleverTapLocationSuccessBlock successBlock; -@property (nonatomic, copy) CleverTapLocationErrorBlock errorBlock; -@end - -@implementation CleverTapLocationRequest -@end - -#if defined(CLEVERTAP_LOCATION) -NSString *const kLocationTimeoutError = @"Location Request Timed Out: Have You Set NSLocationWhenInUseUsageDescription in Your Info.plist?"; -NSString *const kLocationServicesNotEnabled = @"Location Services Not Enabled"; -NSString *const kLocationPermissionDenied = @"Location Permission Denied"; -NSString *const kLocationNetworkError = @"Unable To Get Location: Network Failure"; -NSString *const kLocationUnavailable = @"Unable To Get Location"; -static const double kLocationTimeout = 30.0; - -static CLLocationManager *locationManager; - -static NSMutableArray *pendingRequests; - -static NSObject *requestsLockObject; -#endif - -@implementation CTLocationManager - -#if defined(CLEVERTAP_LOCATION) -/** - NOTE: If NSLocationWhenInUseUsageDescription is not set in the app's Info.plist, calls to the CLLocationManager instance will fail silently. Rely on the location timeout to stop updating and return an error in this case. - */ - -+ (void)getLocationWithSuccess:(void (^)(CLLocationCoordinate2D location))success andError:(void (^)(NSString *reason))error { - if (![CLLocationManager locationServicesEnabled]) { - if (error) { - error(kLocationServicesNotEnabled); - }; - return; - } - - CLAuthorizationStatus status = [CLLocationManager authorizationStatus]; - - if (status == kCLAuthorizationStatusDenied || status == kCLAuthorizationStatusRestricted) { - if (error) { - error(kLocationPermissionDenied); - } - return; - } - - if (!locationManager) { - locationManager = [CLLocationManager new]; - locationManager.desiredAccuracy = DEFAULT_LOCATION_ACCURACY; - } - - // request the user location permission (iOS8+) - if (status == kCLAuthorizationStatusNotDetermined) { - if ([locationManager respondsToSelector:@selector(requestWhenInUseAuthorization)]) { - [locationManager requestWhenInUseAuthorization]; - } - } - - if (!requestsLockObject) { - requestsLockObject = [NSObject new]; - } - - // keep an array of requests made while we are waiting for the location manager - if (!pendingRequests) { - pendingRequests = [NSMutableArray new]; - } - - // construct and add a new request - CleverTapLocationRequest *request = [CleverTapLocationRequest new]; - request.successBlock = success; - request.errorBlock = error; - - @synchronized (requestsLockObject) { - [pendingRequests addObject:request]; - } - - locationManager.delegate = (id)self; - if (locationManager && [locationManager respondsToSelector:@selector(startUpdatingLocation)]) { - [locationManager performSelector:@selector(startUpdatingLocation)]; - [self scheduleLocationTimeout]; - } else if(locationManager && [locationManager respondsToSelector:@selector(requestLocation)]) { - [locationManager performSelector:@selector(requestLocation)]; - } -} - - -#pragma mark - CLLocationManagerDelegate - -+ (void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations { - - CLLocation *newLocation = [locations lastObject]; - - // test the age of the location measurement to determine if the measurement is cached - // don't rely on cached measurements - - NSTimeInterval locationAge = -[newLocation.timestamp timeIntervalSinceNow]; - if (locationAge > 5.0) { - return; - } - - // test that the horizontal accuracy does not indicate an invalid measurement - if (newLocation.horizontalAccuracy < 0) { - return; - } - - if (newLocation.horizontalAccuracy <= locationManager.desiredAccuracy) { - if (CLLocationCoordinate2DIsValid(newLocation.coordinate)) { - [self handleSuccess:newLocation.coordinate]; - } - } - - // otherwise no-op; rely on the location timeout to stop updating -} - -+ (void)locationManager:(CLLocationManager *)manager didFailWithError:(NSError *)error { - - NSString *reason; - - switch (error.code) { - case kCLErrorDenied: - reason = kLocationPermissionDenied; - break; - case kCLErrorNetwork: - reason = kLocationNetworkError; - break; - case kCLErrorLocationUnknown: //deliberate fall through here - default: - reason = kLocationUnavailable; - break; - } - [self handleError:reason]; -} - -+ (void)locationManager:(CLLocationManager *)manager didChangeAuthorizationStatus:(CLAuthorizationStatus)status { - if (status == kCLAuthorizationStatusDenied || status == kCLAuthorizationStatusRestricted) { - [self handleLocationPermissionDenied]; - } -} - - -#pragma mark - Helpers - -+ (void)scheduleLocationTimeout { - [self cancelLocationTimeout]; - [self performSelector:@selector(handleLocationTimeout) - withObject:nil - afterDelay:kLocationTimeout]; -} - - -+ (void)cancelLocationTimeout { - [NSObject cancelPreviousPerformRequestsWithTarget:self - selector:@selector(handleLocationTimeout) object:nil]; -} - -+ (void)handleLocationTimeout { - [self stopUpdatingLocation]; - [self handleError:kLocationTimeoutError]; -} - -+ (void)handleSuccess:(CLLocationCoordinate2D)location { - [self stopUpdatingLocation]; - - @synchronized (requestsLockObject) { - for (CleverTapLocationRequest *request in pendingRequests) { - if (request.successBlock) { - request.successBlock(location); - } - } - [pendingRequests removeAllObjects]; - } -} - -+ (void)handleError:(NSString *)error { - @synchronized (requestsLockObject) { - for (CleverTapLocationRequest *request in pendingRequests) { - if (request.errorBlock) { - request.errorBlock(error); - } - } - [pendingRequests removeAllObjects]; - } -} - -+ (void)handleLocationPermissionDenied { - [self stopUpdatingLocation]; - [self handleError:kLocationPermissionDenied]; - locationManager = nil; -} - -+ (void)stopUpdatingLocation { - [locationManager stopUpdatingLocation]; - locationManager.delegate = nil; - [self cancelLocationTimeout]; -} -#endif - -@end diff --git a/Samples/Cordova/ExampleProject/platforms/ios/Pods/CleverTap-iOS-SDK/CleverTapSDK/CTLogger.h b/Samples/Cordova/ExampleProject/platforms/ios/Pods/CleverTap-iOS-SDK/CleverTapSDK/CTLogger.h index 5cc2b120..b8a8160b 100644 --- a/Samples/Cordova/ExampleProject/platforms/ios/Pods/CleverTap-iOS-SDK/CleverTapSDK/CTLogger.h +++ b/Samples/Cordova/ExampleProject/platforms/ios/Pods/CleverTap-iOS-SDK/CleverTapSDK/CTLogger.h @@ -4,5 +4,5 @@ + (void)setDebugLevel:(int)level; + (int)getDebugLevel; - ++ (void)logInternalError:(NSException *)e; @end diff --git a/Samples/Cordova/ExampleProject/platforms/ios/Pods/CleverTap-iOS-SDK/CleverTapSDK/CTLogger.m b/Samples/Cordova/ExampleProject/platforms/ios/Pods/CleverTap-iOS-SDK/CleverTapSDK/CTLogger.m index 29ee6547..74f8a713 100644 --- a/Samples/Cordova/ExampleProject/platforms/ios/Pods/CleverTap-iOS-SDK/CleverTapSDK/CTLogger.m +++ b/Samples/Cordova/ExampleProject/platforms/ios/Pods/CleverTap-iOS-SDK/CleverTapSDK/CTLogger.m @@ -1,4 +1,5 @@ #import "CTLogger.h" +#import "CTConstants.h" @implementation CTLogger @@ -12,4 +13,8 @@ + (int)getDebugLevel { return _debugLevel; } ++ (void)logInternalError:(NSException *)e { + CleverTapLogDebug(_debugLevel, @"%@: Caught exception in code: %@\n%@", self, e, [e callStackSymbols]); +} + @end diff --git a/Samples/Cordova/ExampleProject/platforms/ios/Pods/CleverTap-iOS-SDK/CleverTapSDK/CTPlistInfo.h b/Samples/Cordova/ExampleProject/platforms/ios/Pods/CleverTap-iOS-SDK/CleverTapSDK/CTPlistInfo.h index ac649af8..2b0691be 100644 --- a/Samples/Cordova/ExampleProject/platforms/ios/Pods/CleverTap-iOS-SDK/CleverTapSDK/CTPlistInfo.h +++ b/Samples/Cordova/ExampleProject/platforms/ios/Pods/CleverTap-iOS-SDK/CleverTapSDK/CTPlistInfo.h @@ -16,6 +16,6 @@ + (instancetype _Nullable)sharedInstance; - (void)setCredentialsWithAccountID:(NSString * _Nonnull)accountID token:(NSString * _Nonnull)token region:(NSString * _Nullable)region; - (void)setCredentialsWithAccountID:(NSString * _Nonnull)accountID token:(NSString * _Nonnull)token proxyDomain:(NSString * _Nonnull)proxyDomain; -- (void)setCredentialsWithAccountID:(NSString * _Nonnull)accountID token:(NSString * _Nonnull)token proxyDomain:(NSString * _Nonnull)proxyDomain spikyProxyDomain:(NSString * _Nonnull)spikyProxyDomain; +- (void)setCredentialsWithAccountID:(NSString * _Nonnull)accountID token:(NSString * _Nonnull)token proxyDomain:(NSString * _Nonnull)proxyDomain spikyProxyDomain:(NSString * _Nullable)spikyProxyDomain; @end diff --git a/Samples/Cordova/ExampleProject/platforms/ios/Pods/CleverTap-iOS-SDK/CleverTapSDK/CTPlistInfo.m b/Samples/Cordova/ExampleProject/platforms/ios/Pods/CleverTap-iOS-SDK/CleverTapSDK/CTPlistInfo.m index f03620fe..3564d03a 100644 --- a/Samples/Cordova/ExampleProject/platforms/ios/Pods/CleverTap-iOS-SDK/CleverTapSDK/CTPlistInfo.m +++ b/Samples/Cordova/ExampleProject/platforms/ios/Pods/CleverTap-iOS-SDK/CleverTapSDK/CTPlistInfo.m @@ -106,7 +106,7 @@ - (void)setCredentialsWithAccountID:(NSString *)accountID token:(NSString *)toke _proxyDomain = proxyDomain; } -- (void)setCredentialsWithAccountID:(NSString *)accountID token:(NSString *)token proxyDomain:(NSString *)proxyDomain spikyProxyDomain:(NSString *)spikyProxyDomain { +- (void)setCredentialsWithAccountID:(NSString * _Nonnull)accountID token:(NSString * _Nonnull)token proxyDomain:(NSString * _Nonnull)proxyDomain spikyProxyDomain:(NSString * _Nullable)spikyProxyDomain { _accountId = accountID; _accountToken = token; _proxyDomain = proxyDomain; diff --git a/Samples/Cordova/ExampleProject/platforms/ios/Pods/CleverTap-iOS-SDK/CleverTapSDK/CTPreferences.h b/Samples/Cordova/ExampleProject/platforms/ios/Pods/CleverTap-iOS-SDK/CleverTapSDK/CTPreferences.h index 308f26b1..2e49042b 100644 --- a/Samples/Cordova/ExampleProject/platforms/ios/Pods/CleverTap-iOS-SDK/CleverTapSDK/CTPreferences.h +++ b/Samples/Cordova/ExampleProject/platforms/ios/Pods/CleverTap-iOS-SDK/CleverTapSDK/CTPreferences.h @@ -7,7 +7,7 @@ + (void)putInt:(long)resetValue forKey:(NSString *_Nonnull)key; -+ (NSString *_Nonnull)getStringForKey:(NSString *_Nonnull)key withResetValue:(NSString *_Nullable)resetValue; ++ (NSString *_Nullable)getStringForKey:(NSString *_Nonnull)key withResetValue:(NSString *_Nullable)resetValue; + (void)putString:(NSString *_Nonnull)resetValue forKey:(NSString *_Nonnull)key; @@ -17,12 +17,14 @@ + (void)removeObjectForKey:(NSString *_Nonnull)key; -+ (id _Nonnull)unarchiveFromFile:(NSString *_Nonnull)filename ofType:(Class _Nonnull)cls removeFile:(BOOL)remove; ++ (id _Nullable)unarchiveFromFile:(NSString *_Nonnull)filename ofType:(Class _Nonnull)cls removeFile:(BOOL)remove; -+ (id _Nonnull)unarchiveFromFile:(NSString *_Nonnull)filename ofTypes:(nonnull NSSet *)classes removeFile:(BOOL)remove; ++ (id _Nullable)unarchiveFromFile:(NSString *_Nonnull)filename ofTypes:(nonnull NSSet *)classes removeFile:(BOOL)remove; + (BOOL)archiveObject:(id _Nonnull)object forFileName:(NSString *_Nonnull)fileName; -+ (NSString *)storageKeyWithSuffix: (NSString *)suffix config: (CleverTapInstanceConfig*)config; ++ (NSString *_Nonnull)storageKeyWithSuffix: (NSString *_Nonnull)suffix config: (CleverTapInstanceConfig *_Nonnull)config; + ++ (NSString *_Nonnull)filePathfromFileName:(NSString *_Nonnull)filename; @end diff --git a/Samples/Cordova/ExampleProject/platforms/ios/Pods/CleverTap-iOS-SDK/CleverTapSDK/CTPreferences.m b/Samples/Cordova/ExampleProject/platforms/ios/Pods/CleverTap-iOS-SDK/CleverTapSDK/CTPreferences.m index daac0856..1e27d4e5 100644 --- a/Samples/Cordova/ExampleProject/platforms/ios/Pods/CleverTap-iOS-SDK/CleverTapSDK/CTPreferences.m +++ b/Samples/Cordova/ExampleProject/platforms/ios/Pods/CleverTap-iOS-SDK/CleverTapSDK/CTPreferences.m @@ -25,7 +25,7 @@ + (void)putInt:(long)resetValue forKey:(NSString *)key { [defaults synchronize]; } -+ (NSString *)getStringForKey:(NSString *)key withResetValue:(NSString *)resetValue { ++ (NSString *_Nullable)getStringForKey:(NSString *_Nonnull)key withResetValue:(NSString *_Nullable)resetValue { key = [NSString stringWithFormat:@"%@%@", PREF_PREFIX, key]; NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; id value = [defaults objectForKey:key]; @@ -92,7 +92,7 @@ + (void)logUnarchiveError:(NSError *)error filePath:(NSString *)filePath removeF } } -+ (id)unarchiveFromFile:(NSString *)filename ofTypes:(nonnull NSSet *)classes removeFile:(BOOL)remove { ++ (id _Nullable)unarchiveFromFile:(NSString *_Nonnull)filename ofTypes:(nonnull NSSet *)classes removeFile:(BOOL)remove { id data = nil; NSError *error = nil; NSString *filePath = [self filePathfromFileName:filename]; @@ -119,7 +119,7 @@ + (id)unarchiveFromFile:(NSString *)filename ofTypes:(nonnull NSSet *)cla return data; } -+ (id)unarchiveFromFile:(NSString *)filename ofType:(Class)cls removeFile:(BOOL)remove { ++ (id _Nullable)unarchiveFromFile:(NSString *_Nonnull)filename ofType:(Class _Nonnull)cls removeFile:(BOOL)remove{ id data = nil; NSError *error = nil; @@ -161,7 +161,7 @@ + (BOOL)archiveObject:(id)object forFileName:(NSString *)filename { if (@available(iOS 11.0, tvOS 11.0, *)) { NSData *data = [NSKeyedArchiver archivedDataWithRootObject:object requiringSecureCoding:NO error:&archiveError]; - [data writeToFile:filePath options:NSDataWritingAtomic error:&writeError]; + success = [data writeToFile:filePath options:NSDataWritingAtomic error:&writeError]; if (archiveError) { CleverTapLogStaticInternal(@"%@ failed to archive data at %@: %@", self, filePath, archiveError); } @@ -177,7 +177,7 @@ + (BOOL)archiveObject:(id)object forFileName:(NSString *)filename { return success; } -+ (NSString *)storageKeyWithSuffix: (NSString *)suffix config: (CleverTapInstanceConfig*)config { ++ (NSString * _Nonnull)storageKeyWithSuffix: (NSString * _Nonnull)suffix config: (CleverTapInstanceConfig* _Nonnull)config { return [NSString stringWithFormat:@"%@:%@", config.accountId, suffix]; } diff --git a/Samples/Cordova/ExampleProject/platforms/ios/Pods/CleverTap-iOS-SDK/CleverTapSDK/CTRequest.h b/Samples/Cordova/ExampleProject/platforms/ios/Pods/CleverTap-iOS-SDK/CleverTapSDK/CTRequest.h new file mode 100644 index 00000000..b03f0b27 --- /dev/null +++ b/Samples/Cordova/ExampleProject/platforms/ios/Pods/CleverTap-iOS-SDK/CleverTapSDK/CTRequest.h @@ -0,0 +1,27 @@ +// +// CTRequest.h +// CleverTapSDK +// +// Created by Akash Malhotra on 09/01/23. +// Copyright © 2023 CleverTap. All rights reserved. +// + +#import +#import "CleverTapInstanceConfig.h" + +typedef void (^CTNetworkResponseBlock)(NSData * _Nullable data, NSURLResponse *_Nullable response); +typedef void (^CTNetworkResponseErrorBlock)(NSError * _Nullable error); + +@interface CTRequest : NSObject + +- (CTRequest *_Nonnull)initWithHttpMethod:(NSString *_Nonnull)httpMethod config:(CleverTapInstanceConfig *_Nonnull)config params:(id _Nullable)params url:(NSString *_Nonnull)url; + +- (void)onResponse:(CTNetworkResponseBlock _Nonnull)responseBlock; +- (void)onError:(CTNetworkResponseErrorBlock _Nonnull)errorBlock; + +@property (nonatomic, strong, nonnull) NSMutableURLRequest *urlRequest; +@property (nonatomic, strong, nonnull) CTNetworkResponseBlock responseBlock; +@property (nonatomic, strong, nullable) CTNetworkResponseErrorBlock errorBlock; + +@end + diff --git a/Samples/Cordova/ExampleProject/platforms/ios/Pods/CleverTap-iOS-SDK/CleverTapSDK/CTRequest.m b/Samples/Cordova/ExampleProject/platforms/ios/Pods/CleverTap-iOS-SDK/CleverTapSDK/CTRequest.m new file mode 100644 index 00000000..b8734910 --- /dev/null +++ b/Samples/Cordova/ExampleProject/platforms/ios/Pods/CleverTap-iOS-SDK/CleverTapSDK/CTRequest.m @@ -0,0 +1,66 @@ +// +// CTRequest.m +// CleverTapSDK +// +// Created by Akash Malhotra on 09/01/23. +// Copyright © 2023 CleverTap. All rights reserved. +// + +#import "CTRequest.h" +#import "CTConstants.h" +#import "CTUtils.h" + +NSString *const ACCOUNT_ID_HEADER = @"X-CleverTap-Account-Id"; +NSString *const ACCOUNT_TOKEN_HEADER = @"X-CleverTap-Token"; + +@interface CTRequest() + +@property (nonatomic, strong, nullable) id params; +@property (nonatomic, strong) NSString *httpMethod; +@property (nonatomic, strong) CleverTapInstanceConfig *config; +@property (nonatomic, strong) NSString *url; + + +@end + +@implementation CTRequest + +- (CTRequest *_Nonnull)initWithHttpMethod:(NSString *_Nonnull)httpMethod config:(CleverTapInstanceConfig *_Nonnull)config params:(id _Nullable)params url:(NSString *_Nonnull)url { + self = [super init]; + if (self) { + _httpMethod = httpMethod; + _params = params; + _config = config; + _url = url; + _urlRequest = [self createURLRequest]; + } + return self; +} + +- (NSMutableURLRequest *)createURLRequest { + NSMutableURLRequest *request = [[NSMutableURLRequest alloc] initWithURL:[NSURL URLWithString:_url]]; + NSString *accountId = self.config.accountId; + NSString *accountToken = self.config.accountToken; + if (accountId) { + [request setValue:accountId forHTTPHeaderField:ACCOUNT_ID_HEADER]; + } + if (accountToken) { + [request setValue:accountToken forHTTPHeaderField:ACCOUNT_TOKEN_HEADER]; + } + if ([_httpMethod isEqualToString:@"POST"] && _params > 0) { + NSString *jsonBody = [CTUtils jsonObjectToString:_params]; + request.HTTPBody = [jsonBody dataUsingEncoding:NSUTF8StringEncoding]; + request.HTTPMethod = @"POST"; + } + return request; +} + +- (void)onResponse:(CTNetworkResponseBlock _Nonnull)responseBlock { + _responseBlock = responseBlock; +} + +- (void)onError:(CTNetworkResponseErrorBlock _Nonnull)errorBlock { + _errorBlock = errorBlock; +} + +@end diff --git a/Samples/Cordova/ExampleProject/platforms/ios/Pods/CleverTap-iOS-SDK/CleverTapSDK/CTRequestFactory.h b/Samples/Cordova/ExampleProject/platforms/ios/Pods/CleverTap-iOS-SDK/CleverTapSDK/CTRequestFactory.h new file mode 100644 index 00000000..9586ba7b --- /dev/null +++ b/Samples/Cordova/ExampleProject/platforms/ios/Pods/CleverTap-iOS-SDK/CleverTapSDK/CTRequestFactory.h @@ -0,0 +1,20 @@ +// +// CTRequestFactory.h +// CleverTapSDK +// +// Created by Akash Malhotra on 09/01/23. +// Copyright © 2023 CleverTap. All rights reserved. +// + +#import +#import "CTRequest.h" +#import "CleverTapInstanceConfig.h" + +@interface CTRequestFactory : NSObject + ++ (CTRequest *_Nonnull)helloRequestWithConfig:(CleverTapInstanceConfig *_Nonnull)config; ++ (CTRequest *_Nonnull)eventRequestWithConfig:(CleverTapInstanceConfig *_Nonnull)config params:(id _Nullable)params url:(NSString *_Nonnull)url; ++ (CTRequest *_Nonnull)syncVarsRequestWithConfig:(CleverTapInstanceConfig *_Nonnull)config params:(id _Nullable)params url:(NSString *_Nonnull)url; +@end + + diff --git a/Samples/Cordova/ExampleProject/platforms/ios/Pods/CleverTap-iOS-SDK/CleverTapSDK/CTRequestFactory.m b/Samples/Cordova/ExampleProject/platforms/ios/Pods/CleverTap-iOS-SDK/CleverTapSDK/CTRequestFactory.m new file mode 100644 index 00000000..5c2923c5 --- /dev/null +++ b/Samples/Cordova/ExampleProject/platforms/ios/Pods/CleverTap-iOS-SDK/CleverTapSDK/CTRequestFactory.m @@ -0,0 +1,26 @@ +// +// CTRequestFactory.m +// CleverTapSDK +// +// Created by Akash Malhotra on 09/01/23. +// Copyright © 2023 CleverTap. All rights reserved. +// + +#import "CTRequestFactory.h" +#import "CTConstants.h" + +@implementation CTRequestFactory + ++ (CTRequest *_Nonnull)helloRequestWithConfig:(CleverTapInstanceConfig *_Nonnull)config { + return [[CTRequest alloc]initWithHttpMethod:@"GET" config:config params:nil url:kHANDSHAKE_URL]; +} + ++ (CTRequest *_Nonnull)eventRequestWithConfig:(CleverTapInstanceConfig *_Nonnull)config params:(id _Nullable)params url:(NSString *_Nonnull)url { + return [[CTRequest alloc]initWithHttpMethod:@"POST" config:config params: params url:url]; +} + ++ (CTRequest *_Nonnull)syncVarsRequestWithConfig:(CleverTapInstanceConfig *_Nonnull)config params:(id _Nullable)params url:(NSString *_Nonnull)url { + return [[CTRequest alloc]initWithHttpMethod:@"POST" config:config params: params url:url]; +} + +@end diff --git a/Samples/Cordova/ExampleProject/platforms/ios/Pods/CleverTap-iOS-SDK/CleverTapSDK/CTRequestSender.h b/Samples/Cordova/ExampleProject/platforms/ios/Pods/CleverTap-iOS-SDK/CleverTapSDK/CTRequestSender.h new file mode 100644 index 00000000..62c66ee3 --- /dev/null +++ b/Samples/Cordova/ExampleProject/platforms/ios/Pods/CleverTap-iOS-SDK/CleverTapSDK/CTRequestSender.h @@ -0,0 +1,23 @@ +// +// CTRequestSender.h +// CleverTapSDK +// +// Created by Akash Malhotra on 11/01/23. +// Copyright © 2023 CleverTap. All rights reserved. +// + +#import +#import "CTRequest.h" +#if CLEVERTAP_SSL_PINNING +#import "CTPinnedNSURLSessionDelegate.h" +#endif + +@interface CTRequestSender : NSObject +- (instancetype _Nonnull)initWithConfig:(CleverTapInstanceConfig *_Nonnull)config redirectDomain:(NSString* _Nonnull)redirectDomain; +- (void)send:(CTRequest *_Nonnull)ctRequest; + +#if CLEVERTAP_SSL_PINNING +- (instancetype _Nonnull)initWithConfig:(CleverTapInstanceConfig *_Nonnull)config redirectDomain:(NSString* _Nonnull)redirectDomain pinnedNSURLSessionDelegate: (CTPinnedNSURLSessionDelegate* _Nonnull)pinnedNSURLSessionDelegate sslCertNames:(NSArray* _Nonnull)sslCertNames; +#endif +@end + diff --git a/Samples/Cordova/ExampleProject/platforms/ios/Pods/CleverTap-iOS-SDK/CleverTapSDK/CTRequestSender.m b/Samples/Cordova/ExampleProject/platforms/ios/Pods/CleverTap-iOS-SDK/CleverTapSDK/CTRequestSender.m new file mode 100644 index 00000000..352eb9bd --- /dev/null +++ b/Samples/Cordova/ExampleProject/platforms/ios/Pods/CleverTap-iOS-SDK/CleverTapSDK/CTRequestSender.m @@ -0,0 +1,99 @@ +// +// CTRequestSender.m +// CleverTapSDK +// +// Created by Akash Malhotra on 11/01/23. +// Copyright © 2023 CleverTap. All rights reserved. +// + +#import "CTRequestSender.h" +#import "CTConstants.h" + +#if CLEVERTAP_SSL_PINNING +#import "CTPinnedNSURLSessionDelegate.h" +#endif + +@interface CTRequestSender () +@property (nonatomic, strong) CleverTapInstanceConfig *config; +@property (nonatomic, strong) NSURLSession *urlSession; +@property (nonatomic, strong) NSString *redirectDomain; +@property (nonatomic, assign, readonly) BOOL sslPinningEnabled; + +#if CLEVERTAP_SSL_PINNING +@property(nonatomic, strong) CTPinnedNSURLSessionDelegate *urlSessionDelegate; +@property (nonatomic, strong) NSArray *sslCertNames; +#endif +@end + +@implementation CTRequestSender + +- (instancetype _Nonnull)initWithConfig:(CleverTapInstanceConfig *_Nonnull)config redirectDomain:(NSString* _Nonnull)redirectDomain { + + if ((self = [super init])) { + self.config = config; + self.redirectDomain = redirectDomain; + [self setUpUrlSession]; + + } + return self; +} + +#if CLEVERTAP_SSL_PINNING +- (instancetype _Nonnull)initWithConfig:(CleverTapInstanceConfig *_Nonnull)config redirectDomain:(NSString* _Nonnull)redirectDomain pinnedNSURLSessionDelegate: (CTPinnedNSURLSessionDelegate* _Nonnull)pinnedNSURLSessionDelegate sslCertNames:(NSArray* _Nonnull)sslCertNames { + if ((self = [super init])) { + self.config = config; + self.urlSessionDelegate = pinnedNSURLSessionDelegate; + self.sslCertNames = sslCertNames; + self.redirectDomain = redirectDomain; + [self setUpUrlSession]; + + } + return self; +} +#endif + +- (void)setUpUrlSession { + if (!_urlSession) { + NSURLSessionConfiguration *sc = [NSURLSessionConfiguration defaultSessionConfiguration]; + [sc setHTTPAdditionalHeaders:@{ + @"Content-Type" : @"application/json; charset=utf-8" + }]; + + sc.timeoutIntervalForRequest = CLTAP_REQUEST_TIME_OUT_INTERVAL; + sc.timeoutIntervalForResource = CLTAP_REQUEST_TIME_OUT_INTERVAL; + [sc setHTTPShouldSetCookies:NO]; + [sc setRequestCachePolicy:NSURLRequestReloadIgnoringLocalCacheData]; + +#if CLEVERTAP_SSL_PINNING + _sslPinningEnabled = YES; + self.urlSessionDelegate = [[CTPinnedNSURLSessionDelegate alloc] initWithConfig:self.config]; + NSMutableArray *domains = [NSMutableArray arrayWithObjects:kCTApiDomain, nil]; + if (self.redirectDomain && ![self.redirectDomain isEqualToString:kCTApiDomain]) { + [domains addObject:self.redirectDomain]; + } + // WITH SSL PINNING ENABLED AND REGION NOT SPECIFIED BY THE USER, WE WILL DEFAULT TO EU1 AND PIN THE CERT TO EU1 + else if (!self.redirectDomain) { + [domains addObject:[NSString stringWithFormat:@"eu1.%@", kCTApiDomain]]; + } + [self.urlSessionDelegate pinSSLCerts:_sslCertNames forDomains:domains]; + self.urlSession = [NSURLSession sessionWithConfiguration:sc delegate:self.urlSessionDelegate delegateQueue:nil]; +#else + _sslPinningEnabled = NO; + _urlSession = [NSURLSession sessionWithConfiguration:sc]; +#endif + } +} + +- (void)send:(CTRequest *_Nonnull)ctRequest { + NSURLSessionDataTask *task = [_urlSession + dataTaskWithRequest:ctRequest.urlRequest + completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) { + if (error) { + ctRequest.errorBlock(error); + } + ctRequest.responseBlock(data, response); + }]; + [task resume]; +} + +@end diff --git a/Samples/Cordova/ExampleProject/platforms/ios/Pods/CleverTap-iOS-SDK/CleverTapSDK/CTUtils.h b/Samples/Cordova/ExampleProject/platforms/ios/Pods/CleverTap-iOS-SDK/CleverTapSDK/CTUtils.h index 7257855a..126ec336 100644 --- a/Samples/Cordova/ExampleProject/platforms/ios/Pods/CleverTap-iOS-SDK/CleverTapSDK/CTUtils.h +++ b/Samples/Cordova/ExampleProject/platforms/ios/Pods/CleverTap-iOS-SDK/CleverTapSDK/CTUtils.h @@ -1,11 +1,10 @@ #import @interface CTUtils : NSObject - -+ (NSString *)dictionaryToJsonString:(NSDictionary *)dict; + (NSString *)urlEncodeString:(NSString*)s; + (BOOL)doesString:(NSString *)s startWith:(NSString *)prefix; + (NSString *)deviceTokenStringFromData:(NSData *)tokenData; + (double)toTwoPlaces:(double)x; - ++ (BOOL)isNullOrEmpty:(id)obj; ++ (NSString *)jsonObjectToString:(id)object; @end diff --git a/Samples/Cordova/ExampleProject/platforms/ios/Pods/CleverTap-iOS-SDK/CleverTapSDK/CTUtils.m b/Samples/Cordova/ExampleProject/platforms/ios/Pods/CleverTap-iOS-SDK/CleverTapSDK/CTUtils.m index 3ce9ba22..590de0da 100644 --- a/Samples/Cordova/ExampleProject/platforms/ios/Pods/CleverTap-iOS-SDK/CleverTapSDK/CTUtils.m +++ b/Samples/Cordova/ExampleProject/platforms/ios/Pods/CleverTap-iOS-SDK/CleverTapSDK/CTUtils.m @@ -2,34 +2,9 @@ @implementation CTUtils -+ (NSString *)dictionaryToJsonString:(NSDictionary *)dict { - if (dict == nil) return nil; - - NSData *jsonData; - @try { - NSError *error; - NSMutableDictionary *_cleaned = [NSMutableDictionary new]; - - for (NSString *key in dict) { - id value = dict[key]; - if ([value isKindOfClass:[NSDate class]]) { - continue; - } - _cleaned[key] = value; - } - - jsonData = [NSJSONSerialization dataWithJSONObject:_cleaned - options:0 - error:&error]; - - return jsonData != nil ? [[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding] : nil; - - } @catch (NSException *e) { - return nil; - } -} - + (NSString *)urlEncodeString:(NSString*)s { + + if (!s) return nil; NSMutableString *output = [NSMutableString string]; const unsigned char *source = (const unsigned char *) [s UTF8String]; int sourceLen = (int) strlen((const char *) source); @@ -80,4 +55,34 @@ + (double)toTwoPlaces:(double)x { return result; } ++ (BOOL)isNullOrEmpty:(id)obj +{ + // Need to check for NSString to support RubyMotion. + // Ruby String respondsToSelector(count) is true for count: in RubyMotion + return obj == nil + || ([obj respondsToSelector:@selector(length)] && [obj length] == 0) + || ([obj respondsToSelector:@selector(count)] + && ![obj isKindOfClass:[NSString class]] && [obj count] == 0); +} + ++ (NSString *)jsonObjectToString:(id)object { + if ([object isKindOfClass:[NSString class]]) { + return object; + } + @try { + NSError *error; + NSData *jsonData = [NSJSONSerialization dataWithJSONObject:object + options:0 + error:&error]; + if (error) { + return @""; + } + NSString *jsonString = [[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding]; + return jsonString; + } + @catch (NSException *exception) { + return @""; + } +} + @end diff --git a/Samples/Cordova/ExampleProject/platforms/ios/Pods/CleverTap-iOS-SDK/CleverTapSDK/CTValidator.m b/Samples/Cordova/ExampleProject/platforms/ios/Pods/CleverTap-iOS-SDK/CleverTapSDK/CTValidator.m index 79eee78c..314ede39 100644 --- a/Samples/Cordova/ExampleProject/platforms/ios/Pods/CleverTap-iOS-SDK/CleverTapSDK/CTValidator.m +++ b/Samples/Cordova/ExampleProject/platforms/ios/Pods/CleverTap-iOS-SDK/CleverTapSDK/CTValidator.m @@ -229,7 +229,7 @@ + (CTValidationResult *)cleanObjectValue:(NSObject *)o context:(CTValidatorConte */ + (BOOL)isRestrictedEventName:(NSString *)name { NSArray *restrictedNames = @[@"Notification Sent", @"Notification Viewed", @"Notification Clicked", - @"UTM Visited", @"App Launched", @"Stayed", @"App Uninstalled", @"wzrk_d", @"wzrk_fetch", CLTAP_GEOFENCE_ENTERED_EVENT_NAME, CLTAP_GEOFENCE_EXITED_EVENT_NAME]; + @"UTM Visited", @"App Launched", @"Stayed", @"App Uninstalled", @"wzrk_d", @"wzrk_fetch", @"SCCampaignOptOut", CLTAP_GEOFENCE_ENTERED_EVENT_NAME, CLTAP_GEOFENCE_EXITED_EVENT_NAME]; for (NSString *x in restrictedNames) if ([name.lowercaseString isEqualToString:x.lowercaseString]) { // The event name is restricted diff --git a/Samples/Cordova/ExampleProject/platforms/ios/Pods/CleverTap-iOS-SDK/CleverTapSDK/CleverTap+CTVar.h b/Samples/Cordova/ExampleProject/platforms/ios/Pods/CleverTap-iOS-SDK/CleverTapSDK/CleverTap+CTVar.h new file mode 100644 index 00000000..acc9d89f --- /dev/null +++ b/Samples/Cordova/ExampleProject/platforms/ios/Pods/CleverTap-iOS-SDK/CleverTapSDK/CleverTap+CTVar.h @@ -0,0 +1,58 @@ +// +// CleverTap+CTVar.h +// CleverTapSDK +// +// Created by Akash Malhotra on 18/02/23. +// Copyright © 2023 CleverTap. All rights reserved. +// + +#import +#import "CleverTap.h" +@class CTVar; + +NS_ASSUME_NONNULL_BEGIN + +@interface CleverTap (Vars) + +- (CTVar *)defineVar:(NSString *)name +NS_SWIFT_NAME(defineVar(name:)); +- (CTVar *)defineVar:(NSString *)name withInt:(int)defaultValue +NS_SWIFT_NAME(defineVar(name:integer:)); +- (CTVar *)defineVar:(NSString *)name withFloat:(float)defaultValue +NS_SWIFT_NAME(defineVar(name:float:)); +- (CTVar *)defineVar:(NSString *)name withDouble:(double)defaultValue +NS_SWIFT_NAME(defineVar(name:double:)); +- (CTVar *)defineVar:(NSString *)name withCGFloat:(CGFloat)cgFloatValue +NS_SWIFT_NAME(defineVar(name:cgFloat:)); +- (CTVar *)defineVar:(NSString *)name withShort:(short)defaultValue +NS_SWIFT_NAME(defineVar(name:short:)); +- (CTVar *)defineVar:(NSString *)name withBool:(BOOL)defaultValue +NS_SWIFT_NAME(defineVar(name:boolean:)); +- (CTVar *)defineVar:(NSString *)name withString:(nullable NSString *)defaultValue +NS_SWIFT_NAME(defineVar(name:string:)); +- (CTVar *)defineVar:(NSString *)name withNumber:(nullable NSNumber *)defaultValue +NS_SWIFT_NAME(defineVar(name:number:)); +- (CTVar *)defineVar:(NSString *)name withInteger:(NSInteger)defaultValue +NS_SWIFT_NAME(defineVar(name:NSInteger:)); +- (CTVar *)defineVar:(NSString *)name withLong:(long)defaultValue +NS_SWIFT_NAME(defineVar(name:long:)); +- (CTVar *)defineVar:(NSString *)name withLongLong:(long long)defaultValue +NS_SWIFT_NAME(defineVar(name:longLong:)); +- (CTVar *)defineVar:(NSString *)name withUnsignedChar:(unsigned char)defaultValue +NS_SWIFT_NAME(defineVar(name:unsignedChar:)); +- (CTVar *)defineVar:(NSString *)name withUnsignedInt:(unsigned int)defaultValue +NS_SWIFT_NAME(defineVar(name:unsignedInt:)); +- (CTVar *)defineVar:(NSString *)name withUnsignedInteger:(NSUInteger)defaultValue +NS_SWIFT_NAME(defineVar(name:unsignedInteger:)); +- (CTVar *)defineVar:(NSString *)name withUnsignedLong:(unsigned long)defaultValue +NS_SWIFT_NAME(defineVar(name:unsignedLong:)); +- (CTVar *)defineVar:(NSString *)name withUnsignedLongLong:(unsigned long long)defaultValue +NS_SWIFT_NAME(defineVar(name:unsignedLongLong:)); +- (CTVar *)defineVar:(NSString *)name withUnsignedShort:(unsigned short)defaultValue +NS_SWIFT_NAME(defineVar(name:UnsignedShort:)); +- (CTVar *)defineVar:(NSString *)name withDictionary:(nullable NSDictionary *)defaultValue +NS_SWIFT_NAME(defineVar(name:dictionary:)); + +@end + +NS_ASSUME_NONNULL_END diff --git a/Samples/Cordova/ExampleProject/platforms/ios/Pods/CleverTap-iOS-SDK/CleverTapSDK/CleverTap+FeatureFlags.h b/Samples/Cordova/ExampleProject/platforms/ios/Pods/CleverTap-iOS-SDK/CleverTapSDK/CleverTap+FeatureFlags.h index c1b1597d..cf25a192 100644 --- a/Samples/Cordova/ExampleProject/platforms/ios/Pods/CleverTap-iOS-SDK/CleverTapSDK/CleverTap+FeatureFlags.h +++ b/Samples/Cordova/ExampleProject/platforms/ios/Pods/CleverTap-iOS-SDK/CleverTapSDK/CleverTap+FeatureFlags.h @@ -1,19 +1,24 @@ #import #import "CleverTap.h" +__attribute__((deprecated("This protocol has been deprecated and will be removed in the future versions of this SDK."))) @protocol CleverTapFeatureFlagsDelegate @optional -- (void)ctFeatureFlagsUpdated; +- (void)ctFeatureFlagsUpdated +__attribute__((deprecated("This protocol method has been deprecated and will be removed in the future versions of this SDK."))); @end @interface CleverTap (FeatureFlags) -@property (atomic, strong, readonly, nonnull) CleverTapFeatureFlags *featureFlags; +@property (atomic, strong, readonly, nonnull) CleverTapFeatureFlags *featureFlags +__attribute__((deprecated("This property has been deprecated and will be removed in the future versions of this SDK.")));; @end @interface CleverTapFeatureFlags : NSObject -@property (nonatomic, weak) id _Nullable delegate; +@property (nonatomic, weak) id _Nullable delegate +__attribute__((deprecated("This property has been deprecated and will be removed in the future versions of this SDK.")));; -- (BOOL)get:(NSString* _Nonnull)key withDefaultValue:(BOOL)defaultValue; +- (BOOL)get:(NSString* _Nonnull)key withDefaultValue:(BOOL)defaultValue +__attribute__((deprecated("This method has been deprecated and will be removed in the future versions of this SDK.")));; @end diff --git a/Samples/Cordova/ExampleProject/platforms/ios/Pods/CleverTap-iOS-SDK/CleverTapSDK/CleverTap+Inbox.h b/Samples/Cordova/ExampleProject/platforms/ios/Pods/CleverTap-iOS-SDK/CleverTapSDK/CleverTap+Inbox.h index 10da6a14..9674c1e2 100755 --- a/Samples/Cordova/ExampleProject/platforms/ios/Pods/CleverTap-iOS-SDK/CleverTapSDK/CleverTap+Inbox.h +++ b/Samples/Cordova/ExampleProject/platforms/ios/Pods/CleverTap-iOS-SDK/CleverTapSDK/CleverTap+Inbox.h @@ -203,6 +203,15 @@ typedef void (^CleverTapInboxUpdatedBlock)(void); - (void)markReadInboxMessageForID:(NSString * _Nonnull)messageId; +/*! + @method + + @abstract + This method marks the `CleverTapInboxMessage` object as read for given 'Message Ids` as Collection. + */ + +- (void)markReadInboxMessagesForIDs:(NSArray *_Nonnull)messageIds; + /*! @method @@ -242,5 +251,12 @@ typedef void (^CleverTapInboxUpdatedBlock)(void); */ - (void)recordInboxNotificationClickedEventForID:(NSString * _Nonnull)messageId; +/*! + @method + + @abstract + This method dismisses the inbox controller + */ +- (void)dismissAppInbox; @end diff --git a/Samples/Cordova/ExampleProject/platforms/ios/Pods/CleverTap-iOS-SDK/CleverTapSDK/CleverTap+ProductConfig.h b/Samples/Cordova/ExampleProject/platforms/ios/Pods/CleverTap-iOS-SDK/CleverTapSDK/CleverTap+ProductConfig.h index bab09bcc..b60e476b 100644 --- a/Samples/Cordova/ExampleProject/platforms/ios/Pods/CleverTap-iOS-SDK/CleverTapSDK/CleverTap+ProductConfig.h +++ b/Samples/Cordova/ExampleProject/platforms/ios/Pods/CleverTap-iOS-SDK/CleverTapSDK/CleverTap+ProductConfig.h @@ -1,11 +1,15 @@ #import #import "CleverTap.h" +__attribute__((deprecated("This protocol has been deprecated and will be removed in the future versions of this SDK."))) @protocol CleverTapProductConfigDelegate @optional -- (void)ctProductConfigFetched; -- (void)ctProductConfigActivated; -- (void)ctProductConfigInitialized; +- (void)ctProductConfigFetched +__attribute__((deprecated("This protocol method has been deprecated and will be removed in the future versions of this SDK."))); +- (void)ctProductConfigActivated +__attribute__((deprecated("This protocol method has been deprecated and will be removed in the future versions of this SDK."))); +- (void)ctProductConfigInitialized +__attribute__((deprecated("This protocol method has been deprecated and will be removed in the future versions of this SDK."))); @end @interface CleverTap(ProductConfig) @@ -32,7 +36,8 @@ @interface CleverTapProductConfig : NSObject -@property (nonatomic, weak) id _Nullable delegate; +@property (nonatomic, weak) id _Nullable delegate +__attribute__((deprecated("This property has been deprecated and will be removed in the future versions of this SDK."))); /*! @method @@ -41,7 +46,8 @@ Fetches product configs, adhering to the default minimum fetch interval. */ -- (void)fetch; +- (void)fetch +__attribute__((deprecated("This method has been deprecated and will be removed in the future versions of this SDK."))); /*! @method @@ -50,7 +56,8 @@ Fetches product configs, adhering to the specified minimum fetch interval in seconds. */ -- (void)fetchWithMinimumInterval:(NSTimeInterval)minimumInterval; +- (void)fetchWithMinimumInterval:(NSTimeInterval)minimumInterval +__attribute__((deprecated("This method has been deprecated and will be removed in the future versions of this SDK."))); /*! @method @@ -59,7 +66,8 @@ Sets the minimum interval between successive fetch calls. */ -- (void)setMinimumFetchInterval:(NSTimeInterval)minimumFetchInterval; +- (void)setMinimumFetchInterval:(NSTimeInterval)minimumFetchInterval +__attribute__((deprecated("This method has been deprecated and will be removed in the future versions of this SDK."))); /*! @method @@ -68,7 +76,8 @@ Activates Fetched Config data to the Active Config, so that the fetched key value pairs take effect. */ -- (void)activate; +- (void)activate +__attribute__((deprecated("This method has been deprecated and will be removed in the future versions of this SDK."))); /*! @method @@ -77,7 +86,8 @@ Fetches and then activates the fetched product configs. */ -- (void)fetchAndActivate; +- (void)fetchAndActivate +__attribute__((deprecated("This method has been deprecated and will be removed in the future versions of this SDK."))); /*! @method @@ -86,7 +96,8 @@ Sets default configs using the given Dictionary */ -- (void)setDefaults:(NSDictionary *_Nullable)defaults; +- (void)setDefaults:(NSDictionary *_Nullable)defaults +__attribute__((deprecated("This method has been deprecated and will be removed in the future versions of this SDK."))); /*! @method @@ -95,7 +106,8 @@ Sets default configs using the given plist */ -- (void)setDefaultsFromPlistFileName:(NSString *_Nullable)fileName; +- (void)setDefaultsFromPlistFileName:(NSString *_Nullable)fileName +__attribute__((deprecated("This method has been deprecated and will be removed in the future versions of this SDK."))); /*! @method @@ -104,7 +116,8 @@ Returns the config value of the given key */ -- (CleverTapConfigValue *_Nullable)get:(NSString* _Nonnull)key; +- (CleverTapConfigValue *_Nullable)get:(NSString* _Nonnull)key +__attribute__((deprecated("This method has been deprecated and will be removed in the future versions of this SDK."))); /*! @method @@ -113,7 +126,8 @@ Returns the last fetch timestamp */ -- (NSDate *_Nullable)getLastFetchTimeStamp; +- (NSDate *_Nullable)getLastFetchTimeStamp +__attribute__((deprecated("This method has been deprecated and will be removed in the future versions of this SDK."))); /*! @method @@ -122,7 +136,8 @@ Deletes all activated, fetched and defaults configs and resets all Product Config settings. */ -- (void)reset; +- (void)reset +__attribute__((deprecated("This method has been deprecated and will be removed in the future versions of this SDK."))); @end diff --git a/Samples/Cordova/ExampleProject/platforms/ios/Pods/CleverTap-iOS-SDK/CleverTapSDK/CleverTap.h b/Samples/Cordova/ExampleProject/platforms/ios/Pods/CleverTap-iOS-SDK/CleverTapSDK/CleverTap.h index f824a8ed..4f00cab7 100644 --- a/Samples/Cordova/ExampleProject/platforms/ios/Pods/CleverTap-iOS-SDK/CleverTapSDK/CleverTap.h +++ b/Samples/Cordova/ExampleProject/platforms/ios/Pods/CleverTap-iOS-SDK/CleverTapSDK/CleverTap.h @@ -31,6 +31,7 @@ @class CleverTapInstanceConfig; @class CleverTapFeatureFlags; @class CleverTapProductConfig; +#import "CTVar.h" #pragma clang diagnostic push #pragma ide diagnostic ignored "OCUnusedMethodInspection" @@ -354,25 +355,6 @@ typedef NS_ENUM(int, CTSignedCallEvent) { */ extern NSString * _Nonnull const CleverTapGeofencesDidUpdateNotification; - -/*! - @method - - @abstract - Get the device location if available. Calling this will prompt the user location permissions dialog. - - Please be sure to include the NSLocationWhenInUseUsageDescription key in your Info.plist. See https://developer.apple.com/library/ios/documentation/General/Reference/InfoPlistKeyReference/Articles/CocoaKeys.html#//apple_ref/doc/uid/TP40009251-SW26 - - Uses desired accuracy of kCLLocationAccuracyHundredMeters. - - If you need background location updates or finer accuracy please implement your own location handling. Please see https://developer.apple.com/library/ios/documentation/CoreLocation/Reference/CLLocationManager_Class/index.html for more info. - - @discussion - Optional. You can use location to pass it to CleverTap via the setLocation API - for, among other things, more fine-grained geo-targeting and segmentation purposes. To enable, build the SDK with the preprocessor macro CLEVERTAP_LOCATION. - */ -+ (void)getLocationWithSuccess:(void (^ _Nonnull)(CLLocationCoordinate2D location))success andError:(void (^_Nullable)(NSString * _Nullable reason))error; - /*! @method @@ -1216,6 +1198,17 @@ extern NSString * _Nonnull const CleverTapProfileDidInitializeNotification; */ - (void)setLibrary:(NSString * _Nonnull)name; +/*! + @method + + @abstract + Set the Library name and version for Auxiliary SDKs + + @discussion + Call this to method to set library name and version in the Auxiliary SDK + */ +- (void)setCustomSdkVersion:(NSString * _Nonnull)name version:(int)version; + /*! @method @@ -1263,7 +1256,7 @@ extern NSString * _Nonnull const CleverTapProfileDidInitializeNotification; #if defined(CLEVERTAP_HOST_WATCHOS) /** HostWatchOS */ -- (BOOL)handleMessage:(NSDictionary *)message forWatchSession:(WCSession *)session API_AVAILABLE(ios(9.0)); +- (BOOL)handleMessage:(NSDictionary *_Nonnull)message forWatchSession:(WCSession *_Nonnull)session API_AVAILABLE(ios(9.0)); #endif /*! @@ -1276,16 +1269,6 @@ extern NSString * _Nonnull const CleverTapProfileDidInitializeNotification; */ - (void)recordSignedCallEvent:(int)eventRawValue forCallDetails:(NSDictionary *_Nonnull)calldetails; -/*! - @method - - @abstract - Record Signed Call SDK version. - - @param version Signed call SDK version - */ -- (void)setSignedCallVersion:(NSString* _Nullable)version; - /*! @method @@ -1317,6 +1300,85 @@ extern NSString * _Nonnull const CleverTapProfileDidInitializeNotification; */ + (BOOL)isValidCleverTapId:(NSString *_Nullable)cleverTapID; +#pragma mark Product Experiences - Vars + +/*! + @method + + @abstract + Adds a callback to be invoked when variables are initialised with server values. Will be called each time new values are fetched. + + @param block a callback to add. + */ +- (void)onVariablesChanged:(CleverTapVariablesChangedBlock _Nonnull )block; + +/*! + @method + + @abstract + Adds a callback to be invoked only once when variables are initialised with server values. + + @param block a callback to add. + */ +- (void)onceVariablesChanged:(CleverTapVariablesChangedBlock _Nonnull )block; + +/*! + @method + + @abstract + Uploads variables to the server. Requires Development/Debug build/configuration. + */ +- (void)syncVariables; + +/*! + @method + + @abstract + Uploads variables to the server. + + @param isProduction Provide `true` if variables must be sync in Productuon build/configuration. + */ +- (void)syncVariables:(BOOL)isProduction; + +/*! + @method + + @abstract + Forces variables to update from the server. + + @discussion + Forces variables to update from the server. If variables have changed, the appropriate callbacks will fire. Use sparingly as if the app is updated, you'll have to deal with potentially inconsistent state or user experience. + The provided callback has a boolean flag whether the update was successful or not. The callback fires regardless + of whether the variables have changed. + + @param block a callback with a boolean flag whether the update was successful. + */ +- (void)fetchVariables:(CleverTapFetchVariablesBlock _Nullable)block; + +/*! + @method + + @abstract + Get an instance of a variable or a group. + + @param name The name of the variable or the group. + + @return + The instance of the variable or the group, or nil if not created yet. + + */ +- (CTVar * _Nullable)getVariable:(NSString * _Nonnull)name; + +/*! + @method + + @abstract + Get a copy of the current value of a variable or a group. + + @param name The name of the variable or the group. + */ +- (id _Nullable)getVariableValue:(NSString * _Nonnull)name; + @end #pragma clang diagnostic pop diff --git a/Samples/Cordova/ExampleProject/platforms/ios/Pods/CleverTap-iOS-SDK/CleverTapSDK/CleverTap.m b/Samples/Cordova/ExampleProject/platforms/ios/Pods/CleverTap-iOS-SDK/CleverTapSDK/CleverTap.m index 370bb1b6..ef3b5411 100644 --- a/Samples/Cordova/ExampleProject/platforms/ios/Pods/CleverTap-iOS-SDK/CleverTapSDK/CleverTap.m +++ b/Samples/Cordova/ExampleProject/platforms/ios/Pods/CleverTap-iOS-SDK/CleverTapSDK/CleverTap.m @@ -44,10 +44,9 @@ #import "CleverTap+InAppNotifications.h" #import "CTLocalInApp.h" #import "CleverTap+PushPermission.h" +#import "CleverTapJSInterfacePrivate.h" #endif -#import "CTLocationManager.h" - #if !CLEVERTAP_NO_INBOX_SUPPORT #import "CTInboxController.h" #import "CleverTap+Inbox.h" @@ -72,11 +71,22 @@ #import "CleverTapProductConfigPrivate.h" #import "CTProductConfigController.h" +#import "CTVarCache.h" +#import "CTVariables.h" +#import "CleverTap+CTVar.h" + +#import "CTRequestFactory.h" +#import "CTRequestSender.h" +#import "CTDomainFactory.h" #import "CleverTap+SCDomain.h" + +#import "NSDictionary+Extensions.h" + #import static const void *const kQueueKey = &kQueueKey; static const void *const kNotificationQueueKey = &kNotificationQueueKey; +static NSMutableDictionary *auxiliarySdkVersions; static NSRecursiveLock *instanceLock; static const int kMaxBatchSize = 49; @@ -84,8 +94,6 @@ NSString *const kQUEUE_NAME_EVENTS = @"events"; NSString *const kQUEUE_NAME_NOTIFICATIONS = @"notifications"; -NSString *const kHANDSHAKE_URL = @"https://eu1.clevertap-prod.com/hello"; - NSString *const kREDIRECT_DOMAIN_KEY = @"CLTAP_REDIRECT_DOMAIN_KEY"; NSString *const kREDIRECT_NOTIF_VIEWED_DOMAIN_KEY = @"CLTAP_REDIRECT_NOTIF_VIEWED_DOMAIN_KEY"; NSString *const kMUTED_TS_KEY = @"CLTAP_MUTED_TS_KEY"; @@ -94,8 +102,6 @@ NSString *const kREDIRECT_NOTIF_VIEWED_HEADER = @"X-WZRK-SPIKY-RD"; NSString *const kMUTE_HEADER = @"X-WZRK-MUTE"; -NSString *const kACCOUNT_ID_HEADER = @"X-CleverTap-Account-Id"; -NSString *const kACCOUNT_TOKEN_HEADER = @"X-CleverTap-Token"; NSString *const kI_KEY = @"CLTAP_I_KEY"; NSString *const kJ_KEY = @"CLTAP_J_KEY"; @@ -201,10 +207,8 @@ @interface CleverTap () { @property (nonatomic, strong) NSMutableArray *profileQueue; @property (nonatomic, strong) NSMutableArray *notificationsQueue; @property (nonatomic, strong) NSURLSession *urlSession; -@property (nonatomic, strong) NSString *redirectDomain; -@property (nonatomic, strong) NSString *explictEndpointDomain; -@property (nonatomic, strong) NSString *redirectNotifViewedDomain; -@property (nonatomic, strong) NSString *explictNotifViewedEndpointDomain; +@property (nonatomic, strong) CTDomainFactory *domainFactory; +@property (nonatomic, strong) CTRequestSender *requestSender; @property (nonatomic, assign) NSTimeInterval lastMutedTs; @property (nonatomic, assign) int sendQueueFails; @@ -238,7 +242,7 @@ @interface CleverTap () { @property (atomic, weak) id urlDelegate; @property (atomic, weak) id pushNotificationDelegate; @property (atomic, weak) id inAppNotificationDelegate; -@property (atomic, weak) id domainDelegate; +@property (nonatomic, weak) id domainDelegate; #if !CLEVERTAP_NO_INAPP_SUPPORT @property (atomic, weak) id pushPermissionDelegate; #endif @@ -250,6 +254,8 @@ @interface CleverTap () { @property (atomic, assign) BOOL geofenceLocation; @property (nonatomic, strong) NSString *gfSDKVersion; +@property (nonatomic, strong) CTVariables *variables; + - (instancetype)init __unavailable; @end @@ -684,6 +690,9 @@ - (instancetype)initWithConfig:(CleverTapInstanceConfig*)config andCleverTapID:( [self _initProductConfig]; + // Initialise Variables + self.variables = [[CTVariables alloc] initWithConfig:self.config deviceInfo:self.deviceInfo]; + [self notifyUserProfileInitialized]; } @@ -802,42 +811,17 @@ - (void)initNetworking { } else { self.lastMutedTs = [CTPreferences getIntForKey:[CTPreferences storageKeyWithSuffix:kLAST_TS_KEY config: self.config] withResetValue:0]; } - self.redirectDomain = [self loadRedirectDomain]; - self.redirectNotifViewedDomain = [self loadRedirectNotifViewedDomain]; - [self setUpUrlSession]; - [self doHandshakeAsync]; -} -- (void)setUpUrlSession { - if (!self.urlSession) { - NSURLSessionConfiguration *sc = [NSURLSessionConfiguration defaultSessionConfiguration]; - [sc setHTTPAdditionalHeaders:@{ - @"Content-Type" : @"application/json; charset=utf-8" - }]; - - sc.timeoutIntervalForRequest = CLTAP_REQUEST_TIME_OUT_INTERVAL; - sc.timeoutIntervalForResource = CLTAP_REQUEST_TIME_OUT_INTERVAL; - [sc setHTTPShouldSetCookies:NO]; - [sc setRequestCachePolicy:NSURLRequestReloadIgnoringLocalCacheData]; - #if CLEVERTAP_SSL_PINNING - _sslPinningEnabled = YES; - self.urlSessionDelegate = [[CTPinnedNSURLSessionDelegate alloc] initWithConfig:self.config]; - NSMutableArray *domains = [NSMutableArray arrayWithObjects:kCTApiDomain, nil]; - if (self.redirectDomain && ![self.redirectDomain isEqualToString:kCTApiDomain]) { - [domains addObject:self.redirectDomain]; - } - // WITH SSL PINNING ENABLED AND REGION NOT SPECIFIED BY THE USER, WE WILL DEFAULT TO EU1 AND PIN THE CERT TO EU1 - else if (!self.redirectDomain) { - [domains addObject:[NSString stringWithFormat:@"eu1.%@", kCTApiDomain]]; - } - [self.urlSessionDelegate pinSSLCerts:sslCertNames forDomains:domains]; - self.urlSession = [NSURLSession sessionWithConfiguration:sc delegate:self.urlSessionDelegate delegateQueue:nil]; + self.urlSessionDelegate = [[CTPinnedNSURLSessionDelegate alloc] initWithConfig:self.config]; + self.domainFactory = [[CTDomainFactory alloc]initWithConfig:self.config pinnedNSURLSessionDelegate: self.urlSessionDelegate sslCertNames: sslCertNames]; + self.requestSender = [[CTRequestSender alloc]initWithConfig:self.config redirectDomain:self.domainFactory.redirectDomain pinnedNSURLSessionDelegate: self.urlSessionDelegate sslCertNames: sslCertNames]; #else - _sslPinningEnabled = NO; - self.urlSession = [NSURLSession sessionWithConfiguration:sc]; + self.domainFactory = [[CTDomainFactory alloc]initWithConfig:self.config]; + + self.requestSender = [[CTRequestSender alloc]initWithConfig:self.config redirectDomain:self.domainFactory.redirectDomain]; #endif - } + [self doHandshakeAsyncWithCompletion:nil]; } - (void)setUserSetLocation:(CLLocationCoordinate2D)location { @@ -859,116 +843,36 @@ - (CLLocationCoordinate2D)userSetLocation { # pragma mark - Handshake Handling -- (void)clearRedirectDomain { - self.redirectDomain = nil; - self.redirectNotifViewedDomain = nil; - [self persistRedirectDomain]; // if nil persist will remove - self.redirectDomain = [self loadRedirectDomain]; // reload explicit domain if we have one else will be nil - self.redirectNotifViewedDomain = [self loadRedirectNotifViewedDomain]; // reload explicit notification viewe domain if we have one else will be nil -} - -- (NSString *)loadRedirectDomain { - NSString *region = self.config.accountRegion; - if (region) { - region = [region stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]].lowercaseString; - if (region.length > 0) { - self.explictEndpointDomain = [NSString stringWithFormat:@"%@.%@", region, kCTApiDomain]; - return self.explictEndpointDomain; - } - } - NSString *proxyDomain = self.config.proxyDomain; - if (proxyDomain) { - proxyDomain = [proxyDomain stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]].lowercaseString; - if (proxyDomain.length > 0) { - self.explictEndpointDomain = proxyDomain; - return self.explictEndpointDomain; - } - } - NSString *domain = nil; - if (self.config.isDefaultInstance) { - domain = [CTPreferences getStringForKey:[CTPreferences storageKeyWithSuffix:kREDIRECT_DOMAIN_KEY config: self.config] withResetValue:[CTPreferences getStringForKey:kREDIRECT_DOMAIN_KEY withResetValue:nil]]; - } else { - domain = [CTPreferences getStringForKey:[CTPreferences storageKeyWithSuffix:kREDIRECT_DOMAIN_KEY config: self.config] withResetValue:nil]; - } - return domain; -} - -- (NSString *)loadRedirectNotifViewedDomain { - NSString *region = self.config.accountRegion; - if (region) { - region = [region stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]].lowercaseString; - if (region.length > 0) { - self.explictNotifViewedEndpointDomain = [NSString stringWithFormat:@"%@-%@", region, kCTNotifViewedApiDomain]; - return self.explictNotifViewedEndpointDomain; - } - } - NSString *spikyProxyDomain = self.config.spikyProxyDomain; - if (spikyProxyDomain) { - spikyProxyDomain = [spikyProxyDomain stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]].lowercaseString; - if (spikyProxyDomain.length > 0) { - self.explictNotifViewedEndpointDomain = spikyProxyDomain; - return self.explictNotifViewedEndpointDomain; - } - } - NSString *domain = nil; - if (self.config.isDefaultInstance) { - domain = [CTPreferences getStringForKey:[CTPreferences storageKeyWithSuffix:kREDIRECT_NOTIF_VIEWED_DOMAIN_KEY config: self.config] withResetValue:[CTPreferences getStringForKey:kREDIRECT_NOTIF_VIEWED_DOMAIN_KEY withResetValue:nil]]; - } else { - domain = [CTPreferences getStringForKey:[CTPreferences storageKeyWithSuffix:kREDIRECT_NOTIF_VIEWED_DOMAIN_KEY config: self.config] withResetValue:nil]; - } - return domain; -} - -- (void)persistRedirectDomain { - if (self.redirectDomain != nil) { - [CTPreferences putString:self.redirectDomain forKey:[CTPreferences storageKeyWithSuffix:kREDIRECT_DOMAIN_KEY config: self.config]]; -#if CLEVERTAP_SSL_PINNING - [self.urlSessionDelegate pinSSLCerts:sslCertNames forDomains:@[kCTApiDomain, self.redirectDomain]]; -#endif - } else { - [CTPreferences removeObjectForKey:kREDIRECT_DOMAIN_KEY]; - [CTPreferences removeObjectForKey:[CTPreferences storageKeyWithSuffix:kREDIRECT_DOMAIN_KEY config: self.config]]; - } -} - -- (void)persistRedirectNotifViewedDomain { - if (self.redirectNotifViewedDomain != nil) { - [CTPreferences putString:self.redirectNotifViewedDomain forKey:[CTPreferences storageKeyWithSuffix:kREDIRECT_NOTIF_VIEWED_DOMAIN_KEY config: self.config]]; -#if CLEVERTAP_SSL_PINNING - [self.urlSessionDelegate pinSSLCerts:sslCertNames forDomains:@[kCTNotifViewedApiDomain, self.redirectNotifViewedDomain]]; -#endif - } else { - [CTPreferences removeObjectForKey:kREDIRECT_NOTIF_VIEWED_DOMAIN_KEY]; - [CTPreferences removeObjectForKey:[CTPreferences storageKeyWithSuffix:kREDIRECT_NOTIF_VIEWED_DOMAIN_KEY config: self.config]]; - } -} - (void)persistMutedTs { self.lastMutedTs = [NSDate new].timeIntervalSince1970; [CTPreferences putInt:self.lastMutedTs forKey:[CTPreferences storageKeyWithSuffix:kMUTED_TS_KEY config: self.config]]; } - (BOOL)needHandshake { - if ([self isMuted] || self.explictEndpointDomain) { + if ([self isMuted] || self.domainFactory.explictEndpointDomain) { return NO; } - return self.redirectDomain == nil; + return self.domainFactory.redirectDomain == nil; } -- (void)doHandshakeAsync { +- (void)doHandshakeAsyncWithCompletion:(void (^ _Nullable )(void))taskBlock { [self runSerialAsync:^{ if (![self needHandshake]) { - //self.redirectDomain contains value + //self.domainFactory.redirectDomain contains value [self onDomainAvailable]; + if (taskBlock) { + taskBlock(); + } return; } CleverTapLogInternal(self.config.logLevel, @"%@: starting handshake with %@", self, kHANDSHAKE_URL); - NSMutableURLRequest *request = [self createURLRequestFromURL:[[NSURL alloc] initWithString:kHANDSHAKE_URL]]; - request.HTTPMethod = @"GET"; + // Need to simulate a synchronous request dispatch_semaphore_t semaphore = dispatch_semaphore_create(0); - NSURLSessionDataTask *task = [self.urlSession - dataTaskWithRequest:request - completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) { + + CTRequest *ctRequest = [CTRequestFactory helloRequestWithConfig:self.config]; + [ctRequest onResponse:^(NSData * _Nullable data, NSURLResponse * _Nullable response) { + if ([response isKindOfClass:[NSHTTPURLResponse class]]) { NSHTTPURLResponse *httpResponse = (NSHTTPURLResponse *)response; if (httpResponse.statusCode == 200) { @@ -981,9 +885,17 @@ - (void)doHandshakeAsync { } else { [self onDomainUnavailable]; } + if (taskBlock) { + taskBlock(); + } + + dispatch_semaphore_signal(semaphore); + }]; + [ctRequest onError:^(NSError * _Nullable error) { + [self onDomainUnavailable]; dispatch_semaphore_signal(semaphore); }]; - [task resume]; + [self.requestSender send:ctRequest]; dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER); }]; } @@ -994,12 +906,12 @@ - (BOOL)updateStateFromResponseHeadersShouldRedirectForNotif:(NSDictionary *)hea @try { NSString *redirectNotifViewedDomain = headers[kREDIRECT_NOTIF_VIEWED_HEADER]; if (redirectNotifViewedDomain != nil) { - NSString *currentDomain = self.redirectNotifViewedDomain; - self.redirectNotifViewedDomain = redirectNotifViewedDomain; - if (![self.redirectNotifViewedDomain isEqualToString:currentDomain]) { + NSString *currentDomain = self.domainFactory.redirectNotifViewedDomain; + self.domainFactory.redirectNotifViewedDomain = redirectNotifViewedDomain; + if (![self.domainFactory.redirectNotifViewedDomain isEqualToString:currentDomain]) { shouldRedirect = YES; - self.redirectNotifViewedDomain = redirectNotifViewedDomain; - [self persistRedirectNotifViewedDomain]; + self.domainFactory.redirectNotifViewedDomain = redirectNotifViewedDomain; + [self.domainFactory persistRedirectNotifViewedDomain]; } } NSString *mutedString = headers[kMUTE_HEADER]; @@ -1020,12 +932,12 @@ - (BOOL)updateStateFromResponseHeadersShouldRedirect:(NSDictionary *)headers { @try { NSString *redirectDomain = headers[kREDIRECT_HEADER]; if (redirectDomain != nil) { - NSString *currentDomain = self.redirectDomain; - self.redirectDomain = redirectDomain; - if (![self.redirectDomain isEqualToString:currentDomain]) { + NSString *currentDomain = self.domainFactory.redirectDomain; + self.domainFactory.redirectDomain = redirectDomain; + if (![self.domainFactory.redirectDomain isEqualToString:currentDomain]) { shouldRedirect = YES; - self.redirectDomain = redirectDomain; - [self persistRedirectDomain]; + self.domainFactory.redirectDomain = redirectDomain; + [self.domainFactory persistRedirectDomain]; //domain changed [self onDomainAvailable]; } @@ -1060,7 +972,7 @@ - (void)handleSendQueueSuccess { - (void)handleSendQueueFail { self.sendQueueFails += 1; if (self.sendQueueFails > 5) { - [self clearRedirectDomain]; + [self.domainFactory clearRedirectDomain]; self.sendQueueFails = 0; } } @@ -1068,28 +980,15 @@ - (void)handleSendQueueFail { #pragma mark - Queue/Dispatch helpers -- (NSMutableURLRequest *)createURLRequestFromURL:(NSURL *)url { - NSMutableURLRequest *request = [[NSMutableURLRequest alloc] initWithURL:url]; - NSString *accountId = self.config.accountId; - NSString *accountToken = self.config.accountToken; - if (accountId) { - [request setValue:accountId forHTTPHeaderField:kACCOUNT_ID_HEADER]; - } - if (accountToken) { - [request setValue:accountToken forHTTPHeaderField:kACCOUNT_TOKEN_HEADER]; - } - return request; -} - - (NSString *)endpointForQueue: (NSMutableArray *)queue { - if (!self.redirectDomain) return nil; + if (!self.domainFactory.redirectDomain) return nil; NSString *accountId = self.config.accountId; NSString *sdkRevision = self.deviceInfo.sdkVersion; NSString *endpointDomain; if (queue == _notificationsQueue) { - endpointDomain = self.redirectNotifViewedDomain; + endpointDomain = self.domainFactory.redirectNotifViewedDomain; } else { - endpointDomain = self.redirectDomain; + endpointDomain = self.domainFactory.redirectDomain; } NSString *endpointUrl = [[NSString alloc] initWithFormat:@"https://%@/a1?os=iOS&t=%@&z=%@", endpointDomain, sdkRevision, accountId]; currentRequestTimestamp = (int) [[[NSDate alloc] init] timeIntervalSince1970]; @@ -1176,8 +1075,6 @@ - (NSArray *)insertHeader:(NSDictionary *)header inBatch:(NSArray *)batch { - (NSDictionary *)generateAppFields { NSMutableDictionary *evtData = [NSMutableDictionary new]; - evtData[@"scv"] = self.deviceInfo.signedCallSDKVersion; - evtData[@"Version"] = self.deviceInfo.appVersion; evtData[@"Build"] = self.deviceInfo.appBuild; @@ -1233,6 +1130,12 @@ - (NSDictionary *)generateAppFields { evtData[@"lib"] = self.deviceInfo.library; } + if (auxiliarySdkVersions && auxiliarySdkVersions.count > 0) { + [auxiliarySdkVersions enumerateKeysAndObjectsUsingBlock:^(id _Nonnull key, id _Nonnull value, BOOL * _Nonnull stop) { + [evtData setObject:value forKey:key]; + }]; + } + #if CLEVERTAP_SSL_PINNING evtData[@"sslpin"] = @YES; #endif @@ -1249,27 +1152,11 @@ - (NSDictionary *)generateAppFields { // Add Local in-app count to event data. evtData[@"LIAMC"] = @([self.deviceInfo getLocalInAppCount]); - return evtData; -} - -- (NSString *)jsonObjectToString:(id)object { - if ([object isKindOfClass:[NSString class]]) { - return object; - } - @try { - NSError *error; - NSData *jsonData = [NSJSONSerialization dataWithJSONObject:object - options:0 - error:&error]; - if (error) { - return @""; - } - NSString *jsonString = [[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding]; - return jsonString; - } - @catch (NSException *exception) { - return @""; + if (self.config.wv_init) { + evtData[@"wv_init"] = @(YES); } + + return evtData; } - (id)convertDataToPrimitive:(id)event { @@ -1385,7 +1272,7 @@ - (void)applicationDidEnterBackground:(NSNotification *)notification { - (void)applicationWillEnterForeground:(NSNotificationCenter *)notification { if ([self needHandshake]) { - [self doHandshakeAsync]; + [self doHandshakeAsyncWithCompletion:nil]; } } @@ -1437,15 +1324,32 @@ - (void)_appEnteredForeground { - (void)_appEnteredBackground { self.isAppForeground = NO; - if (![self isMuted]) { - [self persistQueues]; - } - [self runSerialAsync:^{ + + UIApplication *application = [[self class]getSharedApplication]; + UIBackgroundTaskIdentifier __block backgroundTask; + + void (^finishTaskHandler)(void) = ^(){ + dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ + [application endBackgroundTask:backgroundTask]; + backgroundTask = UIBackgroundTaskInvalid; + }); + }; + // Start background task to make sure it runs when the app is in background. + backgroundTask = [application beginBackgroundTaskWithExpirationHandler:finishTaskHandler]; + + @try { + [self persistOrClearQueues]; [self updateSessionTime:(long) [[NSDate date] timeIntervalSince1970]]; - }]; + finishTaskHandler(); + } + @catch (NSException *exception) { + CleverTapLogDebug(self.config.logLevel, @"%@: Exception caught: %@", self, [exception reason]); + finishTaskHandler(); + } } - (void)recordAppLaunched:(NSString *)caller { + if ([[self class] runningInsideAppExtension]) return; if (self.appLaunchProcessed) { @@ -1453,6 +1357,9 @@ - (void)recordAppLaunched:(NSString *)caller { return; } + // Load Vars from cache before App Launched + [self.variables.varCache loadDiffs]; + self.appLaunchProcessed = YES; if (self.config.disableAppLaunchedEvent) { @@ -2019,7 +1926,7 @@ - (void)displayNotification:(CTInAppNotification*)notification { switch (notification.inAppType) { case CTInAppTypeHTML: - jsInterface = [[CleverTapJSInterface alloc] initWithConfig:self.config]; + jsInterface = [[CleverTapJSInterface alloc] initWithConfigForInApps:self.config]; controller = [[CTInAppHTMLViewController alloc] initWithNotification:notification jsInterface:jsInterface]; break; case CTInAppTypeInterstitial: @@ -2703,7 +2610,7 @@ - (void)processEvent:(NSDictionary *)event withType:(CleverTapEventType)eventTyp } } - CleverTapLogDebug(self.config.logLevel, @"%@: New event processed: %@", self, [self jsonObjectToString:mutableEvent]); + CleverTapLogDebug(self.config.logLevel, @"%@: New event processed: %@", self, [CTUtils jsonObjectToString:mutableEvent]); if (eventType == CleverTapEventTypeFetch) { [self flushQueue]; @@ -2726,7 +2633,7 @@ - (void)scheduleQueueFlush { - (void)flushQueue { if ([self needHandshake]) { [self runSerialAsync:^{ - [self doHandshakeAsync]; + [self doHandshakeAsyncWithCompletion:nil]; }]; } [self runSerialAsync:^{ @@ -2802,17 +2709,22 @@ - (void)clearNotificationsQueue { self.notificationsQueue = [NSMutableArray array]; } +- (void)persistOrClearQueues { + if ([self isMuted]) { + [self clearQueues]; + } else { + [self persistProfileQueue]; + [self persistEventsQueue]; + [self persistNotificationsQueue]; + } +} + - (void)persistQueues { [self runSerialAsync:^{ - if ([self isMuted]) { - [self clearQueues]; - } else { - [self persistProfileQueue]; - [self persistEventsQueue]; - [self persistNotificationsQueue]; - } + [self persistOrClearQueues]; }]; } + - (void)persistEventsQueue { NSString *fileName = [self eventsFileName]; NSMutableArray *eventsCopy; @@ -2890,7 +2802,7 @@ - (void)sendQueue:(NSMutableArray *)queue { CleverTapLogInternal(self.config.logLevel, @"%@: Pending events batch contains: %d items", self, (int) [batch count]); @try { - NSString *jsonBody = [self jsonObjectToString:batchWithHeader]; + NSString *jsonBody = [CTUtils jsonObjectToString:batchWithHeader]; CleverTapLogDebug(self.config.logLevel, @"%@: Sending %@ to servers at %@", self, jsonBody, endpoint); @@ -2901,10 +2813,6 @@ - (void)sendQueue:(NSMutableArray *)queue { return; } - NSMutableURLRequest *request = [self createURLRequestFromURL:[[NSURL alloc] initWithString:endpoint]]; - request.HTTPBody = [jsonBody dataUsingEncoding:NSUTF8StringEncoding]; - request.HTTPMethod = @"POST"; - __block BOOL success = NO; __block NSData *responseData; @@ -2912,15 +2820,11 @@ - (void)sendQueue:(NSMutableArray *)queue { // Need to simulate a synchronous request dispatch_semaphore_t semaphore = dispatch_semaphore_create(0); - NSURLSessionDataTask *postDataTask = [self.urlSession - dataTaskWithRequest:request - completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) { + + CTRequest *ctRequest = [CTRequestFactory eventRequestWithConfig:self.config params:batchWithHeader url:endpoint]; + [ctRequest onResponse:^(NSData * _Nullable data, NSURLResponse * _Nullable response) { responseData = data; - if (error) { - CleverTapLogDebug(self.config.logLevel, @"%@: Network error while sending queue, will retry: %@", self, error.localizedDescription); - } - if ([response isKindOfClass:[NSHTTPURLResponse class]]) { NSHTTPURLResponse *httpResponse = (NSHTTPURLResponse *)response; @@ -2940,7 +2844,14 @@ - (void)sendQueue:(NSMutableArray *)queue { dispatch_semaphore_signal(semaphore); }]; - [postDataTask resume]; + [ctRequest onError:^(NSError * _Nullable error) { + if (error) { + CleverTapLogDebug(self.config.logLevel, @"%@: Network error while sending queue, will retry: %@", self, error.localizedDescription); + } + [[self variables] handleVariablesError]; + dispatch_semaphore_signal(semaphore); + }]; + [self.requestSender send:ctRequest]; dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER); if (!success) { @@ -3134,6 +3045,12 @@ - (void)parseResponse:(NSData *)responseData { } #endif + // Handle and Cache PE Variables + NSDictionary *varsResponse = jsonResp[CLTAP_PE_VARS_RESPONSE_KEY]; + if (varsResponse) { + [[self variables] handleVariablesResponse: jsonResp[CLTAP_PE_VARS_RESPONSE_KEY]]; + } + // Handle events/profiles sync data @try { NSDictionary *evpr = jsonResp[@"evpr"]; @@ -3312,7 +3229,7 @@ - (void)_onUserLogin:(NSDictionary *)properties withCleverTapID:(NSString *)clev return; } // stringify the profile dict to use as a concurrent dupe key - NSString *profileToString = [CTUtils dictionaryToJsonString:properties]; + NSString *profileToString = [properties toJsonString]; // as processing happens async block concurrent onUserLogin requests with the same profile, as our cache is set async if ([self isProcessingLoginUserWithIdentifier:profileToString]) { @@ -3378,6 +3295,8 @@ - (void) _asyncSwitchUser:(NSDictionary *)properties withCachedGuid:(NSString *) [self _resetProductConfig]; + [self _resetVars]; + // push data on reset profile [self recordAppLaunched:action]; if (properties) { @@ -3991,6 +3910,13 @@ - (void)setLibrary:(NSString *)name { self.deviceInfo.library = name; } +- (void)setCustomSdkVersion:(NSString *)name version:(int)version { + if (!auxiliarySdkVersions) { + auxiliarySdkVersions = [NSMutableDictionary new]; + } + auxiliarySdkVersions[name] = @(version); +} + + (void)setDebugLevel:(int)level { [CTLogger setDebugLevel:level]; if (_defaultInstanceConfig) { @@ -4029,13 +3955,14 @@ + (void)setCredentialsWithAccountID:(NSString *)accountID token:(NSString *)toke + (void)setCredentialsWithAccountID:(NSString *)accountID token:(NSString *)token proxyDomain:(NSString *)proxyDomain spikyProxyDomain:(NSString *)spikyProxyDomain { [self _setCredentialsWithAccountID:accountID token:token proxyDomain:proxyDomain]; + NSString *finalSpikyProxyDomain; if (spikyProxyDomain != nil && ![spikyProxyDomain isEqualToString:@""]) { - spikyProxyDomain = [spikyProxyDomain stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]]; - if (spikyProxyDomain.length <= 0) { - spikyProxyDomain = nil; + finalSpikyProxyDomain = [spikyProxyDomain stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]]; + if (finalSpikyProxyDomain.length <= 0) { + finalSpikyProxyDomain = nil; } } - [_plistInfo setCredentialsWithAccountID:accountID token:token proxyDomain:proxyDomain spikyProxyDomain:spikyProxyDomain]; + [_plistInfo setCredentialsWithAccountID:accountID token:token proxyDomain:proxyDomain spikyProxyDomain:finalSpikyProxyDomain]; } + (void)enablePersonalization { @@ -4078,14 +4005,6 @@ - (BOOL)geofenceLocation { return _geofenceLocation; } -+ (void)getLocationWithSuccess:(void (^)(CLLocationCoordinate2D location))success andError:(void (^)(NSString *reason))error; { -#if defined(CLEVERTAP_LOCATION) - [CTLocationManager getLocationWithSuccess:success andError:error]; -#else - CleverTapLogStaticInfo(@"To Enable CleverTap Location services/apis please build the SDK with the CLEVERTAP_LOCATION macro"); -#endif -} - #pragma clang diagnostic pop @@ -4204,7 +4123,7 @@ - (CleverTapUTMDetail *)getUTMDetails { } #if defined(CLEVERTAP_HOST_WATCHOS) -- (BOOL)handleMessage:(NSDictionary *)message forWatchSession:(WCSession *)session { +- (BOOL)handleMessage:(NSDictionary *_Nonnull)message forWatchSession:(WCSession *_Nonnull)session { NSString *type = [message objectForKey:@"clevertap_type"]; BOOL handled = (type != nil); @@ -4354,6 +4273,18 @@ - (void)markReadInboxMessageForID:(NSString *)messageId{ [self.inboxController markReadMessageWithId:messageId]; } +- (void)markReadInboxMessagesForIDs:(NSArray *_Nonnull)messageIds{ + if (![self _isInboxInitialized]) { + return; + } + if (messageIds != nil && [messageIds count] > 0) { + [self.inboxController markReadMessagesWithId:messageIds]; + } + else { + CleverTapLogStaticDebug(@"App Inbox Message IDs array is null or empty"); + } +} + - (void)registerInboxUpdatedBlock:(CleverTapInboxUpdatedBlock)block { if (!_inboxUpdateBlocks) { _inboxUpdateBlocks = [NSMutableArray new]; @@ -4372,6 +4303,19 @@ - (CleverTapInboxViewController * _Nullable)newInboxViewControllerWithConfig:(Cl return [[CleverTapInboxViewController alloc] initWithMessages:messages config:config delegate:delegate analyticsDelegate:self]; } +- (void)dismissAppInbox { + [[self class] runSyncMainQueue:^{ + UIApplication *application = [[self class] getSharedApplication]; + UIWindow *window = [[application delegate] window]; + UIViewController *presentedViewcontoller = [[window rootViewController] presentedViewController]; + if ([presentedViewcontoller isKindOfClass:[UINavigationController class]]) { + UINavigationController *navigationController = (UINavigationController *)[[window rootViewController] presentedViewController]; + if ([navigationController.topViewController isKindOfClass:[CleverTapInboxViewController class]]) { + [[window rootViewController] dismissViewControllerAnimated:YES completion:nil]; + } + } + }]; +} #pragma mark Private @@ -4525,7 +4469,7 @@ - (BOOL)didHandleInboxMessageTestFromPushNotificaton:(NSDictionary*)notification NSMutableDictionary *message = [NSMutableDictionary dictionary]; [message setObject:nowEpoch forKey:@"_id"]; [message setObject:[NSNumber numberWithLong:expireTime] forKey:@"wzrk_ttl"]; - [message addEntriesFromDictionary:msg]; + [message addEntriesFromDictionary:msg ?: @{}]; NSMutableArray *inboxMsg = [NSMutableArray new]; [inboxMsg addObject:message]; @@ -4805,6 +4749,13 @@ - (void)_resetProductConfig { } } +// run off main +- (void)_resetVars { + /// Clear content for current user + /// Content for new user will be loaded in `recordAppLaunched:` using `CTVarCache.loadDiffs` + [[self variables] clearUserContent]; +} + - (NSDictionary *)_setProductConfig:(NSDictionary *)arp { if (arp) { NSMutableDictionary *configOptions = [NSMutableDictionary new]; @@ -4937,10 +4888,6 @@ - (void)recordSignedCallEvent:(int)eventRawValue forCallDetails:(NSDictionary *) #endif } -- (void)setSignedCallVersion:(NSString *)version { - [self.deviceInfo setSignedCallSDKVersion: version]; -} - - (void)setDomainDelegate:(id)delegate { if ([[self class] runningInsideAppExtension]){ CleverTapLogDebug(self.config.logLevel, @"%@: setDomainDelegate is a no-op in an app extension.", self); @@ -4970,8 +4917,8 @@ - (void)onDomainUnavailable { //Updates the format of the domain - from `in1.clevertap-prod.com` to region.auth.domain (i.e. in1.auth.clevertap-prod.com) - (NSString *)getDomainString { - if (self.redirectDomain != nil) { - NSArray *listItems = [self.redirectDomain componentsSeparatedByString:@"."]; + if (self.domainFactory.redirectDomain != nil) { + NSArray *listItems = [self.domainFactory.redirectDomain componentsSeparatedByString:@"."]; NSString *domainItem = [listItems[0] stringByAppendingString:@".auth"]; for (int i = 1; i < listItems.count; i++ ) { NSString *dotString = [@"." stringByAppendingString: listItems[i]]; @@ -5129,4 +5076,214 @@ + (BOOL)isValidCleverTapId:(NSString *_Nullable)cleverTapID { return [CTValidator isValidCleverTapId:cleverTapID]; } +#pragma mark - Product Experiences + +- (void)onVariablesChanged:(CleverTapVariablesChangedBlock _Nonnull )block { + [[self variables] onVariablesChanged:block]; +} + +- (void)onceVariablesChanged:(CleverTapVariablesChangedBlock _Nonnull )block { + [[self variables] onceVariablesChanged:block]; +} + +- (void)syncVariables { + [self syncVariables:NO]; +} + +- (void)syncVariablesEnsureHandshake { + if ([self needHandshake]) { + [self runSerialAsync:^{ + [self doHandshakeAsyncWithCompletion:^{ + [self _syncVars]; + }]; + }]; + } + else { + [self runSerialAsync:^{ + [self _syncVars]; + }]; + } +} + +- (void)syncVariables:(BOOL)isProduction { + if (isProduction) { +#if DEBUG + CleverTapLogInfo(_config.logLevel, @"%@: Calling syncVariables: with isProduction:YES from Debug configuration/build. Use syncVariables in this case", self); +#else + CleverTapLogInfo(_config.logLevel, @"%@: Calling syncVariables: with isProduction:YES from Release configuration/build. Do not release this build and use with caution", self); +#endif + [self syncVariablesEnsureHandshake]; + } else { +#if DEBUG + [self syncVariablesEnsureHandshake]; +#else + CleverTapLogInfo(_config.logLevel, @"%@: syncVariables can only be called from Debug configurations/builds", self); +#endif + } +} + +- (void)_syncVars { + NSDictionary *meta = [self batchHeader]; + NSDictionary *varsPayload = [[self variables] varsPayload]; + NSArray *payload = @[meta,varsPayload]; + + dispatch_semaphore_t semaphore = dispatch_semaphore_create(0); + + NSString *url = [NSString stringWithFormat:@"https://%@/%@",self.domainFactory.redirectDomain, CT_PE_DEFINE_VARS_ENDPOINT]; + CTRequest *ctRequest = [CTRequestFactory syncVarsRequestWithConfig:self.config params:payload url:url]; + + [ctRequest onResponse:^(NSData * _Nullable data, NSURLResponse * _Nullable response) { + if ([response isKindOfClass:[NSHTTPURLResponse class]]) { + NSHTTPURLResponse *httpResponse = (NSHTTPURLResponse *)response; + if (httpResponse.statusCode == 200) { + CleverTapLogDebug(self->_config.logLevel, @"%@: Vars synced successfully", self); + } + else if (httpResponse.statusCode == 401) { + CleverTapLogDebug(self->_config.logLevel, @"%@: Unauthorized access from a non-test profile. Please mark this profile as a test profile from the CleverTap dashboard.", self); + } + } + CT_TRY + id jsonResp = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers error:nil]; + if (jsonResp[@"error"]) { + CleverTapLogDebug(self->_config.logLevel, @"%@: Error while syncing vars: %@", self, jsonResp[@"error"]); + } + CT_END_TRY + dispatch_semaphore_signal(semaphore); + }]; + [ctRequest onError:^(NSError * _Nullable error) { + CleverTapLogDebug(self->_config.logLevel, @"%@: error syncing vars: %@", self, error.debugDescription); + dispatch_semaphore_signal(semaphore); + }]; + [self.requestSender send:ctRequest]; + dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER); +} + +- (void)fetchVariables:(CleverTapFetchVariablesBlock)block { + [[self variables] setFetchVariablesBlock:block]; + [self queueEvent:@{@"evtName": CLTAP_WZRK_FETCH_EVENT, @"evtData" : @{@"t": @4}} withType:CleverTapEventTypeFetch]; +} + +- (CTVar * _Nullable)getVariable:(NSString * _Nonnull)name { + CTVar *var = [[self.variables varCache] getVariable:name]; + if (!var) { + CleverTapLogDebug(self.config.logLevel, @"%@: Variable with name: %@ not found.", self, name); + } + return var; +} + +- (id _Nullable)getVariableValue:(NSString * _Nonnull)name { + return [[self.variables varCache] getMergedValue:name]; +} + +#pragma mark - PE Vars + +- (CTVar *)defineVar:(NSString *)name { + return [self.variables define:name with:nil kind:nil]; +} + +- (CTVar *)defineVar:(NSString *)name withInt:(int)defaultValue { + return [self.variables define:name with:[NSNumber numberWithInt:defaultValue] kind:CT_KIND_INT]; +} + +- (CTVar *)defineVar:(NSString *)name withFloat:(float)defaultValue { + return [self.variables define:name with:[NSNumber numberWithFloat:defaultValue] kind:CT_KIND_FLOAT]; +} + +- (CTVar *)defineVar:(NSString *)name withDouble:(double)defaultValue { + return [self.variables define:name + with:[NSNumber numberWithDouble:defaultValue] + kind:CT_KIND_FLOAT]; +} + +- (CTVar *)defineVar:(NSString *)name withCGFloat:(CGFloat)defaultValue { + return [self.variables define:name + with:[NSNumber numberWithDouble:defaultValue] + kind:CT_KIND_FLOAT]; +} + +- (CTVar *)defineVar:(NSString *)name withShort:(short)defaultValue { + return [self.variables define:name + with:[NSNumber numberWithShort:defaultValue] + kind:CT_KIND_INT]; +} + +- (CTVar *)defineVar:(NSString *)name withChar:(char)defaultValue { + return [self.variables define:name + with:[NSNumber numberWithChar:defaultValue] + kind:CT_KIND_INT]; +} + +- (CTVar *)defineVar:(NSString *)name withBool:(BOOL)defaultValue { + return [self.variables define:name + with:[NSNumber numberWithBool:defaultValue] + kind:CT_KIND_BOOLEAN]; +} + +- (CTVar *)defineVar:(NSString *)name withInteger:(NSInteger)defaultValue { + return [self.variables define:name + with:[NSNumber numberWithInteger:defaultValue] + kind:CT_KIND_INT]; +} + +- (CTVar *)defineVar:(NSString *)name withLong:(long)defaultValue { + return [self.variables define:name + with:[NSNumber numberWithLong:defaultValue] + kind:CT_KIND_INT]; +} + +- (CTVar *)defineVar:(NSString *)name withLongLong:(long long)defaultValue { + return [self.variables define:name + with:[NSNumber numberWithLongLong:defaultValue] + kind:CT_KIND_INT]; +} + +- (CTVar *)defineVar:(NSString *)name withUnsignedChar:(unsigned char)defaultValue { + return [self.variables define:name + with:[NSNumber numberWithUnsignedChar:defaultValue] + kind:CT_KIND_INT]; +} + +- (CTVar *)defineVar:(NSString *)name withUnsignedInt:(unsigned int)defaultValue { + return [self.variables define:name + with:[NSNumber numberWithUnsignedInt:defaultValue] + kind:CT_KIND_INT]; +} + +- (CTVar *)defineVar:(NSString *)name withUnsignedInteger:(NSUInteger)defaultValue +{ + return [self.variables define:name + with:[NSNumber numberWithUnsignedInteger:defaultValue] + kind:CT_KIND_INT]; +} + +- (CTVar *)defineVar:(NSString *)name withUnsignedLong:(unsigned long)defaultValue { + return [self.variables define:name + with:[NSNumber numberWithUnsignedLong:defaultValue] + kind:CT_KIND_INT]; +} + +- (CTVar *)defineVar:(NSString *)name withUnsignedLongLong:(unsigned long long)defaultValue { + return [self.variables define:name + with:[NSNumber numberWithUnsignedLongLong:defaultValue] + kind:CT_KIND_INT]; +} + +- (CTVar *)defineVar:(NSString *)name withUnsignedShort:(unsigned short)defaultValue { + return [self.variables define:name + with:[NSNumber numberWithUnsignedShort:defaultValue] + kind:CT_KIND_INT]; +} + +- (CTVar *)defineVar:(NSString *)name withString:(NSString *)defaultValue { + return [self.variables define:name with:defaultValue kind:CT_KIND_STRING]; +} + +- (CTVar *)defineVar:(NSString *)name withNumber:(NSNumber *)defaultValue { + return [self.variables define:name with:defaultValue kind:CT_KIND_FLOAT]; +} + +- (CTVar *)defineVar:(NSString *)name withDictionary:(NSDictionary *)defaultValue { + return [self.variables define:name with:defaultValue kind:CT_KIND_DICTIONARY]; +} + @end diff --git a/Samples/Cordova/ExampleProject/platforms/ios/Pods/CleverTap-iOS-SDK/CleverTapSDK/CleverTapBuildInfo.h b/Samples/Cordova/ExampleProject/platforms/ios/Pods/CleverTap-iOS-SDK/CleverTapSDK/CleverTapBuildInfo.h index ef2f044d..5abb90be 100644 --- a/Samples/Cordova/ExampleProject/platforms/ios/Pods/CleverTap-iOS-SDK/CleverTapSDK/CleverTapBuildInfo.h +++ b/Samples/Cordova/ExampleProject/platforms/ios/Pods/CleverTap-iOS-SDK/CleverTapSDK/CleverTapBuildInfo.h @@ -1,3 +1 @@ - -#define WR_SDK_REVISION @"40200" - +#define WR_SDK_REVISION @"50102" diff --git a/Samples/Cordova/ExampleProject/platforms/ios/Pods/CleverTap-iOS-SDK/CleverTapSDK/CleverTapInstanceConfig.m b/Samples/Cordova/ExampleProject/platforms/ios/Pods/CleverTap-iOS-SDK/CleverTapSDK/CleverTapInstanceConfig.m index 8b152e26..72bac34e 100644 --- a/Samples/Cordova/ExampleProject/platforms/ios/Pods/CleverTap-iOS-SDK/CleverTapSDK/CleverTapInstanceConfig.m +++ b/Samples/Cordova/ExampleProject/platforms/ios/Pods/CleverTap-iOS-SDK/CleverTapSDK/CleverTapInstanceConfig.m @@ -24,6 +24,7 @@ - (void)encodeWithCoder:(NSCoder *)coder [coder encodeObject: _queueLabel forKey:@"queueLabel"]; [coder encodeBool: _isCreatedPostAppLaunched forKey:@"isCreatedPostAppLaunched"]; [coder encodeBool: _beta forKey:@"beta"]; + [coder encodeBool: _wv_init forKey:@"wv_init"]; } - (nullable instancetype)initWithCoder:(nonnull NSCoder *)coder { @@ -45,6 +46,7 @@ - (nullable instancetype)initWithCoder:(nonnull NSCoder *)coder { _queueLabel = [coder decodeObjectForKey:@"queueLabel"]; _isCreatedPostAppLaunched = [coder decodeBoolForKey:@"isCreatedPostAppLaunched"]; _beta = [coder decodeBoolForKey:@"beta"]; + _wv_init = [coder decodeBoolForKey:@"wv_init"]; } return self; } diff --git a/Samples/Cordova/ExampleProject/platforms/ios/Pods/CleverTap-iOS-SDK/CleverTapSDK/CleverTapInstanceConfigPrivate.h b/Samples/Cordova/ExampleProject/platforms/ios/Pods/CleverTap-iOS-SDK/CleverTapSDK/CleverTapInstanceConfigPrivate.h index 46698a4f..4d60db85 100644 --- a/Samples/Cordova/ExampleProject/platforms/ios/Pods/CleverTap-iOS-SDK/CleverTapSDK/CleverTapInstanceConfigPrivate.h +++ b/Samples/Cordova/ExampleProject/platforms/ios/Pods/CleverTap-iOS-SDK/CleverTapSDK/CleverTapInstanceConfigPrivate.h @@ -7,6 +7,9 @@ @property (nonatomic, assign) BOOL isCreatedPostAppLaunched; @property (nonatomic, assign) BOOL beta; +// SET ONLY WHEN THE USER INITIALISES A WEBVIEW WITH CT JS INTERFACE +@property (nonatomic, assign) BOOL wv_init; + - (instancetype _Nonnull)initWithAccountId:(NSString * _Nonnull)accountId accountToken:(NSString * _Nonnull)accountToken accountRegion:(NSString * _Nullable)accountRegion diff --git a/Samples/Cordova/ExampleProject/platforms/ios/Pods/CleverTap-iOS-SDK/CleverTapSDK/CleverTapJSInterface.m b/Samples/Cordova/ExampleProject/platforms/ios/Pods/CleverTap-iOS-SDK/CleverTapSDK/CleverTapJSInterface.m index 5d32f950..31f847a2 100644 --- a/Samples/Cordova/ExampleProject/platforms/ios/Pods/CleverTap-iOS-SDK/CleverTapSDK/CleverTapJSInterface.m +++ b/Samples/Cordova/ExampleProject/platforms/ios/Pods/CleverTap-iOS-SDK/CleverTapSDK/CleverTapJSInterface.m @@ -2,16 +2,25 @@ #import "CleverTap.h" #import "CleverTapInstanceConfig.h" #import "CleverTapInstanceConfigPrivate.h" +#import "CleverTapJSInterfacePrivate.h" @interface CleverTapJSInterface (){} @property (nonatomic, strong) CleverTapInstanceConfig *config; - @end @implementation CleverTapJSInterface - (instancetype)initWithConfig:(CleverTapInstanceConfig *)config { + if (self = [super init]) { + _config = config; + _wv_init = YES; + [self initUserContentController]; + } + return self; +} + +- (instancetype)initWithConfigForInApps:(CleverTapInstanceConfig *)config { if (self = [super init]) { _config = config; [self initUserContentController]; @@ -33,6 +42,9 @@ - (void)userContentController:(nonnull WKUserContentController *)userContentCont cleverTap = [CleverTap instanceWithConfig:self.config]; } if (cleverTap) { + if (_wv_init) { + cleverTap.config.wv_init = YES; + } [self handleMessageFromWebview:message.body forInstance:cleverTap]; } } @@ -41,7 +53,7 @@ - (void)userContentController:(nonnull WKUserContentController *)userContentCont - (void)handleMessageFromWebview:(NSDictionary *)message forInstance:(CleverTap *)cleverTap { NSString *action = [message objectForKey:@"action"]; if ([action isEqual:@"recordEventWithProps"]) { - [cleverTap recordEvent: message[@"event"] withProps: message[@"props"]]; + [cleverTap recordEvent: message[@"event"] withProps: message[@"properties"]]; } else if ([action isEqual: @"profilePush"]) { [cleverTap profilePush: message[@"properties"]]; } else if ([action isEqual: @"profileSetMultiValues"]) { diff --git a/Samples/Cordova/ExampleProject/platforms/ios/Pods/CleverTap-iOS-SDK/CleverTapSDK/CleverTapJSInterfacePrivate.h b/Samples/Cordova/ExampleProject/platforms/ios/Pods/CleverTap-iOS-SDK/CleverTapSDK/CleverTapJSInterfacePrivate.h new file mode 100644 index 00000000..d3881561 --- /dev/null +++ b/Samples/Cordova/ExampleProject/platforms/ios/Pods/CleverTap-iOS-SDK/CleverTapSDK/CleverTapJSInterfacePrivate.h @@ -0,0 +1,8 @@ +#import + +@interface CleverTapJSInterface () {} +- (instancetype)initWithConfigForInApps:(CleverTapInstanceConfig *)config; + +// SET ONLY WHEN THE USER INITIALISES A WEBVIEW WITH CT JS INTERFACE +@property (nonatomic, assign) BOOL wv_init; +@end diff --git a/Samples/Cordova/ExampleProject/platforms/ios/Pods/CleverTap-iOS-SDK/CleverTapSDK/Inbox/controllers/CTInboxController.h b/Samples/Cordova/ExampleProject/platforms/ios/Pods/CleverTap-iOS-SDK/CleverTapSDK/Inbox/controllers/CTInboxController.h index 5c560ba4..c4d8a832 100755 --- a/Samples/Cordova/ExampleProject/platforms/ios/Pods/CleverTap-iOS-SDK/CleverTapSDK/Inbox/controllers/CTInboxController.h +++ b/Samples/Cordova/ExampleProject/platforms/ios/Pods/CleverTap-iOS-SDK/CleverTapSDK/Inbox/controllers/CTInboxController.h @@ -29,6 +29,7 @@ NS_ASSUME_NONNULL_BEGIN - (void)deleteMessageWithId:(NSString *)messageId; - (void)deleteMessagesWithId:(NSArray *_Nonnull)messageIds; - (void)markReadMessageWithId:(NSString *)messageId; +- (void)markReadMessagesWithId:(NSArray *_Nonnull)messageIds; @end diff --git a/Samples/Cordova/ExampleProject/platforms/ios/Pods/CleverTap-iOS-SDK/CleverTapSDK/Inbox/controllers/CTInboxController.m b/Samples/Cordova/ExampleProject/platforms/ios/Pods/CleverTap-iOS-SDK/CleverTapSDK/Inbox/controllers/CTInboxController.m index aad25225..aa0652db 100755 --- a/Samples/Cordova/ExampleProject/platforms/ios/Pods/CleverTap-iOS-SDK/CleverTapSDK/Inbox/controllers/CTInboxController.m +++ b/Samples/Cordova/ExampleProject/platforms/ios/Pods/CleverTap-iOS-SDK/CleverTapSDK/Inbox/controllers/CTInboxController.m @@ -103,9 +103,19 @@ - (void)deleteMessageWithId:(NSString *)messageId { - (void)deleteMessagesWithId:(NSArray *_Nonnull)messageIds { NSMutableArray *toDeleteInboxMessages = [NSMutableArray new]; for (NSString *ids in messageIds) { - CTMessageMO *msg = [self _messageForId:ids]; - [toDeleteInboxMessages addObject:msg]; + if (ids != nil && ![ids isEqualToString:@""]){ + CTMessageMO *msg = [self _messageForId:ids]; + if (msg) { + [toDeleteInboxMessages addObject:msg]; + } + else { + CleverTapLogStaticDebug(@"Cannot delete App Inbox Message because Message ID %@ is invalid.", ids) + } + } + else { + CleverTapLogStaticDebug(@"Cannot delete App Inbox Message because Message ID is null or not a string."); } + } if ([toDeleteInboxMessages count] > 0) { [self _deleteMessages:toDeleteInboxMessages]; } @@ -122,6 +132,27 @@ - (void)markReadMessageWithId:(NSString *)messageId { }]; } +- (void)markReadMessagesWithId:(NSArray *_Nonnull)messageIds { + [privateContext performBlock:^{ + for (NSString *ids in messageIds) { + if (ids != nil && ![ids isEqualToString:@""]){ + CTMessageMO *message = [self _messageForId:ids]; + if (message) { + [message setValue:@YES forKey:@"isRead"]; + } + else { + CleverTapLogStaticDebug(@"Cannot mark App Inbox Message as read because Message ID %@ is invalid.", ids); + } + } + else { + CleverTapLogStaticDebug(@"Cannot mark App Inbox Message as read because Message ID is null or not a string."); + } + } + [self _save]; + [self notifyUpdate]; + }]; +} + - (NSDictionary *)messageForId:(NSString *)messageId { if (!self.isInitialized) return nil; CTMessageMO *msg = [self _messageForId:messageId]; @@ -149,7 +180,7 @@ - (NSInteger)unreadCount { BOOL hasMessages = ([[self.user.entity propertiesByName] objectForKey:@"messages"] != nil); if (!hasMessages) return nil; - + for (CTMessageMO *msg in self.user.messages) { int ttl = (int)msg.expires; if (ttl > 0 && now >= ttl) { @@ -204,7 +235,7 @@ - (CTMessageMO *)_messageForId:(NSString *)messageId { BOOL hasMessages = ([[self.user.entity propertiesByName] objectForKey:@"messages"] != nil); if (!hasMessages) return nil; - + NSOrderedSet *results = [self.user.messages filteredOrderedSetUsingPredicate:[NSPredicate predicateWithFormat:@"id == %@", messageId]]; BOOL existing = results && [results count] > 0; return existing ? results[0] : nil; diff --git a/Samples/Cordova/ExampleProject/platforms/ios/Pods/CleverTap-iOS-SDK/CleverTapSDK/Inbox/models/CTUserMO+CoreDataProperties.h b/Samples/Cordova/ExampleProject/platforms/ios/Pods/CleverTap-iOS-SDK/CleverTapSDK/Inbox/models/CTUserMO+CoreDataProperties.h index 6a04c364..b97b1a6a 100755 --- a/Samples/Cordova/ExampleProject/platforms/ios/Pods/CleverTap-iOS-SDK/CleverTapSDK/Inbox/models/CTUserMO+CoreDataProperties.h +++ b/Samples/Cordova/ExampleProject/platforms/ios/Pods/CleverTap-iOS-SDK/CleverTapSDK/Inbox/models/CTUserMO+CoreDataProperties.h @@ -6,7 +6,7 @@ NS_ASSUME_NONNULL_BEGIN @interface CTUserMO (CoreDataProperties) -+ (instancetype)fetchOrCreateFromJSON:(NSDictionary *)json forContext:(NSManagedObjectContext *)context; ++ (instancetype _Nullable)fetchOrCreateFromJSON:(NSDictionary *)json forContext:(NSManagedObjectContext *)context; - (BOOL)updateMessages:(NSArray *)messages forContext:(NSManagedObjectContext *)context; @property (nullable, nonatomic, copy) NSString *accountId; diff --git a/Samples/Cordova/ExampleProject/platforms/ios/Pods/CleverTap-iOS-SDK/CleverTapSDK/Inbox/models/CTUserMO+CoreDataProperties.m b/Samples/Cordova/ExampleProject/platforms/ios/Pods/CleverTap-iOS-SDK/CleverTapSDK/Inbox/models/CTUserMO+CoreDataProperties.m index d17d0896..ee0accc5 100755 --- a/Samples/Cordova/ExampleProject/platforms/ios/Pods/CleverTap-iOS-SDK/CleverTapSDK/Inbox/models/CTUserMO+CoreDataProperties.m +++ b/Samples/Cordova/ExampleProject/platforms/ios/Pods/CleverTap-iOS-SDK/CleverTapSDK/Inbox/models/CTUserMO+CoreDataProperties.m @@ -17,13 +17,13 @@ - (void)removeMessages:(NSOrderedSet *)values; @implementation CTUserMO (CoreDataProperties) -+ (instancetype)fetchOrCreateFromJSON:(NSDictionary *)json forContext:(NSManagedObjectContext *)context { ++ (instancetype _Nullable)fetchOrCreateFromJSON:(NSDictionary *)json forContext:(NSManagedObjectContext *)context { CTUserMO *_user; @try { NSString *identifier = json[@"identifier"]; if (!identifier) { - CleverTapLogStaticInternal(@"CTUserMO fetchOrCreate for: %@ requires an identifier returning nil", json); + CleverTapLogStaticInternal(@"CTUserMO fetchOrCreate for: %@ requires an identifier. Returning nil", json); return nil; } diff --git a/Samples/Cordova/ExampleProject/platforms/ios/Pods/CleverTap-iOS-SDK/CleverTapSDK/LeanplumCT.h b/Samples/Cordova/ExampleProject/platforms/ios/Pods/CleverTap-iOS-SDK/CleverTapSDK/LeanplumCT.h new file mode 100644 index 00000000..bc82a659 --- /dev/null +++ b/Samples/Cordova/ExampleProject/platforms/ios/Pods/CleverTap-iOS-SDK/CleverTapSDK/LeanplumCT.h @@ -0,0 +1,160 @@ +// +// LeanplumCT.h +// CleverTapSDK +// +// Created by Nikola Zagorchev on 22.05.23. +// Copyright © 2023 CleverTap. All rights reserved. +// + +#import +#import "CleverTap.h" + +NS_ASSUME_NONNULL_BEGIN + +FOUNDATION_EXPORT NSString *const LP_PURCHASE_EVENT; +FOUNDATION_EXPORT NSString *const LP_STATE_PREFIX; +FOUNDATION_EXPORT NSString *const LP_VALUE_PARAM_NAME; +FOUNDATION_EXPORT NSString *const LP_INFO_PARAM_NAME; +FOUNDATION_EXPORT NSString *const LP_CHARGED_EVENT_PARAM_NAME; +FOUNDATION_EXPORT NSString *const LP_CURRENCY_CODE_PARAM_NAME; + +@interface LeanplumCT : NSObject + +@property (class) CleverTap *instance; + +/** + * @{ + * Advances to a particular state in your application. The string can be + * any value of your choosing, and will show up in the dashboard. + * A state is a section of your app that the user is currently in. + * @param state The name of the state. + */ ++ (void)advanceTo:(nullable NSString *)state +NS_SWIFT_NAME(advance(state:)); + +/** + * Advances to a particular state in your application. The string can be + * any value of your choosing, and will show up in the dashboard. + * A state is a section of your app that the user is currently in. + * @param state The name of the state. + * @param info Anything else you want to log with the state. For example, if the state + * is watchVideo, info could be the video ID. + */ ++ (void)advanceTo:(nullable NSString *)state + withInfo:(nullable NSString *)info +NS_SWIFT_NAME(advance(state:info:)); + +/** + * Advances to a particular state in your application. The string can be + * any value of your choosing, and will show up in the dashboard. + * A state is a section of your app that the user is currently in. + * You can specify up to 200 types of parameters per app across all events and state. + * The parameter keys must be strings, and values either strings or numbers. + * @param state The name of the state. + * @param params A dictionary with custom parameters. + */ ++ (void)advanceTo:(nullable NSString *)state + withParameters:(nullable NSDictionary *)params +NS_SWIFT_NAME(advance(state:params:)); + +/** + * Advances to a particular state in your application. The string can be + * any value of your choosing, and will show up in the dashboard. + * A state is a section of your app that the user is currently in. + * You can specify up to 200 types of parameters per app across all events and state. + * The parameter keys must be strings, and values either strings or numbers. + * @param state The name of the state. (nullable) + * @param info Anything else you want to log with the state. For example, if the state + * is watchVideo, info could be the video ID. + * @param params A dictionary with custom parameters. + */ ++ (void)advanceTo:(nullable NSString *)state + withInfo:(nullable NSString *)info + andParameters:(nullable NSDictionary *)params +NS_SWIFT_NAME(advance(state:info:params:)); + +/** + * Sets additional user attributes after the session has started. + * Variables retrieved by start won't be targeted based on these attributes, but + * they will count for the current session for reporting purposes. + * Only those attributes given in the dictionary will be updated. All other + * attributes will be preserved. + */ ++ (void)setUserAttributes:(NSDictionary *)attributes; + +/** + * Updates a user ID after session start. + */ ++ (void)setUserId:(NSString *)userId +NS_SWIFT_NAME(setUserId(_:)); + +/** + * Updates a user ID after session start with a dictionary of user attributes. + */ ++ (void)setUserId:(NSString *)userId withUserAttributes:(NSDictionary *)attributes +NS_SWIFT_NAME(setUserId(_:attributes:)); + +/** + * Sets the traffic source info for the current user. + * Keys in info must be one of: publisherId, publisherName, publisherSubPublisher, + * publisherSubSite, publisherSubCampaign, publisherSubAdGroup, publisherSubAd. + */ ++ (void)setTrafficSourceInfo:(NSDictionary *)info +NS_SWIFT_NAME(setTrafficSource(info:)); + +/** + * Manually track purchase event with currency code in your application. It is advised to use + * trackInAppPurchases to automatically track IAPs. + */ ++ (void)trackPurchase:(NSString *)event + withValue:(double)value + andCurrencyCode:(nullable NSString *)currencyCode + andParameters:(nullable NSDictionary *)params +NS_SWIFT_NAME(track(event:value:currencyCode:params:)); +/**@}*/ + +/** + * @{ + * Logs a particular event in your application. The string can be + * any value of your choosing, and will show up in the dashboard. + * To track a purchase, use LP_PURCHASE_EVENT. + */ ++ (void)track:(NSString *)event; + ++ (void)track:(NSString *)event + withValue:(double)value +NS_SWIFT_NAME(track(_:value:)); + ++ (void)track:(NSString *)event + withInfo:(nullable NSString *)info +NS_SWIFT_NAME(track(_:info:)); + ++ (void)track:(NSString *)event + withValue:(double)value + andInfo:(nullable NSString *)info +NS_SWIFT_NAME(track(_:value:info:)); + +// See above for the explanation of params. ++ (void)track:(NSString *)event withParameters:(nullable NSDictionary *)params +NS_SWIFT_NAME(track(_:params:)); + ++ (void)track:(NSString *)event + withValue:(double)value +andParameters:(nullable NSDictionary *)params +NS_SWIFT_NAME(track(_:value:params:)); + ++ (void)track:(NSString *)event + withValue:(double)value + andInfo:(nullable NSString *)info +andParameters:(nullable NSDictionary *)params +NS_SWIFT_NAME(track(_:value:info:params:)); +/**@}*/ + +/** + * Sets the log level of the CleverTap SDK. + */ ++ (void)setLogLevel:(CleverTapLogLevel)level; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Samples/Cordova/ExampleProject/platforms/ios/Pods/CleverTap-iOS-SDK/CleverTapSDK/LeanplumCT.m b/Samples/Cordova/ExampleProject/platforms/ios/Pods/CleverTap-iOS-SDK/CleverTapSDK/LeanplumCT.m new file mode 100644 index 00000000..007d4ca7 --- /dev/null +++ b/Samples/Cordova/ExampleProject/platforms/ios/Pods/CleverTap-iOS-SDK/CleverTapSDK/LeanplumCT.m @@ -0,0 +1,206 @@ +// +// LeanplumCT.m +// CleverTapSDK +// +// Created by Nikola Zagorchev on 22.05.23. +// Copyright © 2023 CleverTap. All rights reserved. +// + +#import "LeanplumCT.h" +#import "CTConstants.h" +#import "CleverTapInstanceConfig.h" +#import "NSDictionary+Extensions.h" + +NSString *const LP_PURCHASE_EVENT = @"Purchase"; +NSString *const LP_STATE_PREFIX = @"state_"; +NSString *const LP_VALUE_PARAM_NAME = @"value"; +NSString *const LP_INFO_PARAM_NAME = @"info"; +NSString *const LP_CHARGED_EVENT_PARAM_NAME = @"event"; +NSString *const LP_CURRENCY_CODE_PARAM_NAME = @"currencyCode"; + +@implementation LeanplumCT + +static CleverTap * _instance; ++ (CleverTap *)instance { + if (!_instance) { + _instance = [CleverTap sharedInstance]; + } + return _instance; +} + ++ (void)setInstance:(CleverTap *)instance { + _instance = instance; +} + ++ (void)advanceTo:(nullable NSString *)state { + [self advanceTo:state withInfo:nil]; +} + ++ (void)advanceTo:(nullable NSString *)state + withInfo:(nullable NSString *)info { + [self advanceTo:state withInfo:info andParameters:nil]; +} + ++ (void)advanceTo:(nullable NSString *)state + withParameters:(nullable NSDictionary *)params { + [self advanceTo:state withInfo:nil andParameters:params]; +} + ++ (void)advanceTo:(nullable NSString *)state + withInfo:(nullable NSString *)info + andParameters:(nullable NSDictionary *)params { + if (!state) { + return; + } + + NSString *eventName = [NSString stringWithFormat:@"%@%@", LP_STATE_PREFIX, state]; + CleverTapLogDebug(self.instance.config.logLevel, + @"%@: LeanplumCT.advance will call track with %@ and %@.", self, eventName, params); + [self track:eventName withValue:0.0 andInfo:info andParameters:params]; +} + ++ (void)setUserAttributes:(NSDictionary *)attributes { + NSDictionary *profileAttributes = [[self transformArrayValuesInDictionary:attributes] dictionaryRemovingNullValues]; + CleverTapLogDebug(self.instance.config.logLevel, + @"%@: LeanplumCT.setUserAttributes will call profilePush with %@.", self, profileAttributes); + [[self instance] profilePush:profileAttributes]; + + for (NSString* key in attributes) { + id value = attributes[key]; + if (!value || [value isEqual:[NSNull null]]) { + CleverTapLogDebug(self.instance.config.logLevel, + @"%@: LeanplumCT.setUserAttributes will call profileRemoveValue forKey: %@.", self, key); + [[self instance] profileRemoveValueForKey:key]; + } + } +} + ++ (void)setUserId:(NSString *)userId { + [self setUserId:userId withUserAttributes:@{}]; +} + ++ (void)setUserId:(NSString *)userId withUserAttributes:(NSDictionary *)attributes { + if (userId) { + CleverTapLogDebug(self.instance.config.logLevel, + @"%@: LeanplumCT.setUserId will call onUserLogin with %@: %@.", self, CLTAP_PROFILE_IDENTITY_KEY, userId); + [[self instance] onUserLogin:@{ CLTAP_PROFILE_IDENTITY_KEY: userId }]; + } + + if (attributes && [attributes count] > 0) { + [self setUserAttributes:attributes]; + } +} + ++ (void)setTrafficSourceInfo:(NSDictionary *)info { + NSString* source = info[@"publisherName"]; + NSString* medium = info[@"publisherSubPublisher"]; + NSString* campaign = info[@"publisherSubCampaign"]; + + CleverTapLogDebug(self.instance.config.logLevel, + @"%@: LeanplumCT.setTrafficSourceInfo will call pushInstallReferrerSource \ + with %@, %@ and %@.", self, source, medium, campaign); + [[self instance] pushInstallReferrerSource:source medium:medium campaign:campaign]; +} + ++ (void)trackPurchase:(NSString *)event + withValue:(double)value + andCurrencyCode:(nullable NSString *)currencyCode + andParameters:(nullable NSDictionary *)params { + if (!event) { + return; + } + + NSMutableDictionary *details = [[self transformArrayValuesInDictionary:params] mutableCopy]; + [details setObject:event forKey:LP_CHARGED_EVENT_PARAM_NAME]; + [details setObject:@(value) forKey:LP_VALUE_PARAM_NAME]; + + if (currencyCode) { + [details setObject:currencyCode forKey:LP_CURRENCY_CODE_PARAM_NAME]; + } + NSArray *items = @[]; + + CleverTapLogDebug(self.instance.config.logLevel, + @"%@: LeanplumCT.trackPurchase will call will call recordChargedEvent \ + with %@ and %@.", self, details, items); + [[self instance] recordChargedEventWithDetails:details andItems:items]; +} + ++ (void)track:(NSString *)event { + [self track:event withValue:0.0 andInfo:nil andParameters:nil]; +} + ++ (void)track:(NSString *)event + withValue:(double)value { + [self track:event withValue:value andInfo:nil andParameters:nil]; +} + ++ (void)track:(NSString *)event + withInfo:(nullable NSString *)info { + [self track:event withValue:0.0 andInfo:info andParameters:nil]; +} + ++ (void)track:(NSString *)event + withValue:(double)value + andInfo:(nullable NSString *)info { + [self track:event withValue:value andInfo:info andParameters:nil]; +} + ++ (void)track:(NSString *)event withParameters:(nullable NSDictionary *)params { + [self track:event withValue:0.0 andInfo:nil andParameters:params]; +} + ++ (void)track:(NSString *)event + withValue:(double)value +andParameters:(nullable NSDictionary *)params { + [self track:event withValue:value andInfo:nil andParameters:params]; +} + ++ (void)track:(NSString *)event + withValue:(double)value + andInfo:(nullable NSString *)info +andParameters:(nullable NSDictionary *)params { + if (!event) { + return; + } + + NSMutableDictionary *eventParams = [[self transformArrayValuesInDictionary:params] mutableCopy]; + [eventParams setObject:@(value) forKey:LP_VALUE_PARAM_NAME]; + + if (info) { + [eventParams setObject:info forKey:LP_INFO_PARAM_NAME]; + } + + CleverTapLogDebug(self.instance.config.logLevel, + @"%@: LeanplumCT.track will call recordEvent \ + with %@ and %@.", self, event, eventParams); + [[self instance] recordEvent:event withProps:eventParams]; +} + ++ (void)setLogLevel:(CleverTapLogLevel)level { + [CleverTap setDebugLevel:level]; + [[[self instance] config] setLogLevel:level]; +} + +/** + * Transforms NSArray values to NSString in format @"[component0, component1]". + * @param dictionary The dictionary which values to transform. + */ ++ (NSDictionary *)transformArrayValuesInDictionary:(NSDictionary *)dictionary { + return [dictionary dictionaryWithTransformUsingBlock:^id _Nonnull(id _Nonnull value) { + if ([value isKindOfClass:[NSArray class]]) { + NSArray *array = (NSArray *)value; + NSArray *filteredArray = + [array filteredArrayUsingPredicate: + [NSPredicate predicateWithBlock:^BOOL(id evaluatedObject, NSDictionary *bindings) { + return evaluatedObject && ![evaluatedObject isEqual:[NSNull null]]; + }]]; + NSArray *stringArray = [filteredArray valueForKey:@"description"]; + NSString *joinedString = [stringArray componentsJoinedByString:@","]; + NSString *result = [NSString stringWithFormat:@"[%@]", joinedString]; + return result; + } + return value; + }]; +} + +@end diff --git a/Samples/Cordova/ExampleProject/platforms/ios/Pods/CleverTap-iOS-SDK/CleverTapSDK/NSDictionary+Extensions.h b/Samples/Cordova/ExampleProject/platforms/ios/Pods/CleverTap-iOS-SDK/CleverTapSDK/NSDictionary+Extensions.h new file mode 100644 index 00000000..9d427fe5 --- /dev/null +++ b/Samples/Cordova/ExampleProject/platforms/ios/Pods/CleverTap-iOS-SDK/CleverTapSDK/NSDictionary+Extensions.h @@ -0,0 +1,38 @@ +// +// NSDictionary+Extensions.h +// CleverTapSDK +// +// Created by Nikola Zagorchev on 5.06.23. +// Copyright © 2023 CleverTap. All rights reserved. +// + +#import + +NS_ASSUME_NONNULL_BEGIN + +@interface NSDictionary (Extensions) + +/** + * Uses NSJSONSerialization. NSDate values will be removed from the result. + * @return the NSString JSON representation using UTF8 encoding. + */ +- (NSString *)toJsonString; + +/** + * Executes the block on each dictionary value and returns a new NSDictionary. + * Does not deep copy the current dictionary. If the value is mutable and modified in the block, + * this will modify the current dictionary value. + * @param block the block to execute on each value. + * @return new NSDictionary with the transformed values. + */ +- (NSDictionary *)dictionaryWithTransformUsingBlock:(id(^)(id))block; + +/** + * Removes `NSNull` values and returns a new dictionary. Current dictionary is unmodified. + * @return new NSDictionary without `NSNull` values. + */ +- (NSDictionary *)dictionaryRemovingNullValues; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Samples/Cordova/ExampleProject/platforms/ios/Pods/CleverTap-iOS-SDK/CleverTapSDK/NSDictionary+Extensions.m b/Samples/Cordova/ExampleProject/platforms/ios/Pods/CleverTap-iOS-SDK/CleverTapSDK/NSDictionary+Extensions.m new file mode 100644 index 00000000..473bd65e --- /dev/null +++ b/Samples/Cordova/ExampleProject/platforms/ios/Pods/CleverTap-iOS-SDK/CleverTapSDK/NSDictionary+Extensions.m @@ -0,0 +1,60 @@ +// +// NSDictionary+Extensions.m +// CleverTapSDK +// +// Created by Nikola Zagorchev on 5.06.23. +// Copyright © 2023 CleverTap. All rights reserved. +// + +#import "NSDictionary+Extensions.h" + +@implementation NSDictionary (Extensions) + +- (NSString *)toJsonString { + if (self == nil) return nil; + + NSData *jsonData; + @try { + NSError *error; + NSMutableDictionary *_cleaned = [NSMutableDictionary new]; + + for (NSString *key in self) { + id value = self[key]; + if ([value isKindOfClass:[NSDate class]]) { + continue; + } + _cleaned[key] = value; + } + + jsonData = [NSJSONSerialization dataWithJSONObject:_cleaned + options:0 + error:&error]; + + return jsonData != nil ? [[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding] : nil; + + } @catch (NSException *e) { + return nil; + } +} + +- (NSDictionary *)dictionaryWithTransformUsingBlock:(id(^)(id))block { + NSMutableDictionary *result = [NSMutableDictionary dictionary]; + + [self enumerateKeysAndObjectsUsingBlock:^(id key, id value, BOOL *stop) { + // If the value is mutable and modified in the block, + // this will modify the original dictionary value + id transformedValue = block(value); + result[key] = transformedValue; + }]; + + return [result copy]; +} + +- (NSDictionary *)dictionaryRemovingNullValues { + NSSet *keys = [self keysOfEntriesPassingTest:^BOOL(id key, id obj, BOOL *stop){ + return obj && ![obj isEqual:[NSNull null]]; + }]; + return [self dictionaryWithValuesForKeys:[keys allObjects]]; +} + +@end diff --git a/Samples/Cordova/ExampleProject/platforms/ios/Pods/CleverTap-iOS-SDK/CleverTapSDK/ProductConfig/controllers/CTProductConfigController.m b/Samples/Cordova/ExampleProject/platforms/ios/Pods/CleverTap-iOS-SDK/CleverTapSDK/ProductConfig/controllers/CTProductConfigController.m index bfde4a3c..e1870d66 100644 --- a/Samples/Cordova/ExampleProject/platforms/ios/Pods/CleverTap-iOS-SDK/CleverTapSDK/ProductConfig/controllers/CTProductConfigController.m +++ b/Samples/Cordova/ExampleProject/platforms/ios/Pods/CleverTap-iOS-SDK/CleverTapSDK/ProductConfig/controllers/CTProductConfigController.m @@ -1,7 +1,6 @@ #import "CTProductConfigController.h" #import "CTConstants.h" #import "CTPreferences.h" -#import "CTPreferences.h" #import "CleverTapInstanceConfig.h" #import "CleverTapProductConfigPrivate.h" diff --git a/Samples/Cordova/ExampleProject/platforms/ios/Pods/CleverTap-iOS-SDK/CleverTapSDK/ProductExperiences/CTVar-Internal.h b/Samples/Cordova/ExampleProject/platforms/ios/Pods/CleverTap-iOS-SDK/CleverTapSDK/ProductExperiences/CTVar-Internal.h new file mode 100644 index 00000000..10954bc5 --- /dev/null +++ b/Samples/Cordova/ExampleProject/platforms/ios/Pods/CleverTap-iOS-SDK/CleverTapSDK/ProductExperiences/CTVar-Internal.h @@ -0,0 +1,31 @@ +#import "CTVar.h" +@class CTVarCache; + +NS_ASSUME_NONNULL_BEGIN + +@interface CTVar () + +- (instancetype)initWithName:(NSString *)name + withDefaultValue:(NSObject *)defaultValue + withKind:(NSString *)kind + varCache:(CTVarCache *)cache; + +@property (readonly, strong) CTVarCache *varCache; +@property (readonly, strong) NSString *name; +@property (readonly, strong) NSArray *nameComponents; +@property (readonly) BOOL hadStarted; +@property (readonly, strong) NSString *kind; +@property (readonly, strong) NSMutableArray *valueChangedBlocks; +@property (nonatomic, unsafe_unretained, nullable) id delegate; +@property (readonly) BOOL hasChanged; + +- (void)update; +- (void)cacheComputedValues; +- (void)triggerValueChanged; + ++ (BOOL)printedCallbackWarning; ++ (void)setPrintedCallbackWarning:(BOOL)newPrintedCallbackWarning; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Samples/Cordova/ExampleProject/platforms/ios/Pods/CleverTap-iOS-SDK/CleverTapSDK/ProductExperiences/CTVar.h b/Samples/Cordova/ExampleProject/platforms/ios/Pods/CleverTap-iOS-SDK/CleverTapSDK/ProductExperiences/CTVar.h new file mode 100644 index 00000000..8c347875 --- /dev/null +++ b/Samples/Cordova/ExampleProject/platforms/ios/Pods/CleverTap-iOS-SDK/CleverTapSDK/ProductExperiences/CTVar.h @@ -0,0 +1,108 @@ +#import +#import + +NS_ASSUME_NONNULL_BEGIN + +typedef void (^CleverTapVariablesChangedBlock)(void); +typedef void (^CleverTapFetchVariablesBlock)(BOOL success); + +@class CTVar; +/** + * Receives callbacks for {@link CTVar} + */ +NS_SWIFT_NAME(VarDelegate) +@protocol CTVarDelegate +@optional +/** + * Called when the value of the variable changes. + */ +- (void)valueDidChange:(CTVar *)variable; +@end + +/** + * A variable is any part of your application that can change from an experiment. + * Check out {@link Macros the macros} for defining variables more easily. + */ +NS_SWIFT_NAME(Var) +@interface CTVar : NSObject + +@property (readonly, strong, nullable) NSString *stringValue; +@property (readonly, strong, nullable) NSNumber *numberValue; +@property (readonly, strong, nullable) id value; +@property (readonly, strong, nullable) id defaultValue; + +/** + * @{ + * Defines a {@link LPVar} + */ +- (instancetype)init NS_UNAVAILABLE; + +/** + * Returns the name of the variable. + */ +- (NSString *)name; + +/** + * Returns the components of the variable's name. + */ +- (NSArray *)nameComponents; + +/** + * Returns the default value of a variable. + */ +- (nullable id)defaultValue; + +/** + * Returns the kind of the variable. + */ +- (NSString *)kind; + +/** + * Returns whether the variable has changed since the last time the app was run. + */ +- (BOOL)hasChanged; + +/** + * Called when the value of the variable changes. + */ +- (void)onValueChanged:(CleverTapVariablesChangedBlock)block; + +/** + * Sets the delegate of the variable in order to use + * {@link CTVarDelegate::valueDidChange:} + */ +- (void)setDelegate:(nullable id )delegate; + +- (void)clearState; + +/** + * @{ + * Accessess the value(s) of the variable + */ +- (id)objectForKey:(nullable NSString *)key; +- (id)objectAtIndex:(NSUInteger )index; +- (id)objectForKeyPath:(nullable id)firstComponent, ... NS_REQUIRES_NIL_TERMINATION; +- (id)objectForKeyPathComponents:(nullable NSArray *)pathComponents; + +- (nullable NSNumber *)numberValue; +- (nullable NSString *)stringValue; +- (int)intValue; +- (double)doubleValue; +- (CGFloat)cgFloatValue; +- (float)floatValue; +- (short)shortValue; +- (BOOL)boolValue; +- (char)charValue; +- (long)longValue; +- (long long)longLongValue; +- (NSInteger)integerValue; +- (unsigned char)unsignedCharValue; +- (unsigned short)unsignedShortValue; +- (unsigned int)unsignedIntValue; +- (NSUInteger)unsignedIntegerValue; +- (unsigned long)unsignedLongValue; +- (unsigned long long)unsignedLongLongValue; +/**@}*/ +@end + +NS_ASSUME_NONNULL_END diff --git a/Samples/Cordova/ExampleProject/platforms/ios/Pods/CleverTap-iOS-SDK/CleverTapSDK/ProductExperiences/CTVar.m b/Samples/Cordova/ExampleProject/platforms/ios/Pods/CleverTap-iOS-SDK/CleverTapSDK/ProductExperiences/CTVar.m new file mode 100644 index 00000000..53499d53 --- /dev/null +++ b/Samples/Cordova/ExampleProject/platforms/ios/Pods/CleverTap-iOS-SDK/CleverTapSDK/ProductExperiences/CTVar.m @@ -0,0 +1,224 @@ +#import "CTVar-Internal.h" +#import "CTVarCache.h" +#import "CTConstants.h" + +static BOOL LPVAR_PRINTED_CALLBACK_WARNING = NO; + +@interface CTVar (PrivateProperties) +@property (nonatomic, strong) CTVarCache *varCache; +@property (nonatomic, strong) NSString *name; +@property (nonatomic, strong) NSArray *nameComponents; +@property (nonatomic, strong) NSString *stringValue; +@property (nonatomic, strong) NSNumber *numberValue; +@property (nonatomic) BOOL hadStarted; +@property (nonatomic, strong) id value; +@property (nonatomic, strong) id defaultValue; +@property (nonatomic, strong) NSString *kind; +@property (nonatomic, strong) NSMutableArray *valueChangedBlocks; +@property (nonatomic) BOOL hasChanged; +@end + +@implementation CTVar + +- (instancetype)initWithName:(NSString *)name withDefaultValue:(NSNumber *)defaultValue + withKind:(NSString *)kind varCache:(CTVarCache *)cache +{ + self = [super init]; + if (self) { + CT_TRY + _name = name; + self.varCache = cache; + _nameComponents = [self.varCache getNameComponents:name]; + _defaultValue = defaultValue; + _value = defaultValue; + _kind = kind; + [self cacheComputedValues]; + + [self.varCache registerVariable:self]; + + [self update]; + CT_END_TRY + } + return self; +} + +// Manually @synthesize since CTVar provides custom getters/setters +// Properties are defined as readonly in CTVar-Internal +// and readwrite in PrivateProperties category +@synthesize stringValue = _stringValue; +@synthesize numberValue = _numberValue; +@synthesize varCache = _varCache; + +- (CTVarCache *)varCache { + return _varCache; +} + +- (void)setVarCache:(CTVarCache *)varCache { + _varCache = varCache; +} + +#pragma mark Updates + +- (void) cacheComputedValues { + // Cache computed values. + if ([_value isKindOfClass:NSString.class]) { + _stringValue = (NSString *) _value; + _numberValue = [NSNumber numberWithDouble:[_stringValue doubleValue]]; + } else if ([_value isKindOfClass:NSNumber.class]) { + _stringValue = [NSString stringWithFormat:@"%@", _value]; + _numberValue = (NSNumber *) _value; + } else { + _stringValue = nil; + _numberValue = nil; + } +} + +- (void)update { + NSObject *oldValue = _value; + _value = [self.varCache getMergedValueFromComponentArray:_nameComponents]; + + if ([_value isEqual:oldValue] && _hadStarted) { + return; + } + [self cacheComputedValues]; + + if (![_value isEqual:oldValue]) { + _hasChanged = YES; + } + + if ([[self varCache] hasVarsRequestCompleted]) { + [self triggerValueChanged]; + _hadStarted = YES; + } +} + +#pragma mark Callbacks + +- (void)triggerValueChanged { + if (self.delegate && + [self.delegate respondsToSelector:@selector(valueDidChange:)]) { + [self.delegate valueDidChange:self]; + } + + for (CleverTapVariablesChangedBlock block in _valueChangedBlocks.copy) { + block(); + } +} + +- (void)onValueChanged:(CleverTapVariablesChangedBlock)block { + if (!block) { + CleverTapLogStaticDebug(@"Nil block parameter provided while calling [CTVar onValueChanged]."); + return; + } + + CT_TRY + if (!_valueChangedBlocks) { + _valueChangedBlocks = [NSMutableArray array]; + } + [_valueChangedBlocks addObject:[block copy]]; + if ([[self varCache] hasVarsRequestCompleted]) { + [self triggerValueChanged]; + } + CT_END_TRY +} + +- (void)setDelegate:(id)delegate { + CT_TRY + _delegate = delegate; + if ([[self varCache] hasVarsRequestCompleted]) { + [self triggerValueChanged]; + } + CT_END_TRY +} + +#pragma mark Dictionary handling + +- (id) objectForKey:(NSString *)key { + return [self objectForKeyPath:key, nil]; +} + +- (id) objectAtIndex:(NSUInteger)index { + return [self objectForKeyPath:@(index), nil]; +} + +- (id) objectForKeyPath:(id)firstComponent, ... { + CT_TRY + [self warnIfNotStarted]; + NSMutableArray *components = [_nameComponents mutableCopy]; + va_list args; + va_start(args, firstComponent); + for (id component = firstComponent; + component != nil; component = va_arg(args, id)) { + [components addObject:component]; + } + va_end(args); + return [self.varCache getMergedValueFromComponentArray:components]; + CT_END_TRY + return nil; +} + +- (id)objectForKeyPathComponents:(NSArray *)pathComponents { + CT_TRY + [self warnIfNotStarted]; + NSMutableArray *components = [_nameComponents mutableCopy]; + [components addObjectsFromArray:pathComponents]; + return [self.varCache getMergedValueFromComponentArray:components]; + CT_END_TRY + return nil; +} + +#pragma mark Value accessors + +- (NSNumber *)numberValue { + [self warnIfNotStarted]; + return _numberValue; +} + +- (NSString *)stringValue { + [self warnIfNotStarted]; + return _stringValue; +} + +- (int)intValue { return [[self numberValue] intValue]; } +- (double)doubleValue { return [[self numberValue] doubleValue];} +- (float)floatValue { return [[self numberValue] floatValue]; } +- (CGFloat)cgFloatValue { return [[self numberValue] doubleValue]; } +- (short)shortValue { return [[self numberValue] shortValue];} +- (BOOL)boolValue { return [[self numberValue] boolValue]; } +- (char)charValue { return [[self numberValue] charValue]; } +- (long)longValue { return [[self numberValue] longValue]; } +- (long long)longLongValue { return [[self numberValue] longLongValue]; } +- (NSInteger)integerValue { return [[self numberValue] integerValue]; } +- (unsigned char)unsignedCharValue { return [[self numberValue] unsignedCharValue]; } +- (unsigned short)unsignedShortValue { return [[self numberValue] unsignedShortValue]; } +- (unsigned int)unsignedIntValue { return [[self numberValue] unsignedIntValue]; } +- (NSUInteger)unsignedIntegerValue { return [[self numberValue] unsignedIntegerValue]; } +- (unsigned long)unsignedLongValue { return [[self numberValue] unsignedLongValue]; } +- (unsigned long long)unsignedLongLongValue { return [[self numberValue] unsignedLongLongValue]; } + +#pragma mark Utils + ++ (BOOL)printedCallbackWarning { + return LPVAR_PRINTED_CALLBACK_WARNING; +} + ++ (void)setPrintedCallbackWarning:(BOOL)newPrintedCallbackWarning { + LPVAR_PRINTED_CALLBACK_WARNING = newPrintedCallbackWarning; +} + +- (void)warnIfNotStarted { + if (!self.varCache.hasVarsRequestCompleted && ![CTVar printedCallbackWarning]) { + CleverTapLogDebug(self.varCache.config.logLevel, @"%@: CleverTap hasn't finished retrieving values from the server. You " + @"should use a callback to make sure the value for '%@' is ready. Otherwise, your " + @"app may not use the most up-to-date value.", self, self.name); + + [CTVar setPrintedCallbackWarning:YES]; + } +} + +- (void)clearState { + _hadStarted = NO; + _hasChanged = NO; +} + +@end diff --git a/Samples/Cordova/ExampleProject/platforms/ios/Pods/CleverTap-iOS-SDK/CleverTapSDK/ProductExperiences/CTVarCache.h b/Samples/Cordova/ExampleProject/platforms/ios/Pods/CleverTap-iOS-SDK/CleverTapSDK/ProductExperiences/CTVarCache.h new file mode 100644 index 00000000..9a8a7996 --- /dev/null +++ b/Samples/Cordova/ExampleProject/platforms/ios/Pods/CleverTap-iOS-SDK/CleverTapSDK/ProductExperiences/CTVarCache.h @@ -0,0 +1,35 @@ +#import +#import "CTVar-Internal.h" +#import "CleverTapInstanceConfig.h" +#import "CTDeviceInfo.h" + +NS_ASSUME_NONNULL_BEGIN + +typedef void (^CacheUpdateBlock)(void); + +NS_SWIFT_NAME(VarCache) +@interface CTVarCache : NSObject + +- (instancetype)init NS_UNAVAILABLE; + +- (instancetype)initWithConfig:(CleverTapInstanceConfig *)config deviceInfo: (CTDeviceInfo*)deviceInfo; + +@property (nonatomic, strong, readonly) CleverTapInstanceConfig *config; +@property (strong, nonatomic) NSMutableDictionary *vars; +@property (assign, nonatomic) BOOL hasVarsRequestCompleted; + +- (nullable NSDictionary *)diffs; +- (void)loadDiffs; +- (void)applyVariableDiffs:(nullable NSDictionary *)diffs_; + +- (void)registerVariable:(CTVar *)var; +- (nullable CTVar *)getVariable:(NSString *)name; +- (id)getMergedValue:(NSString *)name; + +- (NSArray *)getNameComponents:(NSString *)name; +- (nullable id)getMergedValueFromComponentArray:(NSArray *) components; +- (void)clearUserContent; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Samples/Cordova/ExampleProject/platforms/ios/Pods/CleverTap-iOS-SDK/CleverTapSDK/ProductExperiences/CTVarCache.m b/Samples/Cordova/ExampleProject/platforms/ios/Pods/CleverTap-iOS-SDK/CleverTapSDK/ProductExperiences/CTVarCache.m new file mode 100644 index 00000000..959ccc9f --- /dev/null +++ b/Samples/Cordova/ExampleProject/platforms/ios/Pods/CleverTap-iOS-SDK/CleverTapSDK/ProductExperiences/CTVarCache.m @@ -0,0 +1,264 @@ +#import "CTVarCache.h" +#import "CTUtils.h" +#import "CTConstants.h" +#import "CTPreferences.h" +#import "ContentMerger.h" + +@interface CTVarCache() +@property (strong, nonatomic) NSMutableDictionary *valuesFromClient; +@property (strong, nonatomic) id merged; +@property (strong, nonatomic) NSDictionary *diffs; + +@property (strong, nonatomic) CacheUpdateBlock updateBlock; +@property (nonatomic, strong) CleverTapInstanceConfig *config; +@property (nonatomic, strong) CTDeviceInfo *deviceInfo; +@end + +@implementation CTVarCache + +- (instancetype)initWithConfig:(CleverTapInstanceConfig *)config deviceInfo: (CTDeviceInfo*)deviceInfo { + if ((self = [super init])) { + self.config = config; + self.deviceInfo = deviceInfo; + [self initialize]; + } + return self; +} + +- (void)initialize { + self.vars = [NSMutableDictionary dictionary]; + self.diffs = [NSMutableDictionary dictionary]; + self.valuesFromClient = [NSMutableDictionary dictionary]; + self.hasVarsRequestCompleted = NO; +} + +- (NSArray *)getNameComponents:(NSString *)name { + NSArray *nameComponents = [name componentsSeparatedByString:@"."]; + return nameComponents; +} + +- (id)traverse:(id)collection withKey:(id)key autoInsert:(BOOL)autoInsert { + id result = nil; + if ([collection respondsToSelector:@selector(objectForKey:)]) { + result = [collection objectForKey:key]; + if (autoInsert && !result && [key isKindOfClass:NSString.class]) { + result = [NSMutableDictionary dictionary]; + [collection setObject:result forKey:key]; + } + } + + if ([result isKindOfClass:[NSNull class]]) { + return nil; + } + + return result; +} + +// Updates a JSON structure of variable values +- (void)updateValues:(NSString *)name + nameComponents:(NSArray *)nameComponents + value:(id)value + values:(NSMutableDictionary *)values +{ + if (value) { + id valuesPtr = values; + for (int i = 0; i < nameComponents.count - 1; i++) { + valuesPtr = [self traverse:valuesPtr withKey:nameComponents[i] autoInsert:YES]; + } + + // Make the value mutable. That way, if we add a dictionary variable, + // we can still add subvariables. + if ([value isKindOfClass:NSDictionary.class] && + [value class] != [NSMutableDictionary class]) { + value = [NSMutableDictionary dictionaryWithDictionary:value]; + } + + // Do not override variable dictionary values. If value is dictionary and + // already registered variable value is a dictionary, merge them. + // If values are not dictionaries, check if value from another variable will be overridden and log it. + id currentValue = valuesPtr[nameComponents.lastObject]; + if (currentValue && [currentValue isKindOfClass:NSDictionary.class] && [value isKindOfClass:NSMutableDictionary.class]) { + // Merge all entries from both dictionaries. NSMutableDictionary addEntriesFromDictionary: will not work for nested dictionaries. + value = [ContentMerger mergeWithVars:value diff:currentValue]; + } else if (currentValue && ![currentValue isEqual:value]) { + CleverTapLogInfo(self.config.logLevel, @"%@: Variable with name: %@ will override value: %@, with new value: %@.", self, name, currentValue, value); + } + + [valuesPtr setObject:value forKey:nameComponents.lastObject]; + } +} + +// Merge default variable value with VarCache.merged value +// This is neccessary if variable was registered after VarCache.applyVariableDiffs +- (void)mergeVariable:(CTVar * _Nonnull)var { + if (!self.merged || ![self.merged isKindOfClass:[NSMutableDictionary class]]) { + return; + } + + NSString *firstComponent = var.nameComponents.firstObject; + id defaultValue = [self.valuesFromClient objectForKey:firstComponent]; + id mergedValue = [self.merged objectForKey:firstComponent]; + + BOOL shouldMerge = (!defaultValue && mergedValue) || + (defaultValue && ![defaultValue isEqual:mergedValue]); + if (shouldMerge) { + id newValue = [ContentMerger mergeWithVars:defaultValue diff:mergedValue]; + if (newValue == nil) { + return; + } + [self.merged setObject:newValue forKey:firstComponent]; + + NSMutableString *name = [[NSMutableString alloc] initWithString:firstComponent]; + for (int i = 1; i < var.nameComponents.count; i++) + { + CTVar *existingVar = self.vars[name]; + if (existingVar) { + [existingVar update]; + break; + } + [name appendFormat:@".%@", var.nameComponents[i]]; + } + } +} + +- (void)registerVariable:(CTVar *)var { + [self.vars setObject:var forKey:var.name]; + + [self updateValues:var.name + nameComponents:var.nameComponents + value:var.defaultValue + values:self.valuesFromClient]; + + [self mergeVariable:var]; +} + +- (CTVar *)getVariable:(NSString *)name { + return [self.vars objectForKey:name]; +} + +- (id)getMergedValue:(NSString *)name { + NSArray *components = [self getNameComponents:name]; + id value = [self getMergedValueFromComponentArray:components]; + if ([value conformsToProtocol:@protocol(NSCopying)] && [value respondsToSelector:@selector(copyWithZone:)]) { + if ([value respondsToSelector:@selector(mutableCopyWithZone:)]) { + return [value mutableCopy]; + } + return [value copy]; + } + + return value; +} + +- (id)getValueFromComponentArray:(NSArray *) components fromDict:(NSDictionary *)values { + id mergedPtr = values; + for (id component in components) { + mergedPtr = [self traverse:mergedPtr withKey:component autoInsert:NO]; + } + return mergedPtr; +} + +- (id)getMergedValueFromComponentArray:(NSArray *)components { + return [self getValueFromComponentArray:components fromDict:self.merged ? self.merged : self.valuesFromClient]; +} + +- (void)loadDiffs { + @try { + NSString *fileName = [self dataArchiveFileName]; + NSString *filePath = [CTPreferences filePathfromFileName:fileName]; + NSData *diffsData = [NSData dataWithContentsOfFile:filePath]; + if (!diffsData) { + [self applyVariableDiffs:@{}]; + return; + } + NSKeyedUnarchiver *unarchiver; + if (@available(iOS 12.0, *)) { + NSError *error = nil; + unarchiver = [[NSKeyedUnarchiver alloc] initForReadingFromData:diffsData error:&error]; + if (error != nil) { + CleverTapLogDebug(self.config.logLevel, @"%@: Error while loading variables: %@", self, error.localizedDescription); + return; + } + unarchiver.requiresSecureCoding = NO; + } else { +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" + unarchiver = [[NSKeyedUnarchiver alloc] initForReadingWithData:diffsData]; +#pragma clang diagnostic pop + } + NSDictionary *diffs = (NSDictionary *) [unarchiver decodeObjectForKey:CLEVERTAP_DEFAULTS_VARIABLES_KEY]; + + [self applyVariableDiffs:diffs]; + } @catch (NSException *exception) { + CleverTapLogDebug(self.config.logLevel, @"%@: Error while loading variables: %@", self, exception.debugDescription); + } +} + +- (void)saveDiffs { + // Stores the variables on the device in case we don't have a connection. + // Restores next time when the app is opened. + // Diffs need to be locked incase other thread changes the diffs + @synchronized (self.diffs) { + NSMutableData *diffsData = [[NSMutableData alloc] init]; +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" + NSKeyedArchiver *archiver = [[NSKeyedArchiver alloc] initForWritingWithMutableData:diffsData]; +#pragma clang diagnostic pop + [archiver encodeObject:self.diffs forKey:CLEVERTAP_DEFAULTS_VARIABLES_KEY]; + [archiver finishEncoding]; + + NSError *writeError = nil; + NSString *fileName = [self dataArchiveFileName]; + NSString *filePath = [CTPreferences filePathfromFileName:fileName]; + [diffsData writeToFile:filePath options:NSDataWritingAtomic error:&writeError]; + if (writeError) { + CleverTapLogStaticInternal(@"%@ failed to write data at %@: %@", self, filePath, writeError); + } + } +} + +- (NSString*)dataArchiveFileName { + return [NSString stringWithFormat:@"clevertap-%@-%@-pe-vars.plist", _config.accountId, _deviceInfo.deviceId]; +} + +- (void)applyVariableDiffs:(NSDictionary *)diffs_ { + CleverTapLogDebug(self.config.logLevel, @"%@: Applying Variables: %@", self, diffs_); + @synchronized (self.vars) { + // Prevent overriding variables if API returns null + // If no variables are defined, API returns {} + if (diffs_ != nil && ![diffs_ isEqual:[NSNull null]]) { + self.diffs = diffs_; + + // We need to lock it in case multiple threads will be accessing this. + @synchronized (self.diffs) { + self.merged = [ContentMerger mergeWithVars:self.valuesFromClient diff:self.diffs]; + } + + // Update variables with new values. + // Have to extract the keys because a dictionary variable may add a new sub-variable, + // modifying the variable dictionary. + for (NSString *name in [self.vars allKeys]) { + [self.vars[name] update]; + } + } else { + CleverTapLogDebug(self.config.logLevel, @"%@: No variables received from the server", self); + } + + // Do NOT save diffs when loading from cache + // Load diffs is called before vars request has been sent + if (self.hasVarsRequestCompleted) { + [self saveDiffs]; + } + } +} + +- (void)clearUserContent { + // Disable callbacks and wait until fetch is finished + [self setHasVarsRequestCompleted:NO]; + // Clear Var state to allow callback invocation when server values are downloaded + [self.vars enumerateKeysAndObjectsUsingBlock:^(NSString * _Nonnull key, id _Nonnull obj, BOOL * _Nonnull stop) { + CTVar *var = (CTVar *)obj; + [var clearState]; + }]; +} + +@end diff --git a/Samples/Cordova/ExampleProject/platforms/ios/Pods/CleverTap-iOS-SDK/CleverTapSDK/ProductExperiences/CTVariables.h b/Samples/Cordova/ExampleProject/platforms/ios/Pods/CleverTap-iOS-SDK/CleverTapSDK/ProductExperiences/CTVariables.h new file mode 100644 index 00000000..251d23fa --- /dev/null +++ b/Samples/Cordova/ExampleProject/platforms/ios/Pods/CleverTap-iOS-SDK/CleverTapSDK/ProductExperiences/CTVariables.h @@ -0,0 +1,40 @@ +// +// CTVariables.h +// CleverTapSDK +// +// Created by Nikola Zagorchev on 12.03.23. +// Copyright © 2023 CleverTap. All rights reserved. +// + +#import +#import "CTVarCache.h" +#import "CleverTapInstanceConfig.h" +#import "CTDeviceInfo.h" + +NS_ASSUME_NONNULL_BEGIN + +@interface CTVariables : NSObject + +@property(strong, nonatomic) CTVarCache *varCache; +@property(strong, nonatomic, nullable) CleverTapFetchVariablesBlock fetchVariablesBlock; + +- (instancetype)initWithConfig:(CleverTapInstanceConfig *)config deviceInfo: (CTDeviceInfo *)deviceInfo; + +- (CTVar *)define:(NSString *)name + with:(nullable NSObject *)defaultValue + kind:(nullable NSString *)kind +NS_SWIFT_NAME(define(name:value:kind:)); + +- (void)handleVariablesResponse:(NSDictionary *)varsResponse; +- (void)handleVariablesError; +- (void)triggerFetchVariables:(BOOL)success; +- (void)onVariablesChanged:(CleverTapVariablesChangedBlock _Nonnull)block; +- (void)onceVariablesChanged:(CleverTapVariablesChangedBlock _Nonnull)block; +- (NSDictionary*)flatten:(NSDictionary*)map varName:(NSString*)varName; +- (NSDictionary*)varsPayload; +- (NSDictionary*)unflatten:(NSDictionary*)result; +- (void)clearUserContent; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Samples/Cordova/ExampleProject/platforms/ios/Pods/CleverTap-iOS-SDK/CleverTapSDK/ProductExperiences/CTVariables.m b/Samples/Cordova/ExampleProject/platforms/ios/Pods/CleverTap-iOS-SDK/CleverTapSDK/ProductExperiences/CTVariables.m new file mode 100644 index 00000000..fc607283 --- /dev/null +++ b/Samples/Cordova/ExampleProject/platforms/ios/Pods/CleverTap-iOS-SDK/CleverTapSDK/ProductExperiences/CTVariables.m @@ -0,0 +1,255 @@ +// +// CTVariables.m +// CleverTapSDK +// +// Created by Nikola Zagorchev on 12.03.23. +// Copyright © 2023 CleverTap. All rights reserved. +// + +#import "CTVariables.h" +#import "CTConstants.h" +#import "CTUtils.h" + +@interface CTVariables() +@property (nonatomic, strong) CleverTapInstanceConfig *config; +@property (nonatomic, strong) CTDeviceInfo *deviceInfo; + +@property(strong, nonatomic) NSMutableArray *variablesChangedBlocks; +@property(strong, nonatomic) NSMutableArray *onceVariablesChangedBlocks; + +@end + +@implementation CTVariables + +- (instancetype)initWithConfig:(CleverTapInstanceConfig *)config deviceInfo: (CTDeviceInfo*)deviceInfo { + if ((self = [super init])) { + self.varCache = [[CTVarCache alloc] initWithConfig:config deviceInfo:deviceInfo]; + } + return self; +} + +#pragma mark Define Var +- (CTVar *)define:(NSString *)name with:(NSObject *)defaultValue kind:(NSString *)kind { + if ([CTUtils isNullOrEmpty:name]) { + CleverTapLogDebug(_config.logLevel, @"%@: Empty name provided as parameter while defining a variable.", self); + return nil; + } + + if ([name hasPrefix:@"."] || [name hasSuffix:@"."]) { + CleverTapLogDebug(_config.logLevel, @"%@: Variable name starts or ends with a `.` which is not allowed.", self); + return nil; + } + + @synchronized (self.varCache.vars) { + CT_TRY + CTVar *existing = [self.varCache getVariable:name]; + if (existing) { + return existing; + } + CT_END_TRY + CTVar *var = [[CTVar alloc] initWithName:name + withDefaultValue:defaultValue + withKind:kind + varCache:self.varCache]; + return var; + } +} + +#pragma mark Handle Response +- (void)handleVariablesResponse:(NSDictionary *)varsResponse { + if (varsResponse) { + CleverTapLogDebug(self.config.logLevel, @"%@: Handle Variables Response with: %@", self, varsResponse); + [[self varCache] setHasVarsRequestCompleted:YES]; + NSDictionary *values = [self unflatten:varsResponse]; + [[self varCache] applyVariableDiffs:values]; + [self triggerVariablesChanged]; + [self triggerFetchVariables:YES]; + } +} + +- (void)handleVariablesError { + CleverTapLogDebug(self.config.logLevel, @"%@: Handle Variables Error", self); + if (![[self varCache] hasVarsRequestCompleted]) { + [[self varCache] setHasVarsRequestCompleted:YES]; + // Ensure variables are loaded from cache. Triggers individual Vars update. + [[self varCache] loadDiffs]; + [self triggerVariablesChanged]; + } + + if (self.fetchVariablesBlock) { + [self triggerFetchVariables:NO]; + } +} + +- (void)clearUserContent { + [self.varCache clearUserContent]; +} + +#pragma mark Triggers +- (void)triggerFetchVariables:(BOOL)success { + if (self.fetchVariablesBlock) { + CleverTapFetchVariablesBlock block = [self.fetchVariablesBlock copy]; + if (![NSThread isMainThread]) { + dispatch_async(dispatch_get_main_queue(), ^{ + block(success); + }); + } else { + block(success); + } + // The callback will be overridden by subsequent fetch call, + // if the first one has not completed yet. + // Callback cannot be attached to an individual fetch request, only to the queue batch. + self.fetchVariablesBlock = nil; + } +} + +- (void)triggerVariablesChanged { + if (![NSThread isMainThread]) { + dispatch_async(dispatch_get_main_queue(), ^{ + [self triggerVariablesChanged]; + }); + return; + } + + for (CleverTapVariablesChangedBlock block in self.variablesChangedBlocks.copy) { + block(); + } + + NSArray *onceBlocksCopy; + @synchronized (self.onceVariablesChangedBlocks) { + onceBlocksCopy = self.onceVariablesChangedBlocks.copy; + [self.onceVariablesChangedBlocks removeAllObjects]; + } + for (CleverTapVariablesChangedBlock block in onceBlocksCopy) { + block(); + } +} + +- (void)onVariablesChanged:(CleverTapVariablesChangedBlock _Nonnull)block { + if (!block) { + CleverTapLogStaticDebug(@"Nil block parameter provided while calling [CleverTap onVariablesChanged]."); + return; + } + + CT_TRY + if (!self.variablesChangedBlocks) { + self.variablesChangedBlocks = [NSMutableArray array]; + } + [self.variablesChangedBlocks addObject:[block copy]]; + CT_END_TRY + + if ([self.varCache hasVarsRequestCompleted]) { + block(); + } +} + +- (void)onceVariablesChanged:(CleverTapVariablesChangedBlock _Nonnull)block { + if (!block) { + CleverTapLogStaticDebug(@"Nil block parameter provided while calling [CleverTap onceVariablesChanged]."); + return; + } + + if ([self.varCache hasVarsRequestCompleted]) { + block(); + } else { + CT_TRY + static dispatch_once_t onceBlocksToken; + dispatch_once(&onceBlocksToken, ^{ + self.onceVariablesChangedBlocks = [NSMutableArray array]; + }); + @synchronized (self.onceVariablesChangedBlocks) { + [self.onceVariablesChangedBlocks addObject:[block copy]]; + } + CT_END_TRY + } +} + +#pragma mark Vars Payload +- (NSDictionary*)varsPayload { + NSMutableDictionary *payload = [NSMutableDictionary dictionary]; + payload[@"type"] = CT_PE_VARS_PAYLOAD_TYPE; + + NSMutableDictionary *allVars = [NSMutableDictionary dictionary]; + + [self.varCache.vars + enumerateKeysAndObjectsUsingBlock:^(NSString * _Nonnull key, CTVar * _Nonnull variable, BOOL * _Nonnull stop) { + + NSMutableDictionary *varData = [NSMutableDictionary dictionary]; + + if ([variable.defaultValue isKindOfClass:[NSDictionary class]]) { + NSDictionary *flattenedMap = [self flatten:variable.defaultValue varName:variable.name]; + [allVars addEntriesFromDictionary:flattenedMap]; + } + else { + if ([variable.kind isEqualToString:CT_KIND_INT] || [variable.kind isEqualToString:CT_KIND_FLOAT]) { + varData[CT_PE_VAR_TYPE] = CT_PE_NUMBER_TYPE; + } + else if ([variable.kind isEqualToString:CT_KIND_BOOLEAN]) { + varData[CT_PE_VAR_TYPE] = CT_PE_BOOL_TYPE; + } + else { + varData[CT_PE_VAR_TYPE] = variable.kind; + } + varData[CT_PE_DEFAULT_VALUE] = variable.defaultValue; + allVars[key] = varData; + } + }]; + payload[CT_PE_VARS_PAYLOAD_KEY] = allVars; + + return payload; +} + +- (NSDictionary*)flatten:(NSDictionary*)map varName:(NSString*)varName { + NSMutableDictionary *varsPayload = [NSMutableDictionary dictionary]; + + [map enumerateKeysAndObjectsUsingBlock:^(NSString* _Nonnull key, id _Nonnull value, BOOL * _Nonnull stop) { + if ([value isKindOfClass:[NSString class]] || + [value isKindOfClass:[NSNumber class]]) { + NSString *flatKey = [NSString stringWithFormat:@"%@.%@", varName, key]; + varsPayload[flatKey] = @{ CT_PE_DEFAULT_VALUE: value }; + } else if ([value isKindOfClass:[NSDictionary class]]) { + NSString *flatKey = [NSString stringWithFormat:@"%@.%@", varName, key]; + NSDictionary* flattenedMap = [self flatten:value varName:flatKey]; + [varsPayload addEntriesFromDictionary:flattenedMap]; + } + }]; + + return varsPayload; +} + +- (NSDictionary*)unflatten:(NSDictionary*)flatDictionary { + if (!flatDictionary) { + return nil; + } + + NSMutableDictionary *unflattenVars = [NSMutableDictionary dictionary]; + [flatDictionary enumerateKeysAndObjectsUsingBlock:^(NSString* _Nonnull key, id _Nonnull value, BOOL * _Nonnull stop) { + if ([key containsString:@"."]) { + NSArray *components = [self.varCache getNameComponents:key]; + NSMutableDictionary *currentMap = unflattenVars; + NSString *lastComponent = [components lastObject]; + + for (int i = 0; i < components.count - 1; i++) { + NSString *component = components[i]; + if (!currentMap[component]) { + NSMutableDictionary *nestedMap = [NSMutableDictionary dictionary]; + currentMap[component] = nestedMap; + currentMap = nestedMap; + } + else { + currentMap = ((NSMutableDictionary*)currentMap[component]); + } + } + if ([currentMap isKindOfClass:[NSMutableDictionary class]]) { + currentMap[lastComponent] = value; + } + } + else { + unflattenVars[key] = value; + } + }]; + + return unflattenVars; +} + +@end diff --git a/Samples/Cordova/ExampleProject/platforms/ios/Pods/CleverTap-iOS-SDK/CleverTapSDK/ProductExperiences/ContentMerger.h b/Samples/Cordova/ExampleProject/platforms/ios/Pods/CleverTap-iOS-SDK/CleverTapSDK/ProductExperiences/ContentMerger.h new file mode 100644 index 00000000..92077a76 --- /dev/null +++ b/Samples/Cordova/ExampleProject/platforms/ios/Pods/CleverTap-iOS-SDK/CleverTapSDK/ProductExperiences/ContentMerger.h @@ -0,0 +1,13 @@ +// +// ContentMerger.h +// CleverTapSDK +// +// Created by Akash Malhotra on 17/02/23. +// Copyright © 2023 CleverTap. All rights reserved. +// + +#import + +@interface ContentMerger : NSObject ++ (id)mergeWithVars:(id)vars diff:(id)diff; +@end diff --git a/Samples/Cordova/ExampleProject/platforms/ios/Pods/CleverTap-iOS-SDK/CleverTapSDK/ProductExperiences/ContentMerger.m b/Samples/Cordova/ExampleProject/platforms/ios/Pods/CleverTap-iOS-SDK/CleverTapSDK/ProductExperiences/ContentMerger.m new file mode 100644 index 00000000..9a391b5e --- /dev/null +++ b/Samples/Cordova/ExampleProject/platforms/ios/Pods/CleverTap-iOS-SDK/CleverTapSDK/ProductExperiences/ContentMerger.m @@ -0,0 +1,60 @@ +// +// ContentMerger.m +// CleverTapSDK +// +// Created by Nikola Zagorchev on 12.03.23. +// Copyright © 2023 CleverTap. All rights reserved. +// + +#import "ContentMerger.h" + +@implementation ContentMerger + ++ (id)mergeWithVars:(id)vars diff:(id)diff { + if (!diff) { + return vars; + } + + // Return the modified value if it is a `primitive` + if ([diff isKindOfClass:[NSNumber class]] || + [diff isKindOfClass:[NSString class]] || + [diff isKindOfClass:[NSNull class]]) { + return diff; + } + if ([vars isKindOfClass:[NSNumber class]] || + [vars isKindOfClass:[NSString class]] || + [vars isKindOfClass:[NSNull class]]) { + return diff; + } + + // Return nil if neither vars nor diff is dictionary. + // Use isKindOfClass: to check first. Note that (NSDictionary *) cast will succeed if object is NSArray*. + if (![vars isKindOfClass:[NSDictionary class]] && ![diff isKindOfClass:[NSDictionary class]]) { + return nil; + } + + if (![vars isKindOfClass:[NSDictionary class]]) { + // diff is dictionary + return diff; + } + + // vars is dictionary + NSMutableDictionary *merged = [NSMutableDictionary dictionaryWithDictionary:vars]; + if (![diff isKindOfClass:[NSDictionary class]]) { + return merged; + } + + // vars and diff are dictionary + NSDictionary *diffDict = (NSDictionary *)diff; + [diffDict enumerateKeysAndObjectsUsingBlock:^(id key, id value, BOOL *stop) { + id defaultValue = merged[key]; + id mergedValue = [self mergeWithVars:defaultValue diff:value]; + if (mergedValue) { + merged[key] = mergedValue; + } + }]; + + return merged; +} + +@end diff --git a/Samples/Cordova/ExampleProject/platforms/ios/Pods/CleverTap-iOS-SDK/CleverTapSDK/include/CTLocalInApp.h b/Samples/Cordova/ExampleProject/platforms/ios/Pods/CleverTap-iOS-SDK/CleverTapSDK/include/CTLocalInApp.h deleted file mode 120000 index 8137851f..00000000 --- a/Samples/Cordova/ExampleProject/platforms/ios/Pods/CleverTap-iOS-SDK/CleverTapSDK/include/CTLocalInApp.h +++ /dev/null @@ -1 +0,0 @@ -../InApps/CTLocalInApp.h \ No newline at end of file diff --git a/Samples/Cordova/ExampleProject/platforms/ios/Pods/CleverTap-iOS-SDK/CleverTapSDK/include/CleverTap+DisplayUnit.h b/Samples/Cordova/ExampleProject/platforms/ios/Pods/CleverTap-iOS-SDK/CleverTapSDK/include/CleverTap+DisplayUnit.h deleted file mode 120000 index 824f1d3d..00000000 --- a/Samples/Cordova/ExampleProject/platforms/ios/Pods/CleverTap-iOS-SDK/CleverTapSDK/include/CleverTap+DisplayUnit.h +++ /dev/null @@ -1 +0,0 @@ -../CleverTap+DisplayUnit.h \ No newline at end of file diff --git a/Samples/Cordova/ExampleProject/platforms/ios/Pods/CleverTap-iOS-SDK/CleverTapSDK/include/CleverTap+FeatureFlags.h b/Samples/Cordova/ExampleProject/platforms/ios/Pods/CleverTap-iOS-SDK/CleverTapSDK/include/CleverTap+FeatureFlags.h deleted file mode 120000 index 08fe3ae6..00000000 --- a/Samples/Cordova/ExampleProject/platforms/ios/Pods/CleverTap-iOS-SDK/CleverTapSDK/include/CleverTap+FeatureFlags.h +++ /dev/null @@ -1 +0,0 @@ -../CleverTap+FeatureFlags.h \ No newline at end of file diff --git a/Samples/Cordova/ExampleProject/platforms/ios/Pods/CleverTap-iOS-SDK/CleverTapSDK/include/CleverTap+InAppNotifications.h b/Samples/Cordova/ExampleProject/platforms/ios/Pods/CleverTap-iOS-SDK/CleverTapSDK/include/CleverTap+InAppNotifications.h deleted file mode 120000 index a54857ef..00000000 --- a/Samples/Cordova/ExampleProject/platforms/ios/Pods/CleverTap-iOS-SDK/CleverTapSDK/include/CleverTap+InAppNotifications.h +++ /dev/null @@ -1 +0,0 @@ -../CleverTap+InAppNotifications.h \ No newline at end of file diff --git a/Samples/Cordova/ExampleProject/platforms/ios/Pods/CleverTap-iOS-SDK/CleverTapSDK/include/CleverTap+Inbox.h b/Samples/Cordova/ExampleProject/platforms/ios/Pods/CleverTap-iOS-SDK/CleverTapSDK/include/CleverTap+Inbox.h deleted file mode 120000 index 92e24140..00000000 --- a/Samples/Cordova/ExampleProject/platforms/ios/Pods/CleverTap-iOS-SDK/CleverTapSDK/include/CleverTap+Inbox.h +++ /dev/null @@ -1 +0,0 @@ -../CleverTap+Inbox.h \ No newline at end of file diff --git a/Samples/Cordova/ExampleProject/platforms/ios/Pods/CleverTap-iOS-SDK/CleverTapSDK/include/CleverTap+ProductConfig.h b/Samples/Cordova/ExampleProject/platforms/ios/Pods/CleverTap-iOS-SDK/CleverTapSDK/include/CleverTap+ProductConfig.h deleted file mode 120000 index 03e7172e..00000000 --- a/Samples/Cordova/ExampleProject/platforms/ios/Pods/CleverTap-iOS-SDK/CleverTapSDK/include/CleverTap+ProductConfig.h +++ /dev/null @@ -1 +0,0 @@ -../CleverTap+ProductConfig.h \ No newline at end of file diff --git a/Samples/Cordova/ExampleProject/platforms/ios/Pods/CleverTap-iOS-SDK/CleverTapSDK/include/CleverTap+PushPermission.h b/Samples/Cordova/ExampleProject/platforms/ios/Pods/CleverTap-iOS-SDK/CleverTapSDK/include/CleverTap+PushPermission.h deleted file mode 120000 index 404aebb5..00000000 --- a/Samples/Cordova/ExampleProject/platforms/ios/Pods/CleverTap-iOS-SDK/CleverTapSDK/include/CleverTap+PushPermission.h +++ /dev/null @@ -1 +0,0 @@ -../CleverTap+PushPermission.h \ No newline at end of file diff --git a/Samples/Cordova/ExampleProject/platforms/ios/Pods/CleverTap-iOS-SDK/CleverTapSDK/include/CleverTap+SCDomain.h b/Samples/Cordova/ExampleProject/platforms/ios/Pods/CleverTap-iOS-SDK/CleverTapSDK/include/CleverTap+SCDomain.h deleted file mode 120000 index c0cfdb8a..00000000 --- a/Samples/Cordova/ExampleProject/platforms/ios/Pods/CleverTap-iOS-SDK/CleverTapSDK/include/CleverTap+SCDomain.h +++ /dev/null @@ -1 +0,0 @@ -../CleverTap+SCDomain.h \ No newline at end of file diff --git a/Samples/Cordova/ExampleProject/platforms/ios/Pods/CleverTap-iOS-SDK/CleverTapSDK/include/CleverTap+SSLPinning.h b/Samples/Cordova/ExampleProject/platforms/ios/Pods/CleverTap-iOS-SDK/CleverTapSDK/include/CleverTap+SSLPinning.h deleted file mode 120000 index 4abe21cd..00000000 --- a/Samples/Cordova/ExampleProject/platforms/ios/Pods/CleverTap-iOS-SDK/CleverTapSDK/include/CleverTap+SSLPinning.h +++ /dev/null @@ -1 +0,0 @@ -../CleverTap+SSLPinning.h \ No newline at end of file diff --git a/Samples/Cordova/ExampleProject/platforms/ios/Pods/CleverTap-iOS-SDK/CleverTapSDK/include/CleverTap.h b/Samples/Cordova/ExampleProject/platforms/ios/Pods/CleverTap-iOS-SDK/CleverTapSDK/include/CleverTap.h deleted file mode 120000 index 7beaf92a..00000000 --- a/Samples/Cordova/ExampleProject/platforms/ios/Pods/CleverTap-iOS-SDK/CleverTapSDK/include/CleverTap.h +++ /dev/null @@ -1 +0,0 @@ -../CleverTap.h \ No newline at end of file diff --git a/Samples/Cordova/ExampleProject/platforms/ios/Pods/CleverTap-iOS-SDK/CleverTapSDK/include/CleverTapBuildInfo.h b/Samples/Cordova/ExampleProject/platforms/ios/Pods/CleverTap-iOS-SDK/CleverTapSDK/include/CleverTapBuildInfo.h deleted file mode 120000 index bb4a07f8..00000000 --- a/Samples/Cordova/ExampleProject/platforms/ios/Pods/CleverTap-iOS-SDK/CleverTapSDK/include/CleverTapBuildInfo.h +++ /dev/null @@ -1 +0,0 @@ -../CleverTapBuildInfo.h \ No newline at end of file diff --git a/Samples/Cordova/ExampleProject/platforms/ios/Pods/CleverTap-iOS-SDK/CleverTapSDK/include/CleverTapEventDetail.h b/Samples/Cordova/ExampleProject/platforms/ios/Pods/CleverTap-iOS-SDK/CleverTapSDK/include/CleverTapEventDetail.h deleted file mode 120000 index 3bb7bef3..00000000 --- a/Samples/Cordova/ExampleProject/platforms/ios/Pods/CleverTap-iOS-SDK/CleverTapSDK/include/CleverTapEventDetail.h +++ /dev/null @@ -1 +0,0 @@ -../CleverTapEventDetail.h \ No newline at end of file diff --git a/Samples/Cordova/ExampleProject/platforms/ios/Pods/CleverTap-iOS-SDK/CleverTapSDK/include/CleverTapInAppNotificationDelegate.h b/Samples/Cordova/ExampleProject/platforms/ios/Pods/CleverTap-iOS-SDK/CleverTapSDK/include/CleverTapInAppNotificationDelegate.h deleted file mode 120000 index dc6fc15a..00000000 --- a/Samples/Cordova/ExampleProject/platforms/ios/Pods/CleverTap-iOS-SDK/CleverTapSDK/include/CleverTapInAppNotificationDelegate.h +++ /dev/null @@ -1 +0,0 @@ -../CleverTapInAppNotificationDelegate.h \ No newline at end of file diff --git a/Samples/Cordova/ExampleProject/platforms/ios/Pods/CleverTap-iOS-SDK/CleverTapSDK/include/CleverTapInstanceConfig.h b/Samples/Cordova/ExampleProject/platforms/ios/Pods/CleverTap-iOS-SDK/CleverTapSDK/include/CleverTapInstanceConfig.h deleted file mode 120000 index d70da98d..00000000 --- a/Samples/Cordova/ExampleProject/platforms/ios/Pods/CleverTap-iOS-SDK/CleverTapSDK/include/CleverTapInstanceConfig.h +++ /dev/null @@ -1 +0,0 @@ -../CleverTapInstanceConfig.h \ No newline at end of file diff --git a/Samples/Cordova/ExampleProject/platforms/ios/Pods/CleverTap-iOS-SDK/CleverTapSDK/include/CleverTapJSInterface.h b/Samples/Cordova/ExampleProject/platforms/ios/Pods/CleverTap-iOS-SDK/CleverTapSDK/include/CleverTapJSInterface.h deleted file mode 120000 index ddd02437..00000000 --- a/Samples/Cordova/ExampleProject/platforms/ios/Pods/CleverTap-iOS-SDK/CleverTapSDK/include/CleverTapJSInterface.h +++ /dev/null @@ -1 +0,0 @@ -../CleverTapJSInterface.h \ No newline at end of file diff --git a/Samples/Cordova/ExampleProject/platforms/ios/Pods/CleverTap-iOS-SDK/CleverTapSDK/include/CleverTapPushNotificationDelegate.h b/Samples/Cordova/ExampleProject/platforms/ios/Pods/CleverTap-iOS-SDK/CleverTapSDK/include/CleverTapPushNotificationDelegate.h deleted file mode 120000 index 3a2996f0..00000000 --- a/Samples/Cordova/ExampleProject/platforms/ios/Pods/CleverTap-iOS-SDK/CleverTapSDK/include/CleverTapPushNotificationDelegate.h +++ /dev/null @@ -1 +0,0 @@ -../CleverTapPushNotificationDelegate.h \ No newline at end of file diff --git a/Samples/Cordova/ExampleProject/platforms/ios/Pods/CleverTap-iOS-SDK/CleverTapSDK/include/CleverTapSyncDelegate.h b/Samples/Cordova/ExampleProject/platforms/ios/Pods/CleverTap-iOS-SDK/CleverTapSDK/include/CleverTapSyncDelegate.h deleted file mode 120000 index d814f1f5..00000000 --- a/Samples/Cordova/ExampleProject/platforms/ios/Pods/CleverTap-iOS-SDK/CleverTapSDK/include/CleverTapSyncDelegate.h +++ /dev/null @@ -1 +0,0 @@ -../CleverTapSyncDelegate.h \ No newline at end of file diff --git a/Samples/Cordova/ExampleProject/platforms/ios/Pods/CleverTap-iOS-SDK/CleverTapSDK/include/CleverTapTrackedViewController.h b/Samples/Cordova/ExampleProject/platforms/ios/Pods/CleverTap-iOS-SDK/CleverTapSDK/include/CleverTapTrackedViewController.h deleted file mode 120000 index a6fb5881..00000000 --- a/Samples/Cordova/ExampleProject/platforms/ios/Pods/CleverTap-iOS-SDK/CleverTapSDK/include/CleverTapTrackedViewController.h +++ /dev/null @@ -1 +0,0 @@ -../CleverTapTrackedViewController.h \ No newline at end of file diff --git a/Samples/Cordova/ExampleProject/platforms/ios/Pods/CleverTap-iOS-SDK/CleverTapSDK/include/CleverTapURLDelegate.h b/Samples/Cordova/ExampleProject/platforms/ios/Pods/CleverTap-iOS-SDK/CleverTapSDK/include/CleverTapURLDelegate.h deleted file mode 120000 index e9218f23..00000000 --- a/Samples/Cordova/ExampleProject/platforms/ios/Pods/CleverTap-iOS-SDK/CleverTapSDK/include/CleverTapURLDelegate.h +++ /dev/null @@ -1 +0,0 @@ -../CleverTapURLDelegate.h \ No newline at end of file diff --git a/Samples/Cordova/ExampleProject/platforms/ios/Pods/CleverTap-iOS-SDK/CleverTapSDK/include/CleverTapUTMDetail.h b/Samples/Cordova/ExampleProject/platforms/ios/Pods/CleverTap-iOS-SDK/CleverTapSDK/include/CleverTapUTMDetail.h deleted file mode 120000 index 4a907f17..00000000 --- a/Samples/Cordova/ExampleProject/platforms/ios/Pods/CleverTap-iOS-SDK/CleverTapSDK/include/CleverTapUTMDetail.h +++ /dev/null @@ -1 +0,0 @@ -../CleverTapUTMDetail.h \ No newline at end of file diff --git a/Samples/Cordova/ExampleProject/platforms/ios/Pods/CleverTap-iOS-SDK/README.md b/Samples/Cordova/ExampleProject/platforms/ios/Pods/CleverTap-iOS-SDK/README.md index fe514d6e..1c560a99 100644 --- a/Samples/Cordova/ExampleProject/platforms/ios/Pods/CleverTap-iOS-SDK/README.md +++ b/Samples/Cordova/ExampleProject/platforms/ios/Pods/CleverTap-iOS-SDK/README.md @@ -67,6 +67,10 @@ CleverTap Geofence SDK provides Geofencing capabilities to CleverTap iOS SDK. To CleverTap iOS SDK supports Push Primer for push notification runtime permission, refer [Push Primer doc](/docs/PushPrimer.md) for more details. +## Remote Config Variables + +CleverTap iOS SDK supports creating remote config variables, refer [Remote Config Variables](/docs/Variables.md) for more details and usage examples. + ## 𝌡 Example Usage * A [demo application](/ObjCStarter) showing the integration of our SDK in Objective-C language. * A [demo application](/SwiftStarter) showing the integration of our SDK in Swift language. diff --git a/Samples/Cordova/ExampleProject/platforms/ios/Pods/Headers/Private/CleverTap-iOS-SDK/CTDomainFactory.h b/Samples/Cordova/ExampleProject/platforms/ios/Pods/Headers/Private/CleverTap-iOS-SDK/CTDomainFactory.h new file mode 120000 index 00000000..9727b705 --- /dev/null +++ b/Samples/Cordova/ExampleProject/platforms/ios/Pods/Headers/Private/CleverTap-iOS-SDK/CTDomainFactory.h @@ -0,0 +1 @@ +../../../CleverTap-iOS-SDK/CleverTapSDK/CTDomainFactory.h \ No newline at end of file diff --git a/Samples/Cordova/ExampleProject/platforms/ios/Pods/Headers/Private/CleverTap-iOS-SDK/CTLocalInApp.h b/Samples/Cordova/ExampleProject/platforms/ios/Pods/Headers/Private/CleverTap-iOS-SDK/CTLocalInApp.h index a04f794c..5777405e 120000 --- a/Samples/Cordova/ExampleProject/platforms/ios/Pods/Headers/Private/CleverTap-iOS-SDK/CTLocalInApp.h +++ b/Samples/Cordova/ExampleProject/platforms/ios/Pods/Headers/Private/CleverTap-iOS-SDK/CTLocalInApp.h @@ -1 +1 @@ -../../../CleverTap-iOS-SDK/CleverTapSDK/include/CTLocalInApp.h \ No newline at end of file +../../../CleverTap-iOS-SDK/CleverTapSDK/InApps/CTLocalInApp.h \ No newline at end of file diff --git a/Samples/Cordova/ExampleProject/platforms/ios/Pods/Headers/Private/CleverTap-iOS-SDK/CTLocationManager.h b/Samples/Cordova/ExampleProject/platforms/ios/Pods/Headers/Private/CleverTap-iOS-SDK/CTLocationManager.h deleted file mode 120000 index 720dee15..00000000 --- a/Samples/Cordova/ExampleProject/platforms/ios/Pods/Headers/Private/CleverTap-iOS-SDK/CTLocationManager.h +++ /dev/null @@ -1 +0,0 @@ -../../../CleverTap-iOS-SDK/CleverTapSDK/CTLocationManager.h \ No newline at end of file diff --git a/Samples/Cordova/ExampleProject/platforms/ios/Pods/Headers/Private/CleverTap-iOS-SDK/CTRequest.h b/Samples/Cordova/ExampleProject/platforms/ios/Pods/Headers/Private/CleverTap-iOS-SDK/CTRequest.h new file mode 120000 index 00000000..7c858e33 --- /dev/null +++ b/Samples/Cordova/ExampleProject/platforms/ios/Pods/Headers/Private/CleverTap-iOS-SDK/CTRequest.h @@ -0,0 +1 @@ +../../../CleverTap-iOS-SDK/CleverTapSDK/CTRequest.h \ No newline at end of file diff --git a/Samples/Cordova/ExampleProject/platforms/ios/Pods/Headers/Private/CleverTap-iOS-SDK/CTRequestFactory.h b/Samples/Cordova/ExampleProject/platforms/ios/Pods/Headers/Private/CleverTap-iOS-SDK/CTRequestFactory.h new file mode 120000 index 00000000..995dd2ee --- /dev/null +++ b/Samples/Cordova/ExampleProject/platforms/ios/Pods/Headers/Private/CleverTap-iOS-SDK/CTRequestFactory.h @@ -0,0 +1 @@ +../../../CleverTap-iOS-SDK/CleverTapSDK/CTRequestFactory.h \ No newline at end of file diff --git a/Samples/Cordova/ExampleProject/platforms/ios/Pods/Headers/Private/CleverTap-iOS-SDK/CTRequestSender.h b/Samples/Cordova/ExampleProject/platforms/ios/Pods/Headers/Private/CleverTap-iOS-SDK/CTRequestSender.h new file mode 120000 index 00000000..3d20e154 --- /dev/null +++ b/Samples/Cordova/ExampleProject/platforms/ios/Pods/Headers/Private/CleverTap-iOS-SDK/CTRequestSender.h @@ -0,0 +1 @@ +../../../CleverTap-iOS-SDK/CleverTapSDK/CTRequestSender.h \ No newline at end of file diff --git a/Samples/Cordova/ExampleProject/platforms/ios/Pods/Headers/Private/CleverTap-iOS-SDK/CTVar-Internal.h b/Samples/Cordova/ExampleProject/platforms/ios/Pods/Headers/Private/CleverTap-iOS-SDK/CTVar-Internal.h new file mode 120000 index 00000000..dcf07563 --- /dev/null +++ b/Samples/Cordova/ExampleProject/platforms/ios/Pods/Headers/Private/CleverTap-iOS-SDK/CTVar-Internal.h @@ -0,0 +1 @@ +../../../CleverTap-iOS-SDK/CleverTapSDK/ProductExperiences/CTVar-Internal.h \ No newline at end of file diff --git a/Samples/Cordova/ExampleProject/platforms/ios/Pods/Headers/Private/CleverTap-iOS-SDK/CTVar.h b/Samples/Cordova/ExampleProject/platforms/ios/Pods/Headers/Private/CleverTap-iOS-SDK/CTVar.h new file mode 120000 index 00000000..40a17cd3 --- /dev/null +++ b/Samples/Cordova/ExampleProject/platforms/ios/Pods/Headers/Private/CleverTap-iOS-SDK/CTVar.h @@ -0,0 +1 @@ +../../../CleverTap-iOS-SDK/CleverTapSDK/ProductExperiences/CTVar.h \ No newline at end of file diff --git a/Samples/Cordova/ExampleProject/platforms/ios/Pods/Headers/Private/CleverTap-iOS-SDK/CTVarCache.h b/Samples/Cordova/ExampleProject/platforms/ios/Pods/Headers/Private/CleverTap-iOS-SDK/CTVarCache.h new file mode 120000 index 00000000..5799e710 --- /dev/null +++ b/Samples/Cordova/ExampleProject/platforms/ios/Pods/Headers/Private/CleverTap-iOS-SDK/CTVarCache.h @@ -0,0 +1 @@ +../../../CleverTap-iOS-SDK/CleverTapSDK/ProductExperiences/CTVarCache.h \ No newline at end of file diff --git a/Samples/Cordova/ExampleProject/platforms/ios/Pods/Headers/Private/CleverTap-iOS-SDK/CTVariables.h b/Samples/Cordova/ExampleProject/platforms/ios/Pods/Headers/Private/CleverTap-iOS-SDK/CTVariables.h new file mode 120000 index 00000000..0dfc5160 --- /dev/null +++ b/Samples/Cordova/ExampleProject/platforms/ios/Pods/Headers/Private/CleverTap-iOS-SDK/CTVariables.h @@ -0,0 +1 @@ +../../../CleverTap-iOS-SDK/CleverTapSDK/ProductExperiences/CTVariables.h \ No newline at end of file diff --git a/Samples/Cordova/ExampleProject/platforms/ios/Pods/Headers/Private/CleverTap-iOS-SDK/CleverTap+CTVar.h b/Samples/Cordova/ExampleProject/platforms/ios/Pods/Headers/Private/CleverTap-iOS-SDK/CleverTap+CTVar.h new file mode 120000 index 00000000..3b49adc8 --- /dev/null +++ b/Samples/Cordova/ExampleProject/platforms/ios/Pods/Headers/Private/CleverTap-iOS-SDK/CleverTap+CTVar.h @@ -0,0 +1 @@ +../../../CleverTap-iOS-SDK/CleverTapSDK/CleverTap+CTVar.h \ No newline at end of file diff --git a/Samples/Cordova/ExampleProject/platforms/ios/Pods/Headers/Private/CleverTap-iOS-SDK/CleverTap+DisplayUnit.h b/Samples/Cordova/ExampleProject/platforms/ios/Pods/Headers/Private/CleverTap-iOS-SDK/CleverTap+DisplayUnit.h index c40041f9..f9a7a739 120000 --- a/Samples/Cordova/ExampleProject/platforms/ios/Pods/Headers/Private/CleverTap-iOS-SDK/CleverTap+DisplayUnit.h +++ b/Samples/Cordova/ExampleProject/platforms/ios/Pods/Headers/Private/CleverTap-iOS-SDK/CleverTap+DisplayUnit.h @@ -1 +1 @@ -../../../CleverTap-iOS-SDK/CleverTapSDK/include/CleverTap+DisplayUnit.h \ No newline at end of file +../../../CleverTap-iOS-SDK/CleverTapSDK/CleverTap+DisplayUnit.h \ No newline at end of file diff --git a/Samples/Cordova/ExampleProject/platforms/ios/Pods/Headers/Private/CleverTap-iOS-SDK/CleverTap+FeatureFlags.h b/Samples/Cordova/ExampleProject/platforms/ios/Pods/Headers/Private/CleverTap-iOS-SDK/CleverTap+FeatureFlags.h index 6f864b7e..dffcde36 120000 --- a/Samples/Cordova/ExampleProject/platforms/ios/Pods/Headers/Private/CleverTap-iOS-SDK/CleverTap+FeatureFlags.h +++ b/Samples/Cordova/ExampleProject/platforms/ios/Pods/Headers/Private/CleverTap-iOS-SDK/CleverTap+FeatureFlags.h @@ -1 +1 @@ -../../../CleverTap-iOS-SDK/CleverTapSDK/include/CleverTap+FeatureFlags.h \ No newline at end of file +../../../CleverTap-iOS-SDK/CleverTapSDK/CleverTap+FeatureFlags.h \ No newline at end of file diff --git a/Samples/Cordova/ExampleProject/platforms/ios/Pods/Headers/Private/CleverTap-iOS-SDK/CleverTap+InAppNotifications.h b/Samples/Cordova/ExampleProject/platforms/ios/Pods/Headers/Private/CleverTap-iOS-SDK/CleverTap+InAppNotifications.h index 8a0b8f95..5a2d8d91 120000 --- a/Samples/Cordova/ExampleProject/platforms/ios/Pods/Headers/Private/CleverTap-iOS-SDK/CleverTap+InAppNotifications.h +++ b/Samples/Cordova/ExampleProject/platforms/ios/Pods/Headers/Private/CleverTap-iOS-SDK/CleverTap+InAppNotifications.h @@ -1 +1 @@ -../../../CleverTap-iOS-SDK/CleverTapSDK/include/CleverTap+InAppNotifications.h \ No newline at end of file +../../../CleverTap-iOS-SDK/CleverTapSDK/CleverTap+InAppNotifications.h \ No newline at end of file diff --git a/Samples/Cordova/ExampleProject/platforms/ios/Pods/Headers/Private/CleverTap-iOS-SDK/CleverTap+Inbox.h b/Samples/Cordova/ExampleProject/platforms/ios/Pods/Headers/Private/CleverTap-iOS-SDK/CleverTap+Inbox.h index c2fe0bd4..e2a9b00d 120000 --- a/Samples/Cordova/ExampleProject/platforms/ios/Pods/Headers/Private/CleverTap-iOS-SDK/CleverTap+Inbox.h +++ b/Samples/Cordova/ExampleProject/platforms/ios/Pods/Headers/Private/CleverTap-iOS-SDK/CleverTap+Inbox.h @@ -1 +1 @@ -../../../CleverTap-iOS-SDK/CleverTapSDK/include/CleverTap+Inbox.h \ No newline at end of file +../../../CleverTap-iOS-SDK/CleverTapSDK/CleverTap+Inbox.h \ No newline at end of file diff --git a/Samples/Cordova/ExampleProject/platforms/ios/Pods/Headers/Private/CleverTap-iOS-SDK/CleverTap+ProductConfig.h b/Samples/Cordova/ExampleProject/platforms/ios/Pods/Headers/Private/CleverTap-iOS-SDK/CleverTap+ProductConfig.h index 64de2b23..cca2274d 120000 --- a/Samples/Cordova/ExampleProject/platforms/ios/Pods/Headers/Private/CleverTap-iOS-SDK/CleverTap+ProductConfig.h +++ b/Samples/Cordova/ExampleProject/platforms/ios/Pods/Headers/Private/CleverTap-iOS-SDK/CleverTap+ProductConfig.h @@ -1 +1 @@ -../../../CleverTap-iOS-SDK/CleverTapSDK/include/CleverTap+ProductConfig.h \ No newline at end of file +../../../CleverTap-iOS-SDK/CleverTapSDK/CleverTap+ProductConfig.h \ No newline at end of file diff --git a/Samples/Cordova/ExampleProject/platforms/ios/Pods/Headers/Private/CleverTap-iOS-SDK/CleverTap+PushPermission.h b/Samples/Cordova/ExampleProject/platforms/ios/Pods/Headers/Private/CleverTap-iOS-SDK/CleverTap+PushPermission.h index 8cc3aaa3..21da6ebb 120000 --- a/Samples/Cordova/ExampleProject/platforms/ios/Pods/Headers/Private/CleverTap-iOS-SDK/CleverTap+PushPermission.h +++ b/Samples/Cordova/ExampleProject/platforms/ios/Pods/Headers/Private/CleverTap-iOS-SDK/CleverTap+PushPermission.h @@ -1 +1 @@ -../../../CleverTap-iOS-SDK/CleverTapSDK/include/CleverTap+PushPermission.h \ No newline at end of file +../../../CleverTap-iOS-SDK/CleverTapSDK/CleverTap+PushPermission.h \ No newline at end of file diff --git a/Samples/Cordova/ExampleProject/platforms/ios/Pods/Headers/Private/CleverTap-iOS-SDK/CleverTap+SCDomain.h b/Samples/Cordova/ExampleProject/platforms/ios/Pods/Headers/Private/CleverTap-iOS-SDK/CleverTap+SCDomain.h index ba2258c7..cdf99f72 120000 --- a/Samples/Cordova/ExampleProject/platforms/ios/Pods/Headers/Private/CleverTap-iOS-SDK/CleverTap+SCDomain.h +++ b/Samples/Cordova/ExampleProject/platforms/ios/Pods/Headers/Private/CleverTap-iOS-SDK/CleverTap+SCDomain.h @@ -1 +1 @@ -../../../CleverTap-iOS-SDK/CleverTapSDK/include/CleverTap+SCDomain.h \ No newline at end of file +../../../CleverTap-iOS-SDK/CleverTapSDK/CleverTap+SCDomain.h \ No newline at end of file diff --git a/Samples/Cordova/ExampleProject/platforms/ios/Pods/Headers/Private/CleverTap-iOS-SDK/CleverTap+SSLPinning.h b/Samples/Cordova/ExampleProject/platforms/ios/Pods/Headers/Private/CleverTap-iOS-SDK/CleverTap+SSLPinning.h index 107de97b..fc482ef7 120000 --- a/Samples/Cordova/ExampleProject/platforms/ios/Pods/Headers/Private/CleverTap-iOS-SDK/CleverTap+SSLPinning.h +++ b/Samples/Cordova/ExampleProject/platforms/ios/Pods/Headers/Private/CleverTap-iOS-SDK/CleverTap+SSLPinning.h @@ -1 +1 @@ -../../../CleverTap-iOS-SDK/CleverTapSDK/include/CleverTap+SSLPinning.h \ No newline at end of file +../../../CleverTap-iOS-SDK/CleverTapSDK/CleverTap+SSLPinning.h \ No newline at end of file diff --git a/Samples/Cordova/ExampleProject/platforms/ios/Pods/Headers/Private/CleverTap-iOS-SDK/CleverTap.h b/Samples/Cordova/ExampleProject/platforms/ios/Pods/Headers/Private/CleverTap-iOS-SDK/CleverTap.h index bb4635f9..5a33affb 120000 --- a/Samples/Cordova/ExampleProject/platforms/ios/Pods/Headers/Private/CleverTap-iOS-SDK/CleverTap.h +++ b/Samples/Cordova/ExampleProject/platforms/ios/Pods/Headers/Private/CleverTap-iOS-SDK/CleverTap.h @@ -1 +1 @@ -../../../CleverTap-iOS-SDK/CleverTapSDK/include/CleverTap.h \ No newline at end of file +../../../CleverTap-iOS-SDK/CleverTapSDK/CleverTap.h \ No newline at end of file diff --git a/Samples/Cordova/ExampleProject/platforms/ios/Pods/Headers/Private/CleverTap-iOS-SDK/CleverTapBuildInfo.h b/Samples/Cordova/ExampleProject/platforms/ios/Pods/Headers/Private/CleverTap-iOS-SDK/CleverTapBuildInfo.h index 49207ff1..ce429a78 120000 --- a/Samples/Cordova/ExampleProject/platforms/ios/Pods/Headers/Private/CleverTap-iOS-SDK/CleverTapBuildInfo.h +++ b/Samples/Cordova/ExampleProject/platforms/ios/Pods/Headers/Private/CleverTap-iOS-SDK/CleverTapBuildInfo.h @@ -1 +1 @@ -../../../CleverTap-iOS-SDK/CleverTapSDK/include/CleverTapBuildInfo.h \ No newline at end of file +../../../CleverTap-iOS-SDK/CleverTapSDK/CleverTapBuildInfo.h \ No newline at end of file diff --git a/Samples/Cordova/ExampleProject/platforms/ios/Pods/Headers/Private/CleverTap-iOS-SDK/CleverTapEventDetail.h b/Samples/Cordova/ExampleProject/platforms/ios/Pods/Headers/Private/CleverTap-iOS-SDK/CleverTapEventDetail.h index e2ddfd9f..3e81c19d 120000 --- a/Samples/Cordova/ExampleProject/platforms/ios/Pods/Headers/Private/CleverTap-iOS-SDK/CleverTapEventDetail.h +++ b/Samples/Cordova/ExampleProject/platforms/ios/Pods/Headers/Private/CleverTap-iOS-SDK/CleverTapEventDetail.h @@ -1 +1 @@ -../../../CleverTap-iOS-SDK/CleverTapSDK/include/CleverTapEventDetail.h \ No newline at end of file +../../../CleverTap-iOS-SDK/CleverTapSDK/CleverTapEventDetail.h \ No newline at end of file diff --git a/Samples/Cordova/ExampleProject/platforms/ios/Pods/Headers/Private/CleverTap-iOS-SDK/CleverTapInAppNotificationDelegate.h b/Samples/Cordova/ExampleProject/platforms/ios/Pods/Headers/Private/CleverTap-iOS-SDK/CleverTapInAppNotificationDelegate.h index 097caac9..62971bb1 120000 --- a/Samples/Cordova/ExampleProject/platforms/ios/Pods/Headers/Private/CleverTap-iOS-SDK/CleverTapInAppNotificationDelegate.h +++ b/Samples/Cordova/ExampleProject/platforms/ios/Pods/Headers/Private/CleverTap-iOS-SDK/CleverTapInAppNotificationDelegate.h @@ -1 +1 @@ -../../../CleverTap-iOS-SDK/CleverTapSDK/include/CleverTapInAppNotificationDelegate.h \ No newline at end of file +../../../CleverTap-iOS-SDK/CleverTapSDK/CleverTapInAppNotificationDelegate.h \ No newline at end of file diff --git a/Samples/Cordova/ExampleProject/platforms/ios/Pods/Headers/Private/CleverTap-iOS-SDK/CleverTapInstanceConfig.h b/Samples/Cordova/ExampleProject/platforms/ios/Pods/Headers/Private/CleverTap-iOS-SDK/CleverTapInstanceConfig.h index ef4724d9..7ec1a715 120000 --- a/Samples/Cordova/ExampleProject/platforms/ios/Pods/Headers/Private/CleverTap-iOS-SDK/CleverTapInstanceConfig.h +++ b/Samples/Cordova/ExampleProject/platforms/ios/Pods/Headers/Private/CleverTap-iOS-SDK/CleverTapInstanceConfig.h @@ -1 +1 @@ -../../../CleverTap-iOS-SDK/CleverTapSDK/include/CleverTapInstanceConfig.h \ No newline at end of file +../../../CleverTap-iOS-SDK/CleverTapSDK/CleverTapInstanceConfig.h \ No newline at end of file diff --git a/Samples/Cordova/ExampleProject/platforms/ios/Pods/Headers/Private/CleverTap-iOS-SDK/CleverTapJSInterface.h b/Samples/Cordova/ExampleProject/platforms/ios/Pods/Headers/Private/CleverTap-iOS-SDK/CleverTapJSInterface.h index 9075e36d..eaa4359d 120000 --- a/Samples/Cordova/ExampleProject/platforms/ios/Pods/Headers/Private/CleverTap-iOS-SDK/CleverTapJSInterface.h +++ b/Samples/Cordova/ExampleProject/platforms/ios/Pods/Headers/Private/CleverTap-iOS-SDK/CleverTapJSInterface.h @@ -1 +1 @@ -../../../CleverTap-iOS-SDK/CleverTapSDK/include/CleverTapJSInterface.h \ No newline at end of file +../../../CleverTap-iOS-SDK/CleverTapSDK/CleverTapJSInterface.h \ No newline at end of file diff --git a/Samples/Cordova/ExampleProject/platforms/ios/Pods/Headers/Private/CleverTap-iOS-SDK/CleverTapJSInterfacePrivate.h b/Samples/Cordova/ExampleProject/platforms/ios/Pods/Headers/Private/CleverTap-iOS-SDK/CleverTapJSInterfacePrivate.h new file mode 120000 index 00000000..ee2e9d59 --- /dev/null +++ b/Samples/Cordova/ExampleProject/platforms/ios/Pods/Headers/Private/CleverTap-iOS-SDK/CleverTapJSInterfacePrivate.h @@ -0,0 +1 @@ +../../../CleverTap-iOS-SDK/CleverTapSDK/CleverTapJSInterfacePrivate.h \ No newline at end of file diff --git a/Samples/Cordova/ExampleProject/platforms/ios/Pods/Headers/Private/CleverTap-iOS-SDK/CleverTapPushNotificationDelegate.h b/Samples/Cordova/ExampleProject/platforms/ios/Pods/Headers/Private/CleverTap-iOS-SDK/CleverTapPushNotificationDelegate.h index 008fefb7..3a3ade7e 120000 --- a/Samples/Cordova/ExampleProject/platforms/ios/Pods/Headers/Private/CleverTap-iOS-SDK/CleverTapPushNotificationDelegate.h +++ b/Samples/Cordova/ExampleProject/platforms/ios/Pods/Headers/Private/CleverTap-iOS-SDK/CleverTapPushNotificationDelegate.h @@ -1 +1 @@ -../../../CleverTap-iOS-SDK/CleverTapSDK/include/CleverTapPushNotificationDelegate.h \ No newline at end of file +../../../CleverTap-iOS-SDK/CleverTapSDK/CleverTapPushNotificationDelegate.h \ No newline at end of file diff --git a/Samples/Cordova/ExampleProject/platforms/ios/Pods/Headers/Private/CleverTap-iOS-SDK/CleverTapSyncDelegate.h b/Samples/Cordova/ExampleProject/platforms/ios/Pods/Headers/Private/CleverTap-iOS-SDK/CleverTapSyncDelegate.h index b205ec76..33350954 120000 --- a/Samples/Cordova/ExampleProject/platforms/ios/Pods/Headers/Private/CleverTap-iOS-SDK/CleverTapSyncDelegate.h +++ b/Samples/Cordova/ExampleProject/platforms/ios/Pods/Headers/Private/CleverTap-iOS-SDK/CleverTapSyncDelegate.h @@ -1 +1 @@ -../../../CleverTap-iOS-SDK/CleverTapSDK/include/CleverTapSyncDelegate.h \ No newline at end of file +../../../CleverTap-iOS-SDK/CleverTapSDK/CleverTapSyncDelegate.h \ No newline at end of file diff --git a/Samples/Cordova/ExampleProject/platforms/ios/Pods/Headers/Private/CleverTap-iOS-SDK/CleverTapTrackedViewController.h b/Samples/Cordova/ExampleProject/platforms/ios/Pods/Headers/Private/CleverTap-iOS-SDK/CleverTapTrackedViewController.h index b680213a..e2014f43 120000 --- a/Samples/Cordova/ExampleProject/platforms/ios/Pods/Headers/Private/CleverTap-iOS-SDK/CleverTapTrackedViewController.h +++ b/Samples/Cordova/ExampleProject/platforms/ios/Pods/Headers/Private/CleverTap-iOS-SDK/CleverTapTrackedViewController.h @@ -1 +1 @@ -../../../CleverTap-iOS-SDK/CleverTapSDK/include/CleverTapTrackedViewController.h \ No newline at end of file +../../../CleverTap-iOS-SDK/CleverTapSDK/CleverTapTrackedViewController.h \ No newline at end of file diff --git a/Samples/Cordova/ExampleProject/platforms/ios/Pods/Headers/Private/CleverTap-iOS-SDK/CleverTapURLDelegate.h b/Samples/Cordova/ExampleProject/platforms/ios/Pods/Headers/Private/CleverTap-iOS-SDK/CleverTapURLDelegate.h index 38371b32..f378f9ad 120000 --- a/Samples/Cordova/ExampleProject/platforms/ios/Pods/Headers/Private/CleverTap-iOS-SDK/CleverTapURLDelegate.h +++ b/Samples/Cordova/ExampleProject/platforms/ios/Pods/Headers/Private/CleverTap-iOS-SDK/CleverTapURLDelegate.h @@ -1 +1 @@ -../../../CleverTap-iOS-SDK/CleverTapSDK/include/CleverTapURLDelegate.h \ No newline at end of file +../../../CleverTap-iOS-SDK/CleverTapSDK/CleverTapURLDelegate.h \ No newline at end of file diff --git a/Samples/Cordova/ExampleProject/platforms/ios/Pods/Headers/Private/CleverTap-iOS-SDK/CleverTapUTMDetail.h b/Samples/Cordova/ExampleProject/platforms/ios/Pods/Headers/Private/CleverTap-iOS-SDK/CleverTapUTMDetail.h index 62c7bda9..ab3bfa87 120000 --- a/Samples/Cordova/ExampleProject/platforms/ios/Pods/Headers/Private/CleverTap-iOS-SDK/CleverTapUTMDetail.h +++ b/Samples/Cordova/ExampleProject/platforms/ios/Pods/Headers/Private/CleverTap-iOS-SDK/CleverTapUTMDetail.h @@ -1 +1 @@ -../../../CleverTap-iOS-SDK/CleverTapSDK/include/CleverTapUTMDetail.h \ No newline at end of file +../../../CleverTap-iOS-SDK/CleverTapSDK/CleverTapUTMDetail.h \ No newline at end of file diff --git a/Samples/Cordova/ExampleProject/platforms/ios/Pods/Headers/Private/CleverTap-iOS-SDK/ContentMerger.h b/Samples/Cordova/ExampleProject/platforms/ios/Pods/Headers/Private/CleverTap-iOS-SDK/ContentMerger.h new file mode 120000 index 00000000..a1f7030e --- /dev/null +++ b/Samples/Cordova/ExampleProject/platforms/ios/Pods/Headers/Private/CleverTap-iOS-SDK/ContentMerger.h @@ -0,0 +1 @@ +../../../CleverTap-iOS-SDK/CleverTapSDK/ProductExperiences/ContentMerger.h \ No newline at end of file diff --git a/Samples/Cordova/ExampleProject/platforms/ios/Pods/Headers/Private/CleverTap-iOS-SDK/LeanplumCT.h b/Samples/Cordova/ExampleProject/platforms/ios/Pods/Headers/Private/CleverTap-iOS-SDK/LeanplumCT.h new file mode 120000 index 00000000..59725db1 --- /dev/null +++ b/Samples/Cordova/ExampleProject/platforms/ios/Pods/Headers/Private/CleverTap-iOS-SDK/LeanplumCT.h @@ -0,0 +1 @@ +../../../CleverTap-iOS-SDK/CleverTapSDK/LeanplumCT.h \ No newline at end of file diff --git a/Samples/Cordova/ExampleProject/platforms/ios/Pods/Headers/Private/CleverTap-iOS-SDK/NSDictionary+Extensions.h b/Samples/Cordova/ExampleProject/platforms/ios/Pods/Headers/Private/CleverTap-iOS-SDK/NSDictionary+Extensions.h new file mode 120000 index 00000000..a8efaa9f --- /dev/null +++ b/Samples/Cordova/ExampleProject/platforms/ios/Pods/Headers/Private/CleverTap-iOS-SDK/NSDictionary+Extensions.h @@ -0,0 +1 @@ +../../../CleverTap-iOS-SDK/CleverTapSDK/NSDictionary+Extensions.h \ No newline at end of file diff --git a/Samples/Cordova/ExampleProject/platforms/ios/Pods/Headers/Private/SDWebImage/SDImageFramePool.h b/Samples/Cordova/ExampleProject/platforms/ios/Pods/Headers/Private/SDWebImage/SDImageFramePool.h new file mode 120000 index 00000000..67e3c5f6 --- /dev/null +++ b/Samples/Cordova/ExampleProject/platforms/ios/Pods/Headers/Private/SDWebImage/SDImageFramePool.h @@ -0,0 +1 @@ +../../../SDWebImage/SDWebImage/Private/SDImageFramePool.h \ No newline at end of file diff --git a/Samples/Cordova/ExampleProject/platforms/ios/Pods/Headers/Public/CleverTap-iOS-SDK/CTVar.h b/Samples/Cordova/ExampleProject/platforms/ios/Pods/Headers/Public/CleverTap-iOS-SDK/CTVar.h new file mode 120000 index 00000000..40a17cd3 --- /dev/null +++ b/Samples/Cordova/ExampleProject/platforms/ios/Pods/Headers/Public/CleverTap-iOS-SDK/CTVar.h @@ -0,0 +1 @@ +../../../CleverTap-iOS-SDK/CleverTapSDK/ProductExperiences/CTVar.h \ No newline at end of file diff --git a/Samples/Cordova/ExampleProject/platforms/ios/Pods/Headers/Public/CleverTap-iOS-SDK/CleverTap+CTVar.h b/Samples/Cordova/ExampleProject/platforms/ios/Pods/Headers/Public/CleverTap-iOS-SDK/CleverTap+CTVar.h new file mode 120000 index 00000000..3b49adc8 --- /dev/null +++ b/Samples/Cordova/ExampleProject/platforms/ios/Pods/Headers/Public/CleverTap-iOS-SDK/CleverTap+CTVar.h @@ -0,0 +1 @@ +../../../CleverTap-iOS-SDK/CleverTapSDK/CleverTap+CTVar.h \ No newline at end of file diff --git a/Samples/Cordova/ExampleProject/platforms/ios/Pods/Headers/Public/CleverTap-iOS-SDK/LeanplumCT.h b/Samples/Cordova/ExampleProject/platforms/ios/Pods/Headers/Public/CleverTap-iOS-SDK/LeanplumCT.h new file mode 120000 index 00000000..59725db1 --- /dev/null +++ b/Samples/Cordova/ExampleProject/platforms/ios/Pods/Headers/Public/CleverTap-iOS-SDK/LeanplumCT.h @@ -0,0 +1 @@ +../../../CleverTap-iOS-SDK/CleverTapSDK/LeanplumCT.h \ No newline at end of file diff --git a/Samples/Cordova/ExampleProject/platforms/ios/Pods/Manifest.lock b/Samples/Cordova/ExampleProject/platforms/ios/Pods/Manifest.lock index b144a082..fc60a0a1 100644 --- a/Samples/Cordova/ExampleProject/platforms/ios/Pods/Manifest.lock +++ b/Samples/Cordova/ExampleProject/platforms/ios/Pods/Manifest.lock @@ -1,22 +1,22 @@ PODS: - - CleverTap-iOS-SDK (4.2.0): + - CleverTap-iOS-SDK (5.1.2): - SDWebImage (~> 5.11) - - SDWebImage (5.15.0): - - SDWebImage/Core (= 5.15.0) - - SDWebImage/Core (5.15.0) + - SDWebImage (5.17.0): + - SDWebImage/Core (= 5.17.0) + - SDWebImage/Core (5.17.0) DEPENDENCIES: - - CleverTap-iOS-SDK (= 4.2.0) + - CleverTap-iOS-SDK (= 5.1.2) SPEC REPOS: - trunk: + https://github.com/CocoaPods/Specs.git: - CleverTap-iOS-SDK - SDWebImage SPEC CHECKSUMS: - CleverTap-iOS-SDK: 124ee0f4bd90c5ffa213b2da05f81496d7339015 - SDWebImage: 9bec4c5cdd9579e1f57104735ee0c37df274d593 + CleverTap-iOS-SDK: 1731f365b7822458c346fb812bd0f0edbf076856 + SDWebImage: 750adf017a315a280c60fde706ab1e552a3ae4e9 -PODFILE CHECKSUM: 9f7ec524782dc2155236da4b7d8dc2188d607019 +PODFILE CHECKSUM: 838d8d904fc779a1bc0bea04c3377f1d39ea9144 COCOAPODS: 1.11.2 diff --git a/Samples/Cordova/ExampleProject/platforms/ios/Pods/Pods.xcodeproj/project.pbxproj b/Samples/Cordova/ExampleProject/platforms/ios/Pods/Pods.xcodeproj/project.pbxproj index 41eafddc..36ca03a9 100644 --- a/Samples/Cordova/ExampleProject/platforms/ios/Pods/Pods.xcodeproj/project.pbxproj +++ b/Samples/Cordova/ExampleProject/platforms/ios/Pods/Pods.xcodeproj/project.pbxproj @@ -7,819 +7,865 @@ objects = { /* Begin PBXBuildFile section */ - 005CDED4269B81C6C62D678B2DEC1023 /* CleverTapFeatureFlags.m in Sources */ = {isa = PBXBuildFile; fileRef = C3D56E91B262BDD2AB866F8D8221D353 /* CleverTapFeatureFlags.m */; }; - 011E7CD433AE612A45D4FC3C75AB736D /* UIImage+ExtendedCacheData.m in Sources */ = {isa = PBXBuildFile; fileRef = 4A14E1B6BC96E56AE1BD9A84E8FAEAD8 /* UIImage+ExtendedCacheData.m */; }; - 0133ECA108614477E3D99F872AFB2BD4 /* CTCarouselMessageCell~port.xib in Resources */ = {isa = PBXBuildFile; fileRef = AA0104B1645FCE465F8C23B26FB8D294 /* CTCarouselMessageCell~port.xib */; }; - 01A50E4F7B34BA271C90CDEB1877ACBB /* CTNotificationButton.m in Sources */ = {isa = PBXBuildFile; fileRef = AC8BBA70E2E95FDB4BA0944100C1D446 /* CTNotificationButton.m */; }; - 0367BF66057DAA9C7CF47ACFF55250D2 /* CTInterstitialViewController.h in Headers */ = {isa = PBXBuildFile; fileRef = E976ADF3D4855F86CC2BF8428AAC9744 /* CTInterstitialViewController.h */; settings = {ATTRIBUTES = (Project, ); }; }; - 03FAB1A7C3CFCA27BB3E18241261429D /* CTHalfInterstitialViewController~ipad.xib in Resources */ = {isa = PBXBuildFile; fileRef = E82A6563EA932B6CDA2A5F6D83190218 /* CTHalfInterstitialViewController~ipad.xib */; }; - 04774B163CB17DC8AEB6AEDC2EFD07C0 /* CTInterstitialImageViewController~iphoneport.xib in Resources */ = {isa = PBXBuildFile; fileRef = 7A628076EB2E1DDEC3AD2B96B29F2126 /* CTInterstitialImageViewController~iphoneport.xib */; }; - 04B5604605A463ECD9A070CD7AFF49A8 /* CleverTapJSInterface.h in Headers */ = {isa = PBXBuildFile; fileRef = 4DE932A8C1BD6F8610BEEE61BF1E7E3E /* CleverTapJSInterface.h */; settings = {ATTRIBUTES = (Project, ); }; }; - 05C9AC8D49156A12B17BDCB53B676F4D /* CTMessageMO.m in Sources */ = {isa = PBXBuildFile; fileRef = 7F04FC081BF0DB766AA8492D755A9E38 /* CTMessageMO.m */; }; - 0810E7EE2FF3B640AD433A4B9E17DDB0 /* CTHalfInterstitialImageViewController~iphoneland.xib in Resources */ = {isa = PBXBuildFile; fileRef = C8CC5FD7542D7CE13085C9CD0413547E /* CTHalfInterstitialImageViewController~iphoneland.xib */; }; - 082E7F8982968CC118462BFCFABA2C00 /* SDImageIOAnimatedCoder.h in Headers */ = {isa = PBXBuildFile; fileRef = 0921D607B54D097A3AE18105C5E152EB /* SDImageIOAnimatedCoder.h */; settings = {ATTRIBUTES = (Project, ); }; }; - 091E8BFCFD9ECF0F6F3EBB6B2BA9CF2E /* SDWebImageDownloaderRequestModifier.h in Headers */ = {isa = PBXBuildFile; fileRef = 9FB5856B3BFB7FBD78D8E03DCE916265 /* SDWebImageDownloaderRequestModifier.h */; settings = {ATTRIBUTES = (Project, ); }; }; - 0931CD48CDFD4D68D95FFCE33FBA7AB4 /* CTInAppDisplayViewController.h in Headers */ = {isa = PBXBuildFile; fileRef = 506885A984C628CD5FAF8C550EE150C1 /* CTInAppDisplayViewController.h */; settings = {ATTRIBUTES = (Project, ); }; }; - 097E7223EF23D4FA3993A466A0264925 /* UIImage+ForceDecode.m in Sources */ = {isa = PBXBuildFile; fileRef = 43C45D9043521F22120A7C1BDE55F27D /* UIImage+ForceDecode.m */; }; - 09910885C763E95B8757FB2602BE808B /* CTProfileBuilder.h in Headers */ = {isa = PBXBuildFile; fileRef = 6CDE3260E53973DACE1DD5C2E8A90F56 /* CTProfileBuilder.h */; settings = {ATTRIBUTES = (Project, ); }; }; - 09D70AE545B4EB3AE8B0C8D0CD58C2EE /* CTCoverViewController.h in Headers */ = {isa = PBXBuildFile; fileRef = FC98D47A0C7E48C307516B8566F540DC /* CTCoverViewController.h */; settings = {ATTRIBUTES = (Project, ); }; }; - 0A6E5C8734BA08D138E0340BAE50BED9 /* UIView+WebCacheOperation.m in Sources */ = {isa = PBXBuildFile; fileRef = 86A12E75A297D84531417AC7B582D496 /* UIView+WebCacheOperation.m */; }; - 0C0111E8ACDF329158C54AAAD553CFC3 /* CTEventBuilder.m in Sources */ = {isa = PBXBuildFile; fileRef = 1A7C0ABEBF9B60257002286A5A4F9EFA /* CTEventBuilder.m */; }; - 0DD9426E12CBF548EF7206C31CF07C5A /* CTProductConfigController.m in Sources */ = {isa = PBXBuildFile; fileRef = 13135DDF65FF9179653F83CEFC608B57 /* CTProductConfigController.m */; }; - 0E19823CC670437E29F2C3AA8660BF41 /* CTSwipeView.m in Sources */ = {isa = PBXBuildFile; fileRef = 06A72E01CEE4935C082F4A84A7450C7F /* CTSwipeView.m */; }; - 0E6DC1F552D15D0D3B79A3D2A644BEF5 /* CTValidationResultStack.h in Headers */ = {isa = PBXBuildFile; fileRef = 0F776E448D1B1C56F6FC0D145271F503 /* CTValidationResultStack.h */; settings = {ATTRIBUTES = (Project, ); }; }; - 102BFDD2A44708F5919509D96A54BAC9 /* SDImageAPNGCoder.m in Sources */ = {isa = PBXBuildFile; fileRef = 5046ABCA583A9E2F4DA976003F3ACB43 /* SDImageAPNGCoder.m */; }; - 105DF1C10EBBB6DE95D73177AD04A78A /* SDImageCoder.h in Headers */ = {isa = PBXBuildFile; fileRef = 810AB2078A12297C90E2F3E972F1F6D5 /* SDImageCoder.h */; settings = {ATTRIBUTES = (Project, ); }; }; - 10AAE590D869C4E996846792246B07C4 /* SDAssociatedObject.h in Headers */ = {isa = PBXBuildFile; fileRef = 76F350D38B0C254210F7E2CE1C75366B /* SDAssociatedObject.h */; settings = {ATTRIBUTES = (Project, ); }; }; - 10E4F271C54292E687D05BC3CF80FA3A /* CleverTapTrackedViewController.h in Headers */ = {isa = PBXBuildFile; fileRef = F2C5A1BF3384B7C6932508CC801E85FC /* CleverTapTrackedViewController.h */; settings = {ATTRIBUTES = (Project, ); }; }; - 11430ABE26456323CABB5DC8B87B8DC9 /* ct_default_video.png in Resources */ = {isa = PBXBuildFile; fileRef = CD4126EE58EA885BC479666CB3445BC3 /* ct_default_video.png */; }; - 11D6E13ABB1F372D613D0CA09B3963AA /* CTUtils.m in Sources */ = {isa = PBXBuildFile; fileRef = 89B7A084DA540E3C81AB5848ACF2AB34 /* CTUtils.m */; }; - 12B24026745EA0CFF2B2BF01B78A19CA /* UIImageView+HighlightedWebCache.m in Sources */ = {isa = PBXBuildFile; fileRef = 02AE8425368F9EAF709FB94566FB00DA /* UIImageView+HighlightedWebCache.m */; }; - 132C9AE9434ED95CEB38DE927C00E333 /* SDImageTransformer.h in Headers */ = {isa = PBXBuildFile; fileRef = 51340ED429D80618086CFFE176D39C55 /* SDImageTransformer.h */; settings = {ATTRIBUTES = (Project, ); }; }; - 133C16566C1CB17D22C24E38BD2E9CB3 /* CTInAppDisplayViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 29C3E943E0FB635C67D74D3BE4077041 /* CTInAppDisplayViewController.m */; }; - 13418E39D0F7BDAA9CC00D85BB106F4C /* CTUriHelper.h in Headers */ = {isa = PBXBuildFile; fileRef = 0CE47ACF5C39780F7B58F6C1A8EB4763 /* CTUriHelper.h */; settings = {ATTRIBUTES = (Project, ); }; }; - 13F6377DA6B53D05D86DC213E17A2E67 /* SDWebImagePrefetcher.m in Sources */ = {isa = PBXBuildFile; fileRef = E1410A2C00AC668EAF25B299A2AF9B85 /* SDWebImagePrefetcher.m */; }; - 13FC0FC4C219FC3EB438173171E5714A /* CTCarouselImageMessageCell~port.xib in Resources */ = {isa = PBXBuildFile; fileRef = E1E86C8B89C471B4B2ABC5E0D5A8A6AC /* CTCarouselImageMessageCell~port.xib */; }; - 14BD1B25E9682C3342BDDC7DD0864B41 /* SDWebImageError.h in Headers */ = {isa = PBXBuildFile; fileRef = 1D888DE65D42078ECEF9CE4821F85E01 /* SDWebImageError.h */; settings = {ATTRIBUTES = (Project, ); }; }; - 151148EEC1A3D072C7A7657489DF4962 /* UIImage+GIF.h in Headers */ = {isa = PBXBuildFile; fileRef = 04D4ECDCFD33424F162907BC3F828D98 /* UIImage+GIF.h */; settings = {ATTRIBUTES = (Project, ); }; }; - 159413A33EA1D16E3D6C31DA4A2ADDCF /* UIImage+Transform.h in Headers */ = {isa = PBXBuildFile; fileRef = 98F13508A29E678B97ADC29B892300A9 /* UIImage+Transform.h */; settings = {ATTRIBUTES = (Project, ); }; }; - 1790DF45D480EA89CB6FDD2C2D80BA9A /* UIImage+MemoryCacheCost.m in Sources */ = {isa = PBXBuildFile; fileRef = FF51E4B5C462C948E2B00EA02D8852BC /* UIImage+MemoryCacheCost.m */; }; - 17C8DDE9D0A5C9D6074ADAFC1E8C91B4 /* CTConstants.h in Headers */ = {isa = PBXBuildFile; fileRef = 145617DEF6E1987B40FF2807C0A747B4 /* CTConstants.h */; settings = {ATTRIBUTES = (Project, ); }; }; - 17FA95893B36E18EBC5DE742E4276A23 /* CTUtils.h in Headers */ = {isa = PBXBuildFile; fileRef = C44979E07A186F9374A6DE6139F73AAD /* CTUtils.h */; settings = {ATTRIBUTES = (Project, ); }; }; - 18788A9177E52678E575B4F7BAC02832 /* CTIdentityRepoFactory.m in Sources */ = {isa = PBXBuildFile; fileRef = 35E0E473D94991D3023A7862B658B6C3 /* CTIdentityRepoFactory.m */; }; - 19BCDFD2245F9226D722FAB64B4582FD /* CTCoverViewController~iphoneland.xib in Resources */ = {isa = PBXBuildFile; fileRef = 9945501E0365FC997B20049C64EA4E88 /* CTCoverViewController~iphoneland.xib */; }; - 1A12EC2DB5473F8384D83E9DFD4D1643 /* CleverTap+SSLPinning.h in Headers */ = {isa = PBXBuildFile; fileRef = 3ABE41468656CD53C58027665AC967BC /* CleverTap+SSLPinning.h */; settings = {ATTRIBUTES = (Project, ); }; }; - 1B93935D1D478494B420A1DD69BCBDBC /* CTPlistInfo.m in Sources */ = {isa = PBXBuildFile; fileRef = 4D8319B3ABEE67199B9C53AAA7E4D2C8 /* CTPlistInfo.m */; }; - 2026B59703D56460239610577E7E34A6 /* SDImageCodersManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 9AEC614EA871320A2EE1021421EF9A8F /* SDImageCodersManager.m */; }; - 2119D166688AD5C26027028481A1B158 /* SDWebImageTransitionInternal.h in Headers */ = {isa = PBXBuildFile; fileRef = A915A0FF4A83C350C24ACCD31658F3A9 /* SDWebImageTransitionInternal.h */; settings = {ATTRIBUTES = (Project, ); }; }; - 2261169FCE209D01515E229BBE70D929 /* SDAssociatedObject.m in Sources */ = {isa = PBXBuildFile; fileRef = A0E97F9E705E445B8D70BB3A85BE02C4 /* SDAssociatedObject.m */; }; - 22E11141F4E8D0B0C4B87A39B12EF106 /* SDAnimatedImageView+WebCache.m in Sources */ = {isa = PBXBuildFile; fileRef = 9AF1D56FF26ED67B5DBEB3984242C583 /* SDAnimatedImageView+WebCache.m */; }; - 2321232D23BFBF7069A10A50785BD075 /* CTLoginInfoProvider.m in Sources */ = {isa = PBXBuildFile; fileRef = 59D33BDAFD571BD7B8CB0494A8AE011B /* CTLoginInfoProvider.m */; }; - 2739748E1493B04DA245AB967A9F3E11 /* SDImageGraphics.m in Sources */ = {isa = PBXBuildFile; fileRef = B8DBB11FA7CB9D4340893CF701EABAEF /* SDImageGraphics.m */; }; - 27BA673FD66732E9C2C8351E1D0FFDEE /* CTHalfInterstitialImageViewController~ipad.xib in Resources */ = {isa = PBXBuildFile; fileRef = 122A4A2A6431D70B6C28CD22CED19024 /* CTHalfInterstitialImageViewController~ipad.xib */; }; - 27BE25690942BD858E60D998A014EB32 /* CTLocationManager.m in Sources */ = {isa = PBXBuildFile; fileRef = D6918B0BB591EBD8C33645D4641F7F8E /* CTLocationManager.m */; }; - 28CDCC25EF629DDEA4F4391BE57BC113 /* SDWebImage.h in Headers */ = {isa = PBXBuildFile; fileRef = 8B57355733C9179A4100DF8E06430ABA /* SDWebImage.h */; settings = {ATTRIBUTES = (Project, ); }; }; - 2AAFC8DF727D5A9200E4998640EBF0A8 /* CTInAppNotification.h in Headers */ = {isa = PBXBuildFile; fileRef = FBC28DA290D2949C9F9DAEFA027089C9 /* CTInAppNotification.h */; settings = {ATTRIBUTES = (Project, ); }; }; - 2AC4FBEB8709A4305C94225CE03FEE1C /* CTInAppUtils.h in Headers */ = {isa = PBXBuildFile; fileRef = F533489CA7EB2498456C16023FAFCFEF /* CTInAppUtils.h */; settings = {ATTRIBUTES = (Project, ); }; }; - 2BE7CC3BB43A8E3FD6E3986B13B8E5AE /* CleverTap-iOS-SDK-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 2347F10D864FD03D80C0CF0719230162 /* CleverTap-iOS-SDK-dummy.m */; }; - 2BFD40843C7CAF5C29E5024CEF65D7D7 /* CTLocationManager.h in Headers */ = {isa = PBXBuildFile; fileRef = 985DA9E246CF3DD086492BF78060EC44 /* CTLocationManager.h */; settings = {ATTRIBUTES = (Project, ); }; }; - 2C1E0AD61526DD821AB622734F254952 /* CTInterstitialImageViewController~ipadland.xib in Resources */ = {isa = PBXBuildFile; fileRef = 2F77FDCD5E3AC390C73F70C2410BDD5F /* CTInterstitialImageViewController~ipadland.xib */; }; - 2C51BEEB2E27D4790AEB85D58DA866D7 /* CTBaseHeaderFooterViewController.h in Headers */ = {isa = PBXBuildFile; fileRef = 669173AD593C28F43CFDA6C2DC808B2A /* CTBaseHeaderFooterViewController.h */; settings = {ATTRIBUTES = (Project, ); }; }; - 2CE10803F7EF7653674C58CF1CC70285 /* SDWebImageTransition.h in Headers */ = {isa = PBXBuildFile; fileRef = A46DFEF103DBD055CFE37D69064D9616 /* SDWebImageTransition.h */; settings = {ATTRIBUTES = (Project, ); }; }; - 2D7ACD1BBBC4831C017A2FC70EBF7D95 /* CTKnownProfileFields.m in Sources */ = {isa = PBXBuildFile; fileRef = 54F3BAE8E64AB824642C525D1E190EE0 /* CTKnownProfileFields.m */; }; - 305002EF4E084EA95FB9569BDF0CC0CC /* CTInboxSimpleMessageCell.h in Headers */ = {isa = PBXBuildFile; fileRef = 5953C0ADF560E64DD159D8F198362993 /* CTInboxSimpleMessageCell.h */; settings = {ATTRIBUTES = (Project, ); }; }; - 3147F6455C4F4AAF72997C1B155D6AD9 /* SDImageIOCoder.m in Sources */ = {isa = PBXBuildFile; fileRef = 6E3FDD985EEB50BA51CA09763A782BB4 /* SDImageIOCoder.m */; }; - 321BA13855602C7516A115534D182E51 /* CTCoverViewController~ipadland.xib in Resources */ = {isa = PBXBuildFile; fileRef = 574F35A1A27E02D43233CEE2EDA73094 /* CTCoverViewController~ipadland.xib */; }; - 3324C6BF382971E978AC2B74D2DC1939 /* SDImageCache.h in Headers */ = {isa = PBXBuildFile; fileRef = FBF52036CD383B558A63419864C8240C /* SDImageCache.h */; settings = {ATTRIBUTES = (Project, ); }; }; - 33C2A13A0D807063195BC09DD107D286 /* SDAsyncBlockOperation.h in Headers */ = {isa = PBXBuildFile; fileRef = 6F3D47270216FD284A388DFF4DE9C56B /* SDAsyncBlockOperation.h */; settings = {ATTRIBUTES = (Project, ); }; }; - 34852294FE1AC10A8DF4174ACC24F164 /* SDWebImageDefine.m in Sources */ = {isa = PBXBuildFile; fileRef = A077996AAE18318A5E592ADE7EB6B517 /* SDWebImageDefine.m */; }; - 34C2FBBDD6F84720095FB656D8D34C74 /* CTCertificatePinning.h in Headers */ = {isa = PBXBuildFile; fileRef = CD88FA18A4C75C7555580BB68DD2E474 /* CTCertificatePinning.h */; settings = {ATTRIBUTES = (Project, ); }; }; - 3696997DE1170F3D8DD3CB6C4FD5CB51 /* CTInAppFCManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 00977057B0A51B848086499302224B72 /* CTInAppFCManager.m */; }; - 377F3EF762F4705AD0992CBCF4A8E357 /* CleverTapDisplayUnitContent.m in Sources */ = {isa = PBXBuildFile; fileRef = 86866E88CE96911DC543630F464CB471 /* CleverTapDisplayUnitContent.m */; }; - 37AD0DBA6826AD77E8B15698A008B270 /* SDWebImageCacheSerializer.m in Sources */ = {isa = PBXBuildFile; fileRef = E596FAC6EE4112F4DF1BE215186B0F9C /* SDWebImageCacheSerializer.m */; }; - 37BA6494EBA8078FF619C0A9A47664D6 /* SDDeviceHelper.h in Headers */ = {isa = PBXBuildFile; fileRef = C74704433D2A2BFB8FA5832C59912D62 /* SDDeviceHelper.h */; settings = {ATTRIBUTES = (Project, ); }; }; - 38ABE7901CC2B96E01DB895292559923 /* SDWebImageManager.h in Headers */ = {isa = PBXBuildFile; fileRef = 015702D9209383ABECC2F014EF176A39 /* SDWebImageManager.h */; settings = {ATTRIBUTES = (Project, ); }; }; - 38C72D89C3E2E93CCFC240586E834672 /* CleverTapUTMDetail.h in Headers */ = {isa = PBXBuildFile; fileRef = 9BB6777553FFD129A1D3D985F5EB85E9 /* CleverTapUTMDetail.h */; settings = {ATTRIBUTES = (Project, ); }; }; - 394E3E20F6D66D0F66B98ECF48845E7F /* CTAlertViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 8D039F17DCF6EC1C3233A9ABF3617859 /* CTAlertViewController.m */; }; - 39D1B3C61ADC6B65A26CC2D8C57979BC /* SDImageAssetManager.h in Headers */ = {isa = PBXBuildFile; fileRef = D643CE43B3EC5A054BC61EDDA110E38B /* SDImageAssetManager.h */; settings = {ATTRIBUTES = (Project, ); }; }; - 3A03F0F5024DCF23C009341B4B1CBDF1 /* SDWebImageCacheSerializer.h in Headers */ = {isa = PBXBuildFile; fileRef = C7F1336788EA894A86B97FD32BC6DFB2 /* SDWebImageCacheSerializer.h */; settings = {ATTRIBUTES = (Project, ); }; }; - 3A9D5239C51946B1D80DAE0612AF9CE3 /* SDDiskCache.m in Sources */ = {isa = PBXBuildFile; fileRef = 7919F9A07E64A2BD59B842EE96FF7630 /* SDDiskCache.m */; }; - 3AD6B5FC9FBF47D2815FAC88AEB09AE6 /* CTInterstitialImageViewController.h in Headers */ = {isa = PBXBuildFile; fileRef = 839B3BEFF668F85036F42A09633B5AB6 /* CTInterstitialImageViewController.h */; settings = {ATTRIBUTES = (Project, ); }; }; - 3B26AC051F933D8B6C7490779555887B /* SDImageCachesManagerOperation.h in Headers */ = {isa = PBXBuildFile; fileRef = EF100CCC38AFB29E96AA44FDE2641B0B /* SDImageCachesManagerOperation.h */; settings = {ATTRIBUTES = (Project, ); }; }; - 3B94A8CA5F89719584453941D438F7F2 /* ct_default_audio.png in Resources */ = {isa = PBXBuildFile; fileRef = 5B3E7718F77A937296DB0624DE38CAB0 /* ct_default_audio.png */; }; - 3C409B4A3D911BA544CB16903794E358 /* SDImageLoader.h in Headers */ = {isa = PBXBuildFile; fileRef = B4CCEA7B9AB8179243AA7BCF8F1843F0 /* SDImageLoader.h */; settings = {ATTRIBUTES = (Project, ); }; }; - 3CAE5C63F4EFA4CE2E84A1D94D6CF626 /* SDInternalMacros.m in Sources */ = {isa = PBXBuildFile; fileRef = DB94804330549717181057300B7F6498 /* SDInternalMacros.m */; }; - 3CCC15BACC8F11081A0B08B56F727412 /* SDWebImageCacheKeyFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = 5ABCFB0D9B6A824DA652BB608CD41863 /* SDWebImageCacheKeyFilter.m */; }; - 3D3AFA98759F4A3137A133DE5E172A14 /* SDWebImageDownloaderDecryptor.h in Headers */ = {isa = PBXBuildFile; fileRef = AE73A51DB637DE91619FDD0DF9F419F7 /* SDWebImageDownloaderDecryptor.h */; settings = {ATTRIBUTES = (Project, ); }; }; - 3D54532FCF02815965A4CB61BC18731A /* CTInterstitialViewController~iphoneland.xib in Resources */ = {isa = PBXBuildFile; fileRef = 3355083555001F5475FA0FF1F2C47ADF /* CTInterstitialViewController~iphoneland.xib */; }; - 3ED6AAFF90D5AB684EE8AA094CCB7A6E /* ct_volume_off.png in Resources */ = {isa = PBXBuildFile; fileRef = 0DC37245253918181A8654CCEBC82D30 /* ct_volume_off.png */; }; - 4070170F97B26578C54578937D6103F8 /* SDWebImageDownloaderConfig.m in Sources */ = {isa = PBXBuildFile; fileRef = 746819FC279E5153C310209871F890B1 /* SDWebImageDownloaderConfig.m */; }; - 42AFEE0589918ABDD9E6BF3C68286423 /* CTInboxSimpleMessageCell.m in Sources */ = {isa = PBXBuildFile; fileRef = EC79B2DDFF9810898AC8C8652B0CCF9D /* CTInboxSimpleMessageCell.m */; }; - 433672A81111C00FCC24AEE99652DFD7 /* SDGraphicsImageRenderer.m in Sources */ = {isa = PBXBuildFile; fileRef = E0025D4100845ADE4C3E74DC53D622E1 /* SDGraphicsImageRenderer.m */; }; - 439CA8EE8B52A15C9E934D5D5838DB5B /* CTFlexibleIdentityRepo.m in Sources */ = {isa = PBXBuildFile; fileRef = 13884828E45BD240D93462184FE5DFE3 /* CTFlexibleIdentityRepo.m */; }; - 442A3ED55E08338002C7E06FBD3C412F /* SDWebImageCacheKeyFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = 5E8350B2002BB786078CE37E7708D08E /* SDWebImageCacheKeyFilter.h */; settings = {ATTRIBUTES = (Project, ); }; }; - 45CBFD5C8E520409185A3E6F28F6F678 /* SDMemoryCache.m in Sources */ = {isa = PBXBuildFile; fileRef = 7F57416F3E2C663F3F3C0F8D24B6C359 /* SDMemoryCache.m */; }; - 4616046D339260897AA1367059A68EFD /* CleverTapInboxMessage.m in Sources */ = {isa = PBXBuildFile; fileRef = 106D6A992CCFF8251E10EAA0AF9DE8C8 /* CleverTapInboxMessage.m */; }; - 46AA08991E5E2B877666408E628F830C /* CleverTap.m in Sources */ = {isa = PBXBuildFile; fileRef = FE345882B6F962FFAECA8400DBEDB8E9 /* CleverTap.m */; }; - 46AF2F06EE85CE28B933C85FE84EB66F /* UIColor+SDHexString.m in Sources */ = {isa = PBXBuildFile; fileRef = 24475BB0DC666C02D5B6D5CF4B3BCF9F /* UIColor+SDHexString.m */; }; - 481ED20AA13F7B42BCBA63DD269CC7ED /* SDImageCachesManager.m in Sources */ = {isa = PBXBuildFile; fileRef = EF61764DECEEFF4DF9B3DB3F2FBB7DF0 /* SDImageCachesManager.m */; }; - 485F8F7F76A14326AEC4DB09D8C584FD /* CTPlistInfo.h in Headers */ = {isa = PBXBuildFile; fileRef = 25DCB73F49A70C4883484C3C0057A061 /* CTPlistInfo.h */; settings = {ATTRIBUTES = (Project, ); }; }; - 489199278855BAB5EA879D755481FFBB /* CTUserMO.m in Sources */ = {isa = PBXBuildFile; fileRef = 8FD9F0672E9BE622CDAE944295DBAF86 /* CTUserMO.m */; }; - 49CD09716EB767B676F58E4A36108DA4 /* CTCarouselImageView.h in Headers */ = {isa = PBXBuildFile; fileRef = 0460AEA43738FC0A6BC7B925687EC2DA /* CTCarouselImageView.h */; settings = {ATTRIBUTES = (Project, ); }; }; - 4A58E1F94456C10A0A10C7F61E022EF4 /* CTCoverImageViewController.h in Headers */ = {isa = PBXBuildFile; fileRef = 20676949C3F408F2513D14585D050C43 /* CTCoverImageViewController.h */; settings = {ATTRIBUTES = (Project, ); }; }; - 4AC27F91CF6CEF69DF25D394104D6AEB /* SDWebImageIndicator.m in Sources */ = {isa = PBXBuildFile; fileRef = C98DC5F1ED12F6D7F1489BA091C2680E /* SDWebImageIndicator.m */; }; - 4B58CBD67FBD622830342CFD35C52F90 /* CTPinnedNSURLSessionDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = A7CEA0AE86662D5C6ADF880963697AE6 /* CTPinnedNSURLSessionDelegate.m */; }; - 4BF8924FBA54B5213B8885960F46CC05 /* CTCarouselImageMessageCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 13FB82659B37E2BDE9A8512467362D24 /* CTCarouselImageMessageCell.m */; }; - 4C822CE57C5E073D24CD1EFDC916F7BC /* CTInAppFCManager.h in Headers */ = {isa = PBXBuildFile; fileRef = AF34EB8844737AB2B131CF2B93EDDFFC /* CTInAppFCManager.h */; settings = {ATTRIBUTES = (Project, ); }; }; - 4D112C05D2652DBB71474FF96EE671AC /* CleverTapProductConfig.m in Sources */ = {isa = PBXBuildFile; fileRef = 8C60C2689B971C64C4467358A5DF8F52 /* CleverTapProductConfig.m */; }; - 4E39A6F22856E4B347760BA19FC9511E /* CTIdentityRepoFactory.h in Headers */ = {isa = PBXBuildFile; fileRef = EC8365F948FC4A7D0D595ED5C9CC10A4 /* CTIdentityRepoFactory.h */; settings = {ATTRIBUTES = (Project, ); }; }; - 4E48C9B79DEC54C00E4537B431B83A22 /* CTProductConfigController.h in Headers */ = {isa = PBXBuildFile; fileRef = 9061233A283F25428E131229D097643A /* CTProductConfigController.h */; settings = {ATTRIBUTES = (Project, ); }; }; - 4E48F2018B377D003408D9141BA30523 /* CTInterstitialViewController~ipad.xib in Resources */ = {isa = PBXBuildFile; fileRef = 68DB8874E175D1C669FF5DC9E11DF942 /* CTInterstitialViewController~ipad.xib */; }; - 4E49257E42794F1F9B341F10FCF17CF0 /* SDImageGIFCoder.m in Sources */ = {isa = PBXBuildFile; fileRef = 066F4570FFF1C2F268D37EAC046FAE46 /* SDImageGIFCoder.m */; }; - 4EC16AB9695AA2FA5FF6A7170834AFA2 /* CTDismissButton.h in Headers */ = {isa = PBXBuildFile; fileRef = 6B6B0152B7B7EDE22C2AA23481CCE693 /* CTDismissButton.h */; settings = {ATTRIBUTES = (Project, ); }; }; - 4F01B04071B3572C3FFF6297F8BD231B /* CTInAppNotification.m in Sources */ = {isa = PBXBuildFile; fileRef = 67244003DBBB806BE9E337D9F3704816 /* CTInAppNotification.m */; }; - 4FF817F949C80475B43DE719847DFA3B /* CTMessageMO+CoreDataProperties.m in Sources */ = {isa = PBXBuildFile; fileRef = 6A321A0B66A4C350B3BCB28CE536FEC4 /* CTMessageMO+CoreDataProperties.m */; }; - 505251EFABD311A066F70858A1E8E24B /* CTInboxIconMessageCell~port.xib in Resources */ = {isa = PBXBuildFile; fileRef = 8BC7C21E8D8252D5C308E3E678C65F0C /* CTInboxIconMessageCell~port.xib */; }; - 530DE90E0A99FF03FDBAD84091771C8F /* SDImageHEICCoder.h in Headers */ = {isa = PBXBuildFile; fileRef = 9C9B9032EFD98FE57E90584B9DAA8289 /* SDImageHEICCoder.h */; settings = {ATTRIBUTES = (Project, ); }; }; - 5327EA4C727582A559291D1A86123C65 /* UIView+WebCache.h in Headers */ = {isa = PBXBuildFile; fileRef = A91F72EA20CFAB8860E455B57D684CB4 /* UIView+WebCache.h */; settings = {ATTRIBUTES = (Project, ); }; }; - 53B0D92433829418B14BD6E01626F6C3 /* SDWebImagePrefetcher.h in Headers */ = {isa = PBXBuildFile; fileRef = E5CD5A312CF73AAEF2992E927C3D7AB6 /* SDWebImagePrefetcher.h */; settings = {ATTRIBUTES = (Project, ); }; }; - 53E2694AE3C51893A7F2EA89F050AC08 /* SDWebImageError.m in Sources */ = {isa = PBXBuildFile; fileRef = 9C242DBB319B050770DF72E679427AFA /* SDWebImageError.m */; }; - 53FD81B2C5E5A10426866CEACBD8E8A6 /* CTFooterViewController.h in Headers */ = {isa = PBXBuildFile; fileRef = AC86ED680E7D9D0507D35341011AD6C4 /* CTFooterViewController.h */; settings = {ATTRIBUTES = (Project, ); }; }; - 551F0DA5457ABF8ABDFFE2E78D126824 /* SDImageIOCoder.h in Headers */ = {isa = PBXBuildFile; fileRef = 16097C7F6514F1081519CE4944E32E70 /* SDImageIOCoder.h */; settings = {ATTRIBUTES = (Project, ); }; }; - 55DA5C989C828A2980CFB72D32795B65 /* CTInboxIconMessageCell~land.xib in Resources */ = {isa = PBXBuildFile; fileRef = 42CE513BA7738FAF5E48199B3A94801B /* CTInboxIconMessageCell~land.xib */; }; - 56CA0E4FB9B0C569011909C0258D5737 /* SDDiskCache.h in Headers */ = {isa = PBXBuildFile; fileRef = 5E0ABB2B74C7B86C1313D20D72877318 /* SDDiskCache.h */; settings = {ATTRIBUTES = (Project, ); }; }; - 58E219F430B011353632696D93B14D87 /* UIImage+ForceDecode.h in Headers */ = {isa = PBXBuildFile; fileRef = 6F610A1116D03C974539810DFE0B11D1 /* UIImage+ForceDecode.h */; settings = {ATTRIBUTES = (Project, ); }; }; - 58F509FB51A7791C4823D38290A8919F /* CleverTapEventDetail.m in Sources */ = {isa = PBXBuildFile; fileRef = 0E11A327EC315983FAA38A8A7B7E0479 /* CleverTapEventDetail.m */; }; - 5A025D37DE986F7871083EB4C1650D12 /* CTPreferences.h in Headers */ = {isa = PBXBuildFile; fileRef = 119ED479841230E7547357661F9CC740 /* CTPreferences.h */; settings = {ATTRIBUTES = (Project, ); }; }; - 5B9D674EE860A2C700EBC705BCDB5C6D /* SDAnimatedImageView.m in Sources */ = {isa = PBXBuildFile; fileRef = DFFDEDE53EDB6A617BDE61990D0F58A0 /* SDAnimatedImageView.m */; }; - 5BBB0C40E4042E4AD72C02632410D9C3 /* CTInboxSimpleMessageCell~port.xib in Resources */ = {isa = PBXBuildFile; fileRef = 695DE06747201EBB1B0938214D18667E /* CTInboxSimpleMessageCell~port.xib */; }; - 5D9BE78B2601A77D7C8A19C065726DFD /* SDWebImageDownloaderOperation.m in Sources */ = {isa = PBXBuildFile; fileRef = 85A87D21F33A8CB6456E42A48F586276 /* SDWebImageDownloaderOperation.m */; }; - 5DA9BD54E019A4DD5341E39E94396DCB /* CTDeviceInfo.m in Sources */ = {isa = PBXBuildFile; fileRef = 5E6A826124FEFDBFE2CEA02ACD7E1B47 /* CTDeviceInfo.m */; }; - 5DF2BF40C639D7300C1894A50C8FFB49 /* CTInboxMessageActionView.h in Headers */ = {isa = PBXBuildFile; fileRef = FFB7A7727BD01FC0C7DB6B4605CD6A34 /* CTInboxMessageActionView.h */; settings = {ATTRIBUTES = (Project, ); }; }; - 5EA1C709340C9B624FACAAACD96659CE /* NSBezierPath+SDRoundedCorners.h in Headers */ = {isa = PBXBuildFile; fileRef = 0D3BB4A10F6FEFC7B88D4774FDC95644 /* NSBezierPath+SDRoundedCorners.h */; settings = {ATTRIBUTES = (Project, ); }; }; - 5EE1F67A6B35CE18D9A0F91C2EFBDF0D /* CTFooterViewController~iphoneland.xib in Resources */ = {isa = PBXBuildFile; fileRef = 001CD11C6DBA31CC5C6C17DF1E598C2F /* CTFooterViewController~iphoneland.xib */; }; - 60E51187089AE7C240184FF514FDAF66 /* CTCarouselMessageCell.m in Sources */ = {isa = PBXBuildFile; fileRef = E08F10F2BC4A009DEAC6EFA85855A79C /* CTCarouselMessageCell.m */; }; - 61093E3BDD67C95E80BA2CD1DA2CB1FE /* CleverTapProductConfigPrivate.h in Headers */ = {isa = PBXBuildFile; fileRef = AE5009351D59DDA739F20E23F66DAC08 /* CleverTapProductConfigPrivate.h */; settings = {ATTRIBUTES = (Project, ); }; }; - 62A78505705699EC977E31B2D553918A /* CTAlertViewController.h in Headers */ = {isa = PBXBuildFile; fileRef = 30393578A859C72471B61413FA794A2E /* CTAlertViewController.h */; settings = {ATTRIBUTES = (Project, ); }; }; - 6472A665A3855664BFF3525A19B00593 /* SDWebImageOptionsProcessor.m in Sources */ = {isa = PBXBuildFile; fileRef = D30E57ED6E0D7C3DEA42DADADDCAAE2B /* SDWebImageOptionsProcessor.m */; }; - 64D53A1558B6F15EB66E08004A637F2A /* ic_pause@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = EEED3A83D290E3DBB00927D6EA94C61D /* ic_pause@2x.png */; }; - 65BD6054F9099A3FF7A9205390A08B06 /* SDWebImageDownloader.h in Headers */ = {isa = PBXBuildFile; fileRef = EA5CA0104656A1A9763EB85238DE649F /* SDWebImageDownloader.h */; settings = {ATTRIBUTES = (Project, ); }; }; - 66593B799BD4FD47CE11539A412BC7AC /* CTInboxBaseMessageCell.h in Headers */ = {isa = PBXBuildFile; fileRef = 944EB67D9B36E082D7786C76971921D1 /* CTInboxBaseMessageCell.h */; settings = {ATTRIBUTES = (Project, ); }; }; - 66C8E8E8257CF535B772DBEFFB0B408E /* ct_default_portrait_image.png in Resources */ = {isa = PBXBuildFile; fileRef = CD8B4D648262E2A7056432B0892C9BB0 /* ct_default_portrait_image.png */; }; - 67DB19E2AC0E55B71AB2968779434B2A /* CTUriHelper.m in Sources */ = {isa = PBXBuildFile; fileRef = 1B69E867C28CB2003F341BABE4F09747 /* CTUriHelper.m */; }; - 6810992D3ADA7047F2782755BB19319A /* SDAnimatedImage.m in Sources */ = {isa = PBXBuildFile; fileRef = 1ACF4B9D4BDA654D22EC52C4AAB4C574 /* SDAnimatedImage.m */; }; - 6893222FD082322CFF8EDE3878DC3301 /* UIImage+Transform.m in Sources */ = {isa = PBXBuildFile; fileRef = F2F11EF6692F98BAF5BEFDFDEB57A4CB /* UIImage+Transform.m */; }; - 68A4CA9881F732EFC6364456D4C52F28 /* CleverTapInstanceConfig.m in Sources */ = {isa = PBXBuildFile; fileRef = BAB275E090F899F1ADE75280F7AACC83 /* CleverTapInstanceConfig.m */; }; - 6913F3F61272921B9C24628B779410A7 /* CleverTapConfigValue.m in Sources */ = {isa = PBXBuildFile; fileRef = 81FBE933CE7AF8E701525948436E15FD /* CleverTapConfigValue.m */; }; - 697F8D118A068002AF63F3EBCC5E8CD6 /* CTCoverViewController~iphoneport.xib in Resources */ = {isa = PBXBuildFile; fileRef = B030A516E775005559E47796D5A29D6B /* CTCoverViewController~iphoneport.xib */; }; - 6BA2EF6416256037E65C78C6C7194784 /* SDAnimatedImagePlayer.m in Sources */ = {isa = PBXBuildFile; fileRef = 7F8C35246B78E9E1E1BED09C8C2F5522 /* SDAnimatedImagePlayer.m */; }; - 6BB2A281F9A399BC46D1E5F818B2E889 /* CTCoverImageViewController~ipad.xib in Resources */ = {isa = PBXBuildFile; fileRef = 3FC2BB0130BEAE2D5A7CEB4EDFC73D45 /* CTCoverImageViewController~ipad.xib */; }; - 6C43654D32837794C9CC762B7EB6CF56 /* CTUIUtils.m in Sources */ = {isa = PBXBuildFile; fileRef = 93A5DBECA299C2A050495326C865A719 /* CTUIUtils.m */; }; - 6D86E2BF4BADEDC1E3E00BF572B2C27B /* NSImage+Compatibility.m in Sources */ = {isa = PBXBuildFile; fileRef = 024B3B7633A7E77942EAC77961C330B3 /* NSImage+Compatibility.m */; }; - 6D93676E8CC51D593D7E9E51A0ADC2BC /* CleverTapInboxViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 1ED1FAB598D03F264D52245F1AC50C10 /* CleverTapInboxViewController.m */; }; - 6EF462643C5AB20E95D69063B36D94C3 /* CleverTapInstanceConfig.h in Headers */ = {isa = PBXBuildFile; fileRef = 0BE0A703C6059424FC07B079FDF31C41 /* CleverTapInstanceConfig.h */; settings = {ATTRIBUTES = (Project, ); }; }; - 70BA7A91239CF7A6842E106C5C42EFFC /* CTHalfInterstitialImageViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 904F0809DDBDD45452F46CE7DF8D931D /* CTHalfInterstitialImageViewController.m */; }; - 721F50767DE03C790886661FE55E2FED /* SDWebImageDownloaderConfig.h in Headers */ = {isa = PBXBuildFile; fileRef = 04FD1108A33776E813B0A3FAE12269C8 /* SDWebImageDownloaderConfig.h */; settings = {ATTRIBUTES = (Project, ); }; }; - 72838CB739BAB0571986CA1107BB2E02 /* CTUserMO+CoreDataProperties.m in Sources */ = {isa = PBXBuildFile; fileRef = 3044E0A40F903962407D6CE836CA25D1 /* CTUserMO+CoreDataProperties.m */; }; - 73E930AC7544156A2DFEB3B78DC2883C /* SDImageLoader.m in Sources */ = {isa = PBXBuildFile; fileRef = EB7C3FAF9A4F3A4625DDA49824488AF1 /* SDImageLoader.m */; }; - 741587458DA9CE48600E1EC92563210C /* ic_pause@1x.png in Resources */ = {isa = PBXBuildFile; fileRef = B690B9F84A31E9F854FF89C3D705D0DC /* ic_pause@1x.png */; }; - 7431A1A02F47D3BA779304CF4C34DA00 /* UIImage+MemoryCacheCost.h in Headers */ = {isa = PBXBuildFile; fileRef = FE5D961825AC94A63D2DCED77E9DC6E7 /* UIImage+MemoryCacheCost.h */; settings = {ATTRIBUTES = (Project, ); }; }; - 747852107AFCACB3DAF77201E5EF5D17 /* CleverTapBuildInfo.h in Headers */ = {isa = PBXBuildFile; fileRef = B7C1680AAA74DE1A0B177AD8C9FB8869 /* CleverTapBuildInfo.h */; settings = {ATTRIBUTES = (Project, ); }; }; - 74D39F285A5BD53FB1512FE4788DAD7E /* SDImageAssetManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 4727100A928328776F720D1D23037FB2 /* SDImageAssetManager.m */; }; - 758D1816BFB3F8503FD5EA4C772ADE6C /* CTFeatureFlagsController.m in Sources */ = {isa = PBXBuildFile; fileRef = 0AEF3B70819065A7D19945BD96049F84 /* CTFeatureFlagsController.m */; }; - 75C18F34E90640F549F522814F382C09 /* SDMemoryCache.h in Headers */ = {isa = PBXBuildFile; fileRef = 70FE796A747457D7FE31038774F14D69 /* SDMemoryCache.h */; settings = {ATTRIBUTES = (Project, ); }; }; - 769524215C10FD07A06C0E9F6330E02F /* ic_play@3x.png in Resources */ = {isa = PBXBuildFile; fileRef = BABEA7103F1003968ABDB3DF764238CC /* ic_play@3x.png */; }; - 776484F7ADE029F09D9EC67AF1D48348 /* SDImageCoderHelper.m in Sources */ = {isa = PBXBuildFile; fileRef = 85A7A9B6200470118549E81DE56FB0B2 /* SDImageCoderHelper.m */; }; - 77A67DCEED6897F90035A8B12404972A /* CTInterstitialImageViewController~iphoneland.xib in Resources */ = {isa = PBXBuildFile; fileRef = AA3E0F69C4929916311ECE94BA0AD547 /* CTInterstitialImageViewController~iphoneland.xib */; }; - 79B2EA32E36BBE5C6D8A96E94471A10D /* CTLegacyIdentityRepo.h in Headers */ = {isa = PBXBuildFile; fileRef = C9C499D8DF5F7C1EEADE6640FC5DC95B /* CTLegacyIdentityRepo.h */; settings = {ATTRIBUTES = (Project, ); }; }; - 7A127AB38B019D16BE4EBD6B91A31B0D /* NSButton+WebCache.h in Headers */ = {isa = PBXBuildFile; fileRef = D0CEDCAAE2DED819B7EF2362453BD84D /* NSButton+WebCache.h */; settings = {ATTRIBUTES = (Project, ); }; }; - 7A817F14567BD3F59F774F20EE0C70AE /* CTLocalInApp.m in Sources */ = {isa = PBXBuildFile; fileRef = 70FD6DEC3A1DB47CE299F4C86AB3B42D /* CTLocalInApp.m */; }; - 7ADC48DA8653E23CF33BF76326D2029C /* CTMessageMO.h in Headers */ = {isa = PBXBuildFile; fileRef = FA519E2D3056E7FF8BFD2EDDFBA96F0D /* CTMessageMO.h */; settings = {ATTRIBUTES = (Project, ); }; }; - 7B1E870BA2D33992CF4797D67E8FB52E /* CTInboxBaseMessageCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 8C6B506E7EB9C6801EC9C3A36EB27F2D /* CTInboxBaseMessageCell.m */; }; - 7B8CD1F84DE471808E72440F8B34D8AE /* CTImageInAppViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 6FDD77F6E7D15A400B43A24A44D6C577 /* CTImageInAppViewController.m */; }; - 7B9C6A2E2A83FB42C9E803EC60D0882C /* CleverTap+FeatureFlags.h in Headers */ = {isa = PBXBuildFile; fileRef = F1F4C780744FADA7A04D6B2B5DFF9149 /* CleverTap+FeatureFlags.h */; settings = {ATTRIBUTES = (Project, ); }; }; - 7C1AD8656852D3DB507D37DB76607D74 /* SDWebImageDownloaderOperation.h in Headers */ = {isa = PBXBuildFile; fileRef = F730725CEACF1ACCAEFDBFE191F983B0 /* SDWebImageDownloaderOperation.h */; settings = {ATTRIBUTES = (Project, ); }; }; - 7C870B11DD0FF324ADB89447EA7F2942 /* CTDisplayUnitController.m in Sources */ = {isa = PBXBuildFile; fileRef = F4C976AFC10EC48CA8139A81D5C11E01 /* CTDisplayUnitController.m */; }; - 7DA415DFD94BD89BC862ABCE152C27DA /* SDWebImageTransition.m in Sources */ = {isa = PBXBuildFile; fileRef = 6A6F2F4646F47D8932E0D70223446B7B /* SDWebImageTransition.m */; }; - 7E71820988BF8358F6BCC00D4DA1C13A /* CTBaseHeaderFooterViewControllerPrivate.h in Headers */ = {isa = PBXBuildFile; fileRef = C30ABEF34BE8C94244E6988AA930DA2F /* CTBaseHeaderFooterViewControllerPrivate.h */; settings = {ATTRIBUTES = (Project, ); }; }; - 7E9538B53CED5E6996A5F16DAA074682 /* CTCoverViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = A3438026E12106F44F01403432CFF22B /* CTCoverViewController.m */; }; - 7ED4EBB4F360B8A99231A5F6DC7A025E /* SDWebImageManager.m in Sources */ = {isa = PBXBuildFile; fileRef = CDA01F4A78F48C8EC956593EA48BC1C5 /* SDWebImageManager.m */; }; - 7EE251E4B92ABB7AC1009FED60F51F8B /* SDWebImageCompat.h in Headers */ = {isa = PBXBuildFile; fileRef = 6A494003781D15E46C7C9C5303FF3909 /* SDWebImageCompat.h */; settings = {ATTRIBUTES = (Project, ); }; }; - 7F5AE16F8A723EA58D0AF1D57791E005 /* SDWebImageDownloaderDecryptor.m in Sources */ = {isa = PBXBuildFile; fileRef = 2BB235C5DC09791050F33C45042CBB7A /* SDWebImageDownloaderDecryptor.m */; }; - 7F5E3062F024B0FCE550507581034E2E /* SDImageTransformer.m in Sources */ = {isa = PBXBuildFile; fileRef = D62697E5CD8268785798C23669C1224E /* SDImageTransformer.m */; }; - 829D01532228F3AF709E7C8FC81B67D2 /* CTLocalDataStore.m in Sources */ = {isa = PBXBuildFile; fileRef = 6089E0CC8E5CDE81ADB3E9995BAF3CA6 /* CTLocalDataStore.m */; }; - 82B4303C6B953C6A439827EC61B6772D /* CTValidator.h in Headers */ = {isa = PBXBuildFile; fileRef = AF9B9F9007EDBD8F51DFF63D0E646C33 /* CTValidator.h */; settings = {ATTRIBUTES = (Project, ); }; }; - 82E0382D42B21CFC2DD61240064E5AE3 /* CleverTap+InAppNotifications.h in Headers */ = {isa = PBXBuildFile; fileRef = A4B3ED3132AD0331B5BA77C3B125CBB4 /* CleverTap+InAppNotifications.h */; settings = {ATTRIBUTES = (Project, ); }; }; - 83015DCC070F8B5426906065EB8CDFC2 /* SDImageFrame.h in Headers */ = {isa = PBXBuildFile; fileRef = E69562FCF9E76BDE9B738180B7DEEF69 /* SDImageFrame.h */; settings = {ATTRIBUTES = (Project, ); }; }; - 836E25AACCFA35F70E1F203593077CB7 /* SDImageAWebPCoder.m in Sources */ = {isa = PBXBuildFile; fileRef = 3C2197F809548184A018851967EB483A /* SDImageAWebPCoder.m */; }; - 83915109F77D9D59761EA06BEBF2FC88 /* CTCarouselImageMessageCell.h in Headers */ = {isa = PBXBuildFile; fileRef = 84EEFFA5289F069FFC19F8EAA8819B6D /* CTCarouselImageMessageCell.h */; settings = {ATTRIBUTES = (Project, ); }; }; - 83FE0CD28BB57B99D2D4FEEC5A2F6B98 /* SDDisplayLink.m in Sources */ = {isa = PBXBuildFile; fileRef = 544872F3D43A607F07F20E57ECE8DDE8 /* SDDisplayLink.m */; }; - 84D01359793F57DBE9EAF023AD74EBD8 /* SDImageLoadersManager.h in Headers */ = {isa = PBXBuildFile; fileRef = B009E769BD71FA9044E3F54AD16E160C /* SDImageLoadersManager.h */; settings = {ATTRIBUTES = (Project, ); }; }; - 85F4726FCEC0D668B3AFDB8AAD2CA62E /* CTValidationResult.m in Sources */ = {isa = PBXBuildFile; fileRef = 38A65425915044808FCE3067CC9A24B0 /* CTValidationResult.m */; }; - 870D3B600F8E3860DBE2D56FBE45930B /* UIColor+SDHexString.h in Headers */ = {isa = PBXBuildFile; fileRef = BF9912E98C14E90D196DA77E07B76723 /* UIColor+SDHexString.h */; settings = {ATTRIBUTES = (Project, ); }; }; - 873079839917F7DC6628226530D0FCAF /* CTUserMO+CoreDataProperties.h in Headers */ = {isa = PBXBuildFile; fileRef = ACB4A110AD3840CDDFB1EACAD39F6FFD /* CTUserMO+CoreDataProperties.h */; settings = {ATTRIBUTES = (Project, ); }; }; - 87586B34FEB88664FA4E667758F5A511 /* UIView+CTToast.h in Headers */ = {isa = PBXBuildFile; fileRef = C2200CC9B31A0AA14B84B49BA76F4632 /* UIView+CTToast.h */; settings = {ATTRIBUTES = (Project, ); }; }; - 87D79028AB0BF5FC91D4A124A53DDF39 /* CleverTapSyncDelegate.h in Headers */ = {isa = PBXBuildFile; fileRef = 3ED3EF9F43B16534AD490195D29AE6ED /* CleverTapSyncDelegate.h */; settings = {ATTRIBUTES = (Project, ); }; }; - 88146BBB36338C7AA26808448B576A5D /* UIImage+ExtendedCacheData.h in Headers */ = {isa = PBXBuildFile; fileRef = 90A4753BB9D2D9F51791019C111E1974 /* UIImage+ExtendedCacheData.h */; settings = {ATTRIBUTES = (Project, ); }; }; - 894555CC7ABD52EC6D717A244F90EAC5 /* SDWebImageCompat.m in Sources */ = {isa = PBXBuildFile; fileRef = 63504EE310ED0E0DFF19CAD89CE47C4A /* SDWebImageCompat.m */; }; - 897984BAC52E2AD10CA947D3201E5569 /* SDAnimatedImagePlayer.h in Headers */ = {isa = PBXBuildFile; fileRef = 1DE5E75481568A2B32AE367997CFFAC7 /* SDAnimatedImagePlayer.h */; settings = {ATTRIBUTES = (Project, ); }; }; - 8CD6CDCDD5BCEDEE6AB4DD76446AD808 /* CTSwizzle.h in Headers */ = {isa = PBXBuildFile; fileRef = 7CE6982D765FC929E83F5AA0B9C1C12B /* CTSwizzle.h */; settings = {ATTRIBUTES = (Project, ); }; }; - 9018C94AD4264974B5DB02ADE8FB18BE /* CTInterstitialImageViewController~ipad.xib in Resources */ = {isa = PBXBuildFile; fileRef = F004A06E523AFEE3F1859942220996DB /* CTInterstitialImageViewController~ipad.xib */; }; - 9051FF0A1FB6CFB7BAF277CC7B96561C /* CleverTapFeatureFlagsPrivate.h in Headers */ = {isa = PBXBuildFile; fileRef = 9D3871DA8784E9C9EB3AB8E0B268D240 /* CleverTapFeatureFlagsPrivate.h */; settings = {ATTRIBUTES = (Project, ); }; }; - 90DB71E44A4A08960A9EF2B4C8A0157C /* SDImageGIFCoder.h in Headers */ = {isa = PBXBuildFile; fileRef = BD1FAA1BC6547C6AA995CA092E834279 /* SDImageGIFCoder.h */; settings = {ATTRIBUTES = (Project, ); }; }; - 90F75A1DEA7B529FD16C99F50ECCA4FF /* CleverTapTrackedViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 033174CF8C10356EA929AA2A2F63A470 /* CleverTapTrackedViewController.m */; }; - 916CDB696A29D9E7BA876F5C7378E1B4 /* CTAVPlayerViewController.h in Headers */ = {isa = PBXBuildFile; fileRef = 3F593F0C6D158D3DA2AE624960878FEF /* CTAVPlayerViewController.h */; settings = {ATTRIBUTES = (Project, ); }; }; - 91E51B661AF42E6CE0A44456739367C5 /* CTHeaderViewController~iphoneland.xib in Resources */ = {isa = PBXBuildFile; fileRef = 4E9BAA64C409096D8915CBF2D11B496D /* CTHeaderViewController~iphoneland.xib */; }; - 9288D30DE210E2730F8F0714E1BB7BF9 /* CTHeaderViewController~ipad.xib in Resources */ = {isa = PBXBuildFile; fileRef = C2DA1B452DDA131358935AEE8C933F24 /* CTHeaderViewController~ipad.xib */; }; - 9291A78989CEA64D91C2A92EFEB8D8DF /* CTVideoThumbnailGenerator.m in Sources */ = {isa = PBXBuildFile; fileRef = F54EEF4EBA5C908306A8BBA7497F338E /* CTVideoThumbnailGenerator.m */; }; - 934754BBC303E9737FBE537BD8213C23 /* CleverTapInboxViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 9B50932D61BE49387712ACFA36D272C2 /* CleverTapInboxViewController.xib */; }; - 93763B966D6DB496865AAD07257AB526 /* CleverTapDisplayUnit.m in Sources */ = {isa = PBXBuildFile; fileRef = 7C8F687A9D2990315DEA8A801F99DEC6 /* CleverTapDisplayUnit.m */; }; - 93E9B626EA3A81DC359F779F706B5936 /* CTUserMO.h in Headers */ = {isa = PBXBuildFile; fileRef = 1C09E0FEBAC195465D9ADE7FE7A92825 /* CTUserMO.h */; settings = {ATTRIBUTES = (Project, ); }; }; - 942BFFD2ACFC348C1CDC8628BB8B175C /* CTHeaderViewController~iphoneport.xib in Resources */ = {isa = PBXBuildFile; fileRef = 988515B25BD9E8D28BFB99AAF8B9523A /* CTHeaderViewController~iphoneport.xib */; }; - 94A99C64223F2CEF1B3E71BCFBC24067 /* CTInterstitialViewController~ipadland.xib in Resources */ = {isa = PBXBuildFile; fileRef = 0DB2BE441B8E9D912D6EF29A5C7CA1A0 /* CTInterstitialViewController~ipadland.xib */; }; - 94D9084B595F5050674EB8C6915D3724 /* NSBezierPath+SDRoundedCorners.m in Sources */ = {isa = PBXBuildFile; fileRef = EB67F91C6EA0821C9C8A0A18D44B1DF3 /* NSBezierPath+SDRoundedCorners.m */; }; - 9563B53EB336D7043A74F0E9733F5097 /* CleverTap+Inbox.h in Headers */ = {isa = PBXBuildFile; fileRef = 27A6FF119000AC9D0EAD078858B59760 /* CleverTap+Inbox.h */; settings = {ATTRIBUTES = (Project, ); }; }; - 9581968FC1068A6768C06F9DE5BD6DDC /* CTCoverImageViewController~iphoneport.xib in Resources */ = {isa = PBXBuildFile; fileRef = 1A05B46DC2F050F6987B79997328D216 /* CTCoverImageViewController~iphoneport.xib */; }; - 9719691D631D35BDA3B2DCC64C4B1BFC /* SDImageFrame.m in Sources */ = {isa = PBXBuildFile; fileRef = 0289C1CE681412D099FD995B244D9DAB /* SDImageFrame.m */; }; - 97785513542462CDC82F88CED798A398 /* CTInboxUtils.h in Headers */ = {isa = PBXBuildFile; fileRef = 25B6CDEE094F880F63E761DCD3CF6D72 /* CTInboxUtils.h */; settings = {ATTRIBUTES = (Project, ); }; }; - 99804E217E834D8EEA6CA8C36D82CE4A /* NSData+ImageContentType.h in Headers */ = {isa = PBXBuildFile; fileRef = CD0B99BF2FA75FC8BB442E62E0C38C7D /* NSData+ImageContentType.h */; settings = {ATTRIBUTES = (Project, ); }; }; - 99BA6F1929CD0BF2287649D14432D8E8 /* SDWebImageOperation.h in Headers */ = {isa = PBXBuildFile; fileRef = E14AE69271E5AF7EAD14172603EBA07C /* SDWebImageOperation.h */; settings = {ATTRIBUTES = (Project, ); }; }; - 99DEDD06EB4B63F3663802BCCD9599E1 /* CTHalfInterstitialViewController~iphoneland.xib in Resources */ = {isa = PBXBuildFile; fileRef = 45A0D707EADB2664B26BE1F29DF15B0C /* CTHalfInterstitialViewController~iphoneland.xib */; }; - 9BE2B069934ECD54F915B6754382E36A /* CTInAppUtils.m in Sources */ = {isa = PBXBuildFile; fileRef = 6254F565321707DE4C5C85773DFEB98E /* CTInAppUtils.m */; }; - 9C106059A503917ACEEFB4E09E568CB3 /* CTFooterViewController~ipadland.xib in Resources */ = {isa = PBXBuildFile; fileRef = E97C1D8FE96CC38F3834CA682AE8C2A7 /* CTFooterViewController~ipadland.xib */; }; - 9C7D5782F0CD76EA2BB548EF0D0D7B64 /* CTCarouselMessageCell.h in Headers */ = {isa = PBXBuildFile; fileRef = 30112E19287E77647E2EFAC046A1F00F /* CTCarouselMessageCell.h */; settings = {ATTRIBUTES = (Project, ); }; }; - 9E3C76A3D017041F2AEECF08DDAE2F06 /* SDFileAttributeHelper.h in Headers */ = {isa = PBXBuildFile; fileRef = 352C85867DA59C648DED2E777E3A5A07 /* SDFileAttributeHelper.h */; settings = {ATTRIBUTES = (Project, ); }; }; - 9E5A9046C952858D256E69DF83A66463 /* CleverTap+SCDomain.h in Headers */ = {isa = PBXBuildFile; fileRef = 1904AFD42176A06DF30D894F2DE4BC13 /* CleverTap+SCDomain.h */; settings = {ATTRIBUTES = (Project, ); }; }; - 9E9A3C9AA004FC043ACCBAEF7B01D5EF /* CTHalfInterstitialImageViewController~ipadland.xib in Resources */ = {isa = PBXBuildFile; fileRef = 723C1B2E94575B053C89788AC0C96D81 /* CTHalfInterstitialImageViewController~ipadland.xib */; }; - 9EF93D72DBCDE9FEAA8726742B7E4760 /* CTCarouselImageMessageCell~land.xib in Resources */ = {isa = PBXBuildFile; fileRef = 63EF50442898251B0DF413DF8E078D0E /* CTCarouselImageMessageCell~land.xib */; }; - 9F470A8226B4B0840CBD436C5DCF4B61 /* CTHalfInterstitialViewController~iphoneport.xib in Resources */ = {isa = PBXBuildFile; fileRef = 420106F31480C2F9FEF39E9263318661 /* CTHalfInterstitialViewController~iphoneport.xib */; }; - 9F687D87E3A010BDEFC6C3FE3867A1C3 /* SDImageCache.m in Sources */ = {isa = PBXBuildFile; fileRef = EDA7216F106C2008F8F27D6B3952CD07 /* SDImageCache.m */; }; - A02D754C1D91F03CBDFD041E9DD8B195 /* CTSwipeView.h in Headers */ = {isa = PBXBuildFile; fileRef = A625274681FC0C6ED2D1F234C4242D96 /* CTSwipeView.h */; settings = {ATTRIBUTES = (Project, ); }; }; - A0A11D5C3481B1ED66831E3373DD9164 /* CTPinnedNSURLSessionDelegate.h in Headers */ = {isa = PBXBuildFile; fileRef = 91B47255C79FDBA4494F1FFEE7A53442 /* CTPinnedNSURLSessionDelegate.h */; settings = {ATTRIBUTES = (Project, ); }; }; - A15F466EFA681ABB36C77708CAB5463A /* CTLogger.m in Sources */ = {isa = PBXBuildFile; fileRef = D13384AD2FEB16BE536B63612705C56B /* CTLogger.m */; }; - A1695FF19D9C2D8E7997E5DBC46526A7 /* CTEventBuilder.h in Headers */ = {isa = PBXBuildFile; fileRef = 3AD91DE2026B38642D3A1F6EBB816017 /* CTEventBuilder.h */; settings = {ATTRIBUTES = (Project, ); }; }; - A1AE19D9AFA292114E8AD5FE495BB26B /* SDAnimatedImageView.h in Headers */ = {isa = PBXBuildFile; fileRef = 0C061BA06720B813A0EFDCAC2769DBAB /* SDAnimatedImageView.h */; settings = {ATTRIBUTES = (Project, ); }; }; - A2EC9DFDC74D3048A462D16D4A4AA9F4 /* UIImageView+WebCache.h in Headers */ = {isa = PBXBuildFile; fileRef = A727AC487F509F17E9A49152D5DA8ED0 /* UIImageView+WebCache.h */; settings = {ATTRIBUTES = (Project, ); }; }; - A30D8DCDC963F9ACDA41B49EECF62CF0 /* UIImage+GIF.m in Sources */ = {isa = PBXBuildFile; fileRef = ECE794CC220D1CAE29FCD9E5FFF15DB7 /* UIImage+GIF.m */; }; - A3D9602845C33DB21E063AA09D798C76 /* CTInboxIconMessageCell.m in Sources */ = {isa = PBXBuildFile; fileRef = AC4EF2CBFDE0A70BCA25525D5056A4E4 /* CTInboxIconMessageCell.m */; }; - A4C8CD921D40C7CB33D9BE98C89573BE /* UIImage+MultiFormat.h in Headers */ = {isa = PBXBuildFile; fileRef = 277F88B4B092203525E7B5017AA77C07 /* UIImage+MultiFormat.h */; settings = {ATTRIBUTES = (Project, ); }; }; - A6583B5A5EEADCC638F972542951B14A /* CleverTapEventDetail.h in Headers */ = {isa = PBXBuildFile; fileRef = BF8EB5EB298FBFB1089E80CFF0FF8322 /* CleverTapEventDetail.h */; settings = {ATTRIBUTES = (Project, ); }; }; - A77D962C11876F26FBA4B96231D32A5A /* SDImageCacheConfig.h in Headers */ = {isa = PBXBuildFile; fileRef = 06BDA0745D108411EE3D5412EEC1B5D8 /* SDImageCacheConfig.h */; settings = {ATTRIBUTES = (Project, ); }; }; - A7C0173C1561D684F8612E75E9A91DA4 /* SDImageCacheConfig.m in Sources */ = {isa = PBXBuildFile; fileRef = AD990BCAAC5994523FA1F32A3EE4426E /* SDImageCacheConfig.m */; }; - A9251794D83F83A4F17C5051D3C04E44 /* SDWebImageDownloader.m in Sources */ = {isa = PBXBuildFile; fileRef = 720D2862C25FCC0FA7F210E5A531EAC7 /* SDWebImageDownloader.m */; }; - AA4E7FB7390EE115AA39BF71993F8838 /* CleverTap+ProductConfig.h in Headers */ = {isa = PBXBuildFile; fileRef = 922AC66290629750330762EF26ABC328 /* CleverTap+ProductConfig.h */; settings = {ATTRIBUTES = (Project, ); }; }; - AA5DF3E2927D38A23F1616E5B336BA4D /* SDCallbackQueue.h in Headers */ = {isa = PBXBuildFile; fileRef = E0318D0477B7511F2C52012E58B724E8 /* SDCallbackQueue.h */; settings = {ATTRIBUTES = (Project, ); }; }; - AB03E8E5BDA88C07184C6EAA4FE85500 /* CTIdentityRepo.h in Headers */ = {isa = PBXBuildFile; fileRef = 9E7B36DC74428213BA270533C9DEE3E3 /* CTIdentityRepo.h */; settings = {ATTRIBUTES = (Project, ); }; }; - AC05B5719716441912D9F2FD62070E13 /* CleverTapUTMDetail.m in Sources */ = {isa = PBXBuildFile; fileRef = 248954A7E01024145753167DB9D2C678 /* CleverTapUTMDetail.m */; }; - AE86D5FDB92916F82417952DE911243B /* SDImageCoder.m in Sources */ = {isa = PBXBuildFile; fileRef = A56BD3B3C80A362ABEAB62ADCAF27365 /* SDImageCoder.m */; }; - B0C90A76586C7BCACA1BB381552323D0 /* UIView+WebCacheOperation.h in Headers */ = {isa = PBXBuildFile; fileRef = A92115ED235E1A875EE46AA6978A7D92 /* UIView+WebCacheOperation.h */; settings = {ATTRIBUTES = (Project, ); }; }; - B1AE2489FE5FF4CA50CFE9FFCF5008BC /* CTVideoThumbnailGenerator.h in Headers */ = {isa = PBXBuildFile; fileRef = 49427581ECF5C10C58702465FEFE51B6 /* CTVideoThumbnailGenerator.h */; settings = {ATTRIBUTES = (Project, ); }; }; - B1F7CF28B30C986D7E2F11D80DA158B8 /* SDImageCachesManager.h in Headers */ = {isa = PBXBuildFile; fileRef = 224D29D66442C01D3B2E680504619C73 /* SDImageCachesManager.h */; settings = {ATTRIBUTES = (Project, ); }; }; - B3139A61D767A7F99D88C8DEF2FA3F03 /* SDWeakProxy.h in Headers */ = {isa = PBXBuildFile; fileRef = 1283E8174B8DBD2CA14BAA8F5B25BC68 /* SDWeakProxy.h */; settings = {ATTRIBUTES = (Project, ); }; }; - B32DB6C2FE03E29813400A23A7851A1C /* CTValidationResult.h in Headers */ = {isa = PBXBuildFile; fileRef = A1AF65418FE77B2BE1D118E253E9BC84 /* CTValidationResult.h */; settings = {ATTRIBUTES = (Project, ); }; }; - B34DBE269AE41CC41CD32BF114C6398F /* CTInboxMessageActionView.m in Sources */ = {isa = PBXBuildFile; fileRef = 72235C82281462B9DA224177C6C079CB /* CTInboxMessageActionView.m */; }; - B3D69B492C4D47CA5E4404538EE74D38 /* CTFooterViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 242AB57CF992B95C1EDBD53C051B4DD2 /* CTFooterViewController.m */; }; - B46DBCC04BDD6FFF5506389A605FE1FF /* SDImageLoadersManager.m in Sources */ = {isa = PBXBuildFile; fileRef = BD9A547C62FECAA5332C9009FEA392F7 /* SDImageLoadersManager.m */; }; - B4E6D5C2E631EB9D140AEB2E77C08794 /* UIView+CTToast.m in Sources */ = {isa = PBXBuildFile; fileRef = AB9AF8983D11AFF26E8D5B7247E3BFB6 /* UIView+CTToast.m */; }; - B6573B6B630D7977BE6A9892506F66A9 /* CleverTapInAppNotificationDelegate.h in Headers */ = {isa = PBXBuildFile; fileRef = A603D557BEB6BB43E45C56310542F265 /* CleverTapInAppNotificationDelegate.h */; settings = {ATTRIBUTES = (Project, ); }; }; - B6FCDF99A8F506C6BF504FCB22A4BF82 /* SDImageHEICCoder.m in Sources */ = {isa = PBXBuildFile; fileRef = BB9C5DC5CC7B5364D54D6531BD109BED /* SDImageHEICCoder.m */; }; - B7689CEEB185F8E0B980BBC0B357CD18 /* CTInAppHTMLViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = A2A996AE88DCC08122226D17D57548DD /* CTInAppHTMLViewController.m */; }; - B87956886FCE2C86D2BE9CE353C76603 /* CTHalfInterstitialImageViewController~iphoneport.xib in Resources */ = {isa = PBXBuildFile; fileRef = 07A8CF7AA77FD3734DA065FAB66BF1E8 /* CTHalfInterstitialImageViewController~iphoneport.xib */; }; - B8D621A51AB5A315BC108CFA28877966 /* CTInterstitialViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 67BE87CCFA63A9625862BC8BF3FFFBF3 /* CTInterstitialViewController.m */; }; - BAAA3E91B3D3B8EE5C3FC7880E0A8CCE /* CTValidationResultStack.m in Sources */ = {isa = PBXBuildFile; fileRef = A0519B1B3CE3CB1392ADF8F19A017255 /* CTValidationResultStack.m */; }; - BAB0472961E2F1CB07DB539404739D3D /* SDWebImageIndicator.h in Headers */ = {isa = PBXBuildFile; fileRef = C302AD11805BCA7D0694D6F4243C46A0 /* SDWebImageIndicator.h */; settings = {ATTRIBUTES = (Project, ); }; }; - BAF8554638FE87714E3748C3E2BBBA32 /* SDWebImageDownloaderResponseModifier.m in Sources */ = {isa = PBXBuildFile; fileRef = 3CCDB41173AC767116D29B9EE3C08812 /* SDWebImageDownloaderResponseModifier.m */; }; - BC691FD6B15D441B7DCA7BD4DCDC0188 /* UIImage+Metadata.m in Sources */ = {isa = PBXBuildFile; fileRef = 0A03C4A385534A0B4EEB006812E7F6F8 /* UIImage+Metadata.m */; }; - BCB664BEE0161456B893209FA717BCBC /* SDImageIOAnimatedCoder.m in Sources */ = {isa = PBXBuildFile; fileRef = 79ABB71817CB46FFFB2DDF0FD4FD935B /* SDImageIOAnimatedCoder.m */; }; - BCD160DA107A76A51B3116D6E4BDE0EA /* CTDisplayUnitController.h in Headers */ = {isa = PBXBuildFile; fileRef = 06527721DFBDF9C95C1ACE1912F12F3C /* CTDisplayUnitController.h */; settings = {ATTRIBUTES = (Project, ); }; }; - BEC816298EED9661927462C00D6DBA9B /* CTNotificationButton.h in Headers */ = {isa = PBXBuildFile; fileRef = EF7ECE3CC8E7B0401359A72B25073173 /* CTNotificationButton.h */; settings = {ATTRIBUTES = (Project, ); }; }; - BECBDD4C5DB27ADEFAEEB84AC19759C5 /* CleverTapInboxStyleConfig.m in Sources */ = {isa = PBXBuildFile; fileRef = 4B9FE5711A1F27FA0BCEF656B18EABC8 /* CleverTapInboxStyleConfig.m */; }; - BEEF8EA85B233CDF617AA611D9657B79 /* CleverTapJSInterface.m in Sources */ = {isa = PBXBuildFile; fileRef = 54F1E55B26CD9621341E2D71A1D4BB17 /* CleverTapJSInterface.m */; }; - C01053955B8AE96AFADAC43063396D33 /* CTInboxSimpleMessageCell~land.xib in Resources */ = {isa = PBXBuildFile; fileRef = 4A3DCFF4BC94D31AEA22C048A43470C5 /* CTInboxSimpleMessageCell~land.xib */; }; - C09E0E55132F34E0648707A3166D0519 /* SDDisplayLink.h in Headers */ = {isa = PBXBuildFile; fileRef = DD64A75C7AE6643D5E75DA94744975D8 /* SDDisplayLink.h */; settings = {ATTRIBUTES = (Project, ); }; }; - C1F129C8DF2C7B1E0817EB64F727AF00 /* CTInterstitialImageViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = EE4DC1EAD6A3B6969BB2F97E6F297968 /* CTInterstitialImageViewController.m */; }; - C266CED7168DFF429D15BD1078D718C1 /* ic_play@1x.png in Resources */ = {isa = PBXBuildFile; fileRef = 8D7696581FC7ECF3FCA72356109C3589 /* ic_play@1x.png */; }; - C43B48A3651A3FEA3964D31076D6E0AC /* CleverTapInstanceConfigPrivate.h in Headers */ = {isa = PBXBuildFile; fileRef = 18B3469E769F028C337D592C29A46BDF /* CleverTapInstanceConfigPrivate.h */; settings = {ATTRIBUTES = (Project, ); }; }; - C4636F0AB20994AF98C8F7EF22C04623 /* SDCallbackQueue.m in Sources */ = {isa = PBXBuildFile; fileRef = 76C390DCF370788212F9E9D8FEE55C75 /* SDCallbackQueue.m */; }; - C473962B6770E318A7F13F85566AF67D /* SDImageAPNGCoder.h in Headers */ = {isa = PBXBuildFile; fileRef = 12F25D87FD5A9EAA359A3BB6EECDDD81 /* SDImageAPNGCoder.h */; settings = {ATTRIBUTES = (Project, ); }; }; - C54B7CEF190DB74278231AE8360E7330 /* SDWebImageDefine.h in Headers */ = {isa = PBXBuildFile; fileRef = B91DD3377C64B65B4ADA4319EB97C604 /* SDWebImageDefine.h */; settings = {ATTRIBUTES = (Project, ); }; }; - C55B4980E1D4F1FACE83B1951A4762FB /* CTHalfInterstitialViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = D4521A3DE515D4807A308F610B49FA6F /* CTHalfInterstitialViewController.m */; }; - C60CE801D069CA8A00B01F68C5B1D260 /* CTCarouselImageView.m in Sources */ = {isa = PBXBuildFile; fileRef = A6E10B8976F63DB134390870DB4C3325 /* CTCarouselImageView.m */; }; - C6B6F9A1FAACCFB4BCF0DD1105635EE8 /* CleverTap+PushPermission.h in Headers */ = {isa = PBXBuildFile; fileRef = A7FC5F2B781F1E802ADAE536FFB6157E /* CleverTap+PushPermission.h */; settings = {ATTRIBUTES = (Project, ); }; }; - C7101911975A6D1AE2CF80B208360E1D /* UIImage+Metadata.h in Headers */ = {isa = PBXBuildFile; fileRef = F13429BCEC72E1E562AEE8C9D71837BE /* UIImage+Metadata.h */; settings = {ATTRIBUTES = (Project, ); }; }; - C71E8496654EFBD82B96F9991181D6E5 /* NSData+ImageContentType.m in Sources */ = {isa = PBXBuildFile; fileRef = 601EFBCD582B5BCABF13D902BF6337FC /* NSData+ImageContentType.m */; }; - C8D071806AD4E9957C7C9DFF5974DAC1 /* SDImageCacheDefine.h in Headers */ = {isa = PBXBuildFile; fileRef = CDB7B37365F9AE79F92D0E1B8F54A63B /* SDImageCacheDefine.h */; settings = {ATTRIBUTES = (Project, ); }; }; - C9376E67C5F9711413A9E0036E465EBC /* CTInterstitialViewController~iphoneport.xib in Resources */ = {isa = PBXBuildFile; fileRef = 10E5E949286A2B3AD8FE0C33CD56398C /* CTInterstitialViewController~iphoneport.xib */; }; - C9BF91D9E6F434335A71EA173616F09D /* SDImageCachesManagerOperation.m in Sources */ = {isa = PBXBuildFile; fileRef = 605024568EE8982237697D4A5102F34F /* SDImageCachesManagerOperation.m */; }; - CA0317CD4DAF553531BC04A775969ACE /* CleverTapInboxViewControllerPrivate.h in Headers */ = {isa = PBXBuildFile; fileRef = 55FF0E3DD96B25BE58A09EC69203152B /* CleverTapInboxViewControllerPrivate.h */; settings = {ATTRIBUTES = (Project, ); }; }; - CA3E7C68A38CF532B0FF91C345AB4371 /* CTConstants.m in Sources */ = {isa = PBXBuildFile; fileRef = 2E6028FB67F540BBF33EA4934AA5B0B7 /* CTConstants.m */; }; - CA52B857F3CED0474A156D96069A231F /* CTImageInAppViewControllerPrivate.h in Headers */ = {isa = PBXBuildFile; fileRef = 7BE2F943261F1A9F90F2BD363CDFFCCA /* CTImageInAppViewControllerPrivate.h */; settings = {ATTRIBUTES = (Project, ); }; }; - CB92F544B8FFC03DF9CE918EC41E04A7 /* NSButton+WebCache.m in Sources */ = {isa = PBXBuildFile; fileRef = 81B3152A60BCAC1275A36E74E9F91953 /* NSButton+WebCache.m */; }; - CBD694B3E8D2F1D5D8AC18858AB8FD14 /* CTKnownProfileFields.h in Headers */ = {isa = PBXBuildFile; fileRef = F62FF4FF3AC36500D5B52494678D743F /* CTKnownProfileFields.h */; settings = {ATTRIBUTES = (Project, ); }; }; - CC336030118E15D90E9D49E946C25973 /* CTInAppDisplayViewControllerPrivate.h in Headers */ = {isa = PBXBuildFile; fileRef = F774F349AF10A9DFF7BE6B167535C64F /* CTInAppDisplayViewControllerPrivate.h */; settings = {ATTRIBUTES = (Project, ); }; }; - CE8B1AC1D691FB49876F2D00A3C8E4EC /* CleverTap.h in Headers */ = {isa = PBXBuildFile; fileRef = 361D1D7F2C740F7F39F8E8A869443D76 /* CleverTap.h */; settings = {ATTRIBUTES = (Project, ); }; }; - CF51A007D3D239F041461321BDBBAAD2 /* CTLocalInApp.h in Headers */ = {isa = PBXBuildFile; fileRef = 84BE8FE013BCAB7FA6BEEF8600098678 /* CTLocalInApp.h */; settings = {ATTRIBUTES = (Project, ); }; }; - CFB9BC1EF2C792CABED2145FB4C71D04 /* CleverTapURLDelegate.h in Headers */ = {isa = PBXBuildFile; fileRef = CE1215F8CF4716B38421FC25F0C59C18 /* CleverTapURLDelegate.h */; settings = {ATTRIBUTES = (Project, ); }; }; - D1E030725541D127E141D192EACCDCAF /* CTHalfInterstitialViewController~ipadland.xib in Resources */ = {isa = PBXBuildFile; fileRef = A1EEA48BFB33AA05D5E490E3101D0C35 /* CTHalfInterstitialViewController~ipadland.xib */; }; - D1FB326B02C811CEB8DFADF08FE4278A /* CTHeaderViewController~ipadland.xib in Resources */ = {isa = PBXBuildFile; fileRef = 0A69C6689C90631952B94B162423B6DB /* CTHeaderViewController~ipadland.xib */; }; - D2A12ED62AA40BFA72108AF1F1F75412 /* CTFlexibleIdentityRepo.h in Headers */ = {isa = PBXBuildFile; fileRef = 6D29F76DA161F9223DD1CD06482ACE33 /* CTFlexibleIdentityRepo.h */; settings = {ATTRIBUTES = (Project, ); }; }; - D353BA4E5F707FE14148F3DDB87298F7 /* Inbox.xcdatamodeld in Resources */ = {isa = PBXBuildFile; fileRef = B0AC13536F9F6BCF61B8BC9180C62E1F /* Inbox.xcdatamodeld */; }; - D37B7F9D413A2D3DC712FE0903D86F70 /* UIImageView+HighlightedWebCache.h in Headers */ = {isa = PBXBuildFile; fileRef = FD25DF43629CB59D5874ECBC0A37C73A /* UIImageView+HighlightedWebCache.h */; settings = {ATTRIBUTES = (Project, ); }; }; - D4BC9709381D49C37C7E62C298EC50A1 /* CTCertificatePinning.m in Sources */ = {isa = PBXBuildFile; fileRef = 7076906FF402F1D71DF488DE94A948B5 /* CTCertificatePinning.m */; }; - D5401EEDC6B7EDBA068B5738E4DFF0FE /* CTPreferences.m in Sources */ = {isa = PBXBuildFile; fileRef = 53C8D27F6E1B0515878FFB15126A1C5F /* CTPreferences.m */; }; - D6DA69CD20437B47C0E20720C2DC5823 /* CTHeaderViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = A2C245205003347F82BCB23E1C18B9C1 /* CTHeaderViewController.m */; }; - D76664C51AFBCFC248CB62087FF290FF /* CleverTapPushNotificationDelegate.h in Headers */ = {isa = PBXBuildFile; fileRef = 899C8CBBD29A02E70EF11E9A3E0EBC47 /* CleverTapPushNotificationDelegate.h */; settings = {ATTRIBUTES = (Project, ); }; }; - D8E02DCEA367FADF3D8E98BE54BC9C4A /* CTInboxIconMessageCell.h in Headers */ = {isa = PBXBuildFile; fileRef = EF56D43E904382DBE1EDC7E7A50148CD /* CTInboxIconMessageCell.h */; settings = {ATTRIBUTES = (Project, ); }; }; - D9A2C96D791D14CA89A6E28194B63860 /* CTHalfInterstitialImageViewController.h in Headers */ = {isa = PBXBuildFile; fileRef = 22F694128D98CA3544E4D1EE3960E02D /* CTHalfInterstitialImageViewController.h */; settings = {ATTRIBUTES = (Project, ); }; }; - DA2053312CC0ADE6DF5DAC8ED78AFFFD /* CTFooterViewController~ipad.xib in Resources */ = {isa = PBXBuildFile; fileRef = 987CE7D5996C3B229063E4AB97057CA3 /* CTFooterViewController~ipad.xib */; }; - DB489A68FC326948A2884114880304A3 /* CleverTapInboxMessageContent.m in Sources */ = {isa = PBXBuildFile; fileRef = 2C73AA8A4B4F8985CC57034ABC529C52 /* CleverTapInboxMessageContent.m */; }; - DBE6A5C3CBD37FBD34E46F2CE7A952DF /* SDInternalMacros.h in Headers */ = {isa = PBXBuildFile; fileRef = 0FE078B754147AD6AA8120C7EB3FAC1F /* SDInternalMacros.h */; settings = {ATTRIBUTES = (Project, ); }; }; - DC7B836D000C75C33EADDFE1544303D7 /* CTInboxUtils.m in Sources */ = {isa = PBXBuildFile; fileRef = 6E66AE9E3E3F4E6864C6E10496F541F0 /* CTInboxUtils.m */; }; - DCE1C28964932E347D5C8A150B84AF3C /* CTHeaderViewController.h in Headers */ = {isa = PBXBuildFile; fileRef = E3A7E5F3E93A24CD627D8781121C5E8C /* CTHeaderViewController.h */; settings = {ATTRIBUTES = (Project, ); }; }; - DCEAB850FF5F9E99204179CFB08EBD76 /* SDImageGraphics.h in Headers */ = {isa = PBXBuildFile; fileRef = 759330BA7552EDD8A8B2A96A9D232F76 /* SDImageGraphics.h */; settings = {ATTRIBUTES = (Project, ); }; }; + 00BEE2A32320779CE6C0012ED944C39F /* CleverTapInboxMessage.m in Sources */ = {isa = PBXBuildFile; fileRef = 568B638F3768B6CC8B852CE0BD936A57 /* CleverTapInboxMessage.m */; }; + 0151B2F1BC0ED2DD8E355579FB401B28 /* CTInboxBaseMessageCell.h in Headers */ = {isa = PBXBuildFile; fileRef = 473BE269F72E327533C945145A6341FC /* CTInboxBaseMessageCell.h */; settings = {ATTRIBUTES = (Project, ); }; }; + 030DAD00F502FF388BA02FB2C9F88E0A /* SDAnimatedImageView.m in Sources */ = {isa = PBXBuildFile; fileRef = 1900708E4B3E2B7CC0949AEAE224E9C4 /* SDAnimatedImageView.m */; }; + 0538439543563B3C9AB3C9ABD350FD71 /* UIImage+MultiFormat.h in Headers */ = {isa = PBXBuildFile; fileRef = 6B1BD2A310E4036BEF412E83DEF25434 /* UIImage+MultiFormat.h */; settings = {ATTRIBUTES = (Project, ); }; }; + 054FF90B007DCD51AE17D6BAF4E1E73F /* CTKnownProfileFields.m in Sources */ = {isa = PBXBuildFile; fileRef = FF3E6AA8E58BA28895FF0C894CB3D0BC /* CTKnownProfileFields.m */; }; + 055CED4FC49D2B5267347A9ADF5D7930 /* NSImage+Compatibility.m in Sources */ = {isa = PBXBuildFile; fileRef = 9D56861E6126AA861F16F7B99F7A80C6 /* NSImage+Compatibility.m */; }; + 062D7C9FF4145A767DB839679B804036 /* LeanplumCT.h in Headers */ = {isa = PBXBuildFile; fileRef = B9B1BF85AE56A05AD46EBE018F6C3738 /* LeanplumCT.h */; settings = {ATTRIBUTES = (Project, ); }; }; + 0662D5D268EF8C349DD2487F15CE1F01 /* CTInterstitialImageViewController~ipad.xib in Resources */ = {isa = PBXBuildFile; fileRef = B214EAC435EE45FAAF12779FAD983D6E /* CTInterstitialImageViewController~ipad.xib */; }; + 06AD7D6132B8C57D3C786D30C12552C8 /* CleverTapTrackedViewController.h in Headers */ = {isa = PBXBuildFile; fileRef = 79F80A00F4B22E8BBEE4EE65632E6A76 /* CleverTapTrackedViewController.h */; settings = {ATTRIBUTES = (Project, ); }; }; + 06E857D24C595CD030F0D1181527EFE3 /* CTUserMO.h in Headers */ = {isa = PBXBuildFile; fileRef = 7ED458B04C3A8C383519FF7BF38D88EA /* CTUserMO.h */; settings = {ATTRIBUTES = (Project, ); }; }; + 06F77FC0B33A9B786CB4D244529C6266 /* SDWebImageTransition.m in Sources */ = {isa = PBXBuildFile; fileRef = D575F36C1E6EDD59F11D1422A48E55A0 /* SDWebImageTransition.m */; }; + 0750A370B421E4FCB60E97243F713D03 /* CTHeaderViewController~ipadland.xib in Resources */ = {isa = PBXBuildFile; fileRef = A19F4BF77B408E8B0A84040132B9FFB1 /* CTHeaderViewController~ipadland.xib */; }; + 07DB2703CCE4EDF5D5C8EA8BBF326D9A /* CTHalfInterstitialImageViewController~ipad.xib in Resources */ = {isa = PBXBuildFile; fileRef = 92C3F7D4BBB4CD445655F3E37F835E08 /* CTHalfInterstitialImageViewController~ipad.xib */; }; + 0B05498E2F1226A632D7BD28D001C754 /* SDWebImageError.m in Sources */ = {isa = PBXBuildFile; fileRef = A39DF340D84D623CE95198E813190AB8 /* SDWebImageError.m */; }; + 0B12E577D16396B66961866FD4185D53 /* SDAsyncBlockOperation.m in Sources */ = {isa = PBXBuildFile; fileRef = 306844A6D0C42CEFEB9595DAF88EB845 /* SDAsyncBlockOperation.m */; }; + 0B316DBA9484753332DB4CC192002847 /* CTCoverViewController~iphoneport.xib in Resources */ = {isa = PBXBuildFile; fileRef = 042F805C908069D0280F6DF68E45D4A5 /* CTCoverViewController~iphoneport.xib */; }; + 0B9731B9843AA7F647C1027FC4FD25C5 /* ic_play@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 11CC08AA7B4BEC8E1A401D00547C817C /* ic_play@2x.png */; }; + 0BC4EB0F0A0A6DB408BD811DBA1B0ACB /* SDInternalMacros.m in Sources */ = {isa = PBXBuildFile; fileRef = BE56F4EAE8A387DB451273D184BD4612 /* SDInternalMacros.m */; }; + 0C40BE92746D62384A5A5E67E69FE629 /* SDWebImage-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = B16D6EB0AD2B77DBCA9C30AE7D08F8B9 /* SDWebImage-dummy.m */; }; + 0CF9E6A46A2E3A3D12B83216E1D39EEF /* CleverTapBuildInfo.h in Headers */ = {isa = PBXBuildFile; fileRef = 6459433FB7E3DDB7E5A105A2140CAAB9 /* CleverTapBuildInfo.h */; settings = {ATTRIBUTES = (Project, ); }; }; + 0D40972305810E7E38A2E3B64B9BCDD4 /* CTInterstitialViewController~iphoneland.xib in Resources */ = {isa = PBXBuildFile; fileRef = 2BA54A89FEFCD1A6AA5341DEC39DF022 /* CTInterstitialViewController~iphoneland.xib */; }; + 0DA46BC3D01D409CA23B4516725AC49B /* SDImageCoderHelper.m in Sources */ = {isa = PBXBuildFile; fileRef = 69332F5DC51859E911C060D3A75A6A5A /* SDImageCoderHelper.m */; }; + 0DC56C61C432EC5EA69581933C53398E /* CTCarouselImageMessageCell~land.xib in Resources */ = {isa = PBXBuildFile; fileRef = 0515607DBF0D6B125E8BFB82F835FADF /* CTCarouselImageMessageCell~land.xib */; }; + 0E08784037E8DE78016A3DEED2219419 /* CleverTap-iOS-SDK-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 0AEDA5107977612DE1C70E29993551E3 /* CleverTap-iOS-SDK-dummy.m */; }; + 0E6CBB4CA14A5C44EB528EDB7B9BFDDD /* UIImage+Metadata.m in Sources */ = {isa = PBXBuildFile; fileRef = A161E7A48EFA8B5FEC7C634021047885 /* UIImage+Metadata.m */; }; + 1015A85978E4676E29B1C0C0EE0AB9AE /* SDImageCacheConfig.h in Headers */ = {isa = PBXBuildFile; fileRef = A9AA6C8FB8C1E437FCCF5E2787DFC945 /* SDImageCacheConfig.h */; settings = {ATTRIBUTES = (Project, ); }; }; + 109777B8FAA0267BAC396337EE7875BE /* UIView+CTToast.m in Sources */ = {isa = PBXBuildFile; fileRef = 5D39E12B60FF37A1606D6B12E704D217 /* UIView+CTToast.m */; }; + 113F1DD23826819184D968119CA360B1 /* SDImageAssetManager.h in Headers */ = {isa = PBXBuildFile; fileRef = 8BD9C6B29E77B47E5D45CAC17B6309C1 /* SDImageAssetManager.h */; settings = {ATTRIBUTES = (Project, ); }; }; + 129481A1AF3320D823F6083D3F20960D /* UIView+CTToast.h in Headers */ = {isa = PBXBuildFile; fileRef = A8494B03486B2A5CDF3892C72F7F4AD6 /* UIView+CTToast.h */; settings = {ATTRIBUTES = (Project, ); }; }; + 135D390BD223E20BFB6B252C4634E1CD /* SDGraphicsImageRenderer.m in Sources */ = {isa = PBXBuildFile; fileRef = C024FC688690447AF2969B0EFC3FFA9A /* SDGraphicsImageRenderer.m */; }; + 136EF0F56896440CEDE30099A02381C3 /* CTInterstitialViewController~ipadland.xib in Resources */ = {isa = PBXBuildFile; fileRef = 6483032B6BA4471D0B7ABD524E25A481 /* CTInterstitialViewController~ipadland.xib */; }; + 13A7686FEC397FCD7083CF468A6811EF /* SDDisplayLink.h in Headers */ = {isa = PBXBuildFile; fileRef = BF13913B82C28C26838CCBE43584558B /* SDDisplayLink.h */; settings = {ATTRIBUTES = (Project, ); }; }; + 13F18E32E316C78D5463758D3C5A5825 /* CTIdentityRepoFactory.m in Sources */ = {isa = PBXBuildFile; fileRef = 6C4D9D04D86A48164F973D8418FD3FF4 /* CTIdentityRepoFactory.m */; }; + 14475ABED6BD77D109B33D9A9CC5C2B1 /* SDWebImageTransitionInternal.h in Headers */ = {isa = PBXBuildFile; fileRef = 242B076F0ED3FE11E21D15B9D8A1460B /* SDWebImageTransitionInternal.h */; settings = {ATTRIBUTES = (Project, ); }; }; + 14F93B57E812AC9E936095C7BFB0782A /* CTHalfInterstitialViewController~ipadland.xib in Resources */ = {isa = PBXBuildFile; fileRef = FA17520E67D4436C04BB3165D482F662 /* CTHalfInterstitialViewController~ipadland.xib */; }; + 1586E9639F414E5B80C269C6DD1A0FBB /* SDmetamacros.h in Headers */ = {isa = PBXBuildFile; fileRef = BA387E0415476B8ADB9412FE403BFD2F /* SDmetamacros.h */; settings = {ATTRIBUTES = (Project, ); }; }; + 15A1153AB12471677BD42377966B9887 /* CTInAppNotification.h in Headers */ = {isa = PBXBuildFile; fileRef = C409A635B98C335D485227468101BBE8 /* CTInAppNotification.h */; settings = {ATTRIBUTES = (Project, ); }; }; + 1821E7A40169BB9D38B32A4CEA4DFB6C /* CTVariables.m in Sources */ = {isa = PBXBuildFile; fileRef = 89A4A1D859679A14C7756799D2A64578 /* CTVariables.m */; }; + 18D03D36D8CB733D462C5AE3887AF443 /* UIView+WebCacheOperation.h in Headers */ = {isa = PBXBuildFile; fileRef = A9FA4C69177025693373FF18DE32587C /* UIView+WebCacheOperation.h */; settings = {ATTRIBUTES = (Project, ); }; }; + 197E32449C34D5951C8E10ACEBD30900 /* CTInboxUtils.m in Sources */ = {isa = PBXBuildFile; fileRef = 5A35A92AB1F119B15EB6D0BE116386C4 /* CTInboxUtils.m */; }; + 1C1C3763D2A6212F14F062083EF06237 /* CTInterstitialViewController~ipad.xib in Resources */ = {isa = PBXBuildFile; fileRef = 0B61D1A1EB2DF262FCBA45698C1963DB /* CTInterstitialViewController~ipad.xib */; }; + 1C577A3F421CF17C1847881ABBA7AC9B /* CTDomainFactory.h in Headers */ = {isa = PBXBuildFile; fileRef = FA7B344FE5E97521F739E0B25F71C615 /* CTDomainFactory.h */; settings = {ATTRIBUTES = (Project, ); }; }; + 1CAFA135F5F8621BF365D0F04CA663D7 /* CTCoverViewController~ipadland.xib in Resources */ = {isa = PBXBuildFile; fileRef = 3BA9E7B5DB6C1BA1382A2BE8748132F2 /* CTCoverViewController~ipadland.xib */; }; + 1E1017B6DF866CDABA0E3131784806F3 /* CTPlistInfo.h in Headers */ = {isa = PBXBuildFile; fileRef = C543885C348CDA7AB0BA6E9280EC8868 /* CTPlistInfo.h */; settings = {ATTRIBUTES = (Project, ); }; }; + 1E547796F6E9DBC08A2C5CCEBC6E3256 /* CTLocalInApp.m in Sources */ = {isa = PBXBuildFile; fileRef = E785843CED2BE08B30963C783922E0FB /* CTLocalInApp.m */; }; + 1F2BC1A68A79937A1FB20F4AA63C1E6A /* CleverTapInAppNotificationDelegate.h in Headers */ = {isa = PBXBuildFile; fileRef = E22E04F6D0F53CE5B934800E64449F36 /* CleverTapInAppNotificationDelegate.h */; settings = {ATTRIBUTES = (Project, ); }; }; + 1F34F2D7E6A52B3A79B00DBB7B80FAD6 /* CTInterstitialImageViewController~iphoneport.xib in Resources */ = {isa = PBXBuildFile; fileRef = 5A4683B67574C68C295DE9E499716966 /* CTInterstitialImageViewController~iphoneport.xib */; }; + 206C2BD364602D9EA805087A90107526 /* CTInAppUtils.m in Sources */ = {isa = PBXBuildFile; fileRef = D5E3E7DEDE5EEC38B76CEE7CCEBB137A /* CTInAppUtils.m */; }; + 20F15470DF66295D26C705A546FAA175 /* CTInboxBaseMessageCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 146821AB7C6A3EDA3EE4F449A8DCBFC9 /* CTInboxBaseMessageCell.m */; }; + 210B668D7CC856EBE9E72453D8337CDB /* UIImageView+HighlightedWebCache.h in Headers */ = {isa = PBXBuildFile; fileRef = 27AA224BACACEDE0871836CDA0BEBD27 /* UIImageView+HighlightedWebCache.h */; settings = {ATTRIBUTES = (Project, ); }; }; + 2371B04DF0A59E25FD54A486849A9985 /* CleverTapUTMDetail.m in Sources */ = {isa = PBXBuildFile; fileRef = BF6459D485B109F3D921C9AF73F73CCA /* CleverTapUTMDetail.m */; }; + 2527187B211C581966CDB5622791598D /* CTHeaderViewController.h in Headers */ = {isa = PBXBuildFile; fileRef = 8B8A38B4B2F7F2FC0C9470E8D7C0A55E /* CTHeaderViewController.h */; settings = {ATTRIBUTES = (Project, ); }; }; + 258EC23C173181C46D557036B64C2391 /* SDImageCachesManager.h in Headers */ = {isa = PBXBuildFile; fileRef = BEFF65ECD31D7F7C869B66A0E095BC50 /* SDImageCachesManager.h */; settings = {ATTRIBUTES = (Project, ); }; }; + 25E2D32832A809284FF25BDA8782A64E /* CleverTap.h in Headers */ = {isa = PBXBuildFile; fileRef = 540FCBD78A583F628B0BE7A9230883A3 /* CleverTap.h */; settings = {ATTRIBUTES = (Project, ); }; }; + 262ED3E9CDD38D9CD6BFBFC9FD8B07AB /* UIView+WebCache.m in Sources */ = {isa = PBXBuildFile; fileRef = 5A8CA1BDA8A39C4D281C5446829A79C7 /* UIView+WebCache.m */; }; + 2645EEE7B8A657C2BD6136CE94272FD1 /* ct_volume_off.png in Resources */ = {isa = PBXBuildFile; fileRef = 62736F7BD78DBD5F48E216D93FAC7F51 /* ct_volume_off.png */; }; + 267BD5FBA4B05E1BDE2281498B322D65 /* CTHalfInterstitialViewController~iphoneland.xib in Resources */ = {isa = PBXBuildFile; fileRef = A2ED29FDDB9333449AFB73E3AFB35B18 /* CTHalfInterstitialViewController~iphoneland.xib */; }; + 2687B0BF6E453E337EFD9AC11B148090 /* UIImage+Metadata.h in Headers */ = {isa = PBXBuildFile; fileRef = 1ADD533B9B6366DF20F5C07E77B5D95C /* UIImage+Metadata.h */; settings = {ATTRIBUTES = (Project, ); }; }; + 26FE6051F541AB351C6EB1DF69655ED0 /* SDImageAPNGCoder.m in Sources */ = {isa = PBXBuildFile; fileRef = 77488CC23517C13CED61FF741AD63DFD /* SDImageAPNGCoder.m */; }; + 280A211ADDA913D85CB4BAA0AFCA7420 /* SDImageFramePool.m in Sources */ = {isa = PBXBuildFile; fileRef = FCDE4717AAD6ACCA05E5625340266D29 /* SDImageFramePool.m */; }; + 283F8A6B3CC013284D12CEB2CBE814FE /* CTRequestFactory.m in Sources */ = {isa = PBXBuildFile; fileRef = 82CCB4A1C98F8D633AE3AEE14C953C21 /* CTRequestFactory.m */; }; + 295401B00D5C9A3166D345BA904737D7 /* CTInboxSimpleMessageCell~land.xib in Resources */ = {isa = PBXBuildFile; fileRef = E8696319C55D552EFC8E24716BAC9039 /* CTInboxSimpleMessageCell~land.xib */; }; + 2A79E0A6D0F72DA562029163F2C39BDF /* CTLocalDataStore.h in Headers */ = {isa = PBXBuildFile; fileRef = 8274E6DFCE06CD2983D581CA84EE52AF /* CTLocalDataStore.h */; settings = {ATTRIBUTES = (Project, ); }; }; + 2C683D2823A5C5F5E159F26A9854EE8E /* CTFooterViewController~ipad.xib in Resources */ = {isa = PBXBuildFile; fileRef = 14A00AD11775B0196583183CCB6514A1 /* CTFooterViewController~ipad.xib */; }; + 2CD10463F208C7F62F3453337C4F4CAC /* UIImage+MemoryCacheCost.m in Sources */ = {isa = PBXBuildFile; fileRef = 28D644879EDCC0724B9E9DCE584C27C4 /* UIImage+MemoryCacheCost.m */; }; + 2E7ED8A74B6C570A146A5728A9D1FDB1 /* CTInAppNotification.m in Sources */ = {isa = PBXBuildFile; fileRef = A19C8F469E737A7E50E3D8FFD84D0F9E /* CTInAppNotification.m */; }; + 324EF1EC20A6F447216EBC7758601CFA /* SDAnimatedImageRep.m in Sources */ = {isa = PBXBuildFile; fileRef = 9134BB07DEE17A273B116DC22C5CE8ED /* SDAnimatedImageRep.m */; }; + 3279A1ED7B54D61DE5F934959BCBB530 /* CTPlistInfo.m in Sources */ = {isa = PBXBuildFile; fileRef = C3C29ECAF0AF6C559DA5963DDD2584D7 /* CTPlistInfo.m */; }; + 32C95400095E545E696DA6A3E9FCB931 /* CTInterstitialViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = DDEFDC33AB9FA34FF10A8E5A89A09CBF /* CTInterstitialViewController.m */; }; + 333BCB24773BF9C8BDDCD3D3606D9A4E /* ct_default_landscape_image.png in Resources */ = {isa = PBXBuildFile; fileRef = 43A8601C1BA9E97614AC6C805239C8D4 /* ct_default_landscape_image.png */; }; + 33854984E1ECCD1B2F115DF0883D075A /* SDWebImageIndicator.h in Headers */ = {isa = PBXBuildFile; fileRef = 0E36E9E4CD9F24867C3C2D3249CB10DD /* SDWebImageIndicator.h */; settings = {ATTRIBUTES = (Project, ); }; }; + 3538C8FC4D1AC0E0D2F10C9B3804F707 /* CTSwizzle.h in Headers */ = {isa = PBXBuildFile; fileRef = 71AE91870CD32DBB83DBFC0AB1CAD272 /* CTSwizzle.h */; settings = {ATTRIBUTES = (Project, ); }; }; + 358C8DD37699D29EC27563C0E2C3CA68 /* CTLoginInfoProvider.h in Headers */ = {isa = PBXBuildFile; fileRef = EB4064B5D4AD7887681143A9C99A679B /* CTLoginInfoProvider.h */; settings = {ATTRIBUTES = (Project, ); }; }; + 35A395FEF138D55BB0EE01DEB48B014C /* SDImageCachesManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 8EF5DA4387044BA3EC3ACB6FF972757D /* SDImageCachesManager.m */; }; + 3696A8D3141E9FA3B80C5B12B54FE0CF /* CTConstants.m in Sources */ = {isa = PBXBuildFile; fileRef = F7634FC060FC53D1C538F867C2D969A8 /* CTConstants.m */; }; + 37E4943F79856504800534F5C9886BDD /* UIImageView+WebCache.h in Headers */ = {isa = PBXBuildFile; fileRef = 072D3DDFA18BAD61219A856FCFB6093C /* UIImageView+WebCache.h */; settings = {ATTRIBUTES = (Project, ); }; }; + 3881F35C836A1E1278F33AA5DA030E8E /* CTInboxSimpleMessageCell.m in Sources */ = {isa = PBXBuildFile; fileRef = C8039AA1446EB65F9F5A33711388381E /* CTInboxSimpleMessageCell.m */; }; + 391433D736423ED6CAE09BD8755CA683 /* SDWebImageCacheSerializer.h in Headers */ = {isa = PBXBuildFile; fileRef = CF1A5B94C8BCE3FF16C610A5F0CD4A19 /* SDWebImageCacheSerializer.h */; settings = {ATTRIBUTES = (Project, ); }; }; + 39C4E71BC5090B2BC150A8C24F40F0AF /* CleverTap+DisplayUnit.h in Headers */ = {isa = PBXBuildFile; fileRef = F1763BF58D06B7427273F32A2283E3E3 /* CleverTap+DisplayUnit.h */; settings = {ATTRIBUTES = (Project, ); }; }; + 3B07ED662379558DCE3767203FE33178 /* CTUserMO.m in Sources */ = {isa = PBXBuildFile; fileRef = 11F46974131649F95CD8D86CCBCA43A9 /* CTUserMO.m */; }; + 3C6B526C9282F8D03764667EBA5F7933 /* Inbox.xcdatamodeld in Resources */ = {isa = PBXBuildFile; fileRef = 8926ACFFB0E29BD74DD31FDE2409CBEB /* Inbox.xcdatamodeld */; }; + 3E0BDF295A2B6B65F790F6C20BA18A51 /* SDWebImageCacheKeyFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = 6EE3DFF499F9E289FE74FDECBD78F922 /* SDWebImageCacheKeyFilter.h */; settings = {ATTRIBUTES = (Project, ); }; }; + 3E710CF6B6D074C8038CF31C9ADEDF83 /* CTFeatureFlagsController.m in Sources */ = {isa = PBXBuildFile; fileRef = 4EFAC8D67EC96653F156D4384693FF73 /* CTFeatureFlagsController.m */; }; + 3F103DCDD02A5B8234EF5FF910970DC4 /* SDMemoryCache.m in Sources */ = {isa = PBXBuildFile; fileRef = CC9B6D7E55DD737BC20C8C53404A038D /* SDMemoryCache.m */; }; + 3F18E40308E27710DB373B9C981FD2F5 /* NSDictionary+Extensions.m in Sources */ = {isa = PBXBuildFile; fileRef = 4A01CA5CD32F5E9B61C36106C53F7AF1 /* NSDictionary+Extensions.m */; }; + 3F31E65C6C8512CE86F6ED39FD75373A /* CTVar.h in Headers */ = {isa = PBXBuildFile; fileRef = 6C7DB41726A02382E0B743DFDDE941F2 /* CTVar.h */; settings = {ATTRIBUTES = (Project, ); }; }; + 3FC13CDFC31712E779FEF8E4642F2FEE /* NSButton+WebCache.h in Headers */ = {isa = PBXBuildFile; fileRef = 74A255198645FD62C60EA90913BFA9B7 /* NSButton+WebCache.h */; settings = {ATTRIBUTES = (Project, ); }; }; + 4014496081E31CA0E75CD53DC0FCFA11 /* CTHalfInterstitialViewController~ipad.xib in Resources */ = {isa = PBXBuildFile; fileRef = EACDD7983C9F7256D282C4DAEF8B072C /* CTHalfInterstitialViewController~ipad.xib */; }; + 405B45C66F847DCD1264DB687147594A /* CTInboxSimpleMessageCell~port.xib in Resources */ = {isa = PBXBuildFile; fileRef = A793776127A3B47D8D12E6B6010F8305 /* CTInboxSimpleMessageCell~port.xib */; }; + 40612D032399986F82DF2260494D38A4 /* CTLocalDataStore.m in Sources */ = {isa = PBXBuildFile; fileRef = 3D70E6841A5B320FEBA3E18726E2CD64 /* CTLocalDataStore.m */; }; + 40E923CE4C56A578736813498C689364 /* CTFeatureFlagsController.h in Headers */ = {isa = PBXBuildFile; fileRef = 303EF716D7AD65E33CD2B835FE050894 /* CTFeatureFlagsController.h */; settings = {ATTRIBUTES = (Project, ); }; }; + 413523C54F8219BBCDEEB2ECEE9AF60B /* SDImageHEICCoder.m in Sources */ = {isa = PBXBuildFile; fileRef = 1DFC6E85A4210DE9B9F87084CDE2F85B /* SDImageHEICCoder.m */; }; + 4298E89E1FF7FC5BDD4731A79F9BDE65 /* CTSwizzle.m in Sources */ = {isa = PBXBuildFile; fileRef = 62A10A17EF5C512486F214C415771E16 /* CTSwizzle.m */; }; + 42E5BBA336AA8285F08C03F451ABD596 /* SDAnimatedImageView+WebCache.m in Sources */ = {isa = PBXBuildFile; fileRef = 9970C584C403F5B21B04B51E5BD9141A /* SDAnimatedImageView+WebCache.m */; }; + 431F03F84A6451F2E999F11CF9D23513 /* CTUriHelper.h in Headers */ = {isa = PBXBuildFile; fileRef = FEA5420B49A131AA9A5205CA57E6F073 /* CTUriHelper.h */; settings = {ATTRIBUTES = (Project, ); }; }; + 43BF441A48B46290B0A2CFD95AC82ABC /* CleverTapEventDetail.h in Headers */ = {isa = PBXBuildFile; fileRef = 2C9D900235DBBAFF7B0F26C81A41B383 /* CleverTapEventDetail.h */; settings = {ATTRIBUTES = (Project, ); }; }; + 43CFFCE09E5DE6495BE22A0DB630F922 /* CTCoverViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = C3A8FC159A8822520A38B5B002564A41 /* CTCoverViewController.m */; }; + 43F1F70DACC2168F094B66F9DFE19F63 /* CleverTapInboxStyleConfig.m in Sources */ = {isa = PBXBuildFile; fileRef = D8606FB02BA85C96058A4BCDD8D0CD32 /* CleverTapInboxStyleConfig.m */; }; + 43F93BA8308FEDEB2C2B9AE248DE384B /* CTAlertViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = EBB6985D2723C9E6779038254BDF1161 /* CTAlertViewController.m */; }; + 441522D704BFE76F86F41AD065B218F2 /* SDImageIOAnimatedCoderInternal.h in Headers */ = {isa = PBXBuildFile; fileRef = BE9F095EB0447D7CBCA289E561ADB8B8 /* SDImageIOAnimatedCoderInternal.h */; settings = {ATTRIBUTES = (Project, ); }; }; + 44D6B40F8258E246AFEF7E6DC5EADD90 /* CTVideoThumbnailGenerator.h in Headers */ = {isa = PBXBuildFile; fileRef = 7ABB378298D21D573C6A97BDEBEC474C /* CTVideoThumbnailGenerator.h */; settings = {ATTRIBUTES = (Project, ); }; }; + 44EE09950230C46C1EC0183904FABDFC /* SDImageLoadersManager.h in Headers */ = {isa = PBXBuildFile; fileRef = 6E9859CC4E41A7CE6FD4BA7173B1982E /* SDImageLoadersManager.h */; settings = {ATTRIBUTES = (Project, ); }; }; + 44FF6E1E5BA0AC9F741552066F34D28D /* CTHalfInterstitialImageViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 00DCE02464D5B90FBEBC2FAEABC49E14 /* CTHalfInterstitialImageViewController.m */; }; + 45B2B028EA36BBF623CBECD64AB6CBB5 /* CTHalfInterstitialViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 8DF6936C17771D67FA2F2AEEFC3FF355 /* CTHalfInterstitialViewController.m */; }; + 45C4A6C4BE757DE181F47B6D6B4EE9CE /* CTInAppHTMLViewController.h in Headers */ = {isa = PBXBuildFile; fileRef = F105B5A3B1FBFF838F2C229A94C13D23 /* CTInAppHTMLViewController.h */; settings = {ATTRIBUTES = (Project, ); }; }; + 46CE3E179F6E7AAD37F4CCA75B6E61EF /* LeanplumCT.m in Sources */ = {isa = PBXBuildFile; fileRef = 0985F013F6DC9CD735AA7DD737F145A0 /* LeanplumCT.m */; }; + 46DFD43973EA4DC38E33885A7837511F /* CTDismissButton.h in Headers */ = {isa = PBXBuildFile; fileRef = C5B3BE729F0ADD8A8B2EE9192205BBCA /* CTDismissButton.h */; settings = {ATTRIBUTES = (Project, ); }; }; + 46E5A70273CB4826C265FCE04E08CE99 /* CTCoverImageViewController~ipad.xib in Resources */ = {isa = PBXBuildFile; fileRef = FD9D4485B60922E08545942235FEBA72 /* CTCoverImageViewController~ipad.xib */; }; + 476202BA7833E41818E2B509FA6B394D /* SDImageTransformer.h in Headers */ = {isa = PBXBuildFile; fileRef = 52F1382CBA7D38B10646600BF7D8B135 /* SDImageTransformer.h */; settings = {ATTRIBUTES = (Project, ); }; }; + 47C8A6F0E492B9DC12E9C79869BB5C40 /* CTCarouselImageView.xib in Resources */ = {isa = PBXBuildFile; fileRef = 34D731CDDCA2D8E3C6B7DCCFBC9B0546 /* CTCarouselImageView.xib */; }; + 480B3D6EFCC7631150DCE87E744D08FC /* CTBaseHeaderFooterViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = E7F32C6348442E0E1840397E590C23F5 /* CTBaseHeaderFooterViewController.m */; }; + 481B69EB1F5B57F7AA8F1770685D97B1 /* SDWebImageDownloaderOperation.m in Sources */ = {isa = PBXBuildFile; fileRef = 9BA5B095E2FB7AA6951152FAB3E83B14 /* SDWebImageDownloaderOperation.m */; }; + 4901E2BD6F661374C02D5A44FE492C5A /* SDWebImageDefine.m in Sources */ = {isa = PBXBuildFile; fileRef = 02311CE61069D208441E5B078A33FB22 /* SDWebImageDefine.m */; }; + 4A39BBDED625C0418F5B9B24E28C1791 /* CTIdentityRepoFactory.h in Headers */ = {isa = PBXBuildFile; fileRef = 3C4DAA74B65C6F03D8CE73425C5A2328 /* CTIdentityRepoFactory.h */; settings = {ATTRIBUTES = (Project, ); }; }; + 4AB7091330FF83719CA4CE8333A64111 /* CTProductConfigController.m in Sources */ = {isa = PBXBuildFile; fileRef = 847E606DDA0501FED4C32EA8E7804847 /* CTProductConfigController.m */; }; + 4C90C485440E95E7CB652F3CF7D1AB11 /* SDWebImageDefine.h in Headers */ = {isa = PBXBuildFile; fileRef = 35EEEE6B6E86E8340A44C76BCEF9BA17 /* SDWebImageDefine.h */; settings = {ATTRIBUTES = (Project, ); }; }; + 4D12C09EF697B35B27CDD3C453DB3ED0 /* SDImageCoder.m in Sources */ = {isa = PBXBuildFile; fileRef = 76268F21E7B57C723B2979FA32A74A23 /* SDImageCoder.m */; }; + 4D3D27308361114A477D6FE0CF8AB34E /* SDImageGraphics.h in Headers */ = {isa = PBXBuildFile; fileRef = E289B7B73B4385A30E303118EC438207 /* SDImageGraphics.h */; settings = {ATTRIBUTES = (Project, ); }; }; + 4E9334747279A92760D5B7641B552420 /* SDImageCachesManagerOperation.m in Sources */ = {isa = PBXBuildFile; fileRef = A2384129049A308CD42673162F103FA3 /* SDImageCachesManagerOperation.m */; }; + 4FC5548B8EB3852712C26105B1DF1E35 /* SDWebImageCacheSerializer.m in Sources */ = {isa = PBXBuildFile; fileRef = 1C89867FBC12FD83E74AB386E1799561 /* SDWebImageCacheSerializer.m */; }; + 516C00946B53A1B8D038EFC364BE4926 /* SDDeviceHelper.h in Headers */ = {isa = PBXBuildFile; fileRef = 053C136B3BC99422F0649E5D9A803E1E /* SDDeviceHelper.h */; settings = {ATTRIBUTES = (Project, ); }; }; + 524DE64A225534173770A3637C7DDEF6 /* CTInboxMessageActionView.h in Headers */ = {isa = PBXBuildFile; fileRef = 7C4D8BD06F3A9589ABA1F8363DD7288A /* CTInboxMessageActionView.h */; settings = {ATTRIBUTES = (Project, ); }; }; + 529948F715DF42A81ED9FEC9F097A68E /* CTInboxSimpleMessageCell.h in Headers */ = {isa = PBXBuildFile; fileRef = 9F153855870EB67B7CAF4D6056C53EA5 /* CTInboxSimpleMessageCell.h */; settings = {ATTRIBUTES = (Project, ); }; }; + 529E11DB49D20F6F197033D97DDAFE36 /* SDFileAttributeHelper.m in Sources */ = {isa = PBXBuildFile; fileRef = B15E720C0279E0855D9DA4360415E0F4 /* SDFileAttributeHelper.m */; }; + 5312B16F9B1F0A29AAF9E7F8E2B95ECF /* CTHalfInterstitialViewController.h in Headers */ = {isa = PBXBuildFile; fileRef = A5BE04E1E85046672FBC8409E5807B6A /* CTHalfInterstitialViewController.h */; settings = {ATTRIBUTES = (Project, ); }; }; + 53B69EB81A9CD35BDC268C96F18B7460 /* SDWebImageOperation.m in Sources */ = {isa = PBXBuildFile; fileRef = 9058F96D704819B2A0F6684B39B0C099 /* SDWebImageOperation.m */; }; + 5422B2A45FA1F2CD6A0E7CA096A02014 /* CTUriHelper.m in Sources */ = {isa = PBXBuildFile; fileRef = C5E4DCBF7C07C7AC2A2E45215B402CBA /* CTUriHelper.m */; }; + 545E92A970E59E1C3D723ECAAEB9D334 /* CTEventBuilder.m in Sources */ = {isa = PBXBuildFile; fileRef = 388808CAD70F9737088E9B86D3F5BE2A /* CTEventBuilder.m */; }; + 5562C5F2CC6EC70F5F82E5C4B847623E /* CTValidator.m in Sources */ = {isa = PBXBuildFile; fileRef = 4DD20275AD78AF66C00F374DCF48875D /* CTValidator.m */; }; + 55D6EF9B6B1BF2EACBF498806CA9EE50 /* SDImageLoadersManager.m in Sources */ = {isa = PBXBuildFile; fileRef = B06FBB54D9B7EE80723DCAC355B68688 /* SDImageLoadersManager.m */; }; + 573DE84D5AA003B6E28D2E202F5D4226 /* CTInterstitialImageViewController~iphoneland.xib in Resources */ = {isa = PBXBuildFile; fileRef = CDF6EBDB011A01BDEC0892C7C892A8D2 /* CTInterstitialImageViewController~iphoneland.xib */; }; + 5A2868AFF20F7C2A55B3562E0F3DF488 /* CTLoginInfoProvider.m in Sources */ = {isa = PBXBuildFile; fileRef = 5D228E1C1BB933F5F7D931CBBEBE029E /* CTLoginInfoProvider.m */; }; + 5B6655E256A273FA906EA2FA38EF2A55 /* CleverTap.m in Sources */ = {isa = PBXBuildFile; fileRef = 28CB0DEC3C288C1997C84C66EFBC6A38 /* CleverTap.m */; }; + 5B6D849625A97A4BC849357D3A44237B /* CTInboxIconMessageCell.h in Headers */ = {isa = PBXBuildFile; fileRef = CFCAF6B6B89C1376A6B07B1945B1A795 /* CTInboxIconMessageCell.h */; settings = {ATTRIBUTES = (Project, ); }; }; + 5D962E49FA6A3E829B6948EF0322A0AF /* CleverTapJSInterface.h in Headers */ = {isa = PBXBuildFile; fileRef = C5A86153196CF9C1F723EB97D4A3DB8B /* CleverTapJSInterface.h */; settings = {ATTRIBUTES = (Project, ); }; }; + 5E9EFDF390686FA5A58B77E7EF30CA38 /* SDDiskCache.h in Headers */ = {isa = PBXBuildFile; fileRef = B24EF3897EDEBDBED3E2C24BDC362C42 /* SDDiskCache.h */; settings = {ATTRIBUTES = (Project, ); }; }; + 5EAFCBAE4CE10EF71CA256E6336B2108 /* SDImageFrame.h in Headers */ = {isa = PBXBuildFile; fileRef = 474302FFBE03F657A06E481B4EA5B280 /* SDImageFrame.h */; settings = {ATTRIBUTES = (Project, ); }; }; + 5EB8CB2AAF6CA659B58D3A736559306B /* SDWebImageDownloaderConfig.h in Headers */ = {isa = PBXBuildFile; fileRef = 8ED26E4A9F0A0D8C6019314BA10BC0A3 /* SDWebImageDownloaderConfig.h */; settings = {ATTRIBUTES = (Project, ); }; }; + 5F061ACD532175D871C17B4B6E6D4903 /* CTRequest.h in Headers */ = {isa = PBXBuildFile; fileRef = 640D44F41E9521CA59D255ED1C7BB301 /* CTRequest.h */; settings = {ATTRIBUTES = (Project, ); }; }; + 609D4DD1983B6B394EFBB8F4E5854453 /* CleverTapEventDetail.m in Sources */ = {isa = PBXBuildFile; fileRef = 8E9F8F922FB769E9F3BDBA38BDFAB227 /* CleverTapEventDetail.m */; }; + 61303710B87B190055A33B8281023338 /* CTVar.m in Sources */ = {isa = PBXBuildFile; fileRef = B9B69F82E86BC16B140603FDEB70EC7A /* CTVar.m */; }; + 620698D032C192CCB6874A6647981702 /* CTSwipeView.h in Headers */ = {isa = PBXBuildFile; fileRef = EEDE444CFDF1DF731AB303A32A838503 /* CTSwipeView.h */; settings = {ATTRIBUTES = (Project, ); }; }; + 62966FDBDC39A4CB16FD987F5FCB1999 /* CleverTapProductConfig.m in Sources */ = {isa = PBXBuildFile; fileRef = BC9ED9FC52EA1C2335A86C36D0153FB7 /* CleverTapProductConfig.m */; }; + 636F9B282470CAA25EC8F3160C843934 /* CTCarouselImageMessageCell~port.xib in Resources */ = {isa = PBXBuildFile; fileRef = 4189F6DA156AF3AE1AAA33374F68E897 /* CTCarouselImageMessageCell~port.xib */; }; + 645ACA6C10E570578FE59358E862FD36 /* CTRequest.m in Sources */ = {isa = PBXBuildFile; fileRef = 8EF48B79E99B4A350CEC53C1BBF7698E /* CTRequest.m */; }; + 64C8DD65D91C18809E4F9A7F789A41B2 /* SDAnimatedImage.h in Headers */ = {isa = PBXBuildFile; fileRef = FDD9EFB37C5A07AD5B5727828379B6B0 /* SDAnimatedImage.h */; settings = {ATTRIBUTES = (Project, ); }; }; + 660FFEFF13B1B084568521FBED6E4DC9 /* SDWebImage.h in Headers */ = {isa = PBXBuildFile; fileRef = F4ACA7CEF35AE42ECAE3999491484DB4 /* SDWebImage.h */; settings = {ATTRIBUTES = (Project, ); }; }; + 66269B65F63033D13A3BE501B5210D8C /* SDImageCodersManager.h in Headers */ = {isa = PBXBuildFile; fileRef = 26515B47DE93CD0684F895476CAACFEF /* SDImageCodersManager.h */; settings = {ATTRIBUTES = (Project, ); }; }; + 666F613CF61B5DB6B100BC86D99169BC /* CTVariables.h in Headers */ = {isa = PBXBuildFile; fileRef = 1F4DEF8806EBCA11F17592C36CA51BF1 /* CTVariables.h */; settings = {ATTRIBUTES = (Project, ); }; }; + 6742148DF6270783826488F3B1B0EB3D /* SDWebImageManager.h in Headers */ = {isa = PBXBuildFile; fileRef = 039AA853A697C076592ACA207CE2AF79 /* SDWebImageManager.h */; settings = {ATTRIBUTES = (Project, ); }; }; + 68C7CF4CEA62E4C1A626470BD6598AE1 /* SDImageIOAnimatedCoder.m in Sources */ = {isa = PBXBuildFile; fileRef = D1917471BC76E400854CC4B21A48685B /* SDImageIOAnimatedCoder.m */; }; + 6AEC2DBBCDB6587E3FB7FD1F0A8134C0 /* UIImage+MemoryCacheCost.h in Headers */ = {isa = PBXBuildFile; fileRef = 68D0F76361672D5AE19AA7A3E1F17994 /* UIImage+MemoryCacheCost.h */; settings = {ATTRIBUTES = (Project, ); }; }; + 6C05124CBF889F10D90D2B4A108C2BEF /* SDImageCachesManagerOperation.h in Headers */ = {isa = PBXBuildFile; fileRef = B19E0B4BE29BFF5BC50A0801236C1C33 /* SDImageCachesManagerOperation.h */; settings = {ATTRIBUTES = (Project, ); }; }; + 6C27F1CCDBD1B40C796BB6EE179F01CF /* CTKnownProfileFields.h in Headers */ = {isa = PBXBuildFile; fileRef = 8841E719304AED7FA8CD67FE2F5359EC /* CTKnownProfileFields.h */; settings = {ATTRIBUTES = (Project, ); }; }; + 6CAA062EF917428559EE37635E8CF794 /* CTCarouselMessageCell~port.xib in Resources */ = {isa = PBXBuildFile; fileRef = EF3A3BF322621F36A6739CA93B8333DD /* CTCarouselMessageCell~port.xib */; }; + 6D86B508A8F35E1E9A3DB85BE4391D96 /* NSData+ImageContentType.m in Sources */ = {isa = PBXBuildFile; fileRef = F0554B65AC905E501684E293F224CCF8 /* NSData+ImageContentType.m */; }; + 6E2EA86FFCA14D7C322D5D3477320315 /* CleverTap+PushPermission.h in Headers */ = {isa = PBXBuildFile; fileRef = C21113C7ABE5D58C7B5D8A767AB87EDE /* CleverTap+PushPermission.h */; settings = {ATTRIBUTES = (Project, ); }; }; + 6E6EEB76DC9751CB43467F014FAE7B87 /* SDAnimatedImageView+WebCache.h in Headers */ = {isa = PBXBuildFile; fileRef = 10DC85093C083DCA6376C8D57645F961 /* SDAnimatedImageView+WebCache.h */; settings = {ATTRIBUTES = (Project, ); }; }; + 6F5BA8DCB88130D9136674325B91CF9B /* SDAnimatedImage.m in Sources */ = {isa = PBXBuildFile; fileRef = 4AE4CA16BD666E24B4AC075BA5B96D99 /* SDAnimatedImage.m */; }; + 702F88BC7A6426F94A9B459D89B3BF2A /* SDAsyncBlockOperation.h in Headers */ = {isa = PBXBuildFile; fileRef = AEB5505CF6F5BC0AEE9EE21CA9C15B55 /* SDAsyncBlockOperation.h */; settings = {ATTRIBUTES = (Project, ); }; }; + 703E247672BC3832CAE1DA941AB05140 /* CTUtils.m in Sources */ = {isa = PBXBuildFile; fileRef = 274B8FD25E60B1498C3FD0AC25857C7C /* CTUtils.m */; }; + 705ED92FD46E97B317B19C43532C5B5D /* CTValidationResult.m in Sources */ = {isa = PBXBuildFile; fileRef = A9D30C8B7D1C43AE1F39FD51D4B08273 /* CTValidationResult.m */; }; + 712476BDE78647D3B260BEEA93041473 /* CTDeviceInfo.h in Headers */ = {isa = PBXBuildFile; fileRef = B987FA4234DB3F9FEC1F86D423CA7CDC /* CTDeviceInfo.h */; settings = {ATTRIBUTES = (Project, ); }; }; + 715A235A646E349D505A9EF44F4CDF88 /* CTInAppDisplayViewControllerPrivate.h in Headers */ = {isa = PBXBuildFile; fileRef = A72A36156A912C94BAA848695334EC41 /* CTInAppDisplayViewControllerPrivate.h */; settings = {ATTRIBUTES = (Project, ); }; }; + 722F58A7FA1E73D7A5154AC644FD2466 /* CleverTapSyncDelegate.h in Headers */ = {isa = PBXBuildFile; fileRef = 2C02DAFB9B96E441E90EEAB2911DCD81 /* CleverTapSyncDelegate.h */; settings = {ATTRIBUTES = (Project, ); }; }; + 72DC5CF7654590CFD378AD55858DB0BE /* CTValidator.h in Headers */ = {isa = PBXBuildFile; fileRef = 7E2A239FE561CD142A1ECC72B363ACBE /* CTValidator.h */; settings = {ATTRIBUTES = (Project, ); }; }; + 7326617ECB05F45D4A60F5E59D8693AA /* SDImageCacheConfig.m in Sources */ = {isa = PBXBuildFile; fileRef = 9223119A5F096C85DC8630F36CC41AB4 /* SDImageCacheConfig.m */; }; + 736B8BD2377B9C74B4F1C01A0159D7F6 /* CTMessageMO.h in Headers */ = {isa = PBXBuildFile; fileRef = 80142AD22D875552DC2089615F2E9096 /* CTMessageMO.h */; settings = {ATTRIBUTES = (Project, ); }; }; + 736FE4E60F76C558900705C39DE95F25 /* CleverTapTrackedViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = CD8B5B3AC14A2DD84A689A8C9148B05D /* CleverTapTrackedViewController.m */; }; + 73B71B427CFDCF39E0563042F056E6AD /* CTCarouselImageView.m in Sources */ = {isa = PBXBuildFile; fileRef = 630B2A2DECD33C49CE25BCCF77D89D94 /* CTCarouselImageView.m */; }; + 745851E2F440002A047A77909B87EEB0 /* UIImage+GIF.h in Headers */ = {isa = PBXBuildFile; fileRef = C637E0C4C13DE3DF36894148A5AFCDEE /* UIImage+GIF.h */; settings = {ATTRIBUTES = (Project, ); }; }; + 7484F49930B3947827D08BD3C1040F3B /* SDAnimatedImagePlayer.m in Sources */ = {isa = PBXBuildFile; fileRef = 4CF798E5C12FFAAF4D51475D2CA07E55 /* SDAnimatedImagePlayer.m */; }; + 75876B7C53AA1D9B3E292EF1B01C32CD /* SDDiskCache.m in Sources */ = {isa = PBXBuildFile; fileRef = CEF3B281972C2D56BD7AA58176D808A0 /* SDDiskCache.m */; }; + 759C6B9A997D88D7054567D2CD1E0B7D /* SDImageLoader.m in Sources */ = {isa = PBXBuildFile; fileRef = 9CDC91F1D9F6E8E4C530871882C4F595 /* SDImageLoader.m */; }; + 75A865D36BFE4A7BEAB53945E2C8E045 /* SDImageCacheDefine.h in Headers */ = {isa = PBXBuildFile; fileRef = AAB240153BB1C2FE15F57B45E2402E8B /* SDImageCacheDefine.h */; settings = {ATTRIBUTES = (Project, ); }; }; + 7676FF2B8DCC27BE92F5FA7688B825A6 /* SDImageCache.m in Sources */ = {isa = PBXBuildFile; fileRef = 029DC6B5F4343D282DF5BF3646AA3460 /* SDImageCache.m */; }; + 771A2F2330E2D8C05DFB7045C957FDCD /* CTDismissButton.m in Sources */ = {isa = PBXBuildFile; fileRef = 700DE0D541492FF6D1D3D7595D969F06 /* CTDismissButton.m */; }; + 771CE79DB1987E9E13B9EDEB98F0311E /* CTSwipeView.m in Sources */ = {isa = PBXBuildFile; fileRef = E5420850D79BA65C8EA696A2E2B74D03 /* CTSwipeView.m */; }; + 78A72CD4420434DFFC70C9F4D4E3397A /* SDImageTransformer.m in Sources */ = {isa = PBXBuildFile; fileRef = F64B36E4B224329BBC5FBF3F9F5C8759 /* SDImageTransformer.m */; }; + 7995CAF0124A90B6D97A01454FC017F3 /* CTUserMO+CoreDataProperties.h in Headers */ = {isa = PBXBuildFile; fileRef = 96D6D2BC06B95F102A95219E63B3DCEE /* CTUserMO+CoreDataProperties.h */; settings = {ATTRIBUTES = (Project, ); }; }; + 79AFC5D832CC0ED64ED86C50C7E6A008 /* SDWebImageOptionsProcessor.h in Headers */ = {isa = PBXBuildFile; fileRef = 57D4B48E4C210929E9589D1100AB941E /* SDWebImageOptionsProcessor.h */; settings = {ATTRIBUTES = (Project, ); }; }; + 7C65C3EDF953B229F56CA70CEF6D4248 /* UIImage+MultiFormat.m in Sources */ = {isa = PBXBuildFile; fileRef = F2D7FA485AF4AD67531F65470D828E95 /* UIImage+MultiFormat.m */; }; + 7DFEB22D8A6C923AD3EAFD643A81F7B8 /* CTVarCache.m in Sources */ = {isa = PBXBuildFile; fileRef = FFA9E8D85B6EEAA2DF70E6D722CAA667 /* CTVarCache.m */; }; + 7E05780700B2B458CDB4875E0B07369B /* CTAlertViewController.h in Headers */ = {isa = PBXBuildFile; fileRef = 61DC36655B4D1581FDFB6B14F3C6D1E2 /* CTAlertViewController.h */; settings = {ATTRIBUTES = (Project, ); }; }; + 7F390C9AE194F1A165C8B0BD248EE0E3 /* SDImageCache.h in Headers */ = {isa = PBXBuildFile; fileRef = CD44EBCA750A1B13B076979CB06155F9 /* SDImageCache.h */; settings = {ATTRIBUTES = (Project, ); }; }; + 8038EF8B8E78E643607328EF4E232E79 /* CTMessageMO+CoreDataProperties.h in Headers */ = {isa = PBXBuildFile; fileRef = 3D4DEF7EA2EEF7C84BA5F5382102FF77 /* CTMessageMO+CoreDataProperties.h */; settings = {ATTRIBUTES = (Project, ); }; }; + 805CF9548D1328B9A26AE041B03525D9 /* CleverTapInstanceConfig.m in Sources */ = {isa = PBXBuildFile; fileRef = B503F11D6CAF66334A97EB5FA745C44D /* CleverTapInstanceConfig.m */; }; + 80C4E765700F5F214D8D7932D916BA87 /* SDImageAPNGCoder.h in Headers */ = {isa = PBXBuildFile; fileRef = 50AC1B40BFD9F8DB29D69FE37DDD5A66 /* SDImageAPNGCoder.h */; settings = {ATTRIBUTES = (Project, ); }; }; + 80EF1B18D239DE843B6944563EB94E42 /* ic_pause@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 73160AE1D1F3C62D3CFC44F9A9AFA032 /* ic_pause@2x.png */; }; + 812A5A89F37B2A712A01CBB44EC03C8B /* CTCertificatePinning.m in Sources */ = {isa = PBXBuildFile; fileRef = B3C2D48885392DDAB8C17092E4EAD9B2 /* CTCertificatePinning.m */; }; + 812FC99E5B68A330676F25426C798455 /* ct_default_video.png in Resources */ = {isa = PBXBuildFile; fileRef = 18A60941084FFBED607414476B58A2E7 /* ct_default_video.png */; }; + 817ADA06E286FF2F505028CBA396D02B /* SDAnimatedImagePlayer.h in Headers */ = {isa = PBXBuildFile; fileRef = C1216EF89AA18DD4217278825E018FD8 /* SDAnimatedImagePlayer.h */; settings = {ATTRIBUTES = (Project, ); }; }; + 81DDB86172FDFC68B1610AC7DE57740C /* CTFooterViewController~iphoneland.xib in Resources */ = {isa = PBXBuildFile; fileRef = 17074DB3E29934B1BD5CEAB8646E86EB /* CTFooterViewController~iphoneland.xib */; }; + 821DE5A140F7376590FB766DC1AD3175 /* CTInterstitialImageViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 3E2C9CF2E2B827D09CAA7FBCFFDF6EDC /* CTInterstitialImageViewController.m */; }; + 822F1836ABD5DC987348F2F8A2E5421A /* CTBaseHeaderFooterViewController.h in Headers */ = {isa = PBXBuildFile; fileRef = 6B9F39AAC74118DCFDFC537921D37BF9 /* CTBaseHeaderFooterViewController.h */; settings = {ATTRIBUTES = (Project, ); }; }; + 830D815988C9F092F8611A4A91159C89 /* CTPinnedNSURLSessionDelegate.h in Headers */ = {isa = PBXBuildFile; fileRef = B3A0A7FA1917A2F9BD266EA1B248D28A /* CTPinnedNSURLSessionDelegate.h */; settings = {ATTRIBUTES = (Project, ); }; }; + 85341FF8594F27028117BF8D54034A2D /* CleverTapFeatureFlagsPrivate.h in Headers */ = {isa = PBXBuildFile; fileRef = BFDAE7711879A5C3246459439F8D05BE /* CleverTapFeatureFlagsPrivate.h */; settings = {ATTRIBUTES = (Project, ); }; }; + 857BFF9C85E55826E1BD7266F80AAC11 /* SDImageIOCoder.h in Headers */ = {isa = PBXBuildFile; fileRef = 8D4CFD8D6B56BA8EC83D432EB9E29754 /* SDImageIOCoder.h */; settings = {ATTRIBUTES = (Project, ); }; }; + 89BF6182BEC8C667EF4088EAE5D663AD /* CTInterstitialViewController~iphoneport.xib in Resources */ = {isa = PBXBuildFile; fileRef = AECC5FFB054750810D65324CD9C840ED /* CTInterstitialViewController~iphoneport.xib */; }; + 8B1A4F5AF17EEAF769E0F87112938436 /* CTFooterViewController~ipadland.xib in Resources */ = {isa = PBXBuildFile; fileRef = 9E1C1344106FB036B19AAE79D5FF8983 /* CTFooterViewController~ipadland.xib */; }; + 8BF9069DE6978F226A50274D120942C1 /* CTCoverImageViewController.h in Headers */ = {isa = PBXBuildFile; fileRef = A01E8D306DD807DD70EE6C69EA745B42 /* CTCoverImageViewController.h */; settings = {ATTRIBUTES = (Project, ); }; }; + 8C11758A0D911C09908DD2A4D8C9581A /* CleverTapJSInterfacePrivate.h in Headers */ = {isa = PBXBuildFile; fileRef = C7701B9AEE68F00BE68BAB3888A54C72 /* CleverTapJSInterfacePrivate.h */; settings = {ATTRIBUTES = (Project, ); }; }; + 8D2E36A5640DBBE8E0AADF287184D121 /* CleverTap+SSLPinning.h in Headers */ = {isa = PBXBuildFile; fileRef = 38C29C3AA0CDD6D72DAE6C9465271799 /* CleverTap+SSLPinning.h */; settings = {ATTRIBUTES = (Project, ); }; }; + 8D31F5004FC3C35BDD4E2478B3436E49 /* CTUtils.h in Headers */ = {isa = PBXBuildFile; fileRef = FC375CFD124928065969D8C432D88146 /* CTUtils.h */; settings = {ATTRIBUTES = (Project, ); }; }; + 8DDD2C7B0E3FA5E30F6322C53B956614 /* CTMessageMO+CoreDataProperties.m in Sources */ = {isa = PBXBuildFile; fileRef = D83A587102725CFA2B87C79A9D77CFFA /* CTMessageMO+CoreDataProperties.m */; }; + 8E4CE058E72A6D414FDFE724FDFFE21F /* UIColor+SDHexString.h in Headers */ = {isa = PBXBuildFile; fileRef = 54533E358EC0BB8F88B8CE800B3155AC /* UIColor+SDHexString.h */; settings = {ATTRIBUTES = (Project, ); }; }; + 8E652D74E0510F14499415D19963ED31 /* CTCertificatePinning.h in Headers */ = {isa = PBXBuildFile; fileRef = 7105804B4EDFB9C3431CE93921E7D60D /* CTCertificatePinning.h */; settings = {ATTRIBUTES = (Project, ); }; }; + 8EEE9F469D292C4E10910F99C17B7B3D /* CTCoverImageViewController~iphoneland.xib in Resources */ = {isa = PBXBuildFile; fileRef = 6646ABB6FFA9E81CA56737DC14680B96 /* CTCoverImageViewController~iphoneland.xib */; }; + 8F8E4E3BDE87AB2A9E19E58E8DF8995C /* SDImageGIFCoder.h in Headers */ = {isa = PBXBuildFile; fileRef = 16D02024458EAB232BA12891AD0380B3 /* SDImageGIFCoder.h */; settings = {ATTRIBUTES = (Project, ); }; }; + 8F9CB9C429F21097A50C567A3F10B4DB /* CTInterstitialImageViewController~ipadland.xib in Resources */ = {isa = PBXBuildFile; fileRef = 0E3DEF3A0F8263EB93C203B353DCFAC1 /* CTInterstitialImageViewController~ipadland.xib */; }; + 8FB6DBB58C0CE88F882A5E62A418928D /* UIImage+Transform.m in Sources */ = {isa = PBXBuildFile; fileRef = F0EB98CB11EE21869F4611899195CC03 /* UIImage+Transform.m */; }; + 8FE5F56DFA35C5B05EEC5FDACF5FCE8B /* CTInAppFCManager.h in Headers */ = {isa = PBXBuildFile; fileRef = 72BDAE48AA1C47C34D3627DFF3BB9855 /* CTInAppFCManager.h */; settings = {ATTRIBUTES = (Project, ); }; }; + 91C717BA899BC7F766408D6BF2AC098F /* CTCoverViewController~iphoneland.xib in Resources */ = {isa = PBXBuildFile; fileRef = 3FA008F1C8309BEFD138C22BB8B9F649 /* CTCoverViewController~iphoneland.xib */; }; + 924723E6C4A0D0664F2DA11C767B4967 /* SDFileAttributeHelper.h in Headers */ = {isa = PBXBuildFile; fileRef = 4D574AECCA07209855A039D16C68A64B /* SDFileAttributeHelper.h */; settings = {ATTRIBUTES = (Project, ); }; }; + 9274E0A19E004219DD8117483C007E9E /* CleverTap+CTVar.h in Headers */ = {isa = PBXBuildFile; fileRef = F5FD179158AF237B12219C05D1F28770 /* CleverTap+CTVar.h */; settings = {ATTRIBUTES = (Project, ); }; }; + 92BBD2D9F39CD902102C7C1CA583168E /* ic_pause@1x.png in Resources */ = {isa = PBXBuildFile; fileRef = B26258BD72C158EDE1CC947EAE7C3253 /* ic_pause@1x.png */; }; + 92C639585D267E345246567C59DDFCE8 /* CleverTapInstanceConfig.h in Headers */ = {isa = PBXBuildFile; fileRef = 789AECDB6BCEC4052AC168E08651DB40 /* CleverTapInstanceConfig.h */; settings = {ATTRIBUTES = (Project, ); }; }; + 93B1C5DD463CD1CF11E83A5036926EF8 /* CTHalfInterstitialViewController~iphoneport.xib in Resources */ = {isa = PBXBuildFile; fileRef = 92D3AC6F9BEF3101CD0789592594E2DD /* CTHalfInterstitialViewController~iphoneport.xib */; }; + 93F69C59AAEE2FAA36886F1A945BFC59 /* SDWebImageCacheKeyFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = 9DF0A0A3A4355D1B45BDDD11C05A7D64 /* SDWebImageCacheKeyFilter.m */; }; + 95761C373BC1A3F593996F8111661DF2 /* SDImageGraphics.m in Sources */ = {isa = PBXBuildFile; fileRef = B5709F67519EAD8895496BBD72FA11C7 /* SDImageGraphics.m */; }; + 95CECB3F23A3F143F424FD5EC8C837C7 /* CTPreferences.m in Sources */ = {isa = PBXBuildFile; fileRef = 2E09B0FC2D55EB382E67C58215EECDC6 /* CTPreferences.m */; }; + 96E8796D194F972F1B9D09D9375B1E64 /* CleverTapUTMDetail.h in Headers */ = {isa = PBXBuildFile; fileRef = 96B641C4C300927F8E23F5FB9593879E /* CleverTapUTMDetail.h */; settings = {ATTRIBUTES = (Project, ); }; }; + 977F254B471D2BB7509D29C867614EDC /* ic_play@1x.png in Resources */ = {isa = PBXBuildFile; fileRef = 337056D0046D9B8DF1E7AE7E91938ACA /* ic_play@1x.png */; }; + 97ECCF0144F12B405B2819B1EEA0DFC2 /* CTAVPlayerViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 151964BDD6348393DEAD244DF26EB2A3 /* CTAVPlayerViewController.m */; }; + 98EA9F27C1EA4F4223730AB27E2D7385 /* CTLegacyIdentityRepo.h in Headers */ = {isa = PBXBuildFile; fileRef = 4DA9AACA23F6CA2954A4476A7BE96B47 /* CTLegacyIdentityRepo.h */; settings = {ATTRIBUTES = (Project, ); }; }; + 9A79A76CBB614E968AECC2B3302F30AF /* CTPreferences.h in Headers */ = {isa = PBXBuildFile; fileRef = E9A1A6516E49A693CDD84104BF69AB55 /* CTPreferences.h */; settings = {ATTRIBUTES = (Project, ); }; }; + 9B03233ACAD99B0BB7EF217E05E2A80C /* CTVar-Internal.h in Headers */ = {isa = PBXBuildFile; fileRef = 098C3FF5AE525ED63C5DD2E41B30B70D /* CTVar-Internal.h */; settings = {ATTRIBUTES = (Project, ); }; }; + 9C6082A79B7A329BEE48E265529661CB /* SDImageIOAnimatedCoder.h in Headers */ = {isa = PBXBuildFile; fileRef = D0EE2622AD7768A669E399E39BC28E72 /* SDImageIOAnimatedCoder.h */; settings = {ATTRIBUTES = (Project, ); }; }; + 9E11BF4FDBDA51B1484A7EEE7EFA922E /* CTCarouselImageMessageCell.h in Headers */ = {isa = PBXBuildFile; fileRef = 04A9A894D36D94E0CCFBD33FB53D7BAC /* CTCarouselImageMessageCell.h */; settings = {ATTRIBUTES = (Project, ); }; }; + 9E309DEF986B49089ACF9C686AC7AE59 /* SDWebImageDownloaderOperation.h in Headers */ = {isa = PBXBuildFile; fileRef = 6BE3A8690D946A534AB9F0B67CFB1342 /* SDWebImageDownloaderOperation.h */; settings = {ATTRIBUTES = (Project, ); }; }; + A0EACE749CB50E1BAB3A8A12ABAFC890 /* SDWebImageTransition.h in Headers */ = {isa = PBXBuildFile; fileRef = D7F24AEB669B41FB840FC3265994A7B6 /* SDWebImageTransition.h */; settings = {ATTRIBUTES = (Project, ); }; }; + A14D29E8B4B8C51F52CD9F5544A78962 /* NSButton+WebCache.m in Sources */ = {isa = PBXBuildFile; fileRef = 3A25DC0C542BAA80A8E2F78B2669DA04 /* NSButton+WebCache.m */; }; + A1E15FC5DA8FD6B8F027801ED30AEE4A /* SDImageFrame.m in Sources */ = {isa = PBXBuildFile; fileRef = D6BE7985F78AF20EB6D10ACCEE52B681 /* SDImageFrame.m */; }; + A2FD151569340CDA55032E4FEA9207C2 /* CTInAppDisplayViewController.h in Headers */ = {isa = PBXBuildFile; fileRef = B6CF8DC46A0593542A32C1422AF63DA2 /* CTInAppDisplayViewController.h */; settings = {ATTRIBUTES = (Project, ); }; }; + A4D1E4FE505B3D2247B61AFFF22652D4 /* CTDeviceInfo.m in Sources */ = {isa = PBXBuildFile; fileRef = 0A86E5FDEFE99EDC2EFECFD36BBB923A /* CTDeviceInfo.m */; }; + A5A0D1E9940AFC6D0901C08846C821BF /* SDWebImageDownloader.m in Sources */ = {isa = PBXBuildFile; fileRef = E2198D00B5BC5434ECCF179F99E0003C /* SDWebImageDownloader.m */; }; + A6296F1EFAAE17936E3A7EEA4671A799 /* SDImageHEICCoder.h in Headers */ = {isa = PBXBuildFile; fileRef = B3D24A0C002E081DAC44AC5CFA0CD927 /* SDImageHEICCoder.h */; settings = {ATTRIBUTES = (Project, ); }; }; + A64624B1476619D64A7B575A8C7DDFD2 /* CTDomainFactory.m in Sources */ = {isa = PBXBuildFile; fileRef = 08EE07580B26497F4AB762EB97F9BE83 /* CTDomainFactory.m */; }; + A66B7BCA4A4810A3568FDC9A129E6A1D /* UIColor+SDHexString.m in Sources */ = {isa = PBXBuildFile; fileRef = 6B8D2DB4FBD399283936E79054DABE66 /* UIColor+SDHexString.m */; }; + A681734BAD5DDEDC452B5D3D3AFC81CC /* CTFooterViewController~iphoneport.xib in Resources */ = {isa = PBXBuildFile; fileRef = 8356190F1BBFC342C1D5C7369D99B19A /* CTFooterViewController~iphoneport.xib */; }; + A68D6CFE5F029DA9DC6BFD7CB1B3B540 /* CTInAppHTMLViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 736C5DE6A312E3F1994B1BA46B0AA20D /* CTInAppHTMLViewController.m */; }; + A6FCC065E8F70D674AF31CC162E0574A /* UIView+WebCache.h in Headers */ = {isa = PBXBuildFile; fileRef = B0304615B87F014C7A2F955472AAA872 /* UIView+WebCache.h */; settings = {ATTRIBUTES = (Project, ); }; }; + A75E62BE82532A5D14D5C75081DBCC8F /* SDCallbackQueue.h in Headers */ = {isa = PBXBuildFile; fileRef = A506B300096DCFD3B2B39405F54DA2E1 /* SDCallbackQueue.h */; settings = {ATTRIBUTES = (Project, ); }; }; + A8766A8C9466EC9C9F64227EBF00E753 /* SDAnimatedImageRep.h in Headers */ = {isa = PBXBuildFile; fileRef = CD9461F3E4AD7B23AC099FECFD220030 /* SDAnimatedImageRep.h */; settings = {ATTRIBUTES = (Project, ); }; }; + A8DAE80B5FBB0D8B75AE0A8B11A84DBA /* CTProfileBuilder.m in Sources */ = {isa = PBXBuildFile; fileRef = EC269F7BBFC8824572FF8A98C3BC608D /* CTProfileBuilder.m */; }; + A91667ED9740DB8C964E9A2B8B5C2C89 /* SDWebImageManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 92B69B0DEB40C442AB2ADC07B34BC85B /* SDWebImageManager.m */; }; + A94AC3A23E362991EECE644B96276B40 /* CTCoverViewController~ipad.xib in Resources */ = {isa = PBXBuildFile; fileRef = 1F840FF1C673738137F970C64980B8AD /* CTCoverViewController~ipad.xib */; }; + A99D50B4A78430D997B0CBA8D9B24807 /* CTCarouselImageView.h in Headers */ = {isa = PBXBuildFile; fileRef = 56F276190FFFDABDF3393EB5E50C6321 /* CTCarouselImageView.h */; settings = {ATTRIBUTES = (Project, ); }; }; + AAC448D46DCF680244C92E01A0CE3B32 /* CleverTapFeatureFlags.m in Sources */ = {isa = PBXBuildFile; fileRef = 049115AFC648ED4EA10CA89F8318AB28 /* CleverTapFeatureFlags.m */; }; + AC19DC97F48F393D0C870DA11010A1BD /* CleverTapProductConfigPrivate.h in Headers */ = {isa = PBXBuildFile; fileRef = 14954B163FCFE6D39F8B5008413C1938 /* CleverTapProductConfigPrivate.h */; settings = {ATTRIBUTES = (Project, ); }; }; + ADEA19F26D883549E2C75E152332157A /* CTProfileBuilder.h in Headers */ = {isa = PBXBuildFile; fileRef = 5EE82619B3B0BB028ABC83B0FD8D52E9 /* CTProfileBuilder.h */; settings = {ATTRIBUTES = (Project, ); }; }; + ADF5EA23CAACC5BA9B5E657DF18FA770 /* SDImageCoderHelper.h in Headers */ = {isa = PBXBuildFile; fileRef = 71088BC74685C239ED7D1AB536A265A6 /* SDImageCoderHelper.h */; settings = {ATTRIBUTES = (Project, ); }; }; + AE204FF833B93F7B6020FC4BE35DD532 /* CleverTapInboxViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = A00DE791EE1ACCEE67F26E19133FD958 /* CleverTapInboxViewController.xib */; }; + AE2226D90D76CB083CBBB796210CD2BB /* UIButton+WebCache.m in Sources */ = {isa = PBXBuildFile; fileRef = 76F231FDBE07DF2E8598B84AE6F42E67 /* UIButton+WebCache.m */; }; + AF06E2ECDDB23634810F41285279A400 /* SDWeakProxy.h in Headers */ = {isa = PBXBuildFile; fileRef = C5F3643723A955854CE1093234859684 /* SDWeakProxy.h */; settings = {ATTRIBUTES = (Project, ); }; }; + AF8AB2CDC7C835A8484A8065F8081A55 /* CleverTap+FeatureFlags.h in Headers */ = {isa = PBXBuildFile; fileRef = AD3389FCCB97A8B643FE0B72D4910E9C /* CleverTap+FeatureFlags.h */; settings = {ATTRIBUTES = (Project, ); }; }; + AFA25A1DC0DCDDA040A263FF6CF5E5C1 /* CTCoverImageViewController~iphoneport.xib in Resources */ = {isa = PBXBuildFile; fileRef = B18A879294BF1D02F8318F5E67C6BCE5 /* CTCoverImageViewController~iphoneport.xib */; }; + B174E305D959F4C2DA91BD770E0AA54B /* SDWebImageDownloaderRequestModifier.h in Headers */ = {isa = PBXBuildFile; fileRef = D7C9505ADF1E9A64A18F43664702B882 /* SDWebImageDownloaderRequestModifier.h */; settings = {ATTRIBUTES = (Project, ); }; }; + B272DE47E7E1AF5421B7EB2CE0782E50 /* SDImageLoader.h in Headers */ = {isa = PBXBuildFile; fileRef = 7813CB72482158D2DD680BEFDD9AF1FC /* SDImageLoader.h */; settings = {ATTRIBUTES = (Project, ); }; }; + B337976E837755E90DEFFD9AC3298DAD /* CTInboxController.m in Sources */ = {isa = PBXBuildFile; fileRef = DD4EB1BCD53E5C2EEF147ED812D0C967 /* CTInboxController.m */; }; + B39E115163ADCA158508B98C03397402 /* ct_default_audio.png in Resources */ = {isa = PBXBuildFile; fileRef = 8758D25C574A6464BCC80D8AAA3B42CC /* ct_default_audio.png */; }; + B3B7C538B6E2593F8947B0F36FCE6789 /* CTInAppFCManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 4B4E0240BEABF8BE5DBA73F3EF75E89F /* CTInAppFCManager.m */; }; + B51956F42EE25360394569477E71E33B /* SDImageAWebPCoder.h in Headers */ = {isa = PBXBuildFile; fileRef = 3A11EE5FA06CC91AD6CC0EA0DAD765AD /* SDImageAWebPCoder.h */; settings = {ATTRIBUTES = (Project, ); }; }; + B560936FA4238CB3913846DF603E7B98 /* SDWebImageError.h in Headers */ = {isa = PBXBuildFile; fileRef = 077D8FC4221F09FB2FF65552161F02D9 /* SDWebImageError.h */; settings = {ATTRIBUTES = (Project, ); }; }; + B57EEA5F2945345F480557941F0D0A3F /* SDAnimatedImageView.h in Headers */ = {isa = PBXBuildFile; fileRef = 07DD50F408FDA36B256D9C992D386256 /* SDAnimatedImageView.h */; settings = {ATTRIBUTES = (Project, ); }; }; + B687BA5F33B9F64E2AEB0EFBFBC77A74 /* CTAVPlayerViewController.h in Headers */ = {isa = PBXBuildFile; fileRef = 7F457C8F245828D2FB9C428C43743DA0 /* CTAVPlayerViewController.h */; settings = {ATTRIBUTES = (Project, ); }; }; + B791AE397AF0BE4C40750DE519252B58 /* CTCoverImageViewController~ipadland.xib in Resources */ = {isa = PBXBuildFile; fileRef = 2F0CCB6AB9EAC5621C7A4812CC7B741F /* CTCoverImageViewController~ipadland.xib */; }; + B9656751C0B2274740DF590BF1852290 /* CleverTap+ProductConfig.h in Headers */ = {isa = PBXBuildFile; fileRef = E2C4B1B69335DDD69A4416BBCF44C29C /* CleverTap+ProductConfig.h */; settings = {ATTRIBUTES = (Project, ); }; }; + B98A31A62C1C0EA6AD1F06A3D066EECA /* SDWebImageDownloaderConfig.m in Sources */ = {isa = PBXBuildFile; fileRef = 14FEEA8125F157B2B695F2021FD28BEF /* SDWebImageDownloaderConfig.m */; }; + BA5F4BC47953F6531BE4AF74E4E88FEF /* CTImageInAppViewControllerPrivate.h in Headers */ = {isa = PBXBuildFile; fileRef = EC8EEF178D1406F1F0B64C3623767D62 /* CTImageInAppViewControllerPrivate.h */; settings = {ATTRIBUTES = (Project, ); }; }; + BA798218A36F991B7100D2176E2BE3E6 /* CTHeaderViewController~iphoneland.xib in Resources */ = {isa = PBXBuildFile; fileRef = 654CEF2FF9342DCF99C2CA00FBF7FF60 /* CTHeaderViewController~iphoneland.xib */; }; + BB304B77AB410115724DBD09030740EC /* SDWebImageDownloader.h in Headers */ = {isa = PBXBuildFile; fileRef = 178165C3620183FC34A1C61B401522E0 /* SDWebImageDownloader.h */; settings = {ATTRIBUTES = (Project, ); }; }; + BB34BA48B87AD28E68EAD214759D11CC /* CTPinnedNSURLSessionDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = A722ECA0B946FDE37FB9EAC131884F82 /* CTPinnedNSURLSessionDelegate.m */; }; + BBD3C597569CFD970F525166149E8077 /* SDGraphicsImageRenderer.h in Headers */ = {isa = PBXBuildFile; fileRef = 7AE881B1848CC3A82B696124CF9F9196 /* SDGraphicsImageRenderer.h */; settings = {ATTRIBUTES = (Project, ); }; }; + BCE0C3C40292E12AA7872244E23FBBE3 /* CTDisplayUnitController.h in Headers */ = {isa = PBXBuildFile; fileRef = 50297EC54776A6B825653AE3B69F0B1A /* CTDisplayUnitController.h */; settings = {ATTRIBUTES = (Project, ); }; }; + BCF51E69BD0C4EE650D2A4745CB8D977 /* ContentMerger.m in Sources */ = {isa = PBXBuildFile; fileRef = D3C029CEA4014722106EB5B25D844546 /* ContentMerger.m */; }; + BDC659502BBA2D065237085C1D0E4AC4 /* CTInterstitialImageViewController.h in Headers */ = {isa = PBXBuildFile; fileRef = 15382C8DE76EA0E65686C1711F2FC80E /* CTInterstitialImageViewController.h */; settings = {ATTRIBUTES = (Project, ); }; }; + BE2866313E68B6536E8CD1CBB4AEAD33 /* SDWeakProxy.m in Sources */ = {isa = PBXBuildFile; fileRef = 9F93FB6C98B83B0779436D3FB5258689 /* SDWeakProxy.m */; }; + BEEEC5D7D4D87EC865FE7C61F11B119A /* SDDeviceHelper.m in Sources */ = {isa = PBXBuildFile; fileRef = 755C72A35E5051DA700AED8E6BE7A38F /* SDDeviceHelper.m */; }; + BEF6C73858CDC6437684359B15BF79A8 /* SDImageCoder.h in Headers */ = {isa = PBXBuildFile; fileRef = 325B01B581855146EA7F62EA9083EE76 /* SDImageCoder.h */; settings = {ATTRIBUTES = (Project, ); }; }; + BF75C9EA6AB64A9FD09B310308A73969 /* CTRequestSender.h in Headers */ = {isa = PBXBuildFile; fileRef = 71CDAA579ECFEE112C1038377280BCCF /* CTRequestSender.h */; settings = {ATTRIBUTES = (Project, ); }; }; + BFECA8BD55997FD41C36076B7070574D /* UIImage+ExtendedCacheData.h in Headers */ = {isa = PBXBuildFile; fileRef = 7193DB664DE2D593DF3024BB2E5CE869 /* UIImage+ExtendedCacheData.h */; settings = {ATTRIBUTES = (Project, ); }; }; + C00738098B0316D8DE8D046EF7741DBA /* CleverTapPushNotificationDelegate.h in Headers */ = {isa = PBXBuildFile; fileRef = 32375B1CFB51BD51EFA8FFE263A283C8 /* CleverTapPushNotificationDelegate.h */; settings = {ATTRIBUTES = (Project, ); }; }; + C0A618B08ADE9F3F42B2296A0EB6C936 /* CTRequestFactory.h in Headers */ = {isa = PBXBuildFile; fileRef = E22FD9FFE6ECABB54B00457ECFAA3835 /* CTRequestFactory.h */; settings = {ATTRIBUTES = (Project, ); }; }; + C0EBB857C0CE219DF86EC11740FB344C /* CTValidationResultStack.h in Headers */ = {isa = PBXBuildFile; fileRef = B7910B1C64189A8D0D8851CEF662549D /* CTValidationResultStack.h */; settings = {ATTRIBUTES = (Project, ); }; }; + C1C54C41536332E28B6FE40E8A200582 /* CTInboxIconMessageCell~land.xib in Resources */ = {isa = PBXBuildFile; fileRef = E6B0ABD50999FA13A03E0D81914153D4 /* CTInboxIconMessageCell~land.xib */; }; + C2187821BF3A766769C77EB83139A457 /* CTHalfInterstitialImageViewController.h in Headers */ = {isa = PBXBuildFile; fileRef = 1C23CD67F921F303A7EEE511A7100875 /* CTHalfInterstitialImageViewController.h */; settings = {ATTRIBUTES = (Project, ); }; }; + C254428715F5DE868E91C9CB3D7E4B61 /* UIImageView+WebCache.m in Sources */ = {isa = PBXBuildFile; fileRef = 3FFEF7A1EC3C534D688767B27AFD00FB /* UIImageView+WebCache.m */; }; + C295E15EAA44297B701841991A9A844E /* CTFooterViewController.h in Headers */ = {isa = PBXBuildFile; fileRef = 7502CECEC2440E4DD81DBA46D9201379 /* CTFooterViewController.h */; settings = {ATTRIBUTES = (Project, ); }; }; + C2AB1E9ABF89B913DAA6606B49A99A10 /* SDImageCacheDefine.m in Sources */ = {isa = PBXBuildFile; fileRef = 34F282951992DE86428E642BF031C0B8 /* SDImageCacheDefine.m */; }; + C2AF1513206F5C665FC5D4C7350461C0 /* CTCoverViewController.h in Headers */ = {isa = PBXBuildFile; fileRef = DC096C2F42FD8E6E49CF512117B3BB41 /* CTCoverViewController.h */; settings = {ATTRIBUTES = (Project, ); }; }; + C4805990167E7924677730A844691221 /* CTHeaderViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = EE960C042F15A01816F4F93DA9E1BA27 /* CTHeaderViewController.m */; }; + C5D8D571544AEB12B0DA830C1171FFEB /* SDWebImageCompat.h in Headers */ = {isa = PBXBuildFile; fileRef = 3AA3523DA21F9568BED60C63AF2E8265 /* SDWebImageCompat.h */; settings = {ATTRIBUTES = (Project, ); }; }; + C64DD3904EBFE9D7B3089F0767A7F571 /* SDImageIOCoder.m in Sources */ = {isa = PBXBuildFile; fileRef = 28F1B4CF1FF90A8F4CF9240C24EFE569 /* SDImageIOCoder.m */; }; + C675C32BD5D177C5EDFE6062A7943D11 /* CTEventBuilder.h in Headers */ = {isa = PBXBuildFile; fileRef = A7F188562C55AF10922CE49A375732AD /* CTEventBuilder.h */; settings = {ATTRIBUTES = (Project, ); }; }; + C793B2E1C0D0D43B68EC56ED3EFF82FF /* CTConstants.h in Headers */ = {isa = PBXBuildFile; fileRef = 62AE043505F38506F90A81C9BD24088F /* CTConstants.h */; settings = {ATTRIBUTES = (Project, ); }; }; + C8A529DD9AECA0511D80C8D96F63DD89 /* SDWebImageOptionsProcessor.m in Sources */ = {isa = PBXBuildFile; fileRef = C29A03C2AFD4B0F5D8BF98023C6FF1DB /* SDWebImageOptionsProcessor.m */; }; + C94504ECED3B417B2DAE0238494CFA4A /* CTImageInAppViewController.h in Headers */ = {isa = PBXBuildFile; fileRef = 9E5849BB1971C0E916A88560C4C7BC7D /* CTImageInAppViewController.h */; settings = {ATTRIBUTES = (Project, ); }; }; + C95E9F06CFAAA2800E66689E7EDB4DC1 /* UIImage+GIF.m in Sources */ = {isa = PBXBuildFile; fileRef = 9BC2E660550CD31850654E4D1D1930CB /* UIImage+GIF.m */; }; + CA5866B60FCB3D12D952E4935C6B33D8 /* CTHeaderViewController~ipad.xib in Resources */ = {isa = PBXBuildFile; fileRef = 5348BA9393A2E2359BB7AEE6F72CD35D /* CTHeaderViewController~ipad.xib */; }; + CA586B80A71C55E490F31407C1B237A5 /* CTUIUtils.m in Sources */ = {isa = PBXBuildFile; fileRef = 9005C3A85A2F01CD4DBB8C7C454E5848 /* CTUIUtils.m */; }; + CB240398BBB8289E97AC93FDBF60887D /* SDWebImageDownloaderDecryptor.m in Sources */ = {isa = PBXBuildFile; fileRef = 7091F38357BEF7082868DB76FAE8898E /* SDWebImageDownloaderDecryptor.m */; }; + CB51FC80B676EB93558B90AD1217D925 /* CTDisplayUnitController.m in Sources */ = {isa = PBXBuildFile; fileRef = D53EF57DD295B8D287FAF67C46C2A538 /* CTDisplayUnitController.m */; }; + CC511B3DBE8CDE60607E7892DA8572F0 /* CTUIUtils.h in Headers */ = {isa = PBXBuildFile; fileRef = B187D652574E88A55CA55A8E8C3EF812 /* CTUIUtils.h */; settings = {ATTRIBUTES = (Project, ); }; }; + CCE96698BA27787FDD20A297C0948CA7 /* SDDisplayLink.m in Sources */ = {isa = PBXBuildFile; fileRef = C6E5DD3F3D838DF86363F7985A6951C4 /* SDDisplayLink.m */; }; + CD17B11DE2F0FDD2CB4FDFEA73DCCA06 /* SDWebImageCompat.m in Sources */ = {isa = PBXBuildFile; fileRef = 577945C4A36E5A326590B3E2CE3261D1 /* SDWebImageCompat.m */; }; + CD8ECAD77E23980008149C61C2EAD249 /* CTCarouselMessageCell~land.xib in Resources */ = {isa = PBXBuildFile; fileRef = AE63C5E4788D3C82980131B21AECB899 /* CTCarouselMessageCell~land.xib */; }; + CDF832D381251B812D9E3540977AC0CB /* CleverTapDisplayUnitContent.m in Sources */ = {isa = PBXBuildFile; fileRef = 83B72672CFF90E84BE416ACB8A78A3CF /* CleverTapDisplayUnitContent.m */; }; + CE33E388D9A7A117DBD6FBEAE016D6DD /* CleverTap+InAppNotifications.h in Headers */ = {isa = PBXBuildFile; fileRef = 7F72BE1573DD68EF528B919FA972994B /* CleverTap+InAppNotifications.h */; settings = {ATTRIBUTES = (Project, ); }; }; + CE98BF2AD9DDB561A9F182BB984AEF4E /* ic_pause@3x.png in Resources */ = {isa = PBXBuildFile; fileRef = 56265E3EF3C54778C8E17FDCA7AEF211 /* ic_pause@3x.png */; }; + CF6580BD4418487B47CC7B0B5227A74D /* SDAssociatedObject.h in Headers */ = {isa = PBXBuildFile; fileRef = 059FB3ED6C02F9C1C6843439DA6CC598 /* SDAssociatedObject.h */; settings = {ATTRIBUTES = (Project, ); }; }; + CFEB6A561EB131C5A74712A9643DBF90 /* CTImageInAppViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 2DB860DA3CD1868B7D764240D70EC96F /* CTImageInAppViewController.m */; }; + D0751E3FDF0FA0A602152A9AEFD7FEBA /* SDWebImageDownloaderResponseModifier.m in Sources */ = {isa = PBXBuildFile; fileRef = D0D446813CE030CCE6CF411992B2A263 /* SDWebImageDownloaderResponseModifier.m */; }; + D11B4AE6C6FB8558E1D493E23AC7FCFE /* SDWebImageDownloaderResponseModifier.h in Headers */ = {isa = PBXBuildFile; fileRef = 4BC1DCE26164671BD35675BA6B45A5AD /* SDWebImageDownloaderResponseModifier.h */; settings = {ATTRIBUTES = (Project, ); }; }; + D1D8DDC9C78A1B2F93A75ED7FB4581A2 /* CTIdentityRepo.h in Headers */ = {isa = PBXBuildFile; fileRef = 69F004D1418A6071434F554C1E0D71A1 /* CTIdentityRepo.h */; settings = {ATTRIBUTES = (Project, ); }; }; + D226F01E7A4BDE041C30561F88AFC97B /* CTMessageMO.m in Sources */ = {isa = PBXBuildFile; fileRef = 3A5562928354B06BCDAE767BA3B43C27 /* CTMessageMO.m */; }; + D251FA0095A9D50F938EBA6B9C409602 /* CTNotificationButton.h in Headers */ = {isa = PBXBuildFile; fileRef = 7E6641952F300E5604649DFF6C8B427D /* CTNotificationButton.h */; settings = {ATTRIBUTES = (Project, ); }; }; + D417BEA908C874963837BF642192A41C /* CTCoverImageViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 88EED7FE2B8CDF0BF33275065C84E390 /* CTCoverImageViewController.m */; }; + D422E81D0FCD039FC61C70B53C1E2F54 /* SDImageAWebPCoder.m in Sources */ = {isa = PBXBuildFile; fileRef = 7F18856EB43920E1377504E0E79A2410 /* SDImageAWebPCoder.m */; }; + D46C9AC4B01B8941D227C30EB1513075 /* CTNotificationButton.m in Sources */ = {isa = PBXBuildFile; fileRef = 49E028464AA134E465C7DC4CB4B98DF4 /* CTNotificationButton.m */; }; + D49EDBD2CBF6837B85479450CF5ADF23 /* CTHalfInterstitialImageViewController~iphoneport.xib in Resources */ = {isa = PBXBuildFile; fileRef = 1C92AAA703796848D77C8068C6ACB96A /* CTHalfInterstitialImageViewController~iphoneport.xib */; }; + D4E41C6724B22D4A921C3037ADC792B0 /* UIImage+ExtendedCacheData.m in Sources */ = {isa = PBXBuildFile; fileRef = A126E40197C1858FA6457DE6B54E59B6 /* UIImage+ExtendedCacheData.m */; }; + D53D49F094B75EE95006055C7FBD8247 /* CTValidationResult.h in Headers */ = {isa = PBXBuildFile; fileRef = 248C1EE517A4730DD9D44394EC6FBF42 /* CTValidationResult.h */; settings = {ATTRIBUTES = (Project, ); }; }; + D56DB08F1F71FDA1FDB1E49D49D07C09 /* UIImageView+HighlightedWebCache.m in Sources */ = {isa = PBXBuildFile; fileRef = 1C5625DBC0E0D9A718B8A5684C4133F0 /* UIImageView+HighlightedWebCache.m */; }; + D727EAA91B786ACC6DE7394BB0008F0B /* SDWebImageOperation.h in Headers */ = {isa = PBXBuildFile; fileRef = 62151ACF530E51374C39D364235AFA4D /* SDWebImageOperation.h */; settings = {ATTRIBUTES = (Project, ); }; }; + DA2F9D0C7106115B7DFEAE1090B9125E /* CleverTapInboxViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = B9EB6FA72B18630E084FEED4B0D44D3B /* CleverTapInboxViewController.m */; }; + DA7FA9E69BF1C060158DE3D0DA01D0E7 /* CTHeaderViewController~iphoneport.xib in Resources */ = {isa = PBXBuildFile; fileRef = 30CEC3B0B581886F8AE6FBA068DFDF4C /* CTHeaderViewController~iphoneport.xib */; }; + DB343977D61E7C30BE64D1FCDE834218 /* SDWebImageDownloaderDecryptor.h in Headers */ = {isa = PBXBuildFile; fileRef = 1F4631150502A4420731DFDEFBAE4900 /* SDWebImageDownloaderDecryptor.h */; settings = {ATTRIBUTES = (Project, ); }; }; + DB6E9F134D7F87715468F30F6E3F6A11 /* CTInboxController.h in Headers */ = {isa = PBXBuildFile; fileRef = AA5942DD1227A4548F507E92FF8094FB /* CTInboxController.h */; settings = {ATTRIBUTES = (Project, ); }; }; + DB8AD2ADB6618A68C677E5B1A999C88C /* CTInboxMessageActionView.m in Sources */ = {isa = PBXBuildFile; fileRef = 087697AAF6B0D4B8DB52C4C882025713 /* CTInboxMessageActionView.m */; }; + DC0081BD1C05D984DE0B61EE8F7B670B /* UIImage+ForceDecode.h in Headers */ = {isa = PBXBuildFile; fileRef = 7378BA5267CAEEB070919189B66AC060 /* UIImage+ForceDecode.h */; settings = {ATTRIBUTES = (Project, ); }; }; + DC67745F383858B61564CFFDF5BABA2B /* NSData+ImageContentType.h in Headers */ = {isa = PBXBuildFile; fileRef = 6DBAE3C48569C3865DDDED3F61868882 /* NSData+ImageContentType.h */; settings = {ATTRIBUTES = (Project, ); }; }; + DCF812A58619784A1BF7E26A4CEFFD0C /* NSDictionary+Extensions.h in Headers */ = {isa = PBXBuildFile; fileRef = B1B321FC1147168F2D234C552FDCC19F /* NSDictionary+Extensions.h */; settings = {ATTRIBUTES = (Project, ); }; }; DDAD12CF785092BF4E3E3AA4037FCC90 /* Pods-ExampleProject-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = EAC043161A0127E0690C5CA70DCA5EAC /* Pods-ExampleProject-dummy.m */; }; - DE04922F7E8833A826013CCCBB4019AF /* UIButton+WebCache.h in Headers */ = {isa = PBXBuildFile; fileRef = BDCA5A479CBEF9B892181A5D3815CFF2 /* UIButton+WebCache.h */; settings = {ATTRIBUTES = (Project, ); }; }; - DFA658B925C0032491A8A1EE57723B5F /* CTAVPlayerViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 6129CCE4074C4684269F3E03785430AB /* CTAVPlayerViewController.m */; }; - E0B2DE75A3223D3468A67C3B91C9EA0B /* SDImageCacheDefine.m in Sources */ = {isa = PBXBuildFile; fileRef = F6C7586BB8EF3BE50BBB00BB8CFF52B5 /* SDImageCacheDefine.m */; }; - E0F45872C80F66A9B44061BACF6AC5A5 /* SDAsyncBlockOperation.m in Sources */ = {isa = PBXBuildFile; fileRef = 6E48469D3F9613046510073B7C379842 /* SDAsyncBlockOperation.m */; }; - E25E0821E78073B617F7EFFD9C0174EE /* CTBaseHeaderFooterViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 1793EF13406035CB7908922D224F7C94 /* CTBaseHeaderFooterViewController.m */; }; - E26AF8E4BEF23FB2440477A0C2225780 /* CTCarouselImageView.xib in Resources */ = {isa = PBXBuildFile; fileRef = 97E3F1FCE047B474B9F785B15E37781B /* CTCarouselImageView.xib */; }; - E271605B928F26FF8918896E66C198A4 /* CTFooterViewController~iphoneport.xib in Resources */ = {isa = PBXBuildFile; fileRef = BC11B620445B5F2EDD7562B9F0D3ACCD /* CTFooterViewController~iphoneport.xib */; }; - E28C435245EC08C6D8E881F66B062A52 /* ct_default_landscape_image.png in Resources */ = {isa = PBXBuildFile; fileRef = E7851778CE612665F09AD9D2B9F2D9A3 /* ct_default_landscape_image.png */; }; - E3460E4E21A5B2DABFDEB61BA181EA56 /* CTCarouselMessageCell~land.xib in Resources */ = {isa = PBXBuildFile; fileRef = DBC32D282B692DE8B816809C00779D2E /* CTCarouselMessageCell~land.xib */; }; - E49CE449FD020D9D0D14FCA4829D3F15 /* CTCoverImageViewController~ipadland.xib in Resources */ = {isa = PBXBuildFile; fileRef = F67B84360300584D6F809958C1B9A141 /* CTCoverImageViewController~ipadland.xib */; }; - E5B7B09B9B14CEDF89955F83CF5783B4 /* SDWebImageDownloaderRequestModifier.m in Sources */ = {isa = PBXBuildFile; fileRef = DB8D32DDEF5169BDA55A561A2652A25D /* SDWebImageDownloaderRequestModifier.m */; }; - E6251C1F7741F9E3B4C0BEF3729F8CE7 /* CTInAppHTMLViewController.h in Headers */ = {isa = PBXBuildFile; fileRef = 75B3CFC38824ABBC58BA8308B04C90A3 /* CTInAppHTMLViewController.h */; settings = {ATTRIBUTES = (Project, ); }; }; - E625D1715493E43DFC0217C324EB1042 /* ic_pause@3x.png in Resources */ = {isa = PBXBuildFile; fileRef = 1DE1ABA4124FC8B38FD6730F4AEF075E /* ic_pause@3x.png */; }; - E62620D70F2D5F7C21235310742AC057 /* UIImageView+WebCache.m in Sources */ = {isa = PBXBuildFile; fileRef = 9C48F24B861E6453ADBED947235E486A /* UIImageView+WebCache.m */; }; - E69F383946A40DF3AF6E22BE1D73CC6C /* CTMessageMO+CoreDataProperties.h in Headers */ = {isa = PBXBuildFile; fileRef = 3CB79CE2027946922B384A82C109AC70 /* CTMessageMO+CoreDataProperties.h */; settings = {ATTRIBUTES = (Project, ); }; }; - E6B36C3465CE25372DB14A5EB0B1DC6A /* CTCoverViewController~ipad.xib in Resources */ = {isa = PBXBuildFile; fileRef = 365B2A2A19C53FD0DA42634DE2844C25 /* CTCoverViewController~ipad.xib */; }; - E7D6A26B2ED8C87BD37A0862C92F5448 /* CTHalfInterstitialViewController.h in Headers */ = {isa = PBXBuildFile; fileRef = E082868493C6525D9DED98D66B6B617C /* CTHalfInterstitialViewController.h */; settings = {ATTRIBUTES = (Project, ); }; }; - EA34B8A447C233839A392ACB5B621E23 /* ic_play@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 06A612B3DC0FBDE4A09916E453DC2911 /* ic_play@2x.png */; }; - EAB68564694A5D9F34E8FE92CBEF54A3 /* SDmetamacros.h in Headers */ = {isa = PBXBuildFile; fileRef = A296FFEC70040B26528114F1BBC673F9 /* SDmetamacros.h */; settings = {ATTRIBUTES = (Project, ); }; }; - EC4349F388AA240DAB6F1E53854C81B3 /* CleverTap+DisplayUnit.h in Headers */ = {isa = PBXBuildFile; fileRef = 615FBAC201C97BB559D8410362D37336 /* CleverTap+DisplayUnit.h */; settings = {ATTRIBUTES = (Project, ); }; }; - EC89D097492D463517121FC42DB063CD /* CTProfileBuilder.m in Sources */ = {isa = PBXBuildFile; fileRef = 25A554939917370879F458EEA747A354 /* CTProfileBuilder.m */; }; - EC8DA264C83FE4635DF8D05ECBDDF56B /* CTCoverImageViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = A73649EFF82580D38E3F79F61D4F6870 /* CTCoverImageViewController.m */; }; - ECD517F0447F8039B27F44F236B78060 /* SDImageIOAnimatedCoderInternal.h in Headers */ = {isa = PBXBuildFile; fileRef = 7C087878E088FE09B94BFCFB8E06540B /* SDImageIOAnimatedCoderInternal.h */; settings = {ATTRIBUTES = (Project, ); }; }; - EE5285664B91E8AE7C819878B0E89964 /* SDAnimatedImage.h in Headers */ = {isa = PBXBuildFile; fileRef = F8F21E1F65344857B4DDF90086E7FF86 /* SDAnimatedImage.h */; settings = {ATTRIBUTES = (Project, ); }; }; - EE552CE31323D37E06EBAB41434E2FE4 /* UIImage+MultiFormat.m in Sources */ = {isa = PBXBuildFile; fileRef = 033BD17E6BB04A6B7C86D7FDDE7A8F3E /* UIImage+MultiFormat.m */; }; - EE62227393F0EC1078858B6A606CD89E /* CTFeatureFlagsController.h in Headers */ = {isa = PBXBuildFile; fileRef = CC702A7E27F5806B3298D5C0A8B603AD /* CTFeatureFlagsController.h */; settings = {ATTRIBUTES = (Project, ); }; }; - EE8B017FE8C8EF34FC6A5E511CA6CB31 /* UIButton+WebCache.m in Sources */ = {isa = PBXBuildFile; fileRef = 3EE98578BF7AE670C9CCE5F2A3031E6C /* UIButton+WebCache.m */; }; - EE9A250E34C0F78D11650E0673BFA26E /* SDImageCoderHelper.h in Headers */ = {isa = PBXBuildFile; fileRef = 276E13A14ABF3CCD0E8EE8FAB928CCFB /* SDImageCoderHelper.h */; settings = {ATTRIBUTES = (Project, ); }; }; - EEA69CB4827DA9EE565C2EEF76FF27FF /* SDAnimatedImageRep.h in Headers */ = {isa = PBXBuildFile; fileRef = E1060D767592EFFBE89138EF9D81B83A /* SDAnimatedImageRep.h */; settings = {ATTRIBUTES = (Project, ); }; }; - EED1681DF2F8B860C4A5764AB2DB6A99 /* SDImageAWebPCoder.h in Headers */ = {isa = PBXBuildFile; fileRef = 2C3A77652661EB8782FBB115D20F728D /* SDImageAWebPCoder.h */; settings = {ATTRIBUTES = (Project, ); }; }; - EEDB6DC7E3B72BD1988D1C6886CFB85C /* CTLocalDataStore.h in Headers */ = {isa = PBXBuildFile; fileRef = FA78454274A9CBEC1AD24CECBD3329D8 /* CTLocalDataStore.h */; settings = {ATTRIBUTES = (Project, ); }; }; - EF1C89A06EA9DFDBC5074D04765B68B9 /* SDAnimatedImageView+WebCache.h in Headers */ = {isa = PBXBuildFile; fileRef = 595DEA2D8B6FC68402BAD6DE0A0D80E8 /* SDAnimatedImageView+WebCache.h */; settings = {ATTRIBUTES = (Project, ); }; }; - EF9303649BADED9A81EC71BBE3309055 /* CTLogger.h in Headers */ = {isa = PBXBuildFile; fileRef = A067903B414F581D6FF39779F05D6E36 /* CTLogger.h */; settings = {ATTRIBUTES = (Project, ); }; }; - F00ADE045B9F3D266EC8381C5F245A79 /* CTLoginInfoProvider.h in Headers */ = {isa = PBXBuildFile; fileRef = 66C5D9D96462BEF0B3A79581DBC220E1 /* CTLoginInfoProvider.h */; settings = {ATTRIBUTES = (Project, ); }; }; - F2177395C320C718DA537EB4708F0628 /* SDWebImage-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 978762EA9EB02FDC6F4A9E3B2A6C378E /* SDWebImage-dummy.m */; }; - F2864E30EDEBB6B8680B32B4BDCAA9AE /* SDWebImageDownloaderResponseModifier.h in Headers */ = {isa = PBXBuildFile; fileRef = 201377F74FD421E0D078F83614DC2290 /* SDWebImageDownloaderResponseModifier.h */; settings = {ATTRIBUTES = (Project, ); }; }; - F3C081ABD6E7FD78F32CD012FAA9626F /* SDDeviceHelper.m in Sources */ = {isa = PBXBuildFile; fileRef = 677EAC72DE72381FA70EE618BB368813 /* SDDeviceHelper.m */; }; - F3C0EE0D4710EB2B079BE91E1CF0E758 /* CTImageInAppViewController.h in Headers */ = {isa = PBXBuildFile; fileRef = 13840C00464674B4D0D8F62C4B58931D /* CTImageInAppViewController.h */; settings = {ATTRIBUTES = (Project, ); }; }; - F40499F8B292281F2DBBC341529CF265 /* CTUIUtils.h in Headers */ = {isa = PBXBuildFile; fileRef = BC21AF264405254C0FD43A3FB3CEA59E /* CTUIUtils.h */; settings = {ATTRIBUTES = (Project, ); }; }; - F455EBA0B074D9D7A7A52D650BC6DCC7 /* NSImage+Compatibility.h in Headers */ = {isa = PBXBuildFile; fileRef = 4E24FB26B59AFFBE5A6D7903FB586762 /* NSImage+Compatibility.h */; settings = {ATTRIBUTES = (Project, ); }; }; - F540CB788AB09FC569F0B20F7CD08CD5 /* SDWebImageOptionsProcessor.h in Headers */ = {isa = PBXBuildFile; fileRef = 5603437C2A98B847A4C1473FFDE76873 /* SDWebImageOptionsProcessor.h */; settings = {ATTRIBUTES = (Project, ); }; }; - F56A5F29EBA58A109DF8C1219CD7CB92 /* SDFileAttributeHelper.m in Sources */ = {isa = PBXBuildFile; fileRef = 3C078D43EF7C4DBACEB842400EA730F2 /* SDFileAttributeHelper.m */; }; - F7BC47B34713D3B3C8F2FAEC1A553DBD /* CTDismissButton.m in Sources */ = {isa = PBXBuildFile; fileRef = DF3B8CF15CE29D891A2D268AD9F71535 /* CTDismissButton.m */; }; - F7C8C293D1262379B64ABCCB0F3D6D1B /* SDGraphicsImageRenderer.h in Headers */ = {isa = PBXBuildFile; fileRef = B85CE196B1296602AA96E529922802AF /* SDGraphicsImageRenderer.h */; settings = {ATTRIBUTES = (Project, ); }; }; - F877E00BBBF9CB336DE8582458675070 /* SDWeakProxy.m in Sources */ = {isa = PBXBuildFile; fileRef = DE99AB43A5D54C7057634AB35C1AAF56 /* SDWeakProxy.m */; }; - F8B2588DF313AC34535E4B2C8EE23D18 /* CTInboxController.h in Headers */ = {isa = PBXBuildFile; fileRef = 687789D2ADA5C9C64F30310F8D40F493 /* CTInboxController.h */; settings = {ATTRIBUTES = (Project, ); }; }; - F8D0E87FD8560892DE5051384B5DC5A1 /* CTCoverImageViewController~iphoneland.xib in Resources */ = {isa = PBXBuildFile; fileRef = 50B9320078941BA8E9A69BE89CF895D1 /* CTCoverImageViewController~iphoneland.xib */; }; - F979D1BCF2DE46B536C6DD7A4B0261BC /* CTLegacyIdentityRepo.m in Sources */ = {isa = PBXBuildFile; fileRef = DDB0E517F0C66B8396AFBB1552DB2B10 /* CTLegacyIdentityRepo.m */; }; - F984A29339A850A46F66B1D021B22EC3 /* CTDeviceInfo.h in Headers */ = {isa = PBXBuildFile; fileRef = FEE6DB459E0B2A1C4B8BB2937E38554C /* CTDeviceInfo.h */; settings = {ATTRIBUTES = (Project, ); }; }; - FA5B35DAE054CF9EBBDED47793BDC0F9 /* SDImageCodersManager.h in Headers */ = {isa = PBXBuildFile; fileRef = 2764DB09501BF607C50C960B9AAC2BA2 /* SDImageCodersManager.h */; settings = {ATTRIBUTES = (Project, ); }; }; - FAFA50E44578B9AEDA80876553B21742 /* ct_volume_on.png in Resources */ = {isa = PBXBuildFile; fileRef = 9BBC3F495C6E7F4FF85301A22CC95FE7 /* ct_volume_on.png */; }; - FB5D8DD484646F46D4CA2A2DE24CC36C /* UIView+WebCache.m in Sources */ = {isa = PBXBuildFile; fileRef = 88DF7715A5FFF427F7B16A6D4B9C7383 /* UIView+WebCache.m */; }; - FD011254C4F5B0E14DC2636143FE7CA9 /* CTInboxController.m in Sources */ = {isa = PBXBuildFile; fileRef = 42FA5F8BA8699D1FD664A4BC847851C9 /* CTInboxController.m */; }; - FD14B03FD8EEB9A8EA0ECC14C0ACCDF2 /* SDAnimatedImageRep.m in Sources */ = {isa = PBXBuildFile; fileRef = 1FC633F22C334C8A987C40E4C26453B7 /* SDAnimatedImageRep.m */; }; - FDA9AE77C80EA1A6FBBC541653BD131D /* CTSwizzle.m in Sources */ = {isa = PBXBuildFile; fileRef = E7D1CB2FE64A8567237BCC54BD448FDB /* CTSwizzle.m */; }; - FE4F52007F68746CCF6C91A198D0B157 /* SDWebImageOperation.m in Sources */ = {isa = PBXBuildFile; fileRef = 4A4B859055BF3189D4047D9299187667 /* SDWebImageOperation.m */; }; - FEF582F895624BCD69B43D03FF7CB66E /* CTValidator.m in Sources */ = {isa = PBXBuildFile; fileRef = F114C4C845E747C3BCF66320786C224E /* CTValidator.m */; }; + DE2FD0D6650AFE6EF392EF4CDAC888F1 /* CleverTapInstanceConfigPrivate.h in Headers */ = {isa = PBXBuildFile; fileRef = 61B3ED5E2F671148F4B209D044672C81 /* CleverTapInstanceConfigPrivate.h */; settings = {ATTRIBUTES = (Project, ); }; }; + DED73BA52C961AA64B50F8E9C1939CBB /* CTHalfInterstitialImageViewController~ipadland.xib in Resources */ = {isa = PBXBuildFile; fileRef = 066E3D76D48EB8E67689D966B62B6E7C /* CTHalfInterstitialImageViewController~ipadland.xib */; }; + DF48FA7A6C5CD0BF647AF45A35A3C3C5 /* CleverTapURLDelegate.h in Headers */ = {isa = PBXBuildFile; fileRef = 14E7CF52089CEF3EE9BEEF11CC107111 /* CleverTapURLDelegate.h */; settings = {ATTRIBUTES = (Project, ); }; }; + DF8E1CC3389C2096E6D0EBC55F9A8090 /* CTLegacyIdentityRepo.m in Sources */ = {isa = PBXBuildFile; fileRef = C6757DC6B82EF58DFF4CDFF8AF5DA9BA /* CTLegacyIdentityRepo.m */; }; + E013CFAA886F3B46AA2399993250C69A /* CTInterstitialViewController.h in Headers */ = {isa = PBXBuildFile; fileRef = 4F6F448E033D207C0B5A914F8F7D834F /* CTInterstitialViewController.h */; settings = {ATTRIBUTES = (Project, ); }; }; + E0359EDB819DC2F93941BF25F459B5E9 /* CTVideoThumbnailGenerator.m in Sources */ = {isa = PBXBuildFile; fileRef = D996468B3DA9D6181BE7C3FF8FD55F53 /* CTVideoThumbnailGenerator.m */; }; + E069A28587B4A9BF0B192E82DBF16252 /* SDMemoryCache.h in Headers */ = {isa = PBXBuildFile; fileRef = 425B49983F8E78C240B1EFC28FD67E27 /* SDMemoryCache.h */; settings = {ATTRIBUTES = (Project, ); }; }; + E06C5613374063CC3E4D3E6129A8DD43 /* ct_default_portrait_image.png in Resources */ = {isa = PBXBuildFile; fileRef = 42D5F27B93C393ED561D183ADDC802E3 /* ct_default_portrait_image.png */; }; + E0E7F8B6D98A7A9C5AEB9F9BFB0E49D8 /* NSImage+Compatibility.h in Headers */ = {isa = PBXBuildFile; fileRef = 6FD6F4BF66E533E9218C46D90A16A088 /* NSImage+Compatibility.h */; settings = {ATTRIBUTES = (Project, ); }; }; + E1C741CFD5A606101B9B488155CC25CF /* SDImageCodersManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 6F0238786F75BE955F1873B0229B4835 /* SDImageCodersManager.m */; }; + E1D6D80DC8424D3A48E8223732A3CCB0 /* SDWebImagePrefetcher.m in Sources */ = {isa = PBXBuildFile; fileRef = 9B91ABC4FE767EF9B29524FE05FE3B05 /* SDWebImagePrefetcher.m */; }; + E222B4DFC8B19F98E5BEDDE0482CFFAE /* CTCarouselMessageCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 85C2AC280BB3BBA0A7099C7445ED2595 /* CTCarouselMessageCell.m */; }; + E2A6E8C8E9A98358C9840956F28F1FAD /* CleverTapInboxViewControllerPrivate.h in Headers */ = {isa = PBXBuildFile; fileRef = 966D64D7B66169014F8898D7F50D10DA /* CleverTapInboxViewControllerPrivate.h */; settings = {ATTRIBUTES = (Project, ); }; }; + E2AA528A6FA010CDB77A141AE8E35A9A /* CTLocalInApp.h in Headers */ = {isa = PBXBuildFile; fileRef = E1CF7F5F94D918FB697889AB41DE050C /* CTLocalInApp.h */; settings = {ATTRIBUTES = (Project, ); }; }; + E2C1345CC2929503C59B535E97F2F8FC /* SDAssociatedObject.m in Sources */ = {isa = PBXBuildFile; fileRef = 6F258962D6F652EAC9445860BACB57B7 /* SDAssociatedObject.m */; }; + E3155A925477FCF6AF7387EC671B0CA6 /* ct_volume_on.png in Resources */ = {isa = PBXBuildFile; fileRef = 08B5A743D439D09526196C2FCE48E865 /* ct_volume_on.png */; }; + E39235F3F1F9DFBD26CCD4544B91BD48 /* CTFlexibleIdentityRepo.h in Headers */ = {isa = PBXBuildFile; fileRef = 9443631DDD8A059339660AB9FEA1C118 /* CTFlexibleIdentityRepo.h */; settings = {ATTRIBUTES = (Project, ); }; }; + E41534761B02F107F25508BC893A6982 /* CTFooterViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 4B8FCB2F86FCE12E98D2C33044F83CAD /* CTFooterViewController.m */; }; + E4DDEA1AF0257E8D7B44EE9E88F86C5C /* SDImageAssetManager.m in Sources */ = {isa = PBXBuildFile; fileRef = AE4DED403729CEB9D785359DECA70962 /* SDImageAssetManager.m */; }; + E56A30043DC367B1ADEF7BFB9A90E86C /* CTLogger.m in Sources */ = {isa = PBXBuildFile; fileRef = FFEF3FC39B711E2848C8D727E441070A /* CTLogger.m */; }; + E5C24F35DBDD8E55AD712BCC98CF3838 /* NSBezierPath+SDRoundedCorners.m in Sources */ = {isa = PBXBuildFile; fileRef = 8F960235F3FB5DFAA27E4480B1EEA073 /* NSBezierPath+SDRoundedCorners.m */; }; + E5D25BF964176E3A889CD95B71AAAA22 /* CleverTapDisplayUnit.m in Sources */ = {isa = PBXBuildFile; fileRef = 4805ADA4EFD933AF935333AD27026F66 /* CleverTapDisplayUnit.m */; }; + E600955FD8449DE34B4378675474AA65 /* ic_play@3x.png in Resources */ = {isa = PBXBuildFile; fileRef = 8B3743F53459AA3B740D28D8A8E8AFC9 /* ic_play@3x.png */; }; + E64A99FA30036977964E0C53F39EEE51 /* CTUserMO+CoreDataProperties.m in Sources */ = {isa = PBXBuildFile; fileRef = E3A2F23654A3C2CD98DFB07D7588EBFE /* CTUserMO+CoreDataProperties.m */; }; + E669D73AA2B36D232CA4315031BE8A6E /* CTLogger.h in Headers */ = {isa = PBXBuildFile; fileRef = 1D7E735946579028399ADA1E9DAE22B2 /* CTLogger.h */; settings = {ATTRIBUTES = (Project, ); }; }; + E675AF5BB17A8B39EB210EC168B43D6F /* SDWebImageDownloaderRequestModifier.m in Sources */ = {isa = PBXBuildFile; fileRef = A3B755830D786D72BBDE8DB5E6B2D97E /* SDWebImageDownloaderRequestModifier.m */; }; + E6A74A81B29AC364ED9F07FB1345AAA6 /* CleverTapInboxMessageContent.m in Sources */ = {isa = PBXBuildFile; fileRef = 36B44ED1B2078097B1E43BA6AF848623 /* CleverTapInboxMessageContent.m */; }; + E73B4C8BC090976E226F30641D2765EF /* CTVarCache.h in Headers */ = {isa = PBXBuildFile; fileRef = 1CD6B8B51F20248A21C4E51CB16EFC84 /* CTVarCache.h */; settings = {ATTRIBUTES = (Project, ); }; }; + E8C1CA5EDECE5A481B088E91682A770A /* CTProductConfigController.h in Headers */ = {isa = PBXBuildFile; fileRef = AA0089F8E773D817B5D8800B77B7D580 /* CTProductConfigController.h */; settings = {ATTRIBUTES = (Project, ); }; }; + EA4387C372A3F49C1B98B48FB9925681 /* UIButton+WebCache.h in Headers */ = {isa = PBXBuildFile; fileRef = 60EDD094FFF87819FBFBF49862C158F2 /* UIButton+WebCache.h */; settings = {ATTRIBUTES = (Project, ); }; }; + EC5B2DB0279B362B08145A11566E84EA /* SDImageFramePool.h in Headers */ = {isa = PBXBuildFile; fileRef = 063991F4AF198D65CBD2BB1C1BB704F4 /* SDImageFramePool.h */; settings = {ATTRIBUTES = (Project, ); }; }; + EC7C9B9733155C8055210CEEC8AEEAAF /* CleverTapJSInterface.m in Sources */ = {isa = PBXBuildFile; fileRef = 0295F8FF9B3B7B18E094424ABB7E69E2 /* CleverTapJSInterface.m */; }; + ED76DF67B96EE905579A4FCD017B7D91 /* CleverTap+Inbox.h in Headers */ = {isa = PBXBuildFile; fileRef = 3F8C86FC239374BB7616CDE3817B0B91 /* CleverTap+Inbox.h */; settings = {ATTRIBUTES = (Project, ); }; }; + EE6EACC46F7891CC8958CC29D177B240 /* CTCarouselImageMessageCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 5C6D076D530B0AC88BB1B995ADE8214D /* CTCarouselImageMessageCell.m */; }; + EE84B43665C587A7D5E0B9E57F6D9AE1 /* CTFlexibleIdentityRepo.m in Sources */ = {isa = PBXBuildFile; fileRef = 8AE9EEF963884F0F8D15FBFC7EEDEF1D /* CTFlexibleIdentityRepo.m */; }; + EEC445B96AA258E0B92AD02D12F33E2B /* CleverTap+SCDomain.h in Headers */ = {isa = PBXBuildFile; fileRef = 8E7A34655DECA81F9433460ED57974CF /* CleverTap+SCDomain.h */; settings = {ATTRIBUTES = (Project, ); }; }; + EF9A6678FE66400B84FC3DF29582ADC3 /* CTHalfInterstitialImageViewController~iphoneland.xib in Resources */ = {isa = PBXBuildFile; fileRef = AA6660AAEBCAF9D8645A2FC707EE87FA /* CTHalfInterstitialImageViewController~iphoneland.xib */; }; + F058BBC823E1938010F421584E138A23 /* UIImage+Transform.h in Headers */ = {isa = PBXBuildFile; fileRef = 0FE7DA7AC55C09B46CCBD5219EB43E70 /* UIImage+Transform.h */; settings = {ATTRIBUTES = (Project, ); }; }; + F1C373A0AECE21C5F89F22C1D8A2E582 /* SDWebImagePrefetcher.h in Headers */ = {isa = PBXBuildFile; fileRef = 82AAAB32EFF03DF50DE0F3BDE9E08B77 /* SDWebImagePrefetcher.h */; settings = {ATTRIBUTES = (Project, ); }; }; + F3C26AE7C6B4D9432FD13ECFDEDB21BB /* CTInboxIconMessageCell~port.xib in Resources */ = {isa = PBXBuildFile; fileRef = AD786A5A50AD9691BC5833F0FB72D171 /* CTInboxIconMessageCell~port.xib */; }; + F663B4E075E7EAF64C9B6888FC56CB3B /* CTBaseHeaderFooterViewControllerPrivate.h in Headers */ = {isa = PBXBuildFile; fileRef = 5706ED3C925D81E1BB354639B6BE0324 /* CTBaseHeaderFooterViewControllerPrivate.h */; settings = {ATTRIBUTES = (Project, ); }; }; + F6C4ED97DF1B6373417FF22877A2EB49 /* SDCallbackQueue.m in Sources */ = {isa = PBXBuildFile; fileRef = 899332218ABE7C9D64AEADC9C7F09D8B /* SDCallbackQueue.m */; }; + F6CDE491C3AC21E01D2994A5060CEA4B /* NSBezierPath+SDRoundedCorners.h in Headers */ = {isa = PBXBuildFile; fileRef = FF79524D110999253A4D7D3C3A21FE92 /* NSBezierPath+SDRoundedCorners.h */; settings = {ATTRIBUTES = (Project, ); }; }; + F7813A192E54C146609290CB8C85887C /* CTValidationResultStack.m in Sources */ = {isa = PBXBuildFile; fileRef = 9D365959CFBAC3B28AA36A62B12732A5 /* CTValidationResultStack.m */; }; + F81D9791487AE3AE4E5A1E451931D85F /* CTInboxUtils.h in Headers */ = {isa = PBXBuildFile; fileRef = B09F4F4A7C6E3636869E687C31D1953A /* CTInboxUtils.h */; settings = {ATTRIBUTES = (Project, ); }; }; + F86885445C3E89124D8063595658A414 /* CTRequestSender.m in Sources */ = {isa = PBXBuildFile; fileRef = 00E9430F203DCC56F1B6D7DC59C4EFA5 /* CTRequestSender.m */; }; + F8ABF4A4D106037955D3B507A8F7649F /* CleverTapConfigValue.m in Sources */ = {isa = PBXBuildFile; fileRef = 815017DE486E64617014A132A508D88A /* CleverTapConfigValue.m */; }; + F96FAF823E8AE56110C6A6FF42FFF63D /* UIView+WebCacheOperation.m in Sources */ = {isa = PBXBuildFile; fileRef = 2864CE6DB619F350FFC82A4F3DCB82DC /* UIView+WebCacheOperation.m */; }; + FADA72DF5793702B1801FA3C2407CE7F /* CTInAppDisplayViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 8A45FF12EC2F124EEDC357886E36B47C /* CTInAppDisplayViewController.m */; }; + FC60003C5E6663FE1619C0A36E765BFC /* SDWebImageIndicator.m in Sources */ = {isa = PBXBuildFile; fileRef = B2D99040AE6765218BD146A3AC55D4B9 /* SDWebImageIndicator.m */; }; + FD496D6A310888B03BBB0E2ACBECF063 /* SDImageGIFCoder.m in Sources */ = {isa = PBXBuildFile; fileRef = DD6B433616E53A15A97E841EC4A96309 /* SDImageGIFCoder.m */; }; + FE88BBEF4D42D76E7EBA9CEC1DD4087B /* SDInternalMacros.h in Headers */ = {isa = PBXBuildFile; fileRef = 1CECD3EC3D75850660B3CDCDEDB848B5 /* SDInternalMacros.h */; settings = {ATTRIBUTES = (Project, ); }; }; + FED1D16AA345A5F0949F42EBD38C0051 /* CTCarouselMessageCell.h in Headers */ = {isa = PBXBuildFile; fileRef = EAFE8B9444318520DC477422A5CBB09F /* CTCarouselMessageCell.h */; settings = {ATTRIBUTES = (Project, ); }; }; + FF7ACEFFC7043EFB6AD870DDDEB630F1 /* CTInAppUtils.h in Headers */ = {isa = PBXBuildFile; fileRef = E9E25B9B521E3810217317B4C7B133A5 /* CTInAppUtils.h */; settings = {ATTRIBUTES = (Project, ); }; }; + FF956A5272ABEB4FFD8E3B6E89553621 /* UIImage+ForceDecode.m in Sources */ = {isa = PBXBuildFile; fileRef = 84CF436789724132021361D5B790596C /* UIImage+ForceDecode.m */; }; + FFB4CD24B46B3303E8A5A75DAE4F0335 /* ContentMerger.h in Headers */ = {isa = PBXBuildFile; fileRef = 4EE6FD4305EB45586703A25949DEC14D /* ContentMerger.h */; settings = {ATTRIBUTES = (Project, ); }; }; + FFB4F122FD328CDFEDB623C98D8476B0 /* CTInboxIconMessageCell.m in Sources */ = {isa = PBXBuildFile; fileRef = E2A69C83C1935452CE8538201C1D6CBB /* CTInboxIconMessageCell.m */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ - 3162A30A830509A1824E59AB504789C6 /* PBXContainerItemProxy */ = { + 0134C881EECAB27587655E87AA33779C /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */; proxyType = 1; remoteGlobalIDString = 3847153A6E5EEFB86565BA840768F429; remoteInfo = SDWebImage; }; - 556F6957C401B8584B522639A3E11426 /* PBXContainerItemProxy */ = { + 128EF83D6D0F4725E649106671C45126 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */; proxyType = 1; - remoteGlobalIDString = E12536816B6C31D7AF55D161F6F97141; - remoteInfo = "CleverTap-iOS-SDK"; + remoteGlobalIDString = 3BDDCDFCA8633FC28798031462AD1410; + remoteInfo = "CleverTap-iOS-SDK-CleverTapSDK"; }; - A774AF7EC58571CC1DC711CD9333DD09 /* PBXContainerItemProxy */ = { + 3252185819F09CB6C9FDBB85A876A847 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */; proxyType = 1; - remoteGlobalIDString = 3847153A6E5EEFB86565BA840768F429; - remoteInfo = SDWebImage; + remoteGlobalIDString = E12536816B6C31D7AF55D161F6F97141; + remoteInfo = "CleverTap-iOS-SDK"; }; - BBB6BC61BB43F40A9EDA6EDA744E0B30 /* PBXContainerItemProxy */ = { + 62BB6D192270EF6CC714C6E9C3AEFC2B /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */; proxyType = 1; - remoteGlobalIDString = 3BDDCDFCA8633FC28798031462AD1410; - remoteInfo = "CleverTap-iOS-SDK-CleverTapSDK"; + remoteGlobalIDString = 3847153A6E5EEFB86565BA840768F429; + remoteInfo = SDWebImage; }; /* End PBXContainerItemProxy section */ /* Begin PBXFileReference section */ - 001CD11C6DBA31CC5C6C17DF1E598C2F /* CTFooterViewController~iphoneland.xib */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = file.xib; name = "CTFooterViewController~iphoneland.xib"; path = "CleverTapSDK/InApps/resources/CTFooterViewController~iphoneland.xib"; sourceTree = ""; }; - 00977057B0A51B848086499302224B72 /* CTInAppFCManager.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = CTInAppFCManager.m; path = CleverTapSDK/CTInAppFCManager.m; sourceTree = ""; }; - 015702D9209383ABECC2F014EF176A39 /* SDWebImageManager.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDWebImageManager.h; path = SDWebImage/Core/SDWebImageManager.h; sourceTree = ""; }; - 024B3B7633A7E77942EAC77961C330B3 /* NSImage+Compatibility.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "NSImage+Compatibility.m"; path = "SDWebImage/Core/NSImage+Compatibility.m"; sourceTree = ""; }; - 0289C1CE681412D099FD995B244D9DAB /* SDImageFrame.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDImageFrame.m; path = SDWebImage/Core/SDImageFrame.m; sourceTree = ""; }; - 02AE8425368F9EAF709FB94566FB00DA /* UIImageView+HighlightedWebCache.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIImageView+HighlightedWebCache.m"; path = "SDWebImage/Core/UIImageView+HighlightedWebCache.m"; sourceTree = ""; }; - 033174CF8C10356EA929AA2A2F63A470 /* CleverTapTrackedViewController.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = CleverTapTrackedViewController.m; path = CleverTapSDK/CleverTapTrackedViewController.m; sourceTree = ""; }; - 033BD17E6BB04A6B7C86D7FDDE7A8F3E /* UIImage+MultiFormat.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIImage+MultiFormat.m"; path = "SDWebImage/Core/UIImage+MultiFormat.m"; sourceTree = ""; }; - 0460AEA43738FC0A6BC7B925687EC2DA /* CTCarouselImageView.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = CTCarouselImageView.h; path = CleverTapSDK/Inbox/views/CTCarouselImageView.h; sourceTree = ""; }; - 04D4ECDCFD33424F162907BC3F828D98 /* UIImage+GIF.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIImage+GIF.h"; path = "SDWebImage/Core/UIImage+GIF.h"; sourceTree = ""; }; - 04FD1108A33776E813B0A3FAE12269C8 /* SDWebImageDownloaderConfig.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDWebImageDownloaderConfig.h; path = SDWebImage/Core/SDWebImageDownloaderConfig.h; sourceTree = ""; }; - 06527721DFBDF9C95C1ACE1912F12F3C /* CTDisplayUnitController.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = CTDisplayUnitController.h; path = CleverTapSDK/DisplayUnit/controllers/CTDisplayUnitController.h; sourceTree = ""; }; - 066F4570FFF1C2F268D37EAC046FAE46 /* SDImageGIFCoder.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDImageGIFCoder.m; path = SDWebImage/Core/SDImageGIFCoder.m; sourceTree = ""; }; - 06A612B3DC0FBDE4A09916E453DC2911 /* ic_play@2x.png */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = image.png; name = "ic_play@2x.png"; path = "CleverTapSDK/Inbox/resources/ic_play@2x.png"; sourceTree = ""; }; - 06A72E01CEE4935C082F4A84A7450C7F /* CTSwipeView.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = CTSwipeView.m; path = CleverTapSDK/Inbox/views/CTSwipeView.m; sourceTree = ""; }; - 06BDA0745D108411EE3D5412EEC1B5D8 /* SDImageCacheConfig.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDImageCacheConfig.h; path = SDWebImage/Core/SDImageCacheConfig.h; sourceTree = ""; }; - 07A8CF7AA77FD3734DA065FAB66BF1E8 /* CTHalfInterstitialImageViewController~iphoneport.xib */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = file.xib; name = "CTHalfInterstitialImageViewController~iphoneport.xib"; path = "CleverTapSDK/InApps/resources/CTHalfInterstitialImageViewController~iphoneport.xib"; sourceTree = ""; }; - 0921D607B54D097A3AE18105C5E152EB /* SDImageIOAnimatedCoder.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDImageIOAnimatedCoder.h; path = SDWebImage/Core/SDImageIOAnimatedCoder.h; sourceTree = ""; }; - 0A03C4A385534A0B4EEB006812E7F6F8 /* UIImage+Metadata.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIImage+Metadata.m"; path = "SDWebImage/Core/UIImage+Metadata.m"; sourceTree = ""; }; - 0A69C6689C90631952B94B162423B6DB /* CTHeaderViewController~ipadland.xib */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = file.xib; name = "CTHeaderViewController~ipadland.xib"; path = "CleverTapSDK/InApps/resources/CTHeaderViewController~ipadland.xib"; sourceTree = ""; }; - 0AEF3B70819065A7D19945BD96049F84 /* CTFeatureFlagsController.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = CTFeatureFlagsController.m; path = CleverTapSDK/FeatureFlags/controllers/CTFeatureFlagsController.m; sourceTree = ""; }; - 0BE0A703C6059424FC07B079FDF31C41 /* CleverTapInstanceConfig.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = CleverTapInstanceConfig.h; path = CleverTapSDK/CleverTapInstanceConfig.h; sourceTree = ""; }; - 0C061BA06720B813A0EFDCAC2769DBAB /* SDAnimatedImageView.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDAnimatedImageView.h; path = SDWebImage/Core/SDAnimatedImageView.h; sourceTree = ""; }; - 0CE47ACF5C39780F7B58F6C1A8EB4763 /* CTUriHelper.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = CTUriHelper.h; path = CleverTapSDK/CTUriHelper.h; sourceTree = ""; }; - 0D3BB4A10F6FEFC7B88D4774FDC95644 /* NSBezierPath+SDRoundedCorners.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "NSBezierPath+SDRoundedCorners.h"; path = "SDWebImage/Private/NSBezierPath+SDRoundedCorners.h"; sourceTree = ""; }; - 0DB2BE441B8E9D912D6EF29A5C7CA1A0 /* CTInterstitialViewController~ipadland.xib */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = file.xib; name = "CTInterstitialViewController~ipadland.xib"; path = "CleverTapSDK/InApps/resources/CTInterstitialViewController~ipadland.xib"; sourceTree = ""; }; - 0DC37245253918181A8654CCEBC82D30 /* ct_volume_off.png */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = image.png; name = ct_volume_off.png; path = CleverTapSDK/Inbox/resources/ct_volume_off.png; sourceTree = ""; }; - 0E11A327EC315983FAA38A8A7B7E0479 /* CleverTapEventDetail.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = CleverTapEventDetail.m; path = CleverTapSDK/CleverTapEventDetail.m; sourceTree = ""; }; - 0F776E448D1B1C56F6FC0D145271F503 /* CTValidationResultStack.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = CTValidationResultStack.h; path = CleverTapSDK/CTValidationResultStack.h; sourceTree = ""; }; - 0FE078B754147AD6AA8120C7EB3FAC1F /* SDInternalMacros.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDInternalMacros.h; path = SDWebImage/Private/SDInternalMacros.h; sourceTree = ""; }; - 106D6A992CCFF8251E10EAA0AF9DE8C8 /* CleverTapInboxMessage.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = CleverTapInboxMessage.m; path = CleverTapSDK/Inbox/models/CleverTapInboxMessage.m; sourceTree = ""; }; - 10E5E949286A2B3AD8FE0C33CD56398C /* CTInterstitialViewController~iphoneport.xib */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = file.xib; name = "CTInterstitialViewController~iphoneport.xib"; path = "CleverTapSDK/InApps/resources/CTInterstitialViewController~iphoneport.xib"; sourceTree = ""; }; - 119ED479841230E7547357661F9CC740 /* CTPreferences.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = CTPreferences.h; path = CleverTapSDK/CTPreferences.h; sourceTree = ""; }; - 122A4A2A6431D70B6C28CD22CED19024 /* CTHalfInterstitialImageViewController~ipad.xib */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = file.xib; name = "CTHalfInterstitialImageViewController~ipad.xib"; path = "CleverTapSDK/InApps/resources/CTHalfInterstitialImageViewController~ipad.xib"; sourceTree = ""; }; - 1283E8174B8DBD2CA14BAA8F5B25BC68 /* SDWeakProxy.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDWeakProxy.h; path = SDWebImage/Private/SDWeakProxy.h; sourceTree = ""; }; - 12F25D87FD5A9EAA359A3BB6EECDDD81 /* SDImageAPNGCoder.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDImageAPNGCoder.h; path = SDWebImage/Core/SDImageAPNGCoder.h; sourceTree = ""; }; - 13135DDF65FF9179653F83CEFC608B57 /* CTProductConfigController.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = CTProductConfigController.m; path = CleverTapSDK/ProductConfig/controllers/CTProductConfigController.m; sourceTree = ""; }; - 13840C00464674B4D0D8F62C4B58931D /* CTImageInAppViewController.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = CTImageInAppViewController.h; path = CleverTapSDK/InApps/CTImageInAppViewController.h; sourceTree = ""; }; - 13884828E45BD240D93462184FE5DFE3 /* CTFlexibleIdentityRepo.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = CTFlexibleIdentityRepo.m; path = CleverTapSDK/CTFlexibleIdentityRepo.m; sourceTree = ""; }; - 13FB82659B37E2BDE9A8512467362D24 /* CTCarouselImageMessageCell.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = CTCarouselImageMessageCell.m; path = CleverTapSDK/Inbox/cells/CTCarouselImageMessageCell.m; sourceTree = ""; }; - 145617DEF6E1987B40FF2807C0A747B4 /* CTConstants.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = CTConstants.h; path = CleverTapSDK/CTConstants.h; sourceTree = ""; }; - 16097C7F6514F1081519CE4944E32E70 /* SDImageIOCoder.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDImageIOCoder.h; path = SDWebImage/Core/SDImageIOCoder.h; sourceTree = ""; }; - 1793EF13406035CB7908922D224F7C94 /* CTBaseHeaderFooterViewController.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = CTBaseHeaderFooterViewController.m; path = CleverTapSDK/InApps/CTBaseHeaderFooterViewController.m; sourceTree = ""; }; - 18B3469E769F028C337D592C29A46BDF /* CleverTapInstanceConfigPrivate.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = CleverTapInstanceConfigPrivate.h; path = CleverTapSDK/CleverTapInstanceConfigPrivate.h; sourceTree = ""; }; - 1904AFD42176A06DF30D894F2DE4BC13 /* CleverTap+SCDomain.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "CleverTap+SCDomain.h"; path = "CleverTapSDK/CleverTap+SCDomain.h"; sourceTree = ""; }; - 1A05B46DC2F050F6987B79997328D216 /* CTCoverImageViewController~iphoneport.xib */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = file.xib; name = "CTCoverImageViewController~iphoneport.xib"; path = "CleverTapSDK/InApps/resources/CTCoverImageViewController~iphoneport.xib"; sourceTree = ""; }; - 1A7C0ABEBF9B60257002286A5A4F9EFA /* CTEventBuilder.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = CTEventBuilder.m; path = CleverTapSDK/CTEventBuilder.m; sourceTree = ""; }; - 1ACF4B9D4BDA654D22EC52C4AAB4C574 /* SDAnimatedImage.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDAnimatedImage.m; path = SDWebImage/Core/SDAnimatedImage.m; sourceTree = ""; }; - 1B69E867C28CB2003F341BABE4F09747 /* CTUriHelper.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = CTUriHelper.m; path = CleverTapSDK/CTUriHelper.m; sourceTree = ""; }; - 1C09E0FEBAC195465D9ADE7FE7A92825 /* CTUserMO.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = CTUserMO.h; path = CleverTapSDK/Inbox/models/CTUserMO.h; sourceTree = ""; }; - 1D888DE65D42078ECEF9CE4821F85E01 /* SDWebImageError.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDWebImageError.h; path = SDWebImage/Core/SDWebImageError.h; sourceTree = ""; }; - 1DE1ABA4124FC8B38FD6730F4AEF075E /* ic_pause@3x.png */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = image.png; name = "ic_pause@3x.png"; path = "CleverTapSDK/Inbox/resources/ic_pause@3x.png"; sourceTree = ""; }; - 1DE5E75481568A2B32AE367997CFFAC7 /* SDAnimatedImagePlayer.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDAnimatedImagePlayer.h; path = SDWebImage/Core/SDAnimatedImagePlayer.h; sourceTree = ""; }; - 1ED1FAB598D03F264D52245F1AC50C10 /* CleverTapInboxViewController.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = CleverTapInboxViewController.m; path = CleverTapSDK/Inbox/controllers/CleverTapInboxViewController.m; sourceTree = ""; }; - 1FC633F22C334C8A987C40E4C26453B7 /* SDAnimatedImageRep.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDAnimatedImageRep.m; path = SDWebImage/Core/SDAnimatedImageRep.m; sourceTree = ""; }; - 201377F74FD421E0D078F83614DC2290 /* SDWebImageDownloaderResponseModifier.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDWebImageDownloaderResponseModifier.h; path = SDWebImage/Core/SDWebImageDownloaderResponseModifier.h; sourceTree = ""; }; - 20676949C3F408F2513D14585D050C43 /* CTCoverImageViewController.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = CTCoverImageViewController.h; path = CleverTapSDK/InApps/CTCoverImageViewController.h; sourceTree = ""; }; - 224D29D66442C01D3B2E680504619C73 /* SDImageCachesManager.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDImageCachesManager.h; path = SDWebImage/Core/SDImageCachesManager.h; sourceTree = ""; }; - 22F694128D98CA3544E4D1EE3960E02D /* CTHalfInterstitialImageViewController.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = CTHalfInterstitialImageViewController.h; path = CleverTapSDK/InApps/CTHalfInterstitialImageViewController.h; sourceTree = ""; }; - 2347F10D864FD03D80C0CF0719230162 /* CleverTap-iOS-SDK-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "CleverTap-iOS-SDK-dummy.m"; sourceTree = ""; }; - 242AB57CF992B95C1EDBD53C051B4DD2 /* CTFooterViewController.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = CTFooterViewController.m; path = CleverTapSDK/InApps/CTFooterViewController.m; sourceTree = ""; }; - 24475BB0DC666C02D5B6D5CF4B3BCF9F /* UIColor+SDHexString.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIColor+SDHexString.m"; path = "SDWebImage/Private/UIColor+SDHexString.m"; sourceTree = ""; }; - 248954A7E01024145753167DB9D2C678 /* CleverTapUTMDetail.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = CleverTapUTMDetail.m; path = CleverTapSDK/CleverTapUTMDetail.m; sourceTree = ""; }; - 25A554939917370879F458EEA747A354 /* CTProfileBuilder.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = CTProfileBuilder.m; path = CleverTapSDK/CTProfileBuilder.m; sourceTree = ""; }; - 25B6CDEE094F880F63E761DCD3CF6D72 /* CTInboxUtils.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = CTInboxUtils.h; path = CleverTapSDK/Inbox/models/CTInboxUtils.h; sourceTree = ""; }; - 25DCB73F49A70C4883484C3C0057A061 /* CTPlistInfo.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = CTPlistInfo.h; path = CleverTapSDK/CTPlistInfo.h; sourceTree = ""; }; - 2764DB09501BF607C50C960B9AAC2BA2 /* SDImageCodersManager.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDImageCodersManager.h; path = SDWebImage/Core/SDImageCodersManager.h; sourceTree = ""; }; - 276E13A14ABF3CCD0E8EE8FAB928CCFB /* SDImageCoderHelper.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDImageCoderHelper.h; path = SDWebImage/Core/SDImageCoderHelper.h; sourceTree = ""; }; - 277F88B4B092203525E7B5017AA77C07 /* UIImage+MultiFormat.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIImage+MultiFormat.h"; path = "SDWebImage/Core/UIImage+MultiFormat.h"; sourceTree = ""; }; - 27A6FF119000AC9D0EAD078858B59760 /* CleverTap+Inbox.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "CleverTap+Inbox.h"; path = "CleverTapSDK/CleverTap+Inbox.h"; sourceTree = ""; }; - 28845DE73E0CF6502B3003F57B03F862 /* CleverTap-iOS-SDK-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "CleverTap-iOS-SDK-prefix.pch"; sourceTree = ""; }; - 29C3E943E0FB635C67D74D3BE4077041 /* CTInAppDisplayViewController.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = CTInAppDisplayViewController.m; path = CleverTapSDK/CTInAppDisplayViewController.m; sourceTree = ""; }; - 2BB235C5DC09791050F33C45042CBB7A /* SDWebImageDownloaderDecryptor.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDWebImageDownloaderDecryptor.m; path = SDWebImage/Core/SDWebImageDownloaderDecryptor.m; sourceTree = ""; }; - 2C3A77652661EB8782FBB115D20F728D /* SDImageAWebPCoder.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDImageAWebPCoder.h; path = SDWebImage/Core/SDImageAWebPCoder.h; sourceTree = ""; }; - 2C73AA8A4B4F8985CC57034ABC529C52 /* CleverTapInboxMessageContent.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = CleverTapInboxMessageContent.m; path = CleverTapSDK/Inbox/models/CleverTapInboxMessageContent.m; sourceTree = ""; }; - 2E6028FB67F540BBF33EA4934AA5B0B7 /* CTConstants.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = CTConstants.m; path = CleverTapSDK/CTConstants.m; sourceTree = ""; }; + 00DCE02464D5B90FBEBC2FAEABC49E14 /* CTHalfInterstitialImageViewController.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = CTHalfInterstitialImageViewController.m; path = CleverTapSDK/InApps/CTHalfInterstitialImageViewController.m; sourceTree = ""; }; + 00E9430F203DCC56F1B6D7DC59C4EFA5 /* CTRequestSender.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = CTRequestSender.m; path = CleverTapSDK/CTRequestSender.m; sourceTree = ""; }; + 01287A09E1886F13AA0E5615466ACDD1 /* ResourceBundle-CleverTapSDK-CleverTap-iOS-SDK-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "ResourceBundle-CleverTapSDK-CleverTap-iOS-SDK-Info.plist"; sourceTree = ""; }; + 02311CE61069D208441E5B078A33FB22 /* SDWebImageDefine.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDWebImageDefine.m; path = SDWebImage/Core/SDWebImageDefine.m; sourceTree = ""; }; + 0295F8FF9B3B7B18E094424ABB7E69E2 /* CleverTapJSInterface.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = CleverTapJSInterface.m; path = CleverTapSDK/CleverTapJSInterface.m; sourceTree = ""; }; + 029DC6B5F4343D282DF5BF3646AA3460 /* SDImageCache.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDImageCache.m; path = SDWebImage/Core/SDImageCache.m; sourceTree = ""; }; + 039AA853A697C076592ACA207CE2AF79 /* SDWebImageManager.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDWebImageManager.h; path = SDWebImage/Core/SDWebImageManager.h; sourceTree = ""; }; + 042F805C908069D0280F6DF68E45D4A5 /* CTCoverViewController~iphoneport.xib */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = file.xib; name = "CTCoverViewController~iphoneport.xib"; path = "CleverTapSDK/InApps/resources/CTCoverViewController~iphoneport.xib"; sourceTree = ""; }; + 049115AFC648ED4EA10CA89F8318AB28 /* CleverTapFeatureFlags.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = CleverTapFeatureFlags.m; path = CleverTapSDK/FeatureFlags/models/CleverTapFeatureFlags.m; sourceTree = ""; }; + 04A9A894D36D94E0CCFBD33FB53D7BAC /* CTCarouselImageMessageCell.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = CTCarouselImageMessageCell.h; path = CleverTapSDK/Inbox/cells/CTCarouselImageMessageCell.h; sourceTree = ""; }; + 0515607DBF0D6B125E8BFB82F835FADF /* CTCarouselImageMessageCell~land.xib */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = file.xib; name = "CTCarouselImageMessageCell~land.xib"; path = "CleverTapSDK/Inbox/resources/CTCarouselImageMessageCell~land.xib"; sourceTree = ""; }; + 053C136B3BC99422F0649E5D9A803E1E /* SDDeviceHelper.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDDeviceHelper.h; path = SDWebImage/Private/SDDeviceHelper.h; sourceTree = ""; }; + 059FB3ED6C02F9C1C6843439DA6CC598 /* SDAssociatedObject.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDAssociatedObject.h; path = SDWebImage/Private/SDAssociatedObject.h; sourceTree = ""; }; + 063991F4AF198D65CBD2BB1C1BB704F4 /* SDImageFramePool.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDImageFramePool.h; path = SDWebImage/Private/SDImageFramePool.h; sourceTree = ""; }; + 066E3D76D48EB8E67689D966B62B6E7C /* CTHalfInterstitialImageViewController~ipadland.xib */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = file.xib; name = "CTHalfInterstitialImageViewController~ipadland.xib"; path = "CleverTapSDK/InApps/resources/CTHalfInterstitialImageViewController~ipadland.xib"; sourceTree = ""; }; + 072D3DDFA18BAD61219A856FCFB6093C /* UIImageView+WebCache.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIImageView+WebCache.h"; path = "SDWebImage/Core/UIImageView+WebCache.h"; sourceTree = ""; }; + 077D8FC4221F09FB2FF65552161F02D9 /* SDWebImageError.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDWebImageError.h; path = SDWebImage/Core/SDWebImageError.h; sourceTree = ""; }; + 07DD50F408FDA36B256D9C992D386256 /* SDAnimatedImageView.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDAnimatedImageView.h; path = SDWebImage/Core/SDAnimatedImageView.h; sourceTree = ""; }; + 087697AAF6B0D4B8DB52C4C882025713 /* CTInboxMessageActionView.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = CTInboxMessageActionView.m; path = CleverTapSDK/Inbox/views/CTInboxMessageActionView.m; sourceTree = ""; }; + 08B5A743D439D09526196C2FCE48E865 /* ct_volume_on.png */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = image.png; name = ct_volume_on.png; path = CleverTapSDK/Inbox/resources/ct_volume_on.png; sourceTree = ""; }; + 08EE07580B26497F4AB762EB97F9BE83 /* CTDomainFactory.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = CTDomainFactory.m; path = CleverTapSDK/CTDomainFactory.m; sourceTree = ""; }; + 0985F013F6DC9CD735AA7DD737F145A0 /* LeanplumCT.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = LeanplumCT.m; path = CleverTapSDK/LeanplumCT.m; sourceTree = ""; }; + 098C3FF5AE525ED63C5DD2E41B30B70D /* CTVar-Internal.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "CTVar-Internal.h"; path = "CleverTapSDK/ProductExperiences/CTVar-Internal.h"; sourceTree = ""; }; + 0A86E5FDEFE99EDC2EFECFD36BBB923A /* CTDeviceInfo.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = CTDeviceInfo.m; path = CleverTapSDK/CTDeviceInfo.m; sourceTree = ""; }; + 0AEDA5107977612DE1C70E29993551E3 /* CleverTap-iOS-SDK-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "CleverTap-iOS-SDK-dummy.m"; sourceTree = ""; }; + 0B61D1A1EB2DF262FCBA45698C1963DB /* CTInterstitialViewController~ipad.xib */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = file.xib; name = "CTInterstitialViewController~ipad.xib"; path = "CleverTapSDK/InApps/resources/CTInterstitialViewController~ipad.xib"; sourceTree = ""; }; + 0E36E9E4CD9F24867C3C2D3249CB10DD /* SDWebImageIndicator.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDWebImageIndicator.h; path = SDWebImage/Core/SDWebImageIndicator.h; sourceTree = ""; }; + 0E3DEF3A0F8263EB93C203B353DCFAC1 /* CTInterstitialImageViewController~ipadland.xib */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = file.xib; name = "CTInterstitialImageViewController~ipadland.xib"; path = "CleverTapSDK/InApps/resources/CTInterstitialImageViewController~ipadland.xib"; sourceTree = ""; }; + 0FE7DA7AC55C09B46CCBD5219EB43E70 /* UIImage+Transform.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIImage+Transform.h"; path = "SDWebImage/Core/UIImage+Transform.h"; sourceTree = ""; }; + 10DC85093C083DCA6376C8D57645F961 /* SDAnimatedImageView+WebCache.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "SDAnimatedImageView+WebCache.h"; path = "SDWebImage/Core/SDAnimatedImageView+WebCache.h"; sourceTree = ""; }; + 11CC08AA7B4BEC8E1A401D00547C817C /* ic_play@2x.png */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = image.png; name = "ic_play@2x.png"; path = "CleverTapSDK/Inbox/resources/ic_play@2x.png"; sourceTree = ""; }; + 11F46974131649F95CD8D86CCBCA43A9 /* CTUserMO.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = CTUserMO.m; path = CleverTapSDK/Inbox/models/CTUserMO.m; sourceTree = ""; }; + 146821AB7C6A3EDA3EE4F449A8DCBFC9 /* CTInboxBaseMessageCell.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = CTInboxBaseMessageCell.m; path = CleverTapSDK/Inbox/cells/CTInboxBaseMessageCell.m; sourceTree = ""; }; + 14954B163FCFE6D39F8B5008413C1938 /* CleverTapProductConfigPrivate.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = CleverTapProductConfigPrivate.h; path = CleverTapSDK/ProductConfig/models/CleverTapProductConfigPrivate.h; sourceTree = ""; }; + 14A00AD11775B0196583183CCB6514A1 /* CTFooterViewController~ipad.xib */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = file.xib; name = "CTFooterViewController~ipad.xib"; path = "CleverTapSDK/InApps/resources/CTFooterViewController~ipad.xib"; sourceTree = ""; }; + 14E7CF52089CEF3EE9BEEF11CC107111 /* CleverTapURLDelegate.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = CleverTapURLDelegate.h; path = CleverTapSDK/CleverTapURLDelegate.h; sourceTree = ""; }; + 14FEEA8125F157B2B695F2021FD28BEF /* SDWebImageDownloaderConfig.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDWebImageDownloaderConfig.m; path = SDWebImage/Core/SDWebImageDownloaderConfig.m; sourceTree = ""; }; + 151964BDD6348393DEAD244DF26EB2A3 /* CTAVPlayerViewController.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = CTAVPlayerViewController.m; path = CleverTapSDK/InApps/CTAVPlayerViewController.m; sourceTree = ""; }; + 15382C8DE76EA0E65686C1711F2FC80E /* CTInterstitialImageViewController.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = CTInterstitialImageViewController.h; path = CleverTapSDK/InApps/CTInterstitialImageViewController.h; sourceTree = ""; }; + 1633BBB7612813EFDACF1A98B5BA8C38 /* Inbox.xcdatamodel */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = wrapper.xcdatamodel; path = Inbox.xcdatamodel; sourceTree = ""; }; + 16D02024458EAB232BA12891AD0380B3 /* SDImageGIFCoder.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDImageGIFCoder.h; path = SDWebImage/Core/SDImageGIFCoder.h; sourceTree = ""; }; + 17074DB3E29934B1BD5CEAB8646E86EB /* CTFooterViewController~iphoneland.xib */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = file.xib; name = "CTFooterViewController~iphoneland.xib"; path = "CleverTapSDK/InApps/resources/CTFooterViewController~iphoneland.xib"; sourceTree = ""; }; + 178165C3620183FC34A1C61B401522E0 /* SDWebImageDownloader.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDWebImageDownloader.h; path = SDWebImage/Core/SDWebImageDownloader.h; sourceTree = ""; }; + 18A60941084FFBED607414476B58A2E7 /* ct_default_video.png */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = image.png; name = ct_default_video.png; path = CleverTapSDK/Inbox/resources/ct_default_video.png; sourceTree = ""; }; + 18AEB7DD70D4271F8C34724DFB022B9A /* SDWebImage.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = SDWebImage.release.xcconfig; sourceTree = ""; }; + 1900708E4B3E2B7CC0949AEAE224E9C4 /* SDAnimatedImageView.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDAnimatedImageView.m; path = SDWebImage/Core/SDAnimatedImageView.m; sourceTree = ""; }; + 1ADD533B9B6366DF20F5C07E77B5D95C /* UIImage+Metadata.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIImage+Metadata.h"; path = "SDWebImage/Core/UIImage+Metadata.h"; sourceTree = ""; }; + 1C23CD67F921F303A7EEE511A7100875 /* CTHalfInterstitialImageViewController.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = CTHalfInterstitialImageViewController.h; path = CleverTapSDK/InApps/CTHalfInterstitialImageViewController.h; sourceTree = ""; }; + 1C5625DBC0E0D9A718B8A5684C4133F0 /* UIImageView+HighlightedWebCache.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIImageView+HighlightedWebCache.m"; path = "SDWebImage/Core/UIImageView+HighlightedWebCache.m"; sourceTree = ""; }; + 1C89867FBC12FD83E74AB386E1799561 /* SDWebImageCacheSerializer.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDWebImageCacheSerializer.m; path = SDWebImage/Core/SDWebImageCacheSerializer.m; sourceTree = ""; }; + 1C92AAA703796848D77C8068C6ACB96A /* CTHalfInterstitialImageViewController~iphoneport.xib */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = file.xib; name = "CTHalfInterstitialImageViewController~iphoneport.xib"; path = "CleverTapSDK/InApps/resources/CTHalfInterstitialImageViewController~iphoneport.xib"; sourceTree = ""; }; + 1CD6B8B51F20248A21C4E51CB16EFC84 /* CTVarCache.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = CTVarCache.h; path = CleverTapSDK/ProductExperiences/CTVarCache.h; sourceTree = ""; }; + 1CECD3EC3D75850660B3CDCDEDB848B5 /* SDInternalMacros.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDInternalMacros.h; path = SDWebImage/Private/SDInternalMacros.h; sourceTree = ""; }; + 1D7E735946579028399ADA1E9DAE22B2 /* CTLogger.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = CTLogger.h; path = CleverTapSDK/CTLogger.h; sourceTree = ""; }; + 1DFC6E85A4210DE9B9F87084CDE2F85B /* SDImageHEICCoder.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDImageHEICCoder.m; path = SDWebImage/Core/SDImageHEICCoder.m; sourceTree = ""; }; + 1F4631150502A4420731DFDEFBAE4900 /* SDWebImageDownloaderDecryptor.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDWebImageDownloaderDecryptor.h; path = SDWebImage/Core/SDWebImageDownloaderDecryptor.h; sourceTree = ""; }; + 1F4DEF8806EBCA11F17592C36CA51BF1 /* CTVariables.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = CTVariables.h; path = CleverTapSDK/ProductExperiences/CTVariables.h; sourceTree = ""; }; + 1F840FF1C673738137F970C64980B8AD /* CTCoverViewController~ipad.xib */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = file.xib; name = "CTCoverViewController~ipad.xib"; path = "CleverTapSDK/InApps/resources/CTCoverViewController~ipad.xib"; sourceTree = ""; }; + 242B076F0ED3FE11E21D15B9D8A1460B /* SDWebImageTransitionInternal.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDWebImageTransitionInternal.h; path = SDWebImage/Private/SDWebImageTransitionInternal.h; sourceTree = ""; }; + 248C1EE517A4730DD9D44394EC6FBF42 /* CTValidationResult.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = CTValidationResult.h; path = CleverTapSDK/CTValidationResult.h; sourceTree = ""; }; + 26515B47DE93CD0684F895476CAACFEF /* SDImageCodersManager.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDImageCodersManager.h; path = SDWebImage/Core/SDImageCodersManager.h; sourceTree = ""; }; + 274B8FD25E60B1498C3FD0AC25857C7C /* CTUtils.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = CTUtils.m; path = CleverTapSDK/CTUtils.m; sourceTree = ""; }; + 27AA224BACACEDE0871836CDA0BEBD27 /* UIImageView+HighlightedWebCache.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIImageView+HighlightedWebCache.h"; path = "SDWebImage/Core/UIImageView+HighlightedWebCache.h"; sourceTree = ""; }; + 2864CE6DB619F350FFC82A4F3DCB82DC /* UIView+WebCacheOperation.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIView+WebCacheOperation.m"; path = "SDWebImage/Core/UIView+WebCacheOperation.m"; sourceTree = ""; }; + 28CB0DEC3C288C1997C84C66EFBC6A38 /* CleverTap.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = CleverTap.m; path = CleverTapSDK/CleverTap.m; sourceTree = ""; }; + 28D644879EDCC0724B9E9DCE584C27C4 /* UIImage+MemoryCacheCost.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIImage+MemoryCacheCost.m"; path = "SDWebImage/Core/UIImage+MemoryCacheCost.m"; sourceTree = ""; }; + 28F1B4CF1FF90A8F4CF9240C24EFE569 /* SDImageIOCoder.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDImageIOCoder.m; path = SDWebImage/Core/SDImageIOCoder.m; sourceTree = ""; }; + 2BA54A89FEFCD1A6AA5341DEC39DF022 /* CTInterstitialViewController~iphoneland.xib */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = file.xib; name = "CTInterstitialViewController~iphoneland.xib"; path = "CleverTapSDK/InApps/resources/CTInterstitialViewController~iphoneland.xib"; sourceTree = ""; }; + 2C02DAFB9B96E441E90EEAB2911DCD81 /* CleverTapSyncDelegate.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = CleverTapSyncDelegate.h; path = CleverTapSDK/CleverTapSyncDelegate.h; sourceTree = ""; }; + 2C9D900235DBBAFF7B0F26C81A41B383 /* CleverTapEventDetail.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = CleverTapEventDetail.h; path = CleverTapSDK/CleverTapEventDetail.h; sourceTree = ""; }; + 2DB860DA3CD1868B7D764240D70EC96F /* CTImageInAppViewController.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = CTImageInAppViewController.m; path = CleverTapSDK/InApps/CTImageInAppViewController.m; sourceTree = ""; }; + 2E09B0FC2D55EB382E67C58215EECDC6 /* CTPreferences.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = CTPreferences.m; path = CleverTapSDK/CTPreferences.m; sourceTree = ""; }; 2ECC2A9AEFA46C5B6AE69DA76B705A43 /* Pods-ExampleProject.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-ExampleProject.release.xcconfig"; sourceTree = ""; }; - 2F77FDCD5E3AC390C73F70C2410BDD5F /* CTInterstitialImageViewController~ipadland.xib */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = file.xib; name = "CTInterstitialImageViewController~ipadland.xib"; path = "CleverTapSDK/InApps/resources/CTInterstitialImageViewController~ipadland.xib"; sourceTree = ""; }; - 30112E19287E77647E2EFAC046A1F00F /* CTCarouselMessageCell.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = CTCarouselMessageCell.h; path = CleverTapSDK/Inbox/cells/CTCarouselMessageCell.h; sourceTree = ""; }; - 30393578A859C72471B61413FA794A2E /* CTAlertViewController.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = CTAlertViewController.h; path = CleverTapSDK/InApps/CTAlertViewController.h; sourceTree = ""; }; - 3044E0A40F903962407D6CE836CA25D1 /* CTUserMO+CoreDataProperties.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "CTUserMO+CoreDataProperties.m"; path = "CleverTapSDK/Inbox/models/CTUserMO+CoreDataProperties.m"; sourceTree = ""; }; - 3322B8628C6BCFDB03CE137E73F2862F /* Inbox.xcdatamodel */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = wrapper.xcdatamodel; path = Inbox.xcdatamodel; sourceTree = ""; }; - 3355083555001F5475FA0FF1F2C47ADF /* CTInterstitialViewController~iphoneland.xib */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = file.xib; name = "CTInterstitialViewController~iphoneland.xib"; path = "CleverTapSDK/InApps/resources/CTInterstitialViewController~iphoneland.xib"; sourceTree = ""; }; - 352C85867DA59C648DED2E777E3A5A07 /* SDFileAttributeHelper.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDFileAttributeHelper.h; path = SDWebImage/Private/SDFileAttributeHelper.h; sourceTree = ""; }; - 35E0E473D94991D3023A7862B658B6C3 /* CTIdentityRepoFactory.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = CTIdentityRepoFactory.m; path = CleverTapSDK/CTIdentityRepoFactory.m; sourceTree = ""; }; - 361D1D7F2C740F7F39F8E8A869443D76 /* CleverTap.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = CleverTap.h; path = CleverTapSDK/CleverTap.h; sourceTree = ""; }; - 365B2A2A19C53FD0DA42634DE2844C25 /* CTCoverViewController~ipad.xib */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = file.xib; name = "CTCoverViewController~ipad.xib"; path = "CleverTapSDK/InApps/resources/CTCoverViewController~ipad.xib"; sourceTree = ""; }; + 2F0CCB6AB9EAC5621C7A4812CC7B741F /* CTCoverImageViewController~ipadland.xib */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = file.xib; name = "CTCoverImageViewController~ipadland.xib"; path = "CleverTapSDK/InApps/resources/CTCoverImageViewController~ipadland.xib"; sourceTree = ""; }; + 303EF716D7AD65E33CD2B835FE050894 /* CTFeatureFlagsController.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = CTFeatureFlagsController.h; path = CleverTapSDK/FeatureFlags/controllers/CTFeatureFlagsController.h; sourceTree = ""; }; + 306844A6D0C42CEFEB9595DAF88EB845 /* SDAsyncBlockOperation.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDAsyncBlockOperation.m; path = SDWebImage/Private/SDAsyncBlockOperation.m; sourceTree = ""; }; + 30CEC3B0B581886F8AE6FBA068DFDF4C /* CTHeaderViewController~iphoneport.xib */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = file.xib; name = "CTHeaderViewController~iphoneport.xib"; path = "CleverTapSDK/InApps/resources/CTHeaderViewController~iphoneport.xib"; sourceTree = ""; }; + 32375B1CFB51BD51EFA8FFE263A283C8 /* CleverTapPushNotificationDelegate.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = CleverTapPushNotificationDelegate.h; path = CleverTapSDK/CleverTapPushNotificationDelegate.h; sourceTree = ""; }; + 325B01B581855146EA7F62EA9083EE76 /* SDImageCoder.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDImageCoder.h; path = SDWebImage/Core/SDImageCoder.h; sourceTree = ""; }; + 337056D0046D9B8DF1E7AE7E91938ACA /* ic_play@1x.png */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = image.png; name = "ic_play@1x.png"; path = "CleverTapSDK/Inbox/resources/ic_play@1x.png"; sourceTree = ""; }; + 34D731CDDCA2D8E3C6B7DCCFBC9B0546 /* CTCarouselImageView.xib */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = file.xib; name = CTCarouselImageView.xib; path = CleverTapSDK/Inbox/resources/CTCarouselImageView.xib; sourceTree = ""; }; + 34F282951992DE86428E642BF031C0B8 /* SDImageCacheDefine.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDImageCacheDefine.m; path = SDWebImage/Core/SDImageCacheDefine.m; sourceTree = ""; }; + 35EEEE6B6E86E8340A44C76BCEF9BA17 /* SDWebImageDefine.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDWebImageDefine.h; path = SDWebImage/Core/SDWebImageDefine.h; sourceTree = ""; }; + 36B44ED1B2078097B1E43BA6AF848623 /* CleverTapInboxMessageContent.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = CleverTapInboxMessageContent.m; path = CleverTapSDK/Inbox/models/CleverTapInboxMessageContent.m; sourceTree = ""; }; 36E70BE67031A10226C4E1F6E9855464 /* CleverTap-iOS-SDK */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; name = "CleverTap-iOS-SDK"; path = "libCleverTap-iOS-SDK.a"; sourceTree = BUILT_PRODUCTS_DIR; }; - 38A65425915044808FCE3067CC9A24B0 /* CTValidationResult.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = CTValidationResult.m; path = CleverTapSDK/CTValidationResult.m; sourceTree = ""; }; - 3ABE41468656CD53C58027665AC967BC /* CleverTap+SSLPinning.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "CleverTap+SSLPinning.h"; path = "CleverTapSDK/CleverTap+SSLPinning.h"; sourceTree = ""; }; - 3AD91DE2026B38642D3A1F6EBB816017 /* CTEventBuilder.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = CTEventBuilder.h; path = CleverTapSDK/CTEventBuilder.h; sourceTree = ""; }; - 3C078D43EF7C4DBACEB842400EA730F2 /* SDFileAttributeHelper.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDFileAttributeHelper.m; path = SDWebImage/Private/SDFileAttributeHelper.m; sourceTree = ""; }; - 3C2197F809548184A018851967EB483A /* SDImageAWebPCoder.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDImageAWebPCoder.m; path = SDWebImage/Core/SDImageAWebPCoder.m; sourceTree = ""; }; - 3CB79CE2027946922B384A82C109AC70 /* CTMessageMO+CoreDataProperties.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "CTMessageMO+CoreDataProperties.h"; path = "CleverTapSDK/Inbox/models/CTMessageMO+CoreDataProperties.h"; sourceTree = ""; }; - 3CCDB41173AC767116D29B9EE3C08812 /* SDWebImageDownloaderResponseModifier.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDWebImageDownloaderResponseModifier.m; path = SDWebImage/Core/SDWebImageDownloaderResponseModifier.m; sourceTree = ""; }; - 3ED3EF9F43B16534AD490195D29AE6ED /* CleverTapSyncDelegate.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = CleverTapSyncDelegate.h; path = CleverTapSDK/CleverTapSyncDelegate.h; sourceTree = ""; }; - 3EE98578BF7AE670C9CCE5F2A3031E6C /* UIButton+WebCache.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIButton+WebCache.m"; path = "SDWebImage/Core/UIButton+WebCache.m"; sourceTree = ""; }; - 3F3E6E2AF0F64B23881FAD76A30314EE /* SDWebImage.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = SDWebImage.release.xcconfig; sourceTree = ""; }; - 3F593F0C6D158D3DA2AE624960878FEF /* CTAVPlayerViewController.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = CTAVPlayerViewController.h; path = CleverTapSDK/InApps/CTAVPlayerViewController.h; sourceTree = ""; }; - 3FC2BB0130BEAE2D5A7CEB4EDFC73D45 /* CTCoverImageViewController~ipad.xib */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = file.xib; name = "CTCoverImageViewController~ipad.xib"; path = "CleverTapSDK/InApps/resources/CTCoverImageViewController~ipad.xib"; sourceTree = ""; }; - 420106F31480C2F9FEF39E9263318661 /* CTHalfInterstitialViewController~iphoneport.xib */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = file.xib; name = "CTHalfInterstitialViewController~iphoneport.xib"; path = "CleverTapSDK/InApps/resources/CTHalfInterstitialViewController~iphoneport.xib"; sourceTree = ""; }; - 42CE513BA7738FAF5E48199B3A94801B /* CTInboxIconMessageCell~land.xib */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = file.xib; name = "CTInboxIconMessageCell~land.xib"; path = "CleverTapSDK/Inbox/resources/CTInboxIconMessageCell~land.xib"; sourceTree = ""; }; - 42FA5F8BA8699D1FD664A4BC847851C9 /* CTInboxController.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = CTInboxController.m; path = CleverTapSDK/Inbox/controllers/CTInboxController.m; sourceTree = ""; }; - 43C45D9043521F22120A7C1BDE55F27D /* UIImage+ForceDecode.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIImage+ForceDecode.m"; path = "SDWebImage/Core/UIImage+ForceDecode.m"; sourceTree = ""; }; - 459E68D57861E970755DAE3989654938 /* AmazonRootCA1.cer */ = {isa = PBXFileReference; includeInIndex = 1; name = AmazonRootCA1.cer; path = CleverTapSDK/AmazonRootCA1.cer; sourceTree = ""; }; - 45A0D707EADB2664B26BE1F29DF15B0C /* CTHalfInterstitialViewController~iphoneland.xib */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = file.xib; name = "CTHalfInterstitialViewController~iphoneland.xib"; path = "CleverTapSDK/InApps/resources/CTHalfInterstitialViewController~iphoneland.xib"; sourceTree = ""; }; - 4727100A928328776F720D1D23037FB2 /* SDImageAssetManager.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDImageAssetManager.m; path = SDWebImage/Private/SDImageAssetManager.m; sourceTree = ""; }; - 49427581ECF5C10C58702465FEFE51B6 /* CTVideoThumbnailGenerator.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = CTVideoThumbnailGenerator.h; path = CleverTapSDK/Inbox/views/CTVideoThumbnailGenerator.h; sourceTree = ""; }; - 4A14E1B6BC96E56AE1BD9A84E8FAEAD8 /* UIImage+ExtendedCacheData.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIImage+ExtendedCacheData.m"; path = "SDWebImage/Core/UIImage+ExtendedCacheData.m"; sourceTree = ""; }; - 4A31F3C2047011D7FEA251187FF99574 /* SDWebImage.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = SDWebImage.debug.xcconfig; sourceTree = ""; }; - 4A3DCFF4BC94D31AEA22C048A43470C5 /* CTInboxSimpleMessageCell~land.xib */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = file.xib; name = "CTInboxSimpleMessageCell~land.xib"; path = "CleverTapSDK/Inbox/resources/CTInboxSimpleMessageCell~land.xib"; sourceTree = ""; }; - 4A4B859055BF3189D4047D9299187667 /* SDWebImageOperation.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDWebImageOperation.m; path = SDWebImage/Core/SDWebImageOperation.m; sourceTree = ""; }; - 4B9FE5711A1F27FA0BCEF656B18EABC8 /* CleverTapInboxStyleConfig.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = CleverTapInboxStyleConfig.m; path = CleverTapSDK/Inbox/config/CleverTapInboxStyleConfig.m; sourceTree = ""; }; - 4D8319B3ABEE67199B9C53AAA7E4D2C8 /* CTPlistInfo.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = CTPlistInfo.m; path = CleverTapSDK/CTPlistInfo.m; sourceTree = ""; }; - 4DE932A8C1BD6F8610BEEE61BF1E7E3E /* CleverTapJSInterface.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = CleverTapJSInterface.h; path = CleverTapSDK/CleverTapJSInterface.h; sourceTree = ""; }; - 4E24FB26B59AFFBE5A6D7903FB586762 /* NSImage+Compatibility.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "NSImage+Compatibility.h"; path = "SDWebImage/Core/NSImage+Compatibility.h"; sourceTree = ""; }; - 4E9BAA64C409096D8915CBF2D11B496D /* CTHeaderViewController~iphoneland.xib */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = file.xib; name = "CTHeaderViewController~iphoneland.xib"; path = "CleverTapSDK/InApps/resources/CTHeaderViewController~iphoneland.xib"; sourceTree = ""; }; - 50043A57557B4D50B6E1A5523BC31CA3 /* CleverTap-iOS-SDK.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "CleverTap-iOS-SDK.debug.xcconfig"; sourceTree = ""; }; - 5046ABCA583A9E2F4DA976003F3ACB43 /* SDImageAPNGCoder.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDImageAPNGCoder.m; path = SDWebImage/Core/SDImageAPNGCoder.m; sourceTree = ""; }; - 506885A984C628CD5FAF8C550EE150C1 /* CTInAppDisplayViewController.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = CTInAppDisplayViewController.h; path = CleverTapSDK/CTInAppDisplayViewController.h; sourceTree = ""; }; - 50B9320078941BA8E9A69BE89CF895D1 /* CTCoverImageViewController~iphoneland.xib */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = file.xib; name = "CTCoverImageViewController~iphoneland.xib"; path = "CleverTapSDK/InApps/resources/CTCoverImageViewController~iphoneland.xib"; sourceTree = ""; }; - 51340ED429D80618086CFFE176D39C55 /* SDImageTransformer.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDImageTransformer.h; path = SDWebImage/Core/SDImageTransformer.h; sourceTree = ""; }; - 53C8D27F6E1B0515878FFB15126A1C5F /* CTPreferences.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = CTPreferences.m; path = CleverTapSDK/CTPreferences.m; sourceTree = ""; }; - 544872F3D43A607F07F20E57ECE8DDE8 /* SDDisplayLink.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDDisplayLink.m; path = SDWebImage/Private/SDDisplayLink.m; sourceTree = ""; }; - 54F1E55B26CD9621341E2D71A1D4BB17 /* CleverTapJSInterface.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = CleverTapJSInterface.m; path = CleverTapSDK/CleverTapJSInterface.m; sourceTree = ""; }; - 54F3BAE8E64AB824642C525D1E190EE0 /* CTKnownProfileFields.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = CTKnownProfileFields.m; path = CleverTapSDK/CTKnownProfileFields.m; sourceTree = ""; }; - 55FF0E3DD96B25BE58A09EC69203152B /* CleverTapInboxViewControllerPrivate.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = CleverTapInboxViewControllerPrivate.h; path = CleverTapSDK/Inbox/controllers/CleverTapInboxViewControllerPrivate.h; sourceTree = ""; }; - 5603437C2A98B847A4C1473FFDE76873 /* SDWebImageOptionsProcessor.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDWebImageOptionsProcessor.h; path = SDWebImage/Core/SDWebImageOptionsProcessor.h; sourceTree = ""; }; - 574F35A1A27E02D43233CEE2EDA73094 /* CTCoverViewController~ipadland.xib */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = file.xib; name = "CTCoverViewController~ipadland.xib"; path = "CleverTapSDK/InApps/resources/CTCoverViewController~ipadland.xib"; sourceTree = ""; }; - 58F431E7950BF51DE0CC7FC403065AEB /* SDWebImage-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "SDWebImage-prefix.pch"; sourceTree = ""; }; - 5953C0ADF560E64DD159D8F198362993 /* CTInboxSimpleMessageCell.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = CTInboxSimpleMessageCell.h; path = CleverTapSDK/Inbox/cells/CTInboxSimpleMessageCell.h; sourceTree = ""; }; - 595DEA2D8B6FC68402BAD6DE0A0D80E8 /* SDAnimatedImageView+WebCache.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "SDAnimatedImageView+WebCache.h"; path = "SDWebImage/Core/SDAnimatedImageView+WebCache.h"; sourceTree = ""; }; - 59D33BDAFD571BD7B8CB0494A8AE011B /* CTLoginInfoProvider.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = CTLoginInfoProvider.m; path = CleverTapSDK/CTLoginInfoProvider.m; sourceTree = ""; }; - 5ABCFB0D9B6A824DA652BB608CD41863 /* SDWebImageCacheKeyFilter.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDWebImageCacheKeyFilter.m; path = SDWebImage/Core/SDWebImageCacheKeyFilter.m; sourceTree = ""; }; - 5B3E7718F77A937296DB0624DE38CAB0 /* ct_default_audio.png */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = image.png; name = ct_default_audio.png; path = CleverTapSDK/Inbox/resources/ct_default_audio.png; sourceTree = ""; }; - 5E0ABB2B74C7B86C1313D20D72877318 /* SDDiskCache.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDDiskCache.h; path = SDWebImage/Core/SDDiskCache.h; sourceTree = ""; }; - 5E6A826124FEFDBFE2CEA02ACD7E1B47 /* CTDeviceInfo.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = CTDeviceInfo.m; path = CleverTapSDK/CTDeviceInfo.m; sourceTree = ""; }; - 5E8350B2002BB786078CE37E7708D08E /* SDWebImageCacheKeyFilter.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDWebImageCacheKeyFilter.h; path = SDWebImage/Core/SDWebImageCacheKeyFilter.h; sourceTree = ""; }; - 601EFBCD582B5BCABF13D902BF6337FC /* NSData+ImageContentType.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "NSData+ImageContentType.m"; path = "SDWebImage/Core/NSData+ImageContentType.m"; sourceTree = ""; }; - 605024568EE8982237697D4A5102F34F /* SDImageCachesManagerOperation.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDImageCachesManagerOperation.m; path = SDWebImage/Private/SDImageCachesManagerOperation.m; sourceTree = ""; }; - 6089E0CC8E5CDE81ADB3E9995BAF3CA6 /* CTLocalDataStore.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = CTLocalDataStore.m; path = CleverTapSDK/CTLocalDataStore.m; sourceTree = ""; }; - 6129CCE4074C4684269F3E03785430AB /* CTAVPlayerViewController.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = CTAVPlayerViewController.m; path = CleverTapSDK/InApps/CTAVPlayerViewController.m; sourceTree = ""; }; - 615FBAC201C97BB559D8410362D37336 /* CleverTap+DisplayUnit.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "CleverTap+DisplayUnit.h"; path = "CleverTapSDK/CleverTap+DisplayUnit.h"; sourceTree = ""; }; - 6254F565321707DE4C5C85773DFEB98E /* CTInAppUtils.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = CTInAppUtils.m; path = CleverTapSDK/CTInAppUtils.m; sourceTree = ""; }; + 388808CAD70F9737088E9B86D3F5BE2A /* CTEventBuilder.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = CTEventBuilder.m; path = CleverTapSDK/CTEventBuilder.m; sourceTree = ""; }; + 38C29C3AA0CDD6D72DAE6C9465271799 /* CleverTap+SSLPinning.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "CleverTap+SSLPinning.h"; path = "CleverTapSDK/CleverTap+SSLPinning.h"; sourceTree = ""; }; + 3A11EE5FA06CC91AD6CC0EA0DAD765AD /* SDImageAWebPCoder.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDImageAWebPCoder.h; path = SDWebImage/Core/SDImageAWebPCoder.h; sourceTree = ""; }; + 3A25DC0C542BAA80A8E2F78B2669DA04 /* NSButton+WebCache.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "NSButton+WebCache.m"; path = "SDWebImage/Core/NSButton+WebCache.m"; sourceTree = ""; }; + 3A5562928354B06BCDAE767BA3B43C27 /* CTMessageMO.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = CTMessageMO.m; path = CleverTapSDK/Inbox/models/CTMessageMO.m; sourceTree = ""; }; + 3AA3523DA21F9568BED60C63AF2E8265 /* SDWebImageCompat.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDWebImageCompat.h; path = SDWebImage/Core/SDWebImageCompat.h; sourceTree = ""; }; + 3BA9E7B5DB6C1BA1382A2BE8748132F2 /* CTCoverViewController~ipadland.xib */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = file.xib; name = "CTCoverViewController~ipadland.xib"; path = "CleverTapSDK/InApps/resources/CTCoverViewController~ipadland.xib"; sourceTree = ""; }; + 3C4DAA74B65C6F03D8CE73425C5A2328 /* CTIdentityRepoFactory.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = CTIdentityRepoFactory.h; path = CleverTapSDK/CTIdentityRepoFactory.h; sourceTree = ""; }; + 3D4DEF7EA2EEF7C84BA5F5382102FF77 /* CTMessageMO+CoreDataProperties.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "CTMessageMO+CoreDataProperties.h"; path = "CleverTapSDK/Inbox/models/CTMessageMO+CoreDataProperties.h"; sourceTree = ""; }; + 3D70E6841A5B320FEBA3E18726E2CD64 /* CTLocalDataStore.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = CTLocalDataStore.m; path = CleverTapSDK/CTLocalDataStore.m; sourceTree = ""; }; + 3E2C9CF2E2B827D09CAA7FBCFFDF6EDC /* CTInterstitialImageViewController.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = CTInterstitialImageViewController.m; path = CleverTapSDK/InApps/CTInterstitialImageViewController.m; sourceTree = ""; }; + 3F8C86FC239374BB7616CDE3817B0B91 /* CleverTap+Inbox.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "CleverTap+Inbox.h"; path = "CleverTapSDK/CleverTap+Inbox.h"; sourceTree = ""; }; + 3FA008F1C8309BEFD138C22BB8B9F649 /* CTCoverViewController~iphoneland.xib */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = file.xib; name = "CTCoverViewController~iphoneland.xib"; path = "CleverTapSDK/InApps/resources/CTCoverViewController~iphoneland.xib"; sourceTree = ""; }; + 3FFEF7A1EC3C534D688767B27AFD00FB /* UIImageView+WebCache.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIImageView+WebCache.m"; path = "SDWebImage/Core/UIImageView+WebCache.m"; sourceTree = ""; }; + 4189F6DA156AF3AE1AAA33374F68E897 /* CTCarouselImageMessageCell~port.xib */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = file.xib; name = "CTCarouselImageMessageCell~port.xib"; path = "CleverTapSDK/Inbox/resources/CTCarouselImageMessageCell~port.xib"; sourceTree = ""; }; + 425B49983F8E78C240B1EFC28FD67E27 /* SDMemoryCache.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDMemoryCache.h; path = SDWebImage/Core/SDMemoryCache.h; sourceTree = ""; }; + 42D5F27B93C393ED561D183ADDC802E3 /* ct_default_portrait_image.png */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = image.png; name = ct_default_portrait_image.png; path = CleverTapSDK/Inbox/resources/ct_default_portrait_image.png; sourceTree = ""; }; + 43A8601C1BA9E97614AC6C805239C8D4 /* ct_default_landscape_image.png */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = image.png; name = ct_default_landscape_image.png; path = CleverTapSDK/Inbox/resources/ct_default_landscape_image.png; sourceTree = ""; }; + 473BE269F72E327533C945145A6341FC /* CTInboxBaseMessageCell.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = CTInboxBaseMessageCell.h; path = CleverTapSDK/Inbox/cells/CTInboxBaseMessageCell.h; sourceTree = ""; }; + 474302FFBE03F657A06E481B4EA5B280 /* SDImageFrame.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDImageFrame.h; path = SDWebImage/Core/SDImageFrame.h; sourceTree = ""; }; + 4805ADA4EFD933AF935333AD27026F66 /* CleverTapDisplayUnit.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = CleverTapDisplayUnit.m; path = CleverTapSDK/DisplayUnit/models/CleverTapDisplayUnit.m; sourceTree = ""; }; + 49E028464AA134E465C7DC4CB4B98DF4 /* CTNotificationButton.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = CTNotificationButton.m; path = CleverTapSDK/CTNotificationButton.m; sourceTree = ""; }; + 4A01CA5CD32F5E9B61C36106C53F7AF1 /* NSDictionary+Extensions.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "NSDictionary+Extensions.m"; path = "CleverTapSDK/NSDictionary+Extensions.m"; sourceTree = ""; }; + 4AE4CA16BD666E24B4AC075BA5B96D99 /* SDAnimatedImage.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDAnimatedImage.m; path = SDWebImage/Core/SDAnimatedImage.m; sourceTree = ""; }; + 4B4E0240BEABF8BE5DBA73F3EF75E89F /* CTInAppFCManager.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = CTInAppFCManager.m; path = CleverTapSDK/CTInAppFCManager.m; sourceTree = ""; }; + 4B8FCB2F86FCE12E98D2C33044F83CAD /* CTFooterViewController.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = CTFooterViewController.m; path = CleverTapSDK/InApps/CTFooterViewController.m; sourceTree = ""; }; + 4BC1DCE26164671BD35675BA6B45A5AD /* SDWebImageDownloaderResponseModifier.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDWebImageDownloaderResponseModifier.h; path = SDWebImage/Core/SDWebImageDownloaderResponseModifier.h; sourceTree = ""; }; + 4CF798E5C12FFAAF4D51475D2CA07E55 /* SDAnimatedImagePlayer.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDAnimatedImagePlayer.m; path = SDWebImage/Core/SDAnimatedImagePlayer.m; sourceTree = ""; }; + 4D574AECCA07209855A039D16C68A64B /* SDFileAttributeHelper.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDFileAttributeHelper.h; path = SDWebImage/Private/SDFileAttributeHelper.h; sourceTree = ""; }; + 4DA9AACA23F6CA2954A4476A7BE96B47 /* CTLegacyIdentityRepo.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = CTLegacyIdentityRepo.h; path = CleverTapSDK/CTLegacyIdentityRepo.h; sourceTree = ""; }; + 4DD20275AD78AF66C00F374DCF48875D /* CTValidator.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = CTValidator.m; path = CleverTapSDK/CTValidator.m; sourceTree = ""; }; + 4EE6FD4305EB45586703A25949DEC14D /* ContentMerger.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ContentMerger.h; path = CleverTapSDK/ProductExperiences/ContentMerger.h; sourceTree = ""; }; + 4EFAC8D67EC96653F156D4384693FF73 /* CTFeatureFlagsController.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = CTFeatureFlagsController.m; path = CleverTapSDK/FeatureFlags/controllers/CTFeatureFlagsController.m; sourceTree = ""; }; + 4F6F448E033D207C0B5A914F8F7D834F /* CTInterstitialViewController.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = CTInterstitialViewController.h; path = CleverTapSDK/InApps/CTInterstitialViewController.h; sourceTree = ""; }; + 50297EC54776A6B825653AE3B69F0B1A /* CTDisplayUnitController.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = CTDisplayUnitController.h; path = CleverTapSDK/DisplayUnit/controllers/CTDisplayUnitController.h; sourceTree = ""; }; + 50AC1B40BFD9F8DB29D69FE37DDD5A66 /* SDImageAPNGCoder.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDImageAPNGCoder.h; path = SDWebImage/Core/SDImageAPNGCoder.h; sourceTree = ""; }; + 52F1382CBA7D38B10646600BF7D8B135 /* SDImageTransformer.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDImageTransformer.h; path = SDWebImage/Core/SDImageTransformer.h; sourceTree = ""; }; + 5348BA9393A2E2359BB7AEE6F72CD35D /* CTHeaderViewController~ipad.xib */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = file.xib; name = "CTHeaderViewController~ipad.xib"; path = "CleverTapSDK/InApps/resources/CTHeaderViewController~ipad.xib"; sourceTree = ""; }; + 540FCBD78A583F628B0BE7A9230883A3 /* CleverTap.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = CleverTap.h; path = CleverTapSDK/CleverTap.h; sourceTree = ""; }; + 54533E358EC0BB8F88B8CE800B3155AC /* UIColor+SDHexString.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIColor+SDHexString.h"; path = "SDWebImage/Private/UIColor+SDHexString.h"; sourceTree = ""; }; + 56265E3EF3C54778C8E17FDCA7AEF211 /* ic_pause@3x.png */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = image.png; name = "ic_pause@3x.png"; path = "CleverTapSDK/Inbox/resources/ic_pause@3x.png"; sourceTree = ""; }; + 568B638F3768B6CC8B852CE0BD936A57 /* CleverTapInboxMessage.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = CleverTapInboxMessage.m; path = CleverTapSDK/Inbox/models/CleverTapInboxMessage.m; sourceTree = ""; }; + 56F276190FFFDABDF3393EB5E50C6321 /* CTCarouselImageView.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = CTCarouselImageView.h; path = CleverTapSDK/Inbox/views/CTCarouselImageView.h; sourceTree = ""; }; + 5706ED3C925D81E1BB354639B6BE0324 /* CTBaseHeaderFooterViewControllerPrivate.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = CTBaseHeaderFooterViewControllerPrivate.h; path = CleverTapSDK/InApps/CTBaseHeaderFooterViewControllerPrivate.h; sourceTree = ""; }; + 577945C4A36E5A326590B3E2CE3261D1 /* SDWebImageCompat.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDWebImageCompat.m; path = SDWebImage/Core/SDWebImageCompat.m; sourceTree = ""; }; + 57D4B48E4C210929E9589D1100AB941E /* SDWebImageOptionsProcessor.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDWebImageOptionsProcessor.h; path = SDWebImage/Core/SDWebImageOptionsProcessor.h; sourceTree = ""; }; + 58C1D514F3354D1F64764489197D76AA /* AmazonRootCA1.cer */ = {isa = PBXFileReference; includeInIndex = 1; name = AmazonRootCA1.cer; path = CleverTapSDK/AmazonRootCA1.cer; sourceTree = ""; }; + 5A35A92AB1F119B15EB6D0BE116386C4 /* CTInboxUtils.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = CTInboxUtils.m; path = CleverTapSDK/Inbox/models/CTInboxUtils.m; sourceTree = ""; }; + 5A4683B67574C68C295DE9E499716966 /* CTInterstitialImageViewController~iphoneport.xib */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = file.xib; name = "CTInterstitialImageViewController~iphoneport.xib"; path = "CleverTapSDK/InApps/resources/CTInterstitialImageViewController~iphoneport.xib"; sourceTree = ""; }; + 5A8CA1BDA8A39C4D281C5446829A79C7 /* UIView+WebCache.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIView+WebCache.m"; path = "SDWebImage/Core/UIView+WebCache.m"; sourceTree = ""; }; + 5C6D076D530B0AC88BB1B995ADE8214D /* CTCarouselImageMessageCell.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = CTCarouselImageMessageCell.m; path = CleverTapSDK/Inbox/cells/CTCarouselImageMessageCell.m; sourceTree = ""; }; + 5D228E1C1BB933F5F7D931CBBEBE029E /* CTLoginInfoProvider.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = CTLoginInfoProvider.m; path = CleverTapSDK/CTLoginInfoProvider.m; sourceTree = ""; }; + 5D39E12B60FF37A1606D6B12E704D217 /* UIView+CTToast.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIView+CTToast.m"; path = "CleverTapSDK/Inbox/views/UIView+CTToast.m"; sourceTree = ""; }; + 5EE82619B3B0BB028ABC83B0FD8D52E9 /* CTProfileBuilder.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = CTProfileBuilder.h; path = CleverTapSDK/CTProfileBuilder.h; sourceTree = ""; }; + 60EDD094FFF87819FBFBF49862C158F2 /* UIButton+WebCache.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIButton+WebCache.h"; path = "SDWebImage/Core/UIButton+WebCache.h"; sourceTree = ""; }; + 61B3ED5E2F671148F4B209D044672C81 /* CleverTapInstanceConfigPrivate.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = CleverTapInstanceConfigPrivate.h; path = CleverTapSDK/CleverTapInstanceConfigPrivate.h; sourceTree = ""; }; + 61DC36655B4D1581FDFB6B14F3C6D1E2 /* CTAlertViewController.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = CTAlertViewController.h; path = CleverTapSDK/InApps/CTAlertViewController.h; sourceTree = ""; }; + 62151ACF530E51374C39D364235AFA4D /* SDWebImageOperation.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDWebImageOperation.h; path = SDWebImage/Core/SDWebImageOperation.h; sourceTree = ""; }; + 62736F7BD78DBD5F48E216D93FAC7F51 /* ct_volume_off.png */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = image.png; name = ct_volume_off.png; path = CleverTapSDK/Inbox/resources/ct_volume_off.png; sourceTree = ""; }; 62815217557B28359667228CE4A5CDC2 /* Pods-ExampleProject-acknowledgements.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Pods-ExampleProject-acknowledgements.plist"; sourceTree = ""; }; - 63504EE310ED0E0DFF19CAD89CE47C4A /* SDWebImageCompat.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDWebImageCompat.m; path = SDWebImage/Core/SDWebImageCompat.m; sourceTree = ""; }; - 63EF50442898251B0DF413DF8E078D0E /* CTCarouselImageMessageCell~land.xib */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = file.xib; name = "CTCarouselImageMessageCell~land.xib"; path = "CleverTapSDK/Inbox/resources/CTCarouselImageMessageCell~land.xib"; sourceTree = ""; }; - 669173AD593C28F43CFDA6C2DC808B2A /* CTBaseHeaderFooterViewController.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = CTBaseHeaderFooterViewController.h; path = CleverTapSDK/InApps/CTBaseHeaderFooterViewController.h; sourceTree = ""; }; - 66C5D9D96462BEF0B3A79581DBC220E1 /* CTLoginInfoProvider.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = CTLoginInfoProvider.h; path = CleverTapSDK/CTLoginInfoProvider.h; sourceTree = ""; }; - 67244003DBBB806BE9E337D9F3704816 /* CTInAppNotification.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = CTInAppNotification.m; path = CleverTapSDK/CTInAppNotification.m; sourceTree = ""; }; - 677EAC72DE72381FA70EE618BB368813 /* SDDeviceHelper.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDDeviceHelper.m; path = SDWebImage/Private/SDDeviceHelper.m; sourceTree = ""; }; - 67BE87CCFA63A9625862BC8BF3FFFBF3 /* CTInterstitialViewController.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = CTInterstitialViewController.m; path = CleverTapSDK/InApps/CTInterstitialViewController.m; sourceTree = ""; }; - 687789D2ADA5C9C64F30310F8D40F493 /* CTInboxController.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = CTInboxController.h; path = CleverTapSDK/Inbox/controllers/CTInboxController.h; sourceTree = ""; }; - 68DB8874E175D1C669FF5DC9E11DF942 /* CTInterstitialViewController~ipad.xib */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = file.xib; name = "CTInterstitialViewController~ipad.xib"; path = "CleverTapSDK/InApps/resources/CTInterstitialViewController~ipad.xib"; sourceTree = ""; }; - 695DE06747201EBB1B0938214D18667E /* CTInboxSimpleMessageCell~port.xib */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = file.xib; name = "CTInboxSimpleMessageCell~port.xib"; path = "CleverTapSDK/Inbox/resources/CTInboxSimpleMessageCell~port.xib"; sourceTree = ""; }; - 6A321A0B66A4C350B3BCB28CE536FEC4 /* CTMessageMO+CoreDataProperties.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "CTMessageMO+CoreDataProperties.m"; path = "CleverTapSDK/Inbox/models/CTMessageMO+CoreDataProperties.m"; sourceTree = ""; }; - 6A494003781D15E46C7C9C5303FF3909 /* SDWebImageCompat.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDWebImageCompat.h; path = SDWebImage/Core/SDWebImageCompat.h; sourceTree = ""; }; - 6A6F2F4646F47D8932E0D70223446B7B /* SDWebImageTransition.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDWebImageTransition.m; path = SDWebImage/Core/SDWebImageTransition.m; sourceTree = ""; }; - 6B6B0152B7B7EDE22C2AA23481CCE693 /* CTDismissButton.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = CTDismissButton.h; path = CleverTapSDK/InApps/CTDismissButton.h; sourceTree = ""; }; - 6CDE3260E53973DACE1DD5C2E8A90F56 /* CTProfileBuilder.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = CTProfileBuilder.h; path = CleverTapSDK/CTProfileBuilder.h; sourceTree = ""; }; - 6D29F76DA161F9223DD1CD06482ACE33 /* CTFlexibleIdentityRepo.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = CTFlexibleIdentityRepo.h; path = CleverTapSDK/CTFlexibleIdentityRepo.h; sourceTree = ""; }; - 6E3FDD985EEB50BA51CA09763A782BB4 /* SDImageIOCoder.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDImageIOCoder.m; path = SDWebImage/Core/SDImageIOCoder.m; sourceTree = ""; }; - 6E48469D3F9613046510073B7C379842 /* SDAsyncBlockOperation.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDAsyncBlockOperation.m; path = SDWebImage/Private/SDAsyncBlockOperation.m; sourceTree = ""; }; - 6E66AE9E3E3F4E6864C6E10496F541F0 /* CTInboxUtils.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = CTInboxUtils.m; path = CleverTapSDK/Inbox/models/CTInboxUtils.m; sourceTree = ""; }; - 6F3D47270216FD284A388DFF4DE9C56B /* SDAsyncBlockOperation.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDAsyncBlockOperation.h; path = SDWebImage/Private/SDAsyncBlockOperation.h; sourceTree = ""; }; - 6F610A1116D03C974539810DFE0B11D1 /* UIImage+ForceDecode.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIImage+ForceDecode.h"; path = "SDWebImage/Core/UIImage+ForceDecode.h"; sourceTree = ""; }; - 6FC38E6226C1E9BD2D761C95F3F5094D /* ResourceBundle-CleverTapSDK-CleverTap-iOS-SDK-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "ResourceBundle-CleverTapSDK-CleverTap-iOS-SDK-Info.plist"; sourceTree = ""; }; - 6FDD77F6E7D15A400B43A24A44D6C577 /* CTImageInAppViewController.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = CTImageInAppViewController.m; path = CleverTapSDK/InApps/CTImageInAppViewController.m; sourceTree = ""; }; - 7076906FF402F1D71DF488DE94A948B5 /* CTCertificatePinning.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = CTCertificatePinning.m; path = CleverTapSDK/CTCertificatePinning.m; sourceTree = ""; }; - 70FD6DEC3A1DB47CE299F4C86AB3B42D /* CTLocalInApp.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = CTLocalInApp.m; path = CleverTapSDK/InApps/CTLocalInApp.m; sourceTree = ""; }; - 70FE796A747457D7FE31038774F14D69 /* SDMemoryCache.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDMemoryCache.h; path = SDWebImage/Core/SDMemoryCache.h; sourceTree = ""; }; - 720D2862C25FCC0FA7F210E5A531EAC7 /* SDWebImageDownloader.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDWebImageDownloader.m; path = SDWebImage/Core/SDWebImageDownloader.m; sourceTree = ""; }; - 72235C82281462B9DA224177C6C079CB /* CTInboxMessageActionView.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = CTInboxMessageActionView.m; path = CleverTapSDK/Inbox/views/CTInboxMessageActionView.m; sourceTree = ""; }; - 723C1B2E94575B053C89788AC0C96D81 /* CTHalfInterstitialImageViewController~ipadland.xib */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = file.xib; name = "CTHalfInterstitialImageViewController~ipadland.xib"; path = "CleverTapSDK/InApps/resources/CTHalfInterstitialImageViewController~ipadland.xib"; sourceTree = ""; }; - 746819FC279E5153C310209871F890B1 /* SDWebImageDownloaderConfig.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDWebImageDownloaderConfig.m; path = SDWebImage/Core/SDWebImageDownloaderConfig.m; sourceTree = ""; }; - 759330BA7552EDD8A8B2A96A9D232F76 /* SDImageGraphics.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDImageGraphics.h; path = SDWebImage/Core/SDImageGraphics.h; sourceTree = ""; }; - 75B3CFC38824ABBC58BA8308B04C90A3 /* CTInAppHTMLViewController.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = CTInAppHTMLViewController.h; path = CleverTapSDK/InApps/CTInAppHTMLViewController.h; sourceTree = ""; }; - 76C390DCF370788212F9E9D8FEE55C75 /* SDCallbackQueue.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDCallbackQueue.m; path = SDWebImage/Core/SDCallbackQueue.m; sourceTree = ""; }; - 76F350D38B0C254210F7E2CE1C75366B /* SDAssociatedObject.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDAssociatedObject.h; path = SDWebImage/Private/SDAssociatedObject.h; sourceTree = ""; }; - 7919F9A07E64A2BD59B842EE96FF7630 /* SDDiskCache.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDDiskCache.m; path = SDWebImage/Core/SDDiskCache.m; sourceTree = ""; }; - 79ABB71817CB46FFFB2DDF0FD4FD935B /* SDImageIOAnimatedCoder.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDImageIOAnimatedCoder.m; path = SDWebImage/Core/SDImageIOAnimatedCoder.m; sourceTree = ""; }; - 7A628076EB2E1DDEC3AD2B96B29F2126 /* CTInterstitialImageViewController~iphoneport.xib */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = file.xib; name = "CTInterstitialImageViewController~iphoneport.xib"; path = "CleverTapSDK/InApps/resources/CTInterstitialImageViewController~iphoneport.xib"; sourceTree = ""; }; - 7BE2F943261F1A9F90F2BD363CDFFCCA /* CTImageInAppViewControllerPrivate.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = CTImageInAppViewControllerPrivate.h; path = CleverTapSDK/InApps/CTImageInAppViewControllerPrivate.h; sourceTree = ""; }; - 7C087878E088FE09B94BFCFB8E06540B /* SDImageIOAnimatedCoderInternal.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDImageIOAnimatedCoderInternal.h; path = SDWebImage/Private/SDImageIOAnimatedCoderInternal.h; sourceTree = ""; }; - 7C8F687A9D2990315DEA8A801F99DEC6 /* CleverTapDisplayUnit.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = CleverTapDisplayUnit.m; path = CleverTapSDK/DisplayUnit/models/CleverTapDisplayUnit.m; sourceTree = ""; }; - 7CE6982D765FC929E83F5AA0B9C1C12B /* CTSwizzle.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = CTSwizzle.h; path = CleverTapSDK/CTSwizzle.h; sourceTree = ""; }; + 62A10A17EF5C512486F214C415771E16 /* CTSwizzle.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = CTSwizzle.m; path = CleverTapSDK/CTSwizzle.m; sourceTree = ""; }; + 62AE043505F38506F90A81C9BD24088F /* CTConstants.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = CTConstants.h; path = CleverTapSDK/CTConstants.h; sourceTree = ""; }; + 630B2A2DECD33C49CE25BCCF77D89D94 /* CTCarouselImageView.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = CTCarouselImageView.m; path = CleverTapSDK/Inbox/views/CTCarouselImageView.m; sourceTree = ""; }; + 640D44F41E9521CA59D255ED1C7BB301 /* CTRequest.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = CTRequest.h; path = CleverTapSDK/CTRequest.h; sourceTree = ""; }; + 6459433FB7E3DDB7E5A105A2140CAAB9 /* CleverTapBuildInfo.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = CleverTapBuildInfo.h; path = CleverTapSDK/CleverTapBuildInfo.h; sourceTree = ""; }; + 6483032B6BA4471D0B7ABD524E25A481 /* CTInterstitialViewController~ipadland.xib */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = file.xib; name = "CTInterstitialViewController~ipadland.xib"; path = "CleverTapSDK/InApps/resources/CTInterstitialViewController~ipadland.xib"; sourceTree = ""; }; + 654CEF2FF9342DCF99C2CA00FBF7FF60 /* CTHeaderViewController~iphoneland.xib */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = file.xib; name = "CTHeaderViewController~iphoneland.xib"; path = "CleverTapSDK/InApps/resources/CTHeaderViewController~iphoneland.xib"; sourceTree = ""; }; + 6646ABB6FFA9E81CA56737DC14680B96 /* CTCoverImageViewController~iphoneland.xib */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = file.xib; name = "CTCoverImageViewController~iphoneland.xib"; path = "CleverTapSDK/InApps/resources/CTCoverImageViewController~iphoneland.xib"; sourceTree = ""; }; + 68D0F76361672D5AE19AA7A3E1F17994 /* UIImage+MemoryCacheCost.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIImage+MemoryCacheCost.h"; path = "SDWebImage/Core/UIImage+MemoryCacheCost.h"; sourceTree = ""; }; + 69332F5DC51859E911C060D3A75A6A5A /* SDImageCoderHelper.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDImageCoderHelper.m; path = SDWebImage/Core/SDImageCoderHelper.m; sourceTree = ""; }; + 69F004D1418A6071434F554C1E0D71A1 /* CTIdentityRepo.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = CTIdentityRepo.h; path = CleverTapSDK/CTIdentityRepo.h; sourceTree = ""; }; + 6B1BD2A310E4036BEF412E83DEF25434 /* UIImage+MultiFormat.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIImage+MultiFormat.h"; path = "SDWebImage/Core/UIImage+MultiFormat.h"; sourceTree = ""; }; + 6B8D2DB4FBD399283936E79054DABE66 /* UIColor+SDHexString.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIColor+SDHexString.m"; path = "SDWebImage/Private/UIColor+SDHexString.m"; sourceTree = ""; }; + 6B9F39AAC74118DCFDFC537921D37BF9 /* CTBaseHeaderFooterViewController.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = CTBaseHeaderFooterViewController.h; path = CleverTapSDK/InApps/CTBaseHeaderFooterViewController.h; sourceTree = ""; }; + 6BE3A8690D946A534AB9F0B67CFB1342 /* SDWebImageDownloaderOperation.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDWebImageDownloaderOperation.h; path = SDWebImage/Core/SDWebImageDownloaderOperation.h; sourceTree = ""; }; + 6C4D9D04D86A48164F973D8418FD3FF4 /* CTIdentityRepoFactory.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = CTIdentityRepoFactory.m; path = CleverTapSDK/CTIdentityRepoFactory.m; sourceTree = ""; }; + 6C7DB41726A02382E0B743DFDDE941F2 /* CTVar.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = CTVar.h; path = CleverTapSDK/ProductExperiences/CTVar.h; sourceTree = ""; }; + 6DBAE3C48569C3865DDDED3F61868882 /* NSData+ImageContentType.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "NSData+ImageContentType.h"; path = "SDWebImage/Core/NSData+ImageContentType.h"; sourceTree = ""; }; + 6E9859CC4E41A7CE6FD4BA7173B1982E /* SDImageLoadersManager.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDImageLoadersManager.h; path = SDWebImage/Core/SDImageLoadersManager.h; sourceTree = ""; }; + 6EE3DFF499F9E289FE74FDECBD78F922 /* SDWebImageCacheKeyFilter.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDWebImageCacheKeyFilter.h; path = SDWebImage/Core/SDWebImageCacheKeyFilter.h; sourceTree = ""; }; + 6F0238786F75BE955F1873B0229B4835 /* SDImageCodersManager.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDImageCodersManager.m; path = SDWebImage/Core/SDImageCodersManager.m; sourceTree = ""; }; + 6F258962D6F652EAC9445860BACB57B7 /* SDAssociatedObject.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDAssociatedObject.m; path = SDWebImage/Private/SDAssociatedObject.m; sourceTree = ""; }; + 6FD6F4BF66E533E9218C46D90A16A088 /* NSImage+Compatibility.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "NSImage+Compatibility.h"; path = "SDWebImage/Core/NSImage+Compatibility.h"; sourceTree = ""; }; + 700DE0D541492FF6D1D3D7595D969F06 /* CTDismissButton.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = CTDismissButton.m; path = CleverTapSDK/InApps/CTDismissButton.m; sourceTree = ""; }; + 7091F38357BEF7082868DB76FAE8898E /* SDWebImageDownloaderDecryptor.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDWebImageDownloaderDecryptor.m; path = SDWebImage/Core/SDWebImageDownloaderDecryptor.m; sourceTree = ""; }; + 7105804B4EDFB9C3431CE93921E7D60D /* CTCertificatePinning.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = CTCertificatePinning.h; path = CleverTapSDK/CTCertificatePinning.h; sourceTree = ""; }; + 71088BC74685C239ED7D1AB536A265A6 /* SDImageCoderHelper.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDImageCoderHelper.h; path = SDWebImage/Core/SDImageCoderHelper.h; sourceTree = ""; }; + 7193DB664DE2D593DF3024BB2E5CE869 /* UIImage+ExtendedCacheData.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIImage+ExtendedCacheData.h"; path = "SDWebImage/Core/UIImage+ExtendedCacheData.h"; sourceTree = ""; }; + 71AE91870CD32DBB83DBFC0AB1CAD272 /* CTSwizzle.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = CTSwizzle.h; path = CleverTapSDK/CTSwizzle.h; sourceTree = ""; }; + 71CDAA579ECFEE112C1038377280BCCF /* CTRequestSender.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = CTRequestSender.h; path = CleverTapSDK/CTRequestSender.h; sourceTree = ""; }; + 72BDAE48AA1C47C34D3627DFF3BB9855 /* CTInAppFCManager.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = CTInAppFCManager.h; path = CleverTapSDK/CTInAppFCManager.h; sourceTree = ""; }; + 73160AE1D1F3C62D3CFC44F9A9AFA032 /* ic_pause@2x.png */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = image.png; name = "ic_pause@2x.png"; path = "CleverTapSDK/Inbox/resources/ic_pause@2x.png"; sourceTree = ""; }; + 736C5DE6A312E3F1994B1BA46B0AA20D /* CTInAppHTMLViewController.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = CTInAppHTMLViewController.m; path = CleverTapSDK/InApps/CTInAppHTMLViewController.m; sourceTree = ""; }; + 7378BA5267CAEEB070919189B66AC060 /* UIImage+ForceDecode.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIImage+ForceDecode.h"; path = "SDWebImage/Core/UIImage+ForceDecode.h"; sourceTree = ""; }; + 74A255198645FD62C60EA90913BFA9B7 /* NSButton+WebCache.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "NSButton+WebCache.h"; path = "SDWebImage/Core/NSButton+WebCache.h"; sourceTree = ""; }; + 7502CECEC2440E4DD81DBA46D9201379 /* CTFooterViewController.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = CTFooterViewController.h; path = CleverTapSDK/InApps/CTFooterViewController.h; sourceTree = ""; }; + 755C72A35E5051DA700AED8E6BE7A38F /* SDDeviceHelper.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDDeviceHelper.m; path = SDWebImage/Private/SDDeviceHelper.m; sourceTree = ""; }; + 76268F21E7B57C723B2979FA32A74A23 /* SDImageCoder.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDImageCoder.m; path = SDWebImage/Core/SDImageCoder.m; sourceTree = ""; }; + 76F231FDBE07DF2E8598B84AE6F42E67 /* UIButton+WebCache.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIButton+WebCache.m"; path = "SDWebImage/Core/UIButton+WebCache.m"; sourceTree = ""; }; + 77488CC23517C13CED61FF741AD63DFD /* SDImageAPNGCoder.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDImageAPNGCoder.m; path = SDWebImage/Core/SDImageAPNGCoder.m; sourceTree = ""; }; + 7813CB72482158D2DD680BEFDD9AF1FC /* SDImageLoader.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDImageLoader.h; path = SDWebImage/Core/SDImageLoader.h; sourceTree = ""; }; + 789AECDB6BCEC4052AC168E08651DB40 /* CleverTapInstanceConfig.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = CleverTapInstanceConfig.h; path = CleverTapSDK/CleverTapInstanceConfig.h; sourceTree = ""; }; + 79F80A00F4B22E8BBEE4EE65632E6A76 /* CleverTapTrackedViewController.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = CleverTapTrackedViewController.h; path = CleverTapSDK/CleverTapTrackedViewController.h; sourceTree = ""; }; + 7ABB378298D21D573C6A97BDEBEC474C /* CTVideoThumbnailGenerator.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = CTVideoThumbnailGenerator.h; path = CleverTapSDK/Inbox/views/CTVideoThumbnailGenerator.h; sourceTree = ""; }; + 7AE881B1848CC3A82B696124CF9F9196 /* SDGraphicsImageRenderer.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDGraphicsImageRenderer.h; path = SDWebImage/Core/SDGraphicsImageRenderer.h; sourceTree = ""; }; + 7C4249A655E86EBBCE091C5C68AEEE01 /* SDWebImage-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "SDWebImage-prefix.pch"; sourceTree = ""; }; + 7C4D8BD06F3A9589ABA1F8363DD7288A /* CTInboxMessageActionView.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = CTInboxMessageActionView.h; path = CleverTapSDK/Inbox/views/CTInboxMessageActionView.h; sourceTree = ""; }; 7D299F12999D154727E354E5E5B8E263 /* Pods-ExampleProject-acknowledgements.markdown */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; path = "Pods-ExampleProject-acknowledgements.markdown"; sourceTree = ""; }; - 7F04FC081BF0DB766AA8492D755A9E38 /* CTMessageMO.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = CTMessageMO.m; path = CleverTapSDK/Inbox/models/CTMessageMO.m; sourceTree = ""; }; - 7F57416F3E2C663F3F3C0F8D24B6C359 /* SDMemoryCache.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDMemoryCache.m; path = SDWebImage/Core/SDMemoryCache.m; sourceTree = ""; }; - 7F8C35246B78E9E1E1BED09C8C2F5522 /* SDAnimatedImagePlayer.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDAnimatedImagePlayer.m; path = SDWebImage/Core/SDAnimatedImagePlayer.m; sourceTree = ""; }; - 810AB2078A12297C90E2F3E972F1F6D5 /* SDImageCoder.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDImageCoder.h; path = SDWebImage/Core/SDImageCoder.h; sourceTree = ""; }; - 81B3152A60BCAC1275A36E74E9F91953 /* NSButton+WebCache.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "NSButton+WebCache.m"; path = "SDWebImage/Core/NSButton+WebCache.m"; sourceTree = ""; }; - 81FBE933CE7AF8E701525948436E15FD /* CleverTapConfigValue.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = CleverTapConfigValue.m; path = CleverTapSDK/ProductConfig/models/CleverTapConfigValue.m; sourceTree = ""; }; - 839B3BEFF668F85036F42A09633B5AB6 /* CTInterstitialImageViewController.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = CTInterstitialImageViewController.h; path = CleverTapSDK/InApps/CTInterstitialImageViewController.h; sourceTree = ""; }; - 84BE8FE013BCAB7FA6BEEF8600098678 /* CTLocalInApp.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = CTLocalInApp.h; path = CleverTapSDK/InApps/CTLocalInApp.h; sourceTree = ""; }; - 84EEFFA5289F069FFC19F8EAA8819B6D /* CTCarouselImageMessageCell.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = CTCarouselImageMessageCell.h; path = CleverTapSDK/Inbox/cells/CTCarouselImageMessageCell.h; sourceTree = ""; }; - 85A7A9B6200470118549E81DE56FB0B2 /* SDImageCoderHelper.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDImageCoderHelper.m; path = SDWebImage/Core/SDImageCoderHelper.m; sourceTree = ""; }; - 85A87D21F33A8CB6456E42A48F586276 /* SDWebImageDownloaderOperation.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDWebImageDownloaderOperation.m; path = SDWebImage/Core/SDWebImageDownloaderOperation.m; sourceTree = ""; }; - 86866E88CE96911DC543630F464CB471 /* CleverTapDisplayUnitContent.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = CleverTapDisplayUnitContent.m; path = CleverTapSDK/DisplayUnit/models/CleverTapDisplayUnitContent.m; sourceTree = ""; }; - 86A12E75A297D84531417AC7B582D496 /* UIView+WebCacheOperation.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIView+WebCacheOperation.m"; path = "SDWebImage/Core/UIView+WebCacheOperation.m"; sourceTree = ""; }; - 88DF7715A5FFF427F7B16A6D4B9C7383 /* UIView+WebCache.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIView+WebCache.m"; path = "SDWebImage/Core/UIView+WebCache.m"; sourceTree = ""; }; - 899C8CBBD29A02E70EF11E9A3E0EBC47 /* CleverTapPushNotificationDelegate.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = CleverTapPushNotificationDelegate.h; path = CleverTapSDK/CleverTapPushNotificationDelegate.h; sourceTree = ""; }; - 89B7A084DA540E3C81AB5848ACF2AB34 /* CTUtils.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = CTUtils.m; path = CleverTapSDK/CTUtils.m; sourceTree = ""; }; - 8B57355733C9179A4100DF8E06430ABA /* SDWebImage.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDWebImage.h; path = WebImage/SDWebImage.h; sourceTree = ""; }; - 8BC7C21E8D8252D5C308E3E678C65F0C /* CTInboxIconMessageCell~port.xib */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = file.xib; name = "CTInboxIconMessageCell~port.xib"; path = "CleverTapSDK/Inbox/resources/CTInboxIconMessageCell~port.xib"; sourceTree = ""; }; - 8C60C2689B971C64C4467358A5DF8F52 /* CleverTapProductConfig.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = CleverTapProductConfig.m; path = CleverTapSDK/ProductConfig/models/CleverTapProductConfig.m; sourceTree = ""; }; - 8C6B506E7EB9C6801EC9C3A36EB27F2D /* CTInboxBaseMessageCell.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = CTInboxBaseMessageCell.m; path = CleverTapSDK/Inbox/cells/CTInboxBaseMessageCell.m; sourceTree = ""; }; - 8D039F17DCF6EC1C3233A9ABF3617859 /* CTAlertViewController.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = CTAlertViewController.m; path = CleverTapSDK/InApps/CTAlertViewController.m; sourceTree = ""; }; - 8D7696581FC7ECF3FCA72356109C3589 /* ic_play@1x.png */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = image.png; name = "ic_play@1x.png"; path = "CleverTapSDK/Inbox/resources/ic_play@1x.png"; sourceTree = ""; }; - 8FD9F0672E9BE622CDAE944295DBAF86 /* CTUserMO.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = CTUserMO.m; path = CleverTapSDK/Inbox/models/CTUserMO.m; sourceTree = ""; }; - 904F0809DDBDD45452F46CE7DF8D931D /* CTHalfInterstitialImageViewController.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = CTHalfInterstitialImageViewController.m; path = CleverTapSDK/InApps/CTHalfInterstitialImageViewController.m; sourceTree = ""; }; - 9061233A283F25428E131229D097643A /* CTProductConfigController.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = CTProductConfigController.h; path = CleverTapSDK/ProductConfig/controllers/CTProductConfigController.h; sourceTree = ""; }; - 90A4753BB9D2D9F51791019C111E1974 /* UIImage+ExtendedCacheData.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIImage+ExtendedCacheData.h"; path = "SDWebImage/Core/UIImage+ExtendedCacheData.h"; sourceTree = ""; }; - 91B47255C79FDBA4494F1FFEE7A53442 /* CTPinnedNSURLSessionDelegate.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = CTPinnedNSURLSessionDelegate.h; path = CleverTapSDK/CTPinnedNSURLSessionDelegate.h; sourceTree = ""; }; - 922AC66290629750330762EF26ABC328 /* CleverTap+ProductConfig.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "CleverTap+ProductConfig.h"; path = "CleverTapSDK/CleverTap+ProductConfig.h"; sourceTree = ""; }; - 93A5DBECA299C2A050495326C865A719 /* CTUIUtils.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = CTUIUtils.m; path = CleverTapSDK/CTUIUtils.m; sourceTree = ""; }; - 944EB67D9B36E082D7786C76971921D1 /* CTInboxBaseMessageCell.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = CTInboxBaseMessageCell.h; path = CleverTapSDK/Inbox/cells/CTInboxBaseMessageCell.h; sourceTree = ""; }; - 978762EA9EB02FDC6F4A9E3B2A6C378E /* SDWebImage-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "SDWebImage-dummy.m"; sourceTree = ""; }; - 97E3F1FCE047B474B9F785B15E37781B /* CTCarouselImageView.xib */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = file.xib; name = CTCarouselImageView.xib; path = CleverTapSDK/Inbox/resources/CTCarouselImageView.xib; sourceTree = ""; }; - 985DA9E246CF3DD086492BF78060EC44 /* CTLocationManager.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = CTLocationManager.h; path = CleverTapSDK/CTLocationManager.h; sourceTree = ""; }; - 987CE7D5996C3B229063E4AB97057CA3 /* CTFooterViewController~ipad.xib */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = file.xib; name = "CTFooterViewController~ipad.xib"; path = "CleverTapSDK/InApps/resources/CTFooterViewController~ipad.xib"; sourceTree = ""; }; - 988515B25BD9E8D28BFB99AAF8B9523A /* CTHeaderViewController~iphoneport.xib */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = file.xib; name = "CTHeaderViewController~iphoneport.xib"; path = "CleverTapSDK/InApps/resources/CTHeaderViewController~iphoneport.xib"; sourceTree = ""; }; - 98F13508A29E678B97ADC29B892300A9 /* UIImage+Transform.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIImage+Transform.h"; path = "SDWebImage/Core/UIImage+Transform.h"; sourceTree = ""; }; - 9945501E0365FC997B20049C64EA4E88 /* CTCoverViewController~iphoneland.xib */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = file.xib; name = "CTCoverViewController~iphoneland.xib"; path = "CleverTapSDK/InApps/resources/CTCoverViewController~iphoneland.xib"; sourceTree = ""; }; + 7E2A239FE561CD142A1ECC72B363ACBE /* CTValidator.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = CTValidator.h; path = CleverTapSDK/CTValidator.h; sourceTree = ""; }; + 7E6641952F300E5604649DFF6C8B427D /* CTNotificationButton.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = CTNotificationButton.h; path = CleverTapSDK/CTNotificationButton.h; sourceTree = ""; }; + 7ED458B04C3A8C383519FF7BF38D88EA /* CTUserMO.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = CTUserMO.h; path = CleverTapSDK/Inbox/models/CTUserMO.h; sourceTree = ""; }; + 7F18856EB43920E1377504E0E79A2410 /* SDImageAWebPCoder.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDImageAWebPCoder.m; path = SDWebImage/Core/SDImageAWebPCoder.m; sourceTree = ""; }; + 7F457C8F245828D2FB9C428C43743DA0 /* CTAVPlayerViewController.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = CTAVPlayerViewController.h; path = CleverTapSDK/InApps/CTAVPlayerViewController.h; sourceTree = ""; }; + 7F72BE1573DD68EF528B919FA972994B /* CleverTap+InAppNotifications.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "CleverTap+InAppNotifications.h"; path = "CleverTapSDK/CleverTap+InAppNotifications.h"; sourceTree = ""; }; + 80142AD22D875552DC2089615F2E9096 /* CTMessageMO.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = CTMessageMO.h; path = CleverTapSDK/Inbox/models/CTMessageMO.h; sourceTree = ""; }; + 815017DE486E64617014A132A508D88A /* CleverTapConfigValue.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = CleverTapConfigValue.m; path = CleverTapSDK/ProductConfig/models/CleverTapConfigValue.m; sourceTree = ""; }; + 8274E6DFCE06CD2983D581CA84EE52AF /* CTLocalDataStore.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = CTLocalDataStore.h; path = CleverTapSDK/CTLocalDataStore.h; sourceTree = ""; }; + 82AAAB32EFF03DF50DE0F3BDE9E08B77 /* SDWebImagePrefetcher.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDWebImagePrefetcher.h; path = SDWebImage/Core/SDWebImagePrefetcher.h; sourceTree = ""; }; + 82CCB4A1C98F8D633AE3AEE14C953C21 /* CTRequestFactory.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = CTRequestFactory.m; path = CleverTapSDK/CTRequestFactory.m; sourceTree = ""; }; + 8356190F1BBFC342C1D5C7369D99B19A /* CTFooterViewController~iphoneport.xib */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = file.xib; name = "CTFooterViewController~iphoneport.xib"; path = "CleverTapSDK/InApps/resources/CTFooterViewController~iphoneport.xib"; sourceTree = ""; }; + 83B72672CFF90E84BE416ACB8A78A3CF /* CleverTapDisplayUnitContent.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = CleverTapDisplayUnitContent.m; path = CleverTapSDK/DisplayUnit/models/CleverTapDisplayUnitContent.m; sourceTree = ""; }; + 847E606DDA0501FED4C32EA8E7804847 /* CTProductConfigController.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = CTProductConfigController.m; path = CleverTapSDK/ProductConfig/controllers/CTProductConfigController.m; sourceTree = ""; }; + 84CF436789724132021361D5B790596C /* UIImage+ForceDecode.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIImage+ForceDecode.m"; path = "SDWebImage/Core/UIImage+ForceDecode.m"; sourceTree = ""; }; + 85C2AC280BB3BBA0A7099C7445ED2595 /* CTCarouselMessageCell.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = CTCarouselMessageCell.m; path = CleverTapSDK/Inbox/cells/CTCarouselMessageCell.m; sourceTree = ""; }; + 8758D25C574A6464BCC80D8AAA3B42CC /* ct_default_audio.png */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = image.png; name = ct_default_audio.png; path = CleverTapSDK/Inbox/resources/ct_default_audio.png; sourceTree = ""; }; + 8841E719304AED7FA8CD67FE2F5359EC /* CTKnownProfileFields.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = CTKnownProfileFields.h; path = CleverTapSDK/CTKnownProfileFields.h; sourceTree = ""; }; + 88EED7FE2B8CDF0BF33275065C84E390 /* CTCoverImageViewController.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = CTCoverImageViewController.m; path = CleverTapSDK/InApps/CTCoverImageViewController.m; sourceTree = ""; }; + 899332218ABE7C9D64AEADC9C7F09D8B /* SDCallbackQueue.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDCallbackQueue.m; path = SDWebImage/Core/SDCallbackQueue.m; sourceTree = ""; }; + 89A4A1D859679A14C7756799D2A64578 /* CTVariables.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = CTVariables.m; path = CleverTapSDK/ProductExperiences/CTVariables.m; sourceTree = ""; }; + 8A45FF12EC2F124EEDC357886E36B47C /* CTInAppDisplayViewController.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = CTInAppDisplayViewController.m; path = CleverTapSDK/CTInAppDisplayViewController.m; sourceTree = ""; }; + 8AE9EEF963884F0F8D15FBFC7EEDEF1D /* CTFlexibleIdentityRepo.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = CTFlexibleIdentityRepo.m; path = CleverTapSDK/CTFlexibleIdentityRepo.m; sourceTree = ""; }; + 8B3743F53459AA3B740D28D8A8E8AFC9 /* ic_play@3x.png */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = image.png; name = "ic_play@3x.png"; path = "CleverTapSDK/Inbox/resources/ic_play@3x.png"; sourceTree = ""; }; + 8B8A38B4B2F7F2FC0C9470E8D7C0A55E /* CTHeaderViewController.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = CTHeaderViewController.h; path = CleverTapSDK/InApps/CTHeaderViewController.h; sourceTree = ""; }; + 8BD9C6B29E77B47E5D45CAC17B6309C1 /* SDImageAssetManager.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDImageAssetManager.h; path = SDWebImage/Private/SDImageAssetManager.h; sourceTree = ""; }; + 8D4CFD8D6B56BA8EC83D432EB9E29754 /* SDImageIOCoder.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDImageIOCoder.h; path = SDWebImage/Core/SDImageIOCoder.h; sourceTree = ""; }; + 8DF6936C17771D67FA2F2AEEFC3FF355 /* CTHalfInterstitialViewController.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = CTHalfInterstitialViewController.m; path = CleverTapSDK/InApps/CTHalfInterstitialViewController.m; sourceTree = ""; }; + 8E7A34655DECA81F9433460ED57974CF /* CleverTap+SCDomain.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "CleverTap+SCDomain.h"; path = "CleverTapSDK/CleverTap+SCDomain.h"; sourceTree = ""; }; + 8E9F8F922FB769E9F3BDBA38BDFAB227 /* CleverTapEventDetail.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = CleverTapEventDetail.m; path = CleverTapSDK/CleverTapEventDetail.m; sourceTree = ""; }; + 8ED26E4A9F0A0D8C6019314BA10BC0A3 /* SDWebImageDownloaderConfig.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDWebImageDownloaderConfig.h; path = SDWebImage/Core/SDWebImageDownloaderConfig.h; sourceTree = ""; }; + 8EF48B79E99B4A350CEC53C1BBF7698E /* CTRequest.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = CTRequest.m; path = CleverTapSDK/CTRequest.m; sourceTree = ""; }; + 8EF5DA4387044BA3EC3ACB6FF972757D /* SDImageCachesManager.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDImageCachesManager.m; path = SDWebImage/Core/SDImageCachesManager.m; sourceTree = ""; }; + 8F960235F3FB5DFAA27E4480B1EEA073 /* NSBezierPath+SDRoundedCorners.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "NSBezierPath+SDRoundedCorners.m"; path = "SDWebImage/Private/NSBezierPath+SDRoundedCorners.m"; sourceTree = ""; }; + 9005C3A85A2F01CD4DBB8C7C454E5848 /* CTUIUtils.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = CTUIUtils.m; path = CleverTapSDK/CTUIUtils.m; sourceTree = ""; }; + 9058F96D704819B2A0F6684B39B0C099 /* SDWebImageOperation.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDWebImageOperation.m; path = SDWebImage/Core/SDWebImageOperation.m; sourceTree = ""; }; + 9134BB07DEE17A273B116DC22C5CE8ED /* SDAnimatedImageRep.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDAnimatedImageRep.m; path = SDWebImage/Core/SDAnimatedImageRep.m; sourceTree = ""; }; + 9223119A5F096C85DC8630F36CC41AB4 /* SDImageCacheConfig.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDImageCacheConfig.m; path = SDWebImage/Core/SDImageCacheConfig.m; sourceTree = ""; }; + 92B69B0DEB40C442AB2ADC07B34BC85B /* SDWebImageManager.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDWebImageManager.m; path = SDWebImage/Core/SDWebImageManager.m; sourceTree = ""; }; + 92C3F7D4BBB4CD445655F3E37F835E08 /* CTHalfInterstitialImageViewController~ipad.xib */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = file.xib; name = "CTHalfInterstitialImageViewController~ipad.xib"; path = "CleverTapSDK/InApps/resources/CTHalfInterstitialImageViewController~ipad.xib"; sourceTree = ""; }; + 92D3AC6F9BEF3101CD0789592594E2DD /* CTHalfInterstitialViewController~iphoneport.xib */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = file.xib; name = "CTHalfInterstitialViewController~iphoneport.xib"; path = "CleverTapSDK/InApps/resources/CTHalfInterstitialViewController~iphoneport.xib"; sourceTree = ""; }; + 9443631DDD8A059339660AB9FEA1C118 /* CTFlexibleIdentityRepo.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = CTFlexibleIdentityRepo.h; path = CleverTapSDK/CTFlexibleIdentityRepo.h; sourceTree = ""; }; + 966D64D7B66169014F8898D7F50D10DA /* CleverTapInboxViewControllerPrivate.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = CleverTapInboxViewControllerPrivate.h; path = CleverTapSDK/Inbox/controllers/CleverTapInboxViewControllerPrivate.h; sourceTree = ""; }; + 969396169355A8FFC202FCBD4F9DED20 /* CleverTap-iOS-SDK.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "CleverTap-iOS-SDK.release.xcconfig"; sourceTree = ""; }; + 96B641C4C300927F8E23F5FB9593879E /* CleverTapUTMDetail.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = CleverTapUTMDetail.h; path = CleverTapSDK/CleverTapUTMDetail.h; sourceTree = ""; }; + 96D6D2BC06B95F102A95219E63B3DCEE /* CTUserMO+CoreDataProperties.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "CTUserMO+CoreDataProperties.h"; path = "CleverTapSDK/Inbox/models/CTUserMO+CoreDataProperties.h"; sourceTree = ""; }; + 9970C584C403F5B21B04B51E5BD9141A /* SDAnimatedImageView+WebCache.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "SDAnimatedImageView+WebCache.m"; path = "SDWebImage/Core/SDAnimatedImageView+WebCache.m"; sourceTree = ""; }; 9AB883AEAA49DF8F751FE06DE22DD69C /* CleverTap-iOS-SDK-CleverTapSDK */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; name = "CleverTap-iOS-SDK-CleverTapSDK"; path = CleverTapSDK.bundle; sourceTree = BUILT_PRODUCTS_DIR; }; - 9AEC614EA871320A2EE1021421EF9A8F /* SDImageCodersManager.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDImageCodersManager.m; path = SDWebImage/Core/SDImageCodersManager.m; sourceTree = ""; }; - 9AF1D56FF26ED67B5DBEB3984242C583 /* SDAnimatedImageView+WebCache.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "SDAnimatedImageView+WebCache.m"; path = "SDWebImage/Core/SDAnimatedImageView+WebCache.m"; sourceTree = ""; }; - 9B50932D61BE49387712ACFA36D272C2 /* CleverTapInboxViewController.xib */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = file.xib; name = CleverTapInboxViewController.xib; path = CleverTapSDK/Inbox/resources/CleverTapInboxViewController.xib; sourceTree = ""; }; - 9BB6777553FFD129A1D3D985F5EB85E9 /* CleverTapUTMDetail.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = CleverTapUTMDetail.h; path = CleverTapSDK/CleverTapUTMDetail.h; sourceTree = ""; }; - 9BBC3F495C6E7F4FF85301A22CC95FE7 /* ct_volume_on.png */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = image.png; name = ct_volume_on.png; path = CleverTapSDK/Inbox/resources/ct_volume_on.png; sourceTree = ""; }; - 9C242DBB319B050770DF72E679427AFA /* SDWebImageError.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDWebImageError.m; path = SDWebImage/Core/SDWebImageError.m; sourceTree = ""; }; - 9C48F24B861E6453ADBED947235E486A /* UIImageView+WebCache.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIImageView+WebCache.m"; path = "SDWebImage/Core/UIImageView+WebCache.m"; sourceTree = ""; }; - 9C9B9032EFD98FE57E90584B9DAA8289 /* SDImageHEICCoder.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDImageHEICCoder.h; path = SDWebImage/Core/SDImageHEICCoder.h; sourceTree = ""; }; - 9D3871DA8784E9C9EB3AB8E0B268D240 /* CleverTapFeatureFlagsPrivate.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = CleverTapFeatureFlagsPrivate.h; path = CleverTapSDK/FeatureFlags/models/CleverTapFeatureFlagsPrivate.h; sourceTree = ""; }; + 9B91ABC4FE767EF9B29524FE05FE3B05 /* SDWebImagePrefetcher.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDWebImagePrefetcher.m; path = SDWebImage/Core/SDWebImagePrefetcher.m; sourceTree = ""; }; + 9BA5B095E2FB7AA6951152FAB3E83B14 /* SDWebImageDownloaderOperation.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDWebImageDownloaderOperation.m; path = SDWebImage/Core/SDWebImageDownloaderOperation.m; sourceTree = ""; }; + 9BC2E660550CD31850654E4D1D1930CB /* UIImage+GIF.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIImage+GIF.m"; path = "SDWebImage/Core/UIImage+GIF.m"; sourceTree = ""; }; + 9CDC91F1D9F6E8E4C530871882C4F595 /* SDImageLoader.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDImageLoader.m; path = SDWebImage/Core/SDImageLoader.m; sourceTree = ""; }; + 9D365959CFBAC3B28AA36A62B12732A5 /* CTValidationResultStack.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = CTValidationResultStack.m; path = CleverTapSDK/CTValidationResultStack.m; sourceTree = ""; }; + 9D56861E6126AA861F16F7B99F7A80C6 /* NSImage+Compatibility.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "NSImage+Compatibility.m"; path = "SDWebImage/Core/NSImage+Compatibility.m"; sourceTree = ""; }; 9D940727FF8FB9C785EB98E56350EF41 /* Podfile */ = {isa = PBXFileReference; explicitFileType = text.script.ruby; includeInIndex = 1; indentWidth = 2; lastKnownFileType = text; name = Podfile; path = ../Podfile; sourceTree = SOURCE_ROOT; tabWidth = 2; xcLanguageSpecificationIdentifier = xcode.lang.ruby; }; - 9E7B36DC74428213BA270533C9DEE3E3 /* CTIdentityRepo.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = CTIdentityRepo.h; path = CleverTapSDK/CTIdentityRepo.h; sourceTree = ""; }; - 9FB5856B3BFB7FBD78D8E03DCE916265 /* SDWebImageDownloaderRequestModifier.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDWebImageDownloaderRequestModifier.h; path = SDWebImage/Core/SDWebImageDownloaderRequestModifier.h; sourceTree = ""; }; - A0519B1B3CE3CB1392ADF8F19A017255 /* CTValidationResultStack.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = CTValidationResultStack.m; path = CleverTapSDK/CTValidationResultStack.m; sourceTree = ""; }; - A067903B414F581D6FF39779F05D6E36 /* CTLogger.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = CTLogger.h; path = CleverTapSDK/CTLogger.h; sourceTree = ""; }; - A077996AAE18318A5E592ADE7EB6B517 /* SDWebImageDefine.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDWebImageDefine.m; path = SDWebImage/Core/SDWebImageDefine.m; sourceTree = ""; }; - A0E97F9E705E445B8D70BB3A85BE02C4 /* SDAssociatedObject.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDAssociatedObject.m; path = SDWebImage/Private/SDAssociatedObject.m; sourceTree = ""; }; - A1AF65418FE77B2BE1D118E253E9BC84 /* CTValidationResult.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = CTValidationResult.h; path = CleverTapSDK/CTValidationResult.h; sourceTree = ""; }; - A1EEA48BFB33AA05D5E490E3101D0C35 /* CTHalfInterstitialViewController~ipadland.xib */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = file.xib; name = "CTHalfInterstitialViewController~ipadland.xib"; path = "CleverTapSDK/InApps/resources/CTHalfInterstitialViewController~ipadland.xib"; sourceTree = ""; }; - A296FFEC70040B26528114F1BBC673F9 /* SDmetamacros.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDmetamacros.h; path = SDWebImage/Private/SDmetamacros.h; sourceTree = ""; }; - A2A996AE88DCC08122226D17D57548DD /* CTInAppHTMLViewController.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = CTInAppHTMLViewController.m; path = CleverTapSDK/InApps/CTInAppHTMLViewController.m; sourceTree = ""; }; - A2C245205003347F82BCB23E1C18B9C1 /* CTHeaderViewController.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = CTHeaderViewController.m; path = CleverTapSDK/InApps/CTHeaderViewController.m; sourceTree = ""; }; - A3438026E12106F44F01403432CFF22B /* CTCoverViewController.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = CTCoverViewController.m; path = CleverTapSDK/InApps/CTCoverViewController.m; sourceTree = ""; }; - A46DFEF103DBD055CFE37D69064D9616 /* SDWebImageTransition.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDWebImageTransition.h; path = SDWebImage/Core/SDWebImageTransition.h; sourceTree = ""; }; - A4B3ED3132AD0331B5BA77C3B125CBB4 /* CleverTap+InAppNotifications.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "CleverTap+InAppNotifications.h"; path = "CleverTapSDK/CleverTap+InAppNotifications.h"; sourceTree = ""; }; - A56BD3B3C80A362ABEAB62ADCAF27365 /* SDImageCoder.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDImageCoder.m; path = SDWebImage/Core/SDImageCoder.m; sourceTree = ""; }; - A603D557BEB6BB43E45C56310542F265 /* CleverTapInAppNotificationDelegate.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = CleverTapInAppNotificationDelegate.h; path = CleverTapSDK/CleverTapInAppNotificationDelegate.h; sourceTree = ""; }; - A625274681FC0C6ED2D1F234C4242D96 /* CTSwipeView.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = CTSwipeView.h; path = CleverTapSDK/Inbox/views/CTSwipeView.h; sourceTree = ""; }; - A6E10B8976F63DB134390870DB4C3325 /* CTCarouselImageView.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = CTCarouselImageView.m; path = CleverTapSDK/Inbox/views/CTCarouselImageView.m; sourceTree = ""; }; - A727AC487F509F17E9A49152D5DA8ED0 /* UIImageView+WebCache.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIImageView+WebCache.h"; path = "SDWebImage/Core/UIImageView+WebCache.h"; sourceTree = ""; }; - A73649EFF82580D38E3F79F61D4F6870 /* CTCoverImageViewController.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = CTCoverImageViewController.m; path = CleverTapSDK/InApps/CTCoverImageViewController.m; sourceTree = ""; }; - A7CEA0AE86662D5C6ADF880963697AE6 /* CTPinnedNSURLSessionDelegate.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = CTPinnedNSURLSessionDelegate.m; path = CleverTapSDK/CTPinnedNSURLSessionDelegate.m; sourceTree = ""; }; - A7FC5F2B781F1E802ADAE536FFB6157E /* CleverTap+PushPermission.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "CleverTap+PushPermission.h"; path = "CleverTapSDK/CleverTap+PushPermission.h"; sourceTree = ""; }; - A915A0FF4A83C350C24ACCD31658F3A9 /* SDWebImageTransitionInternal.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDWebImageTransitionInternal.h; path = SDWebImage/Private/SDWebImageTransitionInternal.h; sourceTree = ""; }; - A91F72EA20CFAB8860E455B57D684CB4 /* UIView+WebCache.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIView+WebCache.h"; path = "SDWebImage/Core/UIView+WebCache.h"; sourceTree = ""; }; - A92115ED235E1A875EE46AA6978A7D92 /* UIView+WebCacheOperation.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIView+WebCacheOperation.h"; path = "SDWebImage/Core/UIView+WebCacheOperation.h"; sourceTree = ""; }; - AA0104B1645FCE465F8C23B26FB8D294 /* CTCarouselMessageCell~port.xib */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = file.xib; name = "CTCarouselMessageCell~port.xib"; path = "CleverTapSDK/Inbox/resources/CTCarouselMessageCell~port.xib"; sourceTree = ""; }; - AA3E0F69C4929916311ECE94BA0AD547 /* CTInterstitialImageViewController~iphoneland.xib */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = file.xib; name = "CTInterstitialImageViewController~iphoneland.xib"; path = "CleverTapSDK/InApps/resources/CTInterstitialImageViewController~iphoneland.xib"; sourceTree = ""; }; - AB9AF8983D11AFF26E8D5B7247E3BFB6 /* UIView+CTToast.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIView+CTToast.m"; path = "CleverTapSDK/Inbox/views/UIView+CTToast.m"; sourceTree = ""; }; - AC4EF2CBFDE0A70BCA25525D5056A4E4 /* CTInboxIconMessageCell.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = CTInboxIconMessageCell.m; path = CleverTapSDK/Inbox/cells/CTInboxIconMessageCell.m; sourceTree = ""; }; - AC86ED680E7D9D0507D35341011AD6C4 /* CTFooterViewController.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = CTFooterViewController.h; path = CleverTapSDK/InApps/CTFooterViewController.h; sourceTree = ""; }; - AC8BBA70E2E95FDB4BA0944100C1D446 /* CTNotificationButton.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = CTNotificationButton.m; path = CleverTapSDK/CTNotificationButton.m; sourceTree = ""; }; - ACB4A110AD3840CDDFB1EACAD39F6FFD /* CTUserMO+CoreDataProperties.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "CTUserMO+CoreDataProperties.h"; path = "CleverTapSDK/Inbox/models/CTUserMO+CoreDataProperties.h"; sourceTree = ""; }; - AD990BCAAC5994523FA1F32A3EE4426E /* SDImageCacheConfig.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDImageCacheConfig.m; path = SDWebImage/Core/SDImageCacheConfig.m; sourceTree = ""; }; - AE5009351D59DDA739F20E23F66DAC08 /* CleverTapProductConfigPrivate.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = CleverTapProductConfigPrivate.h; path = CleverTapSDK/ProductConfig/models/CleverTapProductConfigPrivate.h; sourceTree = ""; }; - AE73A51DB637DE91619FDD0DF9F419F7 /* SDWebImageDownloaderDecryptor.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDWebImageDownloaderDecryptor.h; path = SDWebImage/Core/SDWebImageDownloaderDecryptor.h; sourceTree = ""; }; - AF34EB8844737AB2B131CF2B93EDDFFC /* CTInAppFCManager.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = CTInAppFCManager.h; path = CleverTapSDK/CTInAppFCManager.h; sourceTree = ""; }; - AF9B9F9007EDBD8F51DFF63D0E646C33 /* CTValidator.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = CTValidator.h; path = CleverTapSDK/CTValidator.h; sourceTree = ""; }; - B009E769BD71FA9044E3F54AD16E160C /* SDImageLoadersManager.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDImageLoadersManager.h; path = SDWebImage/Core/SDImageLoadersManager.h; sourceTree = ""; }; - B030A516E775005559E47796D5A29D6B /* CTCoverViewController~iphoneport.xib */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = file.xib; name = "CTCoverViewController~iphoneport.xib"; path = "CleverTapSDK/InApps/resources/CTCoverViewController~iphoneport.xib"; sourceTree = ""; }; + 9DF0A0A3A4355D1B45BDDD11C05A7D64 /* SDWebImageCacheKeyFilter.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDWebImageCacheKeyFilter.m; path = SDWebImage/Core/SDWebImageCacheKeyFilter.m; sourceTree = ""; }; + 9E1C1344106FB036B19AAE79D5FF8983 /* CTFooterViewController~ipadland.xib */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = file.xib; name = "CTFooterViewController~ipadland.xib"; path = "CleverTapSDK/InApps/resources/CTFooterViewController~ipadland.xib"; sourceTree = ""; }; + 9E5849BB1971C0E916A88560C4C7BC7D /* CTImageInAppViewController.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = CTImageInAppViewController.h; path = CleverTapSDK/InApps/CTImageInAppViewController.h; sourceTree = ""; }; + 9F153855870EB67B7CAF4D6056C53EA5 /* CTInboxSimpleMessageCell.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = CTInboxSimpleMessageCell.h; path = CleverTapSDK/Inbox/cells/CTInboxSimpleMessageCell.h; sourceTree = ""; }; + 9F93FB6C98B83B0779436D3FB5258689 /* SDWeakProxy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDWeakProxy.m; path = SDWebImage/Private/SDWeakProxy.m; sourceTree = ""; }; + A00DE791EE1ACCEE67F26E19133FD958 /* CleverTapInboxViewController.xib */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = file.xib; name = CleverTapInboxViewController.xib; path = CleverTapSDK/Inbox/resources/CleverTapInboxViewController.xib; sourceTree = ""; }; + A01E8D306DD807DD70EE6C69EA745B42 /* CTCoverImageViewController.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = CTCoverImageViewController.h; path = CleverTapSDK/InApps/CTCoverImageViewController.h; sourceTree = ""; }; + A126E40197C1858FA6457DE6B54E59B6 /* UIImage+ExtendedCacheData.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIImage+ExtendedCacheData.m"; path = "SDWebImage/Core/UIImage+ExtendedCacheData.m"; sourceTree = ""; }; + A161E7A48EFA8B5FEC7C634021047885 /* UIImage+Metadata.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIImage+Metadata.m"; path = "SDWebImage/Core/UIImage+Metadata.m"; sourceTree = ""; }; + A19C8F469E737A7E50E3D8FFD84D0F9E /* CTInAppNotification.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = CTInAppNotification.m; path = CleverTapSDK/CTInAppNotification.m; sourceTree = ""; }; + A19F4BF77B408E8B0A84040132B9FFB1 /* CTHeaderViewController~ipadland.xib */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = file.xib; name = "CTHeaderViewController~ipadland.xib"; path = "CleverTapSDK/InApps/resources/CTHeaderViewController~ipadland.xib"; sourceTree = ""; }; + A2384129049A308CD42673162F103FA3 /* SDImageCachesManagerOperation.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDImageCachesManagerOperation.m; path = SDWebImage/Private/SDImageCachesManagerOperation.m; sourceTree = ""; }; + A2ED29FDDB9333449AFB73E3AFB35B18 /* CTHalfInterstitialViewController~iphoneland.xib */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = file.xib; name = "CTHalfInterstitialViewController~iphoneland.xib"; path = "CleverTapSDK/InApps/resources/CTHalfInterstitialViewController~iphoneland.xib"; sourceTree = ""; }; + A39DF340D84D623CE95198E813190AB8 /* SDWebImageError.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDWebImageError.m; path = SDWebImage/Core/SDWebImageError.m; sourceTree = ""; }; + A3B755830D786D72BBDE8DB5E6B2D97E /* SDWebImageDownloaderRequestModifier.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDWebImageDownloaderRequestModifier.m; path = SDWebImage/Core/SDWebImageDownloaderRequestModifier.m; sourceTree = ""; }; + A506B300096DCFD3B2B39405F54DA2E1 /* SDCallbackQueue.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDCallbackQueue.h; path = SDWebImage/Core/SDCallbackQueue.h; sourceTree = ""; }; + A5BE04E1E85046672FBC8409E5807B6A /* CTHalfInterstitialViewController.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = CTHalfInterstitialViewController.h; path = CleverTapSDK/InApps/CTHalfInterstitialViewController.h; sourceTree = ""; }; + A722ECA0B946FDE37FB9EAC131884F82 /* CTPinnedNSURLSessionDelegate.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = CTPinnedNSURLSessionDelegate.m; path = CleverTapSDK/CTPinnedNSURLSessionDelegate.m; sourceTree = ""; }; + A72A36156A912C94BAA848695334EC41 /* CTInAppDisplayViewControllerPrivate.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = CTInAppDisplayViewControllerPrivate.h; path = CleverTapSDK/CTInAppDisplayViewControllerPrivate.h; sourceTree = ""; }; + A793776127A3B47D8D12E6B6010F8305 /* CTInboxSimpleMessageCell~port.xib */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = file.xib; name = "CTInboxSimpleMessageCell~port.xib"; path = "CleverTapSDK/Inbox/resources/CTInboxSimpleMessageCell~port.xib"; sourceTree = ""; }; + A7F188562C55AF10922CE49A375732AD /* CTEventBuilder.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = CTEventBuilder.h; path = CleverTapSDK/CTEventBuilder.h; sourceTree = ""; }; + A8494B03486B2A5CDF3892C72F7F4AD6 /* UIView+CTToast.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIView+CTToast.h"; path = "CleverTapSDK/Inbox/views/UIView+CTToast.h"; sourceTree = ""; }; + A9AA6C8FB8C1E437FCCF5E2787DFC945 /* SDImageCacheConfig.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDImageCacheConfig.h; path = SDWebImage/Core/SDImageCacheConfig.h; sourceTree = ""; }; + A9D30C8B7D1C43AE1F39FD51D4B08273 /* CTValidationResult.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = CTValidationResult.m; path = CleverTapSDK/CTValidationResult.m; sourceTree = ""; }; + A9FA4C69177025693373FF18DE32587C /* UIView+WebCacheOperation.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIView+WebCacheOperation.h"; path = "SDWebImage/Core/UIView+WebCacheOperation.h"; sourceTree = ""; }; + AA0089F8E773D817B5D8800B77B7D580 /* CTProductConfigController.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = CTProductConfigController.h; path = CleverTapSDK/ProductConfig/controllers/CTProductConfigController.h; sourceTree = ""; }; + AA5942DD1227A4548F507E92FF8094FB /* CTInboxController.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = CTInboxController.h; path = CleverTapSDK/Inbox/controllers/CTInboxController.h; sourceTree = ""; }; + AA6660AAEBCAF9D8645A2FC707EE87FA /* CTHalfInterstitialImageViewController~iphoneland.xib */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = file.xib; name = "CTHalfInterstitialImageViewController~iphoneland.xib"; path = "CleverTapSDK/InApps/resources/CTHalfInterstitialImageViewController~iphoneland.xib"; sourceTree = ""; }; + AAB240153BB1C2FE15F57B45E2402E8B /* SDImageCacheDefine.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDImageCacheDefine.h; path = SDWebImage/Core/SDImageCacheDefine.h; sourceTree = ""; }; + ABED33F1106EC51CD6487BD70D6E507C /* CleverTap-iOS-SDK-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "CleverTap-iOS-SDK-prefix.pch"; sourceTree = ""; }; + AD3389FCCB97A8B643FE0B72D4910E9C /* CleverTap+FeatureFlags.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "CleverTap+FeatureFlags.h"; path = "CleverTapSDK/CleverTap+FeatureFlags.h"; sourceTree = ""; }; + AD786A5A50AD9691BC5833F0FB72D171 /* CTInboxIconMessageCell~port.xib */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = file.xib; name = "CTInboxIconMessageCell~port.xib"; path = "CleverTapSDK/Inbox/resources/CTInboxIconMessageCell~port.xib"; sourceTree = ""; }; + AE4DED403729CEB9D785359DECA70962 /* SDImageAssetManager.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDImageAssetManager.m; path = SDWebImage/Private/SDImageAssetManager.m; sourceTree = ""; }; + AE63C5E4788D3C82980131B21AECB899 /* CTCarouselMessageCell~land.xib */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = file.xib; name = "CTCarouselMessageCell~land.xib"; path = "CleverTapSDK/Inbox/resources/CTCarouselMessageCell~land.xib"; sourceTree = ""; }; + AEB5505CF6F5BC0AEE9EE21CA9C15B55 /* SDAsyncBlockOperation.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDAsyncBlockOperation.h; path = SDWebImage/Private/SDAsyncBlockOperation.h; sourceTree = ""; }; + AECC5FFB054750810D65324CD9C840ED /* CTInterstitialViewController~iphoneport.xib */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = file.xib; name = "CTInterstitialViewController~iphoneport.xib"; path = "CleverTapSDK/InApps/resources/CTInterstitialViewController~iphoneport.xib"; sourceTree = ""; }; + B0304615B87F014C7A2F955472AAA872 /* UIView+WebCache.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIView+WebCache.h"; path = "SDWebImage/Core/UIView+WebCache.h"; sourceTree = ""; }; + B06FBB54D9B7EE80723DCAC355B68688 /* SDImageLoadersManager.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDImageLoadersManager.m; path = SDWebImage/Core/SDImageLoadersManager.m; sourceTree = ""; }; + B09F4F4A7C6E3636869E687C31D1953A /* CTInboxUtils.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = CTInboxUtils.h; path = CleverTapSDK/Inbox/models/CTInboxUtils.h; sourceTree = ""; }; B0B214D775196BA7CA8E17E53048A493 /* SDWebImage */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; name = SDWebImage; path = libSDWebImage.a; sourceTree = BUILT_PRODUCTS_DIR; }; - B4CCEA7B9AB8179243AA7BCF8F1843F0 /* SDImageLoader.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDImageLoader.h; path = SDWebImage/Core/SDImageLoader.h; sourceTree = ""; }; - B690B9F84A31E9F854FF89C3D705D0DC /* ic_pause@1x.png */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = image.png; name = "ic_pause@1x.png"; path = "CleverTapSDK/Inbox/resources/ic_pause@1x.png"; sourceTree = ""; }; - B7C1680AAA74DE1A0B177AD8C9FB8869 /* CleverTapBuildInfo.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = CleverTapBuildInfo.h; path = CleverTapSDK/CleverTapBuildInfo.h; sourceTree = ""; }; - B85CE196B1296602AA96E529922802AF /* SDGraphicsImageRenderer.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDGraphicsImageRenderer.h; path = SDWebImage/Core/SDGraphicsImageRenderer.h; sourceTree = ""; }; - B8DBB11FA7CB9D4340893CF701EABAEF /* SDImageGraphics.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDImageGraphics.m; path = SDWebImage/Core/SDImageGraphics.m; sourceTree = ""; }; - B91DD3377C64B65B4ADA4319EB97C604 /* SDWebImageDefine.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDWebImageDefine.h; path = SDWebImage/Core/SDWebImageDefine.h; sourceTree = ""; }; - BAB275E090F899F1ADE75280F7AACC83 /* CleverTapInstanceConfig.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = CleverTapInstanceConfig.m; path = CleverTapSDK/CleverTapInstanceConfig.m; sourceTree = ""; }; - BABEA7103F1003968ABDB3DF764238CC /* ic_play@3x.png */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = image.png; name = "ic_play@3x.png"; path = "CleverTapSDK/Inbox/resources/ic_play@3x.png"; sourceTree = ""; }; - BB9C5DC5CC7B5364D54D6531BD109BED /* SDImageHEICCoder.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDImageHEICCoder.m; path = SDWebImage/Core/SDImageHEICCoder.m; sourceTree = ""; }; - BC11B620445B5F2EDD7562B9F0D3ACCD /* CTFooterViewController~iphoneport.xib */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = file.xib; name = "CTFooterViewController~iphoneport.xib"; path = "CleverTapSDK/InApps/resources/CTFooterViewController~iphoneport.xib"; sourceTree = ""; }; - BC21AF264405254C0FD43A3FB3CEA59E /* CTUIUtils.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = CTUIUtils.h; path = CleverTapSDK/CTUIUtils.h; sourceTree = ""; }; - BD1FAA1BC6547C6AA995CA092E834279 /* SDImageGIFCoder.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDImageGIFCoder.h; path = SDWebImage/Core/SDImageGIFCoder.h; sourceTree = ""; }; - BD9A547C62FECAA5332C9009FEA392F7 /* SDImageLoadersManager.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDImageLoadersManager.m; path = SDWebImage/Core/SDImageLoadersManager.m; sourceTree = ""; }; - BDCA5A479CBEF9B892181A5D3815CFF2 /* UIButton+WebCache.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIButton+WebCache.h"; path = "SDWebImage/Core/UIButton+WebCache.h"; sourceTree = ""; }; - BF8EB5EB298FBFB1089E80CFF0FF8322 /* CleverTapEventDetail.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = CleverTapEventDetail.h; path = CleverTapSDK/CleverTapEventDetail.h; sourceTree = ""; }; - BF9912E98C14E90D196DA77E07B76723 /* UIColor+SDHexString.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIColor+SDHexString.h"; path = "SDWebImage/Private/UIColor+SDHexString.h"; sourceTree = ""; }; - C2200CC9B31A0AA14B84B49BA76F4632 /* UIView+CTToast.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIView+CTToast.h"; path = "CleverTapSDK/Inbox/views/UIView+CTToast.h"; sourceTree = ""; }; - C2DA1B452DDA131358935AEE8C933F24 /* CTHeaderViewController~ipad.xib */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = file.xib; name = "CTHeaderViewController~ipad.xib"; path = "CleverTapSDK/InApps/resources/CTHeaderViewController~ipad.xib"; sourceTree = ""; }; - C302AD11805BCA7D0694D6F4243C46A0 /* SDWebImageIndicator.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDWebImageIndicator.h; path = SDWebImage/Core/SDWebImageIndicator.h; sourceTree = ""; }; - C30ABEF34BE8C94244E6988AA930DA2F /* CTBaseHeaderFooterViewControllerPrivate.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = CTBaseHeaderFooterViewControllerPrivate.h; path = CleverTapSDK/InApps/CTBaseHeaderFooterViewControllerPrivate.h; sourceTree = ""; }; - C3D56E91B262BDD2AB866F8D8221D353 /* CleverTapFeatureFlags.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = CleverTapFeatureFlags.m; path = CleverTapSDK/FeatureFlags/models/CleverTapFeatureFlags.m; sourceTree = ""; }; - C44979E07A186F9374A6DE6139F73AAD /* CTUtils.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = CTUtils.h; path = CleverTapSDK/CTUtils.h; sourceTree = ""; }; - C74704433D2A2BFB8FA5832C59912D62 /* SDDeviceHelper.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDDeviceHelper.h; path = SDWebImage/Private/SDDeviceHelper.h; sourceTree = ""; }; - C7F1336788EA894A86B97FD32BC6DFB2 /* SDWebImageCacheSerializer.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDWebImageCacheSerializer.h; path = SDWebImage/Core/SDWebImageCacheSerializer.h; sourceTree = ""; }; - C8CC5FD7542D7CE13085C9CD0413547E /* CTHalfInterstitialImageViewController~iphoneland.xib */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = file.xib; name = "CTHalfInterstitialImageViewController~iphoneland.xib"; path = "CleverTapSDK/InApps/resources/CTHalfInterstitialImageViewController~iphoneland.xib"; sourceTree = ""; }; - C98DC5F1ED12F6D7F1489BA091C2680E /* SDWebImageIndicator.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDWebImageIndicator.m; path = SDWebImage/Core/SDWebImageIndicator.m; sourceTree = ""; }; - C9C499D8DF5F7C1EEADE6640FC5DC95B /* CTLegacyIdentityRepo.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = CTLegacyIdentityRepo.h; path = CleverTapSDK/CTLegacyIdentityRepo.h; sourceTree = ""; }; - CC702A7E27F5806B3298D5C0A8B603AD /* CTFeatureFlagsController.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = CTFeatureFlagsController.h; path = CleverTapSDK/FeatureFlags/controllers/CTFeatureFlagsController.h; sourceTree = ""; }; - CD0B99BF2FA75FC8BB442E62E0C38C7D /* NSData+ImageContentType.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "NSData+ImageContentType.h"; path = "SDWebImage/Core/NSData+ImageContentType.h"; sourceTree = ""; }; - CD4126EE58EA885BC479666CB3445BC3 /* ct_default_video.png */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = image.png; name = ct_default_video.png; path = CleverTapSDK/Inbox/resources/ct_default_video.png; sourceTree = ""; }; - CD88FA18A4C75C7555580BB68DD2E474 /* CTCertificatePinning.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = CTCertificatePinning.h; path = CleverTapSDK/CTCertificatePinning.h; sourceTree = ""; }; - CD8B4D648262E2A7056432B0892C9BB0 /* ct_default_portrait_image.png */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = image.png; name = ct_default_portrait_image.png; path = CleverTapSDK/Inbox/resources/ct_default_portrait_image.png; sourceTree = ""; }; - CD8C3A52AE627F2ED06D9CAC39015E32 /* CleverTap-iOS-SDK.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "CleverTap-iOS-SDK.release.xcconfig"; sourceTree = ""; }; - CDA01F4A78F48C8EC956593EA48BC1C5 /* SDWebImageManager.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDWebImageManager.m; path = SDWebImage/Core/SDWebImageManager.m; sourceTree = ""; }; - CDB7B37365F9AE79F92D0E1B8F54A63B /* SDImageCacheDefine.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDImageCacheDefine.h; path = SDWebImage/Core/SDImageCacheDefine.h; sourceTree = ""; }; - CE1215F8CF4716B38421FC25F0C59C18 /* CleverTapURLDelegate.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = CleverTapURLDelegate.h; path = CleverTapSDK/CleverTapURLDelegate.h; sourceTree = ""; }; - D0CEDCAAE2DED819B7EF2362453BD84D /* NSButton+WebCache.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "NSButton+WebCache.h"; path = "SDWebImage/Core/NSButton+WebCache.h"; sourceTree = ""; }; - D13384AD2FEB16BE536B63612705C56B /* CTLogger.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = CTLogger.m; path = CleverTapSDK/CTLogger.m; sourceTree = ""; }; - D30E57ED6E0D7C3DEA42DADADDCAAE2B /* SDWebImageOptionsProcessor.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDWebImageOptionsProcessor.m; path = SDWebImage/Core/SDWebImageOptionsProcessor.m; sourceTree = ""; }; - D4521A3DE515D4807A308F610B49FA6F /* CTHalfInterstitialViewController.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = CTHalfInterstitialViewController.m; path = CleverTapSDK/InApps/CTHalfInterstitialViewController.m; sourceTree = ""; }; - D62697E5CD8268785798C23669C1224E /* SDImageTransformer.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDImageTransformer.m; path = SDWebImage/Core/SDImageTransformer.m; sourceTree = ""; }; - D643CE43B3EC5A054BC61EDDA110E38B /* SDImageAssetManager.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDImageAssetManager.h; path = SDWebImage/Private/SDImageAssetManager.h; sourceTree = ""; }; - D6918B0BB591EBD8C33645D4641F7F8E /* CTLocationManager.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = CTLocationManager.m; path = CleverTapSDK/CTLocationManager.m; sourceTree = ""; }; - DB8D32DDEF5169BDA55A561A2652A25D /* SDWebImageDownloaderRequestModifier.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDWebImageDownloaderRequestModifier.m; path = SDWebImage/Core/SDWebImageDownloaderRequestModifier.m; sourceTree = ""; }; - DB94804330549717181057300B7F6498 /* SDInternalMacros.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDInternalMacros.m; path = SDWebImage/Private/SDInternalMacros.m; sourceTree = ""; }; - DBC32D282B692DE8B816809C00779D2E /* CTCarouselMessageCell~land.xib */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = file.xib; name = "CTCarouselMessageCell~land.xib"; path = "CleverTapSDK/Inbox/resources/CTCarouselMessageCell~land.xib"; sourceTree = ""; }; + B15E720C0279E0855D9DA4360415E0F4 /* SDFileAttributeHelper.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDFileAttributeHelper.m; path = SDWebImage/Private/SDFileAttributeHelper.m; sourceTree = ""; }; + B16D6EB0AD2B77DBCA9C30AE7D08F8B9 /* SDWebImage-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "SDWebImage-dummy.m"; sourceTree = ""; }; + B187D652574E88A55CA55A8E8C3EF812 /* CTUIUtils.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = CTUIUtils.h; path = CleverTapSDK/CTUIUtils.h; sourceTree = ""; }; + B18A879294BF1D02F8318F5E67C6BCE5 /* CTCoverImageViewController~iphoneport.xib */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = file.xib; name = "CTCoverImageViewController~iphoneport.xib"; path = "CleverTapSDK/InApps/resources/CTCoverImageViewController~iphoneport.xib"; sourceTree = ""; }; + B19E0B4BE29BFF5BC50A0801236C1C33 /* SDImageCachesManagerOperation.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDImageCachesManagerOperation.h; path = SDWebImage/Private/SDImageCachesManagerOperation.h; sourceTree = ""; }; + B1B321FC1147168F2D234C552FDCC19F /* NSDictionary+Extensions.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "NSDictionary+Extensions.h"; path = "CleverTapSDK/NSDictionary+Extensions.h"; sourceTree = ""; }; + B214EAC435EE45FAAF12779FAD983D6E /* CTInterstitialImageViewController~ipad.xib */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = file.xib; name = "CTInterstitialImageViewController~ipad.xib"; path = "CleverTapSDK/InApps/resources/CTInterstitialImageViewController~ipad.xib"; sourceTree = ""; }; + B24EF3897EDEBDBED3E2C24BDC362C42 /* SDDiskCache.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDDiskCache.h; path = SDWebImage/Core/SDDiskCache.h; sourceTree = ""; }; + B26258BD72C158EDE1CC947EAE7C3253 /* ic_pause@1x.png */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = image.png; name = "ic_pause@1x.png"; path = "CleverTapSDK/Inbox/resources/ic_pause@1x.png"; sourceTree = ""; }; + B2D99040AE6765218BD146A3AC55D4B9 /* SDWebImageIndicator.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDWebImageIndicator.m; path = SDWebImage/Core/SDWebImageIndicator.m; sourceTree = ""; }; + B3A0A7FA1917A2F9BD266EA1B248D28A /* CTPinnedNSURLSessionDelegate.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = CTPinnedNSURLSessionDelegate.h; path = CleverTapSDK/CTPinnedNSURLSessionDelegate.h; sourceTree = ""; }; + B3C2D48885392DDAB8C17092E4EAD9B2 /* CTCertificatePinning.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = CTCertificatePinning.m; path = CleverTapSDK/CTCertificatePinning.m; sourceTree = ""; }; + B3D24A0C002E081DAC44AC5CFA0CD927 /* SDImageHEICCoder.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDImageHEICCoder.h; path = SDWebImage/Core/SDImageHEICCoder.h; sourceTree = ""; }; + B503F11D6CAF66334A97EB5FA745C44D /* CleverTapInstanceConfig.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = CleverTapInstanceConfig.m; path = CleverTapSDK/CleverTapInstanceConfig.m; sourceTree = ""; }; + B5709F67519EAD8895496BBD72FA11C7 /* SDImageGraphics.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDImageGraphics.m; path = SDWebImage/Core/SDImageGraphics.m; sourceTree = ""; }; + B65B774BD24CFB3C4E166FA1077BE8C0 /* CleverTap-iOS-SDK.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "CleverTap-iOS-SDK.debug.xcconfig"; sourceTree = ""; }; + B6CF8DC46A0593542A32C1422AF63DA2 /* CTInAppDisplayViewController.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = CTInAppDisplayViewController.h; path = CleverTapSDK/CTInAppDisplayViewController.h; sourceTree = ""; }; + B7910B1C64189A8D0D8851CEF662549D /* CTValidationResultStack.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = CTValidationResultStack.h; path = CleverTapSDK/CTValidationResultStack.h; sourceTree = ""; }; + B987FA4234DB3F9FEC1F86D423CA7CDC /* CTDeviceInfo.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = CTDeviceInfo.h; path = CleverTapSDK/CTDeviceInfo.h; sourceTree = ""; }; + B9B1BF85AE56A05AD46EBE018F6C3738 /* LeanplumCT.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = LeanplumCT.h; path = CleverTapSDK/LeanplumCT.h; sourceTree = ""; }; + B9B69F82E86BC16B140603FDEB70EC7A /* CTVar.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = CTVar.m; path = CleverTapSDK/ProductExperiences/CTVar.m; sourceTree = ""; }; + B9EB6FA72B18630E084FEED4B0D44D3B /* CleverTapInboxViewController.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = CleverTapInboxViewController.m; path = CleverTapSDK/Inbox/controllers/CleverTapInboxViewController.m; sourceTree = ""; }; + BA387E0415476B8ADB9412FE403BFD2F /* SDmetamacros.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDmetamacros.h; path = SDWebImage/Private/SDmetamacros.h; sourceTree = ""; }; + BC9ED9FC52EA1C2335A86C36D0153FB7 /* CleverTapProductConfig.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = CleverTapProductConfig.m; path = CleverTapSDK/ProductConfig/models/CleverTapProductConfig.m; sourceTree = ""; }; + BE56F4EAE8A387DB451273D184BD4612 /* SDInternalMacros.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDInternalMacros.m; path = SDWebImage/Private/SDInternalMacros.m; sourceTree = ""; }; + BE9F095EB0447D7CBCA289E561ADB8B8 /* SDImageIOAnimatedCoderInternal.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDImageIOAnimatedCoderInternal.h; path = SDWebImage/Private/SDImageIOAnimatedCoderInternal.h; sourceTree = ""; }; + BEFF65ECD31D7F7C869B66A0E095BC50 /* SDImageCachesManager.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDImageCachesManager.h; path = SDWebImage/Core/SDImageCachesManager.h; sourceTree = ""; }; + BF13913B82C28C26838CCBE43584558B /* SDDisplayLink.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDDisplayLink.h; path = SDWebImage/Private/SDDisplayLink.h; sourceTree = ""; }; + BF6459D485B109F3D921C9AF73F73CCA /* CleverTapUTMDetail.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = CleverTapUTMDetail.m; path = CleverTapSDK/CleverTapUTMDetail.m; sourceTree = ""; }; + BFDAE7711879A5C3246459439F8D05BE /* CleverTapFeatureFlagsPrivate.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = CleverTapFeatureFlagsPrivate.h; path = CleverTapSDK/FeatureFlags/models/CleverTapFeatureFlagsPrivate.h; sourceTree = ""; }; + C024FC688690447AF2969B0EFC3FFA9A /* SDGraphicsImageRenderer.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDGraphicsImageRenderer.m; path = SDWebImage/Core/SDGraphicsImageRenderer.m; sourceTree = ""; }; + C1216EF89AA18DD4217278825E018FD8 /* SDAnimatedImagePlayer.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDAnimatedImagePlayer.h; path = SDWebImage/Core/SDAnimatedImagePlayer.h; sourceTree = ""; }; + C21113C7ABE5D58C7B5D8A767AB87EDE /* CleverTap+PushPermission.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "CleverTap+PushPermission.h"; path = "CleverTapSDK/CleverTap+PushPermission.h"; sourceTree = ""; }; + C29A03C2AFD4B0F5D8BF98023C6FF1DB /* SDWebImageOptionsProcessor.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDWebImageOptionsProcessor.m; path = SDWebImage/Core/SDWebImageOptionsProcessor.m; sourceTree = ""; }; + C3A8FC159A8822520A38B5B002564A41 /* CTCoverViewController.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = CTCoverViewController.m; path = CleverTapSDK/InApps/CTCoverViewController.m; sourceTree = ""; }; + C3C29ECAF0AF6C559DA5963DDD2584D7 /* CTPlistInfo.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = CTPlistInfo.m; path = CleverTapSDK/CTPlistInfo.m; sourceTree = ""; }; + C409A635B98C335D485227468101BBE8 /* CTInAppNotification.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = CTInAppNotification.h; path = CleverTapSDK/CTInAppNotification.h; sourceTree = ""; }; + C543885C348CDA7AB0BA6E9280EC8868 /* CTPlistInfo.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = CTPlistInfo.h; path = CleverTapSDK/CTPlistInfo.h; sourceTree = ""; }; + C5A86153196CF9C1F723EB97D4A3DB8B /* CleverTapJSInterface.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = CleverTapJSInterface.h; path = CleverTapSDK/CleverTapJSInterface.h; sourceTree = ""; }; + C5B3BE729F0ADD8A8B2EE9192205BBCA /* CTDismissButton.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = CTDismissButton.h; path = CleverTapSDK/InApps/CTDismissButton.h; sourceTree = ""; }; + C5E4DCBF7C07C7AC2A2E45215B402CBA /* CTUriHelper.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = CTUriHelper.m; path = CleverTapSDK/CTUriHelper.m; sourceTree = ""; }; + C5F3643723A955854CE1093234859684 /* SDWeakProxy.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDWeakProxy.h; path = SDWebImage/Private/SDWeakProxy.h; sourceTree = ""; }; + C637E0C4C13DE3DF36894148A5AFCDEE /* UIImage+GIF.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIImage+GIF.h"; path = "SDWebImage/Core/UIImage+GIF.h"; sourceTree = ""; }; + C6757DC6B82EF58DFF4CDFF8AF5DA9BA /* CTLegacyIdentityRepo.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = CTLegacyIdentityRepo.m; path = CleverTapSDK/CTLegacyIdentityRepo.m; sourceTree = ""; }; + C6E5DD3F3D838DF86363F7985A6951C4 /* SDDisplayLink.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDDisplayLink.m; path = SDWebImage/Private/SDDisplayLink.m; sourceTree = ""; }; + C7701B9AEE68F00BE68BAB3888A54C72 /* CleverTapJSInterfacePrivate.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = CleverTapJSInterfacePrivate.h; path = CleverTapSDK/CleverTapJSInterfacePrivate.h; sourceTree = ""; }; + C8039AA1446EB65F9F5A33711388381E /* CTInboxSimpleMessageCell.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = CTInboxSimpleMessageCell.m; path = CleverTapSDK/Inbox/cells/CTInboxSimpleMessageCell.m; sourceTree = ""; }; + CC9B6D7E55DD737BC20C8C53404A038D /* SDMemoryCache.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDMemoryCache.m; path = SDWebImage/Core/SDMemoryCache.m; sourceTree = ""; }; + CD44EBCA750A1B13B076979CB06155F9 /* SDImageCache.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDImageCache.h; path = SDWebImage/Core/SDImageCache.h; sourceTree = ""; }; + CD8B5B3AC14A2DD84A689A8C9148B05D /* CleverTapTrackedViewController.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = CleverTapTrackedViewController.m; path = CleverTapSDK/CleverTapTrackedViewController.m; sourceTree = ""; }; + CD9461F3E4AD7B23AC099FECFD220030 /* SDAnimatedImageRep.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDAnimatedImageRep.h; path = SDWebImage/Core/SDAnimatedImageRep.h; sourceTree = ""; }; + CDF6EBDB011A01BDEC0892C7C892A8D2 /* CTInterstitialImageViewController~iphoneland.xib */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = file.xib; name = "CTInterstitialImageViewController~iphoneland.xib"; path = "CleverTapSDK/InApps/resources/CTInterstitialImageViewController~iphoneland.xib"; sourceTree = ""; }; + CEF3B281972C2D56BD7AA58176D808A0 /* SDDiskCache.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDDiskCache.m; path = SDWebImage/Core/SDDiskCache.m; sourceTree = ""; }; + CF1A5B94C8BCE3FF16C610A5F0CD4A19 /* SDWebImageCacheSerializer.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDWebImageCacheSerializer.h; path = SDWebImage/Core/SDWebImageCacheSerializer.h; sourceTree = ""; }; + CFCAF6B6B89C1376A6B07B1945B1A795 /* CTInboxIconMessageCell.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = CTInboxIconMessageCell.h; path = CleverTapSDK/Inbox/cells/CTInboxIconMessageCell.h; sourceTree = ""; }; + D0D446813CE030CCE6CF411992B2A263 /* SDWebImageDownloaderResponseModifier.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDWebImageDownloaderResponseModifier.m; path = SDWebImage/Core/SDWebImageDownloaderResponseModifier.m; sourceTree = ""; }; + D0EE2622AD7768A669E399E39BC28E72 /* SDImageIOAnimatedCoder.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDImageIOAnimatedCoder.h; path = SDWebImage/Core/SDImageIOAnimatedCoder.h; sourceTree = ""; }; + D1917471BC76E400854CC4B21A48685B /* SDImageIOAnimatedCoder.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDImageIOAnimatedCoder.m; path = SDWebImage/Core/SDImageIOAnimatedCoder.m; sourceTree = ""; }; + D3C029CEA4014722106EB5B25D844546 /* ContentMerger.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = ContentMerger.m; path = CleverTapSDK/ProductExperiences/ContentMerger.m; sourceTree = ""; }; + D53EF57DD295B8D287FAF67C46C2A538 /* CTDisplayUnitController.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = CTDisplayUnitController.m; path = CleverTapSDK/DisplayUnit/controllers/CTDisplayUnitController.m; sourceTree = ""; }; + D575F36C1E6EDD59F11D1422A48E55A0 /* SDWebImageTransition.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDWebImageTransition.m; path = SDWebImage/Core/SDWebImageTransition.m; sourceTree = ""; }; + D5E3E7DEDE5EEC38B76CEE7CCEBB137A /* CTInAppUtils.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = CTInAppUtils.m; path = CleverTapSDK/CTInAppUtils.m; sourceTree = ""; }; + D6BE7985F78AF20EB6D10ACCEE52B681 /* SDImageFrame.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDImageFrame.m; path = SDWebImage/Core/SDImageFrame.m; sourceTree = ""; }; + D7C9505ADF1E9A64A18F43664702B882 /* SDWebImageDownloaderRequestModifier.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDWebImageDownloaderRequestModifier.h; path = SDWebImage/Core/SDWebImageDownloaderRequestModifier.h; sourceTree = ""; }; + D7F24AEB669B41FB840FC3265994A7B6 /* SDWebImageTransition.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDWebImageTransition.h; path = SDWebImage/Core/SDWebImageTransition.h; sourceTree = ""; }; + D83A587102725CFA2B87C79A9D77CFFA /* CTMessageMO+CoreDataProperties.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "CTMessageMO+CoreDataProperties.m"; path = "CleverTapSDK/Inbox/models/CTMessageMO+CoreDataProperties.m"; sourceTree = ""; }; + D8606FB02BA85C96058A4BCDD8D0CD32 /* CleverTapInboxStyleConfig.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = CleverTapInboxStyleConfig.m; path = CleverTapSDK/Inbox/config/CleverTapInboxStyleConfig.m; sourceTree = ""; }; + D87B486326D36E05C557D980109B159D /* SDWebImage.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = SDWebImage.debug.xcconfig; sourceTree = ""; }; + D996468B3DA9D6181BE7C3FF8FD55F53 /* CTVideoThumbnailGenerator.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = CTVideoThumbnailGenerator.m; path = CleverTapSDK/Inbox/views/CTVideoThumbnailGenerator.m; sourceTree = ""; }; + DC096C2F42FD8E6E49CF512117B3BB41 /* CTCoverViewController.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = CTCoverViewController.h; path = CleverTapSDK/InApps/CTCoverViewController.h; sourceTree = ""; }; DC0E1A67CEC652B3894D383A816A14C1 /* Pods-ExampleProject.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-ExampleProject.debug.xcconfig"; sourceTree = ""; }; - DD64A75C7AE6643D5E75DA94744975D8 /* SDDisplayLink.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDDisplayLink.h; path = SDWebImage/Private/SDDisplayLink.h; sourceTree = ""; }; - DDB0E517F0C66B8396AFBB1552DB2B10 /* CTLegacyIdentityRepo.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = CTLegacyIdentityRepo.m; path = CleverTapSDK/CTLegacyIdentityRepo.m; sourceTree = ""; }; - DE99AB43A5D54C7057634AB35C1AAF56 /* SDWeakProxy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDWeakProxy.m; path = SDWebImage/Private/SDWeakProxy.m; sourceTree = ""; }; - DF3B8CF15CE29D891A2D268AD9F71535 /* CTDismissButton.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = CTDismissButton.m; path = CleverTapSDK/InApps/CTDismissButton.m; sourceTree = ""; }; - DFFDEDE53EDB6A617BDE61990D0F58A0 /* SDAnimatedImageView.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDAnimatedImageView.m; path = SDWebImage/Core/SDAnimatedImageView.m; sourceTree = ""; }; - E0025D4100845ADE4C3E74DC53D622E1 /* SDGraphicsImageRenderer.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDGraphicsImageRenderer.m; path = SDWebImage/Core/SDGraphicsImageRenderer.m; sourceTree = ""; }; - E0318D0477B7511F2C52012E58B724E8 /* SDCallbackQueue.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDCallbackQueue.h; path = SDWebImage/Core/SDCallbackQueue.h; sourceTree = ""; }; - E082868493C6525D9DED98D66B6B617C /* CTHalfInterstitialViewController.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = CTHalfInterstitialViewController.h; path = CleverTapSDK/InApps/CTHalfInterstitialViewController.h; sourceTree = ""; }; - E08F10F2BC4A009DEAC6EFA85855A79C /* CTCarouselMessageCell.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = CTCarouselMessageCell.m; path = CleverTapSDK/Inbox/cells/CTCarouselMessageCell.m; sourceTree = ""; }; + DD4EB1BCD53E5C2EEF147ED812D0C967 /* CTInboxController.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = CTInboxController.m; path = CleverTapSDK/Inbox/controllers/CTInboxController.m; sourceTree = ""; }; + DD6B433616E53A15A97E841EC4A96309 /* SDImageGIFCoder.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDImageGIFCoder.m; path = SDWebImage/Core/SDImageGIFCoder.m; sourceTree = ""; }; + DDEFDC33AB9FA34FF10A8E5A89A09CBF /* CTInterstitialViewController.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = CTInterstitialViewController.m; path = CleverTapSDK/InApps/CTInterstitialViewController.m; sourceTree = ""; }; E0E9BEE7C628BAC7F367A1A4C7C13DED /* Pods-ExampleProject-resources.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = "Pods-ExampleProject-resources.sh"; sourceTree = ""; }; - E1060D767592EFFBE89138EF9D81B83A /* SDAnimatedImageRep.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDAnimatedImageRep.h; path = SDWebImage/Core/SDAnimatedImageRep.h; sourceTree = ""; }; - E1410A2C00AC668EAF25B299A2AF9B85 /* SDWebImagePrefetcher.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDWebImagePrefetcher.m; path = SDWebImage/Core/SDWebImagePrefetcher.m; sourceTree = ""; }; - E14AE69271E5AF7EAD14172603EBA07C /* SDWebImageOperation.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDWebImageOperation.h; path = SDWebImage/Core/SDWebImageOperation.h; sourceTree = ""; }; - E1E86C8B89C471B4B2ABC5E0D5A8A6AC /* CTCarouselImageMessageCell~port.xib */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = file.xib; name = "CTCarouselImageMessageCell~port.xib"; path = "CleverTapSDK/Inbox/resources/CTCarouselImageMessageCell~port.xib"; sourceTree = ""; }; - E3A7E5F3E93A24CD627D8781121C5E8C /* CTHeaderViewController.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = CTHeaderViewController.h; path = CleverTapSDK/InApps/CTHeaderViewController.h; sourceTree = ""; }; - E596FAC6EE4112F4DF1BE215186B0F9C /* SDWebImageCacheSerializer.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDWebImageCacheSerializer.m; path = SDWebImage/Core/SDWebImageCacheSerializer.m; sourceTree = ""; }; - E5CD5A312CF73AAEF2992E927C3D7AB6 /* SDWebImagePrefetcher.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDWebImagePrefetcher.h; path = SDWebImage/Core/SDWebImagePrefetcher.h; sourceTree = ""; }; - E69562FCF9E76BDE9B738180B7DEEF69 /* SDImageFrame.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDImageFrame.h; path = SDWebImage/Core/SDImageFrame.h; sourceTree = ""; }; - E7851778CE612665F09AD9D2B9F2D9A3 /* ct_default_landscape_image.png */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = image.png; name = ct_default_landscape_image.png; path = CleverTapSDK/Inbox/resources/ct_default_landscape_image.png; sourceTree = ""; }; - E7D1CB2FE64A8567237BCC54BD448FDB /* CTSwizzle.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = CTSwizzle.m; path = CleverTapSDK/CTSwizzle.m; sourceTree = ""; }; - E82A6563EA932B6CDA2A5F6D83190218 /* CTHalfInterstitialViewController~ipad.xib */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = file.xib; name = "CTHalfInterstitialViewController~ipad.xib"; path = "CleverTapSDK/InApps/resources/CTHalfInterstitialViewController~ipad.xib"; sourceTree = ""; }; - E976ADF3D4855F86CC2BF8428AAC9744 /* CTInterstitialViewController.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = CTInterstitialViewController.h; path = CleverTapSDK/InApps/CTInterstitialViewController.h; sourceTree = ""; }; - E97C1D8FE96CC38F3834CA682AE8C2A7 /* CTFooterViewController~ipadland.xib */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = file.xib; name = "CTFooterViewController~ipadland.xib"; path = "CleverTapSDK/InApps/resources/CTFooterViewController~ipadland.xib"; sourceTree = ""; }; - EA5CA0104656A1A9763EB85238DE649F /* SDWebImageDownloader.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDWebImageDownloader.h; path = SDWebImage/Core/SDWebImageDownloader.h; sourceTree = ""; }; + E1CF7F5F94D918FB697889AB41DE050C /* CTLocalInApp.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = CTLocalInApp.h; path = CleverTapSDK/InApps/CTLocalInApp.h; sourceTree = ""; }; + E2198D00B5BC5434ECCF179F99E0003C /* SDWebImageDownloader.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDWebImageDownloader.m; path = SDWebImage/Core/SDWebImageDownloader.m; sourceTree = ""; }; + E22E04F6D0F53CE5B934800E64449F36 /* CleverTapInAppNotificationDelegate.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = CleverTapInAppNotificationDelegate.h; path = CleverTapSDK/CleverTapInAppNotificationDelegate.h; sourceTree = ""; }; + E22FD9FFE6ECABB54B00457ECFAA3835 /* CTRequestFactory.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = CTRequestFactory.h; path = CleverTapSDK/CTRequestFactory.h; sourceTree = ""; }; + E289B7B73B4385A30E303118EC438207 /* SDImageGraphics.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDImageGraphics.h; path = SDWebImage/Core/SDImageGraphics.h; sourceTree = ""; }; + E2A69C83C1935452CE8538201C1D6CBB /* CTInboxIconMessageCell.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = CTInboxIconMessageCell.m; path = CleverTapSDK/Inbox/cells/CTInboxIconMessageCell.m; sourceTree = ""; }; + E2C4B1B69335DDD69A4416BBCF44C29C /* CleverTap+ProductConfig.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "CleverTap+ProductConfig.h"; path = "CleverTapSDK/CleverTap+ProductConfig.h"; sourceTree = ""; }; + E3A2F23654A3C2CD98DFB07D7588EBFE /* CTUserMO+CoreDataProperties.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "CTUserMO+CoreDataProperties.m"; path = "CleverTapSDK/Inbox/models/CTUserMO+CoreDataProperties.m"; sourceTree = ""; }; + E5420850D79BA65C8EA696A2E2B74D03 /* CTSwipeView.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = CTSwipeView.m; path = CleverTapSDK/Inbox/views/CTSwipeView.m; sourceTree = ""; }; + E6B0ABD50999FA13A03E0D81914153D4 /* CTInboxIconMessageCell~land.xib */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = file.xib; name = "CTInboxIconMessageCell~land.xib"; path = "CleverTapSDK/Inbox/resources/CTInboxIconMessageCell~land.xib"; sourceTree = ""; }; + E785843CED2BE08B30963C783922E0FB /* CTLocalInApp.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = CTLocalInApp.m; path = CleverTapSDK/InApps/CTLocalInApp.m; sourceTree = ""; }; + E7F32C6348442E0E1840397E590C23F5 /* CTBaseHeaderFooterViewController.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = CTBaseHeaderFooterViewController.m; path = CleverTapSDK/InApps/CTBaseHeaderFooterViewController.m; sourceTree = ""; }; + E8696319C55D552EFC8E24716BAC9039 /* CTInboxSimpleMessageCell~land.xib */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = file.xib; name = "CTInboxSimpleMessageCell~land.xib"; path = "CleverTapSDK/Inbox/resources/CTInboxSimpleMessageCell~land.xib"; sourceTree = ""; }; + E9A1A6516E49A693CDD84104BF69AB55 /* CTPreferences.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = CTPreferences.h; path = CleverTapSDK/CTPreferences.h; sourceTree = ""; }; + E9E25B9B521E3810217317B4C7B133A5 /* CTInAppUtils.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = CTInAppUtils.h; path = CleverTapSDK/CTInAppUtils.h; sourceTree = ""; }; EAC043161A0127E0690C5CA70DCA5EAC /* Pods-ExampleProject-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Pods-ExampleProject-dummy.m"; sourceTree = ""; }; - EB67F91C6EA0821C9C8A0A18D44B1DF3 /* NSBezierPath+SDRoundedCorners.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "NSBezierPath+SDRoundedCorners.m"; path = "SDWebImage/Private/NSBezierPath+SDRoundedCorners.m"; sourceTree = ""; }; - EB7C3FAF9A4F3A4625DDA49824488AF1 /* SDImageLoader.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDImageLoader.m; path = SDWebImage/Core/SDImageLoader.m; sourceTree = ""; }; - EC79B2DDFF9810898AC8C8652B0CCF9D /* CTInboxSimpleMessageCell.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = CTInboxSimpleMessageCell.m; path = CleverTapSDK/Inbox/cells/CTInboxSimpleMessageCell.m; sourceTree = ""; }; - EC8365F948FC4A7D0D595ED5C9CC10A4 /* CTIdentityRepoFactory.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = CTIdentityRepoFactory.h; path = CleverTapSDK/CTIdentityRepoFactory.h; sourceTree = ""; }; - ECE794CC220D1CAE29FCD9E5FFF15DB7 /* UIImage+GIF.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIImage+GIF.m"; path = "SDWebImage/Core/UIImage+GIF.m"; sourceTree = ""; }; - EDA7216F106C2008F8F27D6B3952CD07 /* SDImageCache.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDImageCache.m; path = SDWebImage/Core/SDImageCache.m; sourceTree = ""; }; - EE4DC1EAD6A3B6969BB2F97E6F297968 /* CTInterstitialImageViewController.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = CTInterstitialImageViewController.m; path = CleverTapSDK/InApps/CTInterstitialImageViewController.m; sourceTree = ""; }; - EEED3A83D290E3DBB00927D6EA94C61D /* ic_pause@2x.png */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = image.png; name = "ic_pause@2x.png"; path = "CleverTapSDK/Inbox/resources/ic_pause@2x.png"; sourceTree = ""; }; - EF100CCC38AFB29E96AA44FDE2641B0B /* SDImageCachesManagerOperation.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDImageCachesManagerOperation.h; path = SDWebImage/Private/SDImageCachesManagerOperation.h; sourceTree = ""; }; - EF56D43E904382DBE1EDC7E7A50148CD /* CTInboxIconMessageCell.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = CTInboxIconMessageCell.h; path = CleverTapSDK/Inbox/cells/CTInboxIconMessageCell.h; sourceTree = ""; }; - EF61764DECEEFF4DF9B3DB3F2FBB7DF0 /* SDImageCachesManager.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDImageCachesManager.m; path = SDWebImage/Core/SDImageCachesManager.m; sourceTree = ""; }; - EF7ECE3CC8E7B0401359A72B25073173 /* CTNotificationButton.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = CTNotificationButton.h; path = CleverTapSDK/CTNotificationButton.h; sourceTree = ""; }; - F004A06E523AFEE3F1859942220996DB /* CTInterstitialImageViewController~ipad.xib */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = file.xib; name = "CTInterstitialImageViewController~ipad.xib"; path = "CleverTapSDK/InApps/resources/CTInterstitialImageViewController~ipad.xib"; sourceTree = ""; }; - F114C4C845E747C3BCF66320786C224E /* CTValidator.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = CTValidator.m; path = CleverTapSDK/CTValidator.m; sourceTree = ""; }; - F13429BCEC72E1E562AEE8C9D71837BE /* UIImage+Metadata.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIImage+Metadata.h"; path = "SDWebImage/Core/UIImage+Metadata.h"; sourceTree = ""; }; - F1F4C780744FADA7A04D6B2B5DFF9149 /* CleverTap+FeatureFlags.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "CleverTap+FeatureFlags.h"; path = "CleverTapSDK/CleverTap+FeatureFlags.h"; sourceTree = ""; }; - F2C5A1BF3384B7C6932508CC801E85FC /* CleverTapTrackedViewController.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = CleverTapTrackedViewController.h; path = CleverTapSDK/CleverTapTrackedViewController.h; sourceTree = ""; }; - F2F11EF6692F98BAF5BEFDFDEB57A4CB /* UIImage+Transform.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIImage+Transform.m"; path = "SDWebImage/Core/UIImage+Transform.m"; sourceTree = ""; }; - F4C976AFC10EC48CA8139A81D5C11E01 /* CTDisplayUnitController.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = CTDisplayUnitController.m; path = CleverTapSDK/DisplayUnit/controllers/CTDisplayUnitController.m; sourceTree = ""; }; - F533489CA7EB2498456C16023FAFCFEF /* CTInAppUtils.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = CTInAppUtils.h; path = CleverTapSDK/CTInAppUtils.h; sourceTree = ""; }; - F54EEF4EBA5C908306A8BBA7497F338E /* CTVideoThumbnailGenerator.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = CTVideoThumbnailGenerator.m; path = CleverTapSDK/Inbox/views/CTVideoThumbnailGenerator.m; sourceTree = ""; }; + EACDD7983C9F7256D282C4DAEF8B072C /* CTHalfInterstitialViewController~ipad.xib */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = file.xib; name = "CTHalfInterstitialViewController~ipad.xib"; path = "CleverTapSDK/InApps/resources/CTHalfInterstitialViewController~ipad.xib"; sourceTree = ""; }; + EAFE8B9444318520DC477422A5CBB09F /* CTCarouselMessageCell.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = CTCarouselMessageCell.h; path = CleverTapSDK/Inbox/cells/CTCarouselMessageCell.h; sourceTree = ""; }; + EB4064B5D4AD7887681143A9C99A679B /* CTLoginInfoProvider.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = CTLoginInfoProvider.h; path = CleverTapSDK/CTLoginInfoProvider.h; sourceTree = ""; }; + EBB6985D2723C9E6779038254BDF1161 /* CTAlertViewController.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = CTAlertViewController.m; path = CleverTapSDK/InApps/CTAlertViewController.m; sourceTree = ""; }; + EC269F7BBFC8824572FF8A98C3BC608D /* CTProfileBuilder.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = CTProfileBuilder.m; path = CleverTapSDK/CTProfileBuilder.m; sourceTree = ""; }; + EC8EEF178D1406F1F0B64C3623767D62 /* CTImageInAppViewControllerPrivate.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = CTImageInAppViewControllerPrivate.h; path = CleverTapSDK/InApps/CTImageInAppViewControllerPrivate.h; sourceTree = ""; }; + EE960C042F15A01816F4F93DA9E1BA27 /* CTHeaderViewController.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = CTHeaderViewController.m; path = CleverTapSDK/InApps/CTHeaderViewController.m; sourceTree = ""; }; + EEDE444CFDF1DF731AB303A32A838503 /* CTSwipeView.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = CTSwipeView.h; path = CleverTapSDK/Inbox/views/CTSwipeView.h; sourceTree = ""; }; + EF3A3BF322621F36A6739CA93B8333DD /* CTCarouselMessageCell~port.xib */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = file.xib; name = "CTCarouselMessageCell~port.xib"; path = "CleverTapSDK/Inbox/resources/CTCarouselMessageCell~port.xib"; sourceTree = ""; }; + F0554B65AC905E501684E293F224CCF8 /* NSData+ImageContentType.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "NSData+ImageContentType.m"; path = "SDWebImage/Core/NSData+ImageContentType.m"; sourceTree = ""; }; + F0EB98CB11EE21869F4611899195CC03 /* UIImage+Transform.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIImage+Transform.m"; path = "SDWebImage/Core/UIImage+Transform.m"; sourceTree = ""; }; + F105B5A3B1FBFF838F2C229A94C13D23 /* CTInAppHTMLViewController.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = CTInAppHTMLViewController.h; path = CleverTapSDK/InApps/CTInAppHTMLViewController.h; sourceTree = ""; }; + F1763BF58D06B7427273F32A2283E3E3 /* CleverTap+DisplayUnit.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "CleverTap+DisplayUnit.h"; path = "CleverTapSDK/CleverTap+DisplayUnit.h"; sourceTree = ""; }; + F2D7FA485AF4AD67531F65470D828E95 /* UIImage+MultiFormat.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIImage+MultiFormat.m"; path = "SDWebImage/Core/UIImage+MultiFormat.m"; sourceTree = ""; }; + F4ACA7CEF35AE42ECAE3999491484DB4 /* SDWebImage.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDWebImage.h; path = WebImage/SDWebImage.h; sourceTree = ""; }; F584F356BA2B0FCC108479DAAC2ADEE0 /* Pods-ExampleProject */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; name = "Pods-ExampleProject"; path = "libPods-ExampleProject.a"; sourceTree = BUILT_PRODUCTS_DIR; }; - F62FF4FF3AC36500D5B52494678D743F /* CTKnownProfileFields.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = CTKnownProfileFields.h; path = CleverTapSDK/CTKnownProfileFields.h; sourceTree = ""; }; - F67B84360300584D6F809958C1B9A141 /* CTCoverImageViewController~ipadland.xib */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = file.xib; name = "CTCoverImageViewController~ipadland.xib"; path = "CleverTapSDK/InApps/resources/CTCoverImageViewController~ipadland.xib"; sourceTree = ""; }; - F6C7586BB8EF3BE50BBB00BB8CFF52B5 /* SDImageCacheDefine.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDImageCacheDefine.m; path = SDWebImage/Core/SDImageCacheDefine.m; sourceTree = ""; }; - F730725CEACF1ACCAEFDBFE191F983B0 /* SDWebImageDownloaderOperation.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDWebImageDownloaderOperation.h; path = SDWebImage/Core/SDWebImageDownloaderOperation.h; sourceTree = ""; }; - F774F349AF10A9DFF7BE6B167535C64F /* CTInAppDisplayViewControllerPrivate.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = CTInAppDisplayViewControllerPrivate.h; path = CleverTapSDK/CTInAppDisplayViewControllerPrivate.h; sourceTree = ""; }; - F8F21E1F65344857B4DDF90086E7FF86 /* SDAnimatedImage.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDAnimatedImage.h; path = SDWebImage/Core/SDAnimatedImage.h; sourceTree = ""; }; - FA519E2D3056E7FF8BFD2EDDFBA96F0D /* CTMessageMO.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = CTMessageMO.h; path = CleverTapSDK/Inbox/models/CTMessageMO.h; sourceTree = ""; }; - FA78454274A9CBEC1AD24CECBD3329D8 /* CTLocalDataStore.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = CTLocalDataStore.h; path = CleverTapSDK/CTLocalDataStore.h; sourceTree = ""; }; - FBC28DA290D2949C9F9DAEFA027089C9 /* CTInAppNotification.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = CTInAppNotification.h; path = CleverTapSDK/CTInAppNotification.h; sourceTree = ""; }; - FBF52036CD383B558A63419864C8240C /* SDImageCache.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDImageCache.h; path = SDWebImage/Core/SDImageCache.h; sourceTree = ""; }; - FC98D47A0C7E48C307516B8566F540DC /* CTCoverViewController.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = CTCoverViewController.h; path = CleverTapSDK/InApps/CTCoverViewController.h; sourceTree = ""; }; - FD25DF43629CB59D5874ECBC0A37C73A /* UIImageView+HighlightedWebCache.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIImageView+HighlightedWebCache.h"; path = "SDWebImage/Core/UIImageView+HighlightedWebCache.h"; sourceTree = ""; }; - FE345882B6F962FFAECA8400DBEDB8E9 /* CleverTap.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = CleverTap.m; path = CleverTapSDK/CleverTap.m; sourceTree = ""; }; - FE5D961825AC94A63D2DCED77E9DC6E7 /* UIImage+MemoryCacheCost.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIImage+MemoryCacheCost.h"; path = "SDWebImage/Core/UIImage+MemoryCacheCost.h"; sourceTree = ""; }; - FEE6DB459E0B2A1C4B8BB2937E38554C /* CTDeviceInfo.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = CTDeviceInfo.h; path = CleverTapSDK/CTDeviceInfo.h; sourceTree = ""; }; - FF51E4B5C462C948E2B00EA02D8852BC /* UIImage+MemoryCacheCost.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIImage+MemoryCacheCost.m"; path = "SDWebImage/Core/UIImage+MemoryCacheCost.m"; sourceTree = ""; }; - FFB7A7727BD01FC0C7DB6B4605CD6A34 /* CTInboxMessageActionView.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = CTInboxMessageActionView.h; path = CleverTapSDK/Inbox/views/CTInboxMessageActionView.h; sourceTree = ""; }; + F5FD179158AF237B12219C05D1F28770 /* CleverTap+CTVar.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "CleverTap+CTVar.h"; path = "CleverTapSDK/CleverTap+CTVar.h"; sourceTree = ""; }; + F64B36E4B224329BBC5FBF3F9F5C8759 /* SDImageTransformer.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDImageTransformer.m; path = SDWebImage/Core/SDImageTransformer.m; sourceTree = ""; }; + F7634FC060FC53D1C538F867C2D969A8 /* CTConstants.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = CTConstants.m; path = CleverTapSDK/CTConstants.m; sourceTree = ""; }; + FA17520E67D4436C04BB3165D482F662 /* CTHalfInterstitialViewController~ipadland.xib */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = file.xib; name = "CTHalfInterstitialViewController~ipadland.xib"; path = "CleverTapSDK/InApps/resources/CTHalfInterstitialViewController~ipadland.xib"; sourceTree = ""; }; + FA7B344FE5E97521F739E0B25F71C615 /* CTDomainFactory.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = CTDomainFactory.h; path = CleverTapSDK/CTDomainFactory.h; sourceTree = ""; }; + FC375CFD124928065969D8C432D88146 /* CTUtils.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = CTUtils.h; path = CleverTapSDK/CTUtils.h; sourceTree = ""; }; + FCDE4717AAD6ACCA05E5625340266D29 /* SDImageFramePool.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDImageFramePool.m; path = SDWebImage/Private/SDImageFramePool.m; sourceTree = ""; }; + FD9D4485B60922E08545942235FEBA72 /* CTCoverImageViewController~ipad.xib */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = file.xib; name = "CTCoverImageViewController~ipad.xib"; path = "CleverTapSDK/InApps/resources/CTCoverImageViewController~ipad.xib"; sourceTree = ""; }; + FDD9EFB37C5A07AD5B5727828379B6B0 /* SDAnimatedImage.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDAnimatedImage.h; path = SDWebImage/Core/SDAnimatedImage.h; sourceTree = ""; }; + FEA5420B49A131AA9A5205CA57E6F073 /* CTUriHelper.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = CTUriHelper.h; path = CleverTapSDK/CTUriHelper.h; sourceTree = ""; }; + FF3E6AA8E58BA28895FF0C894CB3D0BC /* CTKnownProfileFields.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = CTKnownProfileFields.m; path = CleverTapSDK/CTKnownProfileFields.m; sourceTree = ""; }; + FF79524D110999253A4D7D3C3A21FE92 /* NSBezierPath+SDRoundedCorners.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "NSBezierPath+SDRoundedCorners.h"; path = "SDWebImage/Private/NSBezierPath+SDRoundedCorners.h"; sourceTree = ""; }; + FFA9E8D85B6EEAA2DF70E6D722CAA667 /* CTVarCache.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = CTVarCache.m; path = CleverTapSDK/ProductExperiences/CTVarCache.m; sourceTree = ""; }; + FFEF3FC39B711E2848C8D727E441070A /* CTLogger.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = CTLogger.m; path = CleverTapSDK/CTLogger.m; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ - 3152B3236F8BCCDEF43A6045454106B4 /* Frameworks */ = { + 04AD08B3F3E6CC0A17117D8DCABD3877 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( ); runOnlyForDeploymentPostprocessing = 0; }; - 578BDEC356BA3FD1B3B811C96F184FE0 /* Frameworks */ = { + 3152B3236F8BCCDEF43A6045454106B4 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( ); runOnlyForDeploymentPostprocessing = 0; }; - 7945458DEA830485C85E9EC5856CF133 /* Frameworks */ = { + A9C8DCCB7A832C546780C361CE740843 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( ); runOnlyForDeploymentPostprocessing = 0; }; - C3C696D398B52082FAEA55BEEF09C9F4 /* Frameworks */ = { + FDF6C9809C34B4EF33CC67A552FFCEA5 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( @@ -829,35 +875,179 @@ /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ - 06110821981B438031A1B384B1120E51 /* SDWebImage */ = { + 226DB95B4838BFFD0866B3990E728265 /* Pods */ = { isa = PBXGroup; children = ( - BBD334FF338BF518E38DCC617BBFE85C /* Core */, - 43FA41754A123FE3461FEAE3521D2235 /* Support Files */, + D4A33264B32C8A02C501550183B246D3 /* CleverTap-iOS-SDK */, + F90A3E31446F655C30F1137186C28375 /* SDWebImage */, ); - name = SDWebImage; - path = SDWebImage; + name = Pods; sourceTree = ""; }; - 0B820D33D095B0A02F95C3CF4E7FCA83 /* Pods */ = { + 283115929A1426689154B7109BBECB25 /* Core */ = { isa = PBXGroup; children = ( - 8B1E9C7998DF93F0934D4F766DEA9B90 /* CleverTap-iOS-SDK */, - 06110821981B438031A1B384B1120E51 /* SDWebImage */, + FF79524D110999253A4D7D3C3A21FE92 /* NSBezierPath+SDRoundedCorners.h */, + 8F960235F3FB5DFAA27E4480B1EEA073 /* NSBezierPath+SDRoundedCorners.m */, + 74A255198645FD62C60EA90913BFA9B7 /* NSButton+WebCache.h */, + 3A25DC0C542BAA80A8E2F78B2669DA04 /* NSButton+WebCache.m */, + 6DBAE3C48569C3865DDDED3F61868882 /* NSData+ImageContentType.h */, + F0554B65AC905E501684E293F224CCF8 /* NSData+ImageContentType.m */, + 6FD6F4BF66E533E9218C46D90A16A088 /* NSImage+Compatibility.h */, + 9D56861E6126AA861F16F7B99F7A80C6 /* NSImage+Compatibility.m */, + FDD9EFB37C5A07AD5B5727828379B6B0 /* SDAnimatedImage.h */, + 4AE4CA16BD666E24B4AC075BA5B96D99 /* SDAnimatedImage.m */, + C1216EF89AA18DD4217278825E018FD8 /* SDAnimatedImagePlayer.h */, + 4CF798E5C12FFAAF4D51475D2CA07E55 /* SDAnimatedImagePlayer.m */, + CD9461F3E4AD7B23AC099FECFD220030 /* SDAnimatedImageRep.h */, + 9134BB07DEE17A273B116DC22C5CE8ED /* SDAnimatedImageRep.m */, + 07DD50F408FDA36B256D9C992D386256 /* SDAnimatedImageView.h */, + 1900708E4B3E2B7CC0949AEAE224E9C4 /* SDAnimatedImageView.m */, + 10DC85093C083DCA6376C8D57645F961 /* SDAnimatedImageView+WebCache.h */, + 9970C584C403F5B21B04B51E5BD9141A /* SDAnimatedImageView+WebCache.m */, + 059FB3ED6C02F9C1C6843439DA6CC598 /* SDAssociatedObject.h */, + 6F258962D6F652EAC9445860BACB57B7 /* SDAssociatedObject.m */, + AEB5505CF6F5BC0AEE9EE21CA9C15B55 /* SDAsyncBlockOperation.h */, + 306844A6D0C42CEFEB9595DAF88EB845 /* SDAsyncBlockOperation.m */, + A506B300096DCFD3B2B39405F54DA2E1 /* SDCallbackQueue.h */, + 899332218ABE7C9D64AEADC9C7F09D8B /* SDCallbackQueue.m */, + 053C136B3BC99422F0649E5D9A803E1E /* SDDeviceHelper.h */, + 755C72A35E5051DA700AED8E6BE7A38F /* SDDeviceHelper.m */, + B24EF3897EDEBDBED3E2C24BDC362C42 /* SDDiskCache.h */, + CEF3B281972C2D56BD7AA58176D808A0 /* SDDiskCache.m */, + BF13913B82C28C26838CCBE43584558B /* SDDisplayLink.h */, + C6E5DD3F3D838DF86363F7985A6951C4 /* SDDisplayLink.m */, + 4D574AECCA07209855A039D16C68A64B /* SDFileAttributeHelper.h */, + B15E720C0279E0855D9DA4360415E0F4 /* SDFileAttributeHelper.m */, + 7AE881B1848CC3A82B696124CF9F9196 /* SDGraphicsImageRenderer.h */, + C024FC688690447AF2969B0EFC3FFA9A /* SDGraphicsImageRenderer.m */, + 50AC1B40BFD9F8DB29D69FE37DDD5A66 /* SDImageAPNGCoder.h */, + 77488CC23517C13CED61FF741AD63DFD /* SDImageAPNGCoder.m */, + 8BD9C6B29E77B47E5D45CAC17B6309C1 /* SDImageAssetManager.h */, + AE4DED403729CEB9D785359DECA70962 /* SDImageAssetManager.m */, + 3A11EE5FA06CC91AD6CC0EA0DAD765AD /* SDImageAWebPCoder.h */, + 7F18856EB43920E1377504E0E79A2410 /* SDImageAWebPCoder.m */, + CD44EBCA750A1B13B076979CB06155F9 /* SDImageCache.h */, + 029DC6B5F4343D282DF5BF3646AA3460 /* SDImageCache.m */, + A9AA6C8FB8C1E437FCCF5E2787DFC945 /* SDImageCacheConfig.h */, + 9223119A5F096C85DC8630F36CC41AB4 /* SDImageCacheConfig.m */, + AAB240153BB1C2FE15F57B45E2402E8B /* SDImageCacheDefine.h */, + 34F282951992DE86428E642BF031C0B8 /* SDImageCacheDefine.m */, + BEFF65ECD31D7F7C869B66A0E095BC50 /* SDImageCachesManager.h */, + 8EF5DA4387044BA3EC3ACB6FF972757D /* SDImageCachesManager.m */, + B19E0B4BE29BFF5BC50A0801236C1C33 /* SDImageCachesManagerOperation.h */, + A2384129049A308CD42673162F103FA3 /* SDImageCachesManagerOperation.m */, + 325B01B581855146EA7F62EA9083EE76 /* SDImageCoder.h */, + 76268F21E7B57C723B2979FA32A74A23 /* SDImageCoder.m */, + 71088BC74685C239ED7D1AB536A265A6 /* SDImageCoderHelper.h */, + 69332F5DC51859E911C060D3A75A6A5A /* SDImageCoderHelper.m */, + 26515B47DE93CD0684F895476CAACFEF /* SDImageCodersManager.h */, + 6F0238786F75BE955F1873B0229B4835 /* SDImageCodersManager.m */, + 474302FFBE03F657A06E481B4EA5B280 /* SDImageFrame.h */, + D6BE7985F78AF20EB6D10ACCEE52B681 /* SDImageFrame.m */, + 063991F4AF198D65CBD2BB1C1BB704F4 /* SDImageFramePool.h */, + FCDE4717AAD6ACCA05E5625340266D29 /* SDImageFramePool.m */, + 16D02024458EAB232BA12891AD0380B3 /* SDImageGIFCoder.h */, + DD6B433616E53A15A97E841EC4A96309 /* SDImageGIFCoder.m */, + E289B7B73B4385A30E303118EC438207 /* SDImageGraphics.h */, + B5709F67519EAD8895496BBD72FA11C7 /* SDImageGraphics.m */, + B3D24A0C002E081DAC44AC5CFA0CD927 /* SDImageHEICCoder.h */, + 1DFC6E85A4210DE9B9F87084CDE2F85B /* SDImageHEICCoder.m */, + D0EE2622AD7768A669E399E39BC28E72 /* SDImageIOAnimatedCoder.h */, + D1917471BC76E400854CC4B21A48685B /* SDImageIOAnimatedCoder.m */, + BE9F095EB0447D7CBCA289E561ADB8B8 /* SDImageIOAnimatedCoderInternal.h */, + 8D4CFD8D6B56BA8EC83D432EB9E29754 /* SDImageIOCoder.h */, + 28F1B4CF1FF90A8F4CF9240C24EFE569 /* SDImageIOCoder.m */, + 7813CB72482158D2DD680BEFDD9AF1FC /* SDImageLoader.h */, + 9CDC91F1D9F6E8E4C530871882C4F595 /* SDImageLoader.m */, + 6E9859CC4E41A7CE6FD4BA7173B1982E /* SDImageLoadersManager.h */, + B06FBB54D9B7EE80723DCAC355B68688 /* SDImageLoadersManager.m */, + 52F1382CBA7D38B10646600BF7D8B135 /* SDImageTransformer.h */, + F64B36E4B224329BBC5FBF3F9F5C8759 /* SDImageTransformer.m */, + 1CECD3EC3D75850660B3CDCDEDB848B5 /* SDInternalMacros.h */, + BE56F4EAE8A387DB451273D184BD4612 /* SDInternalMacros.m */, + 425B49983F8E78C240B1EFC28FD67E27 /* SDMemoryCache.h */, + CC9B6D7E55DD737BC20C8C53404A038D /* SDMemoryCache.m */, + BA387E0415476B8ADB9412FE403BFD2F /* SDmetamacros.h */, + C5F3643723A955854CE1093234859684 /* SDWeakProxy.h */, + 9F93FB6C98B83B0779436D3FB5258689 /* SDWeakProxy.m */, + F4ACA7CEF35AE42ECAE3999491484DB4 /* SDWebImage.h */, + 6EE3DFF499F9E289FE74FDECBD78F922 /* SDWebImageCacheKeyFilter.h */, + 9DF0A0A3A4355D1B45BDDD11C05A7D64 /* SDWebImageCacheKeyFilter.m */, + CF1A5B94C8BCE3FF16C610A5F0CD4A19 /* SDWebImageCacheSerializer.h */, + 1C89867FBC12FD83E74AB386E1799561 /* SDWebImageCacheSerializer.m */, + 3AA3523DA21F9568BED60C63AF2E8265 /* SDWebImageCompat.h */, + 577945C4A36E5A326590B3E2CE3261D1 /* SDWebImageCompat.m */, + 35EEEE6B6E86E8340A44C76BCEF9BA17 /* SDWebImageDefine.h */, + 02311CE61069D208441E5B078A33FB22 /* SDWebImageDefine.m */, + 178165C3620183FC34A1C61B401522E0 /* SDWebImageDownloader.h */, + E2198D00B5BC5434ECCF179F99E0003C /* SDWebImageDownloader.m */, + 8ED26E4A9F0A0D8C6019314BA10BC0A3 /* SDWebImageDownloaderConfig.h */, + 14FEEA8125F157B2B695F2021FD28BEF /* SDWebImageDownloaderConfig.m */, + 1F4631150502A4420731DFDEFBAE4900 /* SDWebImageDownloaderDecryptor.h */, + 7091F38357BEF7082868DB76FAE8898E /* SDWebImageDownloaderDecryptor.m */, + 6BE3A8690D946A534AB9F0B67CFB1342 /* SDWebImageDownloaderOperation.h */, + 9BA5B095E2FB7AA6951152FAB3E83B14 /* SDWebImageDownloaderOperation.m */, + D7C9505ADF1E9A64A18F43664702B882 /* SDWebImageDownloaderRequestModifier.h */, + A3B755830D786D72BBDE8DB5E6B2D97E /* SDWebImageDownloaderRequestModifier.m */, + 4BC1DCE26164671BD35675BA6B45A5AD /* SDWebImageDownloaderResponseModifier.h */, + D0D446813CE030CCE6CF411992B2A263 /* SDWebImageDownloaderResponseModifier.m */, + 077D8FC4221F09FB2FF65552161F02D9 /* SDWebImageError.h */, + A39DF340D84D623CE95198E813190AB8 /* SDWebImageError.m */, + 0E36E9E4CD9F24867C3C2D3249CB10DD /* SDWebImageIndicator.h */, + B2D99040AE6765218BD146A3AC55D4B9 /* SDWebImageIndicator.m */, + 039AA853A697C076592ACA207CE2AF79 /* SDWebImageManager.h */, + 92B69B0DEB40C442AB2ADC07B34BC85B /* SDWebImageManager.m */, + 62151ACF530E51374C39D364235AFA4D /* SDWebImageOperation.h */, + 9058F96D704819B2A0F6684B39B0C099 /* SDWebImageOperation.m */, + 57D4B48E4C210929E9589D1100AB941E /* SDWebImageOptionsProcessor.h */, + C29A03C2AFD4B0F5D8BF98023C6FF1DB /* SDWebImageOptionsProcessor.m */, + 82AAAB32EFF03DF50DE0F3BDE9E08B77 /* SDWebImagePrefetcher.h */, + 9B91ABC4FE767EF9B29524FE05FE3B05 /* SDWebImagePrefetcher.m */, + D7F24AEB669B41FB840FC3265994A7B6 /* SDWebImageTransition.h */, + D575F36C1E6EDD59F11D1422A48E55A0 /* SDWebImageTransition.m */, + 242B076F0ED3FE11E21D15B9D8A1460B /* SDWebImageTransitionInternal.h */, + 60EDD094FFF87819FBFBF49862C158F2 /* UIButton+WebCache.h */, + 76F231FDBE07DF2E8598B84AE6F42E67 /* UIButton+WebCache.m */, + 54533E358EC0BB8F88B8CE800B3155AC /* UIColor+SDHexString.h */, + 6B8D2DB4FBD399283936E79054DABE66 /* UIColor+SDHexString.m */, + 7193DB664DE2D593DF3024BB2E5CE869 /* UIImage+ExtendedCacheData.h */, + A126E40197C1858FA6457DE6B54E59B6 /* UIImage+ExtendedCacheData.m */, + 7378BA5267CAEEB070919189B66AC060 /* UIImage+ForceDecode.h */, + 84CF436789724132021361D5B790596C /* UIImage+ForceDecode.m */, + C637E0C4C13DE3DF36894148A5AFCDEE /* UIImage+GIF.h */, + 9BC2E660550CD31850654E4D1D1930CB /* UIImage+GIF.m */, + 68D0F76361672D5AE19AA7A3E1F17994 /* UIImage+MemoryCacheCost.h */, + 28D644879EDCC0724B9E9DCE584C27C4 /* UIImage+MemoryCacheCost.m */, + 1ADD533B9B6366DF20F5C07E77B5D95C /* UIImage+Metadata.h */, + A161E7A48EFA8B5FEC7C634021047885 /* UIImage+Metadata.m */, + 6B1BD2A310E4036BEF412E83DEF25434 /* UIImage+MultiFormat.h */, + F2D7FA485AF4AD67531F65470D828E95 /* UIImage+MultiFormat.m */, + 0FE7DA7AC55C09B46CCBD5219EB43E70 /* UIImage+Transform.h */, + F0EB98CB11EE21869F4611899195CC03 /* UIImage+Transform.m */, + 27AA224BACACEDE0871836CDA0BEBD27 /* UIImageView+HighlightedWebCache.h */, + 1C5625DBC0E0D9A718B8A5684C4133F0 /* UIImageView+HighlightedWebCache.m */, + 072D3DDFA18BAD61219A856FCFB6093C /* UIImageView+WebCache.h */, + 3FFEF7A1EC3C534D688767B27AFD00FB /* UIImageView+WebCache.m */, + B0304615B87F014C7A2F955472AAA872 /* UIView+WebCache.h */, + 5A8CA1BDA8A39C4D281C5446829A79C7 /* UIView+WebCache.m */, + A9FA4C69177025693373FF18DE32587C /* UIView+WebCacheOperation.h */, + 2864CE6DB619F350FFC82A4F3DCB82DC /* UIView+WebCacheOperation.m */, ); - name = Pods; + name = Core; sourceTree = ""; }; - 43FA41754A123FE3461FEAE3521D2235 /* Support Files */ = { + 46B07D0057AFB0C5B9EBA58E801397C2 /* Support Files */ = { isa = PBXGroup; children = ( - 978762EA9EB02FDC6F4A9E3B2A6C378E /* SDWebImage-dummy.m */, - 58F431E7950BF51DE0CC7FC403065AEB /* SDWebImage-prefix.pch */, - 4A31F3C2047011D7FEA251187FF99574 /* SDWebImage.debug.xcconfig */, - 3F3E6E2AF0F64B23881FAD76A30314EE /* SDWebImage.release.xcconfig */, + 0AEDA5107977612DE1C70E29993551E3 /* CleverTap-iOS-SDK-dummy.m */, + ABED33F1106EC51CD6487BD70D6E507C /* CleverTap-iOS-SDK-prefix.pch */, + B65B774BD24CFB3C4E166FA1077BE8C0 /* CleverTap-iOS-SDK.debug.xcconfig */, + 969396169355A8FFC202FCBD4F9DED20 /* CleverTap-iOS-SDK.release.xcconfig */, + 01287A09E1886F13AA0E5615466ACDD1 /* ResourceBundle-CleverTapSDK-CleverTap-iOS-SDK-Info.plist */, ); name = "Support Files"; - path = "../Target Support Files/SDWebImage"; + path = "../Target Support Files/CleverTap-iOS-SDK"; sourceTree = ""; }; 74A5E8A19A94DB8D56741B3D29D14F2C /* Pods-ExampleProject */ = { @@ -882,344 +1072,79 @@ name = "Targets Support Files"; sourceTree = ""; }; - 8B1E9C7998DF93F0934D4F766DEA9B90 /* CleverTap-iOS-SDK */ = { - isa = PBXGroup; - children = ( - 361D1D7F2C740F7F39F8E8A869443D76 /* CleverTap.h */, - FE345882B6F962FFAECA8400DBEDB8E9 /* CleverTap.m */, - 615FBAC201C97BB559D8410362D37336 /* CleverTap+DisplayUnit.h */, - F1F4C780744FADA7A04D6B2B5DFF9149 /* CleverTap+FeatureFlags.h */, - A4B3ED3132AD0331B5BA77C3B125CBB4 /* CleverTap+InAppNotifications.h */, - 27A6FF119000AC9D0EAD078858B59760 /* CleverTap+Inbox.h */, - 922AC66290629750330762EF26ABC328 /* CleverTap+ProductConfig.h */, - A7FC5F2B781F1E802ADAE536FFB6157E /* CleverTap+PushPermission.h */, - 1904AFD42176A06DF30D894F2DE4BC13 /* CleverTap+SCDomain.h */, - 3ABE41468656CD53C58027665AC967BC /* CleverTap+SSLPinning.h */, - B7C1680AAA74DE1A0B177AD8C9FB8869 /* CleverTapBuildInfo.h */, - 81FBE933CE7AF8E701525948436E15FD /* CleverTapConfigValue.m */, - 7C8F687A9D2990315DEA8A801F99DEC6 /* CleverTapDisplayUnit.m */, - 86866E88CE96911DC543630F464CB471 /* CleverTapDisplayUnitContent.m */, - BF8EB5EB298FBFB1089E80CFF0FF8322 /* CleverTapEventDetail.h */, - 0E11A327EC315983FAA38A8A7B7E0479 /* CleverTapEventDetail.m */, - C3D56E91B262BDD2AB866F8D8221D353 /* CleverTapFeatureFlags.m */, - 9D3871DA8784E9C9EB3AB8E0B268D240 /* CleverTapFeatureFlagsPrivate.h */, - A603D557BEB6BB43E45C56310542F265 /* CleverTapInAppNotificationDelegate.h */, - 106D6A992CCFF8251E10EAA0AF9DE8C8 /* CleverTapInboxMessage.m */, - 2C73AA8A4B4F8985CC57034ABC529C52 /* CleverTapInboxMessageContent.m */, - 4B9FE5711A1F27FA0BCEF656B18EABC8 /* CleverTapInboxStyleConfig.m */, - 1ED1FAB598D03F264D52245F1AC50C10 /* CleverTapInboxViewController.m */, - 55FF0E3DD96B25BE58A09EC69203152B /* CleverTapInboxViewControllerPrivate.h */, - 0BE0A703C6059424FC07B079FDF31C41 /* CleverTapInstanceConfig.h */, - BAB275E090F899F1ADE75280F7AACC83 /* CleverTapInstanceConfig.m */, - 18B3469E769F028C337D592C29A46BDF /* CleverTapInstanceConfigPrivate.h */, - 4DE932A8C1BD6F8610BEEE61BF1E7E3E /* CleverTapJSInterface.h */, - 54F1E55B26CD9621341E2D71A1D4BB17 /* CleverTapJSInterface.m */, - 8C60C2689B971C64C4467358A5DF8F52 /* CleverTapProductConfig.m */, - AE5009351D59DDA739F20E23F66DAC08 /* CleverTapProductConfigPrivate.h */, - 899C8CBBD29A02E70EF11E9A3E0EBC47 /* CleverTapPushNotificationDelegate.h */, - 3ED3EF9F43B16534AD490195D29AE6ED /* CleverTapSyncDelegate.h */, - F2C5A1BF3384B7C6932508CC801E85FC /* CleverTapTrackedViewController.h */, - 033174CF8C10356EA929AA2A2F63A470 /* CleverTapTrackedViewController.m */, - CE1215F8CF4716B38421FC25F0C59C18 /* CleverTapURLDelegate.h */, - 9BB6777553FFD129A1D3D985F5EB85E9 /* CleverTapUTMDetail.h */, - 248954A7E01024145753167DB9D2C678 /* CleverTapUTMDetail.m */, - 30393578A859C72471B61413FA794A2E /* CTAlertViewController.h */, - 8D039F17DCF6EC1C3233A9ABF3617859 /* CTAlertViewController.m */, - 3F593F0C6D158D3DA2AE624960878FEF /* CTAVPlayerViewController.h */, - 6129CCE4074C4684269F3E03785430AB /* CTAVPlayerViewController.m */, - 669173AD593C28F43CFDA6C2DC808B2A /* CTBaseHeaderFooterViewController.h */, - 1793EF13406035CB7908922D224F7C94 /* CTBaseHeaderFooterViewController.m */, - C30ABEF34BE8C94244E6988AA930DA2F /* CTBaseHeaderFooterViewControllerPrivate.h */, - 84EEFFA5289F069FFC19F8EAA8819B6D /* CTCarouselImageMessageCell.h */, - 13FB82659B37E2BDE9A8512467362D24 /* CTCarouselImageMessageCell.m */, - 0460AEA43738FC0A6BC7B925687EC2DA /* CTCarouselImageView.h */, - A6E10B8976F63DB134390870DB4C3325 /* CTCarouselImageView.m */, - 30112E19287E77647E2EFAC046A1F00F /* CTCarouselMessageCell.h */, - E08F10F2BC4A009DEAC6EFA85855A79C /* CTCarouselMessageCell.m */, - CD88FA18A4C75C7555580BB68DD2E474 /* CTCertificatePinning.h */, - 7076906FF402F1D71DF488DE94A948B5 /* CTCertificatePinning.m */, - 145617DEF6E1987B40FF2807C0A747B4 /* CTConstants.h */, - 2E6028FB67F540BBF33EA4934AA5B0B7 /* CTConstants.m */, - 20676949C3F408F2513D14585D050C43 /* CTCoverImageViewController.h */, - A73649EFF82580D38E3F79F61D4F6870 /* CTCoverImageViewController.m */, - FC98D47A0C7E48C307516B8566F540DC /* CTCoverViewController.h */, - A3438026E12106F44F01403432CFF22B /* CTCoverViewController.m */, - FEE6DB459E0B2A1C4B8BB2937E38554C /* CTDeviceInfo.h */, - 5E6A826124FEFDBFE2CEA02ACD7E1B47 /* CTDeviceInfo.m */, - 6B6B0152B7B7EDE22C2AA23481CCE693 /* CTDismissButton.h */, - DF3B8CF15CE29D891A2D268AD9F71535 /* CTDismissButton.m */, - 06527721DFBDF9C95C1ACE1912F12F3C /* CTDisplayUnitController.h */, - F4C976AFC10EC48CA8139A81D5C11E01 /* CTDisplayUnitController.m */, - 3AD91DE2026B38642D3A1F6EBB816017 /* CTEventBuilder.h */, - 1A7C0ABEBF9B60257002286A5A4F9EFA /* CTEventBuilder.m */, - CC702A7E27F5806B3298D5C0A8B603AD /* CTFeatureFlagsController.h */, - 0AEF3B70819065A7D19945BD96049F84 /* CTFeatureFlagsController.m */, - 6D29F76DA161F9223DD1CD06482ACE33 /* CTFlexibleIdentityRepo.h */, - 13884828E45BD240D93462184FE5DFE3 /* CTFlexibleIdentityRepo.m */, - AC86ED680E7D9D0507D35341011AD6C4 /* CTFooterViewController.h */, - 242AB57CF992B95C1EDBD53C051B4DD2 /* CTFooterViewController.m */, - 22F694128D98CA3544E4D1EE3960E02D /* CTHalfInterstitialImageViewController.h */, - 904F0809DDBDD45452F46CE7DF8D931D /* CTHalfInterstitialImageViewController.m */, - E082868493C6525D9DED98D66B6B617C /* CTHalfInterstitialViewController.h */, - D4521A3DE515D4807A308F610B49FA6F /* CTHalfInterstitialViewController.m */, - E3A7E5F3E93A24CD627D8781121C5E8C /* CTHeaderViewController.h */, - A2C245205003347F82BCB23E1C18B9C1 /* CTHeaderViewController.m */, - 9E7B36DC74428213BA270533C9DEE3E3 /* CTIdentityRepo.h */, - EC8365F948FC4A7D0D595ED5C9CC10A4 /* CTIdentityRepoFactory.h */, - 35E0E473D94991D3023A7862B658B6C3 /* CTIdentityRepoFactory.m */, - 13840C00464674B4D0D8F62C4B58931D /* CTImageInAppViewController.h */, - 6FDD77F6E7D15A400B43A24A44D6C577 /* CTImageInAppViewController.m */, - 7BE2F943261F1A9F90F2BD363CDFFCCA /* CTImageInAppViewControllerPrivate.h */, - 506885A984C628CD5FAF8C550EE150C1 /* CTInAppDisplayViewController.h */, - 29C3E943E0FB635C67D74D3BE4077041 /* CTInAppDisplayViewController.m */, - F774F349AF10A9DFF7BE6B167535C64F /* CTInAppDisplayViewControllerPrivate.h */, - AF34EB8844737AB2B131CF2B93EDDFFC /* CTInAppFCManager.h */, - 00977057B0A51B848086499302224B72 /* CTInAppFCManager.m */, - 75B3CFC38824ABBC58BA8308B04C90A3 /* CTInAppHTMLViewController.h */, - A2A996AE88DCC08122226D17D57548DD /* CTInAppHTMLViewController.m */, - FBC28DA290D2949C9F9DAEFA027089C9 /* CTInAppNotification.h */, - 67244003DBBB806BE9E337D9F3704816 /* CTInAppNotification.m */, - F533489CA7EB2498456C16023FAFCFEF /* CTInAppUtils.h */, - 6254F565321707DE4C5C85773DFEB98E /* CTInAppUtils.m */, - 944EB67D9B36E082D7786C76971921D1 /* CTInboxBaseMessageCell.h */, - 8C6B506E7EB9C6801EC9C3A36EB27F2D /* CTInboxBaseMessageCell.m */, - 687789D2ADA5C9C64F30310F8D40F493 /* CTInboxController.h */, - 42FA5F8BA8699D1FD664A4BC847851C9 /* CTInboxController.m */, - EF56D43E904382DBE1EDC7E7A50148CD /* CTInboxIconMessageCell.h */, - AC4EF2CBFDE0A70BCA25525D5056A4E4 /* CTInboxIconMessageCell.m */, - FFB7A7727BD01FC0C7DB6B4605CD6A34 /* CTInboxMessageActionView.h */, - 72235C82281462B9DA224177C6C079CB /* CTInboxMessageActionView.m */, - 5953C0ADF560E64DD159D8F198362993 /* CTInboxSimpleMessageCell.h */, - EC79B2DDFF9810898AC8C8652B0CCF9D /* CTInboxSimpleMessageCell.m */, - 25B6CDEE094F880F63E761DCD3CF6D72 /* CTInboxUtils.h */, - 6E66AE9E3E3F4E6864C6E10496F541F0 /* CTInboxUtils.m */, - 839B3BEFF668F85036F42A09633B5AB6 /* CTInterstitialImageViewController.h */, - EE4DC1EAD6A3B6969BB2F97E6F297968 /* CTInterstitialImageViewController.m */, - E976ADF3D4855F86CC2BF8428AAC9744 /* CTInterstitialViewController.h */, - 67BE87CCFA63A9625862BC8BF3FFFBF3 /* CTInterstitialViewController.m */, - F62FF4FF3AC36500D5B52494678D743F /* CTKnownProfileFields.h */, - 54F3BAE8E64AB824642C525D1E190EE0 /* CTKnownProfileFields.m */, - C9C499D8DF5F7C1EEADE6640FC5DC95B /* CTLegacyIdentityRepo.h */, - DDB0E517F0C66B8396AFBB1552DB2B10 /* CTLegacyIdentityRepo.m */, - FA78454274A9CBEC1AD24CECBD3329D8 /* CTLocalDataStore.h */, - 6089E0CC8E5CDE81ADB3E9995BAF3CA6 /* CTLocalDataStore.m */, - 84BE8FE013BCAB7FA6BEEF8600098678 /* CTLocalInApp.h */, - 70FD6DEC3A1DB47CE299F4C86AB3B42D /* CTLocalInApp.m */, - 985DA9E246CF3DD086492BF78060EC44 /* CTLocationManager.h */, - D6918B0BB591EBD8C33645D4641F7F8E /* CTLocationManager.m */, - A067903B414F581D6FF39779F05D6E36 /* CTLogger.h */, - D13384AD2FEB16BE536B63612705C56B /* CTLogger.m */, - 66C5D9D96462BEF0B3A79581DBC220E1 /* CTLoginInfoProvider.h */, - 59D33BDAFD571BD7B8CB0494A8AE011B /* CTLoginInfoProvider.m */, - FA519E2D3056E7FF8BFD2EDDFBA96F0D /* CTMessageMO.h */, - 7F04FC081BF0DB766AA8492D755A9E38 /* CTMessageMO.m */, - 3CB79CE2027946922B384A82C109AC70 /* CTMessageMO+CoreDataProperties.h */, - 6A321A0B66A4C350B3BCB28CE536FEC4 /* CTMessageMO+CoreDataProperties.m */, - EF7ECE3CC8E7B0401359A72B25073173 /* CTNotificationButton.h */, - AC8BBA70E2E95FDB4BA0944100C1D446 /* CTNotificationButton.m */, - 91B47255C79FDBA4494F1FFEE7A53442 /* CTPinnedNSURLSessionDelegate.h */, - A7CEA0AE86662D5C6ADF880963697AE6 /* CTPinnedNSURLSessionDelegate.m */, - 25DCB73F49A70C4883484C3C0057A061 /* CTPlistInfo.h */, - 4D8319B3ABEE67199B9C53AAA7E4D2C8 /* CTPlistInfo.m */, - 119ED479841230E7547357661F9CC740 /* CTPreferences.h */, - 53C8D27F6E1B0515878FFB15126A1C5F /* CTPreferences.m */, - 9061233A283F25428E131229D097643A /* CTProductConfigController.h */, - 13135DDF65FF9179653F83CEFC608B57 /* CTProductConfigController.m */, - 6CDE3260E53973DACE1DD5C2E8A90F56 /* CTProfileBuilder.h */, - 25A554939917370879F458EEA747A354 /* CTProfileBuilder.m */, - A625274681FC0C6ED2D1F234C4242D96 /* CTSwipeView.h */, - 06A72E01CEE4935C082F4A84A7450C7F /* CTSwipeView.m */, - 7CE6982D765FC929E83F5AA0B9C1C12B /* CTSwizzle.h */, - E7D1CB2FE64A8567237BCC54BD448FDB /* CTSwizzle.m */, - BC21AF264405254C0FD43A3FB3CEA59E /* CTUIUtils.h */, - 93A5DBECA299C2A050495326C865A719 /* CTUIUtils.m */, - 0CE47ACF5C39780F7B58F6C1A8EB4763 /* CTUriHelper.h */, - 1B69E867C28CB2003F341BABE4F09747 /* CTUriHelper.m */, - 1C09E0FEBAC195465D9ADE7FE7A92825 /* CTUserMO.h */, - 8FD9F0672E9BE622CDAE944295DBAF86 /* CTUserMO.m */, - ACB4A110AD3840CDDFB1EACAD39F6FFD /* CTUserMO+CoreDataProperties.h */, - 3044E0A40F903962407D6CE836CA25D1 /* CTUserMO+CoreDataProperties.m */, - C44979E07A186F9374A6DE6139F73AAD /* CTUtils.h */, - 89B7A084DA540E3C81AB5848ACF2AB34 /* CTUtils.m */, - A1AF65418FE77B2BE1D118E253E9BC84 /* CTValidationResult.h */, - 38A65425915044808FCE3067CC9A24B0 /* CTValidationResult.m */, - 0F776E448D1B1C56F6FC0D145271F503 /* CTValidationResultStack.h */, - A0519B1B3CE3CB1392ADF8F19A017255 /* CTValidationResultStack.m */, - AF9B9F9007EDBD8F51DFF63D0E646C33 /* CTValidator.h */, - F114C4C845E747C3BCF66320786C224E /* CTValidator.m */, - 49427581ECF5C10C58702465FEFE51B6 /* CTVideoThumbnailGenerator.h */, - F54EEF4EBA5C908306A8BBA7497F338E /* CTVideoThumbnailGenerator.m */, - C2200CC9B31A0AA14B84B49BA76F4632 /* UIView+CTToast.h */, - AB9AF8983D11AFF26E8D5B7247E3BFB6 /* UIView+CTToast.m */, - DA4D342D3D6CC85A6FA3DD0300CC7D0F /* Resources */, - CC4503FE4FA8383DC9779AB8A5C53D14 /* Support Files */, - ); - name = "CleverTap-iOS-SDK"; - path = "CleverTap-iOS-SDK"; - sourceTree = ""; - }; - BBD334FF338BF518E38DCC617BBFE85C /* Core */ = { + BDDB299ECEAC4C6DC05F4D4BA4451A7A /* Resources */ = { isa = PBXGroup; children = ( - 0D3BB4A10F6FEFC7B88D4774FDC95644 /* NSBezierPath+SDRoundedCorners.h */, - EB67F91C6EA0821C9C8A0A18D44B1DF3 /* NSBezierPath+SDRoundedCorners.m */, - D0CEDCAAE2DED819B7EF2362453BD84D /* NSButton+WebCache.h */, - 81B3152A60BCAC1275A36E74E9F91953 /* NSButton+WebCache.m */, - CD0B99BF2FA75FC8BB442E62E0C38C7D /* NSData+ImageContentType.h */, - 601EFBCD582B5BCABF13D902BF6337FC /* NSData+ImageContentType.m */, - 4E24FB26B59AFFBE5A6D7903FB586762 /* NSImage+Compatibility.h */, - 024B3B7633A7E77942EAC77961C330B3 /* NSImage+Compatibility.m */, - F8F21E1F65344857B4DDF90086E7FF86 /* SDAnimatedImage.h */, - 1ACF4B9D4BDA654D22EC52C4AAB4C574 /* SDAnimatedImage.m */, - 1DE5E75481568A2B32AE367997CFFAC7 /* SDAnimatedImagePlayer.h */, - 7F8C35246B78E9E1E1BED09C8C2F5522 /* SDAnimatedImagePlayer.m */, - E1060D767592EFFBE89138EF9D81B83A /* SDAnimatedImageRep.h */, - 1FC633F22C334C8A987C40E4C26453B7 /* SDAnimatedImageRep.m */, - 0C061BA06720B813A0EFDCAC2769DBAB /* SDAnimatedImageView.h */, - DFFDEDE53EDB6A617BDE61990D0F58A0 /* SDAnimatedImageView.m */, - 595DEA2D8B6FC68402BAD6DE0A0D80E8 /* SDAnimatedImageView+WebCache.h */, - 9AF1D56FF26ED67B5DBEB3984242C583 /* SDAnimatedImageView+WebCache.m */, - 76F350D38B0C254210F7E2CE1C75366B /* SDAssociatedObject.h */, - A0E97F9E705E445B8D70BB3A85BE02C4 /* SDAssociatedObject.m */, - 6F3D47270216FD284A388DFF4DE9C56B /* SDAsyncBlockOperation.h */, - 6E48469D3F9613046510073B7C379842 /* SDAsyncBlockOperation.m */, - E0318D0477B7511F2C52012E58B724E8 /* SDCallbackQueue.h */, - 76C390DCF370788212F9E9D8FEE55C75 /* SDCallbackQueue.m */, - C74704433D2A2BFB8FA5832C59912D62 /* SDDeviceHelper.h */, - 677EAC72DE72381FA70EE618BB368813 /* SDDeviceHelper.m */, - 5E0ABB2B74C7B86C1313D20D72877318 /* SDDiskCache.h */, - 7919F9A07E64A2BD59B842EE96FF7630 /* SDDiskCache.m */, - DD64A75C7AE6643D5E75DA94744975D8 /* SDDisplayLink.h */, - 544872F3D43A607F07F20E57ECE8DDE8 /* SDDisplayLink.m */, - 352C85867DA59C648DED2E777E3A5A07 /* SDFileAttributeHelper.h */, - 3C078D43EF7C4DBACEB842400EA730F2 /* SDFileAttributeHelper.m */, - B85CE196B1296602AA96E529922802AF /* SDGraphicsImageRenderer.h */, - E0025D4100845ADE4C3E74DC53D622E1 /* SDGraphicsImageRenderer.m */, - 12F25D87FD5A9EAA359A3BB6EECDDD81 /* SDImageAPNGCoder.h */, - 5046ABCA583A9E2F4DA976003F3ACB43 /* SDImageAPNGCoder.m */, - D643CE43B3EC5A054BC61EDDA110E38B /* SDImageAssetManager.h */, - 4727100A928328776F720D1D23037FB2 /* SDImageAssetManager.m */, - 2C3A77652661EB8782FBB115D20F728D /* SDImageAWebPCoder.h */, - 3C2197F809548184A018851967EB483A /* SDImageAWebPCoder.m */, - FBF52036CD383B558A63419864C8240C /* SDImageCache.h */, - EDA7216F106C2008F8F27D6B3952CD07 /* SDImageCache.m */, - 06BDA0745D108411EE3D5412EEC1B5D8 /* SDImageCacheConfig.h */, - AD990BCAAC5994523FA1F32A3EE4426E /* SDImageCacheConfig.m */, - CDB7B37365F9AE79F92D0E1B8F54A63B /* SDImageCacheDefine.h */, - F6C7586BB8EF3BE50BBB00BB8CFF52B5 /* SDImageCacheDefine.m */, - 224D29D66442C01D3B2E680504619C73 /* SDImageCachesManager.h */, - EF61764DECEEFF4DF9B3DB3F2FBB7DF0 /* SDImageCachesManager.m */, - EF100CCC38AFB29E96AA44FDE2641B0B /* SDImageCachesManagerOperation.h */, - 605024568EE8982237697D4A5102F34F /* SDImageCachesManagerOperation.m */, - 810AB2078A12297C90E2F3E972F1F6D5 /* SDImageCoder.h */, - A56BD3B3C80A362ABEAB62ADCAF27365 /* SDImageCoder.m */, - 276E13A14ABF3CCD0E8EE8FAB928CCFB /* SDImageCoderHelper.h */, - 85A7A9B6200470118549E81DE56FB0B2 /* SDImageCoderHelper.m */, - 2764DB09501BF607C50C960B9AAC2BA2 /* SDImageCodersManager.h */, - 9AEC614EA871320A2EE1021421EF9A8F /* SDImageCodersManager.m */, - E69562FCF9E76BDE9B738180B7DEEF69 /* SDImageFrame.h */, - 0289C1CE681412D099FD995B244D9DAB /* SDImageFrame.m */, - BD1FAA1BC6547C6AA995CA092E834279 /* SDImageGIFCoder.h */, - 066F4570FFF1C2F268D37EAC046FAE46 /* SDImageGIFCoder.m */, - 759330BA7552EDD8A8B2A96A9D232F76 /* SDImageGraphics.h */, - B8DBB11FA7CB9D4340893CF701EABAEF /* SDImageGraphics.m */, - 9C9B9032EFD98FE57E90584B9DAA8289 /* SDImageHEICCoder.h */, - BB9C5DC5CC7B5364D54D6531BD109BED /* SDImageHEICCoder.m */, - 0921D607B54D097A3AE18105C5E152EB /* SDImageIOAnimatedCoder.h */, - 79ABB71817CB46FFFB2DDF0FD4FD935B /* SDImageIOAnimatedCoder.m */, - 7C087878E088FE09B94BFCFB8E06540B /* SDImageIOAnimatedCoderInternal.h */, - 16097C7F6514F1081519CE4944E32E70 /* SDImageIOCoder.h */, - 6E3FDD985EEB50BA51CA09763A782BB4 /* SDImageIOCoder.m */, - B4CCEA7B9AB8179243AA7BCF8F1843F0 /* SDImageLoader.h */, - EB7C3FAF9A4F3A4625DDA49824488AF1 /* SDImageLoader.m */, - B009E769BD71FA9044E3F54AD16E160C /* SDImageLoadersManager.h */, - BD9A547C62FECAA5332C9009FEA392F7 /* SDImageLoadersManager.m */, - 51340ED429D80618086CFFE176D39C55 /* SDImageTransformer.h */, - D62697E5CD8268785798C23669C1224E /* SDImageTransformer.m */, - 0FE078B754147AD6AA8120C7EB3FAC1F /* SDInternalMacros.h */, - DB94804330549717181057300B7F6498 /* SDInternalMacros.m */, - 70FE796A747457D7FE31038774F14D69 /* SDMemoryCache.h */, - 7F57416F3E2C663F3F3C0F8D24B6C359 /* SDMemoryCache.m */, - A296FFEC70040B26528114F1BBC673F9 /* SDmetamacros.h */, - 1283E8174B8DBD2CA14BAA8F5B25BC68 /* SDWeakProxy.h */, - DE99AB43A5D54C7057634AB35C1AAF56 /* SDWeakProxy.m */, - 8B57355733C9179A4100DF8E06430ABA /* SDWebImage.h */, - 5E8350B2002BB786078CE37E7708D08E /* SDWebImageCacheKeyFilter.h */, - 5ABCFB0D9B6A824DA652BB608CD41863 /* SDWebImageCacheKeyFilter.m */, - C7F1336788EA894A86B97FD32BC6DFB2 /* SDWebImageCacheSerializer.h */, - E596FAC6EE4112F4DF1BE215186B0F9C /* SDWebImageCacheSerializer.m */, - 6A494003781D15E46C7C9C5303FF3909 /* SDWebImageCompat.h */, - 63504EE310ED0E0DFF19CAD89CE47C4A /* SDWebImageCompat.m */, - B91DD3377C64B65B4ADA4319EB97C604 /* SDWebImageDefine.h */, - A077996AAE18318A5E592ADE7EB6B517 /* SDWebImageDefine.m */, - EA5CA0104656A1A9763EB85238DE649F /* SDWebImageDownloader.h */, - 720D2862C25FCC0FA7F210E5A531EAC7 /* SDWebImageDownloader.m */, - 04FD1108A33776E813B0A3FAE12269C8 /* SDWebImageDownloaderConfig.h */, - 746819FC279E5153C310209871F890B1 /* SDWebImageDownloaderConfig.m */, - AE73A51DB637DE91619FDD0DF9F419F7 /* SDWebImageDownloaderDecryptor.h */, - 2BB235C5DC09791050F33C45042CBB7A /* SDWebImageDownloaderDecryptor.m */, - F730725CEACF1ACCAEFDBFE191F983B0 /* SDWebImageDownloaderOperation.h */, - 85A87D21F33A8CB6456E42A48F586276 /* SDWebImageDownloaderOperation.m */, - 9FB5856B3BFB7FBD78D8E03DCE916265 /* SDWebImageDownloaderRequestModifier.h */, - DB8D32DDEF5169BDA55A561A2652A25D /* SDWebImageDownloaderRequestModifier.m */, - 201377F74FD421E0D078F83614DC2290 /* SDWebImageDownloaderResponseModifier.h */, - 3CCDB41173AC767116D29B9EE3C08812 /* SDWebImageDownloaderResponseModifier.m */, - 1D888DE65D42078ECEF9CE4821F85E01 /* SDWebImageError.h */, - 9C242DBB319B050770DF72E679427AFA /* SDWebImageError.m */, - C302AD11805BCA7D0694D6F4243C46A0 /* SDWebImageIndicator.h */, - C98DC5F1ED12F6D7F1489BA091C2680E /* SDWebImageIndicator.m */, - 015702D9209383ABECC2F014EF176A39 /* SDWebImageManager.h */, - CDA01F4A78F48C8EC956593EA48BC1C5 /* SDWebImageManager.m */, - E14AE69271E5AF7EAD14172603EBA07C /* SDWebImageOperation.h */, - 4A4B859055BF3189D4047D9299187667 /* SDWebImageOperation.m */, - 5603437C2A98B847A4C1473FFDE76873 /* SDWebImageOptionsProcessor.h */, - D30E57ED6E0D7C3DEA42DADADDCAAE2B /* SDWebImageOptionsProcessor.m */, - E5CD5A312CF73AAEF2992E927C3D7AB6 /* SDWebImagePrefetcher.h */, - E1410A2C00AC668EAF25B299A2AF9B85 /* SDWebImagePrefetcher.m */, - A46DFEF103DBD055CFE37D69064D9616 /* SDWebImageTransition.h */, - 6A6F2F4646F47D8932E0D70223446B7B /* SDWebImageTransition.m */, - A915A0FF4A83C350C24ACCD31658F3A9 /* SDWebImageTransitionInternal.h */, - BDCA5A479CBEF9B892181A5D3815CFF2 /* UIButton+WebCache.h */, - 3EE98578BF7AE670C9CCE5F2A3031E6C /* UIButton+WebCache.m */, - BF9912E98C14E90D196DA77E07B76723 /* UIColor+SDHexString.h */, - 24475BB0DC666C02D5B6D5CF4B3BCF9F /* UIColor+SDHexString.m */, - 90A4753BB9D2D9F51791019C111E1974 /* UIImage+ExtendedCacheData.h */, - 4A14E1B6BC96E56AE1BD9A84E8FAEAD8 /* UIImage+ExtendedCacheData.m */, - 6F610A1116D03C974539810DFE0B11D1 /* UIImage+ForceDecode.h */, - 43C45D9043521F22120A7C1BDE55F27D /* UIImage+ForceDecode.m */, - 04D4ECDCFD33424F162907BC3F828D98 /* UIImage+GIF.h */, - ECE794CC220D1CAE29FCD9E5FFF15DB7 /* UIImage+GIF.m */, - FE5D961825AC94A63D2DCED77E9DC6E7 /* UIImage+MemoryCacheCost.h */, - FF51E4B5C462C948E2B00EA02D8852BC /* UIImage+MemoryCacheCost.m */, - F13429BCEC72E1E562AEE8C9D71837BE /* UIImage+Metadata.h */, - 0A03C4A385534A0B4EEB006812E7F6F8 /* UIImage+Metadata.m */, - 277F88B4B092203525E7B5017AA77C07 /* UIImage+MultiFormat.h */, - 033BD17E6BB04A6B7C86D7FDDE7A8F3E /* UIImage+MultiFormat.m */, - 98F13508A29E678B97ADC29B892300A9 /* UIImage+Transform.h */, - F2F11EF6692F98BAF5BEFDFDEB57A4CB /* UIImage+Transform.m */, - FD25DF43629CB59D5874ECBC0A37C73A /* UIImageView+HighlightedWebCache.h */, - 02AE8425368F9EAF709FB94566FB00DA /* UIImageView+HighlightedWebCache.m */, - A727AC487F509F17E9A49152D5DA8ED0 /* UIImageView+WebCache.h */, - 9C48F24B861E6453ADBED947235E486A /* UIImageView+WebCache.m */, - A91F72EA20CFAB8860E455B57D684CB4 /* UIView+WebCache.h */, - 88DF7715A5FFF427F7B16A6D4B9C7383 /* UIView+WebCache.m */, - A92115ED235E1A875EE46AA6978A7D92 /* UIView+WebCacheOperation.h */, - 86A12E75A297D84531417AC7B582D496 /* UIView+WebCacheOperation.m */, + 58C1D514F3354D1F64764489197D76AA /* AmazonRootCA1.cer */, + A00DE791EE1ACCEE67F26E19133FD958 /* CleverTapInboxViewController.xib */, + 8758D25C574A6464BCC80D8AAA3B42CC /* ct_default_audio.png */, + 43A8601C1BA9E97614AC6C805239C8D4 /* ct_default_landscape_image.png */, + 42D5F27B93C393ED561D183ADDC802E3 /* ct_default_portrait_image.png */, + 18A60941084FFBED607414476B58A2E7 /* ct_default_video.png */, + 62736F7BD78DBD5F48E216D93FAC7F51 /* ct_volume_off.png */, + 08B5A743D439D09526196C2FCE48E865 /* ct_volume_on.png */, + 0515607DBF0D6B125E8BFB82F835FADF /* CTCarouselImageMessageCell~land.xib */, + 4189F6DA156AF3AE1AAA33374F68E897 /* CTCarouselImageMessageCell~port.xib */, + 34D731CDDCA2D8E3C6B7DCCFBC9B0546 /* CTCarouselImageView.xib */, + AE63C5E4788D3C82980131B21AECB899 /* CTCarouselMessageCell~land.xib */, + EF3A3BF322621F36A6739CA93B8333DD /* CTCarouselMessageCell~port.xib */, + FD9D4485B60922E08545942235FEBA72 /* CTCoverImageViewController~ipad.xib */, + 2F0CCB6AB9EAC5621C7A4812CC7B741F /* CTCoverImageViewController~ipadland.xib */, + 6646ABB6FFA9E81CA56737DC14680B96 /* CTCoverImageViewController~iphoneland.xib */, + B18A879294BF1D02F8318F5E67C6BCE5 /* CTCoverImageViewController~iphoneport.xib */, + 1F840FF1C673738137F970C64980B8AD /* CTCoverViewController~ipad.xib */, + 3BA9E7B5DB6C1BA1382A2BE8748132F2 /* CTCoverViewController~ipadland.xib */, + 3FA008F1C8309BEFD138C22BB8B9F649 /* CTCoverViewController~iphoneland.xib */, + 042F805C908069D0280F6DF68E45D4A5 /* CTCoverViewController~iphoneport.xib */, + 14A00AD11775B0196583183CCB6514A1 /* CTFooterViewController~ipad.xib */, + 9E1C1344106FB036B19AAE79D5FF8983 /* CTFooterViewController~ipadland.xib */, + 17074DB3E29934B1BD5CEAB8646E86EB /* CTFooterViewController~iphoneland.xib */, + 8356190F1BBFC342C1D5C7369D99B19A /* CTFooterViewController~iphoneport.xib */, + 92C3F7D4BBB4CD445655F3E37F835E08 /* CTHalfInterstitialImageViewController~ipad.xib */, + 066E3D76D48EB8E67689D966B62B6E7C /* CTHalfInterstitialImageViewController~ipadland.xib */, + AA6660AAEBCAF9D8645A2FC707EE87FA /* CTHalfInterstitialImageViewController~iphoneland.xib */, + 1C92AAA703796848D77C8068C6ACB96A /* CTHalfInterstitialImageViewController~iphoneport.xib */, + EACDD7983C9F7256D282C4DAEF8B072C /* CTHalfInterstitialViewController~ipad.xib */, + FA17520E67D4436C04BB3165D482F662 /* CTHalfInterstitialViewController~ipadland.xib */, + A2ED29FDDB9333449AFB73E3AFB35B18 /* CTHalfInterstitialViewController~iphoneland.xib */, + 92D3AC6F9BEF3101CD0789592594E2DD /* CTHalfInterstitialViewController~iphoneport.xib */, + 5348BA9393A2E2359BB7AEE6F72CD35D /* CTHeaderViewController~ipad.xib */, + A19F4BF77B408E8B0A84040132B9FFB1 /* CTHeaderViewController~ipadland.xib */, + 654CEF2FF9342DCF99C2CA00FBF7FF60 /* CTHeaderViewController~iphoneland.xib */, + 30CEC3B0B581886F8AE6FBA068DFDF4C /* CTHeaderViewController~iphoneport.xib */, + E6B0ABD50999FA13A03E0D81914153D4 /* CTInboxIconMessageCell~land.xib */, + AD786A5A50AD9691BC5833F0FB72D171 /* CTInboxIconMessageCell~port.xib */, + E8696319C55D552EFC8E24716BAC9039 /* CTInboxSimpleMessageCell~land.xib */, + A793776127A3B47D8D12E6B6010F8305 /* CTInboxSimpleMessageCell~port.xib */, + B214EAC435EE45FAAF12779FAD983D6E /* CTInterstitialImageViewController~ipad.xib */, + 0E3DEF3A0F8263EB93C203B353DCFAC1 /* CTInterstitialImageViewController~ipadland.xib */, + CDF6EBDB011A01BDEC0892C7C892A8D2 /* CTInterstitialImageViewController~iphoneland.xib */, + 5A4683B67574C68C295DE9E499716966 /* CTInterstitialImageViewController~iphoneport.xib */, + 0B61D1A1EB2DF262FCBA45698C1963DB /* CTInterstitialViewController~ipad.xib */, + 6483032B6BA4471D0B7ABD524E25A481 /* CTInterstitialViewController~ipadland.xib */, + 2BA54A89FEFCD1A6AA5341DEC39DF022 /* CTInterstitialViewController~iphoneland.xib */, + AECC5FFB054750810D65324CD9C840ED /* CTInterstitialViewController~iphoneport.xib */, + B26258BD72C158EDE1CC947EAE7C3253 /* ic_pause@1x.png */, + 73160AE1D1F3C62D3CFC44F9A9AFA032 /* ic_pause@2x.png */, + 56265E3EF3C54778C8E17FDCA7AEF211 /* ic_pause@3x.png */, + 337056D0046D9B8DF1E7AE7E91938ACA /* ic_play@1x.png */, + 11CC08AA7B4BEC8E1A401D00547C817C /* ic_play@2x.png */, + 8B3743F53459AA3B740D28D8A8E8AFC9 /* ic_play@3x.png */, + 8926ACFFB0E29BD74DD31FDE2409CBEB /* Inbox.xcdatamodeld */, ); - name = Core; + name = Resources; sourceTree = ""; }; - CC4503FE4FA8383DC9779AB8A5C53D14 /* Support Files */ = { + C9130D0CBA088E2E477C74D4E8FA18C9 /* Support Files */ = { isa = PBXGroup; children = ( - 2347F10D864FD03D80C0CF0719230162 /* CleverTap-iOS-SDK-dummy.m */, - 28845DE73E0CF6502B3003F57B03F862 /* CleverTap-iOS-SDK-prefix.pch */, - 50043A57557B4D50B6E1A5523BC31CA3 /* CleverTap-iOS-SDK.debug.xcconfig */, - CD8C3A52AE627F2ED06D9CAC39015E32 /* CleverTap-iOS-SDK.release.xcconfig */, - 6FC38E6226C1E9BD2D761C95F3F5094D /* ResourceBundle-CleverTapSDK-CleverTap-iOS-SDK-Info.plist */, + B16D6EB0AD2B77DBCA9C30AE7D08F8B9 /* SDWebImage-dummy.m */, + 7C4249A655E86EBBCE091C5C68AEEE01 /* SDWebImage-prefix.pch */, + D87B486326D36E05C557D980109B159D /* SDWebImage.debug.xcconfig */, + 18AEB7DD70D4271F8C34724DFB022B9A /* SDWebImage.release.xcconfig */, ); name = "Support Files"; - path = "../Target Support Files/CleverTap-iOS-SDK"; + path = "../Target Support Files/SDWebImage"; sourceTree = ""; }; CF1408CF629C7361332E53B88F7BD30C = { @@ -1227,80 +1152,214 @@ children = ( 9D940727FF8FB9C785EB98E56350EF41 /* Podfile */, D89477F20FB1DE18A04690586D7808C4 /* Frameworks */, - 0B820D33D095B0A02F95C3CF4E7FCA83 /* Pods */, + 226DB95B4838BFFD0866B3990E728265 /* Pods */, DE2D3581C26B9457EF3149B2FCB387D5 /* Products */, 75E4EF665B932048B84DEC750EB22267 /* Targets Support Files */, ); sourceTree = ""; }; - D89477F20FB1DE18A04690586D7808C4 /* Frameworks */ = { + D4A33264B32C8A02C501550183B246D3 /* CleverTap-iOS-SDK */ = { isa = PBXGroup; children = ( + 540FCBD78A583F628B0BE7A9230883A3 /* CleverTap.h */, + 28CB0DEC3C288C1997C84C66EFBC6A38 /* CleverTap.m */, + F5FD179158AF237B12219C05D1F28770 /* CleverTap+CTVar.h */, + F1763BF58D06B7427273F32A2283E3E3 /* CleverTap+DisplayUnit.h */, + AD3389FCCB97A8B643FE0B72D4910E9C /* CleverTap+FeatureFlags.h */, + 7F72BE1573DD68EF528B919FA972994B /* CleverTap+InAppNotifications.h */, + 3F8C86FC239374BB7616CDE3817B0B91 /* CleverTap+Inbox.h */, + E2C4B1B69335DDD69A4416BBCF44C29C /* CleverTap+ProductConfig.h */, + C21113C7ABE5D58C7B5D8A767AB87EDE /* CleverTap+PushPermission.h */, + 8E7A34655DECA81F9433460ED57974CF /* CleverTap+SCDomain.h */, + 38C29C3AA0CDD6D72DAE6C9465271799 /* CleverTap+SSLPinning.h */, + 6459433FB7E3DDB7E5A105A2140CAAB9 /* CleverTapBuildInfo.h */, + 815017DE486E64617014A132A508D88A /* CleverTapConfigValue.m */, + 4805ADA4EFD933AF935333AD27026F66 /* CleverTapDisplayUnit.m */, + 83B72672CFF90E84BE416ACB8A78A3CF /* CleverTapDisplayUnitContent.m */, + 2C9D900235DBBAFF7B0F26C81A41B383 /* CleverTapEventDetail.h */, + 8E9F8F922FB769E9F3BDBA38BDFAB227 /* CleverTapEventDetail.m */, + 049115AFC648ED4EA10CA89F8318AB28 /* CleverTapFeatureFlags.m */, + BFDAE7711879A5C3246459439F8D05BE /* CleverTapFeatureFlagsPrivate.h */, + E22E04F6D0F53CE5B934800E64449F36 /* CleverTapInAppNotificationDelegate.h */, + 568B638F3768B6CC8B852CE0BD936A57 /* CleverTapInboxMessage.m */, + 36B44ED1B2078097B1E43BA6AF848623 /* CleverTapInboxMessageContent.m */, + D8606FB02BA85C96058A4BCDD8D0CD32 /* CleverTapInboxStyleConfig.m */, + B9EB6FA72B18630E084FEED4B0D44D3B /* CleverTapInboxViewController.m */, + 966D64D7B66169014F8898D7F50D10DA /* CleverTapInboxViewControllerPrivate.h */, + 789AECDB6BCEC4052AC168E08651DB40 /* CleverTapInstanceConfig.h */, + B503F11D6CAF66334A97EB5FA745C44D /* CleverTapInstanceConfig.m */, + 61B3ED5E2F671148F4B209D044672C81 /* CleverTapInstanceConfigPrivate.h */, + C5A86153196CF9C1F723EB97D4A3DB8B /* CleverTapJSInterface.h */, + 0295F8FF9B3B7B18E094424ABB7E69E2 /* CleverTapJSInterface.m */, + C7701B9AEE68F00BE68BAB3888A54C72 /* CleverTapJSInterfacePrivate.h */, + BC9ED9FC52EA1C2335A86C36D0153FB7 /* CleverTapProductConfig.m */, + 14954B163FCFE6D39F8B5008413C1938 /* CleverTapProductConfigPrivate.h */, + 32375B1CFB51BD51EFA8FFE263A283C8 /* CleverTapPushNotificationDelegate.h */, + 2C02DAFB9B96E441E90EEAB2911DCD81 /* CleverTapSyncDelegate.h */, + 79F80A00F4B22E8BBEE4EE65632E6A76 /* CleverTapTrackedViewController.h */, + CD8B5B3AC14A2DD84A689A8C9148B05D /* CleverTapTrackedViewController.m */, + 14E7CF52089CEF3EE9BEEF11CC107111 /* CleverTapURLDelegate.h */, + 96B641C4C300927F8E23F5FB9593879E /* CleverTapUTMDetail.h */, + BF6459D485B109F3D921C9AF73F73CCA /* CleverTapUTMDetail.m */, + 4EE6FD4305EB45586703A25949DEC14D /* ContentMerger.h */, + D3C029CEA4014722106EB5B25D844546 /* ContentMerger.m */, + 61DC36655B4D1581FDFB6B14F3C6D1E2 /* CTAlertViewController.h */, + EBB6985D2723C9E6779038254BDF1161 /* CTAlertViewController.m */, + 7F457C8F245828D2FB9C428C43743DA0 /* CTAVPlayerViewController.h */, + 151964BDD6348393DEAD244DF26EB2A3 /* CTAVPlayerViewController.m */, + 6B9F39AAC74118DCFDFC537921D37BF9 /* CTBaseHeaderFooterViewController.h */, + E7F32C6348442E0E1840397E590C23F5 /* CTBaseHeaderFooterViewController.m */, + 5706ED3C925D81E1BB354639B6BE0324 /* CTBaseHeaderFooterViewControllerPrivate.h */, + 04A9A894D36D94E0CCFBD33FB53D7BAC /* CTCarouselImageMessageCell.h */, + 5C6D076D530B0AC88BB1B995ADE8214D /* CTCarouselImageMessageCell.m */, + 56F276190FFFDABDF3393EB5E50C6321 /* CTCarouselImageView.h */, + 630B2A2DECD33C49CE25BCCF77D89D94 /* CTCarouselImageView.m */, + EAFE8B9444318520DC477422A5CBB09F /* CTCarouselMessageCell.h */, + 85C2AC280BB3BBA0A7099C7445ED2595 /* CTCarouselMessageCell.m */, + 7105804B4EDFB9C3431CE93921E7D60D /* CTCertificatePinning.h */, + B3C2D48885392DDAB8C17092E4EAD9B2 /* CTCertificatePinning.m */, + 62AE043505F38506F90A81C9BD24088F /* CTConstants.h */, + F7634FC060FC53D1C538F867C2D969A8 /* CTConstants.m */, + A01E8D306DD807DD70EE6C69EA745B42 /* CTCoverImageViewController.h */, + 88EED7FE2B8CDF0BF33275065C84E390 /* CTCoverImageViewController.m */, + DC096C2F42FD8E6E49CF512117B3BB41 /* CTCoverViewController.h */, + C3A8FC159A8822520A38B5B002564A41 /* CTCoverViewController.m */, + B987FA4234DB3F9FEC1F86D423CA7CDC /* CTDeviceInfo.h */, + 0A86E5FDEFE99EDC2EFECFD36BBB923A /* CTDeviceInfo.m */, + C5B3BE729F0ADD8A8B2EE9192205BBCA /* CTDismissButton.h */, + 700DE0D541492FF6D1D3D7595D969F06 /* CTDismissButton.m */, + 50297EC54776A6B825653AE3B69F0B1A /* CTDisplayUnitController.h */, + D53EF57DD295B8D287FAF67C46C2A538 /* CTDisplayUnitController.m */, + FA7B344FE5E97521F739E0B25F71C615 /* CTDomainFactory.h */, + 08EE07580B26497F4AB762EB97F9BE83 /* CTDomainFactory.m */, + A7F188562C55AF10922CE49A375732AD /* CTEventBuilder.h */, + 388808CAD70F9737088E9B86D3F5BE2A /* CTEventBuilder.m */, + 303EF716D7AD65E33CD2B835FE050894 /* CTFeatureFlagsController.h */, + 4EFAC8D67EC96653F156D4384693FF73 /* CTFeatureFlagsController.m */, + 9443631DDD8A059339660AB9FEA1C118 /* CTFlexibleIdentityRepo.h */, + 8AE9EEF963884F0F8D15FBFC7EEDEF1D /* CTFlexibleIdentityRepo.m */, + 7502CECEC2440E4DD81DBA46D9201379 /* CTFooterViewController.h */, + 4B8FCB2F86FCE12E98D2C33044F83CAD /* CTFooterViewController.m */, + 1C23CD67F921F303A7EEE511A7100875 /* CTHalfInterstitialImageViewController.h */, + 00DCE02464D5B90FBEBC2FAEABC49E14 /* CTHalfInterstitialImageViewController.m */, + A5BE04E1E85046672FBC8409E5807B6A /* CTHalfInterstitialViewController.h */, + 8DF6936C17771D67FA2F2AEEFC3FF355 /* CTHalfInterstitialViewController.m */, + 8B8A38B4B2F7F2FC0C9470E8D7C0A55E /* CTHeaderViewController.h */, + EE960C042F15A01816F4F93DA9E1BA27 /* CTHeaderViewController.m */, + 69F004D1418A6071434F554C1E0D71A1 /* CTIdentityRepo.h */, + 3C4DAA74B65C6F03D8CE73425C5A2328 /* CTIdentityRepoFactory.h */, + 6C4D9D04D86A48164F973D8418FD3FF4 /* CTIdentityRepoFactory.m */, + 9E5849BB1971C0E916A88560C4C7BC7D /* CTImageInAppViewController.h */, + 2DB860DA3CD1868B7D764240D70EC96F /* CTImageInAppViewController.m */, + EC8EEF178D1406F1F0B64C3623767D62 /* CTImageInAppViewControllerPrivate.h */, + B6CF8DC46A0593542A32C1422AF63DA2 /* CTInAppDisplayViewController.h */, + 8A45FF12EC2F124EEDC357886E36B47C /* CTInAppDisplayViewController.m */, + A72A36156A912C94BAA848695334EC41 /* CTInAppDisplayViewControllerPrivate.h */, + 72BDAE48AA1C47C34D3627DFF3BB9855 /* CTInAppFCManager.h */, + 4B4E0240BEABF8BE5DBA73F3EF75E89F /* CTInAppFCManager.m */, + F105B5A3B1FBFF838F2C229A94C13D23 /* CTInAppHTMLViewController.h */, + 736C5DE6A312E3F1994B1BA46B0AA20D /* CTInAppHTMLViewController.m */, + C409A635B98C335D485227468101BBE8 /* CTInAppNotification.h */, + A19C8F469E737A7E50E3D8FFD84D0F9E /* CTInAppNotification.m */, + E9E25B9B521E3810217317B4C7B133A5 /* CTInAppUtils.h */, + D5E3E7DEDE5EEC38B76CEE7CCEBB137A /* CTInAppUtils.m */, + 473BE269F72E327533C945145A6341FC /* CTInboxBaseMessageCell.h */, + 146821AB7C6A3EDA3EE4F449A8DCBFC9 /* CTInboxBaseMessageCell.m */, + AA5942DD1227A4548F507E92FF8094FB /* CTInboxController.h */, + DD4EB1BCD53E5C2EEF147ED812D0C967 /* CTInboxController.m */, + CFCAF6B6B89C1376A6B07B1945B1A795 /* CTInboxIconMessageCell.h */, + E2A69C83C1935452CE8538201C1D6CBB /* CTInboxIconMessageCell.m */, + 7C4D8BD06F3A9589ABA1F8363DD7288A /* CTInboxMessageActionView.h */, + 087697AAF6B0D4B8DB52C4C882025713 /* CTInboxMessageActionView.m */, + 9F153855870EB67B7CAF4D6056C53EA5 /* CTInboxSimpleMessageCell.h */, + C8039AA1446EB65F9F5A33711388381E /* CTInboxSimpleMessageCell.m */, + B09F4F4A7C6E3636869E687C31D1953A /* CTInboxUtils.h */, + 5A35A92AB1F119B15EB6D0BE116386C4 /* CTInboxUtils.m */, + 15382C8DE76EA0E65686C1711F2FC80E /* CTInterstitialImageViewController.h */, + 3E2C9CF2E2B827D09CAA7FBCFFDF6EDC /* CTInterstitialImageViewController.m */, + 4F6F448E033D207C0B5A914F8F7D834F /* CTInterstitialViewController.h */, + DDEFDC33AB9FA34FF10A8E5A89A09CBF /* CTInterstitialViewController.m */, + 8841E719304AED7FA8CD67FE2F5359EC /* CTKnownProfileFields.h */, + FF3E6AA8E58BA28895FF0C894CB3D0BC /* CTKnownProfileFields.m */, + 4DA9AACA23F6CA2954A4476A7BE96B47 /* CTLegacyIdentityRepo.h */, + C6757DC6B82EF58DFF4CDFF8AF5DA9BA /* CTLegacyIdentityRepo.m */, + 8274E6DFCE06CD2983D581CA84EE52AF /* CTLocalDataStore.h */, + 3D70E6841A5B320FEBA3E18726E2CD64 /* CTLocalDataStore.m */, + E1CF7F5F94D918FB697889AB41DE050C /* CTLocalInApp.h */, + E785843CED2BE08B30963C783922E0FB /* CTLocalInApp.m */, + 1D7E735946579028399ADA1E9DAE22B2 /* CTLogger.h */, + FFEF3FC39B711E2848C8D727E441070A /* CTLogger.m */, + EB4064B5D4AD7887681143A9C99A679B /* CTLoginInfoProvider.h */, + 5D228E1C1BB933F5F7D931CBBEBE029E /* CTLoginInfoProvider.m */, + 80142AD22D875552DC2089615F2E9096 /* CTMessageMO.h */, + 3A5562928354B06BCDAE767BA3B43C27 /* CTMessageMO.m */, + 3D4DEF7EA2EEF7C84BA5F5382102FF77 /* CTMessageMO+CoreDataProperties.h */, + D83A587102725CFA2B87C79A9D77CFFA /* CTMessageMO+CoreDataProperties.m */, + 7E6641952F300E5604649DFF6C8B427D /* CTNotificationButton.h */, + 49E028464AA134E465C7DC4CB4B98DF4 /* CTNotificationButton.m */, + B3A0A7FA1917A2F9BD266EA1B248D28A /* CTPinnedNSURLSessionDelegate.h */, + A722ECA0B946FDE37FB9EAC131884F82 /* CTPinnedNSURLSessionDelegate.m */, + C543885C348CDA7AB0BA6E9280EC8868 /* CTPlistInfo.h */, + C3C29ECAF0AF6C559DA5963DDD2584D7 /* CTPlistInfo.m */, + E9A1A6516E49A693CDD84104BF69AB55 /* CTPreferences.h */, + 2E09B0FC2D55EB382E67C58215EECDC6 /* CTPreferences.m */, + AA0089F8E773D817B5D8800B77B7D580 /* CTProductConfigController.h */, + 847E606DDA0501FED4C32EA8E7804847 /* CTProductConfigController.m */, + 5EE82619B3B0BB028ABC83B0FD8D52E9 /* CTProfileBuilder.h */, + EC269F7BBFC8824572FF8A98C3BC608D /* CTProfileBuilder.m */, + 640D44F41E9521CA59D255ED1C7BB301 /* CTRequest.h */, + 8EF48B79E99B4A350CEC53C1BBF7698E /* CTRequest.m */, + E22FD9FFE6ECABB54B00457ECFAA3835 /* CTRequestFactory.h */, + 82CCB4A1C98F8D633AE3AEE14C953C21 /* CTRequestFactory.m */, + 71CDAA579ECFEE112C1038377280BCCF /* CTRequestSender.h */, + 00E9430F203DCC56F1B6D7DC59C4EFA5 /* CTRequestSender.m */, + EEDE444CFDF1DF731AB303A32A838503 /* CTSwipeView.h */, + E5420850D79BA65C8EA696A2E2B74D03 /* CTSwipeView.m */, + 71AE91870CD32DBB83DBFC0AB1CAD272 /* CTSwizzle.h */, + 62A10A17EF5C512486F214C415771E16 /* CTSwizzle.m */, + B187D652574E88A55CA55A8E8C3EF812 /* CTUIUtils.h */, + 9005C3A85A2F01CD4DBB8C7C454E5848 /* CTUIUtils.m */, + FEA5420B49A131AA9A5205CA57E6F073 /* CTUriHelper.h */, + C5E4DCBF7C07C7AC2A2E45215B402CBA /* CTUriHelper.m */, + 7ED458B04C3A8C383519FF7BF38D88EA /* CTUserMO.h */, + 11F46974131649F95CD8D86CCBCA43A9 /* CTUserMO.m */, + 96D6D2BC06B95F102A95219E63B3DCEE /* CTUserMO+CoreDataProperties.h */, + E3A2F23654A3C2CD98DFB07D7588EBFE /* CTUserMO+CoreDataProperties.m */, + FC375CFD124928065969D8C432D88146 /* CTUtils.h */, + 274B8FD25E60B1498C3FD0AC25857C7C /* CTUtils.m */, + 248C1EE517A4730DD9D44394EC6FBF42 /* CTValidationResult.h */, + A9D30C8B7D1C43AE1F39FD51D4B08273 /* CTValidationResult.m */, + B7910B1C64189A8D0D8851CEF662549D /* CTValidationResultStack.h */, + 9D365959CFBAC3B28AA36A62B12732A5 /* CTValidationResultStack.m */, + 7E2A239FE561CD142A1ECC72B363ACBE /* CTValidator.h */, + 4DD20275AD78AF66C00F374DCF48875D /* CTValidator.m */, + 6C7DB41726A02382E0B743DFDDE941F2 /* CTVar.h */, + B9B69F82E86BC16B140603FDEB70EC7A /* CTVar.m */, + 098C3FF5AE525ED63C5DD2E41B30B70D /* CTVar-Internal.h */, + 1CD6B8B51F20248A21C4E51CB16EFC84 /* CTVarCache.h */, + FFA9E8D85B6EEAA2DF70E6D722CAA667 /* CTVarCache.m */, + 1F4DEF8806EBCA11F17592C36CA51BF1 /* CTVariables.h */, + 89A4A1D859679A14C7756799D2A64578 /* CTVariables.m */, + 7ABB378298D21D573C6A97BDEBEC474C /* CTVideoThumbnailGenerator.h */, + D996468B3DA9D6181BE7C3FF8FD55F53 /* CTVideoThumbnailGenerator.m */, + B9B1BF85AE56A05AD46EBE018F6C3738 /* LeanplumCT.h */, + 0985F013F6DC9CD735AA7DD737F145A0 /* LeanplumCT.m */, + B1B321FC1147168F2D234C552FDCC19F /* NSDictionary+Extensions.h */, + 4A01CA5CD32F5E9B61C36106C53F7AF1 /* NSDictionary+Extensions.m */, + A8494B03486B2A5CDF3892C72F7F4AD6 /* UIView+CTToast.h */, + 5D39E12B60FF37A1606D6B12E704D217 /* UIView+CTToast.m */, + BDDB299ECEAC4C6DC05F4D4BA4451A7A /* Resources */, + 46B07D0057AFB0C5B9EBA58E801397C2 /* Support Files */, ); - name = Frameworks; + name = "CleverTap-iOS-SDK"; + path = "CleverTap-iOS-SDK"; sourceTree = ""; }; - DA4D342D3D6CC85A6FA3DD0300CC7D0F /* Resources */ = { + D89477F20FB1DE18A04690586D7808C4 /* Frameworks */ = { isa = PBXGroup; children = ( - 459E68D57861E970755DAE3989654938 /* AmazonRootCA1.cer */, - 9B50932D61BE49387712ACFA36D272C2 /* CleverTapInboxViewController.xib */, - 5B3E7718F77A937296DB0624DE38CAB0 /* ct_default_audio.png */, - E7851778CE612665F09AD9D2B9F2D9A3 /* ct_default_landscape_image.png */, - CD8B4D648262E2A7056432B0892C9BB0 /* ct_default_portrait_image.png */, - CD4126EE58EA885BC479666CB3445BC3 /* ct_default_video.png */, - 0DC37245253918181A8654CCEBC82D30 /* ct_volume_off.png */, - 9BBC3F495C6E7F4FF85301A22CC95FE7 /* ct_volume_on.png */, - 63EF50442898251B0DF413DF8E078D0E /* CTCarouselImageMessageCell~land.xib */, - E1E86C8B89C471B4B2ABC5E0D5A8A6AC /* CTCarouselImageMessageCell~port.xib */, - 97E3F1FCE047B474B9F785B15E37781B /* CTCarouselImageView.xib */, - DBC32D282B692DE8B816809C00779D2E /* CTCarouselMessageCell~land.xib */, - AA0104B1645FCE465F8C23B26FB8D294 /* CTCarouselMessageCell~port.xib */, - 3FC2BB0130BEAE2D5A7CEB4EDFC73D45 /* CTCoverImageViewController~ipad.xib */, - F67B84360300584D6F809958C1B9A141 /* CTCoverImageViewController~ipadland.xib */, - 50B9320078941BA8E9A69BE89CF895D1 /* CTCoverImageViewController~iphoneland.xib */, - 1A05B46DC2F050F6987B79997328D216 /* CTCoverImageViewController~iphoneport.xib */, - 365B2A2A19C53FD0DA42634DE2844C25 /* CTCoverViewController~ipad.xib */, - 574F35A1A27E02D43233CEE2EDA73094 /* CTCoverViewController~ipadland.xib */, - 9945501E0365FC997B20049C64EA4E88 /* CTCoverViewController~iphoneland.xib */, - B030A516E775005559E47796D5A29D6B /* CTCoverViewController~iphoneport.xib */, - 987CE7D5996C3B229063E4AB97057CA3 /* CTFooterViewController~ipad.xib */, - E97C1D8FE96CC38F3834CA682AE8C2A7 /* CTFooterViewController~ipadland.xib */, - 001CD11C6DBA31CC5C6C17DF1E598C2F /* CTFooterViewController~iphoneland.xib */, - BC11B620445B5F2EDD7562B9F0D3ACCD /* CTFooterViewController~iphoneport.xib */, - 122A4A2A6431D70B6C28CD22CED19024 /* CTHalfInterstitialImageViewController~ipad.xib */, - 723C1B2E94575B053C89788AC0C96D81 /* CTHalfInterstitialImageViewController~ipadland.xib */, - C8CC5FD7542D7CE13085C9CD0413547E /* CTHalfInterstitialImageViewController~iphoneland.xib */, - 07A8CF7AA77FD3734DA065FAB66BF1E8 /* CTHalfInterstitialImageViewController~iphoneport.xib */, - E82A6563EA932B6CDA2A5F6D83190218 /* CTHalfInterstitialViewController~ipad.xib */, - A1EEA48BFB33AA05D5E490E3101D0C35 /* CTHalfInterstitialViewController~ipadland.xib */, - 45A0D707EADB2664B26BE1F29DF15B0C /* CTHalfInterstitialViewController~iphoneland.xib */, - 420106F31480C2F9FEF39E9263318661 /* CTHalfInterstitialViewController~iphoneport.xib */, - C2DA1B452DDA131358935AEE8C933F24 /* CTHeaderViewController~ipad.xib */, - 0A69C6689C90631952B94B162423B6DB /* CTHeaderViewController~ipadland.xib */, - 4E9BAA64C409096D8915CBF2D11B496D /* CTHeaderViewController~iphoneland.xib */, - 988515B25BD9E8D28BFB99AAF8B9523A /* CTHeaderViewController~iphoneport.xib */, - 42CE513BA7738FAF5E48199B3A94801B /* CTInboxIconMessageCell~land.xib */, - 8BC7C21E8D8252D5C308E3E678C65F0C /* CTInboxIconMessageCell~port.xib */, - 4A3DCFF4BC94D31AEA22C048A43470C5 /* CTInboxSimpleMessageCell~land.xib */, - 695DE06747201EBB1B0938214D18667E /* CTInboxSimpleMessageCell~port.xib */, - F004A06E523AFEE3F1859942220996DB /* CTInterstitialImageViewController~ipad.xib */, - 2F77FDCD5E3AC390C73F70C2410BDD5F /* CTInterstitialImageViewController~ipadland.xib */, - AA3E0F69C4929916311ECE94BA0AD547 /* CTInterstitialImageViewController~iphoneland.xib */, - 7A628076EB2E1DDEC3AD2B96B29F2126 /* CTInterstitialImageViewController~iphoneport.xib */, - 68DB8874E175D1C669FF5DC9E11DF942 /* CTInterstitialViewController~ipad.xib */, - 0DB2BE441B8E9D912D6EF29A5C7CA1A0 /* CTInterstitialViewController~ipadland.xib */, - 3355083555001F5475FA0FF1F2C47ADF /* CTInterstitialViewController~iphoneland.xib */, - 10E5E949286A2B3AD8FE0C33CD56398C /* CTInterstitialViewController~iphoneport.xib */, - B690B9F84A31E9F854FF89C3D705D0DC /* ic_pause@1x.png */, - EEED3A83D290E3DBB00927D6EA94C61D /* ic_pause@2x.png */, - 1DE1ABA4124FC8B38FD6730F4AEF075E /* ic_pause@3x.png */, - 8D7696581FC7ECF3FCA72356109C3589 /* ic_play@1x.png */, - 06A612B3DC0FBDE4A09916E453DC2911 /* ic_play@2x.png */, - BABEA7103F1003968ABDB3DF764238CC /* ic_play@3x.png */, - B0AC13536F9F6BCF61B8BC9180C62E1F /* Inbox.xcdatamodeld */, ); - name = Resources; + name = Frameworks; sourceTree = ""; }; DE2D3581C26B9457EF3149B2FCB387D5 /* Products */ = { @@ -1314,190 +1373,213 @@ name = Products; sourceTree = ""; }; + F90A3E31446F655C30F1137186C28375 /* SDWebImage */ = { + isa = PBXGroup; + children = ( + 283115929A1426689154B7109BBECB25 /* Core */, + C9130D0CBA088E2E477C74D4E8FA18C9 /* Support Files */, + ); + name = SDWebImage; + path = SDWebImage; + sourceTree = ""; + }; /* End PBXGroup section */ /* Begin PBXHeadersBuildPhase section */ - 0B46AAA429C363F31EFE9B04D88477C1 /* Headers */ = { + 046A1393FFB8AAB51E96FE47962653C7 /* Headers */ = { isa = PBXHeadersBuildPhase; buildActionMask = 2147483647; files = ( + F6CDE491C3AC21E01D2994A5060CEA4B /* NSBezierPath+SDRoundedCorners.h in Headers */, + 3FC13CDFC31712E779FEF8E4642F2FEE /* NSButton+WebCache.h in Headers */, + DC67745F383858B61564CFFDF5BABA2B /* NSData+ImageContentType.h in Headers */, + E0E7F8B6D98A7A9C5AEB9F9BFB0E49D8 /* NSImage+Compatibility.h in Headers */, + 64C8DD65D91C18809E4F9A7F789A41B2 /* SDAnimatedImage.h in Headers */, + 817ADA06E286FF2F505028CBA396D02B /* SDAnimatedImagePlayer.h in Headers */, + A8766A8C9466EC9C9F64227EBF00E753 /* SDAnimatedImageRep.h in Headers */, + B57EEA5F2945345F480557941F0D0A3F /* SDAnimatedImageView.h in Headers */, + 6E6EEB76DC9751CB43467F014FAE7B87 /* SDAnimatedImageView+WebCache.h in Headers */, + CF6580BD4418487B47CC7B0B5227A74D /* SDAssociatedObject.h in Headers */, + 702F88BC7A6426F94A9B459D89B3BF2A /* SDAsyncBlockOperation.h in Headers */, + A75E62BE82532A5D14D5C75081DBCC8F /* SDCallbackQueue.h in Headers */, + 516C00946B53A1B8D038EFC364BE4926 /* SDDeviceHelper.h in Headers */, + 5E9EFDF390686FA5A58B77E7EF30CA38 /* SDDiskCache.h in Headers */, + 13A7686FEC397FCD7083CF468A6811EF /* SDDisplayLink.h in Headers */, + 924723E6C4A0D0664F2DA11C767B4967 /* SDFileAttributeHelper.h in Headers */, + BBD3C597569CFD970F525166149E8077 /* SDGraphicsImageRenderer.h in Headers */, + 80C4E765700F5F214D8D7932D916BA87 /* SDImageAPNGCoder.h in Headers */, + 113F1DD23826819184D968119CA360B1 /* SDImageAssetManager.h in Headers */, + B51956F42EE25360394569477E71E33B /* SDImageAWebPCoder.h in Headers */, + 7F390C9AE194F1A165C8B0BD248EE0E3 /* SDImageCache.h in Headers */, + 1015A85978E4676E29B1C0C0EE0AB9AE /* SDImageCacheConfig.h in Headers */, + 75A865D36BFE4A7BEAB53945E2C8E045 /* SDImageCacheDefine.h in Headers */, + 258EC23C173181C46D557036B64C2391 /* SDImageCachesManager.h in Headers */, + 6C05124CBF889F10D90D2B4A108C2BEF /* SDImageCachesManagerOperation.h in Headers */, + BEF6C73858CDC6437684359B15BF79A8 /* SDImageCoder.h in Headers */, + ADF5EA23CAACC5BA9B5E657DF18FA770 /* SDImageCoderHelper.h in Headers */, + 66269B65F63033D13A3BE501B5210D8C /* SDImageCodersManager.h in Headers */, + 5EAFCBAE4CE10EF71CA256E6336B2108 /* SDImageFrame.h in Headers */, + EC5B2DB0279B362B08145A11566E84EA /* SDImageFramePool.h in Headers */, + 8F8E4E3BDE87AB2A9E19E58E8DF8995C /* SDImageGIFCoder.h in Headers */, + 4D3D27308361114A477D6FE0CF8AB34E /* SDImageGraphics.h in Headers */, + A6296F1EFAAE17936E3A7EEA4671A799 /* SDImageHEICCoder.h in Headers */, + 9C6082A79B7A329BEE48E265529661CB /* SDImageIOAnimatedCoder.h in Headers */, + 441522D704BFE76F86F41AD065B218F2 /* SDImageIOAnimatedCoderInternal.h in Headers */, + 857BFF9C85E55826E1BD7266F80AAC11 /* SDImageIOCoder.h in Headers */, + B272DE47E7E1AF5421B7EB2CE0782E50 /* SDImageLoader.h in Headers */, + 44EE09950230C46C1EC0183904FABDFC /* SDImageLoadersManager.h in Headers */, + 476202BA7833E41818E2B509FA6B394D /* SDImageTransformer.h in Headers */, + FE88BBEF4D42D76E7EBA9CEC1DD4087B /* SDInternalMacros.h in Headers */, + E069A28587B4A9BF0B192E82DBF16252 /* SDMemoryCache.h in Headers */, + 1586E9639F414E5B80C269C6DD1A0FBB /* SDmetamacros.h in Headers */, + AF06E2ECDDB23634810F41285279A400 /* SDWeakProxy.h in Headers */, + 660FFEFF13B1B084568521FBED6E4DC9 /* SDWebImage.h in Headers */, + 3E0BDF295A2B6B65F790F6C20BA18A51 /* SDWebImageCacheKeyFilter.h in Headers */, + 391433D736423ED6CAE09BD8755CA683 /* SDWebImageCacheSerializer.h in Headers */, + C5D8D571544AEB12B0DA830C1171FFEB /* SDWebImageCompat.h in Headers */, + 4C90C485440E95E7CB652F3CF7D1AB11 /* SDWebImageDefine.h in Headers */, + BB304B77AB410115724DBD09030740EC /* SDWebImageDownloader.h in Headers */, + 5EB8CB2AAF6CA659B58D3A736559306B /* SDWebImageDownloaderConfig.h in Headers */, + DB343977D61E7C30BE64D1FCDE834218 /* SDWebImageDownloaderDecryptor.h in Headers */, + 9E309DEF986B49089ACF9C686AC7AE59 /* SDWebImageDownloaderOperation.h in Headers */, + B174E305D959F4C2DA91BD770E0AA54B /* SDWebImageDownloaderRequestModifier.h in Headers */, + D11B4AE6C6FB8558E1D493E23AC7FCFE /* SDWebImageDownloaderResponseModifier.h in Headers */, + B560936FA4238CB3913846DF603E7B98 /* SDWebImageError.h in Headers */, + 33854984E1ECCD1B2F115DF0883D075A /* SDWebImageIndicator.h in Headers */, + 6742148DF6270783826488F3B1B0EB3D /* SDWebImageManager.h in Headers */, + D727EAA91B786ACC6DE7394BB0008F0B /* SDWebImageOperation.h in Headers */, + 79AFC5D832CC0ED64ED86C50C7E6A008 /* SDWebImageOptionsProcessor.h in Headers */, + F1C373A0AECE21C5F89F22C1D8A2E582 /* SDWebImagePrefetcher.h in Headers */, + A0EACE749CB50E1BAB3A8A12ABAFC890 /* SDWebImageTransition.h in Headers */, + 14475ABED6BD77D109B33D9A9CC5C2B1 /* SDWebImageTransitionInternal.h in Headers */, + EA4387C372A3F49C1B98B48FB9925681 /* UIButton+WebCache.h in Headers */, + 8E4CE058E72A6D414FDFE724FDFFE21F /* UIColor+SDHexString.h in Headers */, + BFECA8BD55997FD41C36076B7070574D /* UIImage+ExtendedCacheData.h in Headers */, + DC0081BD1C05D984DE0B61EE8F7B670B /* UIImage+ForceDecode.h in Headers */, + 745851E2F440002A047A77909B87EEB0 /* UIImage+GIF.h in Headers */, + 6AEC2DBBCDB6587E3FB7FD1F0A8134C0 /* UIImage+MemoryCacheCost.h in Headers */, + 2687B0BF6E453E337EFD9AC11B148090 /* UIImage+Metadata.h in Headers */, + 0538439543563B3C9AB3C9ABD350FD71 /* UIImage+MultiFormat.h in Headers */, + F058BBC823E1938010F421584E138A23 /* UIImage+Transform.h in Headers */, + 210B668D7CC856EBE9E72453D8337CDB /* UIImageView+HighlightedWebCache.h in Headers */, + 37E4943F79856504800534F5C9886BDD /* UIImageView+WebCache.h in Headers */, + A6FCC065E8F70D674AF31CC162E0574A /* UIView+WebCache.h in Headers */, + 18D03D36D8CB733D462C5AE3887AF443 /* UIView+WebCacheOperation.h in Headers */, ); runOnlyForDeploymentPostprocessing = 0; }; - 81190176EF34E6840E475374E13868BC /* Headers */ = { + 0B46AAA429C363F31EFE9B04D88477C1 /* Headers */ = { isa = PBXHeadersBuildPhase; buildActionMask = 2147483647; files = ( - CE8B1AC1D691FB49876F2D00A3C8E4EC /* CleverTap.h in Headers */, - EC4349F388AA240DAB6F1E53854C81B3 /* CleverTap+DisplayUnit.h in Headers */, - 7B9C6A2E2A83FB42C9E803EC60D0882C /* CleverTap+FeatureFlags.h in Headers */, - 82E0382D42B21CFC2DD61240064E5AE3 /* CleverTap+InAppNotifications.h in Headers */, - 9563B53EB336D7043A74F0E9733F5097 /* CleverTap+Inbox.h in Headers */, - AA4E7FB7390EE115AA39BF71993F8838 /* CleverTap+ProductConfig.h in Headers */, - C6B6F9A1FAACCFB4BCF0DD1105635EE8 /* CleverTap+PushPermission.h in Headers */, - 9E5A9046C952858D256E69DF83A66463 /* CleverTap+SCDomain.h in Headers */, - 1A12EC2DB5473F8384D83E9DFD4D1643 /* CleverTap+SSLPinning.h in Headers */, - 747852107AFCACB3DAF77201E5EF5D17 /* CleverTapBuildInfo.h in Headers */, - A6583B5A5EEADCC638F972542951B14A /* CleverTapEventDetail.h in Headers */, - 9051FF0A1FB6CFB7BAF277CC7B96561C /* CleverTapFeatureFlagsPrivate.h in Headers */, - B6573B6B630D7977BE6A9892506F66A9 /* CleverTapInAppNotificationDelegate.h in Headers */, - CA0317CD4DAF553531BC04A775969ACE /* CleverTapInboxViewControllerPrivate.h in Headers */, - 6EF462643C5AB20E95D69063B36D94C3 /* CleverTapInstanceConfig.h in Headers */, - C43B48A3651A3FEA3964D31076D6E0AC /* CleverTapInstanceConfigPrivate.h in Headers */, - 04B5604605A463ECD9A070CD7AFF49A8 /* CleverTapJSInterface.h in Headers */, - 61093E3BDD67C95E80BA2CD1DA2CB1FE /* CleverTapProductConfigPrivate.h in Headers */, - D76664C51AFBCFC248CB62087FF290FF /* CleverTapPushNotificationDelegate.h in Headers */, - 87D79028AB0BF5FC91D4A124A53DDF39 /* CleverTapSyncDelegate.h in Headers */, - 10E4F271C54292E687D05BC3CF80FA3A /* CleverTapTrackedViewController.h in Headers */, - CFB9BC1EF2C792CABED2145FB4C71D04 /* CleverTapURLDelegate.h in Headers */, - 38C72D89C3E2E93CCFC240586E834672 /* CleverTapUTMDetail.h in Headers */, - 62A78505705699EC977E31B2D553918A /* CTAlertViewController.h in Headers */, - 916CDB696A29D9E7BA876F5C7378E1B4 /* CTAVPlayerViewController.h in Headers */, - 2C51BEEB2E27D4790AEB85D58DA866D7 /* CTBaseHeaderFooterViewController.h in Headers */, - 7E71820988BF8358F6BCC00D4DA1C13A /* CTBaseHeaderFooterViewControllerPrivate.h in Headers */, - 83915109F77D9D59761EA06BEBF2FC88 /* CTCarouselImageMessageCell.h in Headers */, - 49CD09716EB767B676F58E4A36108DA4 /* CTCarouselImageView.h in Headers */, - 9C7D5782F0CD76EA2BB548EF0D0D7B64 /* CTCarouselMessageCell.h in Headers */, - 34C2FBBDD6F84720095FB656D8D34C74 /* CTCertificatePinning.h in Headers */, - 17C8DDE9D0A5C9D6074ADAFC1E8C91B4 /* CTConstants.h in Headers */, - 4A58E1F94456C10A0A10C7F61E022EF4 /* CTCoverImageViewController.h in Headers */, - 09D70AE545B4EB3AE8B0C8D0CD58C2EE /* CTCoverViewController.h in Headers */, - F984A29339A850A46F66B1D021B22EC3 /* CTDeviceInfo.h in Headers */, - 4EC16AB9695AA2FA5FF6A7170834AFA2 /* CTDismissButton.h in Headers */, - BCD160DA107A76A51B3116D6E4BDE0EA /* CTDisplayUnitController.h in Headers */, - A1695FF19D9C2D8E7997E5DBC46526A7 /* CTEventBuilder.h in Headers */, - EE62227393F0EC1078858B6A606CD89E /* CTFeatureFlagsController.h in Headers */, - D2A12ED62AA40BFA72108AF1F1F75412 /* CTFlexibleIdentityRepo.h in Headers */, - 53FD81B2C5E5A10426866CEACBD8E8A6 /* CTFooterViewController.h in Headers */, - D9A2C96D791D14CA89A6E28194B63860 /* CTHalfInterstitialImageViewController.h in Headers */, - E7D6A26B2ED8C87BD37A0862C92F5448 /* CTHalfInterstitialViewController.h in Headers */, - DCE1C28964932E347D5C8A150B84AF3C /* CTHeaderViewController.h in Headers */, - AB03E8E5BDA88C07184C6EAA4FE85500 /* CTIdentityRepo.h in Headers */, - 4E39A6F22856E4B347760BA19FC9511E /* CTIdentityRepoFactory.h in Headers */, - F3C0EE0D4710EB2B079BE91E1CF0E758 /* CTImageInAppViewController.h in Headers */, - CA52B857F3CED0474A156D96069A231F /* CTImageInAppViewControllerPrivate.h in Headers */, - 0931CD48CDFD4D68D95FFCE33FBA7AB4 /* CTInAppDisplayViewController.h in Headers */, - CC336030118E15D90E9D49E946C25973 /* CTInAppDisplayViewControllerPrivate.h in Headers */, - 4C822CE57C5E073D24CD1EFDC916F7BC /* CTInAppFCManager.h in Headers */, - E6251C1F7741F9E3B4C0BEF3729F8CE7 /* CTInAppHTMLViewController.h in Headers */, - 2AAFC8DF727D5A9200E4998640EBF0A8 /* CTInAppNotification.h in Headers */, - 2AC4FBEB8709A4305C94225CE03FEE1C /* CTInAppUtils.h in Headers */, - 66593B799BD4FD47CE11539A412BC7AC /* CTInboxBaseMessageCell.h in Headers */, - F8B2588DF313AC34535E4B2C8EE23D18 /* CTInboxController.h in Headers */, - D8E02DCEA367FADF3D8E98BE54BC9C4A /* CTInboxIconMessageCell.h in Headers */, - 5DF2BF40C639D7300C1894A50C8FFB49 /* CTInboxMessageActionView.h in Headers */, - 305002EF4E084EA95FB9569BDF0CC0CC /* CTInboxSimpleMessageCell.h in Headers */, - 97785513542462CDC82F88CED798A398 /* CTInboxUtils.h in Headers */, - 3AD6B5FC9FBF47D2815FAC88AEB09AE6 /* CTInterstitialImageViewController.h in Headers */, - 0367BF66057DAA9C7CF47ACFF55250D2 /* CTInterstitialViewController.h in Headers */, - CBD694B3E8D2F1D5D8AC18858AB8FD14 /* CTKnownProfileFields.h in Headers */, - 79B2EA32E36BBE5C6D8A96E94471A10D /* CTLegacyIdentityRepo.h in Headers */, - EEDB6DC7E3B72BD1988D1C6886CFB85C /* CTLocalDataStore.h in Headers */, - CF51A007D3D239F041461321BDBBAAD2 /* CTLocalInApp.h in Headers */, - 2BFD40843C7CAF5C29E5024CEF65D7D7 /* CTLocationManager.h in Headers */, - EF9303649BADED9A81EC71BBE3309055 /* CTLogger.h in Headers */, - F00ADE045B9F3D266EC8381C5F245A79 /* CTLoginInfoProvider.h in Headers */, - 7ADC48DA8653E23CF33BF76326D2029C /* CTMessageMO.h in Headers */, - E69F383946A40DF3AF6E22BE1D73CC6C /* CTMessageMO+CoreDataProperties.h in Headers */, - BEC816298EED9661927462C00D6DBA9B /* CTNotificationButton.h in Headers */, - A0A11D5C3481B1ED66831E3373DD9164 /* CTPinnedNSURLSessionDelegate.h in Headers */, - 485F8F7F76A14326AEC4DB09D8C584FD /* CTPlistInfo.h in Headers */, - 5A025D37DE986F7871083EB4C1650D12 /* CTPreferences.h in Headers */, - 4E48C9B79DEC54C00E4537B431B83A22 /* CTProductConfigController.h in Headers */, - 09910885C763E95B8757FB2602BE808B /* CTProfileBuilder.h in Headers */, - A02D754C1D91F03CBDFD041E9DD8B195 /* CTSwipeView.h in Headers */, - 8CD6CDCDD5BCEDEE6AB4DD76446AD808 /* CTSwizzle.h in Headers */, - F40499F8B292281F2DBBC341529CF265 /* CTUIUtils.h in Headers */, - 13418E39D0F7BDAA9CC00D85BB106F4C /* CTUriHelper.h in Headers */, - 93E9B626EA3A81DC359F779F706B5936 /* CTUserMO.h in Headers */, - 873079839917F7DC6628226530D0FCAF /* CTUserMO+CoreDataProperties.h in Headers */, - 17FA95893B36E18EBC5DE742E4276A23 /* CTUtils.h in Headers */, - B32DB6C2FE03E29813400A23A7851A1C /* CTValidationResult.h in Headers */, - 0E6DC1F552D15D0D3B79A3D2A644BEF5 /* CTValidationResultStack.h in Headers */, - 82B4303C6B953C6A439827EC61B6772D /* CTValidator.h in Headers */, - B1AE2489FE5FF4CA50CFE9FFCF5008BC /* CTVideoThumbnailGenerator.h in Headers */, - 87586B34FEB88664FA4E667758F5A511 /* UIView+CTToast.h in Headers */, ); runOnlyForDeploymentPostprocessing = 0; }; - 90C5D1FA43A4783B2F9EA1265C963F51 /* Headers */ = { + F7B7399669E8A9121C75CBEC566FBD5A /* Headers */ = { isa = PBXHeadersBuildPhase; buildActionMask = 2147483647; files = ( - 5EA1C709340C9B624FACAAACD96659CE /* NSBezierPath+SDRoundedCorners.h in Headers */, - 7A127AB38B019D16BE4EBD6B91A31B0D /* NSButton+WebCache.h in Headers */, - 99804E217E834D8EEA6CA8C36D82CE4A /* NSData+ImageContentType.h in Headers */, - F455EBA0B074D9D7A7A52D650BC6DCC7 /* NSImage+Compatibility.h in Headers */, - EE5285664B91E8AE7C819878B0E89964 /* SDAnimatedImage.h in Headers */, - 897984BAC52E2AD10CA947D3201E5569 /* SDAnimatedImagePlayer.h in Headers */, - EEA69CB4827DA9EE565C2EEF76FF27FF /* SDAnimatedImageRep.h in Headers */, - A1AE19D9AFA292114E8AD5FE495BB26B /* SDAnimatedImageView.h in Headers */, - EF1C89A06EA9DFDBC5074D04765B68B9 /* SDAnimatedImageView+WebCache.h in Headers */, - 10AAE590D869C4E996846792246B07C4 /* SDAssociatedObject.h in Headers */, - 33C2A13A0D807063195BC09DD107D286 /* SDAsyncBlockOperation.h in Headers */, - AA5DF3E2927D38A23F1616E5B336BA4D /* SDCallbackQueue.h in Headers */, - 37BA6494EBA8078FF619C0A9A47664D6 /* SDDeviceHelper.h in Headers */, - 56CA0E4FB9B0C569011909C0258D5737 /* SDDiskCache.h in Headers */, - C09E0E55132F34E0648707A3166D0519 /* SDDisplayLink.h in Headers */, - 9E3C76A3D017041F2AEECF08DDAE2F06 /* SDFileAttributeHelper.h in Headers */, - F7C8C293D1262379B64ABCCB0F3D6D1B /* SDGraphicsImageRenderer.h in Headers */, - C473962B6770E318A7F13F85566AF67D /* SDImageAPNGCoder.h in Headers */, - 39D1B3C61ADC6B65A26CC2D8C57979BC /* SDImageAssetManager.h in Headers */, - EED1681DF2F8B860C4A5764AB2DB6A99 /* SDImageAWebPCoder.h in Headers */, - 3324C6BF382971E978AC2B74D2DC1939 /* SDImageCache.h in Headers */, - A77D962C11876F26FBA4B96231D32A5A /* SDImageCacheConfig.h in Headers */, - C8D071806AD4E9957C7C9DFF5974DAC1 /* SDImageCacheDefine.h in Headers */, - B1F7CF28B30C986D7E2F11D80DA158B8 /* SDImageCachesManager.h in Headers */, - 3B26AC051F933D8B6C7490779555887B /* SDImageCachesManagerOperation.h in Headers */, - 105DF1C10EBBB6DE95D73177AD04A78A /* SDImageCoder.h in Headers */, - EE9A250E34C0F78D11650E0673BFA26E /* SDImageCoderHelper.h in Headers */, - FA5B35DAE054CF9EBBDED47793BDC0F9 /* SDImageCodersManager.h in Headers */, - 83015DCC070F8B5426906065EB8CDFC2 /* SDImageFrame.h in Headers */, - 90DB71E44A4A08960A9EF2B4C8A0157C /* SDImageGIFCoder.h in Headers */, - DCEAB850FF5F9E99204179CFB08EBD76 /* SDImageGraphics.h in Headers */, - 530DE90E0A99FF03FDBAD84091771C8F /* SDImageHEICCoder.h in Headers */, - 082E7F8982968CC118462BFCFABA2C00 /* SDImageIOAnimatedCoder.h in Headers */, - ECD517F0447F8039B27F44F236B78060 /* SDImageIOAnimatedCoderInternal.h in Headers */, - 551F0DA5457ABF8ABDFFE2E78D126824 /* SDImageIOCoder.h in Headers */, - 3C409B4A3D911BA544CB16903794E358 /* SDImageLoader.h in Headers */, - 84D01359793F57DBE9EAF023AD74EBD8 /* SDImageLoadersManager.h in Headers */, - 132C9AE9434ED95CEB38DE927C00E333 /* SDImageTransformer.h in Headers */, - DBE6A5C3CBD37FBD34E46F2CE7A952DF /* SDInternalMacros.h in Headers */, - 75C18F34E90640F549F522814F382C09 /* SDMemoryCache.h in Headers */, - EAB68564694A5D9F34E8FE92CBEF54A3 /* SDmetamacros.h in Headers */, - B3139A61D767A7F99D88C8DEF2FA3F03 /* SDWeakProxy.h in Headers */, - 28CDCC25EF629DDEA4F4391BE57BC113 /* SDWebImage.h in Headers */, - 442A3ED55E08338002C7E06FBD3C412F /* SDWebImageCacheKeyFilter.h in Headers */, - 3A03F0F5024DCF23C009341B4B1CBDF1 /* SDWebImageCacheSerializer.h in Headers */, - 7EE251E4B92ABB7AC1009FED60F51F8B /* SDWebImageCompat.h in Headers */, - C54B7CEF190DB74278231AE8360E7330 /* SDWebImageDefine.h in Headers */, - 65BD6054F9099A3FF7A9205390A08B06 /* SDWebImageDownloader.h in Headers */, - 721F50767DE03C790886661FE55E2FED /* SDWebImageDownloaderConfig.h in Headers */, - 3D3AFA98759F4A3137A133DE5E172A14 /* SDWebImageDownloaderDecryptor.h in Headers */, - 7C1AD8656852D3DB507D37DB76607D74 /* SDWebImageDownloaderOperation.h in Headers */, - 091E8BFCFD9ECF0F6F3EBB6B2BA9CF2E /* SDWebImageDownloaderRequestModifier.h in Headers */, - F2864E30EDEBB6B8680B32B4BDCAA9AE /* SDWebImageDownloaderResponseModifier.h in Headers */, - 14BD1B25E9682C3342BDDC7DD0864B41 /* SDWebImageError.h in Headers */, - BAB0472961E2F1CB07DB539404739D3D /* SDWebImageIndicator.h in Headers */, - 38ABE7901CC2B96E01DB895292559923 /* SDWebImageManager.h in Headers */, - 99BA6F1929CD0BF2287649D14432D8E8 /* SDWebImageOperation.h in Headers */, - F540CB788AB09FC569F0B20F7CD08CD5 /* SDWebImageOptionsProcessor.h in Headers */, - 53B0D92433829418B14BD6E01626F6C3 /* SDWebImagePrefetcher.h in Headers */, - 2CE10803F7EF7653674C58CF1CC70285 /* SDWebImageTransition.h in Headers */, - 2119D166688AD5C26027028481A1B158 /* SDWebImageTransitionInternal.h in Headers */, - DE04922F7E8833A826013CCCBB4019AF /* UIButton+WebCache.h in Headers */, - 870D3B600F8E3860DBE2D56FBE45930B /* UIColor+SDHexString.h in Headers */, - 88146BBB36338C7AA26808448B576A5D /* UIImage+ExtendedCacheData.h in Headers */, - 58E219F430B011353632696D93B14D87 /* UIImage+ForceDecode.h in Headers */, - 151148EEC1A3D072C7A7657489DF4962 /* UIImage+GIF.h in Headers */, - 7431A1A02F47D3BA779304CF4C34DA00 /* UIImage+MemoryCacheCost.h in Headers */, - C7101911975A6D1AE2CF80B208360E1D /* UIImage+Metadata.h in Headers */, - A4C8CD921D40C7CB33D9BE98C89573BE /* UIImage+MultiFormat.h in Headers */, - 159413A33EA1D16E3D6C31DA4A2ADDCF /* UIImage+Transform.h in Headers */, - D37B7F9D413A2D3DC712FE0903D86F70 /* UIImageView+HighlightedWebCache.h in Headers */, - A2EC9DFDC74D3048A462D16D4A4AA9F4 /* UIImageView+WebCache.h in Headers */, - 5327EA4C727582A559291D1A86123C65 /* UIView+WebCache.h in Headers */, - B0C90A76586C7BCACA1BB381552323D0 /* UIView+WebCacheOperation.h in Headers */, + 25E2D32832A809284FF25BDA8782A64E /* CleverTap.h in Headers */, + 9274E0A19E004219DD8117483C007E9E /* CleverTap+CTVar.h in Headers */, + 39C4E71BC5090B2BC150A8C24F40F0AF /* CleverTap+DisplayUnit.h in Headers */, + AF8AB2CDC7C835A8484A8065F8081A55 /* CleverTap+FeatureFlags.h in Headers */, + CE33E388D9A7A117DBD6FBEAE016D6DD /* CleverTap+InAppNotifications.h in Headers */, + ED76DF67B96EE905579A4FCD017B7D91 /* CleverTap+Inbox.h in Headers */, + B9656751C0B2274740DF590BF1852290 /* CleverTap+ProductConfig.h in Headers */, + 6E2EA86FFCA14D7C322D5D3477320315 /* CleverTap+PushPermission.h in Headers */, + EEC445B96AA258E0B92AD02D12F33E2B /* CleverTap+SCDomain.h in Headers */, + 8D2E36A5640DBBE8E0AADF287184D121 /* CleverTap+SSLPinning.h in Headers */, + 0CF9E6A46A2E3A3D12B83216E1D39EEF /* CleverTapBuildInfo.h in Headers */, + 43BF441A48B46290B0A2CFD95AC82ABC /* CleverTapEventDetail.h in Headers */, + 85341FF8594F27028117BF8D54034A2D /* CleverTapFeatureFlagsPrivate.h in Headers */, + 1F2BC1A68A79937A1FB20F4AA63C1E6A /* CleverTapInAppNotificationDelegate.h in Headers */, + E2A6E8C8E9A98358C9840956F28F1FAD /* CleverTapInboxViewControllerPrivate.h in Headers */, + 92C639585D267E345246567C59DDFCE8 /* CleverTapInstanceConfig.h in Headers */, + DE2FD0D6650AFE6EF392EF4CDAC888F1 /* CleverTapInstanceConfigPrivate.h in Headers */, + 5D962E49FA6A3E829B6948EF0322A0AF /* CleverTapJSInterface.h in Headers */, + 8C11758A0D911C09908DD2A4D8C9581A /* CleverTapJSInterfacePrivate.h in Headers */, + AC19DC97F48F393D0C870DA11010A1BD /* CleverTapProductConfigPrivate.h in Headers */, + C00738098B0316D8DE8D046EF7741DBA /* CleverTapPushNotificationDelegate.h in Headers */, + 722F58A7FA1E73D7A5154AC644FD2466 /* CleverTapSyncDelegate.h in Headers */, + 06AD7D6132B8C57D3C786D30C12552C8 /* CleverTapTrackedViewController.h in Headers */, + DF48FA7A6C5CD0BF647AF45A35A3C3C5 /* CleverTapURLDelegate.h in Headers */, + 96E8796D194F972F1B9D09D9375B1E64 /* CleverTapUTMDetail.h in Headers */, + FFB4CD24B46B3303E8A5A75DAE4F0335 /* ContentMerger.h in Headers */, + 7E05780700B2B458CDB4875E0B07369B /* CTAlertViewController.h in Headers */, + B687BA5F33B9F64E2AEB0EFBFBC77A74 /* CTAVPlayerViewController.h in Headers */, + 822F1836ABD5DC987348F2F8A2E5421A /* CTBaseHeaderFooterViewController.h in Headers */, + F663B4E075E7EAF64C9B6888FC56CB3B /* CTBaseHeaderFooterViewControllerPrivate.h in Headers */, + 9E11BF4FDBDA51B1484A7EEE7EFA922E /* CTCarouselImageMessageCell.h in Headers */, + A99D50B4A78430D997B0CBA8D9B24807 /* CTCarouselImageView.h in Headers */, + FED1D16AA345A5F0949F42EBD38C0051 /* CTCarouselMessageCell.h in Headers */, + 8E652D74E0510F14499415D19963ED31 /* CTCertificatePinning.h in Headers */, + C793B2E1C0D0D43B68EC56ED3EFF82FF /* CTConstants.h in Headers */, + 8BF9069DE6978F226A50274D120942C1 /* CTCoverImageViewController.h in Headers */, + C2AF1513206F5C665FC5D4C7350461C0 /* CTCoverViewController.h in Headers */, + 712476BDE78647D3B260BEEA93041473 /* CTDeviceInfo.h in Headers */, + 46DFD43973EA4DC38E33885A7837511F /* CTDismissButton.h in Headers */, + BCE0C3C40292E12AA7872244E23FBBE3 /* CTDisplayUnitController.h in Headers */, + 1C577A3F421CF17C1847881ABBA7AC9B /* CTDomainFactory.h in Headers */, + C675C32BD5D177C5EDFE6062A7943D11 /* CTEventBuilder.h in Headers */, + 40E923CE4C56A578736813498C689364 /* CTFeatureFlagsController.h in Headers */, + E39235F3F1F9DFBD26CCD4544B91BD48 /* CTFlexibleIdentityRepo.h in Headers */, + C295E15EAA44297B701841991A9A844E /* CTFooterViewController.h in Headers */, + C2187821BF3A766769C77EB83139A457 /* CTHalfInterstitialImageViewController.h in Headers */, + 5312B16F9B1F0A29AAF9E7F8E2B95ECF /* CTHalfInterstitialViewController.h in Headers */, + 2527187B211C581966CDB5622791598D /* CTHeaderViewController.h in Headers */, + D1D8DDC9C78A1B2F93A75ED7FB4581A2 /* CTIdentityRepo.h in Headers */, + 4A39BBDED625C0418F5B9B24E28C1791 /* CTIdentityRepoFactory.h in Headers */, + C94504ECED3B417B2DAE0238494CFA4A /* CTImageInAppViewController.h in Headers */, + BA5F4BC47953F6531BE4AF74E4E88FEF /* CTImageInAppViewControllerPrivate.h in Headers */, + A2FD151569340CDA55032E4FEA9207C2 /* CTInAppDisplayViewController.h in Headers */, + 715A235A646E349D505A9EF44F4CDF88 /* CTInAppDisplayViewControllerPrivate.h in Headers */, + 8FE5F56DFA35C5B05EEC5FDACF5FCE8B /* CTInAppFCManager.h in Headers */, + 45C4A6C4BE757DE181F47B6D6B4EE9CE /* CTInAppHTMLViewController.h in Headers */, + 15A1153AB12471677BD42377966B9887 /* CTInAppNotification.h in Headers */, + FF7ACEFFC7043EFB6AD870DDDEB630F1 /* CTInAppUtils.h in Headers */, + 0151B2F1BC0ED2DD8E355579FB401B28 /* CTInboxBaseMessageCell.h in Headers */, + DB6E9F134D7F87715468F30F6E3F6A11 /* CTInboxController.h in Headers */, + 5B6D849625A97A4BC849357D3A44237B /* CTInboxIconMessageCell.h in Headers */, + 524DE64A225534173770A3637C7DDEF6 /* CTInboxMessageActionView.h in Headers */, + 529948F715DF42A81ED9FEC9F097A68E /* CTInboxSimpleMessageCell.h in Headers */, + F81D9791487AE3AE4E5A1E451931D85F /* CTInboxUtils.h in Headers */, + BDC659502BBA2D065237085C1D0E4AC4 /* CTInterstitialImageViewController.h in Headers */, + E013CFAA886F3B46AA2399993250C69A /* CTInterstitialViewController.h in Headers */, + 6C27F1CCDBD1B40C796BB6EE179F01CF /* CTKnownProfileFields.h in Headers */, + 98EA9F27C1EA4F4223730AB27E2D7385 /* CTLegacyIdentityRepo.h in Headers */, + 2A79E0A6D0F72DA562029163F2C39BDF /* CTLocalDataStore.h in Headers */, + E2AA528A6FA010CDB77A141AE8E35A9A /* CTLocalInApp.h in Headers */, + E669D73AA2B36D232CA4315031BE8A6E /* CTLogger.h in Headers */, + 358C8DD37699D29EC27563C0E2C3CA68 /* CTLoginInfoProvider.h in Headers */, + 736B8BD2377B9C74B4F1C01A0159D7F6 /* CTMessageMO.h in Headers */, + 8038EF8B8E78E643607328EF4E232E79 /* CTMessageMO+CoreDataProperties.h in Headers */, + D251FA0095A9D50F938EBA6B9C409602 /* CTNotificationButton.h in Headers */, + 830D815988C9F092F8611A4A91159C89 /* CTPinnedNSURLSessionDelegate.h in Headers */, + 1E1017B6DF866CDABA0E3131784806F3 /* CTPlistInfo.h in Headers */, + 9A79A76CBB614E968AECC2B3302F30AF /* CTPreferences.h in Headers */, + E8C1CA5EDECE5A481B088E91682A770A /* CTProductConfigController.h in Headers */, + ADEA19F26D883549E2C75E152332157A /* CTProfileBuilder.h in Headers */, + 5F061ACD532175D871C17B4B6E6D4903 /* CTRequest.h in Headers */, + C0A618B08ADE9F3F42B2296A0EB6C936 /* CTRequestFactory.h in Headers */, + BF75C9EA6AB64A9FD09B310308A73969 /* CTRequestSender.h in Headers */, + 620698D032C192CCB6874A6647981702 /* CTSwipeView.h in Headers */, + 3538C8FC4D1AC0E0D2F10C9B3804F707 /* CTSwizzle.h in Headers */, + CC511B3DBE8CDE60607E7892DA8572F0 /* CTUIUtils.h in Headers */, + 431F03F84A6451F2E999F11CF9D23513 /* CTUriHelper.h in Headers */, + 06E857D24C595CD030F0D1181527EFE3 /* CTUserMO.h in Headers */, + 7995CAF0124A90B6D97A01454FC017F3 /* CTUserMO+CoreDataProperties.h in Headers */, + 8D31F5004FC3C35BDD4E2478B3436E49 /* CTUtils.h in Headers */, + D53D49F094B75EE95006055C7FBD8247 /* CTValidationResult.h in Headers */, + C0EBB857C0CE219DF86EC11740FB344C /* CTValidationResultStack.h in Headers */, + 72DC5CF7654590CFD378AD55858DB0BE /* CTValidator.h in Headers */, + 3F31E65C6C8512CE86F6ED39FD75373A /* CTVar.h in Headers */, + 9B03233ACAD99B0BB7EF217E05E2A80C /* CTVar-Internal.h in Headers */, + E73B4C8BC090976E226F30641D2765EF /* CTVarCache.h in Headers */, + 666F613CF61B5DB6B100BC86D99169BC /* CTVariables.h in Headers */, + 44D6B40F8258E246AFEF7E6DC5EADD90 /* CTVideoThumbnailGenerator.h in Headers */, + 062D7C9FF4145A767DB839679B804036 /* LeanplumCT.h in Headers */, + DCF812A58619784A1BF7E26A4CEFFD0C /* NSDictionary+Extensions.h in Headers */, + 129481A1AF3320D823F6083D3F20960D /* UIView+CTToast.h in Headers */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -1506,11 +1588,11 @@ /* Begin PBXNativeTarget section */ 3847153A6E5EEFB86565BA840768F429 /* SDWebImage */ = { isa = PBXNativeTarget; - buildConfigurationList = 4666638833A091FDC5AF0AC0745CDD1C /* Build configuration list for PBXNativeTarget "SDWebImage" */; + buildConfigurationList = B24F20E5AC023B67514435E827B0911A /* Build configuration list for PBXNativeTarget "SDWebImage" */; buildPhases = ( - 90C5D1FA43A4783B2F9EA1265C963F51 /* Headers */, - 144DE125EC53A865BCA834368DC628F6 /* Sources */, - 578BDEC356BA3FD1B3B811C96F184FE0 /* Frameworks */, + 046A1393FFB8AAB51E96FE47962653C7 /* Headers */, + 5E32CE9CDC2CC80D6DA6C02DD939D286 /* Sources */, + FDF6C9809C34B4EF33CC67A552FFCEA5 /* Frameworks */, ); buildRules = ( ); @@ -1523,11 +1605,11 @@ }; 3BDDCDFCA8633FC28798031462AD1410 /* CleverTap-iOS-SDK-CleverTapSDK */ = { isa = PBXNativeTarget; - buildConfigurationList = BBA7B0CC66C929E7C30B0D28026EE63F /* Build configuration list for PBXNativeTarget "CleverTap-iOS-SDK-CleverTapSDK" */; + buildConfigurationList = E3ABA0F21CD4439175F6746159D2E42C /* Build configuration list for PBXNativeTarget "CleverTap-iOS-SDK-CleverTapSDK" */; buildPhases = ( - AEECCC54FCFE84E836AA67A3F5A07FD9 /* Sources */, - 7945458DEA830485C85E9EC5856CF133 /* Frameworks */, - EC4BCEA5FC3A085864FD01F828FAE214 /* Resources */, + ECA622CFE7C75129EA0F811506ACBDC3 /* Sources */, + 04AD08B3F3E6CC0A17117D8DCABD3877 /* Frameworks */, + B289A9B01B856AFBBB40807E3996CD92 /* Resources */, ); buildRules = ( ); @@ -1549,8 +1631,8 @@ buildRules = ( ); dependencies = ( - 045B2DBF76FF5B34C1904D6A28746D81 /* PBXTargetDependency */, - 90A8C68ECABDB80DAE4940147F7AAE4C /* PBXTargetDependency */, + 0EB111AED6F725AF6E48A68708AF51A1 /* PBXTargetDependency */, + B41A93261692C8186741F83ADAFEF55A /* PBXTargetDependency */, ); name = "Pods-ExampleProject"; productName = "Pods-ExampleProject"; @@ -1559,17 +1641,17 @@ }; E12536816B6C31D7AF55D161F6F97141 /* CleverTap-iOS-SDK */ = { isa = PBXNativeTarget; - buildConfigurationList = AC3816654F14EA8C458DFE43788BEE82 /* Build configuration list for PBXNativeTarget "CleverTap-iOS-SDK" */; + buildConfigurationList = C7D4BBC9976B54C5BE3E3474BC0DA8C6 /* Build configuration list for PBXNativeTarget "CleverTap-iOS-SDK" */; buildPhases = ( - 81190176EF34E6840E475374E13868BC /* Headers */, - 623F3C066B681C25B748D9CEDA6A960B /* Sources */, - C3C696D398B52082FAEA55BEEF09C9F4 /* Frameworks */, + F7B7399669E8A9121C75CBEC566FBD5A /* Headers */, + E40EAAE31A701CA25445B7BDC2B505BA /* Sources */, + A9C8DCCB7A832C546780C361CE740843 /* Frameworks */, ); buildRules = ( ); dependencies = ( - 802F7A109B792A3D3213B5078BE1E650 /* PBXTargetDependency */, - 6D35AA921A0762C9CB20E7AC8D1B5CC3 /* PBXTargetDependency */, + B87B12DBF44D45D46C315D88881BB81C /* PBXTargetDependency */, + A08C561F539066E7E0044AE4FB2BF373 /* PBXTargetDependency */, ); name = "CleverTap-iOS-SDK"; productName = "CleverTap-iOS-SDK"; @@ -1607,282 +1689,292 @@ /* End PBXProject section */ /* Begin PBXResourcesBuildPhase section */ - EC4BCEA5FC3A085864FD01F828FAE214 /* Resources */ = { + B289A9B01B856AFBBB40807E3996CD92 /* Resources */ = { isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( - 934754BBC303E9737FBE537BD8213C23 /* CleverTapInboxViewController.xib in Resources */, - 3B94A8CA5F89719584453941D438F7F2 /* ct_default_audio.png in Resources */, - E28C435245EC08C6D8E881F66B062A52 /* ct_default_landscape_image.png in Resources */, - 66C8E8E8257CF535B772DBEFFB0B408E /* ct_default_portrait_image.png in Resources */, - 11430ABE26456323CABB5DC8B87B8DC9 /* ct_default_video.png in Resources */, - 3ED6AAFF90D5AB684EE8AA094CCB7A6E /* ct_volume_off.png in Resources */, - FAFA50E44578B9AEDA80876553B21742 /* ct_volume_on.png in Resources */, - 9EF93D72DBCDE9FEAA8726742B7E4760 /* CTCarouselImageMessageCell~land.xib in Resources */, - 13FC0FC4C219FC3EB438173171E5714A /* CTCarouselImageMessageCell~port.xib in Resources */, - E26AF8E4BEF23FB2440477A0C2225780 /* CTCarouselImageView.xib in Resources */, - E3460E4E21A5B2DABFDEB61BA181EA56 /* CTCarouselMessageCell~land.xib in Resources */, - 0133ECA108614477E3D99F872AFB2BD4 /* CTCarouselMessageCell~port.xib in Resources */, - 6BB2A281F9A399BC46D1E5F818B2E889 /* CTCoverImageViewController~ipad.xib in Resources */, - E49CE449FD020D9D0D14FCA4829D3F15 /* CTCoverImageViewController~ipadland.xib in Resources */, - F8D0E87FD8560892DE5051384B5DC5A1 /* CTCoverImageViewController~iphoneland.xib in Resources */, - 9581968FC1068A6768C06F9DE5BD6DDC /* CTCoverImageViewController~iphoneport.xib in Resources */, - E6B36C3465CE25372DB14A5EB0B1DC6A /* CTCoverViewController~ipad.xib in Resources */, - 321BA13855602C7516A115534D182E51 /* CTCoverViewController~ipadland.xib in Resources */, - 19BCDFD2245F9226D722FAB64B4582FD /* CTCoverViewController~iphoneland.xib in Resources */, - 697F8D118A068002AF63F3EBCC5E8CD6 /* CTCoverViewController~iphoneport.xib in Resources */, - DA2053312CC0ADE6DF5DAC8ED78AFFFD /* CTFooterViewController~ipad.xib in Resources */, - 9C106059A503917ACEEFB4E09E568CB3 /* CTFooterViewController~ipadland.xib in Resources */, - 5EE1F67A6B35CE18D9A0F91C2EFBDF0D /* CTFooterViewController~iphoneland.xib in Resources */, - E271605B928F26FF8918896E66C198A4 /* CTFooterViewController~iphoneport.xib in Resources */, - 27BA673FD66732E9C2C8351E1D0FFDEE /* CTHalfInterstitialImageViewController~ipad.xib in Resources */, - 9E9A3C9AA004FC043ACCBAEF7B01D5EF /* CTHalfInterstitialImageViewController~ipadland.xib in Resources */, - 0810E7EE2FF3B640AD433A4B9E17DDB0 /* CTHalfInterstitialImageViewController~iphoneland.xib in Resources */, - B87956886FCE2C86D2BE9CE353C76603 /* CTHalfInterstitialImageViewController~iphoneport.xib in Resources */, - 03FAB1A7C3CFCA27BB3E18241261429D /* CTHalfInterstitialViewController~ipad.xib in Resources */, - D1E030725541D127E141D192EACCDCAF /* CTHalfInterstitialViewController~ipadland.xib in Resources */, - 99DEDD06EB4B63F3663802BCCD9599E1 /* CTHalfInterstitialViewController~iphoneland.xib in Resources */, - 9F470A8226B4B0840CBD436C5DCF4B61 /* CTHalfInterstitialViewController~iphoneport.xib in Resources */, - 9288D30DE210E2730F8F0714E1BB7BF9 /* CTHeaderViewController~ipad.xib in Resources */, - D1FB326B02C811CEB8DFADF08FE4278A /* CTHeaderViewController~ipadland.xib in Resources */, - 91E51B661AF42E6CE0A44456739367C5 /* CTHeaderViewController~iphoneland.xib in Resources */, - 942BFFD2ACFC348C1CDC8628BB8B175C /* CTHeaderViewController~iphoneport.xib in Resources */, - 55DA5C989C828A2980CFB72D32795B65 /* CTInboxIconMessageCell~land.xib in Resources */, - 505251EFABD311A066F70858A1E8E24B /* CTInboxIconMessageCell~port.xib in Resources */, - C01053955B8AE96AFADAC43063396D33 /* CTInboxSimpleMessageCell~land.xib in Resources */, - 5BBB0C40E4042E4AD72C02632410D9C3 /* CTInboxSimpleMessageCell~port.xib in Resources */, - 9018C94AD4264974B5DB02ADE8FB18BE /* CTInterstitialImageViewController~ipad.xib in Resources */, - 2C1E0AD61526DD821AB622734F254952 /* CTInterstitialImageViewController~ipadland.xib in Resources */, - 77A67DCEED6897F90035A8B12404972A /* CTInterstitialImageViewController~iphoneland.xib in Resources */, - 04774B163CB17DC8AEB6AEDC2EFD07C0 /* CTInterstitialImageViewController~iphoneport.xib in Resources */, - 4E48F2018B377D003408D9141BA30523 /* CTInterstitialViewController~ipad.xib in Resources */, - 94A99C64223F2CEF1B3E71BCFBC24067 /* CTInterstitialViewController~ipadland.xib in Resources */, - 3D54532FCF02815965A4CB61BC18731A /* CTInterstitialViewController~iphoneland.xib in Resources */, - C9376E67C5F9711413A9E0036E465EBC /* CTInterstitialViewController~iphoneport.xib in Resources */, - 741587458DA9CE48600E1EC92563210C /* ic_pause@1x.png in Resources */, - 64D53A1558B6F15EB66E08004A637F2A /* ic_pause@2x.png in Resources */, - E625D1715493E43DFC0217C324EB1042 /* ic_pause@3x.png in Resources */, - C266CED7168DFF429D15BD1078D718C1 /* ic_play@1x.png in Resources */, - EA34B8A447C233839A392ACB5B621E23 /* ic_play@2x.png in Resources */, - 769524215C10FD07A06C0E9F6330E02F /* ic_play@3x.png in Resources */, - D353BA4E5F707FE14148F3DDB87298F7 /* Inbox.xcdatamodeld in Resources */, + AE204FF833B93F7B6020FC4BE35DD532 /* CleverTapInboxViewController.xib in Resources */, + B39E115163ADCA158508B98C03397402 /* ct_default_audio.png in Resources */, + 333BCB24773BF9C8BDDCD3D3606D9A4E /* ct_default_landscape_image.png in Resources */, + E06C5613374063CC3E4D3E6129A8DD43 /* ct_default_portrait_image.png in Resources */, + 812FC99E5B68A330676F25426C798455 /* ct_default_video.png in Resources */, + 2645EEE7B8A657C2BD6136CE94272FD1 /* ct_volume_off.png in Resources */, + E3155A925477FCF6AF7387EC671B0CA6 /* ct_volume_on.png in Resources */, + 0DC56C61C432EC5EA69581933C53398E /* CTCarouselImageMessageCell~land.xib in Resources */, + 636F9B282470CAA25EC8F3160C843934 /* CTCarouselImageMessageCell~port.xib in Resources */, + 47C8A6F0E492B9DC12E9C79869BB5C40 /* CTCarouselImageView.xib in Resources */, + CD8ECAD77E23980008149C61C2EAD249 /* CTCarouselMessageCell~land.xib in Resources */, + 6CAA062EF917428559EE37635E8CF794 /* CTCarouselMessageCell~port.xib in Resources */, + 46E5A70273CB4826C265FCE04E08CE99 /* CTCoverImageViewController~ipad.xib in Resources */, + B791AE397AF0BE4C40750DE519252B58 /* CTCoverImageViewController~ipadland.xib in Resources */, + 8EEE9F469D292C4E10910F99C17B7B3D /* CTCoverImageViewController~iphoneland.xib in Resources */, + AFA25A1DC0DCDDA040A263FF6CF5E5C1 /* CTCoverImageViewController~iphoneport.xib in Resources */, + A94AC3A23E362991EECE644B96276B40 /* CTCoverViewController~ipad.xib in Resources */, + 1CAFA135F5F8621BF365D0F04CA663D7 /* CTCoverViewController~ipadland.xib in Resources */, + 91C717BA899BC7F766408D6BF2AC098F /* CTCoverViewController~iphoneland.xib in Resources */, + 0B316DBA9484753332DB4CC192002847 /* CTCoverViewController~iphoneport.xib in Resources */, + 2C683D2823A5C5F5E159F26A9854EE8E /* CTFooterViewController~ipad.xib in Resources */, + 8B1A4F5AF17EEAF769E0F87112938436 /* CTFooterViewController~ipadland.xib in Resources */, + 81DDB86172FDFC68B1610AC7DE57740C /* CTFooterViewController~iphoneland.xib in Resources */, + A681734BAD5DDEDC452B5D3D3AFC81CC /* CTFooterViewController~iphoneport.xib in Resources */, + 07DB2703CCE4EDF5D5C8EA8BBF326D9A /* CTHalfInterstitialImageViewController~ipad.xib in Resources */, + DED73BA52C961AA64B50F8E9C1939CBB /* CTHalfInterstitialImageViewController~ipadland.xib in Resources */, + EF9A6678FE66400B84FC3DF29582ADC3 /* CTHalfInterstitialImageViewController~iphoneland.xib in Resources */, + D49EDBD2CBF6837B85479450CF5ADF23 /* CTHalfInterstitialImageViewController~iphoneport.xib in Resources */, + 4014496081E31CA0E75CD53DC0FCFA11 /* CTHalfInterstitialViewController~ipad.xib in Resources */, + 14F93B57E812AC9E936095C7BFB0782A /* CTHalfInterstitialViewController~ipadland.xib in Resources */, + 267BD5FBA4B05E1BDE2281498B322D65 /* CTHalfInterstitialViewController~iphoneland.xib in Resources */, + 93B1C5DD463CD1CF11E83A5036926EF8 /* CTHalfInterstitialViewController~iphoneport.xib in Resources */, + CA5866B60FCB3D12D952E4935C6B33D8 /* CTHeaderViewController~ipad.xib in Resources */, + 0750A370B421E4FCB60E97243F713D03 /* CTHeaderViewController~ipadland.xib in Resources */, + BA798218A36F991B7100D2176E2BE3E6 /* CTHeaderViewController~iphoneland.xib in Resources */, + DA7FA9E69BF1C060158DE3D0DA01D0E7 /* CTHeaderViewController~iphoneport.xib in Resources */, + C1C54C41536332E28B6FE40E8A200582 /* CTInboxIconMessageCell~land.xib in Resources */, + F3C26AE7C6B4D9432FD13ECFDEDB21BB /* CTInboxIconMessageCell~port.xib in Resources */, + 295401B00D5C9A3166D345BA904737D7 /* CTInboxSimpleMessageCell~land.xib in Resources */, + 405B45C66F847DCD1264DB687147594A /* CTInboxSimpleMessageCell~port.xib in Resources */, + 0662D5D268EF8C349DD2487F15CE1F01 /* CTInterstitialImageViewController~ipad.xib in Resources */, + 8F9CB9C429F21097A50C567A3F10B4DB /* CTInterstitialImageViewController~ipadland.xib in Resources */, + 573DE84D5AA003B6E28D2E202F5D4226 /* CTInterstitialImageViewController~iphoneland.xib in Resources */, + 1F34F2D7E6A52B3A79B00DBB7B80FAD6 /* CTInterstitialImageViewController~iphoneport.xib in Resources */, + 1C1C3763D2A6212F14F062083EF06237 /* CTInterstitialViewController~ipad.xib in Resources */, + 136EF0F56896440CEDE30099A02381C3 /* CTInterstitialViewController~ipadland.xib in Resources */, + 0D40972305810E7E38A2E3B64B9BCDD4 /* CTInterstitialViewController~iphoneland.xib in Resources */, + 89BF6182BEC8C667EF4088EAE5D663AD /* CTInterstitialViewController~iphoneport.xib in Resources */, + 92BBD2D9F39CD902102C7C1CA583168E /* ic_pause@1x.png in Resources */, + 80EF1B18D239DE843B6944563EB94E42 /* ic_pause@2x.png in Resources */, + CE98BF2AD9DDB561A9F182BB984AEF4E /* ic_pause@3x.png in Resources */, + 977F254B471D2BB7509D29C867614EDC /* ic_play@1x.png in Resources */, + 0B9731B9843AA7F647C1027FC4FD25C5 /* ic_play@2x.png in Resources */, + E600955FD8449DE34B4378675474AA65 /* ic_play@3x.png in Resources */, + 3C6B526C9282F8D03764667EBA5F7933 /* Inbox.xcdatamodeld in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXResourcesBuildPhase section */ /* Begin PBXSourcesBuildPhase section */ - 144DE125EC53A865BCA834368DC628F6 /* Sources */ = { + 5E32CE9CDC2CC80D6DA6C02DD939D286 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( - 94D9084B595F5050674EB8C6915D3724 /* NSBezierPath+SDRoundedCorners.m in Sources */, - CB92F544B8FFC03DF9CE918EC41E04A7 /* NSButton+WebCache.m in Sources */, - C71E8496654EFBD82B96F9991181D6E5 /* NSData+ImageContentType.m in Sources */, - 6D86E2BF4BADEDC1E3E00BF572B2C27B /* NSImage+Compatibility.m in Sources */, - 6810992D3ADA7047F2782755BB19319A /* SDAnimatedImage.m in Sources */, - 6BA2EF6416256037E65C78C6C7194784 /* SDAnimatedImagePlayer.m in Sources */, - FD14B03FD8EEB9A8EA0ECC14C0ACCDF2 /* SDAnimatedImageRep.m in Sources */, - 5B9D674EE860A2C700EBC705BCDB5C6D /* SDAnimatedImageView.m in Sources */, - 22E11141F4E8D0B0C4B87A39B12EF106 /* SDAnimatedImageView+WebCache.m in Sources */, - 2261169FCE209D01515E229BBE70D929 /* SDAssociatedObject.m in Sources */, - E0F45872C80F66A9B44061BACF6AC5A5 /* SDAsyncBlockOperation.m in Sources */, - C4636F0AB20994AF98C8F7EF22C04623 /* SDCallbackQueue.m in Sources */, - F3C081ABD6E7FD78F32CD012FAA9626F /* SDDeviceHelper.m in Sources */, - 3A9D5239C51946B1D80DAE0612AF9CE3 /* SDDiskCache.m in Sources */, - 83FE0CD28BB57B99D2D4FEEC5A2F6B98 /* SDDisplayLink.m in Sources */, - F56A5F29EBA58A109DF8C1219CD7CB92 /* SDFileAttributeHelper.m in Sources */, - 433672A81111C00FCC24AEE99652DFD7 /* SDGraphicsImageRenderer.m in Sources */, - 102BFDD2A44708F5919509D96A54BAC9 /* SDImageAPNGCoder.m in Sources */, - 74D39F285A5BD53FB1512FE4788DAD7E /* SDImageAssetManager.m in Sources */, - 836E25AACCFA35F70E1F203593077CB7 /* SDImageAWebPCoder.m in Sources */, - 9F687D87E3A010BDEFC6C3FE3867A1C3 /* SDImageCache.m in Sources */, - A7C0173C1561D684F8612E75E9A91DA4 /* SDImageCacheConfig.m in Sources */, - E0B2DE75A3223D3468A67C3B91C9EA0B /* SDImageCacheDefine.m in Sources */, - 481ED20AA13F7B42BCBA63DD269CC7ED /* SDImageCachesManager.m in Sources */, - C9BF91D9E6F434335A71EA173616F09D /* SDImageCachesManagerOperation.m in Sources */, - AE86D5FDB92916F82417952DE911243B /* SDImageCoder.m in Sources */, - 776484F7ADE029F09D9EC67AF1D48348 /* SDImageCoderHelper.m in Sources */, - 2026B59703D56460239610577E7E34A6 /* SDImageCodersManager.m in Sources */, - 9719691D631D35BDA3B2DCC64C4B1BFC /* SDImageFrame.m in Sources */, - 4E49257E42794F1F9B341F10FCF17CF0 /* SDImageGIFCoder.m in Sources */, - 2739748E1493B04DA245AB967A9F3E11 /* SDImageGraphics.m in Sources */, - B6FCDF99A8F506C6BF504FCB22A4BF82 /* SDImageHEICCoder.m in Sources */, - BCB664BEE0161456B893209FA717BCBC /* SDImageIOAnimatedCoder.m in Sources */, - 3147F6455C4F4AAF72997C1B155D6AD9 /* SDImageIOCoder.m in Sources */, - 73E930AC7544156A2DFEB3B78DC2883C /* SDImageLoader.m in Sources */, - B46DBCC04BDD6FFF5506389A605FE1FF /* SDImageLoadersManager.m in Sources */, - 7F5E3062F024B0FCE550507581034E2E /* SDImageTransformer.m in Sources */, - 3CAE5C63F4EFA4CE2E84A1D94D6CF626 /* SDInternalMacros.m in Sources */, - 45CBFD5C8E520409185A3E6F28F6F678 /* SDMemoryCache.m in Sources */, - F877E00BBBF9CB336DE8582458675070 /* SDWeakProxy.m in Sources */, - F2177395C320C718DA537EB4708F0628 /* SDWebImage-dummy.m in Sources */, - 3CCC15BACC8F11081A0B08B56F727412 /* SDWebImageCacheKeyFilter.m in Sources */, - 37AD0DBA6826AD77E8B15698A008B270 /* SDWebImageCacheSerializer.m in Sources */, - 894555CC7ABD52EC6D717A244F90EAC5 /* SDWebImageCompat.m in Sources */, - 34852294FE1AC10A8DF4174ACC24F164 /* SDWebImageDefine.m in Sources */, - A9251794D83F83A4F17C5051D3C04E44 /* SDWebImageDownloader.m in Sources */, - 4070170F97B26578C54578937D6103F8 /* SDWebImageDownloaderConfig.m in Sources */, - 7F5AE16F8A723EA58D0AF1D57791E005 /* SDWebImageDownloaderDecryptor.m in Sources */, - 5D9BE78B2601A77D7C8A19C065726DFD /* SDWebImageDownloaderOperation.m in Sources */, - E5B7B09B9B14CEDF89955F83CF5783B4 /* SDWebImageDownloaderRequestModifier.m in Sources */, - BAF8554638FE87714E3748C3E2BBBA32 /* SDWebImageDownloaderResponseModifier.m in Sources */, - 53E2694AE3C51893A7F2EA89F050AC08 /* SDWebImageError.m in Sources */, - 4AC27F91CF6CEF69DF25D394104D6AEB /* SDWebImageIndicator.m in Sources */, - 7ED4EBB4F360B8A99231A5F6DC7A025E /* SDWebImageManager.m in Sources */, - FE4F52007F68746CCF6C91A198D0B157 /* SDWebImageOperation.m in Sources */, - 6472A665A3855664BFF3525A19B00593 /* SDWebImageOptionsProcessor.m in Sources */, - 13F6377DA6B53D05D86DC213E17A2E67 /* SDWebImagePrefetcher.m in Sources */, - 7DA415DFD94BD89BC862ABCE152C27DA /* SDWebImageTransition.m in Sources */, - EE8B017FE8C8EF34FC6A5E511CA6CB31 /* UIButton+WebCache.m in Sources */, - 46AF2F06EE85CE28B933C85FE84EB66F /* UIColor+SDHexString.m in Sources */, - 011E7CD433AE612A45D4FC3C75AB736D /* UIImage+ExtendedCacheData.m in Sources */, - 097E7223EF23D4FA3993A466A0264925 /* UIImage+ForceDecode.m in Sources */, - A30D8DCDC963F9ACDA41B49EECF62CF0 /* UIImage+GIF.m in Sources */, - 1790DF45D480EA89CB6FDD2C2D80BA9A /* UIImage+MemoryCacheCost.m in Sources */, - BC691FD6B15D441B7DCA7BD4DCDC0188 /* UIImage+Metadata.m in Sources */, - EE552CE31323D37E06EBAB41434E2FE4 /* UIImage+MultiFormat.m in Sources */, - 6893222FD082322CFF8EDE3878DC3301 /* UIImage+Transform.m in Sources */, - 12B24026745EA0CFF2B2BF01B78A19CA /* UIImageView+HighlightedWebCache.m in Sources */, - E62620D70F2D5F7C21235310742AC057 /* UIImageView+WebCache.m in Sources */, - FB5D8DD484646F46D4CA2A2DE24CC36C /* UIView+WebCache.m in Sources */, - 0A6E5C8734BA08D138E0340BAE50BED9 /* UIView+WebCacheOperation.m in Sources */, + E5C24F35DBDD8E55AD712BCC98CF3838 /* NSBezierPath+SDRoundedCorners.m in Sources */, + A14D29E8B4B8C51F52CD9F5544A78962 /* NSButton+WebCache.m in Sources */, + 6D86B508A8F35E1E9A3DB85BE4391D96 /* NSData+ImageContentType.m in Sources */, + 055CED4FC49D2B5267347A9ADF5D7930 /* NSImage+Compatibility.m in Sources */, + 6F5BA8DCB88130D9136674325B91CF9B /* SDAnimatedImage.m in Sources */, + 7484F49930B3947827D08BD3C1040F3B /* SDAnimatedImagePlayer.m in Sources */, + 324EF1EC20A6F447216EBC7758601CFA /* SDAnimatedImageRep.m in Sources */, + 030DAD00F502FF388BA02FB2C9F88E0A /* SDAnimatedImageView.m in Sources */, + 42E5BBA336AA8285F08C03F451ABD596 /* SDAnimatedImageView+WebCache.m in Sources */, + E2C1345CC2929503C59B535E97F2F8FC /* SDAssociatedObject.m in Sources */, + 0B12E577D16396B66961866FD4185D53 /* SDAsyncBlockOperation.m in Sources */, + F6C4ED97DF1B6373417FF22877A2EB49 /* SDCallbackQueue.m in Sources */, + BEEEC5D7D4D87EC865FE7C61F11B119A /* SDDeviceHelper.m in Sources */, + 75876B7C53AA1D9B3E292EF1B01C32CD /* SDDiskCache.m in Sources */, + CCE96698BA27787FDD20A297C0948CA7 /* SDDisplayLink.m in Sources */, + 529E11DB49D20F6F197033D97DDAFE36 /* SDFileAttributeHelper.m in Sources */, + 135D390BD223E20BFB6B252C4634E1CD /* SDGraphicsImageRenderer.m in Sources */, + 26FE6051F541AB351C6EB1DF69655ED0 /* SDImageAPNGCoder.m in Sources */, + E4DDEA1AF0257E8D7B44EE9E88F86C5C /* SDImageAssetManager.m in Sources */, + D422E81D0FCD039FC61C70B53C1E2F54 /* SDImageAWebPCoder.m in Sources */, + 7676FF2B8DCC27BE92F5FA7688B825A6 /* SDImageCache.m in Sources */, + 7326617ECB05F45D4A60F5E59D8693AA /* SDImageCacheConfig.m in Sources */, + C2AB1E9ABF89B913DAA6606B49A99A10 /* SDImageCacheDefine.m in Sources */, + 35A395FEF138D55BB0EE01DEB48B014C /* SDImageCachesManager.m in Sources */, + 4E9334747279A92760D5B7641B552420 /* SDImageCachesManagerOperation.m in Sources */, + 4D12C09EF697B35B27CDD3C453DB3ED0 /* SDImageCoder.m in Sources */, + 0DA46BC3D01D409CA23B4516725AC49B /* SDImageCoderHelper.m in Sources */, + E1C741CFD5A606101B9B488155CC25CF /* SDImageCodersManager.m in Sources */, + A1E15FC5DA8FD6B8F027801ED30AEE4A /* SDImageFrame.m in Sources */, + 280A211ADDA913D85CB4BAA0AFCA7420 /* SDImageFramePool.m in Sources */, + FD496D6A310888B03BBB0E2ACBECF063 /* SDImageGIFCoder.m in Sources */, + 95761C373BC1A3F593996F8111661DF2 /* SDImageGraphics.m in Sources */, + 413523C54F8219BBCDEEB2ECEE9AF60B /* SDImageHEICCoder.m in Sources */, + 68C7CF4CEA62E4C1A626470BD6598AE1 /* SDImageIOAnimatedCoder.m in Sources */, + C64DD3904EBFE9D7B3089F0767A7F571 /* SDImageIOCoder.m in Sources */, + 759C6B9A997D88D7054567D2CD1E0B7D /* SDImageLoader.m in Sources */, + 55D6EF9B6B1BF2EACBF498806CA9EE50 /* SDImageLoadersManager.m in Sources */, + 78A72CD4420434DFFC70C9F4D4E3397A /* SDImageTransformer.m in Sources */, + 0BC4EB0F0A0A6DB408BD811DBA1B0ACB /* SDInternalMacros.m in Sources */, + 3F103DCDD02A5B8234EF5FF910970DC4 /* SDMemoryCache.m in Sources */, + BE2866313E68B6536E8CD1CBB4AEAD33 /* SDWeakProxy.m in Sources */, + 0C40BE92746D62384A5A5E67E69FE629 /* SDWebImage-dummy.m in Sources */, + 93F69C59AAEE2FAA36886F1A945BFC59 /* SDWebImageCacheKeyFilter.m in Sources */, + 4FC5548B8EB3852712C26105B1DF1E35 /* SDWebImageCacheSerializer.m in Sources */, + CD17B11DE2F0FDD2CB4FDFEA73DCCA06 /* SDWebImageCompat.m in Sources */, + 4901E2BD6F661374C02D5A44FE492C5A /* SDWebImageDefine.m in Sources */, + A5A0D1E9940AFC6D0901C08846C821BF /* SDWebImageDownloader.m in Sources */, + B98A31A62C1C0EA6AD1F06A3D066EECA /* SDWebImageDownloaderConfig.m in Sources */, + CB240398BBB8289E97AC93FDBF60887D /* SDWebImageDownloaderDecryptor.m in Sources */, + 481B69EB1F5B57F7AA8F1770685D97B1 /* SDWebImageDownloaderOperation.m in Sources */, + E675AF5BB17A8B39EB210EC168B43D6F /* SDWebImageDownloaderRequestModifier.m in Sources */, + D0751E3FDF0FA0A602152A9AEFD7FEBA /* SDWebImageDownloaderResponseModifier.m in Sources */, + 0B05498E2F1226A632D7BD28D001C754 /* SDWebImageError.m in Sources */, + FC60003C5E6663FE1619C0A36E765BFC /* SDWebImageIndicator.m in Sources */, + A91667ED9740DB8C964E9A2B8B5C2C89 /* SDWebImageManager.m in Sources */, + 53B69EB81A9CD35BDC268C96F18B7460 /* SDWebImageOperation.m in Sources */, + C8A529DD9AECA0511D80C8D96F63DD89 /* SDWebImageOptionsProcessor.m in Sources */, + E1D6D80DC8424D3A48E8223732A3CCB0 /* SDWebImagePrefetcher.m in Sources */, + 06F77FC0B33A9B786CB4D244529C6266 /* SDWebImageTransition.m in Sources */, + AE2226D90D76CB083CBBB796210CD2BB /* UIButton+WebCache.m in Sources */, + A66B7BCA4A4810A3568FDC9A129E6A1D /* UIColor+SDHexString.m in Sources */, + D4E41C6724B22D4A921C3037ADC792B0 /* UIImage+ExtendedCacheData.m in Sources */, + FF956A5272ABEB4FFD8E3B6E89553621 /* UIImage+ForceDecode.m in Sources */, + C95E9F06CFAAA2800E66689E7EDB4DC1 /* UIImage+GIF.m in Sources */, + 2CD10463F208C7F62F3453337C4F4CAC /* UIImage+MemoryCacheCost.m in Sources */, + 0E6CBB4CA14A5C44EB528EDB7B9BFDDD /* UIImage+Metadata.m in Sources */, + 7C65C3EDF953B229F56CA70CEF6D4248 /* UIImage+MultiFormat.m in Sources */, + 8FB6DBB58C0CE88F882A5E62A418928D /* UIImage+Transform.m in Sources */, + D56DB08F1F71FDA1FDB1E49D49D07C09 /* UIImageView+HighlightedWebCache.m in Sources */, + C254428715F5DE868E91C9CB3D7E4B61 /* UIImageView+WebCache.m in Sources */, + 262ED3E9CDD38D9CD6BFBFC9FD8B07AB /* UIView+WebCache.m in Sources */, + F96FAF823E8AE56110C6A6FF42FFF63D /* UIView+WebCacheOperation.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; - 623F3C066B681C25B748D9CEDA6A960B /* Sources */ = { + E0F92CCB783E61C1AA975ABDF4611536 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( - 46AA08991E5E2B877666408E628F830C /* CleverTap.m in Sources */, - 2BE7CC3BB43A8E3FD6E3986B13B8E5AE /* CleverTap-iOS-SDK-dummy.m in Sources */, - 6913F3F61272921B9C24628B779410A7 /* CleverTapConfigValue.m in Sources */, - 93763B966D6DB496865AAD07257AB526 /* CleverTapDisplayUnit.m in Sources */, - 377F3EF762F4705AD0992CBCF4A8E357 /* CleverTapDisplayUnitContent.m in Sources */, - 58F509FB51A7791C4823D38290A8919F /* CleverTapEventDetail.m in Sources */, - 005CDED4269B81C6C62D678B2DEC1023 /* CleverTapFeatureFlags.m in Sources */, - 4616046D339260897AA1367059A68EFD /* CleverTapInboxMessage.m in Sources */, - DB489A68FC326948A2884114880304A3 /* CleverTapInboxMessageContent.m in Sources */, - BECBDD4C5DB27ADEFAEEB84AC19759C5 /* CleverTapInboxStyleConfig.m in Sources */, - 6D93676E8CC51D593D7E9E51A0ADC2BC /* CleverTapInboxViewController.m in Sources */, - 68A4CA9881F732EFC6364456D4C52F28 /* CleverTapInstanceConfig.m in Sources */, - BEEF8EA85B233CDF617AA611D9657B79 /* CleverTapJSInterface.m in Sources */, - 4D112C05D2652DBB71474FF96EE671AC /* CleverTapProductConfig.m in Sources */, - 90F75A1DEA7B529FD16C99F50ECCA4FF /* CleverTapTrackedViewController.m in Sources */, - AC05B5719716441912D9F2FD62070E13 /* CleverTapUTMDetail.m in Sources */, - 394E3E20F6D66D0F66B98ECF48845E7F /* CTAlertViewController.m in Sources */, - DFA658B925C0032491A8A1EE57723B5F /* CTAVPlayerViewController.m in Sources */, - E25E0821E78073B617F7EFFD9C0174EE /* CTBaseHeaderFooterViewController.m in Sources */, - 4BF8924FBA54B5213B8885960F46CC05 /* CTCarouselImageMessageCell.m in Sources */, - C60CE801D069CA8A00B01F68C5B1D260 /* CTCarouselImageView.m in Sources */, - 60E51187089AE7C240184FF514FDAF66 /* CTCarouselMessageCell.m in Sources */, - D4BC9709381D49C37C7E62C298EC50A1 /* CTCertificatePinning.m in Sources */, - CA3E7C68A38CF532B0FF91C345AB4371 /* CTConstants.m in Sources */, - EC8DA264C83FE4635DF8D05ECBDDF56B /* CTCoverImageViewController.m in Sources */, - 7E9538B53CED5E6996A5F16DAA074682 /* CTCoverViewController.m in Sources */, - 5DA9BD54E019A4DD5341E39E94396DCB /* CTDeviceInfo.m in Sources */, - F7BC47B34713D3B3C8F2FAEC1A553DBD /* CTDismissButton.m in Sources */, - 7C870B11DD0FF324ADB89447EA7F2942 /* CTDisplayUnitController.m in Sources */, - 0C0111E8ACDF329158C54AAAD553CFC3 /* CTEventBuilder.m in Sources */, - 758D1816BFB3F8503FD5EA4C772ADE6C /* CTFeatureFlagsController.m in Sources */, - 439CA8EE8B52A15C9E934D5D5838DB5B /* CTFlexibleIdentityRepo.m in Sources */, - B3D69B492C4D47CA5E4404538EE74D38 /* CTFooterViewController.m in Sources */, - 70BA7A91239CF7A6842E106C5C42EFFC /* CTHalfInterstitialImageViewController.m in Sources */, - C55B4980E1D4F1FACE83B1951A4762FB /* CTHalfInterstitialViewController.m in Sources */, - D6DA69CD20437B47C0E20720C2DC5823 /* CTHeaderViewController.m in Sources */, - 18788A9177E52678E575B4F7BAC02832 /* CTIdentityRepoFactory.m in Sources */, - 7B8CD1F84DE471808E72440F8B34D8AE /* CTImageInAppViewController.m in Sources */, - 133C16566C1CB17D22C24E38BD2E9CB3 /* CTInAppDisplayViewController.m in Sources */, - 3696997DE1170F3D8DD3CB6C4FD5CB51 /* CTInAppFCManager.m in Sources */, - B7689CEEB185F8E0B980BBC0B357CD18 /* CTInAppHTMLViewController.m in Sources */, - 4F01B04071B3572C3FFF6297F8BD231B /* CTInAppNotification.m in Sources */, - 9BE2B069934ECD54F915B6754382E36A /* CTInAppUtils.m in Sources */, - 7B1E870BA2D33992CF4797D67E8FB52E /* CTInboxBaseMessageCell.m in Sources */, - FD011254C4F5B0E14DC2636143FE7CA9 /* CTInboxController.m in Sources */, - A3D9602845C33DB21E063AA09D798C76 /* CTInboxIconMessageCell.m in Sources */, - B34DBE269AE41CC41CD32BF114C6398F /* CTInboxMessageActionView.m in Sources */, - 42AFEE0589918ABDD9E6BF3C68286423 /* CTInboxSimpleMessageCell.m in Sources */, - DC7B836D000C75C33EADDFE1544303D7 /* CTInboxUtils.m in Sources */, - C1F129C8DF2C7B1E0817EB64F727AF00 /* CTInterstitialImageViewController.m in Sources */, - B8D621A51AB5A315BC108CFA28877966 /* CTInterstitialViewController.m in Sources */, - 2D7ACD1BBBC4831C017A2FC70EBF7D95 /* CTKnownProfileFields.m in Sources */, - F979D1BCF2DE46B536C6DD7A4B0261BC /* CTLegacyIdentityRepo.m in Sources */, - 829D01532228F3AF709E7C8FC81B67D2 /* CTLocalDataStore.m in Sources */, - 7A817F14567BD3F59F774F20EE0C70AE /* CTLocalInApp.m in Sources */, - 27BE25690942BD858E60D998A014EB32 /* CTLocationManager.m in Sources */, - A15F466EFA681ABB36C77708CAB5463A /* CTLogger.m in Sources */, - 2321232D23BFBF7069A10A50785BD075 /* CTLoginInfoProvider.m in Sources */, - 05C9AC8D49156A12B17BDCB53B676F4D /* CTMessageMO.m in Sources */, - 4FF817F949C80475B43DE719847DFA3B /* CTMessageMO+CoreDataProperties.m in Sources */, - 01A50E4F7B34BA271C90CDEB1877ACBB /* CTNotificationButton.m in Sources */, - 4B58CBD67FBD622830342CFD35C52F90 /* CTPinnedNSURLSessionDelegate.m in Sources */, - 1B93935D1D478494B420A1DD69BCBDBC /* CTPlistInfo.m in Sources */, - D5401EEDC6B7EDBA068B5738E4DFF0FE /* CTPreferences.m in Sources */, - 0DD9426E12CBF548EF7206C31CF07C5A /* CTProductConfigController.m in Sources */, - EC89D097492D463517121FC42DB063CD /* CTProfileBuilder.m in Sources */, - 0E19823CC670437E29F2C3AA8660BF41 /* CTSwipeView.m in Sources */, - FDA9AE77C80EA1A6FBBC541653BD131D /* CTSwizzle.m in Sources */, - 6C43654D32837794C9CC762B7EB6CF56 /* CTUIUtils.m in Sources */, - 67DB19E2AC0E55B71AB2968779434B2A /* CTUriHelper.m in Sources */, - 489199278855BAB5EA879D755481FFBB /* CTUserMO.m in Sources */, - 72838CB739BAB0571986CA1107BB2E02 /* CTUserMO+CoreDataProperties.m in Sources */, - 11D6E13ABB1F372D613D0CA09B3963AA /* CTUtils.m in Sources */, - 85F4726FCEC0D668B3AFDB8AAD2CA62E /* CTValidationResult.m in Sources */, - BAAA3E91B3D3B8EE5C3FC7880E0A8CCE /* CTValidationResultStack.m in Sources */, - FEF582F895624BCD69B43D03FF7CB66E /* CTValidator.m in Sources */, - 9291A78989CEA64D91C2A92EFEB8D8DF /* CTVideoThumbnailGenerator.m in Sources */, - B4E6D5C2E631EB9D140AEB2E77C08794 /* UIView+CTToast.m in Sources */, + DDAD12CF785092BF4E3E3AA4037FCC90 /* Pods-ExampleProject-dummy.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; - AEECCC54FCFE84E836AA67A3F5A07FD9 /* Sources */ = { + E40EAAE31A701CA25445B7BDC2B505BA /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( + 5B6655E256A273FA906EA2FA38EF2A55 /* CleverTap.m in Sources */, + 0E08784037E8DE78016A3DEED2219419 /* CleverTap-iOS-SDK-dummy.m in Sources */, + F8ABF4A4D106037955D3B507A8F7649F /* CleverTapConfigValue.m in Sources */, + E5D25BF964176E3A889CD95B71AAAA22 /* CleverTapDisplayUnit.m in Sources */, + CDF832D381251B812D9E3540977AC0CB /* CleverTapDisplayUnitContent.m in Sources */, + 609D4DD1983B6B394EFBB8F4E5854453 /* CleverTapEventDetail.m in Sources */, + AAC448D46DCF680244C92E01A0CE3B32 /* CleverTapFeatureFlags.m in Sources */, + 00BEE2A32320779CE6C0012ED944C39F /* CleverTapInboxMessage.m in Sources */, + E6A74A81B29AC364ED9F07FB1345AAA6 /* CleverTapInboxMessageContent.m in Sources */, + 43F1F70DACC2168F094B66F9DFE19F63 /* CleverTapInboxStyleConfig.m in Sources */, + DA2F9D0C7106115B7DFEAE1090B9125E /* CleverTapInboxViewController.m in Sources */, + 805CF9548D1328B9A26AE041B03525D9 /* CleverTapInstanceConfig.m in Sources */, + EC7C9B9733155C8055210CEEC8AEEAAF /* CleverTapJSInterface.m in Sources */, + 62966FDBDC39A4CB16FD987F5FCB1999 /* CleverTapProductConfig.m in Sources */, + 736FE4E60F76C558900705C39DE95F25 /* CleverTapTrackedViewController.m in Sources */, + 2371B04DF0A59E25FD54A486849A9985 /* CleverTapUTMDetail.m in Sources */, + BCF51E69BD0C4EE650D2A4745CB8D977 /* ContentMerger.m in Sources */, + 43F93BA8308FEDEB2C2B9AE248DE384B /* CTAlertViewController.m in Sources */, + 97ECCF0144F12B405B2819B1EEA0DFC2 /* CTAVPlayerViewController.m in Sources */, + 480B3D6EFCC7631150DCE87E744D08FC /* CTBaseHeaderFooterViewController.m in Sources */, + EE6EACC46F7891CC8958CC29D177B240 /* CTCarouselImageMessageCell.m in Sources */, + 73B71B427CFDCF39E0563042F056E6AD /* CTCarouselImageView.m in Sources */, + E222B4DFC8B19F98E5BEDDE0482CFFAE /* CTCarouselMessageCell.m in Sources */, + 812A5A89F37B2A712A01CBB44EC03C8B /* CTCertificatePinning.m in Sources */, + 3696A8D3141E9FA3B80C5B12B54FE0CF /* CTConstants.m in Sources */, + D417BEA908C874963837BF642192A41C /* CTCoverImageViewController.m in Sources */, + 43CFFCE09E5DE6495BE22A0DB630F922 /* CTCoverViewController.m in Sources */, + A4D1E4FE505B3D2247B61AFFF22652D4 /* CTDeviceInfo.m in Sources */, + 771A2F2330E2D8C05DFB7045C957FDCD /* CTDismissButton.m in Sources */, + CB51FC80B676EB93558B90AD1217D925 /* CTDisplayUnitController.m in Sources */, + A64624B1476619D64A7B575A8C7DDFD2 /* CTDomainFactory.m in Sources */, + 545E92A970E59E1C3D723ECAAEB9D334 /* CTEventBuilder.m in Sources */, + 3E710CF6B6D074C8038CF31C9ADEDF83 /* CTFeatureFlagsController.m in Sources */, + EE84B43665C587A7D5E0B9E57F6D9AE1 /* CTFlexibleIdentityRepo.m in Sources */, + E41534761B02F107F25508BC893A6982 /* CTFooterViewController.m in Sources */, + 44FF6E1E5BA0AC9F741552066F34D28D /* CTHalfInterstitialImageViewController.m in Sources */, + 45B2B028EA36BBF623CBECD64AB6CBB5 /* CTHalfInterstitialViewController.m in Sources */, + C4805990167E7924677730A844691221 /* CTHeaderViewController.m in Sources */, + 13F18E32E316C78D5463758D3C5A5825 /* CTIdentityRepoFactory.m in Sources */, + CFEB6A561EB131C5A74712A9643DBF90 /* CTImageInAppViewController.m in Sources */, + FADA72DF5793702B1801FA3C2407CE7F /* CTInAppDisplayViewController.m in Sources */, + B3B7C538B6E2593F8947B0F36FCE6789 /* CTInAppFCManager.m in Sources */, + A68D6CFE5F029DA9DC6BFD7CB1B3B540 /* CTInAppHTMLViewController.m in Sources */, + 2E7ED8A74B6C570A146A5728A9D1FDB1 /* CTInAppNotification.m in Sources */, + 206C2BD364602D9EA805087A90107526 /* CTInAppUtils.m in Sources */, + 20F15470DF66295D26C705A546FAA175 /* CTInboxBaseMessageCell.m in Sources */, + B337976E837755E90DEFFD9AC3298DAD /* CTInboxController.m in Sources */, + FFB4F122FD328CDFEDB623C98D8476B0 /* CTInboxIconMessageCell.m in Sources */, + DB8AD2ADB6618A68C677E5B1A999C88C /* CTInboxMessageActionView.m in Sources */, + 3881F35C836A1E1278F33AA5DA030E8E /* CTInboxSimpleMessageCell.m in Sources */, + 197E32449C34D5951C8E10ACEBD30900 /* CTInboxUtils.m in Sources */, + 821DE5A140F7376590FB766DC1AD3175 /* CTInterstitialImageViewController.m in Sources */, + 32C95400095E545E696DA6A3E9FCB931 /* CTInterstitialViewController.m in Sources */, + 054FF90B007DCD51AE17D6BAF4E1E73F /* CTKnownProfileFields.m in Sources */, + DF8E1CC3389C2096E6D0EBC55F9A8090 /* CTLegacyIdentityRepo.m in Sources */, + 40612D032399986F82DF2260494D38A4 /* CTLocalDataStore.m in Sources */, + 1E547796F6E9DBC08A2C5CCEBC6E3256 /* CTLocalInApp.m in Sources */, + E56A30043DC367B1ADEF7BFB9A90E86C /* CTLogger.m in Sources */, + 5A2868AFF20F7C2A55B3562E0F3DF488 /* CTLoginInfoProvider.m in Sources */, + D226F01E7A4BDE041C30561F88AFC97B /* CTMessageMO.m in Sources */, + 8DDD2C7B0E3FA5E30F6322C53B956614 /* CTMessageMO+CoreDataProperties.m in Sources */, + D46C9AC4B01B8941D227C30EB1513075 /* CTNotificationButton.m in Sources */, + BB34BA48B87AD28E68EAD214759D11CC /* CTPinnedNSURLSessionDelegate.m in Sources */, + 3279A1ED7B54D61DE5F934959BCBB530 /* CTPlistInfo.m in Sources */, + 95CECB3F23A3F143F424FD5EC8C837C7 /* CTPreferences.m in Sources */, + 4AB7091330FF83719CA4CE8333A64111 /* CTProductConfigController.m in Sources */, + A8DAE80B5FBB0D8B75AE0A8B11A84DBA /* CTProfileBuilder.m in Sources */, + 645ACA6C10E570578FE59358E862FD36 /* CTRequest.m in Sources */, + 283F8A6B3CC013284D12CEB2CBE814FE /* CTRequestFactory.m in Sources */, + F86885445C3E89124D8063595658A414 /* CTRequestSender.m in Sources */, + 771CE79DB1987E9E13B9EDEB98F0311E /* CTSwipeView.m in Sources */, + 4298E89E1FF7FC5BDD4731A79F9BDE65 /* CTSwizzle.m in Sources */, + CA586B80A71C55E490F31407C1B237A5 /* CTUIUtils.m in Sources */, + 5422B2A45FA1F2CD6A0E7CA096A02014 /* CTUriHelper.m in Sources */, + 3B07ED662379558DCE3767203FE33178 /* CTUserMO.m in Sources */, + E64A99FA30036977964E0C53F39EEE51 /* CTUserMO+CoreDataProperties.m in Sources */, + 703E247672BC3832CAE1DA941AB05140 /* CTUtils.m in Sources */, + 705ED92FD46E97B317B19C43532C5B5D /* CTValidationResult.m in Sources */, + F7813A192E54C146609290CB8C85887C /* CTValidationResultStack.m in Sources */, + 5562C5F2CC6EC70F5F82E5C4B847623E /* CTValidator.m in Sources */, + 61303710B87B190055A33B8281023338 /* CTVar.m in Sources */, + 7DFEB22D8A6C923AD3EAFD643A81F7B8 /* CTVarCache.m in Sources */, + 1821E7A40169BB9D38B32A4CEA4DFB6C /* CTVariables.m in Sources */, + E0359EDB819DC2F93941BF25F459B5E9 /* CTVideoThumbnailGenerator.m in Sources */, + 46CE3E179F6E7AAD37F4CCA75B6E61EF /* LeanplumCT.m in Sources */, + 3F18E40308E27710DB373B9C981FD2F5 /* NSDictionary+Extensions.m in Sources */, + 109777B8FAA0267BAC396337EE7875BE /* UIView+CTToast.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; - E0F92CCB783E61C1AA975ABDF4611536 /* Sources */ = { + ECA622CFE7C75129EA0F811506ACBDC3 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( - DDAD12CF785092BF4E3E3AA4037FCC90 /* Pods-ExampleProject-dummy.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXSourcesBuildPhase section */ /* Begin PBXTargetDependency section */ - 045B2DBF76FF5B34C1904D6A28746D81 /* PBXTargetDependency */ = { + 0EB111AED6F725AF6E48A68708AF51A1 /* PBXTargetDependency */ = { isa = PBXTargetDependency; name = "CleverTap-iOS-SDK"; target = E12536816B6C31D7AF55D161F6F97141 /* CleverTap-iOS-SDK */; - targetProxy = 556F6957C401B8584B522639A3E11426 /* PBXContainerItemProxy */; + targetProxy = 3252185819F09CB6C9FDBB85A876A847 /* PBXContainerItemProxy */; }; - 6D35AA921A0762C9CB20E7AC8D1B5CC3 /* PBXTargetDependency */ = { + A08C561F539066E7E0044AE4FB2BF373 /* PBXTargetDependency */ = { isa = PBXTargetDependency; name = SDWebImage; target = 3847153A6E5EEFB86565BA840768F429 /* SDWebImage */; - targetProxy = A774AF7EC58571CC1DC711CD9333DD09 /* PBXContainerItemProxy */; - }; - 802F7A109B792A3D3213B5078BE1E650 /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - name = "CleverTap-iOS-SDK-CleverTapSDK"; - target = 3BDDCDFCA8633FC28798031462AD1410 /* CleverTap-iOS-SDK-CleverTapSDK */; - targetProxy = BBB6BC61BB43F40A9EDA6EDA744E0B30 /* PBXContainerItemProxy */; + targetProxy = 62BB6D192270EF6CC714C6E9C3AEFC2B /* PBXContainerItemProxy */; }; - 90A8C68ECABDB80DAE4940147F7AAE4C /* PBXTargetDependency */ = { + B41A93261692C8186741F83ADAFEF55A /* PBXTargetDependency */ = { isa = PBXTargetDependency; name = SDWebImage; target = 3847153A6E5EEFB86565BA840768F429 /* SDWebImage */; - targetProxy = 3162A30A830509A1824E59AB504789C6 /* PBXContainerItemProxy */; + targetProxy = 0134C881EECAB27587655E87AA33779C /* PBXContainerItemProxy */; + }; + B87B12DBF44D45D46C315D88881BB81C /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + name = "CleverTap-iOS-SDK-CleverTapSDK"; + target = 3BDDCDFCA8633FC28798031462AD1410 /* CleverTap-iOS-SDK-CleverTapSDK */; + targetProxy = 128EF83D6D0F4725E649106671C45126 /* PBXContainerItemProxy */; }; /* End PBXTargetDependency section */ /* Begin XCBuildConfiguration section */ - 215008D0873AD301A2B4177C51F48544 /* Debug */ = { + 04313BEECC4AC9E6C82C39870CB83E91 /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 50043A57557B4D50B6E1A5523BC31CA3 /* CleverTap-iOS-SDK.debug.xcconfig */; + baseConfigurationReference = B65B774BD24CFB3C4E166FA1077BE8C0 /* CleverTap-iOS-SDK.debug.xcconfig */; buildSettings = { CONFIGURATION_BUILD_DIR = "$(BUILD_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)/CleverTap-iOS-SDK"; IBSC_MODULE = CleverTapSDK; @@ -1896,9 +1988,31 @@ }; name = Debug; }; - 36D24EBA8261EB289742AC17C9325F40 /* Release */ = { + 3D25665D92A149528BAB69432F055A52 /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 2ECC2A9AEFA46C5B6AE69DA76B705A43 /* Pods-ExampleProject.release.xcconfig */; + buildSettings = { + ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = NO; + CLANG_ENABLE_OBJC_WEAK = NO; + "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; + IPHONEOS_DEPLOYMENT_TARGET = 11.0; + MACH_O_TYPE = staticlib; + OTHER_LDFLAGS = ""; + OTHER_LIBTOOLFLAGS = ""; + PODS_ROOT = "$(SRCROOT)"; + PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.${PRODUCT_NAME:rfc1034identifier}"; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + TARGETED_DEVICE_FAMILY = "1,2"; + VALIDATE_PRODUCT = YES; + }; + name = Release; + }; + 653D15C373ECA09A95CC0EA1AB6141E0 /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = CD8C3A52AE627F2ED06D9CAC39015E32 /* CleverTap-iOS-SDK.release.xcconfig */; + baseConfigurationReference = B65B774BD24CFB3C4E166FA1077BE8C0 /* CleverTap-iOS-SDK.debug.xcconfig */; buildSettings = { "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; @@ -1915,27 +2029,27 @@ SKIP_INSTALL = YES; SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; TARGETED_DEVICE_FAMILY = "1,2"; - VALIDATE_PRODUCT = YES; }; - name = Release; + name = Debug; }; - 3D25665D92A149528BAB69432F055A52 /* Release */ = { + 7546732D1C740E6D92F3830871CB9439 /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 2ECC2A9AEFA46C5B6AE69DA76B705A43 /* Pods-ExampleProject.release.xcconfig */; + baseConfigurationReference = 18AEB7DD70D4271F8C34724DFB022B9A /* SDWebImage.release.xcconfig */; buildSettings = { - ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = NO; - CLANG_ENABLE_OBJC_WEAK = NO; "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; - IPHONEOS_DEPLOYMENT_TARGET = 11.0; - MACH_O_TYPE = staticlib; + GCC_PREFIX_HEADER = "Target Support Files/SDWebImage/SDWebImage-prefix.pch"; + IPHONEOS_DEPLOYMENT_TARGET = 9.0; OTHER_LDFLAGS = ""; OTHER_LIBTOOLFLAGS = ""; - PODS_ROOT = "$(SRCROOT)"; - PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.${PRODUCT_NAME:rfc1034identifier}"; + PRIVATE_HEADERS_FOLDER_PATH = ""; + PRODUCT_MODULE_NAME = SDWebImage; + PRODUCT_NAME = SDWebImage; + PUBLIC_HEADERS_FOLDER_PATH = ""; SDKROOT = iphoneos; SKIP_INSTALL = YES; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; TARGETED_DEVICE_FAMILY = "1,2"; VALIDATE_PRODUCT = YES; }; @@ -2003,9 +2117,32 @@ }; name = Release; }; - B0A1C0CC2DC149A04D52D679CA21590B /* Release */ = { + B12489A470A404E5BB7E8ADEB82F97E3 /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 969396169355A8FFC202FCBD4F9DED20 /* CleverTap-iOS-SDK.release.xcconfig */; + buildSettings = { + "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; + GCC_PREFIX_HEADER = "Target Support Files/CleverTap-iOS-SDK/CleverTap-iOS-SDK-prefix.pch"; + IPHONEOS_DEPLOYMENT_TARGET = 9.0; + OTHER_LDFLAGS = ""; + OTHER_LIBTOOLFLAGS = ""; + PRIVATE_HEADERS_FOLDER_PATH = ""; + PRODUCT_MODULE_NAME = CleverTapSDK; + PRODUCT_NAME = "CleverTap-iOS-SDK"; + PUBLIC_HEADERS_FOLDER_PATH = ""; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; + TARGETED_DEVICE_FAMILY = "1,2"; + VALIDATE_PRODUCT = YES; + }; + name = Release; + }; + B1F4C94A133A4ADCBBCE1F467D3922E5 /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 3F3E6E2AF0F64B23881FAD76A30314EE /* SDWebImage.release.xcconfig */; + baseConfigurationReference = D87B486326D36E05C557D980109B159D /* SDWebImage.debug.xcconfig */; buildSettings = { "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; @@ -2022,9 +2159,8 @@ SKIP_INSTALL = YES; SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; TARGETED_DEVICE_FAMILY = "1,2"; - VALIDATE_PRODUCT = YES; }; - name = Release; + name = Debug; }; B4EFE046ACF8F37157F6E322C7FCFC28 /* Debug */ = { isa = XCBuildConfiguration; @@ -2113,31 +2249,9 @@ }; name = Debug; }; - E13B5585B28BC3A6D9A28DA4CC5CE052 /* Debug */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 4A31F3C2047011D7FEA251187FF99574 /* SDWebImage.debug.xcconfig */; - buildSettings = { - "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; - "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; - GCC_PREFIX_HEADER = "Target Support Files/SDWebImage/SDWebImage-prefix.pch"; - IPHONEOS_DEPLOYMENT_TARGET = 9.0; - OTHER_LDFLAGS = ""; - OTHER_LIBTOOLFLAGS = ""; - PRIVATE_HEADERS_FOLDER_PATH = ""; - PRODUCT_MODULE_NAME = SDWebImage; - PRODUCT_NAME = SDWebImage; - PUBLIC_HEADERS_FOLDER_PATH = ""; - SDKROOT = iphoneos; - SKIP_INSTALL = YES; - SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; - TARGETED_DEVICE_FAMILY = "1,2"; - }; - name = Debug; - }; - EFF6BF4D8BBDDA07A3FBA3FF28A39A17 /* Release */ = { + DA5C1FDDDF2B294286107D3E7DE74D2A /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = CD8C3A52AE627F2ED06D9CAC39015E32 /* CleverTap-iOS-SDK.release.xcconfig */; + baseConfigurationReference = 969396169355A8FFC202FCBD4F9DED20 /* CleverTap-iOS-SDK.release.xcconfig */; buildSettings = { CONFIGURATION_BUILD_DIR = "$(BUILD_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)/CleverTap-iOS-SDK"; IBSC_MODULE = CleverTapSDK; @@ -2151,40 +2265,9 @@ }; name = Release; }; - FF6A044D13F5F13B070BE411946D46E5 /* Debug */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 50043A57557B4D50B6E1A5523BC31CA3 /* CleverTap-iOS-SDK.debug.xcconfig */; - buildSettings = { - "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; - "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; - GCC_PREFIX_HEADER = "Target Support Files/CleverTap-iOS-SDK/CleverTap-iOS-SDK-prefix.pch"; - IPHONEOS_DEPLOYMENT_TARGET = 9.0; - OTHER_LDFLAGS = ""; - OTHER_LIBTOOLFLAGS = ""; - PRIVATE_HEADERS_FOLDER_PATH = ""; - PRODUCT_MODULE_NAME = CleverTapSDK; - PRODUCT_NAME = "CleverTap-iOS-SDK"; - PUBLIC_HEADERS_FOLDER_PATH = ""; - SDKROOT = iphoneos; - SKIP_INSTALL = YES; - SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; - TARGETED_DEVICE_FAMILY = "1,2"; - }; - name = Debug; - }; /* End XCBuildConfiguration section */ /* Begin XCConfigurationList section */ - 4666638833A091FDC5AF0AC0745CDD1C /* Build configuration list for PBXNativeTarget "SDWebImage" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - E13B5585B28BC3A6D9A28DA4CC5CE052 /* Debug */, - B0A1C0CC2DC149A04D52D679CA21590B /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; 4821239608C13582E20E6DA73FD5F1F9 /* Build configuration list for PBXProject "Pods" */ = { isa = XCConfigurationList; buildConfigurations = ( @@ -2203,20 +2286,29 @@ defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; - AC3816654F14EA8C458DFE43788BEE82 /* Build configuration list for PBXNativeTarget "CleverTap-iOS-SDK" */ = { + B24F20E5AC023B67514435E827B0911A /* Build configuration list for PBXNativeTarget "SDWebImage" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + B1F4C94A133A4ADCBBCE1F467D3922E5 /* Debug */, + 7546732D1C740E6D92F3830871CB9439 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + C7D4BBC9976B54C5BE3E3474BC0DA8C6 /* Build configuration list for PBXNativeTarget "CleverTap-iOS-SDK" */ = { isa = XCConfigurationList; buildConfigurations = ( - FF6A044D13F5F13B070BE411946D46E5 /* Debug */, - 36D24EBA8261EB289742AC17C9325F40 /* Release */, + 653D15C373ECA09A95CC0EA1AB6141E0 /* Debug */, + B12489A470A404E5BB7E8ADEB82F97E3 /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; - BBA7B0CC66C929E7C30B0D28026EE63F /* Build configuration list for PBXNativeTarget "CleverTap-iOS-SDK-CleverTapSDK" */ = { + E3ABA0F21CD4439175F6746159D2E42C /* Build configuration list for PBXNativeTarget "CleverTap-iOS-SDK-CleverTapSDK" */ = { isa = XCConfigurationList; buildConfigurations = ( - 215008D0873AD301A2B4177C51F48544 /* Debug */, - EFF6BF4D8BBDDA07A3FBA3FF28A39A17 /* Release */, + 04313BEECC4AC9E6C82C39870CB83E91 /* Debug */, + DA5C1FDDDF2B294286107D3E7DE74D2A /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; @@ -2224,10 +2316,10 @@ /* End XCConfigurationList section */ /* Begin XCVersionGroup section */ - B0AC13536F9F6BCF61B8BC9180C62E1F /* Inbox.xcdatamodeld */ = { + 8926ACFFB0E29BD74DD31FDE2409CBEB /* Inbox.xcdatamodeld */ = { isa = XCVersionGroup; children = ( - 3322B8628C6BCFDB03CE137E73F2862F /* Inbox.xcdatamodel */, + 1633BBB7612813EFDACF1A98B5BA8C38 /* Inbox.xcdatamodel */, ); name = Inbox.xcdatamodeld; path = CleverTapSDK/Inbox/resources/Inbox.xcdatamodeld; diff --git a/Samples/Cordova/ExampleProject/platforms/ios/Pods/Pods.xcodeproj/xcuserdata/aishwarya.nanna.xcuserdatad/xcschemes/xcschememanagement.plist b/Samples/Cordova/ExampleProject/platforms/ios/Pods/Pods.xcodeproj/xcuserdata/aishwarya.nanna.xcuserdatad/xcschemes/xcschememanagement.plist index 9351e5f3..e02d6ae1 100644 --- a/Samples/Cordova/ExampleProject/platforms/ios/Pods/Pods.xcodeproj/xcuserdata/aishwarya.nanna.xcuserdatad/xcschemes/xcschememanagement.plist +++ b/Samples/Cordova/ExampleProject/platforms/ios/Pods/Pods.xcodeproj/xcuserdata/aishwarya.nanna.xcuserdatad/xcschemes/xcschememanagement.plist @@ -8,21 +8,29 @@ isShown + orderHint + 1 CleverTap-iOS-SDK.xcscheme isShown + orderHint + 0 Pods-ExampleProject.xcscheme isShown + orderHint + 3 SDWebImage.xcscheme isShown + orderHint + 4 SuppressBuildableAutocreation diff --git a/Samples/Cordova/ExampleProject/platforms/ios/Pods/SDWebImage/README.md b/Samples/Cordova/ExampleProject/platforms/ios/Pods/SDWebImage/README.md index da002006..784ab87a 100644 --- a/Samples/Cordova/ExampleProject/platforms/ios/Pods/SDWebImage/README.md +++ b/Samples/Cordova/ExampleProject/platforms/ios/Pods/SDWebImage/README.md @@ -14,6 +14,8 @@ This library provides an async image downloader with cache support. For convenience, we added categories for UI elements like `UIImageView`, `UIButton`, `MKAnnotationView`. +Note: `SD` is the prefix for **Simple Design** (which is the team name in Daily Motion company from the author Olivier Poitrey) + ## Features - [x] Categories for `UIImageView`, `UIButton`, `MKAnnotationView` adding web image and cache management diff --git a/Samples/Cordova/ExampleProject/platforms/ios/Pods/SDWebImage/SDWebImage/Core/SDAnimatedImage.h b/Samples/Cordova/ExampleProject/platforms/ios/Pods/SDWebImage/SDWebImage/Core/SDAnimatedImage.h index 2e208cdf..28fb72bf 100644 --- a/Samples/Cordova/ExampleProject/platforms/ios/Pods/SDWebImage/SDWebImage/Core/SDAnimatedImage.h +++ b/Samples/Cordova/ExampleProject/platforms/ios/Pods/SDWebImage/SDWebImage/Core/SDAnimatedImage.h @@ -107,8 +107,26 @@ // By default, animated image frames are returned by decoding just in time without keeping into memory. But you can choose to preload them into memory as well, See the description in `SDAnimatedImage` protocol. // After preloaded, there is no huge difference on performance between this and UIImage's `animatedImageWithImages:duration:`. But UIImage's animation have some issues such like blanking and pausing during segue when using in `UIImageView`. It's recommend to use only if need. +/** + Pre-load all animated image frame into memory. Then later frame image request can directly return the frame for index without decoding. + This method may be called on background thread. + + @note If one image instance is shared by lots of imageViews, the CPU performance for large animated image will drop down because the request frame index will be random (not in order) and the decoder should take extra effort to keep it re-entrant. You can use this to reduce CPU usage if need. Attention this will consume more memory usage. + */ - (void)preloadAllFrames; + +/** + Unload all animated image frame from memory if are already pre-loaded. Then later frame image request need decoding. You can use this to free up the memory usage if need. + */ - (void)unloadAllFrames; +/** + Returns a Boolean value indicating whether all animated image frames are already pre-loaded into memory. + */ @property (nonatomic, assign, readonly, getter=isAllFramesLoaded) BOOL allFramesLoaded; +/** + Return the animated image coder if the image is created with `initWithAnimatedCoder:scale:` method. + @note We use this with animated coder which conforms to `SDProgressiveImageCoder` for progressive animation decoding. + */ +@property (nonatomic, strong, readonly, nullable) id animatedCoder; @end diff --git a/Samples/Cordova/ExampleProject/platforms/ios/Pods/SDWebImage/SDWebImage/Core/SDAnimatedImage.m b/Samples/Cordova/ExampleProject/platforms/ios/Pods/SDWebImage/SDWebImage/Core/SDAnimatedImage.m index f98c4929..bf0105f7 100644 --- a/Samples/Cordova/ExampleProject/platforms/ios/Pods/SDWebImage/SDWebImage/Core/SDAnimatedImage.m +++ b/Samples/Cordova/ExampleProject/platforms/ios/Pods/SDWebImage/SDWebImage/Core/SDAnimatedImage.m @@ -124,7 +124,6 @@ - (instancetype)initWithData:(NSData *)data scale:(CGFloat)scale options:(SDImag if (!data || data.length == 0) { return nil; } - data = [data copy]; // avoid mutable data id animatedCoder = nil; for (idcoder in [SDImageCodersManager sharedManager].coders.reverseObjectEnumerator) { if ([coder conformsToProtocol:@protocol(SDAnimatedImageCoder)]) { diff --git a/Samples/Cordova/ExampleProject/platforms/ios/Pods/SDWebImage/SDWebImage/Core/SDAnimatedImagePlayer.h b/Samples/Cordova/ExampleProject/platforms/ios/Pods/SDWebImage/SDWebImage/Core/SDAnimatedImagePlayer.h index e71e239c..77e041ac 100644 --- a/Samples/Cordova/ExampleProject/platforms/ios/Pods/SDWebImage/SDWebImage/Core/SDAnimatedImagePlayer.h +++ b/Samples/Cordova/ExampleProject/platforms/ios/Pods/SDWebImage/SDWebImage/Core/SDAnimatedImagePlayer.h @@ -10,6 +10,7 @@ #import "SDWebImageCompat.h" #import "SDImageCoder.h" +/// Animated image playback mode typedef NS_ENUM(NSUInteger, SDAnimatedImagePlaybackMode) { /** * From first to last frame and stop or next loop. diff --git a/Samples/Cordova/ExampleProject/platforms/ios/Pods/SDWebImage/SDWebImage/Core/SDAnimatedImagePlayer.m b/Samples/Cordova/ExampleProject/platforms/ios/Pods/SDWebImage/SDWebImage/Core/SDAnimatedImagePlayer.m index 683121a0..499be675 100644 --- a/Samples/Cordova/ExampleProject/platforms/ios/Pods/SDWebImage/SDWebImage/Core/SDAnimatedImagePlayer.m +++ b/Samples/Cordova/ExampleProject/platforms/ios/Pods/SDWebImage/SDWebImage/Core/SDAnimatedImagePlayer.m @@ -10,24 +10,24 @@ #import "NSImage+Compatibility.h" #import "SDDisplayLink.h" #import "SDDeviceHelper.h" +#import "SDImageFramePool.h" #import "SDInternalMacros.h" @interface SDAnimatedImagePlayer () { - SD_LOCK_DECLARE(_lock); NSRunLoopMode _runLoopMode; } +@property (nonatomic, strong) SDImageFramePool *framePool; + @property (nonatomic, strong, readwrite) UIImage *currentFrame; @property (nonatomic, assign, readwrite) NSUInteger currentFrameIndex; @property (nonatomic, assign, readwrite) NSUInteger currentLoopCount; @property (nonatomic, strong) id animatedProvider; -@property (nonatomic, strong) NSMutableDictionary *frameBuffer; +@property (nonatomic, assign) NSUInteger currentFrameBytes; @property (nonatomic, assign) NSTimeInterval currentTime; @property (nonatomic, assign) BOOL bufferMiss; @property (nonatomic, assign) BOOL needsDisplayWhenImageBecomesAvailable; @property (nonatomic, assign) BOOL shouldReverse; -@property (nonatomic, assign) NSUInteger maxBufferCount; -@property (nonatomic, strong) NSOperationQueue *fetchQueue; @property (nonatomic, strong) SDDisplayLink *displayLink; @end @@ -47,10 +47,7 @@ - (instancetype)initWithProvider:(id)provider { self.totalLoopCount = provider.animatedImageLoopCount; self.animatedProvider = provider; self.playbackRate = 1.0; - SD_LOCK_INIT(_lock); -#if SD_UIKIT - [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(didReceiveMemoryWarning:) name:UIApplicationDidReceiveMemoryWarningNotification object:nil]; -#endif + self.framePool = [SDImageFramePool registerProvider:provider]; } return self; } @@ -60,46 +57,12 @@ + (instancetype)playerWithProvider:(id)provider { return player; } -#pragma mark - Life Cycle - - (void)dealloc { -#if SD_UIKIT - [[NSNotificationCenter defaultCenter] removeObserver:self name:UIApplicationDidReceiveMemoryWarningNotification object:nil]; -#endif -} - -- (void)didReceiveMemoryWarning:(NSNotification *)notification { - [_fetchQueue cancelAllOperations]; - NSOperation *operation = [NSBlockOperation blockOperationWithBlock:^{ - NSNumber *currentFrameIndex = @(self.currentFrameIndex); - SD_LOCK(self->_lock); - NSArray *keys = self.frameBuffer.allKeys; - // only keep the next frame for later rendering - for (NSNumber * key in keys) { - if (![key isEqualToNumber:currentFrameIndex]) { - [self.frameBuffer removeObjectForKey:key]; - } - } - SD_UNLOCK(self->_lock); - }]; - [_fetchQueue addOperation:operation]; + // Dereference the frame pool, when zero the frame pool for provider will dealloc + [SDImageFramePool unregisterProvider:self.animatedProvider]; } #pragma mark - Private -- (NSOperationQueue *)fetchQueue { - if (!_fetchQueue) { - _fetchQueue = [[NSOperationQueue alloc] init]; - _fetchQueue.maxConcurrentOperationCount = 1; - } - return _fetchQueue; -} - -- (NSMutableDictionary *)frameBuffer { - if (!_frameBuffer) { - _frameBuffer = [NSMutableDictionary dictionary]; - } - return _frameBuffer; -} - (SDDisplayLink *)displayLink { if (!_displayLink) { @@ -152,11 +115,11 @@ - (void)setupCurrentFrame { UIImage *posterFrame = [[UIImage alloc] initWithCGImage:image.CGImage scale:image.scale orientation:image.imageOrientation]; #endif if (posterFrame) { + // Calculate max buffer size + [self calculateMaxBufferCountWithFrame:posterFrame]; // HACK: The first frame should not check duration and immediately display self.needsDisplayWhenImageBecomesAvailable = YES; - SD_LOCK(self->_lock); - self.frameBuffer[@(self.currentFrameIndex)] = posterFrame; - SD_UNLOCK(self->_lock); + [self.framePool setFrame:posterFrame atIndex:self.currentFrameIndex]; } } @@ -173,9 +136,7 @@ - (void)resetCurrentFrameStatus { } - (void)clearFrameBuffer { - SD_LOCK(_lock); - [_frameBuffer removeAllObjects]; - SD_UNLOCK(_lock); + [self.framePool removeAllFrames]; } #pragma mark - Animation Control @@ -183,12 +144,9 @@ - (void)startPlaying { [self.displayLink start]; // Setup frame [self setupCurrentFrame]; - // Calculate max buffer size - [self calculateMaxBufferCount]; } - (void)stopPlaying { - [_fetchQueue cancelAllOperations]; // Using `_displayLink` here because when UIImageView dealloc, it may trigger `[self stopAnimating]`, we already release the display link in SDAnimatedImageView's dealloc method. [_displayLink stop]; // We need to reset the frame status, but not trigger any handle. This can ensure next time's playing status correct. @@ -196,7 +154,6 @@ - (void)stopPlaying { } - (void)pausePlaying { - [_fetchQueue cancelAllOperations]; [_displayLink stop]; } @@ -248,9 +205,9 @@ - (void)displayDidRefresh:(SDDisplayLink *)displayLink { } else if (self.playbackMode == SDAnimatedImagePlaybackModeBounce || self.playbackMode == SDAnimatedImagePlaybackModeReversedBounce) { if (currentFrameIndex == 0) { - self.shouldReverse = false; + self.shouldReverse = NO; } else if (currentFrameIndex == totalFrameCount - 1) { - self.shouldReverse = true; + self.shouldReverse = YES; } nextFrameIndex = self.shouldReverse ? (currentFrameIndex - 1) : (currentFrameIndex + 1); nextFrameIndex %= totalFrameCount; @@ -258,26 +215,11 @@ - (void)displayDidRefresh:(SDDisplayLink *)displayLink { // Check if we need to display new frame firstly - BOOL bufferFull = NO; if (self.needsDisplayWhenImageBecomesAvailable) { - UIImage *currentFrame; - SD_LOCK(_lock); - currentFrame = self.frameBuffer[@(currentFrameIndex)]; - SD_UNLOCK(_lock); + UIImage *currentFrame = [self.framePool frameAtIndex:currentFrameIndex]; // Update the current frame if (currentFrame) { - SD_LOCK(_lock); - // Remove the frame buffer if need - if (self.frameBuffer.count > self.maxBufferCount) { - self.frameBuffer[@(currentFrameIndex)] = nil; - } - // Check whether we can stop fetch - if (self.frameBuffer.count == totalFrameCount) { - bufferFull = YES; - } - SD_UNLOCK(_lock); - // Update the current frame immediately self.currentFrame = currentFrame; [self handleFrameChange]; @@ -299,8 +241,7 @@ - (void)displayDidRefresh:(SDDisplayLink *)displayLink { if (self.currentTime < currentDuration) { // Current frame timestamp not reached, prefetch frame in advance. [self prefetchFrameAtIndex:currentFrameIndex - nextIndex:nextFrameIndex - bufferFull:bufferFull]; + nextIndex:nextFrameIndex]; return; } @@ -336,43 +277,29 @@ - (void)displayDidRefresh:(SDDisplayLink *)displayLink { } [self prefetchFrameAtIndex:currentFrameIndex - nextIndex:nextFrameIndex - bufferFull:bufferFull]; + nextIndex:nextFrameIndex]; } // Check if we should prefetch next frame or current frame // When buffer miss, means the decode speed is slower than render speed, we fetch current miss frame // Or, most cases, the decode speed is faster than render speed, we fetch next frame - (void)prefetchFrameAtIndex:(NSUInteger)currentIndex - nextIndex:(NSUInteger)nextIndex - bufferFull:(BOOL)bufferFull { + nextIndex:(NSUInteger)nextIndex { NSUInteger fetchFrameIndex = currentIndex; UIImage *fetchFrame = nil; if (!self.bufferMiss) { fetchFrameIndex = nextIndex; - SD_LOCK(_lock); - fetchFrame = self.frameBuffer[@(nextIndex)]; - SD_UNLOCK(_lock); + fetchFrame = [self.framePool frameAtIndex:nextIndex]; } - if (!fetchFrame && !bufferFull && self.fetchQueue.operationCount == 0) { - // Prefetch next frame in background queue - id animatedProvider = self.animatedProvider; - @weakify(self); - NSOperation *operation = [NSBlockOperation blockOperationWithBlock:^{ - @strongify(self); - if (!self) { - return; - } - UIImage *frame = [animatedProvider animatedImageFrameAtIndex:fetchFrameIndex]; - - BOOL isAnimating = self.displayLink.isRunning; - if (isAnimating) { - SD_LOCK(self->_lock); - self.frameBuffer[@(fetchFrameIndex)] = frame; - SD_UNLOCK(self->_lock); - } - }]; - [self.fetchQueue addOperation:operation]; + BOOL bufferFull = NO; + if (self.framePool.currentFrameCount == self.totalFrameCount) { + bufferFull = YES; + } + if (!fetchFrame && !bufferFull) { + // Calculate max buffer size + [self calculateMaxBufferCountWithFrame:self.currentFrame]; + // Prefetch next frame + [self.framePool prefetchFrameAtIndex:fetchFrameIndex]; } } @@ -389,9 +316,17 @@ - (void)handleLoopChange { } #pragma mark - Util -- (void)calculateMaxBufferCount { - NSUInteger bytes = CGImageGetBytesPerRow(self.currentFrame.CGImage) * CGImageGetHeight(self.currentFrame.CGImage); - if (bytes == 0) bytes = 1024; +- (void)calculateMaxBufferCountWithFrame:(nonnull UIImage *)frame { + NSUInteger bytes = self.currentFrameBytes; + if (bytes == 0) { + bytes = CGImageGetBytesPerRow(frame.CGImage) * CGImageGetHeight(frame.CGImage); + if (bytes == 0) { + bytes = 1024; + } else { + // Cache since most animated image each frame bytes is the same + self.currentFrameBytes = bytes; + } + } NSUInteger max = 0; if (self.maxBufferSize > 0) { @@ -409,7 +344,7 @@ - (void)calculateMaxBufferCount { maxBufferCount = 1; } - self.maxBufferCount = maxBufferCount; + self.framePool.maxBufferCount = maxBufferCount; } + (NSString *)defaultRunLoopMode { diff --git a/Samples/Cordova/ExampleProject/platforms/ios/Pods/SDWebImage/SDWebImage/Core/SDCallbackQueue.h b/Samples/Cordova/ExampleProject/platforms/ios/Pods/SDWebImage/SDWebImage/Core/SDCallbackQueue.h index 6c13ea86..faa74eab 100644 --- a/Samples/Cordova/ExampleProject/platforms/ios/Pods/SDWebImage/SDWebImage/Core/SDCallbackQueue.h +++ b/Samples/Cordova/ExampleProject/platforms/ios/Pods/SDWebImage/SDWebImage/Core/SDCallbackQueue.h @@ -45,10 +45,10 @@ typedef NS_ENUM(NSUInteger, SDCallbackPolicy) { /// Submits a block for execution and returns after that block finishes executing. /// - Parameter block: The block that contains the work to perform. -- (void)sync:(nonnull NS_NOESCAPE dispatch_block_t)block; +- (void)sync:(nonnull dispatch_block_t)block; /// Schedules a block asynchronously for execution. /// - Parameter block: The block that contains the work to perform. -- (void)async:(nonnull NS_NOESCAPE dispatch_block_t)block; +- (void)async:(nonnull dispatch_block_t)block; @end diff --git a/Samples/Cordova/ExampleProject/platforms/ios/Pods/SDWebImage/SDWebImage/Core/SDCallbackQueue.m b/Samples/Cordova/ExampleProject/platforms/ios/Pods/SDWebImage/SDWebImage/Core/SDCallbackQueue.m index 6eab1378..d4759939 100644 --- a/Samples/Cordova/ExampleProject/platforms/ios/Pods/SDWebImage/SDWebImage/Core/SDCallbackQueue.m +++ b/Samples/Cordova/ExampleProject/platforms/ios/Pods/SDWebImage/SDWebImage/Core/SDCallbackQueue.m @@ -20,7 +20,9 @@ static void SDReleaseBlock(void *context) { CFRelease(context); } -static void inline SDSafeExecute(dispatch_queue_t _Nonnull queue, dispatch_block_t _Nonnull block, BOOL async) { +static void SDSafeExecute(SDCallbackQueue *callbackQueue, dispatch_block_t _Nonnull block, BOOL async) { + // Extendc gcd queue's life cycle + dispatch_queue_t queue = callbackQueue.queue; // Special handle for main queue label only (custom queue can have the same label) const char *label = dispatch_queue_get_label(queue); if (label && label == dispatch_queue_get_label(dispatch_get_main_queue())) { @@ -32,16 +34,18 @@ static void inline SDSafeExecute(dispatch_queue_t _Nonnull queue, dispatch_block } // Check specific to detect queue equal void *specific = dispatch_queue_get_specific(queue, SDCallbackQueueKey); - void *currentSpecific = dispatch_get_specific(SDCallbackQueueKey); - if (specific && currentSpecific && CFGetTypeID(specific) == CFUUIDGetTypeID() && CFGetTypeID(currentSpecific) == CFUUIDGetTypeID() && CFEqual(specific, currentSpecific)) { - block(); - } else { - if (async) { - dispatch_async(queue, block); - } else { - dispatch_sync(queue, block); + if (specific && CFGetTypeID(specific) == CFUUIDGetTypeID()) { + void *currentSpecific = dispatch_get_specific(SDCallbackQueueKey); + if (currentSpecific && CFGetTypeID(currentSpecific) == CFUUIDGetTypeID() && CFEqual(specific, currentSpecific)) { + block(); + return; } } + if (async) { + dispatch_async(queue, block); + } else { + dispatch_sync(queue, block); + } } @implementation SDCallbackQueue @@ -79,10 +83,10 @@ + (SDCallbackQueue *)globalQueue { return queue; } -- (void)sync:(nonnull NS_NOESCAPE dispatch_block_t)block { +- (void)sync:(nonnull dispatch_block_t)block { switch (self.policy) { case SDCallbackPolicySafeExecute: - SDSafeExecute(self.queue, block, NO); + SDSafeExecute(self, block, NO); break; case SDCallbackPolicyDispatch: dispatch_sync(self.queue, block); @@ -93,10 +97,10 @@ - (void)sync:(nonnull NS_NOESCAPE dispatch_block_t)block { } } -- (void)async:(nonnull NS_NOESCAPE dispatch_block_t)block { +- (void)async:(nonnull dispatch_block_t)block { switch (self.policy) { case SDCallbackPolicySafeExecute: - SDSafeExecute(self.queue, block, YES); + SDSafeExecute(self, block, YES); break; case SDCallbackPolicyDispatch: dispatch_async(self.queue, block); diff --git a/Samples/Cordova/ExampleProject/platforms/ios/Pods/SDWebImage/SDWebImage/Core/SDDiskCache.m b/Samples/Cordova/ExampleProject/platforms/ios/Pods/SDWebImage/SDWebImage/Core/SDDiskCache.m index 2cdb766f..6e9dfaab 100644 --- a/Samples/Cordova/ExampleProject/platforms/ios/Pods/SDWebImage/SDWebImage/Core/SDDiskCache.m +++ b/Samples/Cordova/ExampleProject/platforms/ios/Pods/SDWebImage/SDWebImage/Core/SDDiskCache.m @@ -43,6 +43,8 @@ - (void)commonInit { } else { self.fileManager = [NSFileManager new]; } + + [self createDirectory]; } - (BOOL)containsDataForKey:(NSString *)key { @@ -80,9 +82,6 @@ - (NSData *)dataForKey:(NSString *)key { - (void)setData:(NSData *)data forKey:(NSString *)key { NSParameterAssert(data); NSParameterAssert(key); - if (![self.fileManager fileExistsAtPath:self.diskCachePath]) { - [self.fileManager createDirectoryAtPath:self.diskCachePath withIntermediateDirectories:YES attributes:nil error:NULL]; - } // get cache Path for image key NSString *cachePathForKey = [self cachePathForKey:key]; @@ -90,12 +89,6 @@ - (void)setData:(NSData *)data forKey:(NSString *)key { NSURL *fileURL = [NSURL fileURLWithPath:cachePathForKey isDirectory:NO]; [data writeToURL:fileURL options:self.config.diskCacheWritingOptions error:nil]; - - // disable iCloud backup - if (self.config.shouldDisableiCloud) { - // ignore iCloud backup resource value error - [fileURL setResourceValue:@YES forKey:NSURLIsExcludedFromBackupKey error:nil]; - } } - (NSData *)extendedDataForKey:(NSString *)key { @@ -131,10 +124,20 @@ - (void)removeDataForKey:(NSString *)key { - (void)removeAllData { [self.fileManager removeItemAtPath:self.diskCachePath error:nil]; - [self.fileManager createDirectoryAtPath:self.diskCachePath - withIntermediateDirectories:YES - attributes:nil - error:NULL]; + [self createDirectory]; +} + +- (void)createDirectory { + [self.fileManager createDirectoryAtPath:self.diskCachePath + withIntermediateDirectories:YES + attributes:nil + error:NULL]; + + // disable iCloud backup + if (self.config.shouldDisableiCloud) { + // ignore iCloud backup resource value error + [[NSURL fileURLWithPath:self.diskCachePath isDirectory:YES] setResourceValue:@YES forKey:NSURLIsExcludedFromBackupKey error:nil]; + } } - (void)removeExpiredData { @@ -285,6 +288,11 @@ - (void)moveCacheDirectoryFromPath:(nonnull NSString *)srcPath toPath:(nonnull N } // New directory does not exist, rename directory [self.fileManager moveItemAtPath:srcPath toPath:dstPath error:nil]; + // disable iCloud backup + if (self.config.shouldDisableiCloud) { + // ignore iCloud backup resource value error + [[NSURL fileURLWithPath:dstPath isDirectory:YES] setResourceValue:@YES forKey:NSURLIsExcludedFromBackupKey error:nil]; + } } else { // New directory exist, merge the files NSDirectoryEnumerator *dirEnumerator = [self.fileManager enumeratorAtPath:srcPath]; diff --git a/Samples/Cordova/ExampleProject/platforms/ios/Pods/SDWebImage/SDWebImage/Core/SDGraphicsImageRenderer.h b/Samples/Cordova/ExampleProject/platforms/ios/Pods/SDWebImage/SDWebImage/Core/SDGraphicsImageRenderer.h index 900acd76..7b185fef 100644 --- a/Samples/Cordova/ExampleProject/platforms/ios/Pods/SDWebImage/SDWebImage/Core/SDGraphicsImageRenderer.h +++ b/Samples/Cordova/ExampleProject/platforms/ios/Pods/SDWebImage/SDWebImage/Core/SDGraphicsImageRenderer.h @@ -17,11 +17,17 @@ For others (macOS/watchOS or iOS/tvOS 10-), these method use the `SDImageGraphics.h` to implements the same behavior (but without dynamic bitmap support) */ +/// A closure for drawing an image. typedef void (^SDGraphicsImageDrawingActions)(CGContextRef _Nonnull context); +/// Constants that specify the color range of the image renderer context. typedef NS_ENUM(NSInteger, SDGraphicsImageRendererFormatRange) { + /// The image renderer context doesn’t specify a color range. SDGraphicsImageRendererFormatRangeUnspecified = -1, + /// The system automatically chooses the image renderer context’s pixel format according to the color range of its content. SDGraphicsImageRendererFormatRangeAutomatic = 0, + /// The image renderer context supports wide color. SDGraphicsImageRendererFormatRangeExtended, + /// The image renderer context doesn’t support extended colors. SDGraphicsImageRendererFormatRangeStandard }; diff --git a/Samples/Cordova/ExampleProject/platforms/ios/Pods/SDWebImage/SDWebImage/Core/SDImageCache.h b/Samples/Cordova/ExampleProject/platforms/ios/Pods/SDWebImage/SDWebImage/Core/SDImageCache.h index 14926dd2..0289b920 100644 --- a/Samples/Cordova/ExampleProject/platforms/ios/Pods/SDWebImage/SDWebImage/Core/SDImageCache.h +++ b/Samples/Cordova/ExampleProject/platforms/ios/Pods/SDWebImage/SDWebImage/Core/SDImageCache.h @@ -37,8 +37,10 @@ typedef NS_OPTIONS(NSUInteger, SDImageCacheOptions) { /** * By default, we will decode the image in the background during cache query and download from the network. This can help to improve performance because when rendering image on the screen, it need to be firstly decoded. But this happen on the main queue by Core Animation. * However, this process may increase the memory usage as well. If you are experiencing a issue due to excessive memory consumption, This flag can prevent decode the image. + * @note 5.14.0 introduce `SDImageCoderDecodeUseLazyDecoding`, use that for better control from codec, instead of post-processing. Which acts the similar like this option but works for SDAnimatedImage as well (this one does not) + * @deprecated Deprecated in v5.17.0, if you don't want force-decode, pass [.imageForceDecodePolicy] = [SDImageForceDecodePolicy.never] in context option */ - SDImageCacheAvoidDecodeImage = 1 << 4, + SDImageCacheAvoidDecodeImage API_DEPRECATED("Use SDWebImageContextImageForceDecodePolicy instead", macos(10.10, 10.10), ios(8.0, 8.0), tvos(9.0, 9.0), watchos(2.0, 2.0)) = 1 << 4, /** * By default, we decode the animated image. This flag can force decode the first frame only and produce the static image. */ diff --git a/Samples/Cordova/ExampleProject/platforms/ios/Pods/SDWebImage/SDWebImage/Core/SDImageCache.m b/Samples/Cordova/ExampleProject/platforms/ios/Pods/SDWebImage/SDWebImage/Core/SDImageCache.m index a911b7fe..da393b85 100644 --- a/Samples/Cordova/ExampleProject/platforms/ios/Pods/SDWebImage/SDWebImage/Core/SDImageCache.m +++ b/Samples/Cordova/ExampleProject/platforms/ios/Pods/SDWebImage/SDWebImage/Core/SDImageCache.m @@ -63,7 +63,7 @@ @interface SDImageCache () @property (nonatomic, strong, readwrite, nonnull) id diskCache; @property (nonatomic, copy, readwrite, nonnull) SDImageCacheConfig *config; @property (nonatomic, copy, readwrite, nonnull) NSString *diskCachePath; -@property (nonatomic, strong, nullable) dispatch_queue_t ioQueue; +@property (nonatomic, strong, nonnull) dispatch_queue_t ioQueue; @end @@ -118,7 +118,7 @@ - (nonnull instancetype)initWithNamespace:(nonnull NSString *)ns // Create IO queue dispatch_queue_attr_t ioQueueAttributes = _config.ioQueueAttributes; - _ioQueue = dispatch_queue_create("com.hackemist.SDImageCache", ioQueueAttributes); + _ioQueue = dispatch_queue_create("com.hackemist.SDImageCache.ioQueue", ioQueueAttributes); NSAssert(_ioQueue, @"The IO queue should not be nil. Your configured `ioQueueAttributes` may be wrong"); // Init the memory cache @@ -262,7 +262,7 @@ - (void)storeImage:(nullable UIImage *)image SDImageFormat format = image.sd_imageFormat; if (format == SDImageFormatUndefined) { // If image is animated, use GIF (APNG may be better, but has bugs before macOS 10.14) - if (image.sd_isAnimated) { + if (image.sd_imageFrameCount > 1) { format = SDImageFormatGIF; } else { // If we do not have any data to detect image format, check whether it contains alpha channel to use PNG or JPEG format @@ -419,6 +419,9 @@ - (nullable UIImage *)imageFromDiskCacheForKey:(nullable NSString *)key { } - (nullable UIImage *)imageFromDiskCacheForKey:(nullable NSString *)key options:(SDImageCacheOptions)options context:(nullable SDWebImageContext *)context { + if (!key) { + return nil; + } NSData *data = [self diskImageDataForKey:key]; UIImage *diskImage = [self diskImageForKey:key data:data options:options context:context]; @@ -458,7 +461,7 @@ - (nullable UIImage *)imageFromCacheForKey:(nullable NSString *)key options:(SDI if (image) { if (options & SDImageCacheDecodeFirstFrameOnly) { // Ensure static image - if (image.sd_isAnimated) { + if (image.sd_imageFrameCount > 1) { #if SD_MAC image = [[NSImage alloc] initWithCGImage:image.CGImage scale:image.scale orientation:kCGImagePropertyOrientationUp]; #else @@ -507,11 +510,10 @@ - (nullable NSData *)diskImageDataBySearchingAllPathsForKey:(nullable NSString * } - (nullable UIImage *)diskImageForKey:(nullable NSString *)key { + if (!key) { + return nil; + } NSData *data = [self diskImageDataForKey:key]; - return [self diskImageForKey:key data:data]; -} - -- (nullable UIImage *)diskImageForKey:(nullable NSString *)key data:(nullable NSData *)data { return [self diskImageForKey:key data:data options:0 context:nil]; } @@ -525,7 +527,7 @@ - (nullable UIImage *)diskImageForKey:(nullable NSString *)key data:(nullable NS } - (void)_unarchiveObjectWithImage:(UIImage *)image forKey:(NSString *)key { - if (!image) { + if (!image || !key) { return; } // Check extended data @@ -591,7 +593,7 @@ - (nullable SDImageCacheToken *)queryCacheOperationForKey:(nullable NSString *)k if (image) { if (options & SDImageCacheDecodeFirstFrameOnly) { // Ensure static image - if (image.sd_isAnimated) { + if (image.sd_imageFrameCount > 1) { #if SD_MAC image = [[NSImage alloc] initWithCGImage:image.CGImage scale:image.scale orientation:kCGImagePropertyOrientationUp]; #else @@ -666,11 +668,17 @@ - (nullable SDImageCacheToken *)queryCacheOperationForKey:(nullable NSString *)k // Query full size cache key which generate a thumbnail, should not write back to full size memory cache shouldCacheToMomery = NO; } + // Special case: If user query image in list for the same URL, to avoid decode and write **same** image object into disk cache multiple times, we query and check memory cache here again. + if (shouldCacheToMomery && self.config.shouldCacheImagesInMemory) { + diskImage = [self.memoryCache objectForKey:key]; + } // decode image data only if in-memory cache missed - diskImage = [self diskImageForKey:key data:diskData options:options context:context]; - if (shouldCacheToMomery && diskImage && self.config.shouldCacheImagesInMemory) { - NSUInteger cost = diskImage.sd_memoryCost; - [self.memoryCache setObject:diskImage forKey:key cost:cost]; + if (!diskImage) { + diskImage = [self diskImageForKey:key data:diskData options:options context:context]; + if (shouldCacheToMomery && diskImage && self.config.shouldCacheImagesInMemory) { + NSUInteger cost = diskImage.sd_memoryCost; + [self.memoryCache setObject:diskImage forKey:key cost:cost]; + } } } return diskImage; @@ -725,7 +733,7 @@ - (void)removeImageForKey:(nullable NSString *)key fromDisk:(BOOL)fromDisk withC } - (void)removeImageForKey:(nullable NSString *)key fromMemory:(BOOL)fromMemory fromDisk:(BOOL)fromDisk withCompletion:(nullable SDWebImageNoParamsBlock)completion { - if (key == nil) { + if (!key) { return; } @@ -875,6 +883,8 @@ - (void)calculateSizeWithCompletionBlock:(nullable SDImageCacheCalculateSizeBloc } #pragma mark - Helper +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" + (SDWebImageOptions)imageOptionsFromCacheOptions:(SDImageCacheOptions)cacheOptions { SDWebImageOptions options = 0; if (cacheOptions & SDImageCacheScaleDownLargeImages) options |= SDWebImageScaleDownLargeImages; @@ -885,6 +895,7 @@ + (SDWebImageOptions)imageOptionsFromCacheOptions:(SDImageCacheOptions)cacheOpti return options; } +#pragma clang diagnostic pop @end @@ -896,6 +907,8 @@ @implementation SDImageCache (SDImageCache) return [self queryImageForKey:key options:options context:context cacheType:SDImageCacheTypeAll completion:completionBlock]; } +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" - (id)queryImageForKey:(NSString *)key options:(SDWebImageOptions)options context:(nullable SDWebImageContext *)context cacheType:(SDImageCacheType)cacheType completion:(nullable SDImageCacheQueryCompletionBlock)completionBlock { SDImageCacheOptions cacheOptions = 0; if (options & SDWebImageQueryMemoryData) cacheOptions |= SDImageCacheQueryMemoryData; @@ -909,6 +922,7 @@ @implementation SDImageCache (SDImageCache) return [self queryCacheOperationForKey:key options:cacheOptions context:context cacheType:cacheType done:completionBlock]; } +#pragma clang diagnostic pop - (void)storeImage:(UIImage *)image imageData:(NSData *)imageData forKey:(nullable NSString *)key cacheType:(SDImageCacheType)cacheType completion:(nullable SDWebImageNoParamsBlock)completionBlock { [self storeImage:image imageData:imageData forKey:key options:0 context:nil cacheType:cacheType completion:completionBlock]; diff --git a/Samples/Cordova/ExampleProject/platforms/ios/Pods/SDWebImage/SDWebImage/Core/SDImageCacheDefine.m b/Samples/Cordova/ExampleProject/platforms/ios/Pods/SDWebImage/SDWebImage/Core/SDImageCacheDefine.m index 8322d76d..56081e89 100644 --- a/Samples/Cordova/ExampleProject/platforms/ios/Pods/SDWebImage/SDWebImage/Core/SDImageCacheDefine.m +++ b/Samples/Cordova/ExampleProject/platforms/ios/Pods/SDWebImage/SDWebImage/Core/SDImageCacheDefine.m @@ -18,14 +18,14 @@ SDImageCoderOptions * _Nonnull SDGetDecodeOptionsFromContext(SDWebImageContext * _Nullable context, SDWebImageOptions options, NSString * _Nonnull cacheKey) { BOOL decodeFirstFrame = SD_OPTIONS_CONTAINS(options, SDWebImageDecodeFirstFrameOnly); NSNumber *scaleValue = context[SDWebImageContextImageScaleFactor]; - CGFloat scale = scaleValue.doubleValue >= 1 ? scaleValue.doubleValue : SDImageScaleFactorForKey(cacheKey); + CGFloat scale = scaleValue.doubleValue >= 1 ? scaleValue.doubleValue : SDImageScaleFactorForKey(cacheKey); // Use cache key to detect scale NSNumber *preserveAspectRatioValue = context[SDWebImageContextImagePreserveAspectRatio]; NSValue *thumbnailSizeValue; BOOL shouldScaleDown = SD_OPTIONS_CONTAINS(options, SDWebImageScaleDownLargeImages); - if (shouldScaleDown) { - CGFloat thumbnailPixels = SDImageCoderHelper.defaultScaleDownLimitBytes / 4; - CGFloat dimension = ceil(sqrt(thumbnailPixels)); - thumbnailSizeValue = @(CGSizeMake(dimension, dimension)); + NSNumber *scaleDownLimitBytesValue = context[SDWebImageContextImageScaleDownLimitBytes]; + if (!scaleDownLimitBytesValue && shouldScaleDown) { + // Use the default limit bytes + scaleDownLimitBytesValue = @(SDImageCoderHelper.defaultScaleDownLimitBytes); } if (context[SDWebImageContextImageThumbnailPixelSize]) { thumbnailSizeValue = context[SDWebImageContextImageThumbnailPixelSize]; @@ -56,6 +56,7 @@ mutableCoderOptions[SDImageCoderDecodeThumbnailPixelSize] = thumbnailSizeValue; mutableCoderOptions[SDImageCoderDecodeTypeIdentifierHint] = typeIdentifierHint; mutableCoderOptions[SDImageCoderDecodeFileExtensionHint] = fileExtensionHint; + mutableCoderOptions[SDImageCoderDecodeScaleDownLimitBytes] = scaleDownLimitBytesValue; return [mutableCoderOptions copy]; } @@ -70,6 +71,7 @@ void SDSetDecodeOptionsToContext(SDWebImageMutableContext * _Nonnull mutableCont mutableContext[SDWebImageContextImageScaleFactor] = decodeOptions[SDImageCoderDecodeScaleFactor]; mutableContext[SDWebImageContextImagePreserveAspectRatio] = decodeOptions[SDImageCoderDecodePreserveAspectRatio]; mutableContext[SDWebImageContextImageThumbnailPixelSize] = decodeOptions[SDImageCoderDecodeThumbnailPixelSize]; + mutableContext[SDWebImageContextImageScaleDownLimitBytes] = decodeOptions[SDImageCoderDecodeScaleDownLimitBytes]; NSString *typeIdentifierHint = decodeOptions[SDImageCoderDecodeTypeIdentifierHint]; if (!typeIdentifierHint) { @@ -121,15 +123,19 @@ void SDSetDecodeOptionsToContext(SDWebImageMutableContext * _Nonnull mutableCont image = [imageCoder decodedImageWithData:imageData options:coderOptions]; } if (image) { - BOOL shouldDecode = !SD_OPTIONS_CONTAINS(options, SDWebImageAvoidDecodeImage); - BOOL lazyDecode = [coderOptions[SDImageCoderDecodeUseLazyDecoding] boolValue]; - if (lazyDecode) { - // lazyDecode = NO means we should not forceDecode, highest priority - shouldDecode = NO; + SDImageForceDecodePolicy policy = SDImageForceDecodePolicyAutomatic; + NSNumber *polivyValue = context[SDWebImageContextImageForceDecodePolicy]; + if (polivyValue != nil) { + policy = polivyValue.unsignedIntegerValue; } - if (shouldDecode) { - image = [SDImageCoderHelper decodedImageWithImage:image]; + // TODO: Deprecated, remove in SD 6.0... +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" + if (SD_OPTIONS_CONTAINS(options, SDWebImageAvoidDecodeImage)) { + policy = SDImageForceDecodePolicyNever; } +#pragma clang diagnostic pop + image = [SDImageCoderHelper decodedImageWithImage:image policy:policy]; // assign the decode options, to let manager check whether to re-decode if needed image.sd_decodeOptions = coderOptions; } diff --git a/Samples/Cordova/ExampleProject/platforms/ios/Pods/SDWebImage/SDWebImage/Core/SDImageCoder.h b/Samples/Cordova/ExampleProject/platforms/ios/Pods/SDWebImage/SDWebImage/Core/SDImageCoder.h index 17b7e546..c6501eae 100644 --- a/Samples/Cordova/ExampleProject/platforms/ios/Pods/SDWebImage/SDWebImage/Core/SDImageCoder.h +++ b/Samples/Cordova/ExampleProject/platforms/ios/Pods/SDWebImage/SDWebImage/Core/SDImageCoder.h @@ -75,6 +75,19 @@ FOUNDATION_EXPORT SDImageCoderOption _Nonnull const SDImageCoderDecodeTypeIdenti */ FOUNDATION_EXPORT SDImageCoderOption _Nonnull const SDImageCoderDecodeUseLazyDecoding; +/** + A NSUInteger value to provide the limit bytes during decoding. This can help to avoid OOM on large frame count animated image or large pixel static image when you don't know how much RAM it occupied before decoding + The decoder will do these logic based on limit bytes: + 1. Get the total frame count (static image means 1) + 2. Calculate the `framePixelSize` width/height to `sqrt(limitBytes / frameCount / bytesPerPixel)`, keeping aspect ratio (at least 1x1) + 3. If the `framePixelSize < originalImagePixelSize`, then do thumbnail decoding (see `SDImageCoderDecodeThumbnailPixelSize`) use the `framePixelSize` and `preseveAspectRatio = YES` + 4. Else, use the full pixel decoding (small than limit bytes) + 5. Whatever result, this does not effect the animated/static behavior of image. So even if you set `limitBytes = 1 && frameCount = 100`, we will stll create animated image with each frame `1x1` pixel size. + @note You can use the logic from `+[SDImageCoder scaledSizeWithImageSize:limitBytes:bytesPerPixel:frameCount:]` + @note This option has higher priority than `.decodeThumbnailPixelSize` + */ +FOUNDATION_EXPORT SDImageCoderOption _Nonnull const SDImageCoderDecodeScaleDownLimitBytes; + // These options are for image encoding /** A Boolean value indicating whether to encode the first frame only for animated image during encoding. (NSNumber). If not provide, encode animated image if need. diff --git a/Samples/Cordova/ExampleProject/platforms/ios/Pods/SDWebImage/SDWebImage/Core/SDImageCoder.m b/Samples/Cordova/ExampleProject/platforms/ios/Pods/SDWebImage/SDWebImage/Core/SDImageCoder.m index 4f98f273..754c4948 100644 --- a/Samples/Cordova/ExampleProject/platforms/ios/Pods/SDWebImage/SDWebImage/Core/SDImageCoder.m +++ b/Samples/Cordova/ExampleProject/platforms/ios/Pods/SDWebImage/SDWebImage/Core/SDImageCoder.m @@ -15,6 +15,7 @@ SDImageCoderOption const SDImageCoderDecodeFileExtensionHint = @"decodeFileExtensionHint"; SDImageCoderOption const SDImageCoderDecodeTypeIdentifierHint = @"decodeTypeIdentifierHint"; SDImageCoderOption const SDImageCoderDecodeUseLazyDecoding = @"decodeUseLazyDecoding"; +SDImageCoderOption const SDImageCoderDecodeScaleDownLimitBytes = @"decodeScaleDownLimitBytes"; SDImageCoderOption const SDImageCoderEncodeFirstFrameOnly = @"encodeFirstFrameOnly"; SDImageCoderOption const SDImageCoderEncodeCompressionQuality = @"encodeCompressionQuality"; diff --git a/Samples/Cordova/ExampleProject/platforms/ios/Pods/SDWebImage/SDWebImage/Core/SDImageCoderHelper.h b/Samples/Cordova/ExampleProject/platforms/ios/Pods/SDWebImage/SDWebImage/Core/SDImageCoderHelper.h index 8502b391..e1074c7d 100644 --- a/Samples/Cordova/ExampleProject/platforms/ios/Pods/SDWebImage/SDWebImage/Core/SDImageCoderHelper.h +++ b/Samples/Cordova/ExampleProject/platforms/ios/Pods/SDWebImage/SDWebImage/Core/SDImageCoderHelper.h @@ -10,6 +10,7 @@ #import "SDWebImageCompat.h" #import "SDImageFrame.h" +/// The options controls how we force pre-draw the image (to avoid lazy-decoding). Which need OS's framework compatibility typedef NS_ENUM(NSUInteger, SDImageCoderDecodeSolution) { /// automatically choose the solution based on image format, hardware, OS version. This keep balance for compatibility and performance. Default after SDWebImage 5.13.0 SDImageCoderDecodeSolutionAutomatic, @@ -19,6 +20,35 @@ typedef NS_ENUM(NSUInteger, SDImageCoderDecodeSolution) { SDImageCoderDecodeSolutionUIKit }; +/// The policy to force-decode the origin CGImage (produced by Image Coder Plugin) +/// Some CGImage may be lazy, or not lazy, but need extra copy to render on screen +/// The force-decode step help to `pre-process` to get the best suitable CGImage to render, which can increase frame rate +/// The downside is that force-decode may consume RAM and CPU, and may loss the `lazy` support (lazy CGImage can be purged when memory warning, and re-created if need), see more: `SDImageCoderDecodeUseLazyDecoding` +typedef NS_ENUM(NSUInteger, SDImageForceDecodePolicy) { + /// Based on input CGImage's colorspace, alignment, bitmapinfo, if it may trigger `CA::copy_image` extra copy, we will force-decode, else don't + SDImageForceDecodePolicyAutomatic, + /// Never force decode input CGImage + SDImageForceDecodePolicyNever, + /// Always force decode input CGImage (only once) + SDImageForceDecodePolicyAlways +}; + +/// Byte alignment the bytes size with alignment +/// - Parameters: +/// - size: The bytes size +/// - alignment: The alignment, in bytes +static inline size_t SDByteAlign(size_t size, size_t alignment) { + return ((size + (alignment - 1)) / alignment) * alignment; +} + +/// The pixel format about the information to call `CGImageCreate` suitable for current hardware rendering +typedef struct SDImagePixelFormat { + /// Typically is pre-multiplied RGBA8888 for alpha image, RGBX8888 for non-alpha image. + CGBitmapInfo bitmapInfo; + /// Typically is 32, the 8 pixels bytesPerRow. + size_t alignment; +} SDImagePixelFormat; + /** Provide some common helper methods for building the image decoder/encoder. */ @@ -44,16 +74,31 @@ typedef NS_ENUM(NSUInteger, SDImageCoderDecodeSolution) { */ + (NSArray * _Nullable)framesFromAnimatedImage:(UIImage * _Nullable)animatedImage NS_SWIFT_NAME(frames(from:)); +#pragma mark - Preferred Rendering Format +/// For coders who use `CGImageCreate`, use the information below to create an effient CGImage which can be render on GPU without Core Animation's extra copy (`CA::Render::copy_image`), which can be debugged using `Color Copied Image` in Xcode Instruments +/// `CGImageCreate`'s `bytesPerRow`, `space`, `bitmapInfo` params should use the information below. /** Return the shared device-dependent RGB color space. This follows The Get Rule. - On iOS, it's created with deviceRGB (if available, use sRGB). - On macOS, it's from the screen colorspace (if failed, use deviceRGB) Because it's shared, you should not retain or release this object. + Typically is sRGB for iOS, screen color space (like Color LCD) for macOS. @return The device-dependent RGB color space */ + (CGColorSpaceRef _Nonnull)colorSpaceGetDeviceRGB CF_RETURNS_NOT_RETAINED; +/** + Tthis returns the pixel format **Preferred from current hardward && OS using runtime detection** + @param containsAlpha Whether the image to render contains alpha channel + */ ++ (SDImagePixelFormat)preferredPixelFormat:(BOOL)containsAlpha; + +/** + Check whether CGImage is hardware supported to rendering on screen, without the trigger of `CA::Render::copy_image` + You can debug the copied image by using Xcode's `Color Copied Image`, the copied image will turn Cyan and occupy double RAM for bitmap buffer. + Typically, when the CGImage's using the method above (`colorspace` / `alignment` / `bitmapInfo`) can render withtout the copy. + */ ++ (BOOL)CGImageIsHardwareSupported:(_Nonnull CGImageRef)cgImage; + /** Check whether CGImage contains alpha channel. @@ -103,23 +148,50 @@ typedef NS_ENUM(NSUInteger, SDImageCoderDecodeSolution) { */ + (CGSize)scaledSizeWithImageSize:(CGSize)imageSize scaleSize:(CGSize)scaleSize preserveAspectRatio:(BOOL)preserveAspectRatio shouldScaleUp:(BOOL)shouldScaleUp; +/// Calculate the limited image size with the bytes, when using `SDImageCoderDecodeScaleDownLimitBytes`. This preserve aspect ratio and never scale up +/// @param imageSize The image size (in pixel or point defined by caller) +/// @param limitBytes The limit bytes +/// @param bytesPerPixel The bytes per pixel +/// @param frameCount The image frame count, 0 means 1 frame as well ++ (CGSize)scaledSizeWithImageSize:(CGSize)imageSize limitBytes:(NSUInteger)limitBytes bytesPerPixel:(NSUInteger)bytesPerPixel frameCount:(NSUInteger)frameCount; /** Return the decoded image by the provided image. This one unlike `CGImageCreateDecoded:`, will not decode the image which contains alpha channel or animated image. On iOS 15+, this may use `UIImage.preparingForDisplay()` to use CMPhoto for better performance than the old solution. @param image The image to be decoded + @note This translate to `decodedImageWithImage:policy:` with automatic policy @return The decoded image */ + (UIImage * _Nullable)decodedImageWithImage:(UIImage * _Nullable)image; +/** + Return the decoded image by the provided image. This one unlike `CGImageCreateDecoded:`, will not decode the image which contains alpha channel or animated image. On iOS 15+, this may use `UIImage.preparingForDisplay()` to use CMPhoto for better performance than the old solution. + @param image The image to be decoded + @param policy The force decode policy to decode image, will effect the check whether input image need decode + @return The decoded image + */ ++ (UIImage * _Nullable)decodedImageWithImage:(UIImage * _Nullable)image policy:(SDImageForceDecodePolicy)policy; + /** Return the decoded and probably scaled down image by the provided image. If the image pixels bytes size large than the limit bytes, will try to scale down. Or just works as `decodedImageWithImage:`, never scale up. @warning You should not pass too small bytes, the suggestion value should be larger than 1MB. Even we use Tile Decoding to avoid OOM, however, small bytes will consume much more CPU time because we need to iterate more times to draw each tile. @param image The image to be decoded and scaled down @param bytes The limit bytes size. Provide 0 to use the build-in limit. + @note This translate to `decodedAndScaledDownImageWithImage:limitBytes:policy:` with automatic policy @return The decoded and probably scaled down image */ + (UIImage * _Nullable)decodedAndScaledDownImageWithImage:(UIImage * _Nullable)image limitBytes:(NSUInteger)bytes; +/** + Return the decoded and probably scaled down image by the provided image. If the image pixels bytes size large than the limit bytes, will try to scale down. Or just works as `decodedImageWithImage:`, never scale up. + @warning You should not pass too small bytes, the suggestion value should be larger than 1MB. Even we use Tile Decoding to avoid OOM, however, small bytes will consume much more CPU time because we need to iterate more times to draw each tile. + + @param image The image to be decoded and scaled down + @param bytes The limit bytes size. Provide 0 to use the build-in limit. + @param policy The force decode policy to decode image, will effect the check whether input image need decode + @return The decoded and probably scaled down image + */ ++ (UIImage * _Nullable)decodedAndScaledDownImageWithImage:(UIImage * _Nullable)image limitBytes:(NSUInteger)bytes policy:(SDImageForceDecodePolicy)policy; + /** Control the default force decode solution. Available solutions in `SDImageCoderDecodeSolution`. @note Defaults to `SDImageCoderDecodeSolutionAutomatic`, which prefers to use UIKit for JPEG/HEIF, and fallback on CoreGraphics. If you want control on your hand, set the other solution. diff --git a/Samples/Cordova/ExampleProject/platforms/ios/Pods/SDWebImage/SDWebImage/Core/SDImageCoderHelper.m b/Samples/Cordova/ExampleProject/platforms/ios/Pods/SDWebImage/SDWebImage/Core/SDImageCoderHelper.m index c2fa3bd4..6b9d650b 100644 --- a/Samples/Cordova/ExampleProject/platforms/ios/Pods/SDWebImage/SDWebImage/Core/SDImageCoderHelper.m +++ b/Samples/Cordova/ExampleProject/platforms/ios/Pods/SDWebImage/SDWebImage/Core/SDImageCoderHelper.m @@ -17,11 +17,10 @@ #import "SDInternalMacros.h" #import "SDGraphicsImageRenderer.h" #import "SDInternalMacros.h" +#import "SDDeviceHelper.h" #import -static inline size_t SDByteAlign(size_t size, size_t alignment) { - return ((size + (alignment - 1)) / alignment) * alignment; -} +#define kCGColorSpaceDeviceRGB CFSTR("kCGColorSpaceDeviceRGB") #if SD_UIKIT static inline UIImage *SDImageDecodeUIKit(UIImage *image) { @@ -72,6 +71,42 @@ static inline BOOL SDImageSupportsHardwareHEVCDecoder(void) { } #endif +static UIImage * _Nonnull SDImageGetAlphaDummyImage(void) { + static dispatch_once_t onceToken; + static UIImage *dummyImage; + dispatch_once(&onceToken, ^{ + SDGraphicsImageRendererFormat *format = [SDGraphicsImageRendererFormat preferredFormat]; + format.scale = 1; + format.opaque = NO; + CGSize size = CGSizeMake(1, 1); + SDGraphicsImageRenderer *renderer = [[SDGraphicsImageRenderer alloc] initWithSize:size format:format]; + dummyImage = [renderer imageWithActions:^(CGContextRef _Nonnull context) { + CGContextSetFillColorWithColor(context, UIColor.redColor.CGColor); + CGContextFillRect(context, CGRectMake(0, 0, size.width, size.height)); + }]; + NSCAssert(dummyImage, @"The sample alpha image (1x1 pixels) returns nil, OS bug ?"); + }); + return dummyImage; +} + +static UIImage * _Nonnull SDImageGetNonAlphaDummyImage(void) { + static dispatch_once_t onceToken; + static UIImage *dummyImage; + dispatch_once(&onceToken, ^{ + SDGraphicsImageRendererFormat *format = [SDGraphicsImageRendererFormat preferredFormat]; + format.scale = 1; + format.opaque = YES; + CGSize size = CGSizeMake(1, 1); + SDGraphicsImageRenderer *renderer = [[SDGraphicsImageRenderer alloc] initWithSize:size format:format]; + dummyImage = [renderer imageWithActions:^(CGContextRef _Nonnull context) { + CGContextSetFillColorWithColor(context, UIColor.redColor.CGColor); + CGContextFillRect(context, CGRectMake(0, 0, size.width, size.height)); + }]; + NSCAssert(dummyImage, @"The sample non-alpha image (1x1 pixels) returns nil, OS bug ?"); + }); + return dummyImage; +} + static SDImageCoderDecodeSolution kDefaultDecodeSolution = SDImageCoderDecodeSolutionAutomatic; static const size_t kBytesPerPixel = 4; @@ -258,11 +293,82 @@ + (CGColorSpaceRef)colorSpaceGetDeviceRGB { static CGColorSpaceRef colorSpace; static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ +#if SD_MAC + NSScreen *mainScreen = nil; + if (@available(macOS 10.12, *)) { + mainScreen = [NSScreen mainScreen]; + } else { + mainScreen = [NSScreen screens].firstObject; + } + colorSpace = mainScreen.colorSpace.CGColorSpace; +#else colorSpace = CGColorSpaceCreateWithName(kCGColorSpaceSRGB); +#endif }); return colorSpace; } ++ (SDImagePixelFormat)preferredPixelFormat:(BOOL)containsAlpha { + CGImageRef cgImage; + if (containsAlpha) { + cgImage = SDImageGetAlphaDummyImage().CGImage; + } else { + cgImage = SDImageGetNonAlphaDummyImage().CGImage; + } + CGBitmapInfo bitmapInfo = CGImageGetBitmapInfo(cgImage); + size_t bitsPerPixel = 8; + if (SD_OPTIONS_CONTAINS(bitmapInfo, kCGBitmapFloatComponents)) { + bitsPerPixel = 16; + } + size_t components = 4; // Hardcode now + // https://github.com/path/FastImageCache#byte-alignment + // A properly aligned bytes-per-row value must be a multiple of 8 pixels × bytes per pixel. + size_t alignment = (bitsPerPixel / 8) * components * 8; + SDImagePixelFormat pixelFormat = { + .bitmapInfo = bitmapInfo, + .alignment = alignment + }; + return pixelFormat; +} + ++ (BOOL)CGImageIsHardwareSupported:(CGImageRef)cgImage { + BOOL supported = YES; + // 1. Check byte alignment + size_t bytesPerRow = CGImageGetBytesPerRow(cgImage); + BOOL hasAlpha = [self CGImageContainsAlpha:cgImage]; + SDImagePixelFormat pixelFormat = [self preferredPixelFormat:hasAlpha]; + if (SDByteAlign(bytesPerRow, pixelFormat.alignment) == bytesPerRow) { + // byte aligned, OK + supported &= YES; + } else { + // not aligned + supported &= NO; + } + if (!supported) return supported; + + // 2. Check color space + CGColorSpaceRef colorSpace = CGImageGetColorSpace(cgImage); + CGColorSpaceRef perferredColorSpace = [self colorSpaceGetDeviceRGB]; + if (colorSpace == perferredColorSpace) { + return supported; + } else { + if (@available(iOS 10.0, tvOS 10.0, macOS 10.6, watchOS 3.0, *)) { + NSString *colorspaceName = (__bridge_transfer NSString *)CGColorSpaceCopyName(colorSpace); + // Seems sRGB/deviceRGB always supported, P3 not always + if ([colorspaceName isEqualToString:(__bridge NSString *)kCGColorSpaceDeviceRGB] + || [colorspaceName isEqualToString:(__bridge NSString *)kCGColorSpaceSRGB]) { + supported &= YES; + } else { + supported &= NO; + } + return supported; + } else { + // Fallback on earlier versions + return supported; + } + } +} + + (BOOL)CGImageContainsAlpha:(CGImageRef)cgImage { if (!cgImage) { return NO; @@ -307,16 +413,8 @@ + (CGImageRef)CGImageCreateDecoded:(CGImageRef)cgImage orientation:(CGImagePrope BOOL hasAlpha = [self CGImageContainsAlpha:cgImage]; // kCGImageAlphaNone is not supported in CGBitmapContextCreate. // Check #3330 for more detail about why this bitmap is choosen. - CGBitmapInfo bitmapInfo; - if (hasAlpha) { - // iPhone GPU prefer to use BGRA8888, see: https://forums.raywenderlich.com/t/why-mtlpixelformat-bgra8unorm/53489 - // BGRA8888 - bitmapInfo = kCGBitmapByteOrder32Host | kCGImageAlphaPremultipliedFirst; - } else { - // BGR888 previously works on iOS 8~iOS 14, however, iOS 15+ will result a black image. FB9958017 - // RGB888 - bitmapInfo = kCGBitmapByteOrderDefault | kCGImageAlphaNoneSkipLast; - } + // From v5.17.0, use runtime detection of bitmap info instead of hardcode. + CGBitmapInfo bitmapInfo = [SDImageCoderHelper preferredPixelFormat:hasAlpha].bitmapInfo; CGContextRef context = CGBitmapContextCreate(NULL, newWidth, newHeight, 8, 0, [self colorSpaceGetDeviceRGB], bitmapInfo); if (!context) { return NULL; @@ -351,16 +449,8 @@ + (CGImageRef)CGImageCreateScaled:(CGImageRef)cgImage size:(CGSize)size { BOOL hasAlpha = [self CGImageContainsAlpha:cgImage]; // kCGImageAlphaNone is not supported in CGBitmapContextCreate. // Check #3330 for more detail about why this bitmap is choosen. - CGBitmapInfo bitmapInfo; - if (hasAlpha) { - // iPhone GPU prefer to use BGRA8888, see: https://forums.raywenderlich.com/t/why-mtlpixelformat-bgra8unorm/53489 - // BGRA8888 - bitmapInfo = kCGBitmapByteOrder32Host | kCGImageAlphaPremultipliedFirst; - } else { - // BGR888 previously works on iOS 8~iOS 14, however, iOS 15+ will result a black image. FB9958017 - // RGB888 - bitmapInfo = kCGBitmapByteOrderDefault | kCGImageAlphaNoneSkipLast; - } + // From v5.17.0, use runtime detection of bitmap info instead of hardcode. + CGBitmapInfo bitmapInfo = [SDImageCoderHelper preferredPixelFormat:hasAlpha].bitmapInfo; vImage_CGImageFormat format = (vImage_CGImageFormat) { .bitsPerComponent = 8, .bitsPerPixel = 32, @@ -428,8 +518,25 @@ + (CGSize)scaledSizeWithImageSize:(CGSize)imageSize scaleSize:(CGSize)scaleSize return CGSizeMake(resultWidth, resultHeight); } ++ (CGSize)scaledSizeWithImageSize:(CGSize)imageSize limitBytes:(NSUInteger)limitBytes bytesPerPixel:(NSUInteger)bytesPerPixel frameCount:(NSUInteger)frameCount { + if (CGSizeEqualToSize(imageSize, CGSizeZero)) return CGSizeMake(1, 1); + NSUInteger totalFramePixelSize = limitBytes / bytesPerPixel / (frameCount ?: 1); + CGFloat ratio = imageSize.height / imageSize.width; + CGFloat width = sqrt(totalFramePixelSize / ratio); + CGFloat height = width * ratio; + width = MAX(1, floor(width)); + height = MAX(1, floor(height)); + CGSize size = CGSizeMake(width, height); + + return size; +} + + (UIImage *)decodedImageWithImage:(UIImage *)image { - if (![self shouldDecodeImage:image]) { + return [self decodedImageWithImage:image policy:SDImageForceDecodePolicyAutomatic]; +} + ++ (UIImage *)decodedImageWithImage:(UIImage *)image policy:(SDImageForceDecodePolicy)policy { + if (![self shouldDecodeImage:image policy:policy]) { return image; } @@ -486,7 +593,11 @@ + (UIImage *)decodedImageWithImage:(UIImage *)image { } + (UIImage *)decodedAndScaledDownImageWithImage:(UIImage *)image limitBytes:(NSUInteger)bytes { - if (![self shouldDecodeImage:image]) { + return [self decodedAndScaledDownImageWithImage:image limitBytes:bytes policy:SDImageForceDecodePolicyAutomatic]; +} + ++ (UIImage *)decodedAndScaledDownImageWithImage:(UIImage *)image limitBytes:(NSUInteger)bytes policy:(SDImageForceDecodePolicy)policy { + if (![self shouldDecodeImage:image policy:policy]) { return image; } @@ -550,16 +661,8 @@ + (UIImage *)decodedAndScaledDownImageWithImage:(UIImage *)image limitBytes:(NSU // kCGImageAlphaNone is not supported in CGBitmapContextCreate. // Check #3330 for more detail about why this bitmap is choosen. - CGBitmapInfo bitmapInfo; - if (hasAlpha) { - // iPhone GPU prefer to use BGRA8888, see: https://forums.raywenderlich.com/t/why-mtlpixelformat-bgra8unorm/53489 - // BGRA8888 - bitmapInfo = kCGBitmapByteOrder32Host | kCGImageAlphaPremultipliedFirst; - } else { - // BGR888 previously works on iOS 8~iOS 14, however, iOS 15+ will result a black image. FB9958017 - // RGB888 - bitmapInfo = kCGBitmapByteOrderDefault | kCGImageAlphaNoneSkipLast; - } + // From v5.17.0, use runtime detection of bitmap info instead of hardcode. + CGBitmapInfo bitmapInfo = [SDImageCoderHelper preferredPixelFormat:hasAlpha].bitmapInfo; CGContextRef destContext = CGBitmapContextCreate(NULL, destResolution.width, destResolution.height, @@ -733,11 +836,15 @@ + (CGImagePropertyOrientation)exifOrientationFromImageOrientation:(UIImageOrient #endif #pragma mark - Helper Function -+ (BOOL)shouldDecodeImage:(nullable UIImage *)image { ++ (BOOL)shouldDecodeImage:(nullable UIImage *)image policy:(SDImageForceDecodePolicy)policy { // Prevent "CGBitmapContextCreateImage: invalid context 0x0" error if (image == nil) { return NO; } + // Check policy (never) + if (policy == SDImageForceDecodePolicyNever) { + return NO; + } // Avoid extra decode if (image.sd_isDecoded) { return NO; @@ -750,7 +857,25 @@ + (BOOL)shouldDecodeImage:(nullable UIImage *)image { if (image.sd_isVector) { return NO; } - + // Check policy (always) + if (policy == SDImageForceDecodePolicyAlways) { + return YES; + } else { + // Check policy (automatic) + CGImageRef cgImage = image.CGImage; + if (cgImage) { + CFStringRef uttype = CGImageGetUTType(cgImage); + if (uttype) { + // Only ImageIO can set `com.apple.ImageIO.imageSourceTypeIdentifier` + return YES; + } else { + // Now, let's check if the CGImage is hardware supported (not byte-aligned will cause extra copy) + BOOL isSupported = [SDImageCoderHelper CGImageIsHardwareSupported:cgImage]; + return !isSupported; + } + } + } + return YES; } diff --git a/Samples/Cordova/ExampleProject/platforms/ios/Pods/SDWebImage/SDWebImage/Core/SDImageGraphics.m b/Samples/Cordova/ExampleProject/platforms/ios/Pods/SDWebImage/SDWebImage/Core/SDImageGraphics.m index d1a1ca65..2e877f3d 100644 --- a/Samples/Cordova/ExampleProject/platforms/ios/Pods/SDWebImage/SDWebImage/Core/SDImageGraphics.m +++ b/Samples/Cordova/ExampleProject/platforms/ios/Pods/SDWebImage/SDWebImage/Core/SDImageGraphics.m @@ -32,14 +32,13 @@ static CGContextRef SDCGContextCreateBitmapContext(CGSize size, BOOL opaque, CGF CGColorSpaceRef space = [SDImageCoderHelper colorSpaceGetDeviceRGB]; // kCGImageAlphaNone is not supported in CGBitmapContextCreate. // Check #3330 for more detail about why this bitmap is choosen. + // From v5.17.0, use runtime detection of bitmap info instead of hardcode. + // However, macOS's runtime detection will also call this function, cause recursive, so still hardcode here CGBitmapInfo bitmapInfo; if (!opaque) { - // iPhone GPU prefer to use BGRA8888, see: https://forums.raywenderlich.com/t/why-mtlpixelformat-bgra8unorm/53489 - // BGRA8888 - bitmapInfo = kCGBitmapByteOrder32Host | kCGImageAlphaPremultipliedFirst; + // [NSImage imageWithSize:flipped:drawingHandler:] returns float(16-bits) RGBA8888 on alpha image, which we don't need + bitmapInfo = kCGBitmapByteOrderDefault | kCGImageAlphaPremultipliedLast; } else { - // BGR888 previously works on iOS 8~iOS 14, however, iOS 15+ will result a black image. FB9958017 - // RGB888 bitmapInfo = kCGBitmapByteOrderDefault | kCGImageAlphaNoneSkipLast; } CGContextRef context = CGBitmapContextCreate(NULL, width, height, 8, 0, space, bitmapInfo); diff --git a/Samples/Cordova/ExampleProject/platforms/ios/Pods/SDWebImage/SDWebImage/Core/SDImageIOAnimatedCoder.m b/Samples/Cordova/ExampleProject/platforms/ios/Pods/SDWebImage/SDWebImage/Core/SDImageIOAnimatedCoder.m index b4bb06b7..bfc4345f 100644 --- a/Samples/Cordova/ExampleProject/platforms/ios/Pods/SDWebImage/SDWebImage/Core/SDImageIOAnimatedCoder.m +++ b/Samples/Cordova/ExampleProject/platforms/ios/Pods/SDWebImage/SDWebImage/Core/SDImageIOAnimatedCoder.m @@ -70,6 +70,7 @@ @implementation SDImageIOAnimatedCoder { BOOL _finished; BOOL _preserveAspectRatio; CGSize _thumbnailSize; + NSUInteger _limitBytes; BOOL _lazyDecode; } @@ -370,10 +371,16 @@ - (UIImage *)decodedImageWithData:(NSData *)data options:(nullable SDImageCoderO lazyDecode = lazyDecodeValue.boolValue; } + NSUInteger limitBytes = 0; + NSNumber *limitBytesValue = options[SDImageCoderDecodeScaleDownLimitBytes]; + if (limitBytesValue != nil) { + limitBytes = limitBytesValue.unsignedIntegerValue; + } + #if SD_MAC // If don't use thumbnail, prefers the built-in generation of frames (GIF/APNG) // Which decode frames in time and reduce memory usage - if (thumbnailSize.width == 0 || thumbnailSize.height == 0) { + if (limitBytes == 0 && (thumbnailSize.width == 0 || thumbnailSize.height == 0)) { SDAnimatedImageRep *imageRep = [[SDAnimatedImageRep alloc] initWithData:data]; if (imageRep) { NSSize size = NSMakeSize(imageRep.pixelsWide / scale, imageRep.pixelsHigh / scale); @@ -409,22 +416,36 @@ - (UIImage *)decodedImageWithData:(NSData *)data options:(nullable SDImageCoderO CGImageSourceRef source = CGImageSourceCreateWithData((__bridge CFDataRef)data, (__bridge CFDictionaryRef)creatingOptions); if (!source) { // Try again without UTType hint, the call site from user may provide the wrong UTType - source = CGImageSourceCreateWithData((__bridge CFDataRef)data, (__bridge CFDictionaryRef)creatingOptions); + source = CGImageSourceCreateWithData((__bridge CFDataRef)data, nil); } if (!source) { return nil; } - size_t count = CGImageSourceGetCount(source); + size_t frameCount = CGImageSourceGetCount(source); UIImage *animatedImage; + // Parse the image properties + NSDictionary *properties = (__bridge_transfer NSDictionary *)CGImageSourceCopyPropertiesAtIndex(source, 0, NULL); + size_t width = [properties[(__bridge NSString *)kCGImagePropertyPixelWidth] doubleValue]; + size_t height = [properties[(__bridge NSString *)kCGImagePropertyPixelHeight] doubleValue]; + // Scale down to limit bytes if need + if (limitBytes > 0) { + // Hack since ImageIO public API (not CGImageDecompressor/CMPhoto) always return back RGBA8888 CGImage + CGSize imageSize = CGSizeMake(width, height); + CGSize framePixelSize = [SDImageCoderHelper scaledSizeWithImageSize:imageSize limitBytes:limitBytes bytesPerPixel:4 frameCount:frameCount]; + // Override thumbnail size + thumbnailSize = framePixelSize; + preserveAspectRatio = YES; + } + BOOL decodeFirstFrame = [options[SDImageCoderDecodeFirstFrameOnly] boolValue]; - if (decodeFirstFrame || count <= 1) { + if (decodeFirstFrame || frameCount <= 1) { animatedImage = [self.class createFrameAtIndex:0 source:source scale:scale preserveAspectRatio:preserveAspectRatio thumbnailSize:thumbnailSize lazyDecode:lazyDecode animatedImage:NO]; } else { - NSMutableArray *frames = [NSMutableArray arrayWithCapacity:count]; + NSMutableArray *frames = [NSMutableArray arrayWithCapacity:frameCount]; - for (size_t i = 0; i < count; i++) { + for (size_t i = 0; i < frameCount; i++) { UIImage *image = [self.class createFrameAtIndex:i source:source scale:scale preserveAspectRatio:preserveAspectRatio thumbnailSize:thumbnailSize lazyDecode:lazyDecode animatedImage:NO]; if (!image) { continue; @@ -481,6 +502,12 @@ - (instancetype)initIncrementalWithOptions:(nullable SDImageCoderOptions *)optio preserveAspectRatio = preserveAspectRatioValue.boolValue; } _preserveAspectRatio = preserveAspectRatio; + NSUInteger limitBytes = 0; + NSNumber *limitBytesValue = options[SDImageCoderDecodeScaleDownLimitBytes]; + if (limitBytesValue != nil) { + limitBytes = limitBytesValue.unsignedIntegerValue; + } + _limitBytes = limitBytes; BOOL lazyDecode = NO; // Defaults NO for animated image coder NSNumber *lazyDecodeValue = options[SDImageCoderDecodeUseLazyDecoding]; if (lazyDecodeValue != nil) { @@ -524,6 +551,16 @@ - (void)updateIncrementalData:(NSData *)data finished:(BOOL)finished { // For animated image progressive decoding because the frame count and duration may be changed. [self scanAndCheckFramesValidWithImageSource:_imageSource]; SD_UNLOCK(_lock); + + // Scale down to limit bytes if need + if (_limitBytes > 0) { + // Hack since ImageIO public API (not CGImageDecompressor/CMPhoto) always return back RGBA8888 CGImage + CGSize imageSize = CGSizeMake(_width, _height); + CGSize framePixelSize = [SDImageCoderHelper scaledSizeWithImageSize:imageSize limitBytes:_limitBytes bytesPerPixel:4 frameCount:_frameCount]; + // Override thumbnail size + _thumbnailSize = framePixelSize; + _preserveAspectRatio = YES; + } } - (UIImage *)incrementalDecodedImageWithOptions:(SDImageCoderOptions *)options { @@ -710,6 +747,25 @@ - (nullable instancetype)initWithAnimatedImageData:(nullable NSData *)data optio preserveAspectRatio = preserveAspectRatioValue.boolValue; } _preserveAspectRatio = preserveAspectRatio; + NSUInteger limitBytes = 0; + NSNumber *limitBytesValue = options[SDImageCoderDecodeScaleDownLimitBytes]; + if (limitBytesValue != nil) { + limitBytes = limitBytesValue.unsignedIntegerValue; + } + _limitBytes = limitBytes; + // Parse the image properties + NSDictionary *properties = (__bridge_transfer NSDictionary *)CGImageSourceCopyPropertiesAtIndex(imageSource, 0, NULL); + _width = [properties[(__bridge NSString *)kCGImagePropertyPixelWidth] doubleValue]; + _height = [properties[(__bridge NSString *)kCGImagePropertyPixelHeight] doubleValue]; + // Scale down to limit bytes if need + if (_limitBytes > 0) { + // Hack since ImageIO public API (not CGImageDecompressor/CMPhoto) always return back RGBA8888 CGImage + CGSize imageSize = CGSizeMake(_width, _height); + CGSize framePixelSize = [SDImageCoderHelper scaledSizeWithImageSize:imageSize limitBytes:_limitBytes bytesPerPixel:4 frameCount:_frameCount]; + // Override thumbnail size + _thumbnailSize = framePixelSize; + _preserveAspectRatio = YES; + } BOOL lazyDecode = NO; // Defaults NO for animated image coder NSNumber *lazyDecodeValue = options[SDImageCoderDecodeUseLazyDecoding]; if (lazyDecodeValue != nil) { diff --git a/Samples/Cordova/ExampleProject/platforms/ios/Pods/SDWebImage/SDWebImage/Core/SDImageIOCoder.m b/Samples/Cordova/ExampleProject/platforms/ios/Pods/SDWebImage/SDWebImage/Core/SDImageIOCoder.m index b1907783..4c32bd03 100644 --- a/Samples/Cordova/ExampleProject/platforms/ios/Pods/SDWebImage/SDWebImage/Core/SDImageIOCoder.m +++ b/Samples/Cordova/ExampleProject/platforms/ios/Pods/SDWebImage/SDWebImage/Core/SDImageIOCoder.m @@ -202,7 +202,7 @@ - (UIImage *)decodedImageWithData:(NSData *)data options:(nullable SDImageCoderO CGImageSourceRef source = CGImageSourceCreateWithData((__bridge CFDataRef)data, (__bridge CFDictionaryRef)creatingOptions); if (!source) { // Try again without UTType hint, the call site from user may provide the wrong UTType - source = CGImageSourceCreateWithData((__bridge CFDataRef)data, (__bridge CFDictionaryRef)creatingOptions); + source = CGImageSourceCreateWithData((__bridge CFDataRef)data, nil); } if (!source) { return nil; diff --git a/Samples/Cordova/ExampleProject/platforms/ios/Pods/SDWebImage/SDWebImage/Core/SDImageLoader.m b/Samples/Cordova/ExampleProject/platforms/ios/Pods/SDWebImage/SDWebImage/Core/SDImageLoader.m index dc547918..b302b5b9 100644 --- a/Samples/Cordova/ExampleProject/platforms/ios/Pods/SDWebImage/SDWebImage/Core/SDImageLoader.m +++ b/Samples/Cordova/ExampleProject/platforms/ios/Pods/SDWebImage/SDWebImage/Core/SDImageLoader.m @@ -74,15 +74,19 @@ void SDImageLoaderSetProgressiveCoder(id operation, id operation, id * _Nonnull SDImageScaleFactors() { +static inline NSArray * _Nonnull SDImageScaleFactors(void) { return @[@2, @3]; } @@ -81,6 +82,24 @@ inline CGFloat SDImageScaleFactorForKey(NSString * _Nullable key) { return image; } UIImage *scaledImage; + // Check SDAnimatedImage support for shortcut + if ([image.class conformsToProtocol:@protocol(SDAnimatedImage)]) { + if ([image respondsToSelector:@selector(animatedCoder)]) { + id coder = [(id)image animatedCoder]; + if (coder) { + scaledImage = [[image.class alloc] initWithAnimatedCoder:coder scale:scale]; + } + } else { + // Some class impl does not support `animatedCoder`, keep for compatibility + NSData *data = [(id)image animatedImageData]; + if (data) { + scaledImage = [[image.class alloc] initWithData:data scale:scale]; + } + } + if (scaledImage) { + return scaledImage; + } + } if (image.sd_isAnimated) { UIImage *animatedImage; #if SD_UIKIT || SD_WATCH @@ -132,11 +151,13 @@ inline CGFloat SDImageScaleFactorForKey(NSString * _Nullable key) { SDWebImageContextOption const SDWebImageContextImageLoader = @"imageLoader"; SDWebImageContextOption const SDWebImageContextImageCoder = @"imageCoder"; SDWebImageContextOption const SDWebImageContextImageTransformer = @"imageTransformer"; +SDWebImageContextOption const SDWebImageContextImageForceDecodePolicy = @"imageForceDecodePolicy"; SDWebImageContextOption const SDWebImageContextImageDecodeOptions = @"imageDecodeOptions"; SDWebImageContextOption const SDWebImageContextImageScaleFactor = @"imageScaleFactor"; SDWebImageContextOption const SDWebImageContextImagePreserveAspectRatio = @"imagePreserveAspectRatio"; SDWebImageContextOption const SDWebImageContextImageThumbnailPixelSize = @"imageThumbnailPixelSize"; SDWebImageContextOption const SDWebImageContextImageTypeIdentifierHint = @"imageTypeIdentifierHint"; +SDWebImageContextOption const SDWebImageContextImageScaleDownLimitBytes = @"imageScaleDownLimitBytes"; SDWebImageContextOption const SDWebImageContextImageEncodeOptions = @"imageEncodeOptions"; SDWebImageContextOption const SDWebImageContextQueryCacheType = @"queryCacheType"; SDWebImageContextOption const SDWebImageContextStoreCacheType = @"storeCacheType"; diff --git a/Samples/Cordova/ExampleProject/platforms/ios/Pods/SDWebImage/SDWebImage/Core/SDWebImageDownloader.h b/Samples/Cordova/ExampleProject/platforms/ios/Pods/SDWebImage/SDWebImage/Core/SDWebImageDownloader.h index a2f50f46..08ae16bf 100644 --- a/Samples/Cordova/ExampleProject/platforms/ios/Pods/SDWebImage/SDWebImage/Core/SDWebImageDownloader.h +++ b/Samples/Cordova/ExampleProject/platforms/ios/Pods/SDWebImage/SDWebImage/Core/SDWebImageDownloader.h @@ -74,8 +74,10 @@ typedef NS_OPTIONS(NSUInteger, SDWebImageDownloaderOptions) { /** * By default, we will decode the image in the background during cache query and download from the network. This can help to improve performance because when rendering image on the screen, it need to be firstly decoded. But this happen on the main queue by Core Animation. * However, this process may increase the memory usage as well. If you are experiencing a issue due to excessive memory consumption, This flag can prevent decode the image. + * @note 5.14.0 introduce `SDImageCoderDecodeUseLazyDecoding`, use that for better control from codec, instead of post-processing. Which acts the similar like this option but works for SDAnimatedImage as well (this one does not) + * @deprecated Deprecated in v5.17.0, if you don't want force-decode, pass [.imageForceDecodePolicy] = [SDImageForceDecodePolicy.never] in context option */ - SDWebImageDownloaderAvoidDecodeImage = 1 << 9, + SDWebImageDownloaderAvoidDecodeImage API_DEPRECATED("Use SDWebImageContextImageForceDecodePolicy instead", macos(10.10, 10.10), ios(8.0, 8.0), tvos(9.0, 9.0), watchos(2.0, 2.0)) = 1 << 9, /** * By default, we decode the animated image. This flag can force decode the first frame only and produce the static image. @@ -95,9 +97,13 @@ typedef NS_OPTIONS(NSUInteger, SDWebImageDownloaderOptions) { SDWebImageDownloaderMatchAnimatedImageClass = 1 << 12, }; +/// Posed when URLSessionTask started (`resume` called)) FOUNDATION_EXPORT NSNotificationName _Nonnull const SDWebImageDownloadStartNotification; +/// Posed when URLSessionTask get HTTP response (`didReceiveResponse:completionHandler:` called) FOUNDATION_EXPORT NSNotificationName _Nonnull const SDWebImageDownloadReceiveResponseNotification; +/// Posed when URLSessionTask stoped (`didCompleteWithError:` with error or `cancel` called) FOUNDATION_EXPORT NSNotificationName _Nonnull const SDWebImageDownloadStopNotification; +/// Posed when URLSessionTask finished with success (`didCompleteWithError:` without error) FOUNDATION_EXPORT NSNotificationName _Nonnull const SDWebImageDownloadFinishNotification; typedef SDImageLoaderProgressBlock SDWebImageDownloaderProgressBlock; diff --git a/Samples/Cordova/ExampleProject/platforms/ios/Pods/SDWebImage/SDWebImage/Core/SDWebImageDownloader.m b/Samples/Cordova/ExampleProject/platforms/ios/Pods/SDWebImage/SDWebImage/Core/SDWebImageDownloader.m index 8e66a8ca..cfd26461 100644 --- a/Samples/Cordova/ExampleProject/platforms/ios/Pods/SDWebImage/SDWebImage/Core/SDWebImageDownloader.m +++ b/Samples/Cordova/ExampleProject/platforms/ios/Pods/SDWebImage/SDWebImage/Core/SDWebImageDownloader.m @@ -13,6 +13,7 @@ #import "SDWebImageCacheKeyFilter.h" #import "SDImageCacheDefine.h" #import "SDInternalMacros.h" +#import "objc/runtime.h" NSNotificationName const SDWebImageDownloadStartNotification = @"SDWebImageDownloadStartNotification"; NSNotificationName const SDWebImageDownloadReceiveResponseNotification = @"SDWebImageDownloadReceiveResponseNotification"; @@ -20,6 +21,22 @@ NSNotificationName const SDWebImageDownloadFinishNotification = @"SDWebImageDownloadFinishNotification"; static void * SDWebImageDownloaderContext = &SDWebImageDownloaderContext; +static void * SDWebImageDownloaderOperationKey = &SDWebImageDownloaderOperationKey; + +BOOL SDWebImageDownloaderOperationGetCompleted(id operation) { + NSCParameterAssert(operation); + NSNumber *value = objc_getAssociatedObject(operation, SDWebImageDownloaderOperationKey); + if (value != nil) { + return value.boolValue; + } else { + return NO; + } +} + +void SDWebImageDownloaderOperationSetCompleted(id operation, BOOL isCompleted) { + NSCParameterAssert(operation); + objc_setAssociatedObject(operation, SDWebImageDownloaderOperationKey, @(isCompleted), OBJC_ASSOCIATION_RETAIN); +} @interface SDWebImageDownloadToken () @@ -99,7 +116,7 @@ - (instancetype)initWithConfig:(SDWebImageDownloaderConfig *)config { [_config addObserver:self forKeyPath:NSStringFromSelector(@selector(maxConcurrentDownloads)) options:0 context:SDWebImageDownloaderContext]; _downloadQueue = [NSOperationQueue new]; _downloadQueue.maxConcurrentOperationCount = _config.maxConcurrentDownloads; - _downloadQueue.name = @"com.hackemist.SDWebImageDownloader"; + _downloadQueue.name = @"com.hackemist.SDWebImageDownloader.downloadQueue"; _URLOperations = [NSMutableDictionary new]; NSMutableDictionary *headerDictionary = [NSMutableDictionary dictionary]; NSString *userAgent = nil; @@ -206,7 +223,6 @@ - (nullable SDWebImageDownloadToken *)downloadImageWithURL:(nullable NSURL *)url return nil; } - SD_LOCK(_operationsLock); id downloadOperationCancelToken; // When different thumbnail size download with same url, we need to make sure each callback called with desired size id cacheKeyFilter = context[SDWebImageContextCacheKeyFilter]; @@ -217,9 +233,18 @@ - (nullable SDWebImageDownloadToken *)downloadImageWithURL:(nullable NSURL *)url cacheKey = url.absoluteString; } SDImageCoderOptions *decodeOptions = SDGetDecodeOptionsFromContext(context, [self.class imageOptionsFromDownloaderOptions:options], cacheKey); + SD_LOCK(_operationsLock); NSOperation *operation = [self.URLOperations objectForKey:url]; // There is a case that the operation may be marked as finished or cancelled, but not been removed from `self.URLOperations`. - if (!operation || operation.isFinished || operation.isCancelled) { + BOOL shouldNotReuseOperation; + if (operation) { + @synchronized (operation) { + shouldNotReuseOperation = operation.isFinished || operation.isCancelled || SDWebImageDownloaderOperationGetCompleted(operation); + } + } else { + shouldNotReuseOperation = YES; + } + if (shouldNotReuseOperation) { operation = [self createDownloaderOperationWithUrl:url options:options context:context]; if (!operation) { SD_UNLOCK(_operationsLock); @@ -251,15 +276,6 @@ - (nullable SDWebImageDownloadToken *)downloadImageWithURL:(nullable NSURL *)url @synchronized (operation) { downloadOperationCancelToken = [operation addHandlersForProgress:progressBlock completed:completedBlock decodeOptions:decodeOptions]; } - if (!operation.isExecuting) { - if (options & SDWebImageDownloaderHighPriority) { - operation.queuePriority = NSOperationQueuePriorityHigh; - } else if (options & SDWebImageDownloaderLowPriority) { - operation.queuePriority = NSOperationQueuePriorityLow; - } else { - operation.queuePriority = NSOperationQueuePriorityNormal; - } - } } SD_UNLOCK(_operationsLock); @@ -272,6 +288,8 @@ - (nullable SDWebImageDownloadToken *)downloadImageWithURL:(nullable NSURL *)url } #pragma mark Helper methods +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" + (SDWebImageOptions)imageOptionsFromDownloaderOptions:(SDWebImageDownloaderOptions)downloadOptions { SDWebImageOptions options = 0; if (downloadOptions & SDWebImageDownloaderScaleDownLargeImages) options |= SDWebImageScaleDownLargeImages; @@ -282,6 +300,7 @@ + (SDWebImageOptions)imageOptionsFromDownloaderOptions:(SDWebImageDownloaderOpti return options; } +#pragma clang diagnostic pop - (nullable NSOperation *)createDownloaderOperationWithUrl:(nonnull NSURL *)url options:(SDWebImageDownloaderOptions)options @@ -499,6 +518,12 @@ - (void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task didComp // Identify the operation that runs this task and pass it the delegate method NSOperation *dataOperation = [self operationWithTask:task]; + if (dataOperation) { + @synchronized (dataOperation) { + // Mark the downloader operation `isCompleted = YES`, no longer re-use this operation when new request comes in + SDWebImageDownloaderOperationSetCompleted(dataOperation, YES); + } + } if ([dataOperation respondsToSelector:@selector(URLSession:task:didCompleteWithError:)]) { [dataOperation URLSession:session task:task didCompleteWithError:error]; } @@ -603,6 +628,8 @@ - (BOOL)canRequestImageForURL:(NSURL *)url options:(SDWebImageOptions)options co return YES; } +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" - (id)requestImageWithURL:(NSURL *)url options:(SDWebImageOptions)options context:(SDWebImageContext *)context progress:(SDImageLoaderProgressBlock)progressBlock completed:(SDImageLoaderCompletedBlock)completedBlock { UIImage *cachedImage = context[SDWebImageContextLoaderCachedImage]; @@ -629,6 +656,7 @@ - (BOOL)canRequestImageForURL:(NSURL *)url options:(SDWebImageOptions)options co return [self downloadImageWithURL:url options:downloaderOptions context:context progress:progressBlock completed:completedBlock]; } +#pragma clang diagnostic pop - (BOOL)shouldBlockFailedURLWithURL:(NSURL *)url error:(NSError *)error { return [self shouldBlockFailedURLWithURL:url error:error options:0 context:nil]; diff --git a/Samples/Cordova/ExampleProject/platforms/ios/Pods/SDWebImage/SDWebImage/Core/SDWebImageDownloaderOperation.m b/Samples/Cordova/ExampleProject/platforms/ios/Pods/SDWebImage/SDWebImage/Core/SDWebImageDownloaderOperation.m index d4e57a9f..0ec65281 100644 --- a/Samples/Cordova/ExampleProject/platforms/ios/Pods/SDWebImage/SDWebImage/Core/SDWebImageDownloaderOperation.m +++ b/Samples/Cordova/ExampleProject/platforms/ios/Pods/SDWebImage/SDWebImage/Core/SDWebImageDownloaderOperation.m @@ -14,6 +14,8 @@ #import "SDImageCacheDefine.h" #import "SDCallbackQueue.h" +BOOL SDWebImageDownloaderOperationGetCompleted(id operation); // Private currently, mark open if needed + // A handler to represent individual request @interface SDWebImageDownloaderOperationToken : NSObject @@ -110,8 +112,9 @@ - (nonnull instancetype)initWithRequest:(nullable NSURLRequest *)request _finished = NO; _expectedSize = 0; _unownedSession = session; - _coderQueue = [NSOperationQueue new]; + _coderQueue = [[NSOperationQueue alloc] init]; _coderQueue.maxConcurrentOperationCount = 1; + _coderQueue.name = @"com.hackemist.SDWebImageDownloaderOperation.coderQueue"; _imageMap = [[NSMapTable alloc] initWithKeyOptions:NSPointerFunctionsStrongMemory valueOptions:NSPointerFunctionsWeakMemory capacity:1]; #if SD_UIKIT _backgroundTaskId = UIBackgroundTaskInvalid; @@ -231,13 +234,10 @@ - (void)start { if (self.dataTask) { if (self.options & SDWebImageDownloaderHighPriority) { self.dataTask.priority = NSURLSessionTaskPriorityHigh; - self.coderQueue.qualityOfService = NSQualityOfServiceUserInteractive; } else if (self.options & SDWebImageDownloaderLowPriority) { self.dataTask.priority = NSURLSessionTaskPriorityLow; - self.coderQueue.qualityOfService = NSQualityOfServiceBackground; } else { self.dataTask.priority = NSURLSessionTaskPriorityDefault; - self.coderQueue.qualityOfService = NSQualityOfServiceDefault; } [self.dataTask resume]; NSArray *tokens; @@ -334,7 +334,7 @@ - (void)setExecuting:(BOOL)executing { [self didChangeValueForKey:@"isExecuting"]; } -- (BOOL)isConcurrent { +- (BOOL)isAsynchronous { return YES; } @@ -471,22 +471,24 @@ - (void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)data if (self.coderQueue.operationCount == 0) { // NSOperation have autoreleasepool, don't need to create extra one @weakify(self); - NSOperation *operation = [NSBlockOperation blockOperationWithBlock:^{ + [self.coderQueue addOperationWithBlock:^{ @strongify(self); if (!self) { return; } - UIImage *image = SDImageLoaderDecodeProgressiveImageData(imageData, self.request.URL, NO, self, [[self class] imageOptionsFromDownloaderOptions:self.options], self.context); - if (self.isFinished) { - return; + // When cancelled or transfer finished (`didCompleteWithError`), cancel the progress callback, only completed block is called and enough + @synchronized (self) { + if (self.isCancelled || SDWebImageDownloaderOperationGetCompleted(self)) { + return; + } } + UIImage *image = SDImageLoaderDecodeProgressiveImageData(imageData, self.request.URL, NO, self, [[self class] imageOptionsFromDownloaderOptions:self.options], self.context); if (image) { // We do not keep the progressive decoding image even when `finished`=YES. Because they are for view rendering but not take full function from downloader options. And some coders implementation may not keep consistent between progressive decoding and normal decoding. [self callCompletionBlocksWithImage:image imageData:nil error:nil finished:NO]; } }]; - [self.coderQueue addOperation:operation]; } } @@ -564,16 +566,8 @@ - (void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task didComp // decode the image in coder queue, cancel all previous decoding process [self.coderQueue cancelAllOperations]; @weakify(self); - // call done after all different variant completed block was dispatched - NSOperation *doneOperation = [NSBlockOperation blockOperationWithBlock:^{ - @strongify(self); - if (!self) { - return; - } - [self done]; - }]; for (SDWebImageDownloaderOperationToken *token in tokens) { - NSOperation *operation = [NSBlockOperation blockOperationWithBlock:^{ + [self.coderQueue addOperationWithBlock:^{ @strongify(self); if (!self) { return; @@ -607,16 +601,28 @@ - (void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task didComp CGSize imageSize = image.size; if (imageSize.width == 0 || imageSize.height == 0) { NSString *description = image == nil ? @"Downloaded image decode failed" : @"Downloaded image has 0 pixels"; - [self callCompletionBlocksWithError:[NSError errorWithDomain:SDWebImageErrorDomain code:SDWebImageErrorBadImageData userInfo:@{NSLocalizedDescriptionKey : description}]]; + NSError *error = [NSError errorWithDomain:SDWebImageErrorDomain code:SDWebImageErrorBadImageData userInfo:@{NSLocalizedDescriptionKey : description}]; + [self callCompletionBlockWithToken:token image:nil imageData:nil error:error finished:YES]; } else { [self callCompletionBlockWithToken:token image:image imageData:imageData error:nil finished:YES]; } }]; - [doneOperation addDependency:operation]; - [self.coderQueue addOperation:operation]; } // call [self done] after all completed block was dispatched - [self.coderQueue addOperation:doneOperation]; + dispatch_block_t doneBlock = ^{ + @strongify(self); + if (!self) { + return; + } + [self done]; + }; + if (@available(iOS 13, tvOS 13, macOS 10.15, watchOS 6, *)) { + // seems faster than `addOperationWithBlock` + [self.coderQueue addBarrierBlock:doneBlock]; + } else { + // serial queue, this does the same effect in semantics + [self.coderQueue addOperationWithBlock:doneBlock]; + } } } else { [self callCompletionBlocksWithError:[NSError errorWithDomain:SDWebImageErrorDomain code:SDWebImageErrorBadImageData userInfo:@{NSLocalizedDescriptionKey : @"Image data is nil"}]]; @@ -665,6 +671,8 @@ - (void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task didFini } #pragma mark Helper methods +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" + (SDWebImageOptions)imageOptionsFromDownloaderOptions:(SDWebImageDownloaderOptions)downloadOptions { SDWebImageOptions options = 0; if (downloadOptions & SDWebImageDownloaderScaleDownLargeImages) options |= SDWebImageScaleDownLargeImages; @@ -675,6 +683,7 @@ + (SDWebImageOptions)imageOptionsFromDownloaderOptions:(SDWebImageDownloaderOpti return options; } +#pragma clang diagnostic pop - (BOOL)shouldContinueWhenAppEntersBackground { return SD_OPTIONS_CONTAINS(self.options, SDWebImageDownloaderContinueInBackground); diff --git a/Samples/Cordova/ExampleProject/platforms/ios/Pods/SDWebImage/SDWebImage/Core/SDWebImageError.h b/Samples/Cordova/ExampleProject/platforms/ios/Pods/SDWebImage/SDWebImage/Core/SDWebImageError.h index bb91d0bd..652b0d77 100644 --- a/Samples/Cordova/ExampleProject/platforms/ios/Pods/SDWebImage/SDWebImage/Core/SDWebImageError.h +++ b/Samples/Cordova/ExampleProject/platforms/ios/Pods/SDWebImage/SDWebImage/Core/SDWebImageError.h @@ -9,6 +9,7 @@ #import "SDWebImageCompat.h" +/// An error domain represent SDWebImage loading system with custom codes FOUNDATION_EXPORT NSErrorDomain const _Nonnull SDWebImageErrorDomain; /// The response instance for invalid download response (NSURLResponse *) diff --git a/Samples/Cordova/ExampleProject/platforms/ios/Pods/SDWebImage/SDWebImage/Core/UIImage+ForceDecode.h b/Samples/Cordova/ExampleProject/platforms/ios/Pods/SDWebImage/SDWebImage/Core/UIImage+ForceDecode.h index f3687467..658659ad 100644 --- a/Samples/Cordova/ExampleProject/platforms/ios/Pods/SDWebImage/SDWebImage/Core/UIImage+ForceDecode.h +++ b/Samples/Cordova/ExampleProject/platforms/ios/Pods/SDWebImage/SDWebImage/Core/UIImage+ForceDecode.h @@ -15,6 +15,12 @@ /** A bool value indicating whether the image has already been decoded. This can help to avoid extra force decode. + Force decode is used for 2 cases: + -- 1. for ImageIO created image (via `CGImageCreateWithImageSource` SPI), it's lazy and we trigger the decode before rendering + -- 2. for non-ImageIO created image (via `CGImageCreate` API), we can ensure it's alignment is suitable to render on screen without copy by CoreAnimation + @note For coder plugin developer, always use the SDImageCoderHelper's `colorSpaceGetDeviceRGB`/`preferredPixelFormat` to create CGImage. + @note For more information why force decode, see: https://github.com/path/FastImageCache#byte-alignment + @note From v5.17.0, the default value is always NO. Use `SDImageForceDecodePolicy` to control complicated policy. */ @property (nonatomic, assign) BOOL sd_isDecoded; diff --git a/Samples/Cordova/ExampleProject/platforms/ios/Pods/SDWebImage/SDWebImage/Core/UIImage+ForceDecode.m b/Samples/Cordova/ExampleProject/platforms/ios/Pods/SDWebImage/SDWebImage/Core/UIImage+ForceDecode.m index 9fc72588..17b122eb 100644 --- a/Samples/Cordova/ExampleProject/platforms/ios/Pods/SDWebImage/SDWebImage/Core/UIImage+ForceDecode.m +++ b/Samples/Cordova/ExampleProject/platforms/ios/Pods/SDWebImage/SDWebImage/Core/UIImage+ForceDecode.m @@ -15,24 +15,7 @@ @implementation UIImage (ForceDecode) - (BOOL)sd_isDecoded { NSNumber *value = objc_getAssociatedObject(self, @selector(sd_isDecoded)); - if (value != nil) { - return value.boolValue; - } else { - // Assume only CGImage based can use lazy decoding - CGImageRef cgImage = self.CGImage; - if (cgImage) { - CFStringRef uttype = CGImageGetUTType(self.CGImage); - if (uttype) { - // Only ImageIO can set `com.apple.ImageIO.imageSourceTypeIdentifier` - return NO; - } else { - // Thumbnail or CGBitmapContext drawn image - return YES; - } - } - } - // Assume others as non-decoded - return NO; + return [value boolValue]; } - (void)setSd_isDecoded:(BOOL)sd_isDecoded { diff --git a/Samples/Cordova/ExampleProject/platforms/ios/Pods/SDWebImage/SDWebImage/Core/UIImage+Transform.h b/Samples/Cordova/ExampleProject/platforms/ios/Pods/SDWebImage/SDWebImage/Core/UIImage+Transform.h index 06cb66da..699def7a 100644 --- a/Samples/Cordova/ExampleProject/platforms/ios/Pods/SDWebImage/SDWebImage/Core/UIImage+Transform.h +++ b/Samples/Cordova/ExampleProject/platforms/ios/Pods/SDWebImage/SDWebImage/Core/UIImage+Transform.h @@ -8,9 +8,13 @@ #import "SDWebImageCompat.h" +/// The scale mode to apply when image drawing on a container with different sizes. typedef NS_ENUM(NSUInteger, SDImageScaleMode) { + /// The option to scale the content to fit the size of itself by changing the aspect ratio of the content if necessary. SDImageScaleModeFill = 0, + /// The option to scale the content to fit the size of the view by maintaining the aspect ratio. Any remaining area of the view’s bounds is transparent. SDImageScaleModeAspectFit = 1, + /// The option to scale the content to fill the size of the view. Some portion of the content may be clipped to fill the view’s bounds. SDImageScaleModeAspectFill = 2 }; diff --git a/Samples/Cordova/ExampleProject/platforms/ios/Pods/SDWebImage/SDWebImage/Core/UIImage+Transform.m b/Samples/Cordova/ExampleProject/platforms/ios/Pods/SDWebImage/SDWebImage/Core/UIImage+Transform.m index 2cd8a6f9..43122df1 100644 --- a/Samples/Cordova/ExampleProject/platforms/ios/Pods/SDWebImage/SDWebImage/Core/UIImage+Transform.m +++ b/Samples/Cordova/ExampleProject/platforms/ios/Pods/SDWebImage/SDWebImage/Core/UIImage+Transform.m @@ -57,7 +57,7 @@ static inline CGRect SDCGRectFitWithScaleMode(CGRect rect, CGSize size, SDImageS return rect; } -static inline UIColor * SDGetColorFromGrayscale(Pixel_88 pixel, CGBitmapInfo bitmapInfo) { +static inline UIColor * SDGetColorFromGrayscale(Pixel_88 pixel, CGBitmapInfo bitmapInfo, CGColorSpaceRef cgColorSpace) { // Get alpha info, byteOrder info CGImageAlphaInfo alphaInfo = bitmapInfo & kCGBitmapAlphaInfoMask; CGBitmapInfo byteOrderInfo = bitmapInfo & kCGBitmapByteOrderMask; @@ -135,11 +135,18 @@ static inline CGRect SDCGRectFitWithScaleMode(CGRect rect, CGSize size, SDImageS default: break; } - +#if SD_MAC + // Mac supports ColorSync, to ensure the same bahvior, we convert color to sRGB + NSColorSpace *colorSpace = [[NSColorSpace alloc] initWithCGColorSpace:cgColorSpace]; + CGFloat components[2] = {w, a}; + NSColor *color = [NSColor colorWithColorSpace:colorSpace components:components count:2]; + return [color colorUsingColorSpace:NSColorSpace.genericGamma22GrayColorSpace]; +#else return [UIColor colorWithWhite:w alpha:a]; +#endif } -static inline UIColor * SDGetColorFromRGBA(Pixel_8888 pixel, CGBitmapInfo bitmapInfo) { +static inline UIColor * SDGetColorFromRGBA(Pixel_8888 pixel, CGBitmapInfo bitmapInfo, CGColorSpaceRef cgColorSpace) { // Get alpha info, byteOrder info CGImageAlphaInfo alphaInfo = bitmapInfo & kCGBitmapAlphaInfoMask; CGBitmapInfo byteOrderInfo = bitmapInfo & kCGBitmapByteOrderMask; @@ -150,8 +157,10 @@ static inline CGRect SDCGRectFitWithScaleMode(CGRect rect, CGSize size, SDImageS case kCGBitmapByteOrderDefault: { byteOrderNormal = YES; } break; + case kCGBitmapByteOrder16Little: case kCGBitmapByteOrder32Little: { } break; + case kCGBitmapByteOrder16Big: case kCGBitmapByteOrder32Big: { byteOrderNormal = YES; } break; @@ -242,8 +251,15 @@ static inline CGRect SDCGRectFitWithScaleMode(CGRect rect, CGSize size, SDImageS default: break; } - +#if SD_MAC + // Mac supports ColorSync, to ensure the same bahvior, we convert color to sRGB + NSColorSpace *colorSpace = [[NSColorSpace alloc] initWithCGColorSpace:cgColorSpace]; + CGFloat components[4] = {r, g, b, a}; + NSColor *color = [NSColor colorWithColorSpace:colorSpace components:components count:4]; + return [color colorUsingColorSpace:NSColorSpace.sRGBColorSpace]; +#else return [UIColor colorWithRed:r green:g blue:b alpha:a]; +#endif } #if SD_UIKIT || SD_MAC @@ -558,6 +574,9 @@ - (nullable UIColor *)sd_colorAtPoint:(CGPoint)point { CGImageRelease(imageRef); return nil; } + // Get color space for transform + CGColorSpaceRef colorSpace = CGImageGetColorSpace(imageRef); + // greyscale if (components == 2) { Pixel_88 pixel = {0}; @@ -565,7 +584,7 @@ - (nullable UIColor *)sd_colorAtPoint:(CGPoint)point { CFRelease(data); CGImageRelease(imageRef); // Convert to color - return SDGetColorFromGrayscale(pixel, bitmapInfo); + return SDGetColorFromGrayscale(pixel, bitmapInfo, colorSpace); } else if (components == 3 || components == 4) { // RGB/RGBA Pixel_8888 pixel = {0}; @@ -573,7 +592,7 @@ - (nullable UIColor *)sd_colorAtPoint:(CGPoint)point { CFRelease(data); CGImageRelease(imageRef); // Convert to color - return SDGetColorFromRGBA(pixel, bitmapInfo); + return SDGetColorFromRGBA(pixel, bitmapInfo, colorSpace); } else { NSLog(@"Unsupported components: %zu", components); CFRelease(data); @@ -637,6 +656,8 @@ - (nullable UIColor *)sd_colorAtPoint:(CGPoint)point { // Convert to color CGBitmapInfo bitmapInfo = CGImageGetBitmapInfo(imageRef); NSMutableArray *colors = [NSMutableArray arrayWithCapacity:CGRectGetWidth(rect) * CGRectGetHeight(rect)]; + // ColorSpace + CGColorSpaceRef colorSpace = CGImageGetColorSpace(imageRef); for (size_t index = start; index < end; index += components) { if (index >= row * bytesPerRow + col * components) { // Index beyond the end of current row, go next row @@ -648,14 +669,14 @@ - (nullable UIColor *)sd_colorAtPoint:(CGPoint)point { UIColor *color; if (components == 2) { Pixel_88 pixel = {pixels[index], pixel[index+1]}; - color = SDGetColorFromGrayscale(pixel, bitmapInfo); + color = SDGetColorFromGrayscale(pixel, bitmapInfo, colorSpace); } else { if (components == 3) { Pixel_8888 pixel = {pixels[index], pixels[index+1], pixels[index+2], 0}; - color = SDGetColorFromRGBA(pixel, bitmapInfo); + color = SDGetColorFromRGBA(pixel, bitmapInfo, colorSpace); } else if (components == 4) { Pixel_8888 pixel = {pixels[index], pixels[index+1], pixels[index+2], pixels[index+3]}; - color = SDGetColorFromRGBA(pixel, bitmapInfo); + color = SDGetColorFromRGBA(pixel, bitmapInfo, colorSpace); } else { NSLog(@"Unsupported components: %zu", components); } @@ -701,15 +722,8 @@ - (nullable UIImage *)sd_blurredImageWithRadius:(CGFloat)blurRadius { #endif CGImageRef imageRef = self.CGImage; - - //convert to BGRA if it isn't - if (CGImageGetBitsPerPixel(imageRef) != 32 || - CGImageGetBitsPerComponent(imageRef) != 8 || - !((CGImageGetBitmapInfo(imageRef) & kCGBitmapAlphaInfoMask))) { - SDGraphicsBeginImageContextWithOptions(self.size, NO, self.scale); - [self drawInRect:CGRectMake(0, 0, self.size.width, self.size.height)]; - imageRef = SDGraphicsGetImageFromCurrentImageContext().CGImage; - SDGraphicsEndImageContext(); + if (!imageRef) { + return nil; } vImage_Buffer effect = {}, scratch = {}; @@ -726,7 +740,7 @@ - (nullable UIImage *)sd_blurredImageWithRadius:(CGFloat)blurRadius { }; vImage_Error err; - err = vImageBuffer_InitWithCGImage(&effect, &format, NULL, imageRef, kvImageNoFlags); + err = vImageBuffer_InitWithCGImage(&effect, &format, NULL, imageRef, kvImageNoFlags); // vImage will convert to format we requests, no need `vImageConvert` if (err != kvImageNoError) { NSLog(@"UIImage+Transform error: vImageBuffer_InitWithCGImage returned error code %zi for inputImage: %@", err, self); return nil; @@ -740,6 +754,7 @@ - (nullable UIImage *)sd_blurredImageWithRadius:(CGFloat)blurRadius { input = &effect; output = &scratch; + // See: https://developer.apple.com/library/archive/samplecode/UIImageEffects/Introduction/Intro.html if (hasBlur) { // A description of how to compute the box kernel width from the Gaussian // radius (aka standard deviation) appears in the SVG spec: @@ -756,19 +771,16 @@ - (nullable UIImage *)sd_blurredImageWithRadius:(CGFloat)blurRadius { if (inputRadius - 2.0 < __FLT_EPSILON__) inputRadius = 2.0; uint32_t radius = floor(inputRadius * 3.0 * sqrt(2 * M_PI) / 4 + 0.5); radius |= 1; // force radius to be odd so that the three box-blur methodology works. - int iterations; - if (blurRadius * scale < 0.5) iterations = 1; - else if (blurRadius * scale < 1.5) iterations = 2; - else iterations = 3; NSInteger tempSize = vImageBoxConvolve_ARGB8888(input, output, NULL, 0, 0, radius, radius, NULL, kvImageGetTempBufferSize | kvImageEdgeExtend); void *temp = malloc(tempSize); - for (int i = 0; i < iterations; i++) { - vImageBoxConvolve_ARGB8888(input, output, temp, 0, 0, radius, radius, NULL, kvImageEdgeExtend); - vImage_Buffer *tmp = input; - input = output; - output = tmp; - } + vImageBoxConvolve_ARGB8888(input, output, temp, 0, 0, radius, radius, NULL, kvImageEdgeExtend); + vImageBoxConvolve_ARGB8888(output, input, temp, 0, 0, radius, radius, NULL, kvImageEdgeExtend); + vImageBoxConvolve_ARGB8888(input, output, temp, 0, 0, radius, radius, NULL, kvImageEdgeExtend); free(temp); + + vImage_Buffer *tmp = input; + input = output; + output = tmp; } CGImageRef effectCGImage = NULL; diff --git a/Samples/Cordova/ExampleProject/platforms/ios/Pods/SDWebImage/SDWebImage/Private/SDAsyncBlockOperation.m b/Samples/Cordova/ExampleProject/platforms/ios/Pods/SDWebImage/SDWebImage/Private/SDAsyncBlockOperation.m index 0b2fefec..7e83a56b 100644 --- a/Samples/Cordova/ExampleProject/platforms/ios/Pods/SDWebImage/SDWebImage/Private/SDAsyncBlockOperation.m +++ b/Samples/Cordova/ExampleProject/platforms/ios/Pods/SDWebImage/SDWebImage/Private/SDAsyncBlockOperation.m @@ -7,11 +7,10 @@ */ #import "SDAsyncBlockOperation.h" +#import "SDInternalMacros.h" @interface SDAsyncBlockOperation () -@property (assign, nonatomic, getter = isExecuting) BOOL executing; -@property (assign, nonatomic, getter = isFinished) BOOL finished; @property (nonatomic, copy, nonnull) SDAsyncBlock executionBlock; @end @@ -40,16 +39,17 @@ - (void)start { self.finished = YES; return; } - self.finished = NO; self.executing = YES; - - if (self.executionBlock) { - self.executionBlock(self); - } else { - self.executing = NO; - self.finished = YES; - } + } + SDAsyncBlock executionBlock = self.executionBlock; + if (executionBlock) { + @weakify(self); + dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^{ + @strongify(self); + if (!self) return; + executionBlock(self); + }); } } @@ -71,7 +71,7 @@ - (void)complete { self.executing = NO; } } - } +} - (void)setFinished:(BOOL)finished { [self willChangeValueForKey:@"isFinished"]; @@ -85,7 +85,7 @@ - (void)setExecuting:(BOOL)executing { [self didChangeValueForKey:@"isExecuting"]; } -- (BOOL)isConcurrent { +- (BOOL)isAsynchronous { return YES; } diff --git a/Samples/Cordova/ExampleProject/platforms/ios/Pods/SDWebImage/SDWebImage/Private/SDDeviceHelper.m b/Samples/Cordova/ExampleProject/platforms/ios/Pods/SDWebImage/SDWebImage/Private/SDDeviceHelper.m index 83d02296..b4bbbe3e 100644 --- a/Samples/Cordova/ExampleProject/platforms/ios/Pods/SDWebImage/SDWebImage/Private/SDDeviceHelper.m +++ b/Samples/Cordova/ExampleProject/platforms/ios/Pods/SDWebImage/SDWebImage/Private/SDDeviceHelper.m @@ -8,6 +8,7 @@ #import "SDDeviceHelper.h" #import +#import @implementation SDDeviceHelper diff --git a/Samples/Cordova/ExampleProject/platforms/ios/Pods/SDWebImage/SDWebImage/Private/SDDisplayLink.h b/Samples/Cordova/ExampleProject/platforms/ios/Pods/SDWebImage/SDWebImage/Private/SDDisplayLink.h index 3ee8c6fd..6582ccbf 100644 --- a/Samples/Cordova/ExampleProject/platforms/ios/Pods/SDWebImage/SDWebImage/Private/SDDisplayLink.h +++ b/Samples/Cordova/ExampleProject/platforms/ios/Pods/SDWebImage/SDWebImage/Private/SDDisplayLink.h @@ -15,7 +15,7 @@ @property (readonly, nonatomic, weak, nullable) id target; @property (readonly, nonatomic, assign, nonnull) SEL selector; -@property (readonly, nonatomic) CFTimeInterval duration; +@property (readonly, nonatomic) NSTimeInterval duration; // elapsed time in seconds of previous callback. (or it's first callback, use the time between `start` and callback). Always zero when display link not running @property (readonly, nonatomic) BOOL isRunning; + (nonnull instancetype)displayLinkWithTarget:(nonnull id)target selector:(nonnull SEL)sel; diff --git a/Samples/Cordova/ExampleProject/platforms/ios/Pods/SDWebImage/SDWebImage/Private/SDDisplayLink.m b/Samples/Cordova/ExampleProject/platforms/ios/Pods/SDWebImage/SDWebImage/Private/SDDisplayLink.m index 1dcfd99f..1d22611a 100644 --- a/Samples/Cordova/ExampleProject/platforms/ios/Pods/SDWebImage/SDWebImage/Private/SDDisplayLink.m +++ b/Samples/Cordova/ExampleProject/platforms/ios/Pods/SDWebImage/SDWebImage/Private/SDDisplayLink.m @@ -13,6 +13,7 @@ #elif SD_IOS || SD_TV #import #endif +#include #if SD_MAC static CVReturn DisplayLinkCallback(CVDisplayLinkRef displayLink, const CVTimeStamp *inNow, const CVTimeStamp *inOutputTime, CVOptionFlags flagsIn, CVOptionFlags *flagsOut, void *displayLinkContext); @@ -22,6 +23,9 @@ @interface SDDisplayLink () +@property (nonatomic, assign) NSTimeInterval previousFireTime; +@property (nonatomic, assign) NSTimeInterval nextFireTime; + #if SD_MAC @property (nonatomic, assign) CVDisplayLinkRef displayLink; @property (nonatomic, assign) CVTimeStamp outputTime; @@ -32,7 +36,6 @@ @interface SDDisplayLink () @property (nonatomic, strong) NSTimer *displayLink; @property (nonatomic, strong) NSRunLoop *runloop; @property (nonatomic, copy) NSRunLoopMode runloopMode; -@property (nonatomic, assign) NSTimeInterval currentFireDate; #endif @end @@ -42,6 +45,7 @@ @implementation SDDisplayLink - (void)dealloc { #if SD_MAC if (_displayLink) { + CVDisplayLinkStop(_displayLink); CVDisplayLinkRelease(_displayLink); _displayLink = NULL; } @@ -59,14 +63,15 @@ - (instancetype)initWithTarget:(id)target selector:(SEL)sel { if (self) { _target = target; _selector = sel; + // CA/CV/NSTimer will retain to the target, we need to break this using weak proxy + SDWeakProxy *weakProxy = [SDWeakProxy proxyWithTarget:self]; #if SD_MAC CVDisplayLinkCreateWithActiveCGDisplays(&_displayLink); - CVDisplayLinkSetOutputCallback(_displayLink, DisplayLinkCallback, (__bridge void *)self); + // Simulate retain for target, the target is weak proxy to self + CVDisplayLinkSetOutputCallback(_displayLink, DisplayLinkCallback, (__bridge_retained void *)weakProxy); #elif SD_IOS || SD_TV - SDWeakProxy *weakProxy = [SDWeakProxy proxyWithTarget:self]; _displayLink = [CADisplayLink displayLinkWithTarget:weakProxy selector:@selector(displayLinkDidRefresh:)]; #else - SDWeakProxy *weakProxy = [SDWeakProxy proxyWithTarget:self]; _displayLink = [NSTimer timerWithTimeInterval:kSDDisplayLinkInterval target:weakProxy selector:@selector(displayLinkDidRefresh:) userInfo:nil repeats:YES]; #endif } @@ -78,33 +83,53 @@ + (instancetype)displayLinkWithTarget:(id)target selector:(SEL)sel { return displayLink; } -- (CFTimeInterval)duration { +- (NSTimeInterval)duration { + NSTimeInterval duration = 0; #if SD_MAC CVTimeStamp outputTime = self.outputTime; - NSTimeInterval duration = 0; double periodPerSecond = (double)outputTime.videoTimeScale * outputTime.rateScalar; if (periodPerSecond > 0) { duration = (double)outputTime.videoRefreshPeriod / periodPerSecond; } -#elif SD_IOS || SD_TV -#pragma clang diagnostic push -#pragma clang diagnostic ignored "-Wdeprecated-declarations" - NSTimeInterval duration = 0; +#elif SD_UIKIT + // iOS 10+/watchOS use `nextTime` if (@available(iOS 10.0, tvOS 10.0, *)) { - duration = self.displayLink.targetTimestamp - CACurrentMediaTime(); + duration = self.nextFireTime - CACurrentMediaTime(); } else { - duration = self.displayLink.duration * self.displayLink.frameInterval; + // iOS 9 use `previousTime` + duration = CACurrentMediaTime() - self.previousFireTime; } -#pragma clang diagnostic pop #else - NSTimeInterval duration = 0; - if (self.displayLink.isValid && self.currentFireDate != 0) { - NSTimeInterval nextFireDate = CFRunLoopTimerGetNextFireDate((__bridge CFRunLoopTimerRef)self.displayLink); - duration = nextFireDate - self.currentFireDate; + if (self.nextFireTime != 0) { + // `CFRunLoopTimerGetNextFireDate`: This time could be a date in the past if a run loop has not been able to process the timer since the firing time arrived. + // Don't rely on this, always calculate based on elapsed time + duration = CFRunLoopTimerGetNextFireDate((__bridge CFRunLoopTimerRef)self.displayLink) - self.nextFireTime; } #endif - if (duration <= 0) { + // When system sleep, the targetTimestamp will mass up, fallback refresh rate + if (duration < 0) { +#if SD_MAC + // Supports Pro display 120Hz + CGDirectDisplayID display = CVDisplayLinkGetCurrentCGDisplay(_displayLink); + CGDisplayModeRef mode = CGDisplayCopyDisplayMode(display); + if (mode) { + double refreshRate = CGDisplayModeGetRefreshRate(mode); + if (refreshRate > 0) { + duration = 1.0 / refreshRate; + } else { + duration = kSDDisplayLinkInterval; + } + CGDisplayModeRelease(mode); + } else { + duration = kSDDisplayLinkInterval; + } +#elif SD_IOS || SD_TV + // Fallback + duration = self.displayLink.duration; +#else + // Watch always 60Hz duration = kSDDisplayLinkInterval; +#endif } return duration; } @@ -189,15 +214,16 @@ - (void)stop { #else [self.displayLink invalidate]; #endif + self.previousFireTime = 0; + self.nextFireTime = 0; } - (void)displayLinkDidRefresh:(id)displayLink { -#if SD_MAC - // CVDisplayLink does not use runloop, but we can provide similar behavior for modes - // May use `default` runloop to avoid extra callback when in `eventTracking` (mouse drag, scroll) or `modalPanel` (modal panel) - NSString *runloopMode = self.runloopMode; - if (![runloopMode isEqualToString:NSRunLoopCommonModes] && ![runloopMode isEqualToString:NSRunLoop.mainRunLoop.currentMode]) { - return; +#if SD_IOS || SD_TV + if (@available(iOS 10.0, tvOS 10.0, *)) { + self.nextFireTime = self.displayLink.targetTimestamp; + } else { + self.previousFireTime = self.displayLink.timestamp; } #endif #pragma clang diagnostic push @@ -205,7 +231,7 @@ - (void)displayLinkDidRefresh:(id)displayLink { [_target performSelector:_selector withObject:self]; #pragma clang diagnostic pop #if SD_WATCH - self.currentFireDate = CFRunLoopTimerGetNextFireDate((__bridge CFRunLoopTimerRef)self.displayLink); + self.nextFireTime = CFRunLoopTimerGetNextFireDate((__bridge CFRunLoopTimerRef)self.displayLink); #endif } @@ -214,12 +240,19 @@ - (void)displayLinkDidRefresh:(id)displayLink { #if SD_MAC static CVReturn DisplayLinkCallback(CVDisplayLinkRef displayLink, const CVTimeStamp *inNow, const CVTimeStamp *inOutputTime, CVOptionFlags flagsIn, CVOptionFlags *flagsOut, void *displayLinkContext) { // CVDisplayLink callback is not on main queue + // Actually `SDWeakProxy` but not `SDDisplayLink` SDDisplayLink *object = (__bridge SDDisplayLink *)displayLinkContext; - if (inOutputTime) { - object.outputTime = *inOutputTime; + if (!object) return kCVReturnSuccess; + // CVDisplayLink does not use runloop, but we can provide similar behavior for modes + // May use `default` runloop to avoid extra callback when in `eventTracking` (mouse drag, scroll) or `modalPanel` (modal panel) + NSString *runloopMode = object.runloopMode; + if (![runloopMode isEqualToString:NSRunLoopCommonModes] && ![runloopMode isEqualToString:NSRunLoop.mainRunLoop.currentMode]) { + return kCVReturnSuccess; } + CVTimeStamp outputTime = inOutputTime ? *inOutputTime : *inNow; __weak SDDisplayLink *weakObject = object; dispatch_async(dispatch_get_main_queue(), ^{ + weakObject.outputTime = outputTime; [weakObject displayLinkDidRefresh:(__bridge id)(displayLink)]; }); return kCVReturnSuccess; diff --git a/Samples/Cordova/ExampleProject/platforms/ios/Pods/SDWebImage/SDWebImage/Private/SDImageAssetManager.m b/Samples/Cordova/ExampleProject/platforms/ios/Pods/SDWebImage/SDWebImage/Private/SDImageAssetManager.m index 7bca347c..13988975 100644 --- a/Samples/Cordova/ExampleProject/platforms/ios/Pods/SDWebImage/SDWebImage/Private/SDImageAssetManager.m +++ b/Samples/Cordova/ExampleProject/platforms/ios/Pods/SDWebImage/SDWebImage/Private/SDImageAssetManager.m @@ -9,7 +9,7 @@ #import "SDImageAssetManager.h" #import "SDInternalMacros.h" -static NSArray *SDBundlePreferredScales() { +static NSArray *SDBundlePreferredScales(void) { static NSArray *scales; static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ diff --git a/Samples/Cordova/ExampleProject/platforms/ios/Pods/SDWebImage/SDWebImage/Private/SDImageFramePool.h b/Samples/Cordova/ExampleProject/platforms/ios/Pods/SDWebImage/SDWebImage/Private/SDImageFramePool.h new file mode 100644 index 00000000..6fedc83f --- /dev/null +++ b/Samples/Cordova/ExampleProject/platforms/ios/Pods/SDWebImage/SDWebImage/Private/SDImageFramePool.h @@ -0,0 +1,40 @@ +/* +* This file is part of the SDWebImage package. +* (c) Olivier Poitrey +* +* For the full copyright and license information, please view the LICENSE +* file that was distributed with this source code. +*/ + +#import +#import "SDWebImageCompat.h" +#import "SDImageCoder.h" + +NS_ASSUME_NONNULL_BEGIN + +/// A per-provider (provider means, AnimatedImage object) based frame pool, each player who use the same provider share the same frame buffer +@interface SDImageFramePool : NSObject + +/// Register and return back a frame pool, also increase reference count ++ (instancetype)registerProvider:(id)provider; +/// Unregister a frame pool, also decrease reference count, if zero dealloc the frame pool ++ (void)unregisterProvider:(id)provider; + +/// Prefetch the current frame, query using `frameAtIndex:` by caller to check whether finished. +- (void)prefetchFrameAtIndex:(NSUInteger)index; + +/// Control the max buffer count for current frame pool, used for RAM/CPU balance, default unlimited +@property (nonatomic, assign) NSUInteger maxBufferCount; +/// Control the max concurrent fetch queue operation count, used for CPU balance, default 1 +@property (nonatomic, assign) NSUInteger maxConcurrentCount; + +// Frame Operations +@property (nonatomic, readonly) NSUInteger currentFrameCount; +- (nullable UIImage *)frameAtIndex:(NSUInteger)index; +- (void)setFrame:(nullable UIImage *)frame atIndex:(NSUInteger)index; +- (void)removeFrameAtIndex:(NSUInteger)index; +- (void)removeAllFrames; + +NS_ASSUME_NONNULL_END + +@end diff --git a/Samples/Cordova/ExampleProject/platforms/ios/Pods/SDWebImage/SDWebImage/Private/SDImageFramePool.m b/Samples/Cordova/ExampleProject/platforms/ios/Pods/SDWebImage/SDWebImage/Private/SDImageFramePool.m new file mode 100644 index 00000000..1eb2cdb3 --- /dev/null +++ b/Samples/Cordova/ExampleProject/platforms/ios/Pods/SDWebImage/SDWebImage/Private/SDImageFramePool.m @@ -0,0 +1,164 @@ +/* +* This file is part of the SDWebImage package. +* (c) Olivier Poitrey +* +* For the full copyright and license information, please view the LICENSE +* file that was distributed with this source code. +*/ + +#import "SDImageFramePool.h" +#import "SDInternalMacros.h" +#import "objc/runtime.h" + +@interface SDImageFramePool () + +@property (class, readonly) NSMapTable *providerFramePoolMap; + +@property (weak) id provider; +@property (atomic) NSUInteger registerCount; + +@property (nonatomic, strong) NSMutableDictionary *frameBuffer; +@property (nonatomic, strong) NSOperationQueue *fetchQueue; + +@end + +// Lock to ensure atomic behavior +SD_LOCK_DECLARE_STATIC(_providerFramePoolMapLock); + +@implementation SDImageFramePool + ++ (NSMapTable *)providerFramePoolMap { + static NSMapTable *providerFramePoolMap; + static dispatch_once_t onceToken; + dispatch_once(&onceToken, ^{ + providerFramePoolMap = [NSMapTable mapTableWithKeyOptions:NSPointerFunctionsStrongMemory | NSPointerFunctionsObjectPointerPersonality valueOptions:NSPointerFunctionsStrongMemory | NSPointerFunctionsObjectPointerPersonality]; + }); + return providerFramePoolMap; +} + +#pragma mark - Life Cycle +- (instancetype)init { + self = [super init]; + if (self) { + _frameBuffer = [NSMutableDictionary dictionary]; + _fetchQueue = [[NSOperationQueue alloc] init]; + _fetchQueue.maxConcurrentOperationCount = 1; + _fetchQueue.name = @"com.hackemist.SDImageFramePool.fetchQueue"; +#if SD_UIKIT + [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(didReceiveMemoryWarning:) name:UIApplicationDidReceiveMemoryWarningNotification object:nil]; +#endif + } + return self; +} + +- (void)dealloc { +#if SD_UIKIT + [[NSNotificationCenter defaultCenter] removeObserver:self name:UIApplicationDidReceiveMemoryWarningNotification object:nil]; +#endif +} + +- (void)didReceiveMemoryWarning:(NSNotification *)notification { + [self removeAllFrames]; +} + ++ (void)initialize { + // Lock to ensure atomic behavior + SD_LOCK_INIT(_providerFramePoolMapLock); +} + ++ (instancetype)registerProvider:(id)provider { + // Lock to ensure atomic behavior + SD_LOCK(_providerFramePoolMapLock); + SDImageFramePool *framePool = [self.providerFramePoolMap objectForKey:provider]; + if (!framePool) { + framePool = [[SDImageFramePool alloc] init]; + framePool.provider = provider; + [self.providerFramePoolMap setObject:framePool forKey:provider]; + } + framePool.registerCount += 1; + SD_UNLOCK(_providerFramePoolMapLock); + return framePool; +} + ++ (void)unregisterProvider:(id)provider { + // Lock to ensure atomic behavior + SD_LOCK(_providerFramePoolMapLock); + SDImageFramePool *framePool = [self.providerFramePoolMap objectForKey:provider]; + if (!framePool) { + SD_UNLOCK(_providerFramePoolMapLock); + return; + } + framePool.registerCount -= 1; + if (framePool.registerCount == 0) { + [self.providerFramePoolMap removeObjectForKey:provider]; + } + SD_UNLOCK(_providerFramePoolMapLock); +} + +- (void)prefetchFrameAtIndex:(NSUInteger)index { + @synchronized (self) { + NSUInteger frameCount = self.frameBuffer.count; + if (frameCount > self.maxBufferCount) { + // Remove the frame buffer if need + // TODO, use LRU or better algorithm to detect which frames to clear + self.frameBuffer[@(index - 1)] = nil; + self.frameBuffer[@(index + 1)] = nil; + } + } + + if (self.fetchQueue.operationCount == 0) { + // Prefetch next frame in background queue + id animatedProvider = self.provider; + @weakify(self); + NSOperation *operation = [NSBlockOperation blockOperationWithBlock:^{ + @strongify(self); + if (!self) { + return; + } + UIImage *frame = [animatedProvider animatedImageFrameAtIndex:index]; + + [self setFrame:frame atIndex:index]; + }]; + [self.fetchQueue addOperation:operation]; + } +} + +- (void)setMaxConcurrentCount:(NSUInteger)maxConcurrentCount { + self.fetchQueue.maxConcurrentOperationCount = maxConcurrentCount; +} + +- (NSUInteger)currentFrameCount { + NSUInteger frameCount = 0; + @synchronized (self) { + frameCount = self.frameBuffer.count; + } + return frameCount; +} + +- (void)setFrame:(UIImage *)frame atIndex:(NSUInteger)index { + @synchronized (self) { + self.frameBuffer[@(index)] = frame; + } +} + +- (UIImage *)frameAtIndex:(NSUInteger)index { + UIImage *frame; + @synchronized (self) { + frame = self.frameBuffer[@(index)]; + } + return frame; +} + +- (void)removeFrameAtIndex:(NSUInteger)index { + @synchronized (self) { + self.frameBuffer[@(index)] = nil; + } +} + +- (void)removeAllFrames { + @synchronized (self) { + [self.frameBuffer removeAllObjects]; + } +} + +@end diff --git a/Samples/Cordova/ExampleProject/platforms/ios/Pods/Target Support Files/CleverTap-iOS-SDK/ResourceBundle-CleverTapSDK-CleverTap-iOS-SDK-Info.plist b/Samples/Cordova/ExampleProject/platforms/ios/Pods/Target Support Files/CleverTap-iOS-SDK/ResourceBundle-CleverTapSDK-CleverTap-iOS-SDK-Info.plist index 68bba0b5..9bb75d24 100644 --- a/Samples/Cordova/ExampleProject/platforms/ios/Pods/Target Support Files/CleverTap-iOS-SDK/ResourceBundle-CleverTapSDK-CleverTap-iOS-SDK-Info.plist +++ b/Samples/Cordova/ExampleProject/platforms/ios/Pods/Target Support Files/CleverTap-iOS-SDK/ResourceBundle-CleverTapSDK-CleverTap-iOS-SDK-Info.plist @@ -13,7 +13,7 @@ CFBundlePackageType BNDL CFBundleShortVersionString - 4.2.0 + 5.1.2 CFBundleSignature ???? CFBundleVersion diff --git a/Samples/Cordova/ExampleProject/platforms/ios/cordova/Api.js b/Samples/Cordova/ExampleProject/platforms/ios/cordova/Api.js index 5532c19c..20413865 100644 --- a/Samples/Cordova/ExampleProject/platforms/ios/cordova/Api.js +++ b/Samples/Cordova/ExampleProject/platforms/ios/cordova/Api.js @@ -17,690 +17,4 @@ under the License. */ -/* jslint node: true */ - -/** - * @todo update coho to update this line. - * @todo use `package.json` instead but first - * figure out how this fit in with the platform-centered workflow structure. - * This workflow would not have the `package.json` file. - */ -// Coho updates this line -const VERSION = '6.2.0'; - -const fs = require('fs-extra'); -const path = require('path'); -const unorm = require('unorm'); -const projectFile = require('./lib/projectFile'); -const check_reqs = require('./lib/check_reqs'); -const CordovaError = require('cordova-common').CordovaError; -const CordovaLogger = require('cordova-common').CordovaLogger; -const events = require('cordova-common').events; -const PluginManager = require('cordova-common').PluginManager; -const util = require('util'); -const xcode = require('xcode'); -const ConfigParser = require('cordova-common').ConfigParser; - -function setupEvents (externalEventEmitter) { - if (externalEventEmitter) { - // This will make the platform internal events visible outside - events.forwardEventsTo(externalEventEmitter); - } else { - // There is no logger if external emitter is not present, - // so attach a console logger - CordovaLogger.get().subscribe(events); - } -} - -function getVariableSpec (spec, options) { - return spec.includes('$') ? options.cli_variables[spec.replace('$', '')] : spec; -} - -/** - * Creates a new PlatformApi instance. - * - * @param {String} [platform] Platform name, used for backward compatibility - * w/ PlatformPoly (CordovaLib). - * @param {String} [platformRootDir] Platform root location, used for backward - * compatibility w/ PlatformPoly (CordovaLib). - * @param {EventEmitter} [events] An EventEmitter instance that will be used for - * logging purposes. If no EventEmitter provided, all events will be logged to - * console - */ -function Api (platform, platformRootDir, events) { - // 'platform' property is required as per PlatformApi spec - this.platform = platform || 'ios'; - this.root = platformRootDir || path.resolve(__dirname, '..'); - - setupEvents(events); - - let xcodeProjDir; - let xcodeCordovaProj; - - try { - const xcodeProjDir_array = fs.readdirSync(this.root).filter(e => e.match(/\.xcodeproj$/i)); - if (xcodeProjDir_array.length > 1) { - for (let x = 0; x < xcodeProjDir_array.length; x++) { - if (xcodeProjDir_array[x].substring(0, 2) === '._') { - xcodeProjDir_array.splice(x, 1); - } - } - } - xcodeProjDir = xcodeProjDir_array[0]; - - if (!xcodeProjDir) { - throw new CordovaError(`The provided path "${this.root}" is not a Cordova iOS project.`); - } - - const cordovaProjName = xcodeProjDir.substring(xcodeProjDir.lastIndexOf(path.sep) + 1, xcodeProjDir.indexOf('.xcodeproj')); - xcodeCordovaProj = path.join(this.root, cordovaProjName); - } catch (e) { - throw new CordovaError(`The provided path "${this.root}" is not a Cordova iOS project.`); - } - - this.locations = { - root: this.root, - www: path.join(this.root, 'www'), - platformWww: path.join(this.root, 'platform_www'), - configXml: path.join(xcodeCordovaProj, 'config.xml'), - defaultConfigXml: path.join(this.root, 'cordova/defaults.xml'), - pbxproj: path.join(this.root, xcodeProjDir, 'project.pbxproj'), - xcodeProjDir: path.join(this.root, xcodeProjDir), - xcodeCordovaProj - }; -} - -/** - * Creates platform in a specified directory. - * - * @param {String} destination Destination directory, where install platform to - * @param {ConfigParser} [config] ConfigParser instance, used to retrieve - * project creation options, such as package id and project name. - * @param {Object} [options] An options object. The most common options are: - * @param {String} [options.customTemplate] A path to custom template, that - * should override the default one from platform. - * @param {Boolean} [options.link] Flag that indicates that platform's - * sources will be linked to installed platform instead of copying. - * @param {EventEmitter} [events] An EventEmitter instance that will be used for - * logging purposes. If no EventEmitter provided, all events will be logged to - * console - * - * @return {Promise} Promise either fulfilled with PlatformApi - * instance or rejected with CordovaError. - */ -Api.createPlatform = (destination, config, options, events) => { - setupEvents(events); - - // CB-6992 it is necessary to normalize characters - // because node and shell scripts handles unicode symbols differently - // We need to normalize the name to NFD form since iOS uses NFD unicode form - const name = unorm.nfd(config.name()); - let result; - try { - result = require('../../../lib/create') - .createProject(destination, config.getAttribute('ios-CFBundleIdentifier') || config.packageName(), name, options, config) - .then(() => { - // after platform is created we return Api instance based on new Api.js location - // This is required to correctly resolve paths in the future api calls - const PlatformApi = require(path.resolve(destination, 'cordova/Api')); - return new PlatformApi('ios', destination, events); - }); - } catch (e) { - events.emit('error', 'createPlatform is not callable from the iOS project API.'); - throw e; - } - return result; -}; - -/** - * Updates already installed platform. - * - * @param {String} destination Destination directory, where platform installed - * @param {Object} [options] An options object. The most common options are: - * @param {String} [options.customTemplate] A path to custom template, that - * should override the default one from platform. - * @param {Boolean} [options.link] Flag that indicates that platform's - * sources will be linked to installed platform instead of copying. - * @param {EventEmitter} [events] An EventEmitter instance that will be used for - * logging purposes. If no EventEmitter provided, all events will be logged to - * console - * - * @return {Promise} Promise either fulfilled with PlatformApi - * instance or rejected with CordovaError. - */ -Api.updatePlatform = (destination, options, events) => { - setupEvents(events); - - let result; - try { - result = require('../../../lib/create') - .updateProject(destination, options) - .then(() => { - const PlatformApi = require(path.resolve(destination, 'cordova/Api')); - return new PlatformApi('ios', destination, events); - }); - } catch (e) { - events.emit('error', 'updatePlatform is not callable from the iOS project API, you will need to do this manually.'); - throw e; - } - return result; -}; - -/** - * Gets a CordovaPlatform object, that represents the platform structure. - * - * @return {CordovaPlatform} A structure that contains the description of - * platform's file structure and other properties of platform. - */ -Api.prototype.getPlatformInfo = function () { - const result = {}; - result.locations = this.locations; - result.root = this.root; - result.name = this.platform; - result.version = Api.version(); - result.projectConfig = new ConfigParser(this.locations.configXml); - - return result; -}; - -/** - * Updates installed platform with provided www assets and new app - * configuration. This method is required for CLI workflow and will be called - * each time before build, so the changes, made to app configuration and www - * code, will be applied to platform. - * - * @param {CordovaProject} cordovaProject A CordovaProject instance, that defines a - * project structure and configuration, that should be applied to platform - * (contains project's www location and ConfigParser instance for project's - * config). - * - * @return {Promise} Return a promise either fulfilled, or rejected with - * CordovaError instance. - */ -Api.prototype.prepare = function (cordovaProject) { - cordovaProject.projectConfig = new ConfigParser(cordovaProject.locations.rootConfigXml || cordovaProject.projectConfig.path); - - return require('./lib/prepare').prepare.call(this, cordovaProject); -}; - -/** - * Installs a new plugin into platform. It doesn't resolves plugin dependencies. - * - * @param {PluginInfo} plugin A PluginInfo instance that represents plugin - * that will be installed. - * @param {Object} installOptions An options object. Possible options below: - * @param {Boolean} installOptions.link: Flag that specifies that plugin - * sources will be symlinked to app's directory instead of copying (if - * possible). - * @param {Object} installOptions.variables An object that represents - * variables that will be used to install plugin. See more details on plugin - * variables in documentation: - * https://cordova.apache.org/docs/en/4.0.0/plugin_ref_spec.md.html - * - * @return {Promise} Return a promise either fulfilled, or rejected with - * CordovaError instance. - */ -Api.prototype.addPlugin = function (plugin, installOptions) { - const xcodeproj = projectFile.parse(this.locations); - - installOptions = installOptions || {}; - installOptions.variables = installOptions.variables || {}; - // Add PACKAGE_NAME variable into vars - if (!installOptions.variables.PACKAGE_NAME) { - installOptions.variables.PACKAGE_NAME = xcodeproj.getPackageName(); - } - - return PluginManager.get(this.platform, this.locations, xcodeproj) - .addPlugin(plugin, installOptions) - .then(() => { - if (plugin != null) { - const headerTags = plugin.getHeaderFiles(this.platform); - const bridgingHeaders = headerTags.filter(obj => obj.type === 'BridgingHeader'); - if (bridgingHeaders.length > 0) { - const project_dir = this.locations.root; - const project_name = this.locations.xcodeCordovaProj.split('/').pop(); - const BridgingHeader = require('./lib/BridgingHeader').BridgingHeader; - const bridgingHeaderFile = new BridgingHeader(path.join(project_dir, project_name, 'Bridging-Header.h')); - events.emit('verbose', 'Adding Bridging-Headers since the plugin contained with type="BridgingHeader"'); - bridgingHeaders.forEach(obj => { - const bridgingHeaderPath = path.basename(obj.src); - bridgingHeaderFile.addHeader(plugin.id, bridgingHeaderPath); - }); - bridgingHeaderFile.write(); - } - } - }) - .then(() => { - if (plugin != null) { - const podSpecs = plugin.getPodSpecs ? plugin.getPodSpecs(this.platform) : []; - const frameworkTags = plugin.getFrameworks(this.platform); - const frameworkPods = frameworkTags.filter(obj => obj.type === 'podspec'); - return this.addPodSpecs(plugin, podSpecs, frameworkPods, installOptions); - } - }) - // CB-11022 Return truthy value to prevent running prepare after - .then(() => true); -}; - -/** - * Removes an installed plugin from platform. - * - * Since method accepts PluginInfo instance as input parameter instead of plugin - * id, caller shoud take care of managing/storing PluginInfo instances for - * future uninstalls. - * - * @param {PluginInfo} plugin A PluginInfo instance that represents plugin - * that will be installed. - * - * @return {Promise} Return a promise either fulfilled, or rejected with - * CordovaError instance. - */ -Api.prototype.removePlugin = function (plugin, uninstallOptions) { - const xcodeproj = projectFile.parse(this.locations); - - return PluginManager.get(this.platform, this.locations, xcodeproj) - .removePlugin(plugin, uninstallOptions) - .then(() => { - if (plugin != null) { - const headerTags = plugin.getHeaderFiles(this.platform); - const bridgingHeaders = headerTags.filter(obj => obj.type === 'BridgingHeader'); - if (bridgingHeaders.length > 0) { - const project_dir = this.locations.root; - const project_name = this.locations.xcodeCordovaProj.split('/').pop(); - const BridgingHeader = require('./lib/BridgingHeader').BridgingHeader; - const bridgingHeaderFile = new BridgingHeader(path.join(project_dir, project_name, 'Bridging-Header.h')); - events.emit('verbose', 'Removing Bridging-Headers since the plugin contained with type="BridgingHeader"'); - bridgingHeaders.forEach(obj => { - const bridgingHeaderPath = path.basename(obj.src); - bridgingHeaderFile.removeHeader(plugin.id, bridgingHeaderPath); - }); - bridgingHeaderFile.write(); - } - } - }) - .then(() => { - if (plugin != null) { - const podSpecs = plugin.getPodSpecs ? plugin.getPodSpecs(this.platform) : []; - const frameworkTags = plugin.getFrameworks(this.platform); - const frameworkPods = frameworkTags.filter(obj => obj.type === 'podspec'); - return this.removePodSpecs(plugin, podSpecs, frameworkPods, uninstallOptions); - } - }) - // CB-11022 Return truthy value to prevent running prepare after - .then(() => true); -}; - -/** - * adding CocoaPods libraries - * - * @param {PluginInfo} plugin A PluginInfo instance that represents plugin - * that will be installed. - * @param {Object} podSpecs: the return value of plugin.getPodSpecs(this.platform) - * @param {Object} frameworkPods: framework tags object with type === 'podspec' - * @return {Promise} Return a promise - */ - -Api.prototype.addPodSpecs = function (plugin, podSpecs, frameworkPods, installOptions) { - const project_dir = this.locations.root; - const project_name = this.locations.xcodeCordovaProj.split('/').pop(); - const minDeploymentTarget = this.getPlatformInfo().projectConfig.getPreference('deployment-target', 'ios'); - - const Podfile = require('./lib/Podfile').Podfile; - const PodsJson = require('./lib/PodsJson').PodsJson; - const podsjsonFile = new PodsJson(path.join(project_dir, PodsJson.FILENAME)); - const podfileFile = new Podfile(path.join(project_dir, Podfile.FILENAME), project_name, minDeploymentTarget); - - if (podSpecs.length) { - events.emit('verbose', 'Adding pods since the plugin contained '); - podSpecs.forEach(obj => { - // declarations - if (obj.declarations) { - Object.keys(obj.declarations).forEach(key => { - if (obj.declarations[key] === 'true') { - const declaration = Podfile.proofDeclaration(key); - const podJson = { - declaration - }; - const val = podsjsonFile.getDeclaration(declaration); - if (val) { - podsjsonFile.incrementDeclaration(declaration); - } else { - podJson.count = 1; - podsjsonFile.setJsonDeclaration(declaration, podJson); - podfileFile.addDeclaration(podJson.declaration); - } - } - }); - } - - // sources - if (obj.sources) { - Object.keys(obj.sources).forEach(key => { - const podJson = { - source: obj.sources[key].source - }; - const val = podsjsonFile.getSource(key); - if (val) { - podsjsonFile.incrementSource(key); - } else { - podJson.count = 1; - podsjsonFile.setJsonSource(key, podJson); - podfileFile.addSource(podJson.source); - } - }); - } - - // libraries - if (obj.libraries) { - Object.keys(obj.libraries).forEach(key => { - const podJson = Object.assign({}, obj.libraries[key]); - if (podJson.spec) { - podJson.spec = getVariableSpec(podJson.spec, installOptions); - } - const val = podsjsonFile.getLibrary(key); - if (val) { - events.emit('warn', `${plugin.id} depends on ${podJson.name}, which may conflict with another plugin. ${podJson.name}@${val.spec} is already installed and was not overwritten.`); - podsjsonFile.incrementLibrary(key); - } else { - podJson.count = 1; - podsjsonFile.setJsonLibrary(key, podJson); - podfileFile.addSpec(podJson.name, podJson); - } - }); - } - }); - } - - if (frameworkPods.length) { - events.emit('warn', '"framework" tag with type "podspec" is deprecated and will be removed. Please use the "podspec" tag.'); - events.emit('verbose', 'Adding pods since the plugin contained (s) with type="podspec"'); - frameworkPods.forEach(obj => { - const spec = getVariableSpec(obj.spec, installOptions); - const podJson = { - name: obj.src, - type: obj.type, - spec - }; - - const val = podsjsonFile.getLibrary(podJson.name); - if (val) { // found - if (podJson.spec !== val.spec) { // exists, different spec, print warning - events.emit('warn', `${plugin.id} depends on ${podJson.name}@${podJson.spec}, which conflicts with another plugin. ${podJson.name}@${val.spec} is already installed and was not overwritten.`); - } - // increment count, but don't add in Podfile because it already exists - podsjsonFile.incrementLibrary(podJson.name); - } else { // not found, write new - podJson.count = 1; - podsjsonFile.setJsonLibrary(podJson.name, podJson); - // add to Podfile - podfileFile.addSpec(podJson.name, podJson.spec); - } - }); - } - - if (podSpecs.length > 0 || frameworkPods.length > 0) { - // now that all the pods have been processed, write to pods.json - podsjsonFile.write(); - - // only write and pod install if the Podfile changed - if (podfileFile.isDirty()) { - podfileFile.write(); - events.emit('verbose', 'Running `pod install` (to install plugins)'); - projectFile.purgeProjectFileCache(this.locations.root); - - return podfileFile.install(check_reqs.check_cocoapods) - .then(() => this.setSwiftVersionForCocoaPodsLibraries(podsjsonFile)); - } else { - events.emit('verbose', 'Podfile unchanged, skipping `pod install`'); - } - } - return Promise.resolve(); -}; - -/** - * removing CocoaPods libraries - * - * @param {PluginInfo} plugin A PluginInfo instance that represents plugin - * that will be installed. - * @param {Object} podSpecs: the return value of plugin.getPodSpecs(this.platform) - * @param {Object} frameworkPods: framework tags object with type === 'podspec' - * @return {Promise} Return a promise - */ - -Api.prototype.removePodSpecs = function (plugin, podSpecs, frameworkPods, uninstallOptions) { - const project_dir = this.locations.root; - const project_name = this.locations.xcodeCordovaProj.split('/').pop(); - - const Podfile = require('./lib/Podfile').Podfile; - const PodsJson = require('./lib/PodsJson').PodsJson; - const podsjsonFile = new PodsJson(path.join(project_dir, PodsJson.FILENAME)); - const podfileFile = new Podfile(path.join(project_dir, Podfile.FILENAME), project_name); - - if (podSpecs.length) { - events.emit('verbose', 'Adding pods since the plugin contained '); - podSpecs.forEach(obj => { - // declarations - Object.keys(obj.declarations).forEach(key => { - if (obj.declarations[key] === 'true') { - const declaration = Podfile.proofDeclaration(key); - const podJson = { - declaration - }; - const val = podsjsonFile.getDeclaration(declaration); - if (val) { - podsjsonFile.decrementDeclaration(declaration); - } else { - const message = util.format('plugin \"%s\" declaration \"%s\" does not seem to be in pods.json, nothing to remove. Will attempt to remove from Podfile.', plugin.id, podJson.declaration); /* eslint no-useless-escape : 0 */ - events.emit('verbose', message); - } - if (!val || val.count === 0) { - podfileFile.removeDeclaration(podJson.declaration); - } - } - }); - // sources - Object.keys(obj.sources).forEach(key => { - const podJson = { - source: obj.sources[key].source - }; - const val = podsjsonFile.getSource(key); - if (val) { - podsjsonFile.decrementSource(key); - } else { - const message = util.format('plugin \"%s\" source \"%s\" does not seem to be in pods.json, nothing to remove. Will attempt to remove from Podfile.', plugin.id, podJson.source); /* eslint no-useless-escape : 0 */ - events.emit('verbose', message); - } - if (!val || val.count === 0) { - podfileFile.removeSource(podJson.source); - } - }); - // libraries - Object.keys(obj.libraries).forEach(key => { - const podJson = Object.assign({}, obj.libraries[key]); - if (podJson.spec) { - podJson.spec = getVariableSpec(podJson.spec, uninstallOptions); - } - const val = podsjsonFile.getLibrary(key); - if (val) { - podsjsonFile.decrementLibrary(key); - } else { - const message = util.format('plugin \"%s\" podspec \"%s\" does not seem to be in pods.json, nothing to remove. Will attempt to remove from Podfile.', plugin.id, podJson.name); /* eslint no-useless-escape : 0 */ - events.emit('verbose', message); - } - if (!val || val.count === 0) { - podfileFile.removeSpec(podJson.name); - } - }); - }); - } - - if (frameworkPods.length) { - events.emit('warn', '"framework" tag with type "podspec" is deprecated and will be removed. Please use the "podspec" tag.'); - events.emit('verbose', 'Adding pods since the plugin contained (s) with type=\"podspec\"'); /* eslint no-useless-escape : 0 */ - frameworkPods.forEach(obj => { - const spec = getVariableSpec(obj.spec, uninstallOptions); - const podJson = { - name: obj.src, - type: obj.type, - spec - }; - - const val = podsjsonFile.getLibrary(podJson.name); - if (val) { // found, decrement count - podsjsonFile.decrementLibrary(podJson.name); - } else { // not found (perhaps a sync error) - const message = util.format('plugin \"%s\" podspec \"%s\" does not seem to be in pods.json, nothing to remove. Will attempt to remove from Podfile.', plugin.id, podJson.name); /* eslint no-useless-escape : 0 */ - events.emit('verbose', message); - } - - // always remove from the Podfile - podfileFile.removeSpec(podJson.name); - }); - } - - if (podSpecs.length > 0 || frameworkPods.length > 0) { - // now that all the pods have been processed, write to pods.json - podsjsonFile.write(); - - if (podfileFile.isDirty()) { - podfileFile.write(); - events.emit('verbose', 'Running `pod install` (to uninstall pods)'); - - return podfileFile.install(check_reqs.check_cocoapods) - .then(() => this.setSwiftVersionForCocoaPodsLibraries(podsjsonFile)); - } else { - events.emit('verbose', 'Podfile unchanged, skipping `pod install`'); - } - } - return Promise.resolve(); -}; - -/** - * set Swift Version for all CocoaPods libraries - * - * @param {PodsJson} podsjsonFile A PodsJson instance that represents pods.json - */ - -Api.prototype.setSwiftVersionForCocoaPodsLibraries = function (podsjsonFile) { - let __dirty = false; - return check_reqs.check_cocoapods().then(toolOptions => { - if (toolOptions.ignore) { - events.emit('verbose', '=== skip Swift Version Settings For Cocoapods Libraries'); - } else { - const podPbxPath = path.join(this.root, 'Pods', 'Pods.xcodeproj', 'project.pbxproj'); - const podXcodeproj = xcode.project(podPbxPath); - podXcodeproj.parseSync(); - const podTargets = podXcodeproj.pbxNativeTargetSection(); - const podConfigurationList = podXcodeproj.pbxXCConfigurationList(); - const podConfigs = podXcodeproj.pbxXCBuildConfigurationSection(); - - const libraries = podsjsonFile.getLibraries(); - Object.keys(libraries).forEach(key => { - const podJson = libraries[key]; - const name = podJson.name; - const swiftVersion = podJson['swift-version']; - if (swiftVersion) { - __dirty = true; - Object.keys(podTargets) - .filter(targetKey => podTargets[targetKey].productName === name) - .map(targetKey => podTargets[targetKey].buildConfigurationList) - .map(buildConfigurationListId => podConfigurationList[buildConfigurationListId]) - .map(buildConfigurationList => buildConfigurationList.buildConfigurations) - .reduce((acc, buildConfigurations) => acc.concat(buildConfigurations), []) - .map(buildConfiguration => buildConfiguration.value) - .forEach(buildId => { - __dirty = true; - podConfigs[buildId].buildSettings.SWIFT_VERSION = swiftVersion; - }); - } - }); - if (__dirty) { - fs.writeFileSync(podPbxPath, podXcodeproj.writeSync(), 'utf-8'); - } - } - }); -}; - -/** - * Builds an application package for current platform. - * - * @param {Object} buildOptions A build options. This object's structure is - * highly depends on platform's specific. The most common options are: - * @param {Boolean} buildOptions.debug Indicates that packages should be - * built with debug configuration. This is set to true by default unless the - * 'release' option is not specified. - * @param {Boolean} buildOptions.release Indicates that packages should be - * built with release configuration. If not set to true, debug configuration - * will be used. - * @param {Boolean} buildOptions.device Specifies that built app is intended - * to run on device - * @param {Boolean} buildOptions.emulator: Specifies that built app is - * intended to run on emulator - * @param {String} buildOptions.target Specifies the device id that will be - * used to run built application. - * @param {Boolean} buildOptions.nobuild Indicates that this should be a - * dry-run call, so no build artifacts will be produced. - * @param {String[]} buildOptions.archs Specifies chip architectures which - * app packages should be built for. List of valid architectures is depends on - * platform. - * @param {String} buildOptions.buildConfig The path to build configuration - * file. The format of this file is depends on platform. - * @param {String[]} buildOptions.argv Raw array of command-line arguments, - * passed to `build` command. The purpose of this property is to pass a - * platform-specific arguments, and eventually let platform define own - * arguments processing logic. - * - * @return {Promise} Return a promise either fulfilled, or rejected with - * CordovaError instance. - */ -Api.prototype.build = function (buildOptions) { - return check_reqs.run() - .then(() => require('./lib/build').run.call(this, buildOptions)); -}; - -/** - * Builds an application package for current platform and runs it on - * specified/default device. If no 'device'/'emulator'/'target' options are - * specified, then tries to run app on default device if connected, otherwise - * runs the app on emulator. - * - * @param {Object} runOptions An options object. The structure is the same - * as for build options. - * - * @return {Promise} A promise either fulfilled if package was built and ran - * successfully, or rejected with CordovaError. - */ -Api.prototype.run = function (runOptions) { - return check_reqs.run() - .then(() => require('./lib/run').run.call(this, runOptions)); -}; - -/** - * Cleans out the build artifacts from platform's directory. - * - * @return {Promise} Return a promise either fulfilled, or rejected with - * CordovaError. - */ -Api.prototype.clean = function (cleanOptions) { - return check_reqs.run() - .then(() => require('./lib/clean').run.call(this, cleanOptions)) - .then(() => require('./lib/prepare').clean.call(this, cleanOptions)); -}; - -/** - * Performs a requirements check for current platform. Each platform defines its - * own set of requirements, which should be resolved before platform can be - * built successfully. - * - * @return {Promise} Promise, resolved with set of Requirement - * objects for current platform. - */ -Api.prototype.requirements = function () { - return check_reqs.check_all(); -}; - -Api.version = function () { - return VERSION; -}; - -module.exports = Api; +module.exports = require('cordova-ios'); diff --git a/Samples/Cordova/ExampleProject/platforms/ios/cordova/apple_ios_version b/Samples/Cordova/ExampleProject/platforms/ios/cordova/apple_ios_version index 5fee9e85..cf1bf353 100755 --- a/Samples/Cordova/ExampleProject/platforms/ios/cordova/apple_ios_version +++ b/Samples/Cordova/ExampleProject/platforms/ios/cordova/apple_ios_version @@ -19,9 +19,6 @@ under the License. */ -var versions = require('./lib/versions.js'); +const versions = require('./lib/versions.js'); -versions.get_apple_ios_version().catch(err => { - console.log(err); - process.exit(2); -}); +versions.printOrDie('apple_ios'); diff --git a/Samples/Cordova/ExampleProject/platforms/ios/cordova/apple_osx_version b/Samples/Cordova/ExampleProject/platforms/ios/cordova/apple_osx_version index 062d8b7f..434d1ead 100755 --- a/Samples/Cordova/ExampleProject/platforms/ios/cordova/apple_osx_version +++ b/Samples/Cordova/ExampleProject/platforms/ios/cordova/apple_osx_version @@ -19,9 +19,6 @@ under the License. */ -var versions = require('./lib/versions.js'); +const versions = require('./lib/versions.js'); -versions.get_apple_osx_version().catch(err => { - console.log(err); - process.exit(2); -}); +versions.printOrDie('apple_osx'); diff --git a/Samples/Cordova/ExampleProject/platforms/ios/cordova/apple_xcode_version b/Samples/Cordova/ExampleProject/platforms/ios/cordova/apple_xcode_version index 4656e385..18af513a 100755 --- a/Samples/Cordova/ExampleProject/platforms/ios/cordova/apple_xcode_version +++ b/Samples/Cordova/ExampleProject/platforms/ios/cordova/apple_xcode_version @@ -19,14 +19,6 @@ under the License. */ -var versions = require('./lib/versions.js'); +const versions = require('./lib/versions.js'); -versions.get_apple_xcode_version().then( - version => { - console.log(version); - }, - err => { - console.error(err); - process.exit(2); - } -); +versions.printOrDie('apple_xcode'); diff --git a/Samples/Cordova/ExampleProject/platforms/ios/cordova/build-extras.xcconfig b/Samples/Cordova/ExampleProject/platforms/ios/cordova/build-extras.xcconfig index 7e631112..e69de29b 100644 --- a/Samples/Cordova/ExampleProject/platforms/ios/cordova/build-extras.xcconfig +++ b/Samples/Cordova/ExampleProject/platforms/ios/cordova/build-extras.xcconfig @@ -1,22 +0,0 @@ -// -// Licensed to the Apache Software Foundation (ASF) under one -// or more contributor license agreements. See the NOTICE file -// distributed with this work for additional information -// regarding copyright ownership. The ASF licenses this file -// to you under the Apache License, Version 2.0 (the -// "License"); you may not use this file except in compliance -// with the License. You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, -// software distributed under the License is distributed on an -// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY -// KIND, either express or implied. See the License for the -// specific language governing permissions and limitations -// under the License. -// - -// -// Auto-generated config file to override configuration files (build-release/build-debug). -// diff --git a/Samples/Cordova/ExampleProject/platforms/ios/cordova/defaults.xml b/Samples/Cordova/ExampleProject/platforms/ios/cordova/defaults.xml index 8733ce39..1a7287d2 100644 --- a/Samples/Cordova/ExampleProject/platforms/ios/cordova/defaults.xml +++ b/Samples/Cordova/ExampleProject/platforms/ios/cordova/defaults.xml @@ -23,18 +23,12 @@ - - - - - - diff --git a/Samples/Cordova/ExampleProject/platforms/ios/cordova/lib/list-devices b/Samples/Cordova/ExampleProject/platforms/ios/cordova/lib/list-devices index 5f89e21b..81c3e3d7 100755 --- a/Samples/Cordova/ExampleProject/platforms/ios/cordova/lib/list-devices +++ b/Samples/Cordova/ExampleProject/platforms/ios/cordova/lib/list-devices @@ -19,7 +19,7 @@ under the License. */ -const { run } = require('./listDevices'); +const { run } = require('cordova-ios/lib/listDevices'); run().then(devices => { devices.forEach(device => { diff --git a/Samples/Cordova/ExampleProject/platforms/ios/cordova/lib/list-emulator-images b/Samples/Cordova/ExampleProject/platforms/ios/cordova/lib/list-emulator-images index db9b72af..b422269c 100755 --- a/Samples/Cordova/ExampleProject/platforms/ios/cordova/lib/list-emulator-images +++ b/Samples/Cordova/ExampleProject/platforms/ios/cordova/lib/list-emulator-images @@ -19,7 +19,7 @@ under the License. */ -const { run } = require('./listEmulatorImages'); +const { run } = require('cordova-ios/lib/listEmulatorImages'); run().then(names => { names.forEach(name => { diff --git a/Samples/Cordova/ExampleProject/platforms/ios/cordova/lib/prepare.js b/Samples/Cordova/ExampleProject/platforms/ios/cordova/lib/prepare.js index 7badf9fa..fa703117 100644 --- a/Samples/Cordova/ExampleProject/platforms/ios/cordova/lib/prepare.js +++ b/Samples/Cordova/ExampleProject/platforms/ios/cordova/lib/prepare.js @@ -997,12 +997,8 @@ function processAccessAndAllowNavigationEntries (config) { null is returned if the URL cannot be parsed, or is to be skipped for ATS. */ function parseWhitelistUrlForATS (url, options) { - // @todo 'url.parse' was deprecated since v11.0.0. Use 'url.URL' constructor instead. - const href = URL.parse(url); // eslint-disable-line - const retObj = {}; - retObj.Hostname = href.hostname; - // Guiding principle: we only set values in retObj if they are NOT the default + const retObj = {}; if (url === '*') { retObj.Hostname = '*'; @@ -1026,27 +1022,33 @@ function parseWhitelistUrlForATS (url, options) { return retObj; } - if (!retObj.Hostname) { - // check origin, if it allows subdomains (wildcard in hostname), we set NSIncludesSubdomains to YES. Default is NO - const subdomain1 = '/*.'; // wildcard in hostname - const subdomain2 = '*://*.'; // wildcard in hostname and protocol - const subdomain3 = '*://'; // wildcard in protocol only - if (!href.pathname) { - return null; - } else if (href.pathname.indexOf(subdomain1) === 0) { - retObj.NSIncludesSubdomains = true; - retObj.Hostname = href.pathname.substring(subdomain1.length); - } else if (href.pathname.indexOf(subdomain2) === 0) { - retObj.NSIncludesSubdomains = true; - retObj.Hostname = href.pathname.substring(subdomain2.length); - } else if (href.pathname.indexOf(subdomain3) === 0) { - retObj.Hostname = href.pathname.substring(subdomain3.length); + let href = null; + try { + href = new URL.URL(url); + } catch (e) { + const scheme = url.split(':')[0]; + // If there's a wildcard in the protocol, the URL will fail to parse + // Replace it with "http" to allow insecure loads + if (scheme.includes('*')) { + href = new URL.URL(url.replace(scheme, 'http')); } else { - // Handling "scheme:*" case to avoid creating of a blank key in NSExceptionDomains. return null; } } + retObj.Hostname = href.hostname; + + // Handling "scheme:*" case to avoid creating of a blank key in NSExceptionDomains. + if (retObj.Hostname === '') { + return null; + } + + // check origin, if it allows subdomains (wildcard in hostname), we set NSIncludesSubdomains to YES. Default is NO + if (retObj.Hostname.startsWith('*.')) { + retObj.NSIncludesSubdomains = true; + retObj.Hostname = href.hostname.substring(2); + } + if (options.minimum_tls_version && options.minimum_tls_version !== 'TLSv1.2') { // default is TLSv1.2 retObj.NSExceptionMinimumTLSVersion = options.minimum_tls_version; } @@ -1064,8 +1066,6 @@ function parseWhitelistUrlForATS (url, options) { // if the scheme is HTTP, we set NSExceptionAllowsInsecureHTTPLoads to YES. Default is NO if (href.protocol === 'http:') { retObj.NSExceptionAllowsInsecureHTTPLoads = true; - } else if (!href.protocol && href.pathname.indexOf('*:/') === 0) { // wilcard in protocol - retObj.NSExceptionAllowsInsecureHTTPLoads = true; } return retObj; diff --git a/Samples/Cordova/ExampleProject/platforms/ios/cordova/version b/Samples/Cordova/ExampleProject/platforms/ios/cordova/version index 6bb657b4..7234670b 100755 --- a/Samples/Cordova/ExampleProject/platforms/ios/cordova/version +++ b/Samples/Cordova/ExampleProject/platforms/ios/cordova/version @@ -19,13 +19,6 @@ under the License. */ -/* - - Returns the VERSION of CordovaLib used. - Note: it does not work if the --shared option was used to create the project. -*/ - -// Coho updates this line const Api = require('./Api'); console.log(Api.version()); diff --git a/Samples/Cordova/ExampleProject/platforms/ios/ios.json b/Samples/Cordova/ExampleProject/platforms/ios/ios.json index 2940bbad..6ed83783 100644 --- a/Samples/Cordova/ExampleProject/platforms/ios/ios.json +++ b/Samples/Cordova/ExampleProject/platforms/ios/ios.json @@ -9,13 +9,13 @@ "parents": { "CleverTapAccountID": [ { - "xml": "TEST-R78-ZZK-955Z", + "xml": "TEST-R55-999-486Z", "count": 1 } ], "CleverTapToken": [ { - "xml": "TEST-311-ba2", + "xml": "TEST-ccc-552", "count": 1 } ], @@ -61,8 +61,8 @@ }, "installed_plugins": { "clevertap-cordova": { - "CLEVERTAP_ACCOUNT_ID": "TEST-R78-ZZK-955Z", - "CLEVERTAP_TOKEN": "TEST-311-ba2", + "CLEVERTAP_ACCOUNT_ID": "TEST-R55-999-486Z", + "CLEVERTAP_TOKEN": "TEST-ccc-552", "CLEVERTAP_REGION": " ", "PACKAGE_NAME": "com.clevertap.example" }, @@ -82,7 +82,7 @@ } ], "plugin_metadata": { - "clevertap-cordova": "2.5.1", + "clevertap-cordova": "2.6.2", "cordova-android-support-gradle-release": "3.0.1" } } diff --git a/Samples/Cordova/ExampleProject/platforms/ios/platform_www/cordova.js b/Samples/Cordova/ExampleProject/platforms/ios/platform_www/cordova.js index 37f329f5..42494378 100644 --- a/Samples/Cordova/ExampleProject/platforms/ios/platform_www/cordova.js +++ b/Samples/Cordova/ExampleProject/platforms/ios/platform_www/cordova.js @@ -1,5 +1,5 @@ -// Platform: ios -// cordova-js rel/6.0.0-10-g07379820 +// Platform: cordova-ios +// cordova-js 6.1.0 /* Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file @@ -19,7 +19,7 @@ under the License. */ ;(function() { -var PLATFORM_VERSION_BUILD_LABEL = '6.2.0'; +var PLATFORM_VERSION_BUILD_LABEL = '7.0.0'; // file: src/scripts/require.js var require; var define; @@ -866,7 +866,7 @@ module.exports = channel; }); -// file: ../cordova-ios/cordova-js-src/exec.js +// file: ../../cordova-js-src/exec.js define("cordova/exec", function(require, exports, module) { /** @@ -1233,7 +1233,7 @@ exports.reset(); }); -// file: ../cordova-ios/cordova-js-src/platform.js +// file: ../../cordova-js-src/platform.js define("cordova/platform", function(require, exports, module) { module.exports = { @@ -1257,7 +1257,7 @@ module.exports = { }); -// file: ../cordova-ios/cordova-js-src/plugin/ios/console.js +// file: ../../cordova-js-src/plugin/ios/console.js define("cordova/plugin/ios/console", function(require, exports, module) { // ------------------------------------------------------------------------------ @@ -1428,7 +1428,7 @@ for (var key in console) { }); -// file: ../cordova-ios/cordova-js-src/plugin/ios/launchscreen.js +// file: ../../cordova-js-src/plugin/ios/launchscreen.js define("cordova/plugin/ios/launchscreen", function(require, exports, module) { var exec = require('cordova/exec'); @@ -1446,7 +1446,7 @@ module.exports = launchscreen; }); -// file: ../cordova-ios/cordova-js-src/plugin/ios/logger.js +// file: ../../cordova-js-src/plugin/ios/logger.js define("cordova/plugin/ios/logger", function(require, exports, module) { // ------------------------------------------------------------------------------ @@ -1779,7 +1779,7 @@ document.addEventListener('deviceready', logger.__onDeviceReady, false); }); -// file: ../cordova-ios/cordova-js-src/plugin/ios/wkwebkit.js +// file: ../../cordova-js-src/plugin/ios/wkwebkit.js define("cordova/plugin/ios/wkwebkit", function(require, exports, module) { var exec = require('cordova/exec'); diff --git a/Samples/Cordova/ExampleProject/platforms/ios/platform_www/cordova_plugins.js b/Samples/Cordova/ExampleProject/platforms/ios/platform_www/cordova_plugins.js index 3d4b9547..ac3631de 100644 --- a/Samples/Cordova/ExampleProject/platforms/ios/platform_www/cordova_plugins.js +++ b/Samples/Cordova/ExampleProject/platforms/ios/platform_www/cordova_plugins.js @@ -10,7 +10,7 @@ cordova.define('cordova/plugin_list', function(require, exports, module) { } ]; module.exports.metadata = { - "clevertap-cordova": "2.5.1", + "clevertap-cordova": "2.6.2", "cordova-android-support-gradle-release": "3.0.1" }; }); \ No newline at end of file diff --git a/Samples/Cordova/ExampleProject/platforms/ios/platform_www/plugins/clevertap-cordova/www/CleverTap.js b/Samples/Cordova/ExampleProject/platforms/ios/platform_www/plugins/clevertap-cordova/www/CleverTap.js index 6002b8aa..77b1e00b 100644 --- a/Samples/Cordova/ExampleProject/platforms/ios/platform_www/plugins/clevertap-cordova/www/CleverTap.js +++ b/Samples/Cordova/ExampleProject/platforms/ios/platform_www/plugins/clevertap-cordova/www/CleverTap.js @@ -7,6 +7,9 @@ cordova.define("clevertap-cordova.CleverTap", function(require, exports, module) // var CleverTap = function () { + const libName = 'Cordova'; + const libVersion = 20603; + cordova.exec(null, null, "CleverTapPlugin", "setLibrary", [libName, libVersion]); } /******************* @@ -60,8 +63,8 @@ CleverTap.prototype.setPushToken = function (token) { } // Sets the devices Xiaomi push token -CleverTap.prototype.setPushXiaomiToken = function (token) { - cordova.exec(null, null, "CleverTapPlugin", "setPushXiaomiTokenAsString", [token]); +CleverTap.prototype.setPushXiaomiToken = function (token,region) { + cordova.exec(null, null, "CleverTapPlugin", "setPushXiaomiTokenAsString", [token,region]); } // Sets the devices Baidu push token @@ -450,10 +453,22 @@ CleverTap.prototype.deleteInboxMessageForId = function (messageId) { cordova.exec(null, null, "CleverTapPlugin", "deleteInboxMessageForId", [messageId]); } +CleverTap.prototype.deleteInboxMessagesForIds = function (messageIds) { + cordova.exec(null, null, "CleverTapPlugin", "deleteInboxMessagesForIds", [messageIds]); +} + CleverTap.prototype.markReadInboxMessageForId = function (messageId) { cordova.exec(null, null, "CleverTapPlugin", "markReadInboxMessageForId", [messageId]); } +CleverTap.prototype.markReadInboxMessagesForIds = function (messageIds) { + cordova.exec(null, null, "CleverTapPlugin", "markReadInboxMessagesForIds", [messageIds]); +} + +CleverTap.prototype.dismissInbox= function () { + cordova.exec(null, null, "CleverTapPlugin", "dismissInbox", []); +} + CleverTap.prototype.pushInboxNotificationViewedEventForId = function (messageId) { cordova.exec(null, null, "CleverTapPlugin", "pushInboxNotificationViewedEventForId", [messageId]); } @@ -509,6 +524,9 @@ CleverTap.prototype.pushDisplayUnitClickedEventForID = function(unitId){ /**************************** * Feature Flag methods ****************************/ +/** + * @deprecated - Since version 2.7.0 and will be removed in the future versions of this SDK. + */ CleverTap.prototype.getFeatureFlag = function(name,defaultValue,successCallback){ cordova.exec(successCallback, null, "CleverTapPlugin", "getFeatureFlag", [name,defaultValue]); } @@ -516,54 +534,173 @@ CleverTap.prototype.getFeatureFlag = function(name,defaultValue,successCallback) /**************************** * Product Config methods ****************************/ +/** + * @deprecated - Since version 2.7.0 and will be removed in the future versions of this SDK. + */ CleverTap.prototype.setDefaultsMap = function(jsonMap){ cordova.exec(null, null, "CleverTapPlugin", "setDefaultsMap", [jsonMap]); } +/** + * @deprecated - Since version 2.7.0 and will be removed in the future versions of this SDK. + */ CleverTap.prototype.fetch = function(){ cordova.exec(null, null, "CleverTapPlugin", "fetch", []); } +/** + * @deprecated - Since version 2.7.0 and will be removed in the future versions of this SDK. + */ CleverTap.prototype.fetchWithMinimumFetchIntervalInSeconds = function(interval){ cordova.exec(null, null, "CleverTapPlugin", "fetchWithMinimumFetchIntervalInSeconds", [interval]); } +/** + * @deprecated - Since version 2.7.0 and will be removed in the future versions of this SDK. + */ CleverTap.prototype.activate = function(){ cordova.exec(null, null, "CleverTapPlugin", "activate", []); } +/** + * @deprecated - Since version 2.7.0 and will be removed in the future versions of this SDK. + */ CleverTap.prototype.fetchAndActivate = function(){ cordova.exec(null, null, "CleverTapPlugin", "fetchAndActivate", []); } +/** + * @deprecated - Since version 2.7.0 and will be removed in the future versions of this SDK. + */ CleverTap.prototype.setMinimumFetchIntervalInSeconds = function(interval){ cordova.exec(null, null, "CleverTapPlugin", "setMinimumFetchIntervalInSeconds", [interval]); } +/** + * @deprecated - Since version 2.7.0 and will be removed in the future versions of this SDK. + */ CleverTap.prototype.getLastFetchTimeStampInMillis = function(successCallback){ cordova.exec(successCallback, null, "CleverTapPlugin", "getLastFetchTimeStampInMillis", []); } +/** + * @deprecated - Since version 2.7.0 and will be removed in the future versions of this SDK. + */ CleverTap.prototype.getString = function(key,successCallback){ cordova.exec(successCallback, null, "CleverTapPlugin", "getString", [key]); } +/** + * @deprecated - Since version 2.7.0 and will be removed in the future versions of this SDK. + */ CleverTap.prototype.getBoolean = function(key,successCallback){ cordova.exec(successCallback, null, "CleverTapPlugin", "getBoolean", [key]); } +/** + * @deprecated - Since version 2.7.0 and will be removed in the future versions of this SDK. + */ CleverTap.prototype.getLong = function(key,successCallback){ cordova.exec(successCallback, null, "CleverTapPlugin", "getLong", [key]); } +/** + * @deprecated - Since version 2.7.0 and will be removed in the future versions of this SDK. + */ CleverTap.prototype.getDouble = function(key,successCallback){ cordova.exec(successCallback, null, "CleverTapPlugin", "getDouble", [key]); } +/** + * @deprecated - Since version 2.7.0 and will be removed in the future versions of this SDK. + */ CleverTap.prototype.reset = function(){ cordova.exec(null, null, "CleverTapPlugin", "reset", []); } + +/**************************** + * Product Experiences methods + ****************************/ + +/** + Uploads variables to the server. Requires Development/Debug build/configuration. +*/ +CleverTap.prototype.syncVariables = function(){ + cordova.exec(null, null, "CleverTapPlugin", "syncVariables", []); +} + +/** +Uploads variables to the server. +@param {boolean} isProduction Provide `true` if variables must be sync in Productuon build/configuration. +*/ +CleverTap.prototype.syncVariablesinProd = function(isProduction){ + cordova.exec(null, null, "CleverTapPlugin", "syncVariablesinProd", [isProduction]); +} + +/** +Forces variables to update from the server. +*/ +CleverTap.prototype.fetchVariables = function(successCallback){ + cordova.exec(successCallback, null, "CleverTapPlugin", "fetchVariables", []); +} + +/** +Create variables. +@param {object} variables The JSON Object specifying the varibles to be created. +*/ +CleverTap.prototype.defineVariables = function (variables) { + cordova.exec(null, null, "CleverTapPlugin", "defineVariables", [variables]); +} + +/** +Get a variable or a group for the specified name. +@param {string} name - name. +*/ +CleverTap.prototype.getVariable = function (name, successCallback) { + cordova.exec(successCallback, null, "CleverTapPlugin", "getVariable", [name]); +} + +/** +Get all variables via a JSON object. +*/ +CleverTap.prototype.getVariables = function (successCallback) { + cordova.exec(successCallback, null, "CleverTapPlugin", "getVariables", []); +} + + /** +Adds a callback to be invoked when variables are initialised with server values. Will be called each time new values are fetched. +@param {function} handler The callback to add +*/ +CleverTap.prototype.onVariablesChanged = function (handler) { + cordova.exec(handler, null, "CleverTapPlugin", "onVariablesChanged", []); +} + +/** +Called when the value of the variable changes. +@param {name} string the name of the variable +@param {function} handler The callback to add +*/ +CleverTap.prototype.onValueChanged = function (name, handler) { + cordova.exec(handler, null, "CleverTapPlugin", "onValueChanged", [name]); +} + +/**************************** + *Push Primer + ****************************/ + +CleverTap.prototype.promptPushPrimer = function(localInAppObject){ + cordova.exec(null, null, "CleverTapPlugin", "promptPushPrimer", [localInAppObject]); +} + +CleverTap.prototype.promptForPushPermission = function(showFallbackSettings){ + cordova.exec(null, null, "CleverTapPlugin", "promptForPushPermission", [showFallbackSettings]); +} + +CleverTap.prototype.isPushPermissionGranted = function(successCallback){ + cordova.exec(successCallback, null, "CleverTapPlugin", "isPushPermissionGranted", []); +} + function convertDateToEpochInProperties(items){ //Conversion of date object in suitable CleverTap format diff --git a/Samples/Cordova/ExampleProject/platforms/ios/pods.json b/Samples/Cordova/ExampleProject/platforms/ios/pods.json index 64913cfa..a63289d9 100644 --- a/Samples/Cordova/ExampleProject/platforms/ios/pods.json +++ b/Samples/Cordova/ExampleProject/platforms/ios/pods.json @@ -1,11 +1,19 @@ { "declarations": {}, - "sources": {}, + "sources": { + "https://github.com/CleverTap/clevertap-ios-sdk.git": { + "source": "https://github.com/CleverTap/clevertap-ios-sdk.git", + "count": 1 + }, + "https://github.com/CocoaPods/Specs.git": { + "source": "https://github.com/CocoaPods/Specs.git", + "count": 1 + } + }, "libraries": { "CleverTap-iOS-SDK": { "name": "CleverTap-iOS-SDK", - "type": "podspec", - "spec": "4.1.1", + "spec": "5.1.2", "count": 1 } } diff --git a/Samples/Cordova/ExampleProject/platforms/ios/www/cordova.js b/Samples/Cordova/ExampleProject/platforms/ios/www/cordova.js index 37f329f5..42494378 100644 --- a/Samples/Cordova/ExampleProject/platforms/ios/www/cordova.js +++ b/Samples/Cordova/ExampleProject/platforms/ios/www/cordova.js @@ -1,5 +1,5 @@ -// Platform: ios -// cordova-js rel/6.0.0-10-g07379820 +// Platform: cordova-ios +// cordova-js 6.1.0 /* Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file @@ -19,7 +19,7 @@ under the License. */ ;(function() { -var PLATFORM_VERSION_BUILD_LABEL = '6.2.0'; +var PLATFORM_VERSION_BUILD_LABEL = '7.0.0'; // file: src/scripts/require.js var require; var define; @@ -866,7 +866,7 @@ module.exports = channel; }); -// file: ../cordova-ios/cordova-js-src/exec.js +// file: ../../cordova-js-src/exec.js define("cordova/exec", function(require, exports, module) { /** @@ -1233,7 +1233,7 @@ exports.reset(); }); -// file: ../cordova-ios/cordova-js-src/platform.js +// file: ../../cordova-js-src/platform.js define("cordova/platform", function(require, exports, module) { module.exports = { @@ -1257,7 +1257,7 @@ module.exports = { }); -// file: ../cordova-ios/cordova-js-src/plugin/ios/console.js +// file: ../../cordova-js-src/plugin/ios/console.js define("cordova/plugin/ios/console", function(require, exports, module) { // ------------------------------------------------------------------------------ @@ -1428,7 +1428,7 @@ for (var key in console) { }); -// file: ../cordova-ios/cordova-js-src/plugin/ios/launchscreen.js +// file: ../../cordova-js-src/plugin/ios/launchscreen.js define("cordova/plugin/ios/launchscreen", function(require, exports, module) { var exec = require('cordova/exec'); @@ -1446,7 +1446,7 @@ module.exports = launchscreen; }); -// file: ../cordova-ios/cordova-js-src/plugin/ios/logger.js +// file: ../../cordova-js-src/plugin/ios/logger.js define("cordova/plugin/ios/logger", function(require, exports, module) { // ------------------------------------------------------------------------------ @@ -1779,7 +1779,7 @@ document.addEventListener('deviceready', logger.__onDeviceReady, false); }); -// file: ../cordova-ios/cordova-js-src/plugin/ios/wkwebkit.js +// file: ../../cordova-js-src/plugin/ios/wkwebkit.js define("cordova/plugin/ios/wkwebkit", function(require, exports, module) { var exec = require('cordova/exec'); diff --git a/Samples/Cordova/ExampleProject/platforms/ios/www/cordova_plugins.js b/Samples/Cordova/ExampleProject/platforms/ios/www/cordova_plugins.js index 3d4b9547..ac3631de 100644 --- a/Samples/Cordova/ExampleProject/platforms/ios/www/cordova_plugins.js +++ b/Samples/Cordova/ExampleProject/platforms/ios/www/cordova_plugins.js @@ -10,7 +10,7 @@ cordova.define('cordova/plugin_list', function(require, exports, module) { } ]; module.exports.metadata = { - "clevertap-cordova": "2.5.1", + "clevertap-cordova": "2.6.2", "cordova-android-support-gradle-release": "3.0.1" }; }); \ No newline at end of file diff --git a/Samples/Cordova/ExampleProject/platforms/ios/www/js/index.js b/Samples/Cordova/ExampleProject/platforms/ios/www/js/index.js index dad450f1..7e895f32 100644 --- a/Samples/Cordova/ExampleProject/platforms/ios/www/js/index.js +++ b/Samples/Cordova/ExampleProject/platforms/ios/www/js/index.js @@ -17,6 +17,31 @@ function log(param){ function setupButtons() { let eventsMap = [ + + ["title","Android 13 Push Primer"], + ["promptPushPrimer",()=> CleverTap.promptPushPrimer({ + inAppType: 'alert', + titleText: 'Get Notified', + messageText: + 'Please enable notifications on your device to use Push Notifications.', + followDeviceOrientation: true, + positiveBtnText: 'Allow', + negativeBtnText: 'Cancel', + backgroundColor: '#FFFFFF', + btnBorderColor: '#FF0000', + titleTextColor: '#0000FF', + messageTextColor: '#000000', + btnTextColor: '#FFFFFF', + btnBackgroundColor: '#0000FF', + btnBorderRadius: '5', + imageUrl:"https://icons.iconarchive.com/icons/treetog/junior/64/camera-icon.png", + fallbackToSettings: true + }) + ], + ["promptForPushPermission",()=> CleverTap.promptForPushPermission(true)], + ["isPushPermissionGranted",()=> CleverTap.isPushPermissionGranted(val => log("isPushPermissionGranted value is " + val))], + + ["title","Events"], ["record Event With Name", () => CleverTap.recordEventWithName("foo")], ["record Event With NameAndProps", () => CleverTap.recordEventWithNameAndProps("boo", {"bar": "zoo"})], @@ -94,6 +119,17 @@ function setupButtons() { ["title","Feature flag"], ["get Feature Flag", () => CleverTap.getFeatureFlag("test", true, val => log("Value is " + val))], + + ["title","Product Experiences"], + ["define variables", () => CleverTap.defineVariables({ + "cordova_var_string_ios": "cordova_var_string_value_ios" + })], + ["Sync Variables", () => CleverTap.syncVariables()], + ["get variables", () => CleverTap.getVariables(val => log("Variables are: " +val.cordova_var_map.cordova_var_map_nested.cordova_var_map_nested_float)) ], + ["get variable for name cordova_var_string_ios", () => CleverTap.getVariable("cordova_var_string_ios",val => log("Variable value for cordova_var_string_ios: " + val))], + ["fetch variables", () => CleverTap.fetchVariables(val => log("Fetch variables result is: " + val))], + ["add onVariablesChanged", () => CleverTap.onVariablesChanged(val => log("onVariablesChanged: " + val))], + ["add onValueChanged for variable cordova_var_string_ios ", () => CleverTap.onValueChanged("cordova_var_string_ios",val => log("onValueChanged: " + val))], ["title","Device Identifiers"], ["get CleverTap ID", () => CleverTap.getCleverTapID(val => log("getCleverTapID is " + val))], @@ -358,4 +394,4 @@ document.addEventListener( false ) //TEST-R78-ZZK-955Z TEST-311-ba2 -// following tag combination gives a very clean log stream under logcat(make sure to check regex) : chromium|CleverTap \ No newline at end of file +// following tag combination gives a very clean log stream under logcat(make sure to check regex) : chromium|CleverTap diff --git a/Samples/Cordova/ExampleProject/platforms/ios/www/plugins/clevertap-cordova/www/CleverTap.js b/Samples/Cordova/ExampleProject/platforms/ios/www/plugins/clevertap-cordova/www/CleverTap.js index 6002b8aa..77b1e00b 100644 --- a/Samples/Cordova/ExampleProject/platforms/ios/www/plugins/clevertap-cordova/www/CleverTap.js +++ b/Samples/Cordova/ExampleProject/platforms/ios/www/plugins/clevertap-cordova/www/CleverTap.js @@ -7,6 +7,9 @@ cordova.define("clevertap-cordova.CleverTap", function(require, exports, module) // var CleverTap = function () { + const libName = 'Cordova'; + const libVersion = 20603; + cordova.exec(null, null, "CleverTapPlugin", "setLibrary", [libName, libVersion]); } /******************* @@ -60,8 +63,8 @@ CleverTap.prototype.setPushToken = function (token) { } // Sets the devices Xiaomi push token -CleverTap.prototype.setPushXiaomiToken = function (token) { - cordova.exec(null, null, "CleverTapPlugin", "setPushXiaomiTokenAsString", [token]); +CleverTap.prototype.setPushXiaomiToken = function (token,region) { + cordova.exec(null, null, "CleverTapPlugin", "setPushXiaomiTokenAsString", [token,region]); } // Sets the devices Baidu push token @@ -450,10 +453,22 @@ CleverTap.prototype.deleteInboxMessageForId = function (messageId) { cordova.exec(null, null, "CleverTapPlugin", "deleteInboxMessageForId", [messageId]); } +CleverTap.prototype.deleteInboxMessagesForIds = function (messageIds) { + cordova.exec(null, null, "CleverTapPlugin", "deleteInboxMessagesForIds", [messageIds]); +} + CleverTap.prototype.markReadInboxMessageForId = function (messageId) { cordova.exec(null, null, "CleverTapPlugin", "markReadInboxMessageForId", [messageId]); } +CleverTap.prototype.markReadInboxMessagesForIds = function (messageIds) { + cordova.exec(null, null, "CleverTapPlugin", "markReadInboxMessagesForIds", [messageIds]); +} + +CleverTap.prototype.dismissInbox= function () { + cordova.exec(null, null, "CleverTapPlugin", "dismissInbox", []); +} + CleverTap.prototype.pushInboxNotificationViewedEventForId = function (messageId) { cordova.exec(null, null, "CleverTapPlugin", "pushInboxNotificationViewedEventForId", [messageId]); } @@ -509,6 +524,9 @@ CleverTap.prototype.pushDisplayUnitClickedEventForID = function(unitId){ /**************************** * Feature Flag methods ****************************/ +/** + * @deprecated - Since version 2.7.0 and will be removed in the future versions of this SDK. + */ CleverTap.prototype.getFeatureFlag = function(name,defaultValue,successCallback){ cordova.exec(successCallback, null, "CleverTapPlugin", "getFeatureFlag", [name,defaultValue]); } @@ -516,54 +534,173 @@ CleverTap.prototype.getFeatureFlag = function(name,defaultValue,successCallback) /**************************** * Product Config methods ****************************/ +/** + * @deprecated - Since version 2.7.0 and will be removed in the future versions of this SDK. + */ CleverTap.prototype.setDefaultsMap = function(jsonMap){ cordova.exec(null, null, "CleverTapPlugin", "setDefaultsMap", [jsonMap]); } +/** + * @deprecated - Since version 2.7.0 and will be removed in the future versions of this SDK. + */ CleverTap.prototype.fetch = function(){ cordova.exec(null, null, "CleverTapPlugin", "fetch", []); } +/** + * @deprecated - Since version 2.7.0 and will be removed in the future versions of this SDK. + */ CleverTap.prototype.fetchWithMinimumFetchIntervalInSeconds = function(interval){ cordova.exec(null, null, "CleverTapPlugin", "fetchWithMinimumFetchIntervalInSeconds", [interval]); } +/** + * @deprecated - Since version 2.7.0 and will be removed in the future versions of this SDK. + */ CleverTap.prototype.activate = function(){ cordova.exec(null, null, "CleverTapPlugin", "activate", []); } +/** + * @deprecated - Since version 2.7.0 and will be removed in the future versions of this SDK. + */ CleverTap.prototype.fetchAndActivate = function(){ cordova.exec(null, null, "CleverTapPlugin", "fetchAndActivate", []); } +/** + * @deprecated - Since version 2.7.0 and will be removed in the future versions of this SDK. + */ CleverTap.prototype.setMinimumFetchIntervalInSeconds = function(interval){ cordova.exec(null, null, "CleverTapPlugin", "setMinimumFetchIntervalInSeconds", [interval]); } +/** + * @deprecated - Since version 2.7.0 and will be removed in the future versions of this SDK. + */ CleverTap.prototype.getLastFetchTimeStampInMillis = function(successCallback){ cordova.exec(successCallback, null, "CleverTapPlugin", "getLastFetchTimeStampInMillis", []); } +/** + * @deprecated - Since version 2.7.0 and will be removed in the future versions of this SDK. + */ CleverTap.prototype.getString = function(key,successCallback){ cordova.exec(successCallback, null, "CleverTapPlugin", "getString", [key]); } +/** + * @deprecated - Since version 2.7.0 and will be removed in the future versions of this SDK. + */ CleverTap.prototype.getBoolean = function(key,successCallback){ cordova.exec(successCallback, null, "CleverTapPlugin", "getBoolean", [key]); } +/** + * @deprecated - Since version 2.7.0 and will be removed in the future versions of this SDK. + */ CleverTap.prototype.getLong = function(key,successCallback){ cordova.exec(successCallback, null, "CleverTapPlugin", "getLong", [key]); } +/** + * @deprecated - Since version 2.7.0 and will be removed in the future versions of this SDK. + */ CleverTap.prototype.getDouble = function(key,successCallback){ cordova.exec(successCallback, null, "CleverTapPlugin", "getDouble", [key]); } +/** + * @deprecated - Since version 2.7.0 and will be removed in the future versions of this SDK. + */ CleverTap.prototype.reset = function(){ cordova.exec(null, null, "CleverTapPlugin", "reset", []); } + +/**************************** + * Product Experiences methods + ****************************/ + +/** + Uploads variables to the server. Requires Development/Debug build/configuration. +*/ +CleverTap.prototype.syncVariables = function(){ + cordova.exec(null, null, "CleverTapPlugin", "syncVariables", []); +} + +/** +Uploads variables to the server. +@param {boolean} isProduction Provide `true` if variables must be sync in Productuon build/configuration. +*/ +CleverTap.prototype.syncVariablesinProd = function(isProduction){ + cordova.exec(null, null, "CleverTapPlugin", "syncVariablesinProd", [isProduction]); +} + +/** +Forces variables to update from the server. +*/ +CleverTap.prototype.fetchVariables = function(successCallback){ + cordova.exec(successCallback, null, "CleverTapPlugin", "fetchVariables", []); +} + +/** +Create variables. +@param {object} variables The JSON Object specifying the varibles to be created. +*/ +CleverTap.prototype.defineVariables = function (variables) { + cordova.exec(null, null, "CleverTapPlugin", "defineVariables", [variables]); +} + +/** +Get a variable or a group for the specified name. +@param {string} name - name. +*/ +CleverTap.prototype.getVariable = function (name, successCallback) { + cordova.exec(successCallback, null, "CleverTapPlugin", "getVariable", [name]); +} + +/** +Get all variables via a JSON object. +*/ +CleverTap.prototype.getVariables = function (successCallback) { + cordova.exec(successCallback, null, "CleverTapPlugin", "getVariables", []); +} + + /** +Adds a callback to be invoked when variables are initialised with server values. Will be called each time new values are fetched. +@param {function} handler The callback to add +*/ +CleverTap.prototype.onVariablesChanged = function (handler) { + cordova.exec(handler, null, "CleverTapPlugin", "onVariablesChanged", []); +} + +/** +Called when the value of the variable changes. +@param {name} string the name of the variable +@param {function} handler The callback to add +*/ +CleverTap.prototype.onValueChanged = function (name, handler) { + cordova.exec(handler, null, "CleverTapPlugin", "onValueChanged", [name]); +} + +/**************************** + *Push Primer + ****************************/ + +CleverTap.prototype.promptPushPrimer = function(localInAppObject){ + cordova.exec(null, null, "CleverTapPlugin", "promptPushPrimer", [localInAppObject]); +} + +CleverTap.prototype.promptForPushPermission = function(showFallbackSettings){ + cordova.exec(null, null, "CleverTapPlugin", "promptForPushPermission", [showFallbackSettings]); +} + +CleverTap.prototype.isPushPermissionGranted = function(successCallback){ + cordova.exec(successCallback, null, "CleverTapPlugin", "isPushPermissionGranted", []); +} + function convertDateToEpochInProperties(items){ //Conversion of date object in suitable CleverTap format diff --git a/Samples/Cordova/ExampleProject/plugins/android.json b/Samples/Cordova/ExampleProject/plugins/android.json deleted file mode 100644 index 578483c1..00000000 --- a/Samples/Cordova/ExampleProject/plugins/android.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "prepare_queue": { - "installed": [], - "uninstalled": [] - }, - "config_munge": { - "files": {} - }, - "installed_plugins": { - "cordova-android-support-gradle-release": { - "ANDROID_SUPPORT_VERSION": "27.+", - "PACKAGE_NAME": "com.clevertap.example" - }, - "clevertap-cordova": { - "CLEVERTAP_ACCOUNT_ID": "TEST-R78-ZZK-955Z", - "CLEVERTAP_TOKEN": "TEST-311-ba2", - "CLEVERTAP_REGION": " ", - "FIREBASE_MESSAGING_VERSION": "22.0.0", - "PACKAGE_NAME": "com.clevertap.example" - } - }, - "dependent_plugins": {} -} diff --git a/Samples/Cordova/ExampleProject/plugins/clevertap-cordova/.codebeatignore b/Samples/Cordova/ExampleProject/plugins/clevertap-cordova/.codebeatignore deleted file mode 100644 index ee52b27a..00000000 --- a/Samples/Cordova/ExampleProject/plugins/clevertap-cordova/.codebeatignore +++ /dev/null @@ -1 +0,0 @@ -Samples/** diff --git a/Samples/Cordova/ExampleProject/plugins/clevertap-cordova/CHANGELOG.md b/Samples/Cordova/ExampleProject/plugins/clevertap-cordova/CHANGELOG.md deleted file mode 100644 index 32d2989d..00000000 --- a/Samples/Cordova/ExampleProject/plugins/clevertap-cordova/CHANGELOG.md +++ /dev/null @@ -1,170 +0,0 @@ -Change Log -========== - -Version 2.5.1 *(June 7, 2022)* -------------------------------------------- -- Supports [CleverTap Android SDK v4.4.0](https://github.com/CleverTap/clevertap-android-sdk/releases/tag/core-v4.4.0) -- Supports [CleverTap iOS SDK v3.10.0](https://github.com/CleverTap/clevertap-ios-sdk/releases/tag/3.10.0) - - - -Version 2.4.0 *(January 31, 2022)* -------------------------------------------- -- Adds public methods for suspending, discarding & resuming InApp Notifications -- Adds public methods to increment/decrement values set via User properties -- Deprecates `profileGetCleverTapID()` and `profileGetCleverTapAttributionIdentifier()` methods -- Adds a new public method `getCleverTapID()` as an alternative to above deprecated methods -- Supports [CleverTap iOS SDK v3.10.0](https://github.com/CleverTap/clevertap-ios-sdk/releases/tag/3.10.0) -- Supports [CleverTap Android SDK v4.2.0](https://github.com/CleverTap/clevertap-android-sdk/releases/tag/core-v4.2.0) - -Version 2.3.6 *(23rd November 2021)* -------------------------------------------- -- Fixes a bug where DOB was not getting respected in Android as profile property - -Version 2.3.5 *(9th June 2021)* -------------------------------------------- -- Supports CleverTap Android SDK v4.1.1 -- Supports CleverTap iOS SDK v3.9.4 -- Removes Product A/B Testing (Dynamic Variables) code -- Removes `profileSetGraphUser` and `profileSetGooglePlusUser` method - -Version 2.3.4 *(27th April 2021)* -------------------------------------------- -- Update and Freeze CleverTap Cordova Plugin Podspec to a specific version of a CleverTap iOS SDK - -Version 2.3.3 *(24 February, 2021)* -------------------------------------------- -* Added Push Notification with Custom Extras callback support in the killed state -* Update for CleverTap iOS SDK v3.9.2 - -Version 2.3.2 *(07 January, 2021)* -------------------------------------------- -* Added support for Push Notification Click Callbacks -* Added CleverTap iOS SDK dependency via CocoaPods in the plugin.xml -* Update for CleverTap Android SDK v4.0.2 - -Version 2.3.1 *(11 November, 2020)* -------------------------------------------- -* Fixed a NPE on `getAllDisplayUnits` method -* Update for CleverTap iOS SDK v3.9.1 - -Version 2.3.0 *(15 October, 2020)* -------------------------------------------- -* Update for CleverTap Android SDK v4.0.0 - -Version 2.2.1 *(20 May, 2020)* -------------------------------------------- -* Bug Fixes and enhancements - -Version 2.2.0 *(19 May, 2020)* -------------------------------------------- -* Bug Fixes and enhancements - -Version 2.1.9 *(16 May, 2020)* -------------------------------------------- -* Adds support for Custom Inbox, InApp and Inbox Click callbacks -* Adds support for Native Display & Dynamic Variables -* Adds support for Product Config and Feature Flags -* Adds support for Xiaomi, Baidu & Huawei Push -* Update for CleverTap Android SDK v 3.8.0 -* Update for CleverTap iOS SDK v 3.8.0 - -Version 2.1.8 *(26 February, 2020)* -------------------------------------------- -* Revert Google Play Install Referrer Library to v1.0 -* Update for CleverTap Android v3.6.4 - -Version 2.1.7 *(24 February, 2020)* -------------------------------------------- -* Adds support for new Google Play Install Referrer API -* Update for CleverTap Android v3.6.3 - -Version 2.1.6 *(20 January, 2020)* -------------------------------------------- -* Fixing after install scripts - -Version 2.1.5 *(11 December, 2019)* -------------------------------------------- -* Update for CleverTap Android v 3.6.1 - -Version 2.1.4 *(7 November, 2019)* -------------------------------------------- -* Update for CleverTap Android v 3.5.1 - -Version 2.1.3 *(4 November, 2019)* -------------------------------------------- -* Update for CleverTap iOS SDK v 3.7.1 - -Version 2.1.2 *(29 May, 2019)* -------------------------------------------- -* Update for CleverTap Android SDK v 3.5.1 -* Update for CleverTap iOS SDK v 3.5.0 - -Version 2.1.1 *(08 February, 2019)* -------------------------------------------- -* Update for CleverTap Android SDK v 3.4.2 -* Update for CleverTap iOS SDK v 3.4.1 - -Version 2.0.16 *(13 October, 2018)* -------------------------------------------- -* Update for CleverTap Android SDK v 3.3.2 - -Version 2.0.15 *(31 October, 2018)* -------------------------------------------- -* Update for CleverTap iOS SDK v 3.3.0 -* Update to CleverTap Android SDK v3.3.1 - -Version 2.0.14 *(26 September, 2018)* -------------------------------------------- -* Update for CleverTap iOS SDK v 3.2.2 - -Version 2.0.13 *(11 September, 2018)* -------------------------------------------- -* Update to CleverTap Android SDK v3.2.0 -Update to CleverTap iOS SDK v3.2.0 - -Version 2.0.12 *(5 September, 2018)* -------------------------------------------- -* fix android sdk version - -Version 2.0.11 *(29 July, 2018)* -------------------------------------------- -* fix android package name - -Version 2.0.10 *(25 July, 2018)* -------------------------------------------- -* Conform plugin id - -Version 2.0.9 *(24 July, 2018)* -------------------------------------------- -* Update Android post install script for Cordova 8.0.0 - -Version 2.0.8 *(15 May, 2018)* -------------------------------------------- -* fixes CleverTapSDK.framework install issues (removes symlinks) - -Version 2.0.7 *(11 May, 2018)* -------------------------------------------- -* Update for Android support library version -* Update for CleverTap Android SDK v 3.1.9 -* Update for CleverTap iOS SDK v 3.1.7 -* Support for Android O Notification Channels with custom sound -* New APIs for GDPR compliance -* Adds Android support for recordScreenView API - -Version 2.0.5 *(04 January, 2018)* -------------------------------------------- -* Update for CleverTap Android SDK v 3.1.8 - -Version 2.0.4 *(13 October, 2017)* -------------------------------------------- -* Update for CleverTap iOS SDK v 3.1.6 - -Version 2.0.3 *(10 October, 2017)* -------------------------------------------- -* Update for CleverTapAndroidSDK v 3.1.7 - -Version 2.0.2 *(21 September, 2017)* -------------------------------------------- -* Supports CleverTap 3.1.5/3.1.6 - diff --git a/Samples/Cordova/ExampleProject/plugins/clevertap-cordova/LICENSE b/Samples/Cordova/ExampleProject/plugins/clevertap-cordova/LICENSE deleted file mode 100644 index c383668c..00000000 --- a/Samples/Cordova/ExampleProject/plugins/clevertap-cordova/LICENSE +++ /dev/null @@ -1,9 +0,0 @@ -Copyright (c) 2021 CleverTap -All rights reserved. - -* Use of source code or binaries contained within CleverTap's Cordova SDK is permitted only to enable use of the CleverTap platform by customers of CleverTap. -* Modification of source code and inclusion in mobile apps is explicitly allowed provided that all other conditions are met. -* Neither the name of CleverTap nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. -* Redistribution of source code or binaries is disallowed except with specific prior written permission. Any such redistribution must retain the above copyright notice, this list of conditions and the following disclaimer. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/Samples/Cordova/ExampleProject/plugins/clevertap-cordova/README.md b/Samples/Cordova/ExampleProject/plugins/clevertap-cordova/README.md deleted file mode 100644 index 1274e57d..00000000 --- a/Samples/Cordova/ExampleProject/plugins/clevertap-cordova/README.md +++ /dev/null @@ -1,95 +0,0 @@ -

- -

- -# CleverTap Cordova Plugin - -[![npm version](https://badge.fury.io/js/clevertap-cordova.svg)](https://badge.fury.io/js/clevertap-cordova) - - - -[![npm downloads](https://img.shields.io/npm/dm/clevertap-cordova.svg)](https://www.npmjs.com/package/clevertap-cordova) - -## 👋 Introduction -The CleverTap Cordova Plugin for Mobile Customer Engagement and Analytics solutions. - -For more information check out our [website](https://clevertap.com/ "CleverTap") and [documentation](https://developer.clevertap.com/docs/ "CleverTap Technical Documentation"). - -To get started, sign up [here](https://clevertap.com/live-product-demo/). - -## ✅ Supported Versions - -- [CleverTap Android SDK version 4.2.0](https://github.com/CleverTap/clevertap-android-sdk/releases/tag/core-v4.2.0) -- [CleverTap iOS SDK version 3.10.0](https://github.com/CleverTap/clevertap-ios-sdk/releases/tag/3.10.0) - -## 🚀 Installation and Quick Start - -To install CleverTap for Cordova, follow the steps mentioned below: - -When you create your CleverTap account, you will also get a -Test account. Use the -Test account for development and the main account for production. - -#### Install the Plugin - -Grab the Account ID and Token values from your CleverTap [Dashboard](https://dashboard.clevertap.com) -> Settings. - -##### For Android *Important* -Starting with v2.0.0, the plugin uses FCM rather than GCM. To configure FCM, add your google-services.json to the root of your cordova project **before you add the plugin**. -The plugin uses an `after plugin add` hook script to configure your project for FCM. -If the google-services.json file is not present in your project when the script runs, FCM will not be configured properly and will not work. - -##### Using Cordova - -```sh -# ensure npm is installed: npm -g install npm -cordova plugin add https://github.com/CleverTap/clevertap-cordova.git --variable CLEVERTAP_ACCOUNT_ID="YOUR CLEVERTAP ACCOUNT ID" --variable CLEVERTAP_TOKEN="YOUR CELVERTAP ACCOUNT TOKEN" -``` - -##### Using Ionic - -```sh -ionic cordova plugin add clevertap-cordova@latest --variable CLEVERTAP_ACCOUNT_ID="YOUR CLEVERTAP ACCOUNT ID" --variable CLEVERTAP_TOKEN="YOUR CELVERTAP ACCOUNT TOKEN" -``` - -##### For Ionic 5 - -```sh -npm install @ionic-native/clevertap --save -``` -- Be sure to [add CleverTap as a provider in your app module](/Samples/IonicCordova/IonicAngularProject/src/app/app.component.ts). -```javascript - constructor(platform: Platform, statusBar: StatusBar, splashScreen: SplashScreen, clevertap: CleverTap) { - platform.ready().then(() => { - // Okay, so the platform is ready and our plugins are available. - // Here you can do any higher level native things you might need. - statusBar.styleDefault(); - splashScreen.hide(); - - ... - clevertap.setDebugLevel(2); - clevertap.getCleverTapID()((id) => {console.log(id)}); - ... - }); - } -} - -``` - -## 🛠 Integration - -See our [Technical Documentation for Android](docs/Integrate-Android.md) and [Technical Documentation for iOS](docs/Integrate-iOS.md) for instructions on integrating CleverTap into your app. - - -## 📑 Documentation & Example - -- [See our CleverTap Plugin Usage Documentation](docs/Usage.md) - -- [See the included Example Cordova project for usage](/Samples/Cordova/ExampleProject/www/js/index.js). - -- [See the included Ionic Example project for usage](/Samples/IonicCordova/IonicAngularProject/src/app/app.component.ts). - - -## ⁉️ Questions? # - - If you have questions or concerns, you can reach out to the CleverTap support team from the CleverTap Dashboard. - -**TroubleShooting Guide:** Please refer [here](docs/Troubleshooting-Guide.md) if you are facing common integration issues. diff --git a/Samples/Cordova/ExampleProject/plugins/clevertap-cordova/docs/Integrate-Android.md b/Samples/Cordova/ExampleProject/plugins/clevertap-cordova/docs/Integrate-Android.md deleted file mode 100644 index 22af2055..00000000 --- a/Samples/Cordova/ExampleProject/plugins/clevertap-cordova/docs/Integrate-Android.md +++ /dev/null @@ -1,145 +0,0 @@ -# 👩‍💻 Android Integration - -## Project Setup - -+ Check that the following is inside the `` tags of your AndroidManifest.xml: - - ```xml - - - ``` - -+ **Set the Lifecycle Callback** - - Check the `android:name` property of the `` tag of our AndroidManifest.xml: - - ```xml - - ``` - - **Note:** The above step is **extremely important** and enables CleverTap to track notification opens, display in-app notifications, track deep links, and other important **user behaviour**. - -+ **Add Permissions** - - Please ensure that you're requesting the following permissions for your app: - - ```xml - - - - - - ``` - - [Please see the example AndroidManifest.xml here](https://github.com/CleverTap/clevertap-cordova/blob/master/Samples/Cordova/ExampleProject/platforms/android/app/src/main/AndroidManifest.xml). - -+ **Add Dependencies** - - Make sure your build.gradle file includes the play-services and support library dependencies: - - ```groovy - dependencies { - implementation fileTree(dir: 'libs', include: '*.jar' ) - debugCompile(project(path: "CordovaLib", configuration: "debug")) - releaseCompile(project(path: "CordovaLib", configuration: "release")) - // SUB-PROJECT DEPENDENCIES START - implementation "com.google.firebase:firebase-core:+" - implementation "com.google.firebase:firebase-messaging:22.0.0" - implementation 'androidx.core:core:1.3.0' - implementation 'androidx.fragment:fragment:1.3.6' - implementation "com.android.installreferrer:installreferrer:2.2" //Mandatory for v2.1.8 and above - //MANDATORY for App Inbox - implementation 'androidx.appcompat:appcompat:1.3.1' - implementation 'androidx.recyclerview:recyclerview:1.2.1' - implementation 'androidx.viewpager:viewpager:1.0.0' - implementation 'com.google.android.material:material:1.4.0' - implementation 'com.github.bumptech.glide:glide:4.12.0' - //Optional ExoPlayer Libraries for Audio/Video Inbox Messages. Audio/Video messages will be dropped without these dependencies - implementation 'com.google.android.exoplayer:exoplayer:2.11.5' - implementation 'com.google.android.exoplayer:exoplayer-hls:2.11.5' - implementation 'com.google.android.exoplayer:exoplayer-ui:2.11.5' - // SUB-PROJECT DEPENDENCIES END - ``` - -+ **Support AndroidX** - - To support AndroidX libraries, add the following to your `config.xml` file - - - ```xml - - ``` - - -+ **Supporting push notifications from FCM:** - + Add the following Preference in `config.xml` file : `` - + Register your app with a firebase project and put `google-services.json` inside `platforms/android/app` folder - - - - - Also ensure that your app supports `cordova-android@9.0.0` - - -## Set up and register for push notifications and deep links - -The `FCMTokenListenerService` of the CleverTap Android SDK registers push tokens automatically. No action is required from the Javascript side. Hence, Android does not require the `CleverTap.registerPush()` method. - -Add your custom url scheme to the AndroidManifest.xml. - -```xml - - - - - - -``` - -See [example AndroidManifest.xml](https://github.com/CleverTap/clevertap-cordova/blob/master/Samples/Cordova/ExampleProject/platforms/android/app/src/main/AndroidManifest.xml). - -## Push Notifications Channels - -Notification Channels are now mandatory if your app supports Android Oreo and above - -#### Creating Notification Channel - -Use the following to create a Notification Channel - -```javascript -this.clevertap.createNotificationChannel('channelID_1234', 'Notification Channel', 'channelDescription', 1, true); -``` - -#### Delete Notification Channel - -Use the following to delete a Notification Channel - -```javascript -this.clevertap.deleteNotificationChannel('channelID_1234'); -``` - -#### Creating a group notification channel - -Use the following to create a Notification Channel Group - -```javascript -this.clevertap.createNotificationChannelGroup('groupID_5678', 'Channel Group Name'); -``` - -#### Delete a group notification channel - -Use the following to delete a Notification Channel Group - -```javascript -this.clevertap.deleteNotificationChannelGroup('groupID_5678'); -``` - - -## Integrate Javascript with the Plugin - -All calls to the CleverTap plugin should be made from your Javascript. -You can refer to our [Usage.md](/docs/Usage.md) for implementation. diff --git a/Samples/Cordova/ExampleProject/plugins/clevertap-cordova/docs/Integrate-iOS.md b/Samples/Cordova/ExampleProject/plugins/clevertap-cordova/docs/Integrate-iOS.md deleted file mode 100644 index 36c170da..00000000 --- a/Samples/Cordova/ExampleProject/plugins/clevertap-cordova/docs/Integrate-iOS.md +++ /dev/null @@ -1,18 +0,0 @@ -# 👩‍💻 iOS Integration - -## Set up and register for push notifications and deep links - -- [Set up push notifications for your app](https://developer.apple.com/documentation/usernotifications/registering_your_app_with_apns). - -- If you plan on using deep links, [please register your custom url scheme as described here](https://developer.apple.com/documentation/xcode/defining-a-custom-url-scheme-for-your-app). - -- Call the following from your Javascript. - -```javascript -CleverTap.registerPush(); -``` - -## Integrate Javascript with the Plugin - -- Refer to our [Usage Documentation](/docs/Usage.md) for implementation. - diff --git a/Samples/Cordova/ExampleProject/plugins/clevertap-cordova/docs/Troubleshooting-Guide.md b/Samples/Cordova/ExampleProject/plugins/clevertap-cordova/docs/Troubleshooting-Guide.md deleted file mode 100644 index 2762e32d..00000000 --- a/Samples/Cordova/ExampleProject/plugins/clevertap-cordova/docs/Troubleshooting-Guide.md +++ /dev/null @@ -1,29 +0,0 @@ -## Troubleshooting Guide for common integration issues in Codova plugin - -### Android - -**1. Header and Footer In-app are not shown in clevertap-cordova >= 2.3.1** - -**How In-apps Work in SDK:** - - All of our In-apps require the activity to be a subclass of FragmentActivity in order to render. - Header & Footer in-apps uses application’s Mainactivity to render. - Rest other templates uses CT SDK InappNotificationActivity(which is an instance of FramentActivity) - -**Why the issue is coming:** - - In case of Cordova, the application’s Mainactivity is a subclass of CordovaActivity which is not an instance of FragmentActivity, - due to which Header & Footer fails to render.Ideally, Cordova framework should update the CordovaActivity to be a subclass of - FragmentActivity in accordance with latest Android-X support. - -**Suggestion:** - - Cordova SDK has planned to support this in Cordova v10.0.0.Code changes are already done & a [PR](https://github.com/apache/cordova-android/pull/1052) is raised for the same. - We recommended to use other supported in-apps in place of headers/footers, until Cordova 10.0.0 is released. - We recommend to use other templates( other than header and footer) which will work absolutely fine. - Also we have tried a [plugin](https://github.com/ReallySmallSoftware/cordova-plugin-android-fragmentactivity) which is working fine to render Header/Footer In-apps. - We don’t recommend to use this library, as we are not sure about the impacts. - - - - diff --git a/Samples/Cordova/ExampleProject/plugins/clevertap-cordova/docs/Usage.md b/Samples/Cordova/ExampleProject/plugins/clevertap-cordova/docs/Usage.md deleted file mode 100644 index 70023a68..00000000 --- a/Samples/Cordova/ExampleProject/plugins/clevertap-cordova/docs/Usage.md +++ /dev/null @@ -1,447 +0,0 @@ - -# CleverTap Plugin Ionic/ Cordova Usage using Javascript - -#### Import the class -```javascript -import { CleverTap } from '@ionic-native/clevertap/ngx'; -``` -#### Set CleverTap object as parameter in Home Page constructor to get reference -```javascript -export class HomePage { - constructor(public clevertap: CleverTap, ) - { - //constructor code - } -//function calls -} -``` - -#### Adding Listeners to your JavaScript - -All calls to the CleverTap SDK should be made from your Javascript. - - -```javascript -document.addEventListener('deviceready', this.onDeviceReady, false); -document.addEventListener('onCleverTapProfileSync', this.onCleverTapProfileSync, false); // optional: to be notified of CleverTap user profile synchronization updates -document.addEventListener('onCleverTapProfileDidInitialize', this.onCleverTapProfileDidInitialize, false); // optional, to be notified when the CleverTap user profile is initialized -document.addEventListener('onCleverTapInAppNotificationDismissed', this.onCleverTapInAppNotificationDismissed, false); // optional, to be receive a callback with custom in-app notification click data -document.addEventListener('onDeepLink', this.onDeepLink, false); // optional, register to receive deep links. -document.addEventListener('onPushNotification', this.onPushNotification, false); // optional, register to receive push notification payloads. -document.addEventListener('onCleverTapInboxDidInitialize', this.onCleverTapInboxDidInitialize, false); // optional, to check if CleverTap Inbox intialized -document.addEventListener('onCleverTapInboxMessagesDidUpdate', this.onCleverTapInboxMessagesDidUpdate, false); // optional, to check if CleverTap Inbox Messages were updated -document.addEventListener('onCleverTapInboxButtonClick', this.onCleverTapInboxButtonClick, false); // optional, to check if Inbox button was clicked with custom payload -document.addEventListener('onCleverTapInAppButtonClick', this.onCleverTapInAppButtonClick, false); // optional, to check if InApp button was clicked with custom payload -document.addEventListener('onCleverTapFeatureFlagsDidUpdate', this.onCleverTapFeatureFlagsDidUpdate, false); // optional, to check if Feature Flags were updated -document.addEventListener('onCleverTapProductConfigDidInitialize', this.onCleverTapProductConfigDidInitialize, false); // optional, to check if Product Config was initialized -document.addEventListener('onCleverTapProductConfigDidFetch', this.onCleverTapProductConfigDidFetch, false); // optional, to check if Product Configs were updated -document.addEventListener('onCleverTapProductConfigDidActivate', this.onCleverTapProductConfigDidActivate, false); // optional, to check if Product Configs were activated -document.addEventListener('onCleverTapExperimentsUpdated', this.onCleverTapExperimentsUpdated, false); // optional, to check if Dynamic Variable Experiments were updated -document.addEventListener('onCleverTapDisplayUnitsLoaded', this.onCleverTapDisplayUnitsLoaded, false); // optional, to check if Native Display units were loaded - - -// deep link handling -onDeepLink: function(e) { - console.log(e.deeplink); -}, - -// push notification data handling -onPushNotification: function(e) { - console.log(JSON.stringify(e.notification)); -}, - -onCleverTapInboxDidInitialize: function() { - CleverTap.showInbox({"navBarTitle":"My App Inbox","tabs": ["tag1", "tag2"],"navBarColor":"#FF0000"}); -}, - -onCleverTapInboxMessagesDidUpdate: function() { - CleverTap.getInboxMessageUnreadCount(function(val) {console.log("Inbox unread message count"+val);}) - CleverTap.getInboxMessageCount(function(val) {console.log("Inbox read message count"+val);}); -}, - -onCleverTapInAppButtonClick: function(e) { - console.log("onCleverTapInAppButtonClick"); - console.log(e.customExtras); -}, - -onCleverTapInboxButtonClick: function(e) { - console.log("onCleverTapInboxButtonClick"); - console.log(e.customExtras); -}, - -onCleverTapFeatureFlagsDidUpdate: function() { - console.log("onCleverTapFeatureFlagsDidUpdate"); -}, - -onCleverTapProductConfigDidInitialize: function() { - console.log("onCleverTapProductConfigDidInitialize"); -}, - -onCleverTapProductConfigDidFetch: function() { - console.log("onCleverTapProductConfigDidFetch"); -}, - -onCleverTapProductConfigDidActivate: function() { - console.log("onCleverTapProductConfigDidActivate"); -}, - -onCleverTapExperimentsUpdated: function() { - console.log("onCleverTapExperimentsUpdated"); -}, - -onCleverTapDisplayUnitsLoaded: function(e) { - console.log("onCleverTapDisplayUnitsLoaded"); - console.log(e.units); -}, - -``` -## User Properties - -#### Update User Profile (Push Profile) - -```javascript -this.clevertap.profileSet({Name: 'Test-Name', Identity: 'android098768', custom: 122211}); -``` - -#### Set Multi Values For Key - -```javascript -this.clevertap.profileSetMultiValues('colors', ['red', 'blue']); -``` - -#### Remove Multi Value For Key - -```javascript -this.clevertap.profileRemoveMultiValue('colors', 'green'); -``` - -#### Add Multi Value For Key - -```javascript -this.clevertap.profileAddMultiValue('colors', 'green'); -``` - -#### Increment Value For Key - -```javascript -this.clevertap.profileIncrementValueBy('score', 15); -``` - -#### Decrement Value For Key - -```javascript -this.clevertap.profileDecrementValueBy('score', 10); -``` - -#### Create a User profile when user logs in (On User Login) - -```javascript -this.clevertap.onUserLogin({Name: 'Test-Name', Identity: 'android098768', Email: 'TestIonic@hotmail.com', custom: 122211}); -``` - -#### Get CleverTap Reference Id - -```javascript -this.clevertap.profileGetCleverTapID().then(r => { - console.log('profileGetCleverTapID: ' + r); -}); -``` - -#### Set Location to User Profile - -```javascript -this.clevertap.setLocation(38.89, -77.04); -``` - -## User Events - -#### Record an event - -```javascript -this.clevertap.recordEventWithName('Test Event'); -``` - -#### Record Charged event - -```javascript -this.clevertap.recordChargedEventWithDetailsAndItems({amount: 200, 'Charged ID': 5678}, - [{ - Category: 'Food', - Quantity: 2, - Title: 'Eggs (Dozen)' - }]); -``` - - -## App Inbox - -#### Initialize the CleverTap App Inbox Method - -```javascript -this.clevertap.initializeInbox(); -``` - -#### Show the App Inbox - -```javascript -this.clevertap.showInbox({'tabs':['Offers','Promotions'],'navBarTitle':'My App Inbox','navBarTitleColor':'#FF0000','navBarColor':'#FFFFFF','inboxBackgroundColor':'#AED6F1','backButtonColor':'#00FF00' - ,'unselectedTabColor':'#0000FF','selectedTabColor':'#FF0000','selectedTabIndicatorColor':'#000000', - 'noMessageText':'No message(s)','noMessageTextColor':'#FF0000'}); - ``` - -#### Get Total message count - -```javascript -this.clevertap.getInboxMessageCount().then(r => { - console.log('getInboxMessageCount: ' + r); -}); -``` - -#### Get Total message unread count - -```javascript -this.clevertap.getUnreadInboxMessageCount().then(r => { - console.log('getUnreadInboxMessageCount: ' + r); -}); -``` - -#### Get All Inbox Messages - -```javascript -this.clevertap.getAllInboxMessage().then(r => { - console.log('getAllInboxMessage: ' + r); -}); -``` - -#### Get all Inbox unread messages - -```javascript -this.clevertap.getUnreadInboxMessage().then(r => { - console.log('getUnreadInboxMessage: ' + r); -}); -``` - -#### Get inbox message with Id - -```javascript -this.clevertap.getInboxMessageForId('message_ID_1234').then(r => { -console.log('getInboxMessageForId: ' + r); -}); - -``` - -#### Delete message with Id - -```javascript -this.clevertap.deleteInboxMessageForId('message_ID_1234'); -``` - -#### Mark a message as Read for Inbox Id - -```javascript -this.clevertap.markReadInboxMessageForId('message_ID_1234'); -``` - -#### pushInbox Notification Viewed Event For Id - -```javascript -this.clevertap.pushInboxNotificationViewedEventForId('message_ID_1234'); -``` - -#### push Inbox Notification Clicked Event For Id - -```javascript -this.clevertap.pushInboxNotificationClickedEventForId('message_ID_1234'); -``` - - -## Push Notifications - -#### Creating Notification Channel - -```javascript -this.clevertap.createNotificationChannel('channelID_1234', 'Notification Channel', 'channelDescription', 1, true); -``` - -#### Delete Notification Channel - -```javascript -this.clevertap.deleteNotificationChannel('channelID_1234'); -``` - -#### Creating a group notification channel - -```javascript -this.clevertap.createNotificationChannelGroup('groupID_5678', 'Channel Group Name'); -``` - -#### Delete a group notification channel - -```javascript -this.clevertap.deleteNotificationChannelGroup('groupID_5678'); -``` - -#### Registering Fcm Token - -```javascript -this.clevertap.setPushToken(''); -``` - -## InApp Notification Controls - -#### Suspend InApp Notifications - -```javascript -this.clevertap.suspendInAppNotifications(); -``` - -#### Discard InApp Notifications - -```javascript -this.clevertap.discardInAppNotifications(); -``` - -#### Resume InApp Notifications - -```javascript -this.clevertap.resumeInAppNotifications(); -``` - -## Native Display - -#### Get Display Unit for Id - -```javascript -this.clevertap.getDisplayUnitForId('Test Display Unit').then(r => { - console.log('getDisplayUnitForId: ' + r); -}); -``` - -#### Get All Display Units - -```javascript -this.clevertap.getAllDisplayUnits('Test Display Unit').then(r => { - console.log('getAllDisplayUnits: ' + r); -}); -``` - -## Product Config - -#### Set Product Configuration to default - -```javascript -this.clevertap.setDefaultsMap({ -key_long: 123, key_double: 3.14, key_string: 'sensible', key_bool: true - }); -``` - -#### Fetching product configs - -```javascript -this.clevertap.fetch(); -``` - -#### Activate the most recently fetched product config - -```javascript -this.clevertap.activate(); -``` - -#### Fetch And Activate product config - -```javascript -this.clevertap.fetchAndActivate(); -``` - -#### Fetch with Minimum Time Interval - -```javascript -this.clevertap.fetchWithMinimumFetchIntervalInSeconds(60); -``` - -#### Set Minimum Time Interval for Fetch - -```javascript -this.clevertap.setMinimumFetchIntervalInSeconds(60 * 10); -``` - -#### Get Boolean key - -```javascript -this.clevertap.getBoolean('key_string').then(r => { - console.log('getBoolean: ' + r); -}); -``` -#### Get Long - -```javascript -this.clevertap.getLong('key_string').then(r => { - console.log('getLong: ' + r); -}); -``` -#### Get Double - -```javascript -this.clevertap.getDouble('key_string').then(r => { - console.log('getDouble: ' + r); -}); -``` -#### Get String - -```javascript -this.clevertap.getString('key_string').then(r => { - console.log('getString: ' + r); -}); -``` - -#### Delete all activated, fetched and defaults configs - -```javascript -this.clevertap.reset(); -``` - -#### Get last fetched timestamp in millis - -```javascript -this.clevertap.getLastFetchTimeStampInMillis().then(r => { - console.log('getLastFetchTimeStampInMillis: ' + r); -}); -``` - -## Feature Flag - -#### Get Feature Flag - -```javascript -this.clevertap.getFeatureFlag('key_string', 'defaultString').then(r => { - console.log('getFeatureFlag: ' + r); -}); -``` - -## App Personalisation - -#### Enable Personalization - -```javascript -this.clevertap.enablePersonalization(); -``` - -#### Get Profile Name - -```javascript -this.clevertap.profileGetProperty('Name').then(r => { - console.log('profileGetProperty' + r); -}); -``` - -#### Get CleverTap Identifier - -```javascript -this.clevertap.getCleverTapID().then(r => { - console.log('getCleverTapID: ' + r); -}); -``` - -### For more information: - - [See included Example Projects](/Samples) - - [See CleverTap JS interface](/www/CleverTap.js) diff --git a/Samples/Cordova/ExampleProject/plugins/clevertap-cordova/package.json b/Samples/Cordova/ExampleProject/plugins/clevertap-cordova/package.json deleted file mode 100644 index 2c680d72..00000000 --- a/Samples/Cordova/ExampleProject/plugins/clevertap-cordova/package.json +++ /dev/null @@ -1,38 +0,0 @@ -{ - "name": "clevertap-cordova", - "version": "2.4.0", - "description": "CleverTap Plugin for Cordova/PhoneGap", - "cordova": { - "id": "clevertap-cordova", - "platforms": [ - "ios", - "android" - ] - }, - "repository": { - "type": "git", - "url": "git+https://github.com/CleverTap/clevertap-cordova.git" - }, - "keywords": [ - "CleverTap", - "ecosystem:cordova", - "cordova-ios", - "cordova-android" - ], - "engines": { - "cordovaDependencies": { - "2.3.2": { - "cordova-ios": ">=4.3.0", - "cordova-android": ">6.3.0", - "cordova": ">=7.0.0" - } - } - }, - "author": "CleverTap", - "license": "Commercial", - "bugs": { - "url": "https://github.com/CleverTap/clevertap-cordova/issues" - }, - "homepage": "https://github.com/CleverTap/clevertap-cordova#readme", - "dependencies": {} -} diff --git a/Samples/Cordova/ExampleProject/plugins/clevertap-cordova/plugin.xml b/Samples/Cordova/ExampleProject/plugins/clevertap-cordova/plugin.xml deleted file mode 100644 index 7acd5a43..00000000 --- a/Samples/Cordova/ExampleProject/plugins/clevertap-cordova/plugin.xml +++ /dev/null @@ -1,117 +0,0 @@ - - - CleverTap - CleverTap Plugin for Cordova/PhoneGap - Commercial - CleverTap - - - - - - - - - - - - - - - - - - - $CLEVERTAP_ACCOUNT_ID - - - - $CLEVERTAP_TOKEN - - - - $CLEVERTAP_REGION - - - - development - - - production - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Samples/Cordova/ExampleProject/plugins/clevertap-cordova/scripts/androidAfterPluginAdd.js b/Samples/Cordova/ExampleProject/plugins/clevertap-cordova/scripts/androidAfterPluginAdd.js deleted file mode 100644 index 9bd8971a..00000000 --- a/Samples/Cordova/ExampleProject/plugins/clevertap-cordova/scripts/androidAfterPluginAdd.js +++ /dev/null @@ -1,64 +0,0 @@ -#!/usr/bin/env node - -module.exports = function(context) { - - var fs = require('fs'), - path = require('path'); - - var platformRoot = path.join(context.opts.projectRoot, 'platforms/android/app/src/main'); - - var manifestFile = path.join(platformRoot, 'AndroidManifest.xml'); - - if (fs.existsSync(manifestFile)) { - try { - fs.readFile(manifestFile, 'utf8', function (err,data) { - if (err) { - throw new Error('Unable to find AndroidManifest.xml: ' + err); - } - - var appClass = 'com.clevertap.android.sdk.Application'; - - if (data.indexOf(appClass) == -1) { - - var result = data.replace(/([^\@<]+?)<\/string>', "i"), '') - - s = s.replace(new RegExp('([^\@<]+?)<\/string>', "i"), '') - - s = s.replace(new RegExp('(\r\n|\n|\r)[ \t]*(\r\n|\n|\r)', "gm"), '$1') - - s = s.replace(new RegExp('', "i"), '' + jsonContents.client[0].client_info.mobilesdk_app_id + '\n') - - s = s.replace(new RegExp('', "i"), '' + jsonContents.client[0].api_key[0].current_key + '\n') - - fs.writeFileSync("platforms/android/app/src/main/res/values/strings.xml", s); - } catch (err) { - process.stdout.write(err); - } - break; - } - }; -} diff --git a/Samples/Cordova/ExampleProject/plugins/clevertap-cordova/src/android/CleverTapPlugin.java b/Samples/Cordova/ExampleProject/plugins/clevertap-cordova/src/android/CleverTapPlugin.java deleted file mode 100644 index 8991e8a9..00000000 --- a/Samples/Cordova/ExampleProject/plugins/clevertap-cordova/src/android/CleverTapPlugin.java +++ /dev/null @@ -1,2117 +0,0 @@ -// -// CleverTapPlugin.java -// Copyright (C) 2015 CleverTap -// -// This code is provided under a commercial License. -// A copy of this license has been distributed in a file called LICENSE -// with this source code. -// -// - -package com.clevertap.cordova; - -import android.content.Intent; -import android.net.Uri; -import android.os.Bundle; -import android.util.Log; -import android.location.Location; - -import com.clevertap.android.sdk.pushnotification.CTPushNotificationListener; -import com.clevertap.android.sdk.pushnotification.amp.CTPushAmpListener; -import java.util.Set; -import org.apache.cordova.CordovaInterface; -import org.apache.cordova.CordovaWebView; -import org.apache.cordova.CordovaPlugin; -import org.apache.cordova.CallbackContext; -import org.apache.cordova.PluginResult; - -import org.json.JSONArray; -import org.json.JSONException; -import org.json.JSONObject; -import java.lang.Exception; - -import java.text.ParseException; -import java.text.SimpleDateFormat; -import java.util.List; -import java.util.Locale; -import java.util.Date; -import java.util.Map; -import java.util.HashMap; -import java.util.Iterator; -import java.util.ArrayList; - -import com.clevertap.android.sdk.ActivityLifecycleCallback; -import com.clevertap.android.sdk.CTFeatureFlagsListener; -import com.clevertap.android.sdk.CleverTapAPI; -import com.clevertap.android.sdk.SyncListener; -import com.clevertap.android.sdk.InAppNotificationListener; -import com.clevertap.android.sdk.events.EventDetail; -import com.clevertap.android.sdk.UTMDetail; -import com.clevertap.android.sdk.CTInboxListener; -import com.clevertap.android.sdk.CTInboxStyleConfig; -import com.clevertap.android.sdk.inbox.CTInboxMessage; -import com.clevertap.android.sdk.InboxMessageButtonListener; -import com.clevertap.android.sdk.InAppNotificationButtonListener; -import com.clevertap.android.sdk.displayunits.model.CleverTapDisplayUnit; -import com.clevertap.android.sdk.displayunits.DisplayUnitListener; -import com.clevertap.android.sdk.product_config.CTProductConfigListener; -import com.clevertap.android.sdk.interfaces.OnInitCleverTapIDListener; -import com.clevertap.android.sdk.interfaces.NotificationHandler; - - -public class CleverTapPlugin extends CordovaPlugin implements SyncListener, InAppNotificationListener, CTInboxListener, - InboxMessageButtonListener, InAppNotificationButtonListener, DisplayUnitListener, - CTFeatureFlagsListener, CTProductConfigListener, CTPushNotificationListener, CTPushAmpListener { - - private static final String LOG_TAG = "CLEVERTAP_PLUGIN"; - private static String CLEVERTAP_API_ERROR; - private static CleverTapAPI cleverTap; - private boolean callbackDone = false; - - - @Override - public void initialize(CordovaInterface cordova, CordovaWebView webView) { - super.initialize(cordova, webView); - - cleverTap = CleverTapAPI.getDefaultInstance(cordova.getActivity().getApplicationContext()); - cleverTap.setSyncListener(this); - cleverTap.setInAppNotificationListener(this); - cleverTap.setCTNotificationInboxListener(this); - cleverTap.setInboxMessageButtonListener(this); - cleverTap.setInAppNotificationButtonListener(this); - cleverTap.setDisplayUnitListener(this); - cleverTap.setCTFeatureFlagsListener(this); - cleverTap.setCTProductConfigListener(this); - cleverTap.setCTPushNotificationListener(this); - cleverTap.setCTPushAmpListener(this); - cleverTap.setLibrary("Cordova"); - - try { - String ptHandler = "com.clevertap.android.pushtemplates.PushTemplateNotificationHandler"; - CleverTapAPI.setNotificationHandler((NotificationHandler) (Class.forName(ptHandler).getConstructor().newInstance())); - System.out.println("Push templates dependency available"); - } - catch (Throwable e){ - System.out.println("Push templates dependency not found"); - } - - onNewIntent(cordova.getActivity().getIntent()); - - } - - /** - * Called when the activity receives a new intent. - */ - public void onNewIntent(Intent intent) { - if (intent == null) return; - - // deeplink - if (intent.getAction() != null && intent.getAction().equals(Intent.ACTION_VIEW)) { - Uri data = intent.getData(); - if (data != null) { - final String json = "{'deeplink':'" + data.toString() + "'}"; - - cordova.getActivity().runOnUiThread(new Runnable() { - @Override - public void run() { - webView.loadUrl("javascript:cordova.fireDocumentEvent('onDeepLink'," + json + ");"); - } - }); - - } - } - // push notification - else { - Bundle extras = intent.getExtras(); - Boolean isPushNotification = (extras != null && extras.get("wzrk_pn") != null); - if (isPushNotification) { - JSONObject data = new JSONObject(); - - for (String key : extras.keySet()) { - try { - Object value = extras.get(key); - if (value instanceof Map) { - JSONObject jsonObject = new JSONObject((Map) value); - data.put(key, jsonObject); - } else if (value instanceof List) { - JSONArray jsonArray = new JSONArray((List) value); - data.put(key, jsonArray); - } else { - data.put(key, extras.get(key)); - } - } catch (Throwable t) { - // no-op - } - } - - final String json = "{'notification':" + data.toString() + "}"; - cordova.getActivity().runOnUiThread(new Runnable() { - @Override - public void run() { - webView.loadUrl("javascript:cordova.fireDocumentEvent('onPushNotification'," + json + ");"); - } - }); - - if (!callbackDone) { - final String callbackJson = "{'customExtras':" + data.toString() + "}"; - - webView.getView().post(new Runnable() { - public void run() { - - webView.loadUrl( - "javascript:cordova.fireDocumentEvent('onCleverTapPushNotificationTappedWithCustomExtras'," - + callbackJson + ");"); - } - }); - } - - } - } - } - - @Override - public boolean execute(String action, JSONArray args, final CallbackContext callbackContext) throws JSONException { - - Log.d(LOG_TAG, "handling action " + action); - - boolean haveError = false; - String errorMsg = "unhandled CleverTapPlugin action"; - - PluginResult result = null; - - if (!checkCleverTapInitialized()) { - result = new PluginResult(PluginResult.Status.ERROR, "CleverTap API not initialized"); - result.setKeepCallback(true); - callbackContext.sendPluginResult(result); - return true; - } - - // manually start application life cycle - else if (action.equals("notifyDeviceReady")) { - cordova.getThreadPool().execute(new Runnable() { - public void run() { - ActivityLifecycleCallback.register(cordova.getActivity().getApplication()); - CleverTapAPI.setAppForeground(true); - CleverTapAPI.onActivityResumed(cordova.getActivity()); - PluginResult _result = new PluginResult(PluginResult.Status.NO_RESULT); - _result.setKeepCallback(true); - callbackContext.sendPluginResult(_result); - } - }); - - return true; - } - - // not required for Android here but handle as its in the JS interface - else if (action.equals("registerPush")) { - result = new PluginResult(PluginResult.Status.NO_RESULT); - result.setKeepCallback(true); - callbackContext.sendPluginResult(result); - return true; - } else if (action.equals("setPushTokenAsString")) { - final String token = args.getString(0); - cordova.getThreadPool().execute(new Runnable() { - public void run() { - cleverTap.pushFcmRegistrationId(token, true); - PluginResult _result = new PluginResult(PluginResult.Status.NO_RESULT); - _result.setKeepCallback(true); - callbackContext.sendPluginResult(_result); - } - }); - return true; - } else if (action.equals("setPushXiaomiTokenAsString")) { - final String token = args.getString(0); - cordova.getThreadPool().execute(new Runnable() { - public void run() { - cleverTap.pushXiaomiRegistrationId(token, true); - PluginResult _result = new PluginResult(PluginResult.Status.NO_RESULT); - _result.setKeepCallback(true); - callbackContext.sendPluginResult(_result); - } - }); - return true; - } else if (action.equals("setPushBaiduTokenAsString")) { - final String token = args.getString(0); - cordova.getThreadPool().execute(new Runnable() { - public void run() { - cleverTap.pushBaiduRegistrationId(token, true); - PluginResult _result = new PluginResult(PluginResult.Status.NO_RESULT); - _result.setKeepCallback(true); - callbackContext.sendPluginResult(_result); - } - }); - return true; - } else if (action.equals("setPushHuaweiTokenAsString")) { - final String token = args.getString(0); - cordova.getThreadPool().execute(new Runnable() { - public void run() { - cleverTap.pushHuaweiRegistrationId(token, true); - PluginResult _result = new PluginResult(PluginResult.Status.NO_RESULT); - _result.setKeepCallback(true); - callbackContext.sendPluginResult(_result); - } - }); - return true; - } else if (action.equals("createNotification")) { - final String extras = args.getString(0); - JSONObject json = new JSONObject(extras); - Bundle bundle = new Bundle(); - for (Iterator entry = json.keys(); entry.hasNext(); ) { - String key = entry.next(); - String str = json.optString(key); - bundle.putString(key, str); - } - cordova.getThreadPool().execute(new Runnable() { - public void run() { - cleverTap.createNotification(cordova.getActivity().getApplicationContext(), bundle); - PluginResult _result = new PluginResult(PluginResult.Status.NO_RESULT); - _result.setKeepCallback(true); - callbackContext.sendPluginResult(_result); - } - }); - return true; - } - - /* Android O functions start*/ - else if (action.equals("createNotificationChannel")) { - final String channelId = (args.length() == 5 ? args.getString(0) : ""); - final String channelName = (args.length() == 5 ? args.getString(1) : ""); - final String channelDescription = (args.length() == 5 ? args.getString(2) : ""); - final int importance = Integer.parseInt((args.length() == 5 ? args.getString(3) : "0")); - final boolean showBadge = Boolean.valueOf((args.length() == 5 ? args.getString(4) : "false")); - cordova.getThreadPool().execute(new Runnable() { - public void run() { - cleverTap.createNotificationChannel(cordova.getActivity().getApplicationContext(), channelId, channelName, channelDescription, importance, showBadge); - PluginResult _result = new PluginResult(PluginResult.Status.NO_RESULT); - _result.setKeepCallback(true); - callbackContext.sendPluginResult(_result); - } - }); - return true; - } else if (action.equals("createNotificationChannelWithSound")) { - final String channelId = (args.length() == 6 ? args.getString(0) : ""); - final String channelName = (args.length() == 6 ? args.getString(1) : ""); - final String channelDescription = (args.length() == 6 ? args.getString(2) : ""); - final int importance = Integer.parseInt((args.length() == 6 ? args.getString(3) : "0")); - final boolean showBadge = Boolean.valueOf((args.length() == 6 ? args.getString(4) : "false")); - final String sound = (args.length() == 6 ? args.getString(5) : ""); - cordova.getThreadPool().execute(new Runnable() { - public void run() { - cleverTap.createNotificationChannel(cordova.getActivity().getApplicationContext(), channelId, channelName, channelDescription, importance, showBadge, sound); - PluginResult _result = new PluginResult(PluginResult.Status.NO_RESULT); - _result.setKeepCallback(true); - callbackContext.sendPluginResult(_result); - } - }); - return true; - } else if (action.equals("createNotificationChannelWithGroupId")) { - final String channelId = (args.length() == 6 ? args.getString(0) : ""); - final String channelName = (args.length() == 6 ? args.getString(1) : ""); - final String channelDescription = (args.length() == 6 ? args.getString(2) : ""); - final int importance = Integer.parseInt((args.length() == 6 ? args.getString(3) : "0")); - final String groupId = (args.length() == 6 ? args.getString(4) : ""); - final boolean showBadge = Boolean.valueOf((args.length() == 6 ? args.getString(5) : "false")); - cordova.getThreadPool().execute(new Runnable() { - public void run() { - cleverTap.createNotificationChannel(cordova.getActivity().getApplicationContext(), channelId, channelName, channelDescription, importance, groupId, showBadge); - PluginResult _result = new PluginResult(PluginResult.Status.NO_RESULT); - _result.setKeepCallback(true); - callbackContext.sendPluginResult(_result); - } - }); - return true; - } else if (action.equals("createNotificationChannelWithGroupIdAndSound")) { - final String channelId = (args.length() == 7 ? args.getString(0) : ""); - final String channelName = (args.length() == 7 ? args.getString(1) : ""); - final String channelDescription = (args.length() == 7 ? args.getString(2) : ""); - final int importance = Integer.parseInt((args.length() == 7 ? args.getString(3) : "0")); - final String groupId = (args.length() == 7 ? args.getString(4) : ""); - final boolean showBadge = Boolean.valueOf((args.length() == 7 ? args.getString(5) : "false")); - final String sound = (args.length() == 7 ? args.getString(6) : ""); - cordova.getThreadPool().execute(new Runnable() { - public void run() { - cleverTap.createNotificationChannel(cordova.getActivity().getApplicationContext(), channelId, channelName, channelDescription, importance, groupId, showBadge, sound); - PluginResult _result = new PluginResult(PluginResult.Status.NO_RESULT); - _result.setKeepCallback(true); - callbackContext.sendPluginResult(_result); - } - }); - return true; - } else if (action.equals("createNotificationChannelGroup")) { - final String groupId = (args.length() == 2 ? args.getString(0) : ""); - final String groupName = (args.length() == 2 ? args.getString(1) : ""); - cordova.getThreadPool().execute(new Runnable() { - public void run() { - cleverTap.createNotificationChannelGroup(cordova.getActivity().getApplicationContext(), groupId, groupName); - PluginResult _result = new PluginResult(PluginResult.Status.NO_RESULT); - _result.setKeepCallback(true); - callbackContext.sendPluginResult(_result); - } - }); - return true; - } else if (action.equals("deleteNotificationChannel")) { - final String channelId = (args.length() == 1 ? args.getString(0) : ""); - cordova.getThreadPool().execute(new Runnable() { - public void run() { - cleverTap.deleteNotificationChannel(cordova.getActivity().getApplicationContext(), channelId); - PluginResult _result = new PluginResult(PluginResult.Status.NO_RESULT); - _result.setKeepCallback(true); - callbackContext.sendPluginResult(_result); - } - }); - return true; - } else if (action.equals("deleteNotificationChannelGroup")) { - final String groupId = (args.length() == 1 ? args.getString(0) : ""); - cordova.getThreadPool().execute(new Runnable() { - public void run() { - cleverTap.deleteNotificationChannelGroup(cordova.getActivity().getApplicationContext(), groupId); - PluginResult _result = new PluginResult(PluginResult.Status.NO_RESULT); - _result.setKeepCallback(true); - callbackContext.sendPluginResult(_result); - } - }); - return true; - } - /* Android O functions end*/ - - else if (action.equals("recordScreenView")) { - final String screen = (args.length() == 1 ? args.getString(0) : ""); - cordova.getThreadPool().execute(new Runnable() { - public void run() { - cleverTap.recordScreen(screen); - PluginResult _result = new PluginResult(PluginResult.Status.NO_RESULT); - _result.setKeepCallback(true); - callbackContext.sendPluginResult(_result); - } - }); - return true; - } else if (action.equals("setDebugLevel")) { - int level = (args.length() == 1 ? args.getInt(0) : -2); - if (level >= -1) { - CleverTapAPI.setDebugLevel(level); - result = new PluginResult(PluginResult.Status.NO_RESULT); - result.setKeepCallback(true); - callbackContext.sendPluginResult(result); - return true; - } - - } - - //Enables tracking opt out for the currently active user. - else if (action.equals("setOptOut")) { - final boolean value = args.getBoolean(0); - cordova.getThreadPool().execute(new Runnable() { - public void run() { - cleverTap.setOptOut(value); - PluginResult _result = new PluginResult(PluginResult.Status.NO_RESULT); - _result.setKeepCallback(true); - callbackContext.sendPluginResult(_result); - } - }); - return true; - } - //Sets the SDK to offline mode - else if (action.equals("setOffline")) { - final boolean value = args.getBoolean(0); - cordova.getThreadPool().execute(new Runnable() { - public void run() { - cleverTap.setOffline(value); - PluginResult _result = new PluginResult(PluginResult.Status.NO_RESULT); - _result.setKeepCallback(true); - callbackContext.sendPluginResult(_result); - } - }); - return true; - } - - //Enables the reporting of device network related information, including IP address. This reporting is disabled by default. - else if (action.equals("enableDeviceNetworkInfoReporting")) { - final boolean value = args.getBoolean(0); - cordova.getThreadPool().execute(new Runnable() { - public void run() { - cleverTap.enableDeviceNetworkInfoReporting(value); - PluginResult _result = new PluginResult(PluginResult.Status.NO_RESULT); - _result.setKeepCallback(true); - callbackContext.sendPluginResult(_result); - } - }); - return true; - } else if (action.equals("enablePersonalization")) { - cordova.getThreadPool().execute(new Runnable() { - public void run() { - cleverTap.enablePersonalization(); - PluginResult _result = new PluginResult(PluginResult.Status.NO_RESULT); - _result.setKeepCallback(true); - callbackContext.sendPluginResult(_result); - } - }); - return true; - - } else if (action.equals("disablePersonalization")) { - cordova.getThreadPool().execute(new Runnable() { - public void run() { - cleverTap.disablePersonalization(); - PluginResult _result = new PluginResult(PluginResult.Status.NO_RESULT); - _result.setKeepCallback(true); - callbackContext.sendPluginResult(_result); - } - }); - return true; - - } else if (action.equals("recordEventWithName")) { - final String eventName = (args.length() == 1 ? args.getString(0) : null); - if (eventName != null) { - cordova.getThreadPool().execute(new Runnable() { - public void run() { - cleverTap.pushEvent(eventName); - PluginResult _result = new PluginResult(PluginResult.Status.NO_RESULT); - _result.setKeepCallback(true); - callbackContext.sendPluginResult(_result); - } - }); - return true; - - } else { - errorMsg = "eventName cannot be null"; - } - } else if (action.equals("recordEventWithNameAndProps")) { - String eventName = null; - JSONObject jsonProps; - HashMap _props = null; - - if (args.length() == 2) { - if (!args.isNull(0)) { - eventName = args.getString(0); - } else { - haveError = true; - errorMsg = "eventName cannot be null"; - } - if (!args.isNull(1)) { - jsonProps = args.getJSONObject(1); - try { - _props = toMap(jsonProps); - } catch (JSONException e) { - haveError = true; - errorMsg = "Error parsing event properties"; - } - } else { - haveError = true; - errorMsg = "Arg cannot be null"; - } - } else { - haveError = true; - errorMsg = "Expected 2 arguments"; - } - - if (!haveError) { - final String _eventName = eventName; - final HashMap props = _props; - cordova.getThreadPool().execute(new Runnable() { - public void run() { - cleverTap.pushEvent(_eventName, props); - PluginResult _result = new PluginResult(PluginResult.Status.NO_RESULT); - _result.setKeepCallback(true); - callbackContext.sendPluginResult(_result); - } - }); - return true; - } - } else if (action.equals("recordChargedEventWithDetailsAndItems")) { - JSONObject jsonDetails; - JSONArray jsonItems; - HashMap _details = null; - ArrayList> _items = null; - - if (args.length() == 2) { - if (!args.isNull(0)) { - jsonDetails = args.getJSONObject(0); - try { - _details = toMap(jsonDetails); - } catch (JSONException e) { - haveError = true; - errorMsg = "Error parsing arg " + e.getLocalizedMessage(); - } - } else { - haveError = true; - errorMsg = "Arg cannot be null"; - } - if (!args.isNull(1)) { - jsonItems = args.getJSONArray(1); - try { - _items = toArrayListOfStringObjectMaps(jsonItems); - } catch (JSONException e) { - haveError = true; - errorMsg = "Error parsing arg " + e.getLocalizedMessage(); - } - } else { - haveError = true; - errorMsg = "Arg cannot be null"; - } - } else { - haveError = true; - errorMsg = "Expected 2 arguments"; - } - - if (!haveError) { - final HashMap details = _details; - final ArrayList> items = _items; - cordova.getThreadPool().execute(new Runnable() { - public void run() { - cleverTap.pushChargedEvent(details, items); - PluginResult _result = new PluginResult(PluginResult.Status.NO_RESULT); - _result.setKeepCallback(true); - callbackContext.sendPluginResult(_result); - } - }); - return true; - } - } else if (action.equals("pushInstallReferrer")) { - String source = null; - String campaign = null; - String medium = null; - - if (args.length() == 3) { - if (!args.isNull(0)) { - source = args.getString(0); - } else { - haveError = true; - errorMsg = "source cannot be null"; - } - if (!args.isNull(1)) { - medium = args.getString(1); - } else { - haveError = true; - errorMsg = "medium cannot be null"; - } - if (!args.isNull(2)) { - campaign = args.getString(2); - } else { - haveError = true; - errorMsg = "campaign cannot be null"; - } - } else { - haveError = true; - errorMsg = "Expected 3 arguments"; - } - - if (!haveError) { - final String _source = source; - final String _medium = medium; - final String _campaign = campaign; - cordova.getThreadPool().execute(new Runnable() { - public void run() { - cleverTap.pushInstallReferrer(_source, _medium, _campaign); - PluginResult _result = new PluginResult(PluginResult.Status.NO_RESULT); - _result.setKeepCallback(true); - callbackContext.sendPluginResult(_result); - } - }); - return true; - } - } else if (action.equals("eventGetFirstTime")) { - final String eventName = (args.length() == 1 ? args.getString(0) : null); - if (eventName != null) { - cordova.getThreadPool().execute(new Runnable() { - public void run() { - double first = cleverTap.getFirstTime(eventName); - PluginResult _result = new PluginResult(PluginResult.Status.OK, (float) first); - _result.setKeepCallback(true); - callbackContext.sendPluginResult(_result); - } - }); - return true; - - } else { - errorMsg = "eventName cannot be null"; - } - } else if (action.equals("eventGetLastTime")) { - final String eventName = (args.length() == 1 ? args.getString(0) : null); - if (eventName != null) { - cordova.getThreadPool().execute(new Runnable() { - public void run() { - double lastTime = cleverTap.getLastTime(eventName); - PluginResult _result = new PluginResult(PluginResult.Status.OK, (float) lastTime); - _result.setKeepCallback(true); - callbackContext.sendPluginResult(_result); - } - }); - return true; - - } else { - errorMsg = "eventName cannot be null"; - } - } else if (action.equals("eventGetOccurrences")) { - final String eventName = (args.length() == 1 ? args.getString(0) : null); - if (eventName != null) { - cordova.getThreadPool().execute(new Runnable() { - public void run() { - int num = cleverTap.getCount(eventName); - PluginResult _result = new PluginResult(PluginResult.Status.OK, num); - _result.setKeepCallback(true); - callbackContext.sendPluginResult(_result); - } - }); - return true; - - } else { - errorMsg = "eventName cannot be null"; - } - } else if (action.equals("eventGetDetails")) { - final String eventName = (args.length() == 1 ? args.getString(0) : null); - if (eventName != null) { - cordova.getThreadPool().execute(new Runnable() { - public void run() { - EventDetail details = cleverTap.getDetails(eventName); - try { - JSONObject jsonDetails = CleverTapPlugin.eventDetailsToJSON(details); - PluginResult _result = new PluginResult(PluginResult.Status.OK, jsonDetails); - _result.setKeepCallback(true); - callbackContext.sendPluginResult(_result); - } catch (JSONException e) { - PluginResult _result = new PluginResult(PluginResult.Status.ERROR, e.getLocalizedMessage()); - _result.setKeepCallback(true); - callbackContext.sendPluginResult(_result); - } - } - }); - return true; - - } else { - errorMsg = "eventName cannot be null"; - } - } else if (action.equals("getEventHistory")) { - cordova.getThreadPool().execute(new Runnable() { - public void run() { - Map history = cleverTap.getHistory(); - try { - JSONObject jsonDetails = CleverTapPlugin.eventHistoryToJSON(history); - PluginResult _result = new PluginResult(PluginResult.Status.OK, jsonDetails); - _result.setKeepCallback(true); - callbackContext.sendPluginResult(_result); - } catch (JSONException e) { - PluginResult _result = new PluginResult(PluginResult.Status.ERROR, e.getLocalizedMessage()); - _result.setKeepCallback(true); - callbackContext.sendPluginResult(_result); - } - } - }); - return true; - } else if (action.equals("setLocation")) { - Double lat = null; - Double lon = null; - - if (args.length() == 2) { - if (!args.isNull(0)) { - lat = args.getDouble(0); - } else { - haveError = true; - errorMsg = "lat cannot be null"; - } - if (!args.isNull(1)) { - lon = args.getDouble(1); - } else { - haveError = true; - errorMsg = "lon cannot be null"; - } - } else { - haveError = true; - errorMsg = "Expected 2 arguments"; - } - - if (!haveError) { - final Location location = new Location("CleverTapPlugin"); - location.setLatitude(lat); - location.setLongitude(lon); - cordova.getThreadPool().execute(new Runnable() { - public void run() { - cleverTap.setLocation(location); - PluginResult _result = new PluginResult(PluginResult.Status.NO_RESULT); - _result.setKeepCallback(true); - callbackContext.sendPluginResult(_result); - } - }); - return true; - } - } else if (action.equals("getLocation")) { - cordova.getThreadPool().execute(new Runnable() { - public void run() { - Location location = cleverTap.getLocation(); - PluginResult _result = null; - try { - if (location != null) { - JSONObject jsonLoc = new JSONObject(); - jsonLoc.put("lat", location.getLatitude()); - jsonLoc.put("lon", location.getLongitude()); - _result = new PluginResult(PluginResult.Status.OK, jsonLoc); - } - } catch (Throwable t) { - // no-op - } - - if (_result == null) { - _result = new PluginResult(PluginResult.Status.ERROR, "Unable to get location"); - } - _result.setKeepCallback(true); - callbackContext.sendPluginResult(_result); - } - }); - return true; - } else if (action.equals("profileSet")) { - JSONObject jsonProfile = null; - - if (args.length() == 1) { - if (!args.isNull(0)) { - jsonProfile = args.getJSONObject(0); - } else { - haveError = true; - errorMsg = "profile cannot be null"; - } - - } else { - haveError = true; - errorMsg = "Expected 1 argument"; - } - - if (!haveError) { - final JSONObject _jsonProfile = jsonProfile; - cordova.getThreadPool().execute(new Runnable() { - public void run() { - try { - HashMap profile = formatProfile(_jsonProfile); - cleverTap.pushProfile(profile); - } catch (Exception e) { - Log.d(LOG_TAG, "Error setting profile " + e.getLocalizedMessage()); - } - PluginResult _result = new PluginResult(PluginResult.Status.NO_RESULT); - _result.setKeepCallback(true); - callbackContext.sendPluginResult(_result); - } - }); - - return true; - } - } else if (action.equals("onUserLogin")) { - JSONObject jsonProfile = null; - - if (args.length() == 1) { - if (!args.isNull(0)) { - jsonProfile = args.getJSONObject(0); - } else { - haveError = true; - errorMsg = "profile cannot be null"; - } - - } else { - haveError = true; - errorMsg = "Expected 1 argument"; - } - - if (!haveError) { - final JSONObject _jsonProfile = jsonProfile; - cordova.getThreadPool().execute(new Runnable() { - public void run() { - try { - HashMap profile = formatProfile(_jsonProfile); - cleverTap.onUserLogin(profile); - } catch (Exception e) { - Log.d(LOG_TAG, "Error in onUserLogin " + e.getLocalizedMessage()); - } - PluginResult _result = new PluginResult(PluginResult.Status.NO_RESULT); - _result.setKeepCallback(true); - callbackContext.sendPluginResult(_result); - } - }); - - return true; - } - } else if (action.equals("profileGetProperty")) { - final String propertyName = (args.length() == 1 ? args.getString(0) : null); - if (propertyName != null) { - cordova.getThreadPool().execute(new Runnable() { - public void run() { - PluginResult _result; - Object prop = cleverTap.getProperty(propertyName); - - if (prop instanceof JSONArray) { - JSONArray _prop = (JSONArray) prop; - _result = new PluginResult(PluginResult.Status.OK, _prop); - - } else { - String _prop; - if (prop != null) { - _prop = prop.toString(); - } else { - _prop = null; - } - _result = new PluginResult(PluginResult.Status.OK, _prop); - } - - _result.setKeepCallback(true); - callbackContext.sendPluginResult(_result); - } - }); - return true; - - } else { - errorMsg = "propertyName cannot be null"; - } - } else if (action.equals("profileGetCleverTapID")) { - cordova.getThreadPool().execute(new Runnable() { - public void run() { - String CleverTapID = cleverTap.getCleverTapID(); - PluginResult _result = new PluginResult(PluginResult.Status.OK, CleverTapID); - _result.setKeepCallback(true); - callbackContext.sendPluginResult(_result); - } - }); - return true; - } else if (action.equals("profileGetCleverTapAttributionIdentifier")) { - cordova.getThreadPool().execute(new Runnable() { - public void run() { - String attributionID = cleverTap.getCleverTapAttributionIdentifier(); - PluginResult _result = new PluginResult(PluginResult.Status.OK, attributionID); - _result.setKeepCallback(true); - callbackContext.sendPluginResult(_result); - } - }); - return true; - } else if (action.equals("getCleverTapID")) { - cordova.getThreadPool().execute(new Runnable() { - public void run() { - cleverTap.getCleverTapID(new OnInitCleverTapIDListener() { - @Override - public void onInitCleverTapID(final String cleverTapID) { - // Callback on main thread - PluginResult _result = new PluginResult(PluginResult.Status.OK, cleverTapID); - _result.setKeepCallback(true); - callbackContext.sendPluginResult(_result); - } - - }); - } - }); - return true; - } else if (action.equals("profileRemoveValueForKey")) { - final String key = (args.length() == 1 ? args.getString(0) : null); - if (key != null) { - cordova.getThreadPool().execute(new Runnable() { - public void run() { - cleverTap.removeValueForKey(key); - PluginResult _result = new PluginResult(PluginResult.Status.NO_RESULT); - _result.setKeepCallback(true); - callbackContext.sendPluginResult(_result); - } - }); - return true; - - } else { - errorMsg = "property key cannot be null"; - } - } else if (action.equals("profileSetMultiValues")) { - String key = null; - JSONArray values = null; - - if (args.length() == 2) { - if (!args.isNull(0)) { - key = args.getString(0); - } else { - haveError = true; - errorMsg = "key cannot be null"; - } - if (!args.isNull(1)) { - values = args.getJSONArray(1); - if (values == null) { - haveError = true; - errorMsg = "values cannot be null"; - } - } else { - haveError = true; - errorMsg = "values cannot be null"; - } - } else { - haveError = true; - errorMsg = "Expected 2 arguments"; - } - - if (!haveError) { - final String _key = key; - final ArrayList _values = new ArrayList(); - try { - for (int i = 0; i < values.length(); i++) { - _values.add(values.get(i).toString()); - } - - cordova.getThreadPool().execute(new Runnable() { - public void run() { - cleverTap.setMultiValuesForKey(_key, _values); - PluginResult _result = new PluginResult(PluginResult.Status.NO_RESULT); - _result.setKeepCallback(true); - callbackContext.sendPluginResult(_result); - } - }); - - return true; - - } catch (Exception e) { - // no-op - } - } - } else if (action.equals("profileAddMultiValues")) { - String key = null; - JSONArray values = null; - - if (args.length() == 2) { - if (!args.isNull(0)) { - key = args.getString(0); - } else { - haveError = true; - errorMsg = "key cannot be null"; - } - if (!args.isNull(1)) { - values = args.getJSONArray(1); - if (values == null) { - haveError = true; - errorMsg = "values cannot be null"; - } - } else { - haveError = true; - errorMsg = "values cannot be null"; - } - } else { - haveError = true; - errorMsg = "Expected 2 arguments"; - } - - if (!haveError) { - final String _key = key; - final ArrayList _values = new ArrayList(); - try { - for (int i = 0; i < values.length(); i++) { - _values.add(values.get(i).toString()); - } - - cordova.getThreadPool().execute(new Runnable() { - public void run() { - cleverTap.addMultiValuesForKey(_key, _values); - PluginResult _result = new PluginResult(PluginResult.Status.NO_RESULT); - _result.setKeepCallback(true); - callbackContext.sendPluginResult(_result); - } - }); - - return true; - - } catch (Exception e) { - // no-op - } - } - } else if (action.equals("profileRemoveMultiValues")) { - String key = null; - JSONArray values = null; - - if (args.length() == 2) { - if (!args.isNull(0)) { - key = args.getString(0); - } else { - haveError = true; - errorMsg = "key cannot be null"; - } - if (!args.isNull(1)) { - values = args.getJSONArray(1); - if (values == null) { - haveError = true; - errorMsg = "values cannot be null"; - } - } else { - haveError = true; - errorMsg = "values cannot be null"; - } - } else { - haveError = true; - errorMsg = "Expected 2 arguments"; - } - - if (!haveError) { - final String _key = key; - final ArrayList _values = new ArrayList(); - try { - for (int i = 0; i < values.length(); i++) { - _values.add(values.get(i).toString()); - } - - cordova.getThreadPool().execute(new Runnable() { - public void run() { - cleverTap.removeMultiValuesForKey(_key, _values); - PluginResult _result = new PluginResult(PluginResult.Status.NO_RESULT); - _result.setKeepCallback(true); - callbackContext.sendPluginResult(_result); - } - }); - - return true; - - } catch (Exception e) { - // no-op - } - } - } else if (action.equals("profileAddMultiValue")) { - String key = null; - String value = null; - - if (args.length() == 2) { - if (!args.isNull(0)) { - key = args.getString(0); - } else { - haveError = true; - errorMsg = "key cannot be null"; - } - if (!args.isNull(1)) { - value = args.getString(1); - } else { - haveError = true; - errorMsg = "value cannot be null"; - } - } else { - haveError = true; - errorMsg = "Expected 2 arguments"; - } - - if (!haveError) { - final String _key = key; - final String _value = value; - - cordova.getThreadPool().execute(new Runnable() { - public void run() { - cleverTap.addMultiValueForKey(_key, _value); - PluginResult _result = new PluginResult(PluginResult.Status.NO_RESULT); - _result.setKeepCallback(true); - callbackContext.sendPluginResult(_result); - } - }); - return true; - } - } else if (action.equals("profileRemoveMultiValue")) { - String key = null; - String value = null; - - if (args.length() == 2) { - if (!args.isNull(0)) { - key = args.getString(0); - } else { - haveError = true; - errorMsg = "key cannot be null"; - } - if (!args.isNull(1)) { - value = args.getString(1); - } else { - haveError = true; - errorMsg = "value cannot be null"; - } - } else { - haveError = true; - errorMsg = "Expected 2 arguments"; - } - - if (!haveError) { - final String _key = key; - final String _value = value; - - cordova.getThreadPool().execute(new Runnable() { - public void run() { - cleverTap.removeMultiValueForKey(_key, _value); - PluginResult _result = new PluginResult(PluginResult.Status.NO_RESULT); - _result.setKeepCallback(true); - callbackContext.sendPluginResult(_result); - } - }); - return true; - } - } else if (action.equals("profileIncrementValueBy")) { - String key = null; - Double value = null; - - if (args.length() == 2) { - if (!args.isNull(0)) { - key = args.getString(0); - } else { - haveError = true; - errorMsg = "key cannot be null"; - } - if (!args.isNull(1)) { - value = args.getDouble(1); - } else { - haveError = true; - errorMsg = "value cannot be null"; - } - } else { - haveError = true; - errorMsg = "Expected 2 arguments"; - } - - if (!haveError) { - final String _key = key; - final Double _value = value; - - cordova.getThreadPool().execute(new Runnable() { - public void run() { - cleverTap.incrementValue(_key, _value); - PluginResult _result = new PluginResult(PluginResult.Status.NO_RESULT); - _result.setKeepCallback(true); - callbackContext.sendPluginResult(_result); - } - }); - return true; - } - } else if (action.equals("profileDecrementValueBy")) { - String key = null; - Double value = null; - - if (args.length() == 2) { - if (!args.isNull(0)) { - key = args.getString(0); - } else { - haveError = true; - errorMsg = "key cannot be null"; - } - if (!args.isNull(1)) { - value = args.getDouble(1); - } else { - haveError = true; - errorMsg = "value cannot be null"; - } - } else { - haveError = true; - errorMsg = "Expected 2 arguments"; - } - - if (!haveError) { - final String _key = key; - final Double _value = value; - - cordova.getThreadPool().execute(new Runnable() { - public void run() { - cleverTap.decrementValue(_key, _value); - PluginResult _result = new PluginResult(PluginResult.Status.NO_RESULT); - _result.setKeepCallback(true); - callbackContext.sendPluginResult(_result); - } - }); - return true; - } - } else if (action.equals("sessionGetTimeElapsed")) { - cordova.getThreadPool().execute(new Runnable() { - public void run() { - int time = cleverTap.getTimeElapsed(); - PluginResult _result = new PluginResult(PluginResult.Status.OK, time); - _result.setKeepCallback(true); - callbackContext.sendPluginResult(_result); - } - }); - return true; - } else if (action.equals("sessionGetTotalVisits")) { - cordova.getThreadPool().execute(new Runnable() { - public void run() { - int count = cleverTap.getTotalVisits(); - PluginResult _result = new PluginResult(PluginResult.Status.OK, count); - _result.setKeepCallback(true); - callbackContext.sendPluginResult(_result); - } - }); - return true; - } else if (action.equals("sessionGetScreenCount")) { - cordova.getThreadPool().execute(new Runnable() { - public void run() { - int count = cleverTap.getScreenCount(); - PluginResult _result = new PluginResult(PluginResult.Status.OK, count); - _result.setKeepCallback(true); - callbackContext.sendPluginResult(_result); - } - }); - return true; - } else if (action.equals("sessionGetPreviousVisitTime")) { - cordova.getThreadPool().execute(new Runnable() { - public void run() { - int time = cleverTap.getPreviousVisitTime(); - PluginResult _result = new PluginResult(PluginResult.Status.OK, time); - _result.setKeepCallback(true); - callbackContext.sendPluginResult(_result); - } - }); - return true; - } else if (action.equals("sessionGetUTMDetails")) { - cordova.getThreadPool().execute(new Runnable() { - public void run() { - UTMDetail details = cleverTap.getUTMDetails(); - try { - JSONObject jsonDetails = CleverTapPlugin.utmDetailsToJSON(details); - PluginResult _result = new PluginResult(PluginResult.Status.OK, jsonDetails); - _result.setKeepCallback(true); - callbackContext.sendPluginResult(_result); - } catch (JSONException e) { - PluginResult _result = new PluginResult(PluginResult.Status.ERROR, e.getLocalizedMessage()); - _result.setKeepCallback(true); - callbackContext.sendPluginResult(_result); - } - } - }); - return true; - } - //Notification Inbox methods - else if (action.equals("initializeInbox")) { - cordova.getThreadPool().execute(new Runnable() { - public void run() { - cleverTap.initializeInbox(); - PluginResult _result = new PluginResult(PluginResult.Status.NO_RESULT); - _result.setKeepCallback(true); - callbackContext.sendPluginResult(_result); - } - }); - } else if (action.equals("showInbox")) { - cordova.getThreadPool().execute(new Runnable() { - public void run() { - try { - JSONObject styleConfigJSON; - CTInboxStyleConfig styleConfig = new CTInboxStyleConfig(); - if (args.length() == 1) { - styleConfigJSON = args.getJSONObject(0); - styleConfig = toStyleConfig(styleConfigJSON); - } - cleverTap.showAppInbox(styleConfig); - PluginResult _result = new PluginResult(PluginResult.Status.NO_RESULT); - _result.setKeepCallback(true); - callbackContext.sendPluginResult(_result); - } catch (JSONException e) { - PluginResult _result = new PluginResult(PluginResult.Status.ERROR, e.getLocalizedMessage()); - _result.setKeepCallback(true); - callbackContext.sendPluginResult(_result); - } - } - }); - } else if (action.equals("getInboxMessageUnreadCount")) { - cordova.getThreadPool().execute(new Runnable() { - public void run() { - int unreadCount = cleverTap.getInboxMessageUnreadCount(); - PluginResult _result = new PluginResult(PluginResult.Status.OK, unreadCount); - _result.setKeepCallback(true); - callbackContext.sendPluginResult(_result); - } - }); - return true; - } else if (action.equals("getInboxMessageCount")) { - cordova.getThreadPool().execute(new Runnable() { - public void run() { - int msgCount = cleverTap.getInboxMessageCount(); - PluginResult _result = new PluginResult(PluginResult.Status.OK, msgCount); - _result.setKeepCallback(true); - callbackContext.sendPluginResult(_result); - } - }); - return true; - } else if (action.equals("getAllInboxMessages")) { - cordova.getThreadPool().execute(new Runnable() { - public void run() { - try { - ArrayList messageList = cleverTap.getAllInboxMessages(); - PluginResult _result = new PluginResult(PluginResult.Status.OK, inboxMessageListToJSONArray(messageList)); - _result.setKeepCallback(true); - callbackContext.sendPluginResult(_result); - } catch (JSONException e) { - PluginResult _result = new PluginResult(PluginResult.Status.ERROR); - _result.setKeepCallback(true); - callbackContext.sendPluginResult(_result); - } - } - }); - return true; - } else if (action.equals("getUnreadInboxMessages")) { - cordova.getThreadPool().execute(new Runnable() { - public void run() { - try { - ArrayList messageList = cleverTap.getUnreadInboxMessages(); - PluginResult _result = new PluginResult(PluginResult.Status.OK, inboxMessageListToJSONArray(messageList)); - _result.setKeepCallback(true); - callbackContext.sendPluginResult(_result); - } catch (JSONException e) { - PluginResult _result = new PluginResult(PluginResult.Status.ERROR); - _result.setKeepCallback(true); - callbackContext.sendPluginResult(_result); - } - } - }); - return true; - } else if (action.equals("getInboxMessageForId")) { - final String messageId = (args.length() == 1 ? args.getString(0) : ""); - - cordova.getThreadPool().execute(new Runnable() { - public void run() { - CTInboxMessage message = cleverTap.getInboxMessageForId(messageId); - try { - PluginResult _result = new PluginResult(PluginResult.Status.OK, message.getData()); - _result.setKeepCallback(true); - callbackContext.sendPluginResult(_result); - } catch (Exception e) { - PluginResult _result = new PluginResult(PluginResult.Status.ERROR, "InboxMessage with ID=" + messageId + " not found!"); - _result.setKeepCallback(true); - callbackContext.sendPluginResult(_result); - } - } - }); - return true; - } else if (action.equals("deleteInboxMessageForId")) { - final String messageId = (args.length() == 1 ? args.getString(0) : ""); - - cordova.getThreadPool().execute(new Runnable() { - public void run() { - cleverTap.deleteInboxMessage(messageId); - PluginResult _result = new PluginResult(PluginResult.Status.NO_RESULT); - _result.setKeepCallback(true); - callbackContext.sendPluginResult(_result); - } - }); - return true; - } else if (action.equals("markReadInboxMessageForId")) { - final String messageId = (args.length() == 1 ? args.getString(0) : ""); - - cordova.getThreadPool().execute(new Runnable() { - public void run() { - cleverTap.markReadInboxMessage(messageId); - PluginResult _result = new PluginResult(PluginResult.Status.NO_RESULT); - _result.setKeepCallback(true); - callbackContext.sendPluginResult(_result); - } - }); - return true; - } else if (action.equals("pushInboxNotificationViewedEventForId")) { - final String messageId = (args.length() == 1 ? args.getString(0) : ""); - - cordova.getThreadPool().execute(new Runnable() { - public void run() { - cleverTap.pushInboxNotificationViewedEvent(messageId); - PluginResult _result = new PluginResult(PluginResult.Status.NO_RESULT); - _result.setKeepCallback(true); - callbackContext.sendPluginResult(_result); - } - }); - return true; - } else if (action.equals("pushInboxNotificationClickedEventForId")) { - final String messageId = (args.length() == 1 ? args.getString(0) : ""); - - cordova.getThreadPool().execute(new Runnable() { - public void run() { - cleverTap.pushInboxNotificationClickedEvent(messageId); - PluginResult _result = new PluginResult(PluginResult.Status.NO_RESULT); - _result.setKeepCallback(true); - callbackContext.sendPluginResult(_result); - } - }); - return true; - } else if (action.equals("getAllDisplayUnits")) { - cordova.getThreadPool().execute(new Runnable() { - public void run() { - try { - ArrayList displayUnits = cleverTap.getAllDisplayUnits(); - PluginResult _result = new PluginResult(PluginResult.Status.OK, displayUnitListToJSONArray(displayUnits)); - _result.setKeepCallback(true); - callbackContext.sendPluginResult(_result); - } catch (JSONException e) { - PluginResult _result = new PluginResult(PluginResult.Status.ERROR); - _result.setKeepCallback(true); - callbackContext.sendPluginResult(_result); - } - } - }); - return true; - } else if (action.equals("getDisplayUnitForId")) { - final String unitId = (args.length() == 1 ? args.getString(0) : ""); - - cordova.getThreadPool().execute(new Runnable() { - public void run() { - CleverTapDisplayUnit displayUnit = cleverTap.getDisplayUnitForId(unitId); - PluginResult _result; - if (displayUnit != null) { - _result = new PluginResult(PluginResult.Status.OK, displayUnit.getJsonObject()); - } else { - _result = new PluginResult(PluginResult.Status.ERROR, "DisplayUnit with ID=" + unitId + " not found!"); - } - _result.setKeepCallback(true); - callbackContext.sendPluginResult(_result); - } - }); - return true; - } else if (action.equals("pushDisplayUnitViewedEventForID")) { - final String unitId = (args.length() == 1 ? args.getString(0) : ""); - - cordova.getThreadPool().execute(new Runnable() { - public void run() { - cleverTap.pushDisplayUnitViewedEventForID(unitId); - PluginResult _result = new PluginResult(PluginResult.Status.NO_RESULT); - _result.setKeepCallback(true); - callbackContext.sendPluginResult(_result); - } - }); - return true; - } else if (action.equals("pushDisplayUnitClickedEventForID")) { - final String unitId = (args.length() == 1 ? args.getString(0) : ""); - - cordova.getThreadPool().execute(new Runnable() { - public void run() { - cleverTap.pushDisplayUnitClickedEventForID(unitId); - PluginResult _result = new PluginResult(PluginResult.Status.NO_RESULT); - _result.setKeepCallback(true); - callbackContext.sendPluginResult(_result); - } - }); - return true; - } else if (action.equals("isFeatureFlagInitialized")) { - cordova.getThreadPool().execute(new Runnable() { - public void run() { - boolean value = cleverTap.featureFlag().isInitialized(); - PluginResult _result = new PluginResult(PluginResult.Status.OK, value); - _result.setKeepCallback(true); - callbackContext.sendPluginResult(_result); - } - }); - return true; - } else if (action.equals("getFeatureFlag")) { - final String name = args.getString(0); - final boolean defaultValue = args.getBoolean(1); - - cordova.getThreadPool().execute(new Runnable() { - public void run() { - boolean value = cleverTap.featureFlag().get(name, defaultValue); - PluginResult _result = new PluginResult(PluginResult.Status.OK, value); - _result.setKeepCallback(true); - callbackContext.sendPluginResult(_result); - } - }); - return true; - } else if (action.equals("isProducConfigInitialized")) { - cordova.getThreadPool().execute(new Runnable() { - public void run() { - boolean value = cleverTap.productConfig().isInitialized(); - PluginResult _result = new PluginResult(PluginResult.Status.OK, value); - _result.setKeepCallback(true); - callbackContext.sendPluginResult(_result); - } - }); - return true; - } else if (action.equals("setDefaultsMap")) { - try { - final HashMap defaultValue = toMap(args.getJSONObject(0)); - - cordova.getThreadPool().execute(new Runnable() { - public void run() { - cleverTap.productConfig().setDefaults(defaultValue); - PluginResult _result = new PluginResult(PluginResult.Status.NO_RESULT); - _result.setKeepCallback(true); - callbackContext.sendPluginResult(_result); - } - }); - - } catch (JSONException e) { - PluginResult _result = new PluginResult(PluginResult.Status.ERROR); - _result.setKeepCallback(true); - callbackContext.sendPluginResult(_result); - } - - return true; - } else if (action.equals("fetch")) { - cordova.getThreadPool().execute(new Runnable() { - public void run() { - cleverTap.productConfig().fetch(); - PluginResult _result = new PluginResult(PluginResult.Status.NO_RESULT); - _result.setKeepCallback(true); - callbackContext.sendPluginResult(_result); - } - }); - return true; - } else if (action.equals("fetchWithMinimumFetchIntervalInSeconds")) { - long interval = args.getInt(0); - cordova.getThreadPool().execute(new Runnable() { - public void run() { - cleverTap.productConfig().fetch(interval); - PluginResult _result = new PluginResult(PluginResult.Status.NO_RESULT); - _result.setKeepCallback(true); - callbackContext.sendPluginResult(_result); - } - }); - return true; - } else if (action.equals("activate")) { - cordova.getThreadPool().execute(new Runnable() { - public void run() { - cleverTap.productConfig().activate(); - PluginResult _result = new PluginResult(PluginResult.Status.NO_RESULT); - _result.setKeepCallback(true); - callbackContext.sendPluginResult(_result); - } - }); - return true; - } else if (action.equals("fetchAndActivate")) { - cordova.getThreadPool().execute(new Runnable() { - public void run() { - cleverTap.productConfig().activate(); - PluginResult _result = new PluginResult(PluginResult.Status.NO_RESULT); - _result.setKeepCallback(true); - callbackContext.sendPluginResult(_result); - } - }); - return true; - } else if (action.equals("setMinimumFetchIntervalInSeconds")) { - long interval = args.getInt(0); - cordova.getThreadPool().execute(new Runnable() { - public void run() { - cleverTap.productConfig().setMinimumFetchIntervalInSeconds(interval); - PluginResult _result = new PluginResult(PluginResult.Status.NO_RESULT); - _result.setKeepCallback(true); - callbackContext.sendPluginResult(_result); - } - }); - return true; - } else if (action.equals("getLastFetchTimeStampInMillis")) { - cordova.getThreadPool().execute(new Runnable() { - public void run() { - long value = cleverTap.productConfig().getLastFetchTimeStampInMillis(); - PluginResult _result = new PluginResult(PluginResult.Status.OK, value); - _result.setKeepCallback(true); - callbackContext.sendPluginResult(_result); - } - }); - return true; - } else if (action.equals("getString")) { - String key = args.getString(0); - cordova.getThreadPool().execute(new Runnable() { - public void run() { - String value = cleverTap.productConfig().getString(key); - PluginResult _result = new PluginResult(PluginResult.Status.OK, value); - _result.setKeepCallback(true); - callbackContext.sendPluginResult(_result); - } - }); - return true; - } else if (action.equals("getBoolean")) { - String key = args.getString(0); - cordova.getThreadPool().execute(new Runnable() { - public void run() { - boolean value = cleverTap.productConfig().getBoolean(key); - PluginResult _result = new PluginResult(PluginResult.Status.OK, value); - _result.setKeepCallback(true); - callbackContext.sendPluginResult(_result); - } - }); - return true; - } else if (action.equals("getLong")) { - String key = args.getString(0); - cordova.getThreadPool().execute(new Runnable() { - public void run() { - long value = cleverTap.productConfig().getLong(key); - PluginResult _result = new PluginResult(PluginResult.Status.OK, value); - _result.setKeepCallback(true); - callbackContext.sendPluginResult(_result); - } - }); - return true; - } else if (action.equals("getDouble")) { - String key = args.getString(0); - cordova.getThreadPool().execute(new Runnable() { - public void run() { - float value = cleverTap.productConfig().getDouble(key).floatValue(); - PluginResult _result = new PluginResult(PluginResult.Status.OK, value); - _result.setKeepCallback(true); - callbackContext.sendPluginResult(_result); - } - }); - return true; - } else if (action.equals("reset")) { - cordova.getThreadPool().execute(new Runnable() { - public void run() { - cleverTap.productConfig().reset(); - PluginResult _result = new PluginResult(PluginResult.Status.NO_RESULT); - _result.setKeepCallback(true); - callbackContext.sendPluginResult(_result); - } - }); - return true; - } else if (action.equals("suspendInAppNotifications")) { - cordova.getThreadPool().execute(new Runnable() { - public void run() { - cleverTap.suspendInAppNotifications(); - PluginResult _result = new PluginResult(PluginResult.Status.NO_RESULT); - _result.setKeepCallback(true); - callbackContext.sendPluginResult(_result); - } - }); - return true; - } else if (action.equals("discardInAppNotifications")) { - cordova.getThreadPool().execute(new Runnable() { - public void run() { - cleverTap.discardInAppNotifications(); - PluginResult _result = new PluginResult(PluginResult.Status.NO_RESULT); - _result.setKeepCallback(true); - callbackContext.sendPluginResult(_result); - } - }); - return true; - } else if (action.equals("resumeInAppNotifications")) { - cordova.getThreadPool().execute(new Runnable() { - public void run() { - cleverTap.resumeInAppNotifications(); - PluginResult _result = new PluginResult(PluginResult.Status.NO_RESULT); - _result.setKeepCallback(true); - callbackContext.sendPluginResult(_result); - } - }); - return true; - } - - result = new PluginResult(PluginResult.Status.ERROR, errorMsg); - result.setKeepCallback(true); - callbackContext.sendPluginResult(result); - return true; - } - - //DisplayUnitListener - - public void onDisplayUnitsLoaded(ArrayList units) { - - try { - final JSONArray unitsArray = displayUnitListToJSONArray(units); - - final String json = "{'units':" + unitsArray.toString() + "}"; - - webView.getView().post(new Runnable() { - public void run() { - webView.loadUrl("javascript:cordova.fireDocumentEvent('onCleverTapDisplayUnitsLoaded'," + json + ");"); - } - }); - - } catch (JSONException e) { - Log.d(LOG_TAG, "JSONException in onDisplayUnitsLoaded" + e); - } - - } - - //CTInboxListener - - public void inboxDidInitialize() { - webView.getView().post(new Runnable() { - public void run() { - webView.loadUrl("javascript:cordova.fireDocumentEvent('onCleverTapInboxDidInitialize');"); - } - }); - } - - public void inboxMessagesDidUpdate() { - webView.getView().post(new Runnable() { - public void run() { - webView.loadUrl("javascript:cordova.fireDocumentEvent('onCleverTapInboxMessagesDidUpdate');"); - } - }); - } - - - // InAppNotificationListener - - public boolean beforeShow(Map var1) { - return true; - } - - public void onDismissed(Map var1, Map var2) { - if (var1 == null && var2 == null) { - return; - } - - JSONObject extras = var1 != null ? new JSONObject(var1) : new JSONObject(); - String _json = "{'extras':" + extras.toString() + ","; - - JSONObject actionExtras = var2 != null ? new JSONObject(var2) : new JSONObject(); - _json += "'actionExtras':" + actionExtras.toString() + "}"; - - final String json = _json; - webView.getView().post(new Runnable() { - public void run() { - webView.loadUrl("javascript:cordova.fireDocumentEvent('onCleverTapInAppNotificationDismissed'," + json + ");"); - } - }); - } - - // SyncListener - public void profileDataUpdated(JSONObject updates) { - - if (updates == null) { - return; - } - - final String json = "{'updates':" + updates.toString() + "}"; - webView.getView().post(new Runnable() { - public void run() { - webView.loadUrl("javascript:cordova.fireDocumentEvent('onCleverTapProfileSync'," + json + ");"); - } - }); - } - - public void profileDidInitialize(String CleverTapID) { - - if (CleverTapID == null) { - return; - } - - final String json = "{'CleverTapID':" + "'" + CleverTapID + "'" + "}"; - webView.getView().post(new Runnable() { - public void run() { - webView.loadUrl("javascript:cordova.fireDocumentEvent('onCleverTapProfileDidInitialize'," + json + ");"); - } - }); - } - - //Inbox/InApp Button Click Listeners - - public void onInboxButtonClick(HashMap payload) { - JSONObject jsonPayload = new JSONObject(payload); - - final String json = "{'customExtras':" + jsonPayload.toString() + "}"; - - webView.getView().post(new Runnable() { - public void run() { - webView.loadUrl("javascript:cordova.fireDocumentEvent('onCleverTapInboxButtonClick'," + json + ");"); - } - }); - - - } - - //InApp Notification callback - public void onInAppButtonClick(HashMap hashMap) { - JSONObject jsonPayload = new JSONObject(hashMap); - final String json = "{'customExtras':" + jsonPayload.toString() + "}"; - - webView.getView().post(new Runnable() { - public void run() { - webView.loadUrl("javascript:cordova.fireDocumentEvent('onCleverTapInAppButtonClick'," + json + ");"); - } - }); - } - - //Feature Flag Listener - public void featureFlagsUpdated() { - webView.getView().post(new Runnable() { - public void run() { - webView.loadUrl("javascript:cordova.fireDocumentEvent('onCleverTapFeatureFlagsDidUpdate');"); - } - }); - } - - //Product Config Listener - public void onInit() { - webView.getView().post(new Runnable() { - public void run() { - webView.loadUrl("javascript:cordova.fireDocumentEvent('onCleverTapProductConfigDidInitialize');"); - } - }); - } - - public void onFetched() { - webView.getView().post(new Runnable() { - public void run() { - webView.loadUrl("javascript:cordova.fireDocumentEvent('onCleverTapProductConfigDidFetch');"); - } - }); - } - - public void onActivated() { - webView.getView().post(new Runnable() { - public void run() { - webView.loadUrl("javascript:cordova.fireDocumentEvent('onCleverTapProductConfigDidActivate');"); - } - }); - } - - /******************* - * Private Methods - ******************/ - - private static boolean checkCleverTapInitialized() { - boolean initialized = (cleverTap != null); - if (!initialized) { - Log.d(LOG_TAG, "CleverTap API not initialized: " + CLEVERTAP_API_ERROR); - } - return initialized; - } - - private static HashMap formatProfile(JSONObject jsonProfile) { - try { - HashMap profile = toMap(jsonProfile); - return profile; - } catch (Throwable t) { - return null; - } - } - - private static Object fromJson(Object json) throws JSONException { - if (json == JSONObject.NULL) { - return null; - } else if (json instanceof JSONObject) { - return toMap((JSONObject) json); - } else { - return json; - } - } - - private static CTInboxStyleConfig toStyleConfig(JSONObject object) throws JSONException { - CTInboxStyleConfig styleConfig = new CTInboxStyleConfig(); - if (object.has("navBarColor")) { - styleConfig.setNavBarColor(object.getString("navBarColor")); - } - if (object.has("navBarTitle")) { - styleConfig.setNavBarTitle(object.getString("navBarTitle")); - } - if (object.has("navBarTitleColor")) { - styleConfig.setNavBarTitleColor(object.getString("navBarTitleColor")); - } - if (object.has("inboxBackgroundColor")) { - styleConfig.setInboxBackgroundColor(object.getString("inboxBackgroundColor")); - } - if (object.has("backButtonColor")) { - styleConfig.setBackButtonColor(object.getString("backButtonColor")); - } - if (object.has("selectedTabColor")) { - styleConfig.setSelectedTabColor(object.getString("selectedTabColor")); - } - if (object.has("unselectedTabColor")) { - styleConfig.setUnselectedTabColor(object.getString("unselectedTabColor")); - } - if (object.has("selectedTabIndicatorColor")) { - styleConfig.setSelectedTabIndicatorColor(object.getString("selectedTabIndicatorColor")); - } - if (object.has("tabBackgroundColor")) { - styleConfig.setTabBackgroundColor(object.getString("tabBackgroundColor")); - } - if (object.has("tabs")) { - JSONArray tabsArray = object.getJSONArray("tabs"); - ArrayList tabs = new ArrayList(); - for (int i = 0; i < tabsArray.length(); i++) { - tabs.add(tabsArray.getString(i)); - } - styleConfig.setTabs(tabs); - } - return styleConfig; - } - - private static HashMap toMap(JSONObject object) throws JSONException { - HashMap map = new HashMap(); - Iterator keys = object.keys(); - while (keys.hasNext()) { - String key = (String) keys.next(); - map.put(key, fromJson(object.get(key))); - } - return map; - } - - private static ArrayList> toArrayListOfStringObjectMaps(JSONArray array) throws JSONException { - ArrayList> aList = new ArrayList>(); - - for (int i = 0; i < array.length(); i++) { - aList.add(toMap((JSONObject) array.get(i))); - } - - return aList; - } - - private static JSONObject eventDetailsToJSON(EventDetail details) throws JSONException { - - JSONObject json = new JSONObject(); - - if (details != null) { - json.put("name", details.getName()); - json.put("firstTime", details.getFirstTime()); - json.put("lastTime", details.getLastTime()); - json.put("count", details.getCount()); - } - - return json; - } - - private static JSONObject utmDetailsToJSON(UTMDetail details) throws JSONException { - - JSONObject json = new JSONObject(); - - if (details != null) { - json.put("campaign", details.getCampaign()); - json.put("source", details.getSource()); - json.put("medium", details.getMedium()); - } - - return json; - } - - private static JSONObject eventHistoryToJSON(Map history) throws JSONException { - - JSONObject json = new JSONObject(); - - if (history != null) { - for (Object key : history.keySet()) { - json.put(key.toString(), eventDetailsToJSON(history.get((String) key))); - } - } - - return json; - } - - private static JSONArray listToJSONArray(List list) throws JSONException { - JSONArray array = new JSONArray(); - - for (int i = 0; i < list.size(); i++) { - array.put(list.get(i)); - } - - return array; - } - - private List toBooleanList(JSONArray array) throws JSONException { - ArrayList list = new ArrayList(); - for (int i = 0; i < array.length(); i++) { - list.add(array.getBoolean(i)); - } - return list; - } - - private List toDoubleList(JSONArray array) throws JSONException { - ArrayList list = new ArrayList(); - for (int i = 0; i < array.length(); i++) { - list.add(array.getDouble(i)); - } - return list; - } - - private List toIntegerList(JSONArray array) throws JSONException { - ArrayList list = new ArrayList(); - for (int i = 0; i < array.length(); i++) { - list.add(array.getInt(i)); - } - return list; - } - - private List toStringList(JSONArray array) throws JSONException { - ArrayList list = new ArrayList(); - for (int i = 0; i < array.length(); i++) { - list.add(array.getString(i)); - } - return list; - } - - private static HashMap toBooleanMap(JSONObject object) throws JSONException { - HashMap map = new HashMap(); - Iterator keys = object.keys(); - while (keys.hasNext()) { - String key = (String) keys.next(); - map.put(key, object.getBoolean(key)); - } - return map; - } - - private static HashMap toDoubleMap(JSONObject object) throws JSONException { - HashMap map = new HashMap(); - Iterator keys = object.keys(); - while (keys.hasNext()) { - String key = (String) keys.next(); - map.put(key, object.getDouble(key)); - } - return map; - } - - private static HashMap toIntegerMap(JSONObject object) throws JSONException { - HashMap map = new HashMap(); - Iterator keys = object.keys(); - while (keys.hasNext()) { - String key = (String) keys.next(); - map.put(key, object.getInt(key)); - } - return map; - } - - private static HashMap toStringMap(JSONObject object) throws JSONException { - HashMap map = new HashMap(); - Iterator keys = object.keys(); - while (keys.hasNext()) { - String key = (String) keys.next(); - map.put(key, object.getString(key)); - } - return map; - } - - private JSONObject getJsonFromMap(Map map) throws JSONException { - JSONObject jsonData = new JSONObject(); - for (String key : map.keySet()) { - Object value = map.get(key); - if (value instanceof Map) { - value = getJsonFromMap((Map) value); - } - jsonData.put(key, value); - } - return jsonData; - } - - private JSONArray displayUnitListToJSONArray(ArrayList displayUnits) throws JSONException { - JSONArray array = new JSONArray(); - - if (displayUnits == null) { - return array; - } - - for (int i = 0; i < displayUnits.size(); i++) { - array.put(displayUnits.get(i).getJsonObject()); - } - - return array; - } - - private JSONArray inboxMessageListToJSONArray(ArrayList messageList) throws JSONException { - JSONArray array = new JSONArray(); - - for (int i = 0; i < messageList.size(); i++) { - array.put(messageList.get(i).getData()); - } - - return array; - } - - public void onNotificationClickedPayloadReceived(HashMap payload) { - - JSONObject jsonPayload = new JSONObject(payload); - - final String json = "{'customExtras':" + jsonPayload.toString() + "}"; - - webView.getView().post(new Runnable() { - public void run() { - - webView.loadUrl("javascript:cordova.fireDocumentEvent('onCleverTapPushNotificationTappedWithCustomExtras'," + json + ");"); - } - }); - callbackDone = true; - } - - public void onPushAmpPayloadReceived(Bundle extras) { - JSONObject jsonPayload = toJson(extras); - - final String json = "{'customExtras':" + jsonPayload.toString() + "}"; - - webView.getView().post(new Runnable() { - public void run() { - webView.loadUrl("javascript:cordova.fireDocumentEvent('onCleverTapPushAmpPayloadDidReceived'," + json + ");"); - } - }); - } - - private JSONObject toJson(Bundle bundle) { - JSONObject json = new JSONObject(); - Set keys = bundle.keySet(); - for (String key : keys) { - try { - // json.put(key, bundle.get(key)); see edit below - json.put(key, JSONObject.wrap(bundle.get(key))); - } catch (JSONException e) { - //Handle exception here - } - } - return json; - } -} \ No newline at end of file diff --git a/Samples/Cordova/ExampleProject/plugins/clevertap-cordova/src/android/google-services.json b/Samples/Cordova/ExampleProject/plugins/clevertap-cordova/src/android/google-services.json deleted file mode 100644 index e69de29b..00000000 diff --git a/Samples/Cordova/ExampleProject/plugins/clevertap-cordova/src/ios/AppDelegate+CleverTapPlugin.h b/Samples/Cordova/ExampleProject/plugins/clevertap-cordova/src/ios/AppDelegate+CleverTapPlugin.h deleted file mode 100644 index 9752c0b5..00000000 --- a/Samples/Cordova/ExampleProject/plugins/clevertap-cordova/src/ios/AppDelegate+CleverTapPlugin.h +++ /dev/null @@ -1,6 +0,0 @@ - -#import "AppDelegate.h" - -@interface AppDelegate (CleverTapPlugin) - -@end diff --git a/Samples/Cordova/ExampleProject/plugins/clevertap-cordova/src/ios/AppDelegate+CleverTapPlugin.m b/Samples/Cordova/ExampleProject/plugins/clevertap-cordova/src/ios/AppDelegate+CleverTapPlugin.m deleted file mode 100644 index bb61e628..00000000 --- a/Samples/Cordova/ExampleProject/plugins/clevertap-cordova/src/ios/AppDelegate+CleverTapPlugin.m +++ /dev/null @@ -1,91 +0,0 @@ - -#import "AppDelegate+CleverTapPlugin.h" -#import "CleverTapPlugin.h" - -#if defined(__IPHONE_10_0) && __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_10_0 -@import UserNotifications; -#endif - -#if defined(__IPHONE_10_0) && __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_10_0 -@interface AppDelegate () -@end -#endif - -@implementation AppDelegate (CleverTapPlugin) - -- (void)application:(UIApplication*)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData*)deviceToken { - - const unsigned *tokenBytes = [deviceToken bytes]; - NSString *token = [NSString stringWithFormat:@"%08x%08x%08x%08x%08x%08x%08x%08x", - ntohl(tokenBytes[0]), ntohl(tokenBytes[1]), ntohl(tokenBytes[2]), - ntohl(tokenBytes[3]), ntohl(tokenBytes[4]), ntohl(tokenBytes[5]), - ntohl(tokenBytes[6]), ntohl(tokenBytes[7])]; - NSString *deviceTokenString = [NSString stringWithFormat:@"%@", token]; - [[NSNotificationCenter defaultCenter] postNotificationName:CTRemoteNotificationDidRegister object:deviceTokenString]; -} - -- (void)application:(UIApplication*)application didFailToRegisterForRemoteNotificationsWithError:(NSError*)error { - - [[NSNotificationCenter defaultCenter] postNotificationName:CTRemoteNotificationRegisterError object:error]; -} - -- (void) application:(UIApplication*)application didReceiveLocalNotification:(UILocalNotification*)notification { - - [[NSNotificationCenter defaultCenter] postNotificationName:CTDidReceiveNotification object:notification]; -} - -- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo { - - [[NSNotificationCenter defaultCenter] postNotificationName:CTDidReceiveNotification object:userInfo]; -} - -- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo -fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler { - - [[NSNotificationCenter defaultCenter] postNotificationName:CTDidReceiveNotification object:userInfo]; -} - -#if defined(__IPHONE_10_0) && __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_10_0 -- (void)userNotificationCenter:(UNUserNotificationCenter *)center - willPresentNotification:(UNNotification *)notification - withCompletionHandler:(void (^)(UNNotificationPresentationOptions))completionHandler { - completionHandler(UNNotificationPresentationOptionSound - | UNNotificationPresentationOptionAlert - | UNNotificationPresentationOptionBadge); -} -#endif - -- (BOOL)application:(UIApplication*)application openURL:(NSURL*)url sourceApplication:(NSString*)sourceApplication annotation:(id)annotation { - - if (!url) { - return NO; - } - // FOR KILLED STATE, THIS NOTIFICATION GETS BROADCASTED BEFORE OBSERVERS ARE SET INSIDE THE CODROVA PLUGIN, HENCE A SLIGHT DELAY IS ADDED - dispatch_after(dispatch_time(DISPATCH_TIME_NOW, 1 * NSEC_PER_SEC), dispatch_get_main_queue(), ^{ - [[NSNotificationCenter defaultCenter] postNotification:[NSNotification notificationWithName:CTHandleOpenURLNotification object:url]]; - }); - return YES; -} - -- (BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary *)options { - - if (!url) { - return NO; - } - // FOR KILLED STATE, THIS NOTIFICATION GETS BROADCASTED BEFORE OBSERVERS ARE SET INSIDE THE CODROVA PLUGIN, HENCE A SLIGHT DELAY IS ADDED - dispatch_after(dispatch_time(DISPATCH_TIME_NOW, 1 * NSEC_PER_SEC), dispatch_get_main_queue(), ^{ - [[NSNotificationCenter defaultCenter] postNotification:[NSNotification notificationWithName:CTHandleOpenURLNotification object:url]]; - }); - return YES; -} - -- (void)openURL:(NSURL*)url options:(NSDictionary *)options completionHandler:(void (^ __nullable)(BOOL success))completion { - - // FOR KILLED STATE, THIS NOTIFICATION GETS BROADCASTED BEFORE OBSERVERS ARE SET INSIDE THE CODROVA PLUGIN, HENCE A SLIGHT DELAY IS ADDED - dispatch_after(dispatch_time(DISPATCH_TIME_NOW, 1 * NSEC_PER_SEC), dispatch_get_main_queue(), ^{ - [[NSNotificationCenter defaultCenter] postNotification:[NSNotification notificationWithName:CTHandleOpenURLNotification object:url]]; - }); -} - - -@end diff --git a/Samples/Cordova/ExampleProject/plugins/clevertap-cordova/src/ios/CleverTapPlugin.h b/Samples/Cordova/ExampleProject/plugins/clevertap-cordova/src/ios/CleverTapPlugin.h deleted file mode 100644 index c59d2d78..00000000 --- a/Samples/Cordova/ExampleProject/plugins/clevertap-cordova/src/ios/CleverTapPlugin.h +++ /dev/null @@ -1,477 +0,0 @@ -// -// CleverTapPlugin.h -// Copyright (C) 2015 CleverTap -// -// This code is provided under a comercial License. -// A copy of this license has been distributed in a file called LICENSE -// with this source code. -// -// - -#import - -static NSString * const CTDidReceiveNotification = @"CTDidReceiveNotification"; -static NSString * const CTRemoteNotificationDidRegister = @"CTRemoteNotificationDidRegister"; -static NSString * const CTRemoteNotificationRegisterError = @"CTRemoteNotificationRegisterError"; -static NSString * const CTHandleOpenURLNotification = @"CTHandleOpenURLNotification"; - -@interface CleverTapPlugin : CDVPlugin - - -# pragma mark - Developer Options - -/** Set CleverTap debug logging - 0 = off, 1 = on; - */ -- (void)setDebugLevel:(CDVInvokedUrlCommand *)command; - -# pragma mark - Launch -/** - call to be notified of launch Push Notification or Deep Link - */ -- (void)notifyDeviceReady:(CDVInvokedUrlCommand *)command; - - -# pragma mark - Enable Personalization API - -/** Enable the Personalization API - must be invoked before calling most Event, Profile, or Session getters, see below - */ -- (void)enablePersonalization:(CDVInvokedUrlCommand *)command; - -/** - Disable the Personalization API - */ -- (void)disablePersonalization:(CDVInvokedUrlCommand *)command; - -# pragma mark - Offline api - -/** Disables/Enables sending events to the server. - */ -- (void)setOffline:(CDVInvokedUrlCommand *)command; - -#pragma mark - OptOut API - -/** Enabling tracking opt out for the currently active user - */ -- (void)setOptOut:(CDVInvokedUrlCommand *)command; - -/** Enables the reporting of device network-related information, including IP address. This reporting is disabled by default. - */ -- (void)enableDeviceNetworkInfoReporting:(CDVInvokedUrlCommand *)command; - - -#pragma mark - Push Notifications - -/** Request user push notification permission - */ -- (void)registerPush:(CDVInvokedUrlCommand *)command; - -/** Set the user push token - */ -- (void)setPushTokenAsString:(CDVInvokedUrlCommand *)command; -- (void)setPushToken:(NSData*)pushToken; - -/** - Xiaomi, Baidu and Huawei Push Token Changes - */ --(void)setPushXiaomiTokenAsString:(CDVInvokedUrlCommand *)command; --(void)setPushBaiduTokenAsString:(CDVInvokedUrlCommand *)command; --(void)setPushHuaweiTokenAsString:(CDVInvokedUrlCommand *)command; - -/** Let CleverTap handle the push notification - CleverTap will insure your AppDelege OpenUrl: sourceApplication: is called with a deep link, if included in notification - */ -- (void)handleNotification:(id)notification; - - -/** Let CleverTap handle sending the deep link into the Cordova WebView - */ -- (void)handleDeepLink:(NSURL *)url; - - -#pragma mark - Push Notification Delegate - -- (void)pushNotificationTappedWithCustomExtras:(NSDictionary *)customExtras; - - -#pragma mark - InApp Notification Controls - -/** - Suspends and saves inApp notifications until 'resumeInAppNotifications' is called for current session. - Automatically resumes InApp notifications display on CleverTap shared instance creation. Pending inApp notifications are displayed only for current session. - */ -- (void)suspendInAppNotifications; - -/** - Discards inApp notifications until 'resumeInAppNotifications' is called for current session. - Automatically resumes InApp notifications display on CleverTap shared instance creation. Pending inApp notifications are not displayed. */ -- (void)discardInAppNotifications; - -/** - Resumes displaying inApps notifications and shows pending inApp notifications if any. - */ -- (void)resumeInAppNotifications; - -#pragma mark - CleverTapInAppNotificationDelegate - -/** - This method gives call back for In App Notification Action - */ -- (void)inAppNotificationDismissedWithExtras:(NSDictionary *)extras andActionExtras:(NSDictionary *)actionExtras; - -/** - This method gives call back for In App Notification Action - */ -- (void)inAppNotificationButtonTappedWithCustomExtras:(NSDictionary *)customExtras; - -#pragma mark - Event API - -/** Record a Screen View - */ -- (void)recordScreenView:(CDVInvokedUrlCommand *)command; - -/** Record an event - */ -- (void)recordEventWithName:(CDVInvokedUrlCommand *)command; - -/** Record an event with event properties - */ -- (void)recordEventWithNameAndProps:(CDVInvokedUrlCommand *)command; - -/** Record special "Charged" event with event details and array of purchased item objects - see https://support.clevertap.com/profiles/recording-actions/#user-action-best-practices - */ -- (void)recordChargedEventWithDetailsAndItems:(CDVInvokedUrlCommand *)command; - -/** Get event first time recorded in seconds - requires prior enablePersonalization call - */ -- (void)eventGetFirstTime:(CDVInvokedUrlCommand *)command; - -/** Get event last time recorded in seconds - requires prior enablePersonalization call - */ -- (void)eventGetLastTime:(CDVInvokedUrlCommand *)command; - -/** Get num times an event has been recorded - requires prior enablePersonalization call - */ -- (void)eventGetOccurrences:(CDVInvokedUrlCommand *)command; - -/** Get event details summary - first time, last time, occurrences - requires prior enablePersonalization call - */ -- (void)eventGetDetails:(CDVInvokedUrlCommand *)command; - -/** Get history of events recorded with details - requires prior enablePersonalization call - */ -- (void)getEventHistory:(CDVInvokedUrlCommand *)command; - - -#pragma mark - Profile API - -/** - Get the device location if available. Calling this will prompt the user location permissions dialog. - - Please be sure to include the NSLocationWhenInUseUsageDescription key in your Info.plist. See https://developer.apple.com/library/ios/documentation/General/Reference/InfoPlistKeyReference/Articles/CocoaKeys.html#//apple_ref/doc/uid/TP40009251-SW26 - - Uses desired accuracy of kCLLocationAccuracyHundredMeters. - - If you need background location updates or finer accuracy please implement your own location handling. Please see https://developer.apple.com/library/ios/documentation/CoreLocation/Reference/CLLocationManager_Class/index.html for more info. - - Optional. You can use location to pass it to CleverTap via the setLocation API - for, among other things, more fine-grained geo-targeting and segmentation purposes. - */ -- (void)getLocation:(CDVInvokedUrlCommand *)command; - -/** Set location - */ -- (void)setLocation:(CDVInvokedUrlCommand *)command; - -/** - Creates a separate and distinct user profile identified by one or more of Identity, Email, FBID or GPID values, - and populated with the key-values included in the profile dictionary. - - If your app is used by multiple users, you can use this method to assign them each a unique profile to track them separately. - - If instead you wish to assign multiple Identity, Email, FBID and/or GPID values to the same user profile, - use profileSet rather than this method. - - If none of Identity, Email, FBID or GPID is included in the profile dictionary, - all properties values will be associated with the current user profile. - - When initially installed on this device, your app is assigned an "anonymous" profile. - The first time you identify a user on this device (whether via onUserLogin or profileSet), - the "anonymous" history on the device will be associated with the newly identified user. - - Then, use this method to switch between subsequent separate identified users. - - Please note that switching from one identified user to another is a costly operation - in that the current session for the previous user is automatically closed - and data relating to the old user removed, and a new session is started - for the new user and data for that user refreshed via a network call to CleverTap. - In addition, any global frequency caps are reset as part of the switch. - - */ -- (void)onUserLogin:(CDVInvokedUrlCommand *)command; - -/** Set properties on the CleverTap device user profile - */ -- (void)profileSet:(CDVInvokedUrlCommand *)command; - -/** Get property from the CleverTap device user profile - requires prior enablePersonalization call - */ -- (void)profileGetProperty:(CDVInvokedUrlCommand *)command; - -/** Get the CleverTap ID of the User Profile. The CleverTap ID is the unique identifier assigned to the User Profile by CleverTap. - */ -- (void)profileGetCleverTapID:(CDVInvokedUrlCommand *)command __attribute__((deprecated("This method is deprecated in v2.3.5. Use getCleverTapID() instead"))); - -/** Returns a unique CleverTap identifier suitable for use with install attribution providers. - */ -- (void)profileGetCleverTapAttributionIdentifier:(CDVInvokedUrlCommand *)command __attribute__((deprecated("This method is deprecated in v2.3.5. Use getCleverTapID() instead"))); - -/** Returns a unique CleverTap identifier suitable for use with install attribution providers. - */ -- (void)getCleverTapID:(CDVInvokedUrlCommand *)command; - -/** Remove the property specified by key from the user profile. - */ -- (void)profileRemoveValueForKey:(CDVInvokedUrlCommand *)command; - -/** Method for setting a multi-value user profile property. - Any existing value(s) for the key will be overwritten. - Key must be String. - Values must be Strings, max 40 bytes. Longer will be truncated. - Max 100 values, on reaching 100 cap, oldest value(s) will be removed. - */ -- (void)profileSetMultiValues:(CDVInvokedUrlCommand *)command; - -/** Method for adding a unique value to a multi-value profile property (or creating if not already existing). - If the key currently contains a scalar value, the key will be promoted to a multi-value property - with the current value cast to a string and the new value(s) added. - Key must be String. - Values must be Strings, max 40 bytes. Longer will be truncated. - Max 100 values, on reaching 100 cap, oldest value(s) will be removed. - */ -- (void)profileAddMultiValue:(CDVInvokedUrlCommand *)command; - -/** Method for adding multiple unique values to a multi-value profile property (or creating if not already existing). - If the key currently contains a scalar value, the key will be promoted to a multi-value property - with the current value cast to a string and the new value(s) added. - Key must be String. - Values must be Strings, max 40 bytes. Longer will be truncated. - Max 100 values, on reaching 100 cap, oldest value(s) will be removed. - */ -- (void)profileAddMultiValues:(CDVInvokedUrlCommand *)command; - -/** Method for removing a unique value from a multi-value profile property. - If the key currently contains a scalar value, prior to performing the remove operation the key will be promoted to a multi-value property with the current value cast to a string. - If the multi-value property is empty after the remove operation, the key will be removed. - */ -- (void)profileRemoveMultiValue:(CDVInvokedUrlCommand *)command; - -/** Method for removing multiple unique values from a multi-value profile property. - If the key currently contains a scalar value, prior to performing the remove operation the key will be promoted to a multi-value property with the current value cast to a string. - If the multi-value property is empty after the remove operation, the key will be removed. - */ -- (void)profileRemoveMultiValues:(CDVInvokedUrlCommand *)command; - -/** Method for incrementing a value for a single-value profile property (if it exists). -*/ -- (void)profileIncrementValueBy:(CDVInvokedUrlCommand *)command; - -/** Method for decrementing a value for a single-value profile property (if it exists). -*/ -- (void)profileDecrementValueBy:(CDVInvokedUrlCommand *)command; - -#pragma mark - Session API - -/** Get CleverTap session time in seconds - */ -- (void)sessionGetTimeElapsed:(CDVInvokedUrlCommand *)command; - -/** Get total user visits - requires prior enablePersonalization call - */ -- (void)sessionGetTotalVisits:(CDVInvokedUrlCommand *)command; - -/** Get CleverTap session screens viewed count - */ -- (void)sessionGetScreenCount:(CDVInvokedUrlCommand *)command; - -/** Get previous user visit time in epoch seconds - requires prior enablePersonalization call - */ -- (void)sessionGetPreviousVisitTime:(CDVInvokedUrlCommand *)command; - -/** Get session referrer utm source, campaign and medium, if applicable - */ -- (void)sessionGetUTMDetails:(CDVInvokedUrlCommand *)command; - -/** - Manually track incoming install referrers. - Call this to manually track the utm details for an incoming install referrer. - */ -- (void)pushInstallReferrer:(CDVInvokedUrlCommand *)command; - -# pragma mark - App Inbox - -/** - Initialized the inbox controller. - Call this method to initialize the inbox controller. - You must call this method separately for each instance of CleverTap. - */ -- (void)initializeInbox:(CDVInvokedUrlCommand *)command; - -/** - Get the total number of unread inbox messages for the user. - */ -- (void)getInboxMessageUnreadCount:(CDVInvokedUrlCommand *)command; - -/** - Get the total number of inbox messages for the user. - */ -- (void)getInboxMessageCount:(CDVInvokedUrlCommand *)command; - -/** - This method opens the controller to display the inbox messages. - */ -- (void)showInbox:(CDVInvokedUrlCommand *)command; - -/** - This method fetches all Inbox Messages - */ -- (void)getAllInboxMessages:(CDVInvokedUrlCommand *)command; - -/** - This method fetches all Unread Inbox Messages - */ -- (void)getUnreadInboxMessages:(CDVInvokedUrlCommand *)command; - -/** - This method fetches the Message for Given Message Id - */ -- (void)getInboxMessageForId:(CDVInvokedUrlCommand *)command; - -/** - This method deletes the Inbox Message for Given Message Id - */ -- (void)deleteInboxMessageForId:(CDVInvokedUrlCommand *)command; - -/** - This method delete bulk Inbox Messages for Given Message Ids - */ -- (void)deleteInboxMessagesForIds:(CDVInvokedUrlCommand *)command; - -/** - This method Mark a message as Read for Given Message Id - */ -- (void)markReadInboxMessageForId:(CDVInvokedUrlCommand *)command; - -/** - This method Marks Inbox Notification Viewed for Given Message Id - */ -- (void)pushInboxNotificationViewedEventForId:(CDVInvokedUrlCommand *)command; - -/** - This method Marks Inbox Notification Clicked for Given Message Id - */ -- (void)pushInboxNotificationClickedEventForId:(CDVInvokedUrlCommand *)command; - -# pragma mark - Native Display - -/** - This method is called to fetch all Display Units - */ -- (void)getAllDisplayUnits:(CDVInvokedUrlCommand *)command; - -/** - This method is called to Fetch Display Unit For ID - */ -- (void)getDisplayUnitForId:(CDVInvokedUrlCommand *)command; - -/** - This method is called to record Rendering of Display Unit - */ -- (void)pushDisplayUnitViewedEventForID:(CDVInvokedUrlCommand *)command; - -/** - This method is called to record Click on Display Unit - */ -- (void)pushDisplayUnitClickedEventForID:(CDVInvokedUrlCommand *)command; - -# pragma mark - Feature Flags & Product Config - -//Feature Flags -/** - This method fetches the Value of Feature Flag - */ -- (void)getFeatureFlag: (CDVInvokedUrlCommand *)command; - -//Product Config -/** - This method Sets the default value for given set of keys - */ -- (void)setDefaultsMap: (CDVInvokedUrlCommand *)command; - -/** - This method fetches the Product Config - */ -- (void)fetch: (CDVInvokedUrlCommand *)command; - -/** - This method fetches Product Config with a defined minimum time interval - */ -- (void)fetchWithMinimumFetchIntervalInSeconds: (CDVInvokedUrlCommand *)command; - -/** - This method activates the fetched Product Config - */ -- (void)activate: (CDVInvokedUrlCommand *)command; - -/** - This method fetches and activated the Product Config - */ -- (void)fetchAndActivate: (CDVInvokedUrlCommand *)command; - -/** - This method allows you to set minimum time interval for consecutive Product Config call - */ -- (void)setMinimumFetchIntervalInSeconds: (CDVInvokedUrlCommand *)command; - -/** - This method allows you to fetch last config fetched time - */ -- (void)getLastFetchTimeStampInMillis: (CDVInvokedUrlCommand *)command; - -/** - This method fetches String Value for a given key - */ -- (void)getString: (CDVInvokedUrlCommand *)command; - -/** - This method fetches Bool Value for a given key - */ -- (void)getBoolean: (CDVInvokedUrlCommand *)command; - -/** - This method fetches Long Value for a given key - */ -- (void)getLong: (CDVInvokedUrlCommand *)command; - -/** - This method fetches Double Value for a given key - */ -- (void)getDouble: (CDVInvokedUrlCommand *)command; - -/** - This method resets the product Config stored locally - */ -- (void)reset; - -@end - diff --git a/Samples/Cordova/ExampleProject/plugins/clevertap-cordova/src/ios/CleverTapPlugin.m b/Samples/Cordova/ExampleProject/plugins/clevertap-cordova/src/ios/CleverTapPlugin.m deleted file mode 100644 index 7b2b3538..00000000 --- a/Samples/Cordova/ExampleProject/plugins/clevertap-cordova/src/ios/CleverTapPlugin.m +++ /dev/null @@ -1,1434 +0,0 @@ -// -// CleverTapPlugin.m -// Copyright (C) 2015 CleverTap -// -// This code is provided under a commercial License. -// A copy of this license has been distributed in a file called LICENSE -// with this source code. -// -// - -#if defined(__IPHONE_10_0) && __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_10_0 -@import UserNotifications; -#endif - -#import "CleverTapPlugin.h" - -#import "CleverTap.h" -#import "CleverTap+Inbox.h" -#import "CleverTapUTMDetail.h" -#import "CleverTapEventDetail.h" -#import "CleverTap+DisplayUnit.h" -#import "CleverTapSyncDelegate.h" -#import "CleverTap+FeatureFlags.h" -#import "CleverTap+ProductConfig.h" -#import "CleverTapPushNotificationDelegate.h" -#import "CleverTapInAppNotificationDelegate.h" -#import "CleverTap+InAppNotifications.h" - -#import - -static CleverTap *clevertap; -static NSURL *launchDeepLink; -static NSDictionary *launchNotification; -static NSDateFormatter *dateFormatter; - -@interface CleverTapPlugin () { -} - -@end - -@implementation CleverTapPlugin - - -#pragma mark - Private - -+ (void)load { - - // Listen for UIApplicationDidFinishLaunchingNotification to get a hold of launchOptions - [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(onDidFinishLaunchingNotification:) name:UIApplicationDidFinishLaunchingNotification object:nil]; - - // Listen to re-broadcast events from Cordova's AppDelegate - [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(onDidFailToRegisterForRemoteNotificationsWithError:) name:CTRemoteNotificationRegisterError object:nil]; - - [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(onHandleRegisterForRemoteNotification:) name:CTRemoteNotificationDidRegister object:nil]; -} - -+ (void)onDidFinishLaunchingNotification:(NSNotification *)notification { - - clevertap = [CleverTap sharedInstance]; - - NSDictionary *launchOptions = notification.userInfo; - if (!launchOptions) return; - - if (launchOptions[UIApplicationLaunchOptionsRemoteNotificationKey]) { - [clevertap handleNotificationWithData:launchOptions]; - launchNotification = launchOptions[UIApplicationLaunchOptionsRemoteNotificationKey]; - } - - if (launchOptions[UIApplicationLaunchOptionsURLKey]) { - launchDeepLink = launchOptions[UIApplicationLaunchOptionsURLKey]; - } -} - -+ (void)onDidFailToRegisterForRemoteNotificationsWithError:(NSNotification *)notification { - - //Log Failures - NSLog(@"onRemoteRegisterFail: %@", notification.object); -} - -+ (void)onHandleRegisterForRemoteNotification:(NSNotification *)notification { - - [clevertap setPushTokenAsString:notification.object]; -} - -- (void)onHandleOpenURLNotification:(NSNotification *)notification { - - [clevertap handleOpenURL:notification.object sourceApplication:nil]; - [self handleDeepLink:notification.object]; -} - -- (void)onHandleNotification:(NSNotification *)notification { - - [clevertap handleNotificationWithData:notification.object]; - [self notifyPushNotification:notification.object]; -} - -- (void)pluginInitialize { - - [super pluginInitialize]; - - [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(onHandleOpenURLNotification:) name: CTHandleOpenURLNotification object:nil]; - [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(onHandleNotification:) name:CTDidReceiveNotification object:nil]; - - [clevertap setSyncDelegate:self]; - [clevertap setDisplayUnitDelegate:self]; - [[clevertap featureFlags] setDelegate:self]; - [[clevertap productConfig] setDelegate:self]; - [clevertap setPushNotificationDelegate:self]; - [clevertap setInAppNotificationDelegate:self]; - -} - -- (NSDictionary*)_eventDetailToDict:(CleverTapEventDetail*)detail { - - NSMutableDictionary *_dict = [NSMutableDictionary new]; - - if(detail) { - if(detail.eventName) { - [_dict setObject:detail.eventName forKey:@"eventName"]; - } - - if(detail.firstTime){ - [_dict setObject:@(detail.firstTime) forKey:@"firstTime"]; - } - - if(detail.lastTime){ - [_dict setObject:@(detail.lastTime) forKey:@"lastTime"]; - } - - if(detail.count){ - [_dict setObject:@(detail.count) forKey:@"count"]; - } - } - - return _dict; -} - -- (NSDictionary*)_utmDetailToDict:(CleverTapUTMDetail*)detail { - - NSMutableDictionary *_dict = [NSMutableDictionary new]; - - if(detail) { - if(detail.source) { - [_dict setObject:detail.source forKey:@"source"]; - } - - if(detail.medium) { - [_dict setObject:detail.medium forKey:@"medium"]; - } - - if(detail.campaign) { - [_dict setObject:detail.campaign forKey:@"campaign"]; - } - } - - return _dict; -} - -- (NSString *)_dictToJson:(NSDictionary *)dict { - - NSData *jsonData; - NSError *error; - - @try { - jsonData = [NSJSONSerialization dataWithJSONObject:dict options:0 error:&error]; - } - @catch (NSException *exception) { - return nil; - } - - return [[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding]; -} - -- (NSDictionary *)formatProfile:(NSDictionary *)profile { - - NSMutableDictionary *_profile = [NSMutableDictionary new]; - - for (NSString *key in [profile keyEnumerator]) { - id value = [profile objectForKey:key]; - - if([key isEqualToString:@"DOB"]) { - - NSDate *dob = nil; - - if([value isKindOfClass:[NSString class]]) { - - if(!dateFormatter) { - dateFormatter = [[NSDateFormatter alloc] init]; - [dateFormatter setDateFormat:@"yyyy-MM-dd"]; - } - - dob = [dateFormatter dateFromString:value]; - - } - else if ([value isKindOfClass:[NSNumber class]]) { - dob = [NSDate dateWithTimeIntervalSince1970:[value doubleValue]]; - } - - if(dob) { - value = dob; - } - } - - [_profile setObject:value forKey:key]; - } - - return _profile; -} - -// custom helper method to fire push data into the Cordova WebView -- (void)notifyPushNotification:(id)notification { - - NSDictionary * _notification; - if ([notification isKindOfClass:[UILocalNotification class]]) { - _notification = [((UILocalNotification *) notification) userInfo]; - } else if ([notification isKindOfClass:[NSDictionary class]]) { - _notification = notification; - } - - NSError *err; - NSData *jsonData = [NSJSONSerialization dataWithJSONObject:_notification options:0 error:&err]; - - if(err == nil) { - NSString *json = [[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding]; - NSString *js = [NSString stringWithFormat:@"cordova.fireDocumentEvent('onPushNotification', {'notification':%@})", json]; - [self.commandDelegate evalJs:js]; - } -} - -/// Helper method to get json array from CleverTapInboxMessage array -/// @param inboxMessages: NSArray -- (NSArray*)cleverTapInboxMessagesToArray:(NSArray*) inboxMessages { - NSMutableArray *returnArray = [NSMutableArray new]; - for(CleverTapInboxMessage *unit in inboxMessages){ - [returnArray addObject:unit.json]; - } - return returnArray; -} - -/// Helper method to get json array from CleverTapDisplayUnit array -/// @param displayUnits: NSArray -- (NSArray*)cleverTapDisplayUnitsToArray:(NSArray*) displayUnits { - NSMutableArray *returnArray = [NSMutableArray new]; - for(CleverTapDisplayUnit *unit in displayUnits){ - [returnArray addObject:unit.json]; - } - return returnArray; -} - -#pragma mark - CleverTapInAppNotificationDelegate - -/** - Call back for In App Notification Dismissal - */ -- (void)inAppNotificationDismissedWithExtras:(NSDictionary *)extras andActionExtras:(NSDictionary *)actionExtras { - - NSMutableDictionary *jsonDict = [NSMutableDictionary new]; - - if (extras != nil) { - jsonDict[@"extras"] = extras; - } - - if (actionExtras != nil) { - jsonDict[@"actionExtras"] = actionExtras; - } - - NSString *jsonString = [self _dictToJson:jsonDict]; - - if (jsonString != nil) { - NSString *js = [NSString stringWithFormat:@"cordova.fireDocumentEvent('onCleverTapInAppNotificationDismissed', %@);", jsonString]; - [self.commandDelegate evalJs:js]; - } -} - -/** - Call back for In App Notification Dismissal with Extra Buttons - */ -- (void)inAppNotificationButtonTappedWithCustomExtras:(NSDictionary *)customExtras { - - NSMutableDictionary *jsonDict = [NSMutableDictionary new]; - - if (customExtras != nil) { - jsonDict[@"customExtras"] = customExtras; - } - - NSString *jsonString = [self _dictToJson:jsonDict]; - - if (jsonString != nil) { - NSString *js = [NSString stringWithFormat:@"cordova.fireDocumentEvent('onCleverTapInAppButtonClick', %@);", jsonString]; - [self.commandDelegate evalJs:js]; - } -} - -- (void)disableInAppNotificationDisplay { - //Not Handlingshowinbox -} - -#pragma mark - CleverTapSyncDelegate - -- (void)profileDidInitialize:(NSString*)CleverTapID { - - if(!CleverTapID) { - return ; - } - - NSString *jsonString = [self _dictToJson:@{@"CleverTapID":CleverTapID}]; - - if (jsonString != nil) { - NSString *js = [NSString stringWithFormat:@"cordova.fireDocumentEvent('onCleverTapProfileDidInitialize', %@);", jsonString]; - [self.commandDelegate evalJs:js]; - } - -} - -- (void)profileDataUpdated:(NSDictionary *)updates { - - if(!updates) { - return ; - } - - NSString *jsonString = [self _dictToJson:@{@"updates":updates}]; - - if (jsonString != nil) { - NSString *js = [NSString stringWithFormat:@"cordova.fireDocumentEvent('onCleverTapProfileSync', %@);", jsonString]; - [self.commandDelegate evalJs:js]; - } -} - - -#pragma mark - Public - -# pragma mark Launch - -- (void)notifyDeviceReady:(CDVInvokedUrlCommand *)command { - - if (launchNotification) { - [self notifyPushNotification:[launchNotification copy]]; - // notify push notification tapped with custom extras - NSMutableDictionary *mutableNotification = [NSMutableDictionary dictionaryWithDictionary:launchNotification]; - [mutableNotification removeObjectForKey:@"aps"]; - [self pushNotificationTappedWithCustomExtras:[mutableNotification copy]]; - launchNotification = nil; - } - - if (launchDeepLink) { - [self handleDeepLink:[launchDeepLink copy]]; - launchDeepLink = nil; - } -} - - -#pragma mark - Push - -- (void)registerPush:(CDVInvokedUrlCommand *)command { - [UNUserNotificationCenter currentNotificationCenter].delegate = [UIApplication sharedApplication].delegate; - - if (floor(NSFoundationVersionNumber) <= NSFoundationVersionNumber_iOS_9_x_Max) { - if ([[UIApplication sharedApplication] respondsToSelector:@selector(registerUserNotificationSettings:)]) { - UIUserNotificationType types = (UIUserNotificationTypeAlert | UIUserNotificationTypeBadge | UIUserNotificationTypeSound); - UIUserNotificationSettings *settings = [UIUserNotificationSettings settingsForTypes:types categories:nil]; - [[UIApplication sharedApplication] registerUserNotificationSettings:settings]; - [[UIApplication sharedApplication] registerForRemoteNotifications]; - } else { -#pragma GCC diagnostic push -#pragma GCC diagnostic ignored "-Wdeprecated-declarations" - [[UIApplication sharedApplication] registerForRemoteNotificationTypes:(UIRemoteNotificationTypeAlert | UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeSound)]; -#pragma GCC diagnostic pop - } - } else { -#if defined(__IPHONE_10_0) && __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_10_0 - // IOS 10 - UNAuthorizationOptions authOptions = UNAuthorizationOptionAlert | UNAuthorizationOptionSound| UNAuthorizationOptionBadge; - [[UNUserNotificationCenter currentNotificationCenter] requestAuthorizationWithOptions:authOptions completionHandler:^(BOOL granted, NSError * _Nullable error) { - if (granted) { - dispatch_async(dispatch_get_main_queue(), ^(void) { - [[UIApplication sharedApplication] registerForRemoteNotifications]; - }); - } - }]; -#endif - } -} - -- (void)setPushTokenAsString:(CDVInvokedUrlCommand *)command { - - [self.commandDelegate runInBackground:^{ - NSString *token = [command argumentAtIndex:0]; - if (token != nil && [token isKindOfClass:[NSString class]]) { - [clevertap setPushTokenAsString:token]; - } - }]; -} - -- (void)setPushXiaomiTokenAsString:(CDVInvokedUrlCommand *)command { - NSLog(@"XiaomiToken is no-op in iOS"); -} - -- (void)setPushBaiduTokenAsString:(CDVInvokedUrlCommand *)command { - NSLog(@"BaiduToken is no-op in iOS"); -} - -- (void)setPushHuaweiTokenAsString:(CDVInvokedUrlCommand *)command { - NSLog(@"HuaweiToken is no-op in iOS"); -} - -- (void)setPushToken:(NSData*)pushToken { - - [clevertap setPushToken:pushToken]; -} - -- (void)handleNotification:(id)notification { - - [clevertap handleNotificationWithData:notification]; - [self notifyPushNotification:notification]; -} - -- (void)handleDeepLink:(NSURL *)url { - - NSString *js = [NSString stringWithFormat:@"cordova.fireDocumentEvent('onDeepLink', {'deeplink':'%@'});", url.description]; - [self.commandDelegate evalJs:js]; -} - -- (void)createNotification:(CDVInvokedUrlCommand *)command { - - NSLog(@"createNotification is no-op in iOS"); -} - -- (void)createNotificationChannel:(CDVInvokedUrlCommand *)command { - - NSLog(@"createNotificationChannel is no-op in iOS"); -} - -- (void)createNotificationChannelWithSound:(CDVInvokedUrlCommand *)command { - - NSLog(@"createNotificationChannelWithSound is no-op in iOS"); -} - -- (void)createNotificationChannelWithGroupId:(CDVInvokedUrlCommand *)command { - - NSLog(@"createNotificationChannelWithGroupId is no-op in iOS"); -} - -- (void)createNotificationChannelWithGroupIdAndSound:(CDVInvokedUrlCommand *)command { - - NSLog(@"createNotificationChannelWithGroupIdAndSound is no-op in iOS"); -} - -- (void)createNotificationChannelGroup:(CDVInvokedUrlCommand *)command { - - NSLog(@"createNotificationChannelGroup is no-op in iOS"); -} - -- (void)deleteNotificationChannel:(CDVInvokedUrlCommand *)command { - - NSLog(@"deleteNotificationChannel is no-op in iOS"); -} - -- (void)deleteNotificationChannelGroup:(CDVInvokedUrlCommand *)command { - - NSLog(@"deleteNotificationChannelGroup is no-op in iOS"); -} - -#pragma mark - InApp Notification Controls - -- (void)suspendInAppNotifications { - [clevertap suspendInAppNotifications]; -} - -- (void)discardInAppNotifications { - [clevertap discardInAppNotifications]; -} - -- (void)resumeInAppNotifications { - [clevertap resumeInAppNotifications]; -} - - -#pragma mark - Push Notification Delegate - -- (void)pushNotificationTappedWithCustomExtras:(NSDictionary *)customExtras { - - NSMutableDictionary *jsonDict = [NSMutableDictionary new]; - - if (customExtras != nil) { - jsonDict[@"customExtras"] = customExtras; - } - - NSString *jsonString = [self _dictToJson:jsonDict]; - - if (jsonString != nil) { - NSString *js = [NSString stringWithFormat:@"cordova.fireDocumentEvent('onCleverTapPushNotificationTappedWithCustomExtras', %@);", jsonString]; - [self.commandDelegate evalJs:js]; - } -} - - -#pragma mark - Developer Options - -- (void)setDebugLevel:(CDVInvokedUrlCommand *)command { - - NSNumber *level = [command argumentAtIndex:0]; - if (level != nil && [level isKindOfClass:[NSNumber class]]) { - [CleverTap setDebugLevel:[level intValue]]; - } -} - -#pragma mark - Personalization - -- (void)enablePersonalization:(CDVInvokedUrlCommand *)command { - - [CleverTap enablePersonalization]; -} - -- (void)disablePersonalization:(CDVInvokedUrlCommand *)command { - - [CleverTap disablePersonalization]; -} - -#pragma mark - Offline API - -- (void)setOffline:(CDVInvokedUrlCommand *)command { - - [self.commandDelegate runInBackground:^{ - BOOL isOffline = [[command argumentAtIndex:0] boolValue]; - [clevertap setOffline:isOffline]; - }]; -} - -#pragma mark - OptOut API - -- (void)setOptOut:(CDVInvokedUrlCommand *)command { - - [self.commandDelegate runInBackground:^{ - BOOL isOptOut = [[command argumentAtIndex:0] boolValue]; - [clevertap setOptOut:isOptOut]; - }]; -} - -- (void)enableDeviceNetworkInfoReporting:(CDVInvokedUrlCommand *)command { - - [self.commandDelegate runInBackground:^{ - BOOL isNetworkInfoReporting = [[command argumentAtIndex:0] boolValue]; - [clevertap enableDeviceNetworkInfoReporting:isNetworkInfoReporting]; - }]; -} - - -#pragma mark - Event API - -- (void)recordScreenView:(CDVInvokedUrlCommand *)command { - - [self.commandDelegate runInBackground:^{ - NSString *screenName = [command argumentAtIndex:0]; - if (screenName != nil && [screenName isKindOfClass:[NSString class]]) { - [clevertap recordScreenView:screenName]; - } - }]; -} - -- (void)recordEventWithName:(CDVInvokedUrlCommand *)command { - - [self.commandDelegate runInBackground:^{ - NSString *eventName = [command argumentAtIndex:0]; - if (eventName != nil && [eventName isKindOfClass:[NSString class]]) { - [clevertap recordEvent:eventName]; - } - }]; -} - -- (void)recordEventWithNameAndProps:(CDVInvokedUrlCommand *)command { - - [self.commandDelegate runInBackground:^{ - NSString *eventName = [command argumentAtIndex:0]; - NSDictionary *eventProps = [command argumentAtIndex:1]; - if (eventName != nil && [eventName isKindOfClass:[NSString class]] && eventProps != nil && [eventProps isKindOfClass:[NSDictionary class]]) { - [clevertap recordEvent:eventName withProps:eventProps]; - } - }]; -} - -- (void)recordChargedEventWithDetailsAndItems:(CDVInvokedUrlCommand *)command { - - [self.commandDelegate runInBackground:^{ - NSDictionary *details = [command argumentAtIndex:0]; - NSArray *items = [command argumentAtIndex:1]; - - if (details != nil && [details isKindOfClass:[NSDictionary class]] && items != nil && [items isKindOfClass:[NSArray class]]) { - [clevertap recordChargedEventWithDetails:details andItems:items]; - } - }]; -} - -- (void)eventGetFirstTime:(CDVInvokedUrlCommand *)command { - - [self.commandDelegate runInBackground:^{ - NSString *eventName = [command argumentAtIndex:0]; - if (eventName != nil && [eventName isKindOfClass:[NSString class]]) { - NSTimeInterval first = [clevertap eventGetFirstTime:eventName]; - CDVPluginResult *pluginResult = [CDVPluginResult resultWithStatus:CDVCommandStatus_OK messageAsDouble:first]; - [self.commandDelegate sendPluginResult:pluginResult callbackId:command.callbackId]; - } - }]; -} - -- (void)eventGetLastTime:(CDVInvokedUrlCommand *)command { - - [self.commandDelegate runInBackground:^{ - NSString *eventName = [command argumentAtIndex:0]; - if (eventName != nil && [eventName isKindOfClass:[NSString class]]) { - NSTimeInterval last = [clevertap eventGetLastTime:eventName]; - CDVPluginResult *pluginResult = [CDVPluginResult resultWithStatus:CDVCommandStatus_OK messageAsDouble:last]; - [self.commandDelegate sendPluginResult:pluginResult callbackId:command.callbackId]; - } - }]; -} - -- (void)eventGetOccurrences:(CDVInvokedUrlCommand *)command { - - [self.commandDelegate runInBackground:^{ - NSString *eventName = [command argumentAtIndex:0]; - if (eventName != nil && [eventName isKindOfClass:[NSString class]]) { - int num = [clevertap eventGetOccurrences:eventName]; - CDVPluginResult *pluginResult = [CDVPluginResult resultWithStatus:CDVCommandStatus_OK messageAsInt:num]; - [self.commandDelegate sendPluginResult:pluginResult callbackId:command.callbackId]; - } - }]; -} - -- (void)eventGetDetails:(CDVInvokedUrlCommand *)command { - - [self.commandDelegate runInBackground:^{ - NSString *eventName = [command argumentAtIndex:0]; - if (eventName != nil && [eventName isKindOfClass:[NSString class]]) { - CleverTapEventDetail *detail = [clevertap eventGetDetail:eventName]; - NSDictionary * res = [self _eventDetailToDict:detail]; - CDVPluginResult *pluginResult = [CDVPluginResult resultWithStatus:CDVCommandStatus_OK messageAsDictionary:res]; - [self.commandDelegate sendPluginResult:pluginResult callbackId:command.callbackId]; - } - }]; -} - -- (void)getEventHistory:(CDVInvokedUrlCommand *)command { - - [self.commandDelegate runInBackground:^{ - NSDictionary *history = [clevertap userGetEventHistory]; - - NSMutableDictionary *_history = [NSMutableDictionary new]; - - for (NSString *eventName in [history keyEnumerator]) { - CleverTapEventDetail *detail = [history objectForKey:eventName]; - NSDictionary * _inner = [self _eventDetailToDict:detail]; - [_history setObject:_inner forKey:eventName]; - } - - CDVPluginResult *pluginResult = [CDVPluginResult resultWithStatus:CDVCommandStatus_OK messageAsDictionary:_history]; - [self.commandDelegate sendPluginResult:pluginResult callbackId:command.callbackId]; - }]; -} - - -#pragma mark - Profile API - -/** - Note: the call to CleverTapSDK must be made on the main thread due to start the LocationManager, but thereafter the CleverTapSDK method itself is non-blocking. - */ - -- (void)getLocation:(CDVInvokedUrlCommand *)command { - - [CleverTap getLocationWithSuccess:^(CLLocationCoordinate2D loc){ - CDVPluginResult *pluginResult = [CDVPluginResult resultWithStatus:CDVCommandStatus_OK messageAsDictionary:@{@"lat":@(loc.latitude), @"lon":@(loc.longitude)}]; - [self.commandDelegate sendPluginResult:pluginResult callbackId:command.callbackId]; - - } andError:^(NSString *error) { - CDVPluginResult *pluginResult = [CDVPluginResult resultWithStatus:CDVCommandStatus_ERROR messageAsString:error]; - [self.commandDelegate sendPluginResult:pluginResult callbackId:command.callbackId]; - }]; -} - -- (void)setLocation:(CDVInvokedUrlCommand *)command { - - [self.commandDelegate runInBackground:^{ - @try { - double lat = [[command argumentAtIndex:0] doubleValue]; - double lon = [[command argumentAtIndex:1] doubleValue]; - CLLocationCoordinate2D coordinate = CLLocationCoordinate2DMake(lat,lon); - [CleverTap setLocation:coordinate]; - } - @catch (NSException *exception) { - NSLog(@"error setting location %@", exception.reason); - return ; - } - }]; -} - -- (void)onUserLogin:(CDVInvokedUrlCommand *)command { - - [self.commandDelegate runInBackground:^{ - NSDictionary *profile = [command argumentAtIndex:0]; - if (profile != nil && [profile isKindOfClass:[NSDictionary class]]) { - NSDictionary *_profile = [self formatProfile:profile]; - [clevertap onUserLogin:_profile]; - } - }]; -} - -- (void)profileSet:(CDVInvokedUrlCommand *)command { - - [self.commandDelegate runInBackground:^{ - NSDictionary *profile = [command argumentAtIndex:0]; - if (profile != nil && [profile isKindOfClass:[NSDictionary class]]) { - NSDictionary *_profile = [self formatProfile:profile]; - [clevertap profilePush:_profile]; - } - }]; -} - -- (void)profileGetProperty:(CDVInvokedUrlCommand *)command { - - [self.commandDelegate runInBackground:^{ - NSString *propertyName = [command argumentAtIndex:0]; - CDVPluginResult *pluginResult; - - if (propertyName != nil && [propertyName isKindOfClass:[NSString class]]) { - id prop = [clevertap profileGet:propertyName]; - - if(prop == nil) { - pluginResult = [CDVPluginResult resultWithStatus:CDVCommandStatus_OK messageAsBool:NO]; - } - - else if([prop isKindOfClass:[NSString class]]) { - pluginResult = [CDVPluginResult resultWithStatus:CDVCommandStatus_OK messageAsString:prop]; - } - - else if([prop isKindOfClass:[NSDate class]]) { - pluginResult = [CDVPluginResult resultWithStatus:CDVCommandStatus_OK messageAsDouble:[prop timeIntervalSince1970]]; - } - - else if([prop isKindOfClass:[NSNumber class]]) { - BOOL isFloat = CFNumberIsFloatType((CFNumberRef)prop); - - if (isFloat) { - pluginResult = [CDVPluginResult resultWithStatus:CDVCommandStatus_OK messageAsDouble:[prop doubleValue]]; - - } - else { - pluginResult = [CDVPluginResult resultWithStatus:CDVCommandStatus_OK messageAsInt:[prop intValue]]; - }; - } - - else if([prop isKindOfClass:[NSDictionary class]]) { - pluginResult = [CDVPluginResult resultWithStatus:CDVCommandStatus_OK messageAsDictionary:prop]; - } - - else if([prop isKindOfClass:[NSArray class]]) { - pluginResult = [CDVPluginResult resultWithStatus:CDVCommandStatus_OK messageAsArray:prop]; - } - } - - if(!pluginResult) { - pluginResult = [CDVPluginResult resultWithStatus:CDVCommandStatus_OK messageAsBool:NO]; - } - - [self.commandDelegate sendPluginResult:pluginResult callbackId:command.callbackId]; - }]; -} - -- (void)profileGetCleverTapAttributionIdentifier:(CDVInvokedUrlCommand *)command { - - [self.commandDelegate runInBackground:^{ - CDVPluginResult *pluginResult; - - NSString *attributionID = [clevertap profileGetCleverTapAttributionIdentifier]; - - if(attributionID == nil) { - pluginResult = [CDVPluginResult resultWithStatus:CDVCommandStatus_OK messageAsBool:NO]; - } - - else { - pluginResult = [CDVPluginResult resultWithStatus:CDVCommandStatus_OK messageAsString:attributionID]; - } - - [self.commandDelegate sendPluginResult:pluginResult callbackId:command.callbackId]; - }]; -} - -- (void)profileGetCleverTapID:(CDVInvokedUrlCommand *)command { - - [self.commandDelegate runInBackground:^{ - CDVPluginResult *pluginResult; - - NSString *cleverTapID = [clevertap profileGetCleverTapID]; - - if(cleverTapID == nil) { - pluginResult = [CDVPluginResult resultWithStatus:CDVCommandStatus_OK messageAsBool:NO]; - } - - else { - pluginResult = [CDVPluginResult resultWithStatus:CDVCommandStatus_OK messageAsString:cleverTapID]; - } - - [self.commandDelegate sendPluginResult:pluginResult callbackId:command.callbackId]; - }]; -} - -- (void)getCleverTapID:(CDVInvokedUrlCommand *)command { - - [self.commandDelegate runInBackground:^{ - CDVPluginResult *pluginResult; - - NSString *cleverTapID = [clevertap profileGetCleverTapID]; - - if(cleverTapID == nil) { - pluginResult = [CDVPluginResult resultWithStatus:CDVCommandStatus_OK messageAsBool:NO]; - } - - else { - pluginResult = [CDVPluginResult resultWithStatus:CDVCommandStatus_OK messageAsString:cleverTapID]; - } - - [self.commandDelegate sendPluginResult:pluginResult callbackId:command.callbackId]; - }]; -} - -- (void)profileRemoveValueForKey:(CDVInvokedUrlCommand *)command { - - [self.commandDelegate runInBackground:^{ - NSString *key = [command argumentAtIndex:0]; - if (key != nil && [key isKindOfClass:[NSString class]]) { - [clevertap profileRemoveValueForKey:key]; - } - }]; - -} - -- (void)profileSetMultiValues:(CDVInvokedUrlCommand *)command { - - [self.commandDelegate runInBackground:^{ - NSString *key = [command argumentAtIndex:0]; - NSArray *values = [command argumentAtIndex:1]; - if (key != nil && [key isKindOfClass:[NSString class]] && values != nil && [values isKindOfClass:[NSArray class]]) { - [clevertap profileSetMultiValues:values forKey:key]; - } - }]; - -} - -- (void)profileAddMultiValue:(CDVInvokedUrlCommand *)command { - - [self.commandDelegate runInBackground:^{ - NSString *key = [command argumentAtIndex:0]; - NSString *value = [command argumentAtIndex:1]; - if (key != nil && [key isKindOfClass:[NSString class]] && value != nil && [value isKindOfClass:[NSString class]]) { - [clevertap profileAddMultiValue:value forKey:key]; - } - }]; -} - -- (void)profileAddMultiValues:(CDVInvokedUrlCommand *)command { - - [self.commandDelegate runInBackground:^{ - NSString *key = [command argumentAtIndex:0]; - NSArray *values = [command argumentAtIndex:1]; - if (key != nil && [key isKindOfClass:[NSString class]] && values != nil && [values isKindOfClass:[NSArray class]]) { - [clevertap profileAddMultiValues:values forKey:key]; - } - }]; -} - -- (void)profileRemoveMultiValue:(CDVInvokedUrlCommand *)command { - - [self.commandDelegate runInBackground:^{ - NSString *key = [command argumentAtIndex:0]; - NSString *value = [command argumentAtIndex:1]; - if (key != nil && [key isKindOfClass:[NSString class]] && value != nil && [value isKindOfClass:[NSString class]]) { - [clevertap profileRemoveMultiValue:value forKey:key]; - } - }]; -} - -- (void)profileRemoveMultiValues:(CDVInvokedUrlCommand *)command { - - [self.commandDelegate runInBackground:^{ - NSString *key = [command argumentAtIndex:0]; - NSArray *values = [command argumentAtIndex:1]; - if (key != nil && [key isKindOfClass:[NSString class]] && values != nil && [values isKindOfClass:[NSArray class]]) { - [clevertap profileRemoveMultiValues:values forKey:key]; - } - }]; -} - -- (void)profileIncrementValueBy:(CDVInvokedUrlCommand *)command { - - [self.commandDelegate runInBackground:^{ - NSString *key = [command argumentAtIndex:0]; - NSNumber *value = [command argumentAtIndex:1]; - if (key != nil && [key isKindOfClass:[NSString class]] && value != nil && [value isKindOfClass:[NSNumber class]]) { - [clevertap profileIncrementValueBy:value forKey:key]; - } - }]; -} - -- (void)profileDecrementValueBy:(CDVInvokedUrlCommand *)command { - - [self.commandDelegate runInBackground:^{ - NSString *key = [command argumentAtIndex:0]; - NSNumber *value = [command argumentAtIndex:1]; - if (key != nil && [key isKindOfClass:[NSString class]] && value != nil && [value isKindOfClass:[NSNumber class]]) { - [clevertap profileDecrementValueBy:value forKey:key]; - } - }]; -} - -#pragma mark Session API - -- (void)sessionGetTimeElapsed:(CDVInvokedUrlCommand *)command { - - [self.commandDelegate runInBackground:^{ - NSTimeInterval elapsed = [clevertap sessionGetTimeElapsed]; - CDVPluginResult *pluginResult = [CDVPluginResult resultWithStatus:CDVCommandStatus_OK messageAsDouble:elapsed]; - [self.commandDelegate sendPluginResult:pluginResult callbackId:command.callbackId]; - }]; -} - -- (void)sessionGetTotalVisits:(CDVInvokedUrlCommand *)command { - - [self.commandDelegate runInBackground:^{ - int total = [clevertap userGetTotalVisits]; - CDVPluginResult *pluginResult = [CDVPluginResult resultWithStatus:CDVCommandStatus_OK messageAsInt:total]; - [self.commandDelegate sendPluginResult:pluginResult callbackId:command.callbackId]; - }]; -} - -- (void)sessionGetScreenCount:(CDVInvokedUrlCommand *)command { - - [self.commandDelegate runInBackground:^{ - int count = [clevertap userGetScreenCount]; - CDVPluginResult *pluginResult = [CDVPluginResult resultWithStatus:CDVCommandStatus_OK messageAsInt:count]; - [self.commandDelegate sendPluginResult:pluginResult callbackId:command.callbackId]; - }]; -} - -- (void)sessionGetPreviousVisitTime:(CDVInvokedUrlCommand *)command { - - [self.commandDelegate runInBackground:^{ - NSTimeInterval previous = [clevertap userGetPreviousVisitTime]; - CDVPluginResult *pluginResult = [CDVPluginResult resultWithStatus:CDVCommandStatus_OK messageAsDouble:previous]; - [self.commandDelegate sendPluginResult:pluginResult callbackId:command.callbackId]; - }]; -} - -- (void)sessionGetUTMDetails:(CDVInvokedUrlCommand *)command { - - [self.commandDelegate runInBackground:^{ - CleverTapUTMDetail *detail = [clevertap sessionGetUTMDetails]; - NSDictionary * _detail = [self _utmDetailToDict:detail]; - CDVPluginResult *pluginResult = [CDVPluginResult resultWithStatus:CDVCommandStatus_OK messageAsDictionary:_detail]; - [self.commandDelegate sendPluginResult:pluginResult callbackId:command.callbackId]; - - }]; -} - -- (void)pushInstallReferrer:(CDVInvokedUrlCommand *)command { - - [self.commandDelegate runInBackground:^{ - NSString *source = [command argumentAtIndex:0]; - NSString *medium = [command argumentAtIndex:1]; - NSString *campaign = [command argumentAtIndex:2]; - [clevertap pushInstallReferrerSource:source medium:medium campaign:campaign]; - }]; -} - - -#pragma mark - Inbox - -- (void)initializeInbox:(CDVInvokedUrlCommand *)command { - - [self.commandDelegate runInBackground:^{ - [clevertap initializeInboxWithCallback:^(BOOL success) { - NSLog(@"Inbox initialized %d", success); - NSString *js = [NSString stringWithFormat:@"cordova.fireDocumentEvent('onCleverTapInboxDidInitialize')"]; - [self.commandDelegate evalJs:js]; - [self inboxMessagesDidUpdate]; - }]; - }]; -} - -- (void)inboxMessagesDidUpdate { - - [self.commandDelegate runInBackground:^{ - [clevertap registerInboxUpdatedBlock:^{ - NSLog(@"Inbox Messages updated"); - NSString *js = [NSString stringWithFormat:@"cordova.fireDocumentEvent('onCleverTapInboxMessagesDidUpdate')"]; - [self.commandDelegate evalJs:js]; - }]; - }]; -} - -- (void)getInboxMessageUnreadCount:(CDVInvokedUrlCommand *)command { - - [self.commandDelegate runInBackground:^{ - NSUInteger unreadMessageCount = [clevertap getInboxMessageUnreadCount]; - CDVPluginResult *pluginResult = [CDVPluginResult resultWithStatus:CDVCommandStatus_OK messageAsInt:(int)unreadMessageCount]; - [self.commandDelegate sendPluginResult:pluginResult callbackId:command.callbackId]; - }]; -} - -/** - Get Inbox Message Count - */ -- (void)getInboxMessageCount:(CDVInvokedUrlCommand *)command { - - [self.commandDelegate runInBackground:^{ - NSUInteger messageCount = [clevertap getInboxMessageCount]; - CDVPluginResult *pluginResult = [CDVPluginResult resultWithStatus:CDVCommandStatus_OK messageAsInt:(int)messageCount]; - [self.commandDelegate sendPluginResult:pluginResult callbackId:command.callbackId]; - }]; -} - -/** - Show Inbox - */ -- (void)showInbox:(CDVInvokedUrlCommand *)command { - - NSDictionary *configStyle = [command argumentAtIndex:0]; - CleverTapInboxViewController *inboxController = [clevertap newInboxViewControllerWithConfig:[self _dictToInboxStyleConfig:configStyle? configStyle : nil] andDelegate:(id )self]; - if (inboxController) { - UINavigationController *navigationController = [[UINavigationController alloc] initWithRootViewController:inboxController]; - [self.viewController presentViewController:navigationController animated:YES completion:nil]; - } -} - -/** - Get All Inbox Messages - */ -- (void)getAllInboxMessages:(CDVInvokedUrlCommand *)command { - - [self.commandDelegate runInBackground:^{ - NSArray *messageList = [clevertap getAllInboxMessages]; - NSArray *inboxMessages = [self cleverTapInboxMessagesToArray: messageList]; - CDVPluginResult *pluginResult = [CDVPluginResult resultWithStatus:CDVCommandStatus_OK messageAsArray:inboxMessages]; - [self.commandDelegate sendPluginResult:pluginResult callbackId:command.callbackId]; - }]; -} - -/** - Get Unread Messages From Inbox - */ -- (void)getUnreadInboxMessages:(CDVInvokedUrlCommand *)command { - - [self.commandDelegate runInBackground:^{ - NSArray *messageList = [clevertap getUnreadInboxMessages]; - NSArray *unreadInboxMessages = [self cleverTapInboxMessagesToArray: messageList]; - CDVPluginResult *pluginResult = [CDVPluginResult resultWithStatus:CDVCommandStatus_OK messageAsArray:unreadInboxMessages]; - [self.commandDelegate sendPluginResult:pluginResult callbackId:command.callbackId]; - }]; -} - -/** - //---Passing output in array due to plugin limitation - Get Inbox Message For Message ID - */ -- (void)getInboxMessageForId:(CDVInvokedUrlCommand *)command { - [self.commandDelegate runInBackground:^{ - NSString *messageId = [command argumentAtIndex:0]; - CleverTapInboxMessage *inboxMessage = [clevertap getInboxMessageForId:messageId]; - CDVPluginResult *pluginResult = [CDVPluginResult resultWithStatus:CDVCommandStatus_OK messageAsArray: [NSArray arrayWithObjects:inboxMessage,nil]]; - [self.commandDelegate sendPluginResult:pluginResult callbackId:command.callbackId]; - }]; -} - -/** - Delete message from the Inbox. Message id must be a String - */ -- (void)deleteInboxMessageForId:(CDVInvokedUrlCommand *)command { - - [self.commandDelegate runInBackground:^{ - NSString *messageId = [command argumentAtIndex:0]; - [clevertap deleteInboxMessageForID: messageId]; - }]; -} - -/** - Delete messages from the Inbox. Message id must be a String - */ -- (void)deleteInboxMessagesForIds:(CDVInvokedUrlCommand *)command { - - [self.commandDelegate runInBackground:^{ - NSArray *messageIds = [command argumentAtIndex:0]; - [clevertap deleteInboxMessagesForIDs: messageIds]; - }]; -} - -/** - Mark Message as Read - */ -- (void)markReadInboxMessageForId:(CDVInvokedUrlCommand *)command { - - [self.commandDelegate runInBackground:^{ - NSString *messageId = [command argumentAtIndex:0]; - [clevertap markReadInboxMessageForID: messageId]; - }]; -} - -/** - Record Inbox Notification Viewed for MessageID - */ -- (void)pushInboxNotificationViewedEventForId:(CDVInvokedUrlCommand *)command { - - [self.commandDelegate runInBackground:^{ - NSString *messageId = [command argumentAtIndex:0]; - [clevertap recordInboxNotificationViewedEventForID: messageId]; - }]; -} - -/** - Record Inbox Notification Clicked for MessageID - */ -- (void)pushInboxNotificationClickedEventForId:(CDVInvokedUrlCommand *)command { - - [self.commandDelegate runInBackground:^{ - NSString *messageId = [command argumentAtIndex:0]; - [clevertap recordInboxNotificationClickedEventForID: messageId]; - }]; -} - -#pragma mark Inbox Callback -- (void)messageButtonTappedWithCustomExtras:(NSDictionary *_Nullable)customExtras { - - NSMutableDictionary *jsonDict = [NSMutableDictionary new]; - - if (customExtras != nil) { - jsonDict[@"customExtras"] = customExtras; - } - - NSString *jsonString = [self _dictToJson:jsonDict]; - - if (jsonString != nil) { - NSString *js = [NSString stringWithFormat:@"cordova.fireDocumentEvent('onCleverTapInboxButtonClick', %@);", jsonString]; - [self.commandDelegate evalJs:js]; - } -} - -- (void)messageDidSelect:(CleverTapInboxMessage *_Nonnull)message{ - - NSString *jsonString = [self _dictToJson:message.json]; - - if (jsonString != nil) { - NSString *js = [NSString stringWithFormat:@"cordova.fireDocumentEvent('onCleverTapInboxItemClick', %@);", jsonString]; - [self.commandDelegate evalJs:js]; - } -} - - -#pragma mark - Native Display - -/** - Get All Display Units - */ -- (void)getAllDisplayUnits:(CDVInvokedUrlCommand *)command { - - [self.commandDelegate runInBackground:^{ - NSArray *displayUnits = [clevertap getAllDisplayUnits]; - NSArray *displayUnitsArray = [self cleverTapDisplayUnitsToArray: displayUnits]; - CDVPluginResult *pluginResult = [CDVPluginResult resultWithStatus:CDVCommandStatus_OK messageAsArray: displayUnitsArray]; - [self.commandDelegate sendPluginResult:pluginResult callbackId:command.callbackId]; - }]; -} - -/** - Get Display Unit For ID - */ -- (void)getDisplayUnitForId:(CDVInvokedUrlCommand *)command { - - [self.commandDelegate runInBackground:^{ - NSString *unitID = [command argumentAtIndex:0]; - CleverTapDisplayUnit *displayUnit = [clevertap getDisplayUnitForID:unitID]; - CDVPluginResult *pluginResult = [CDVPluginResult resultWithStatus:CDVCommandStatus_OK messageAsArray: [NSArray arrayWithObjects:displayUnit,nil]]; - [self.commandDelegate sendPluginResult:pluginResult callbackId:command.callbackId]; - }]; -} - -/** - Record Display Unit Viewed Event For ID - */ -- (void)pushDisplayUnitViewedEventForID:(CDVInvokedUrlCommand *)command { - - [self.commandDelegate runInBackground:^{ - NSString *unitID = [command argumentAtIndex:0]; - [clevertap recordDisplayUnitViewedEventForID:unitID]; - }]; -} - -- (void)pushDisplayUnitClickedEventForID:(CDVInvokedUrlCommand *)command { - - [self.commandDelegate runInBackground:^{ - NSString *unitID = [command argumentAtIndex:0]; - [clevertap recordDisplayUnitClickedEventForID:unitID]; - }]; -} - -- (void)displayUnitsUpdated:(NSArray*_Nonnull)displayUnits { - - NSMutableDictionary *jsonDict = [NSMutableDictionary new]; - - if (displayUnits != nil) { - NSMutableArray *items = [[NSMutableArray alloc] init]; - for (CleverTapDisplayUnit *item in displayUnits) { - [items addObject: item.json]; - } - jsonDict[@"units"] = items; - } - - NSString *jsonString = [self _dictToJson:jsonDict]; - - if (jsonString != nil) { - NSString *js = [NSString stringWithFormat:@"cordova.fireDocumentEvent('onCleverTapDisplayUnitsLoaded', %@);", jsonString]; - [self.commandDelegate evalJs:js]; - } -} - - -#pragma mark - Product Experience - -#pragma mark Feature Flag -//---Fetch Value of Given Feature Flag key and default value -- (void)getFeatureFlag: (CDVInvokedUrlCommand *)command { - - [self.commandDelegate runInBackground:^{ - NSString *varName = [command argumentAtIndex:0]; - BOOL defaultValue = [command argumentAtIndex:1]; - BOOL flagValue = [[clevertap featureFlags] get:varName withDefaultValue:defaultValue]; - CDVPluginResult *pluginResult = [CDVPluginResult resultWithStatus:CDVCommandStatus_OK messageAsBool:flagValue]; - [self.commandDelegate sendPluginResult:pluginResult callbackId:command.callbackId]; - }]; -} - - -#pragma mark Feature Flag Deleagte - -- (void)ctFeatureFlagsUpdated { - - NSString *js = [NSString stringWithFormat:@"cordova.fireDocumentEvent('onCleverTapFeatureFlagsDidUpdate')"]; - [self.commandDelegate evalJs:js]; -} - - -#pragma mark Product Config - -- (void)setDefaultsMap: (CDVInvokedUrlCommand *)command { - - [self.commandDelegate runInBackground:^{ - NSDictionary *jsonDict = [command argumentAtIndex:0]; - [[clevertap productConfig]setDefaults:jsonDict]; - }]; -} - -- (void)fetch: (CDVInvokedUrlCommand *)command { - - [self.commandDelegate runInBackground:^{ - [[clevertap productConfig] fetch]; - }]; -} - -- (void)fetchWithMinimumFetchIntervalInSeconds: (CDVInvokedUrlCommand *)command { - - [self.commandDelegate runInBackground:^{ - NSTimeInterval interval = [[command argumentAtIndex:0] doubleValue]; - [[clevertap productConfig]fetchWithMinimumInterval: interval]; - }]; -} - -- (void)activate: (CDVInvokedUrlCommand *)command { - - [self.commandDelegate runInBackground:^{ - [[clevertap productConfig] activate]; - }]; -} - -- (void)fetchAndActivate: (CDVInvokedUrlCommand *)command { - - [self.commandDelegate runInBackground:^{ - [[clevertap productConfig] fetchAndActivate]; - }]; -} - -- (void)setMinimumFetchIntervalInSeconds: (CDVInvokedUrlCommand *)command { - - [self.commandDelegate runInBackground:^{ - NSTimeInterval interval = [[command argumentAtIndex:0] doubleValue]; - [[clevertap productConfig] setMinimumFetchInterval:interval]; - }]; -} - -- (void)getLastFetchTimeStampInMillis: (CDVInvokedUrlCommand *)command { - - [self.commandDelegate runInBackground:^{ - NSTimeInterval value = [[[clevertap productConfig] getLastFetchTimeStamp] timeIntervalSince1970] * 1000; - CDVPluginResult *pluginResult = [CDVPluginResult resultWithStatus:CDVCommandStatus_OK messageAsDouble:value]; - [self.commandDelegate sendPluginResult:pluginResult callbackId:command.callbackId]; - }]; -} - - -- (void)getString: (CDVInvokedUrlCommand *)command { - - [self.commandDelegate runInBackground:^{ - NSString *key = [command argumentAtIndex:0]; - NSString *keyValue = [[clevertap productConfig] get:key].stringValue; - CDVPluginResult *pluginResult = [CDVPluginResult resultWithStatus:CDVCommandStatus_OK messageAsString:keyValue]; - [self.commandDelegate sendPluginResult:pluginResult callbackId:command.callbackId]; - }]; -} - -- (void)getBoolean: (CDVInvokedUrlCommand *)command { - - [self.commandDelegate runInBackground:^{ - NSString *key = [command argumentAtIndex:0]; - BOOL keyValue = [[clevertap productConfig] get:key].boolValue; - CDVPluginResult *pluginResult = [CDVPluginResult resultWithStatus:CDVCommandStatus_OK messageAsBool:keyValue]; - [self.commandDelegate sendPluginResult:pluginResult callbackId:command.callbackId]; - }]; -} - -- (void)getLong: (CDVInvokedUrlCommand *)command { - - [self.commandDelegate runInBackground:^{ - NSString *key = [command argumentAtIndex:0]; - long keyValue = [[clevertap productConfig] get:key].numberValue.longValue; - CDVPluginResult *pluginResult = [CDVPluginResult resultWithStatus:CDVCommandStatus_OK messageAsDouble:keyValue]; - [self.commandDelegate sendPluginResult:pluginResult callbackId:command.callbackId]; - }]; -} - -- (void)getDouble: (CDVInvokedUrlCommand *)command { - - [self.commandDelegate runInBackground:^{ - NSString *key = [command argumentAtIndex:0]; - double keyValue = [[clevertap productConfig] get:key].numberValue.doubleValue; - CDVPluginResult *pluginResult = [CDVPluginResult resultWithStatus:CDVCommandStatus_OK messageAsDouble:keyValue]; - [self.commandDelegate sendPluginResult:pluginResult callbackId:command.callbackId]; - }]; -} - -- (void)reset { - - [self.commandDelegate runInBackground:^{ - [[clevertap productConfig] reset]; - }]; -} - - -#pragma mark Product Config Delegate - -- (void)ctProductConfigFetched { - - NSString *js = [NSString stringWithFormat:@"cordova.fireDocumentEvent('onCleverTapProductConfigDidFetch')"]; - [self.commandDelegate evalJs:js]; -} - -- (void)ctProductConfigActivated { - - NSString *js = [NSString stringWithFormat:@"cordova.fireDocumentEvent('onCleverTapProductConfigDidActivate')"]; - [self.commandDelegate evalJs:js]; -} - -- (void)ctProductConfigInitialized { - - NSString *js = [NSString stringWithFormat:@"cordova.fireDocumentEvent('onCleverTapProductConfigDidInitialize')"]; - [self.commandDelegate evalJs:js]; -} - -- (CleverTapInboxStyleConfig*)_dictToInboxStyleConfig: (NSDictionary *)dict { - - CleverTapInboxStyleConfig *_config = [CleverTapInboxStyleConfig new]; - NSString *title = [dict valueForKey:@"navBarTitle"]; - if (title) { - _config.title = title; - } - NSArray *messageTags = [dict valueForKey:@"tabs"]; - if (messageTags) { - _config.messageTags = messageTags; - } - NSString *backgroundColor = [dict valueForKey:@"inboxBackgroundColor"]; - if (backgroundColor) { - _config.backgroundColor = [self ct_colorWithHexString:backgroundColor alpha:1.0]; - } - NSString *navigationBarTintColor = [dict valueForKey:@"navBarColor"]; - if (navigationBarTintColor) { - _config.navigationBarTintColor = [self ct_colorWithHexString:navigationBarTintColor alpha:1.0]; - } - NSString *navigationTintColor = [dict valueForKey:@"navBarTitleColor"]; - if (navigationTintColor) { - _config.navigationTintColor = [self ct_colorWithHexString:navigationTintColor alpha:1.0]; - } - NSString *tabBackgroundColor = [dict valueForKey:@"tabBackgroundColor"]; - if (tabBackgroundColor) { - _config.navigationBarTintColor = [self ct_colorWithHexString:tabBackgroundColor alpha:1.0]; - } - NSString *tabSelectedBgColor = [dict valueForKey:@"tabSelectedBgColor"]; - if (tabSelectedBgColor) { - _config.tabSelectedBgColor = [self ct_colorWithHexString:tabSelectedBgColor alpha:1.0]; - } - NSString *tabSelectedTextColor = [dict valueForKey:@"tabSelectedTextColor"]; - if (tabSelectedTextColor) { - _config.tabSelectedTextColor = [self ct_colorWithHexString:tabSelectedTextColor alpha:1.0]; - } - NSString *tabUnSelectedTextColor = [dict valueForKey:@"tabUnSelectedTextColor"]; - if (tabUnSelectedTextColor) { - _config.tabUnSelectedTextColor = [self ct_colorWithHexString:tabUnSelectedTextColor alpha:1.0]; - } - return _config; -} - -- (UIColor *)ct_colorWithHexString:(NSString *)string alpha:(CGFloat)alpha { - - if (![string isKindOfClass:[NSString class]] || [string length] == 0) { - return [UIColor colorWithRed:0.0f green:0.0f blue:0.0f alpha:1.0f]; - } - unsigned int hexint = 0; - NSScanner *scanner = [NSScanner scannerWithString:string]; - [scanner setCharactersToBeSkipped:[NSCharacterSet - characterSetWithCharactersInString:@"#"]]; - [scanner scanHexInt:&hexint]; - 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/Samples/Cordova/ExampleProject/plugins/clevertap-cordova/www/CleverTap.js b/Samples/Cordova/ExampleProject/plugins/clevertap-cordova/www/CleverTap.js deleted file mode 100644 index 0face8c3..00000000 --- a/Samples/Cordova/ExampleProject/plugins/clevertap-cordova/www/CleverTap.js +++ /dev/null @@ -1,581 +0,0 @@ -// Copyright (C) 2015 CleverTap -// -// This code is provided under a commercial License. -// A copy of this license has been distributed in a file called LICENSE -// with this source code. -// - -var CleverTap = function () { -} - -/******************* - * notify device ready - * NOTE: in iOS use to be notified of launch Push Notification or Deep Link - in Android use only in android phonegap build projects - ******************/ -CleverTap.prototype.notifyDeviceReady = function () { - cordova.exec(null, null, "CleverTapPlugin", "notifyDeviceReady", []); -} - -/******************* - * Personalization - ******************/ -// Enables the Personalization API -CleverTap.prototype.enablePersonalization = function () { - cordova.exec(null, null, "CleverTapPlugin", "enablePersonalization", []); -} - -// Disables the Personalization API -CleverTap.prototype.disablePersonalization = function () { - cordova.exec(null, null, "CleverTapPlugin", "disablePersonalization", []); -} - -//Enables tracking opt out for the currently active user. -CleverTap.prototype.setOptOut = function (value) { - cordova.exec(null, null, "CleverTapPlugin", "setOptOut", [value]); -} - -//Sets CleverTap SDK to offline mode. -CleverTap.prototype.setOffline = function (value) { - cordova.exec(null, null, "CleverTapPlugin", "setOffline", [value]); -} - -//Enables the reporting of device network related information, including IP address. This reporting is disabled by default. -CleverTap.prototype.enableDeviceNetworkInfoReporting = function (value) { - cordova.exec(null, null, "CleverTapPlugin", "enableDeviceNetworkInfoReporting", [value]); -} - -/******************* - * Push - ******************/ -// Registers for push notifications -CleverTap.prototype.registerPush = function () { - cordova.exec(null, null, "CleverTapPlugin", "registerPush", []); -} - -// Sets the devices push token -CleverTap.prototype.setPushToken = function (token) { - cordova.exec(null, null, "CleverTapPlugin", "setPushTokenAsString", [token]); -} - -// Sets the devices Xiaomi push token -CleverTap.prototype.setPushXiaomiToken = function (token) { - cordova.exec(null, null, "CleverTapPlugin", "setPushXiaomiTokenAsString", [token]); -} - -// Sets the devices Baidu push token -CleverTap.prototype.setPushBaiduToken = function (token) { - cordova.exec(null, null, "CleverTapPlugin", "setPushBaiduTokenAsString", [token]); -} - -// Sets the devices Huawei push token -CleverTap.prototype.setPushHuaweiToken = function (token) { - cordova.exec(null, null, "CleverTapPlugin", "setPushHuaweiTokenAsString", [token]); -} - -//Create Notification Channel for Android O - -CleverTap.prototype.createNotification = function (extras) { - cordova.exec(null,null, "CleverTapPlugin", "createNotification", [extras]); -} - -CleverTap.prototype.createNotificationChannel = function (channelID, channelName, channelDescription, importance, showBadge) { - cordova.exec(null,null, "CleverTapPlugin", "createNotificationChannel", [channelID, channelName, channelDescription, importance, showBadge]); -} - -CleverTap.prototype.createNotificationChannelWithSound = function (channelID, channelName, channelDescription, importance, showBadge,sound) { - cordova.exec(null,null, "CleverTapPlugin", "createNotificationChannelWithSound", [channelID, channelName, channelDescription, importance, showBadge, sound]); -} - -//Create Notification Channel with Group ID for Android O -CleverTap.prototype.createNotificationChannelWithGroupId = function (channelID, channelName, channelDescription, importance, groupId, showBadge) { - cordova.exec(null,null, "CleverTapPlugin", "createNotificationChannelWithGroupId", [channelID, channelName, channelDescription, importance, groupId, showBadge]); -} - -CleverTap.prototype.createNotificationChannelWithGroupIdAndSound = function (channelID, channelName, channelDescription, importance, groupId, showBadge, sound) { - cordova.exec(null,null, "CleverTapPlugin", "createNotificationChannelWithGroupIdAndSound", [channelID, channelName, channelDescription, importance, groupId, showBadge, sound]); -} - -//Create Notification Channel Group for Android O -CleverTap.prototype.createNotificationChannelGroup = function (groupId, groupName) { - cordova.exec(null,null, "CleverTapPlugin", "createNotificationChannelGroup", [groupId, groupName]); -} - -//Delete Notification Channel for Android O -CleverTap.prototype.deleteNotificationChannel = function (channelID) { - cordova.exec(null,null, "CleverTapPlugin", "deleteNotificationChannel", [channelID]); -} - -//Delete Notification Channel Group for Android O -CleverTap.prototype.deleteNotificationChannelGroup = function (groupId) { - cordova.exec(null,null, "CleverTapPlugin", "deleteNotificationChannelGroup", [groupId]); -} - - -/******************* - * Events - ******************/ - -// Record Screen View, iOS only -// screenName = string -CleverTap.prototype.recordScreenView = function (screenName) { - cordova.exec(null, null, "CleverTapPlugin", "recordScreenView", [screenName]); -} - -// Record Event with Name -// eventName = string -CleverTap.prototype.recordEventWithName = function (eventName) { - cordova.exec(null, null, "CleverTapPlugin", "recordEventWithName", [eventName]); -} - -// Record Event with Name and Event properties -// eventName = string -// eventProps = object -CleverTap.prototype.recordEventWithNameAndProps = function (eventName, eventProps) { - convertDateToEpochInProperties(eventProps) - cordova.exec(null, null, "CleverTapPlugin", "recordEventWithNameAndProps", [eventName, eventProps]); -} - -// Record Charged Event with Details and Items -// details = object with transaction details -// items = array of items purchased -CleverTap.prototype.recordChargedEventWithDetailsAndItems = function (details, items) { - convertDateToEpochInProperties(details) - // iterate over the array & convert the date items to CleverTap's server supported $D String - for (var i = 0; i < items.length; i++) { - convertDateToEpochInProperties(items[i]) - } - cordova.exec(null, null, "CleverTapPlugin", "recordChargedEventWithDetailsAndItems", [details, items]); -} - -// Get Event First Time -// eventName = string -// successCallback = callback function for result -// success returns epoch seconds or -1 -CleverTap.prototype.eventGetFirstTime = function (eventName, successCallback) { - cordova.exec(successCallback, null, "CleverTapPlugin", "eventGetFirstTime", [eventName]); -} - -// Get Event Last Time -// eventName = string -// successCallback = callback function for result -// success returns epoch seconds or -1 -CleverTap.prototype.eventGetLastTime = function (eventName, successCallback) { - cordova.exec(successCallback, null, "CleverTapPlugin", "eventGetLastTime", [eventName]); -} - -// Get Event Get Occurrences -// successCallback = callback function for result -// success calls back with int or -1 -CleverTap.prototype.eventGetOccurrences = function (eventName, successCallback) { - cordova.exec(successCallback, null, "CleverTapPlugin", "eventGetOccurrences", [eventName]); -} - -// Get Event Get Details -// successCallback = callback function for result -// success calls back with object {"eventName": , "firstTime":, "lastTime": , "count": } or empty object -CleverTap.prototype.eventGetDetails = function (eventName, successCallback) { - cordova.exec(successCallback, null, "CleverTapPlugin", "eventGetDetails", [eventName]); -} - -// Get Event History -// successCallback = callback function for result -// success calls back with object {"eventName1":, "eventName2":} -CleverTap.prototype.getEventHistory = function (successCallback) { - cordova.exec(successCallback, null, "CleverTapPlugin", "getEventHistory", []); -} - - -/******************* - * Profiles - ******************/ - -/** -Get the device location if available. - -On iOS: -Calling this will prompt the user location permissions dialog. -Please be sure to include the NSLocationWhenInUseUsageDescription key in your Info.plist. -Uses desired accuracy of kCLLocationAccuracyHundredMeters. -If you need background location updates or finer accuracy please implement your own location handling. - -On Android: -Requires Location Permission in AndroidManifest e.g. "android.permission.ACCESS_COARSE_LOCATION" - -You can use location to pass it to CleverTap via the setLocation API -for, among other things, more fine-grained geo-targeting and segmentation purposes. - -successCallback = callback function for result -errorCallback = callback function in case of error -success returns {lat:lat, lon:lon} lat and lon are floats -error returns a reason string - -Note: on iOS the call to CleverTapSDK must be made on the main thread due to LocationManager restrictions, but the CleverTapSDK method itself is non-blocking. -*/ -CleverTap.prototype.getLocation = function (successCallback, errorCallback) { - cordova.exec(successCallback, errorCallback, "CleverTapPlugin", "getLocation", []); -} - -// Set location -// lat = float -// lon = float -CleverTap.prototype.setLocation = function (lat, lon) { - cordova.exec(null, null, "CleverTapPlugin", "setLocation", [lat, lon]); -} - -/** - Creates a separate and distinct user profile identified by one or more of Identity, Email, FBID or GPID values, - and populated with the key-values included in the profile dictionary. - - If your app is used by multiple users, you can use this method to assign them each a unique profile to track them separately. - - If instead you wish to assign multiple Identity, Email, FBID and/or GPID values to the same user profile, - use profileSet rather than this method. - - If none of Identity, Email, FBID or GPID is included in the profile dictionary, - all properties values will be associated with the current user profile. - - When initially installed on this device, your app is assigned an "anonymous" profile. - The first time you identify a user on this device (whether via onUserLogin or profileSet), - the "anonymous" history on the device will be associated with the newly identified user. - - Then, use this method to switch between subsequent separate identified users. - - Please note that switching from one identified user to another is a costly operation - in that the current session for the previous user is automatically closed - and data relating to the old user removed, and a new session is started - for the new user and data for that user refreshed via a network call to CleverTap. - In addition, any global frequency caps are reset as part of the switch. - - profile = object - */ -CleverTap.prototype.onUserLogin = function (profile) { - convertDateToEpochInProperties(profile) - cordova.exec(null, null, "CleverTapPlugin", "onUserLogin", [profile]); -} - -// Set profile attributes -// profile = object -CleverTap.prototype.profileSet = function (profile) { - convertDateToEpochInProperties(profile) - cordova.exec(null, null, "CleverTapPlugin", "profileSet", [profile]); -} - -// Get User Profile Property -// propertyName = string -// successCallback = callback function for result -// success calls back with value of propertyName or false -CleverTap.prototype.profileGetProperty = function (propertyName, successCallback) { - cordova.exec(successCallback, null, "CleverTapPlugin", "profileGetProperty", [propertyName]); -} - -/** -* @deprecated This method is deprecated in v2.3.5. Use getCleverTapID() instead. -* Get a unique CleverTap identifier suitable for use with install attribution providers -* successCallback = callback function for result -* success returns the unique CleverTap attribution identifier -*/ -CleverTap.prototype.profileGetCleverTapAttributionIdentifier = function (successCallback) { - cordova.exec(successCallback, null, "CleverTapPlugin", "profileGetCleverTapAttributionIdentifier", []); -} - -/** -* @deprecated This method is deprecated in v2.3.5. Use getCleverTapID() instead. -* Get User Profile CleverTapID -* successCallback = callback function for result -* success calls back with CleverTapID or false -*/ -CleverTap.prototype.profileGetCleverTapID = function (successCallback) { - cordova.exec(successCallback, null, "CleverTapPlugin", "profileGetCleverTapID", []); -} - -// Get User Profile CleverTapID -// successCallback = callback function for result -// success calls back with CleverTapID or false -CleverTap.prototype.getCleverTapID = function (successCallback) { - cordova.exec(successCallback, null, "CleverTapPlugin", "getCleverTapID", []); -} - -// Remove the property specified by key from the user profile -// key = string -CleverTap.prototype.profileRemoveValueForKey = function (key) { - cordova.exec(null, null, "CleverTapPlugin", "profileRemoveValueForKey", [key]); -} - -// Method for setting a multi-value user profile property. -// key = string -// values = array of strings -CleverTap.prototype.profileSetMultiValues = function (key, values) { - cordova.exec(null, null, "CleverTapPlugin", "profileSetMultiValues", [key, values]); -} - -// Method for adding a value to a multi-value user profile property. -// key = string -// value = string -CleverTap.prototype.profileAddMultiValue = function (key, value) { - cordova.exec(null, null, "CleverTapPlugin", "profileAddMultiValue", [key, value]); -} - -// Method for adding values to a multi-value user profile property. -// key = string -// values = array of strings -CleverTap.prototype.profileAddMultiValues = function (key, values) { - cordova.exec(null, null, "CleverTapPlugin", "profileAddMultiValues", [key, values]); -} - -// Method for removing a value from a multi-value user profile property. -// key = string -// value = string -CleverTap.prototype.profileRemoveMultiValue = function (key, value) { - cordova.exec(null, null, "CleverTapPlugin", "profileRemoveMultiValue", [key, value]); -} - -// Method for removing values from a multi-value user profile property. -// key = string -// values = array of strings -CleverTap.prototype.profileRemoveMultiValues = function (key, values) { - cordova.exec(null, null, "CleverTapPlugin", "profileRemoveMultiValues", [key, values]); -} -// Method for incrementing a value for a single-value profile property (if it exists). -// key = string -// value = number -CleverTap.prototype.profileIncrementValueBy = function (key, value) { - cordova.exec(null, null, "CleverTapPlugin", "profileIncrementValueBy", [key, value]); -} - -// Method for decrementing a value for a single-value profile property (if it exists). -// key = string -// value = number -CleverTap.prototype.profileDecrementValueBy = function (key, value) { - cordova.exec(null, null, "CleverTapPlugin", "profileDecrementValueBy", [key, value]); -} - -/******************* - * Session - ******************/ - -// Get Session Elapsed Time -// successCallback = callback function for result -// success calls back with seconds -CleverTap.prototype.sessionGetTimeElapsed = function (successCallback) { - cordova.exec(successCallback, null, "CleverTapPlugin", "sessionGetTimeElapsed", []); -} - -// Get Session Get Total Visits -// successCallback = callback function for result -// success calls back with int or -1 -CleverTap.prototype.sessionGetTotalVisits = function (successCallback) { - cordova.exec(successCallback, null, "CleverTapPlugin", "sessionGetTotalVisits", []); -} - -// Get Sesssion Screen Count -// successCallback = callback function for result -// success calls back with int -CleverTap.prototype.sessionGetScreenCount = function (successCallback) { - cordova.exec(successCallback, null, "CleverTapPlugin", "sessionGetScreenCount", []); -} - -// Get Sesssion Get Previous Visit Time -// successCallback = callback function for result -// success calls back with epoch seconds or -1 -CleverTap.prototype.sessionGetPreviousVisitTime = function (successCallback) { - cordova.exec(successCallback, null, "CleverTapPlugin", "sessionGetPreviousVisitTime", []); -} - -// Get Sesssion Get Referrer UTM details -// successCallback = callback function for result -// success calls back with object {"source": , "medium": , "campaign": } or empty object -CleverTap.prototype.sessionGetUTMDetails = function (successCallback) { - cordova.exec(successCallback, null, "CleverTapPlugin", "sessionGetUTMDetails", []); -} - -// Call this to manually track the utm details for an incoming install referrer. -// source = string the utm source -// medium = string the utm medium -// campaign = string the utm campaign -CleverTap.prototype.pushInstallReferrer = function (source, medium, campaign) { - cordova.exec(null, null, "CleverTapPlugin", "pushInstallReferrer", [source, medium, campaign]); -} - -/******************* - * Developer Options - ******************/ -// Set the debug level, 0 is off, 1 is on -// level = int -CleverTap.prototype.setDebugLevel= function (level) { - cordova.exec(null, null, "CleverTapPlugin", "setDebugLevel", [level]); -} - -/**************************** - * Notification Inbox methods - ****************************/ -// Initializes the app inbox - -CleverTap.prototype.initializeInbox= function () { - cordova.exec(null, null, "CleverTapPlugin", "initializeInbox", []); -} - -// Get Unread Inbox Message count for the user -// successCallback = callback function for result -// success calls back returns the total number of unread inbox messages for the user -CleverTap.prototype.getInboxMessageUnreadCount = function (successCallback) { - cordova.exec(successCallback, null, "CleverTapPlugin", "getInboxMessageUnreadCount", []); -} - -// Get Inbox Message count for the user -// successCallback = callback function for result -// success calls back returns the total number of inbox messages for the user -CleverTap.prototype.getInboxMessageCount = function (successCallback) { - cordova.exec(successCallback, null, "CleverTapPlugin", "getInboxMessageCount", []); -} - -CleverTap.prototype.showInbox = function (styleConfig) { - cordova.exec(null, null, "CleverTapPlugin", "showInbox", [styleConfig]); -} - -CleverTap.prototype.getAllInboxMessages = function (successCallback) { - cordova.exec(successCallback, null, "CleverTapPlugin", "getAllInboxMessages", []); -} - -CleverTap.prototype.getUnreadInboxMessages = function (successCallback) { - cordova.exec(successCallback, null, "CleverTapPlugin", "getUnreadInboxMessages", []); -} - -CleverTap.prototype.getInboxMessageForId = function (messageId, successCallback) { - cordova.exec(successCallback, null, "CleverTapPlugin", "getInboxMessageForId", [messageId]); -} - -CleverTap.prototype.deleteInboxMessageForId = function (messageId) { - cordova.exec(null, null, "CleverTapPlugin", "deleteInboxMessageForId", [messageId]); -} - -CleverTap.prototype.markReadInboxMessageForId = function (messageId) { - cordova.exec(null, null, "CleverTapPlugin", "markReadInboxMessageForId", [messageId]); -} - -CleverTap.prototype.pushInboxNotificationViewedEventForId = function (messageId) { - cordova.exec(null, null, "CleverTapPlugin", "pushInboxNotificationViewedEventForId", [messageId]); -} - -CleverTap.prototype.pushInboxNotificationClickedEventForId = function (messageId) { - cordova.exec(null, null, "CleverTapPlugin", "pushInboxNotificationClickedEventForId", [messageId]); -} - -/******************* - * In-App Controls - ******************/ -/** - Suspends and saves inApp notifications until 'resumeInAppNotifications' is called for current session. - Automatically resumes InApp notifications display on CleverTap shared instance creation. Pending inApp notifications are displayed only for current session. - */ -CleverTap.prototype.suspendInAppNotifications = function () { - cordova.exec(null, null, "CleverTapPlugin", "suspendInAppNotifications", []); -} - -/** - Discards inApp notifications until 'resumeInAppNotifications' is called for current session. - Automatically resumes InApp notifications display on CleverTap shared instance creation. Pending inApp notifications are not displayed. */ -CleverTap.prototype.discardInAppNotifications = function () { - cordova.exec(null, null, "CleverTapPlugin", "discardInAppNotifications", []); -} - -/** - Resumes displaying inApps notifications and shows pending inApp notifications if any. - */ -CleverTap.prototype.resumeInAppNotifications = function () { - cordova.exec(null, null, "CleverTapPlugin", "resumeInAppNotifications", []); -} - -/**************************** - * Native Display methods - ****************************/ -CleverTap.prototype.getAllDisplayUnits = function(successCallback){ - cordova.exec(successCallback, null, "CleverTapPlugin", "getAllDisplayUnits", []); -} - -CleverTap.prototype.getDisplayUnitForId = function(unitId, successCallback){ - cordova.exec(successCallback, null, "CleverTapPlugin", "getDisplayUnitForId", [unitId]); -} - -CleverTap.prototype.pushDisplayUnitViewedEventForID = function(unitId){ - cordova.exec(null, null, "CleverTapPlugin", "pushDisplayUnitViewedEventForID", [unitId]); -} - -CleverTap.prototype.pushDisplayUnitClickedEventForID = function(unitId){ - cordova.exec(null, null, "CleverTapPlugin", "pushDisplayUnitClickedEventForID", [unitId]); -} - -/**************************** - * Feature Flag methods - ****************************/ -CleverTap.prototype.getFeatureFlag = function(name,defaultValue,successCallback){ - cordova.exec(successCallback, null, "CleverTapPlugin", "getFeatureFlag", [name,defaultValue]); -} - -/**************************** - * Product Config methods - ****************************/ -CleverTap.prototype.setDefaultsMap = function(jsonMap){ - cordova.exec(null, null, "CleverTapPlugin", "setDefaultsMap", [jsonMap]); -} - -CleverTap.prototype.fetch = function(){ - cordova.exec(null, null, "CleverTapPlugin", "fetch", []); -} - -CleverTap.prototype.fetchWithMinimumFetchIntervalInSeconds = function(interval){ - cordova.exec(null, null, "CleverTapPlugin", "fetchWithMinimumFetchIntervalInSeconds", [interval]); -} - -CleverTap.prototype.activate = function(){ - cordova.exec(null, null, "CleverTapPlugin", "activate", []); -} - -CleverTap.prototype.fetchAndActivate = function(){ - cordova.exec(null, null, "CleverTapPlugin", "fetchAndActivate", []); -} - -CleverTap.prototype.setMinimumFetchIntervalInSeconds = function(interval){ - cordova.exec(null, null, "CleverTapPlugin", "setMinimumFetchIntervalInSeconds", [interval]); -} - -CleverTap.prototype.getLastFetchTimeStampInMillis = function(successCallback){ - cordova.exec(successCallback, null, "CleverTapPlugin", "getLastFetchTimeStampInMillis", []); -} - -CleverTap.prototype.getString = function(key,successCallback){ - cordova.exec(successCallback, null, "CleverTapPlugin", "getString", [key]); -} - -CleverTap.prototype.getBoolean = function(key,successCallback){ - cordova.exec(successCallback, null, "CleverTapPlugin", "getBoolean", [key]); -} - -CleverTap.prototype.getLong = function(key,successCallback){ - cordova.exec(successCallback, null, "CleverTapPlugin", "getLong", [key]); -} - -CleverTap.prototype.getDouble = function(key,successCallback){ - cordova.exec(successCallback, null, "CleverTapPlugin", "getDouble", [key]); -} - -CleverTap.prototype.reset = function(){ - cordova.exec(null, null, "CleverTapPlugin", "reset", []); -} - -function convertDateToEpochInProperties(items){ -//Conversion of date object in suitable CleverTap format - - /*-------------- * ----------------- - | input => output | - * --------------------------------- * - | new Date() => $D_epoch | - ---------------- * ----------------- */ - for (let [key, value] of Object.entries(items)) { - if (Object.prototype.toString.call(value) === '[object Date]') { - items[key] = "$D_" + Math.floor(value.getTime()/1000); - } - } -} - -module.exports = new CleverTap(); diff --git a/Samples/Cordova/ExampleProject/plugins/cordova-android-support-gradle-release/README.md b/Samples/Cordova/ExampleProject/plugins/cordova-android-support-gradle-release/README.md deleted file mode 100644 index 86348f23..00000000 --- a/Samples/Cordova/ExampleProject/plugins/cordova-android-support-gradle-release/README.md +++ /dev/null @@ -1,173 +0,0 @@ -cordova-android-support-gradle-release [![Latest Stable Version](https://img.shields.io/npm/v/cordova-android-support-gradle-release.svg)](https://www.npmjs.com/package/cordova-android-support-gradle-release) [![Total Downloads](https://img.shields.io/npm/dt/cordova-android-support-gradle-release.svg)](https://npm-stat.com/charts.html?package=cordova-android-support-gradle-release) -====================================== - -This Cordova/Phonegap plugin for Android aligns various versions of the Android Support libraries specified by other plugins to a specific version. - - - -**Table of Contents** - -- [Purpose](#purpose) -- [Installation](#installation) -- [Library versions](#library-versions) - - [Default version](#default-version) - - [Other versions](#other-versions) -- [Example cases](#example-cases) - - [Example 1](#example-1) - - [Example 2](#example-2) -- [Credits](#credits) -- [License](#license) - - - -# Purpose - -**TL;DR**: To prevent build failures caused by including different versions of the support libraries. - -Some Cordova plugins include [Android Support Libraries](https://developer.android.com/topic/libraries/support-library/index.html) to faciliate them. -Most commonly, these are now included into the Cordova project by specifying them as Gradle dependencies (see the [Cordova plugin spec documentation](https://cordova.apache.org/docs/en/latest/plugin_ref/spec.html#framework)). - -Example plugins: -- [cordova-diagnostic-plugin](https://github.com/dpa99c/cordova-diagnostic-plugin) -- [Telerik ImagePicker plugin](https://github.com/Telerik-Verified-Plugins/ImagePicker) -- [cordova-plugin-local-notifications](https://github.com/katzer/cordova-plugin-local-notifications/) -- [cordova-plugin-facebook4](https://github.com/jeduan/cordova-plugin-facebook4) - -The problem arises when these plugins specify different versions of the support libraries. This can cause build failures to occur, which are not easy to resolve without changes by the plugin authors to align the specified versions. See these issues: - -- [phonegap-plugin-barcodescanner#480](https://github.com/phonegap/phonegap-plugin-barcodescanner/issues/480) -- [cordova-plugin-facebook4#507](https://github.com/jeduan/cordova-plugin-facebook4/issues/507) -- [cordova-plugin-local-notifications#1322](https://github.com/katzer/cordova-plugin-local-notifications/issues/1322) -- [cordova-diagnostic-plugin#211](https://github.com/dpa99c/cordova-diagnostic-plugin/issues/211) - -To resolve these version collisions, this plugin injects a Gradle configuration file into the native Android platform project, which overrides any versions specified by other plugins, and forces them to the version specified in its Gradle file. - -If you're encountering similar problems with the Play Services and/or Firebase libraries, checkout the sister plugins: -- [cordova-android-play-services-gradle-release](https://github.com/dpa99c/cordova-android-play-services-gradle-release) -- [cordova-android-firebase-gradle-release](https://github.com/dpa99c/cordova-android-firebase-gradle-release) - - - -# Installation - - $ cordova plugin add cordova-android-support-gradle-release - $ cordova plugin add cordova-android-support-gradle-release --variable ANDROID_SUPPORT_VERSION={required version} - -The plugin needs to be installed with the [`cordova-fetch`](https://cordova.apache.org/news/2016/05/24/tools-release.html) mechanism in order to satisfy its [package dependencies](https://github.com/dpa99c/cordova-android-support-gradle-release/blob/master/package.json#L8) by installing it via npm. - -If you're installing with `cordova@6`, you'll need to explicitly specify the `--fetch` option, and `--save` option if you want to specify a non-default version: - - $ cordova plugin add cordova-android-support-gradle-release --fetch - $ cordova plugin add cordova-android-support-gradle-release --fetch --save --variable ANDROID_SUPPORT_VERSION={required version} - -# Library versions - -## Default version -By default, this plugin will use the major version of the most recent release of the support libraries - [see here](https://developer.android.com/topic/libraries/support-library/revisions.html) for a list recent versions. "Most recent release" means the highest major version that will not result in an Alpha or Beta version being included. - - $ cordova plugin add cordova-android-support-gradle-release - -For example, if the most recent versions are: -- `26.0.0 Beta 2` -- `25.4.0` - -Then this plugin will default to `25.+` because `26` is still in Beta. - -## Other versions - -In some cases, you may want to specify a different version of the support libraries. For example, [Telerik ImagePicker plugin v2.1.7](https://github.com/Telerik-Verified-Plugins/ImagePicker/tree/2.1.7) specifies `v23` because it contains code that is incompatible with `v24+`. - -In this case, including the default version of this plugin will still result in a build error. So this plugin enables you to specify other versions of the support library using the `ANDROID_SUPPORT_VERSION` plugin variable. - -In the above case, you'd want to install v23 of the support library. To so, you'd specify the version via the variable: - - cordova plugin add cordova-android-support-gradle-release --variable ANDROID_SUPPORT_VERSION=23.+ - -# Example cases - -## Example 1 - -Uses v25 of the support libraries to fix the build issue. - -1. `cordova create test1 && cd test1/` -2. `cordova platform add android@latest` -3. `cordova plugin add cordova-plugin-facebook4@1.9.1 --save --variable APP_ID="123456789" --variable APP_NAME="myApplication"` -4. `cordova compile` - -Observe the build succeeds and in the console output is `v25.3.1` of Android Support Library: - - :prepareComAndroidSupportSupportV42531Library - -5. `cordova plugin add de.appplant.cordova.plugin.local-notification@0.8.5` -6. `cordova compile` - -Observe the build failed and in the console output is higher than `v25.3.1` (e.g `v26.0.0-alpha1`) of Android Support Library: - - :prepareComAndroidSupportSupportV42600Alpha1Library - -7. `cordova plugin add cordova-android-support-gradle-release --variable ANDROID_SUPPORT_VERSION=25.+` -8. `cordova prepare && cordova compile` - -Observe the build succeeds and in the console output is `v25` of Android Support Library. - -## Example 2 - -Uses v23 of the support libraries to fix the build issue, because v2.1.7 of the ImagePicker only works with v23. - -1. `cordova create test2 && cd test2/` -2. `cordova platform add android@latest` -3. `cordova plugin add https://github.com/Telerik-Verified-Plugins/ImagePicker.git#2.1.7` -4. `cordova compile` - -Observe the build succeeds and in the console output is `v23.4.0` of Android Support Library: - - :prepareComAndroidSupportSupportV42340Library - -5. `cordova plugin add cordova.plugins.diagnostic@3.6.5` - -Observe the build failed and in the console output is higher than `v23.4.0` (e.g `v26.0.0-alpha1`) of Android Support Library: - - :prepareComAndroidSupportSupportV42600Alpha1Library - -7. `cordova plugin add cordova-android-support-gradle-release` -8. `cordova compile` - -Observe the build still failed and in the console output is still higher than `v23.4.0` (e.g `v25.3.1`) of Android Support Library: - - :prepareComAndroidSupportSupportV42531Library - -9. `cordova plugin rm cordova-android-support-gradle-release` -10. `cordova plugin add cordova-android-support-gradle-release --variable ANDROID_SUPPORT_VERSION=23.+` -11. `cordova prepare && cordova compile` - -Observe the build succeeds and in the console output is v23 of Android Support Library. - - -# Credits - -Thanks to [**Chris Scott, Transistor Software**](https://github.com/christocracy) for his idea of extending the initial implementation to support dynamic specification of the library version via a plugin variable in [cordova-google-api-version](https://github.com/transistorsoft/cordova-google-api-version) - -License -================ - -The MIT License - -Copyright (c) 2017 Dave Alden / Working Edge Ltd. - -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. \ No newline at end of file diff --git a/Samples/Cordova/ExampleProject/plugins/cordova-android-support-gradle-release/cordova-android-support-gradle-release.gradle b/Samples/Cordova/ExampleProject/plugins/cordova-android-support-gradle-release/cordova-android-support-gradle-release.gradle deleted file mode 100644 index f551b028..00000000 --- a/Samples/Cordova/ExampleProject/plugins/cordova-android-support-gradle-release/cordova-android-support-gradle-release.gradle +++ /dev/null @@ -1,29 +0,0 @@ -repositories{ - // Google APIs are now hosted at Maven - maven { - url 'https://maven.google.com' - } -} - -def ANDROID_SUPPORT_VERSION = "27.+" -def PLUGIN_NAME = "cordova-android-support-gradle-release" - -// List of libs to search for. -def LIBS = [ - 'com.android.support' -] - -def IGNORED = [ - 'multidex', - 'multidex-instrumentation' -] - -println("+-----------------------------------------------------------------"); -println("| " + PLUGIN_NAME + ": " + ANDROID_SUPPORT_VERSION); -println("+-----------------------------------------------------------------"); - -configurations.all { - resolutionStrategy.eachDependency { DependencyResolveDetails details -> - if (details.requested.group in LIBS && !(details.requested.name in IGNORED)) { details.useVersion ANDROID_SUPPORT_VERSION } - } -} diff --git a/Samples/Cordova/ExampleProject/plugins/cordova-android-support-gradle-release/package.json b/Samples/Cordova/ExampleProject/plugins/cordova-android-support-gradle-release/package.json deleted file mode 100644 index 85aa12ec..00000000 --- a/Samples/Cordova/ExampleProject/plugins/cordova-android-support-gradle-release/package.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "name": "cordova-android-support-gradle-release", - "version": "3.0.1", - "description": "Cordova/Phonegap plugin to align various versions of the Android Support libraries specified by other plugins to a specific version", - "author": "Dave Alden", - "license": "MIT", - "dependencies": { - "q": "^1.4.1", - "semver": "5.6.0" - }, - "devDependencies": {} -} diff --git a/Samples/Cordova/ExampleProject/plugins/cordova-android-support-gradle-release/plugin.xml b/Samples/Cordova/ExampleProject/plugins/cordova-android-support-gradle-release/plugin.xml deleted file mode 100644 index ab6bf31b..00000000 --- a/Samples/Cordova/ExampleProject/plugins/cordova-android-support-gradle-release/plugin.xml +++ /dev/null @@ -1,27 +0,0 @@ - - - - cordova-android-support-gradle-release - Cordova/Phonegap plugin to align various versions of the Android Support libraries specified by other plugins to a specific version - Dave Alden - - - - - - - - - - - - - - - - - - diff --git a/Samples/Cordova/ExampleProject/plugins/cordova-android-support-gradle-release/scripts/apply-changes.js b/Samples/Cordova/ExampleProject/plugins/cordova-android-support-gradle-release/scripts/apply-changes.js deleted file mode 100644 index 8e339260..00000000 --- a/Samples/Cordova/ExampleProject/plugins/cordova-android-support-gradle-release/scripts/apply-changes.js +++ /dev/null @@ -1,99 +0,0 @@ -var PLUGIN_NAME = "cordova-android-support-gradle-release"; -var PLUGIN_VAR = "ANDROID_SUPPORT_VERSION"; -var PACKAGE_PATTERN = /(compile|implementation|api|annotationProcessor)( "com.android.support:[^:]+:)([^"]+)"/g; -var PLUGIN_GRADLE_FOLDER_PATH = "platforms/android/"+PLUGIN_NAME; -var VERSION_PATTERN = new RegExp('def '+PLUGIN_VAR+' = "[^"]+"'); -var VERSION_TEMPLATE = "def "+PLUGIN_VAR+" = \"\""; - -var V6 = "V6"; -var V7 = "V7+"; - -var FILE_PATHS = {}; -FILE_PATHS[V6] = { - "build.gradle": "platforms/android/build.gradle" -}; -FILE_PATHS[V7] = { - "build.gradle": "platforms/android/app/build.gradle" -}; - -var deferral, fs, path, semver, - platformVersion; - -function log(message) { - console.log(PLUGIN_NAME + ": " + message); -} - -function onError(error) { - log("ERROR: " + error); - deferral.resolve(); -} - -function getCordovaAndroidVersion(){ - var cordovaVersion = require(path.resolve(process.cwd(),'platforms/android/cordova/version')).version; - if (semver.satisfies(cordovaVersion, "6.x", { includePrerelease: true })){ - return V6; - } - return V7; -} - -function run() { - try { - fs = require('fs'); - path = require('path'); - semver = require('semver'); - } catch (e) { - throw("Failed to load dependencies. If using cordova@6 CLI, ensure this plugin is installed with the --fetch option: " + e.toString()); - } - - platformVersion = getCordovaAndroidVersion(); - log("Android platform: " + platformVersion); - - var customVersion; - try{ - var packageJSON = JSON.parse(fs.readFileSync('./package.json')); - customVersion = packageJSON.cordova.plugins[PLUGIN_NAME][PLUGIN_VAR]; - }catch(e){ - log("No custom version found in package.json - using plugin default"); - } - - - // build.gradle - if (customVersion) { - var buildGradlePath = path.resolve(process.cwd(), FILE_PATHS[platformVersion]["build.gradle"]); - var contents = fs.readFileSync(buildGradlePath).toString(); - fs.writeFileSync(buildGradlePath, contents.replace(PACKAGE_PATTERN, "$1 $2" + customVersion + '"'), 'utf8'); - log("Wrote custom version '" + customVersion + "' to " + buildGradlePath); - - // plugin gradle - var pluginGradleFolderPath = path.resolve(process.cwd(), PLUGIN_GRADLE_FOLDER_PATH); - var pluginGradleFileName = fs.readdirSync(pluginGradleFolderPath)[0]; - var pluginGradleFilePath = path.resolve(pluginGradleFolderPath, pluginGradleFileName); - var pluginGradleFileContents = fs.readFileSync(pluginGradleFilePath).toString(); - pluginGradleFileContents = pluginGradleFileContents.replace(VERSION_PATTERN, VERSION_TEMPLATE.replace(//, customVersion)); - fs.writeFileSync(pluginGradleFilePath, pluginGradleFileContents, 'utf8'); - log("Wrote custom version '" + customVersion + "' to " + pluginGradleFilePath); - } - deferral.resolve(); -} - -function attempt(fn) { - return function () { - try { - fn.apply(this, arguments); - } catch (e) { - onError("EXCEPTION: " + e.toString()); - } - } -} - -module.exports = function (ctx) { - try{ - deferral = require('q').defer(); - }catch(e){ - e.message = 'Unable to load node module dependency \'q\': '+e.message; - log(e.message); - throw e; - } - attempt(run)(); - return deferral.promise; -}; diff --git a/Samples/Cordova/ExampleProject/plugins/fetch.json b/Samples/Cordova/ExampleProject/plugins/fetch.json deleted file mode 100644 index 0531935c..00000000 --- a/Samples/Cordova/ExampleProject/plugins/fetch.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "clevertap-cordova": { - "source": { - "type": "registry", - "id": "https://github.com/CleverTap/clevertap-cordova#feat/release/2.6.0/SDK-2467" - }, - "is_top_level": true, - "variables": { - "CLEVERTAP_ACCOUNT_ID": "TEST-R78-ZZK-955Z", - "CLEVERTAP_TOKEN": "TEST-311-ba2" - } - }, - "cordova-android-support-gradle-release": { - "source": { - "type": "registry", - "id": "cordova-android-support-gradle-release@^3.0.1" - }, - "is_top_level": true, - "variables": { - "ANDROID_SUPPORT_VERSION": "27.+" - } - } -} \ No newline at end of file diff --git a/Samples/Cordova/ExampleProject/plugins/ios.json b/Samples/Cordova/ExampleProject/plugins/ios.json deleted file mode 100644 index a327f00a..00000000 --- a/Samples/Cordova/ExampleProject/plugins/ios.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "prepare_queue": { - "installed": [], - "uninstalled": [] - }, - "config_munge": { - "files": {} - }, - "installed_plugins": { - "clevertap-cordova": { - "CLEVERTAP_ACCOUNT_ID": "TEST-R78-ZZK-955Z", - "CLEVERTAP_TOKEN": "TEST-311-ba2", - "CLEVERTAP_REGION": " ", - "PACKAGE_NAME": "com.clevertap.example" - }, - "cordova-android-support-gradle-release": { - "PACKAGE_NAME": "com.clevertap.example" - } - }, - "dependent_plugins": {} -} diff --git a/Samples/Cordova/ExampleProject/www/js/index.js b/Samples/Cordova/ExampleProject/www/js/index.js index dad450f1..b06d674e 100644 --- a/Samples/Cordova/ExampleProject/www/js/index.js +++ b/Samples/Cordova/ExampleProject/www/js/index.js @@ -16,7 +16,70 @@ function log(param){ } function setupButtons() { + let variables = { + 'cordova_var_string': 'cordova_var_string_value', + 'cordova_var_map': { + cordova_var_map_string: 'cordova_var_map_value', + cordova_var_map_float: 10.11, + cordova_var_map_nested:{ + cordova_var_map_nested_float:3.14 + } + }, + 'cordova_var_int': 6, + 'cordova_var_float': 6.9, + 'cordova_var_boolean': true + }; + + let eventsMap = [ + + ["title","Android 13 Push Primer"], + ["promptPushPrimer",()=> CleverTap.promptPushPrimer({ + inAppType: 'alert', + titleText: 'Get Notified', + messageText: + 'Please enable notifications on your device to use Push Notifications.', + followDeviceOrientation: true, + positiveBtnText: 'Allow', + negativeBtnText: 'Cancel', + backgroundColor: '#FFFFFF', + btnBorderColor: '#FF0000', + titleTextColor: '#0000FF', + messageTextColor: '#000000', + btnTextColor: '#FFFFFF', + btnBackgroundColor: '#0000FF', + btnBorderRadius: '5', + imageUrl:"https://icons.iconarchive.com/icons/treetog/junior/64/camera-icon.png", + fallbackToSettings: true + }) + ], + ["promptForPushPermission",()=> CleverTap.promptForPushPermission(true)], + ["isPushPermissionGranted",()=> CleverTap.isPushPermissionGranted(val => log("isPushPermissionGranted value is " + val))], + + ["title","Product Experiences"], + ["defineVariables", () => CleverTap.defineVariables(variables)], + ["syncVariables", () => CleverTap.syncVariables()], + ["syncVariablesinProd", () => CleverTap.syncVariablesinProd()], + ["fetchVariables", () => CleverTap.fetchVariables(success => log("fetchVariables success = " + success))], + ["getVariable", () => { + let key = prompt("Please enter key", "cordova_var_string"); + CleverTap.getVariable(key,val => log(key+" value is "+JSON.stringify(val))); + } + ], + ["getVariables", () => { + CleverTap.getVariables(val => log("getVariables value is "+val.cordova_var_map.cordova_var_map_nested.cordova_var_map_nested_float)); + } + ], + ["onVariablesChanged", () => { + CleverTap.onVariablesChanged(val => log("onVariablesChanged value is "+JSON.stringify(val))); + } + ], + ["onValueChanged", () => { + let key = prompt("Please enter key", "cordova_var_string"); + CleverTap.onValueChanged(key,val => log("onValueChanged value is "+JSON.stringify(val))); + } + ], + ["title","Events"], ["record Event With Name", () => CleverTap.recordEventWithName("foo")], ["record Event With NameAndProps", () => CleverTap.recordEventWithNameAndProps("boo", {"bar": "zoo"})], @@ -283,8 +346,10 @@ function initListeners() { CleverTap.deleteInboxMessageForId("messageId") CleverTap.deleteInboxMessagesForIds(["id1", "id2"]) CleverTap.markReadInboxMessageForId("messageId") + CleverTap.markReadInboxMessagesForIds(["id1", "id2"]) CleverTap.pushInboxNotificationViewedEventForId("messageId") CleverTap.pushInboxNotificationClickedEventForId("messageId") + CleverTap.dismissInbox() } ) document.addEventListener('onCleverTapInboxMessagesDidUpdate', () => { @@ -299,7 +364,7 @@ function initListeners() { ) document.addEventListener('onCleverTapInboxItemClick', e => { log("onCleverTapInboxItemClick") - log(e.customExtras) + log(JSON.stringify(e)) } ) @@ -331,6 +396,15 @@ function initListeners() { log(e.customExtras) } ) + document.addEventListener('onCleverTapPushPermissionResponseReceived', e => { + log("onCleverTapPushPermissionResponseReceived") + log(e.accepted) + }) + + document.addEventListener('onCleverTapInAppNotificationShow', e => { + log("onCleverTapInAppNotificationShow") + log(e.customExtras) + }) } @@ -358,4 +432,4 @@ document.addEventListener( false ) //TEST-R78-ZZK-955Z TEST-311-ba2 -// following tag combination gives a very clean log stream under logcat(make sure to check regex) : chromium|CleverTap \ No newline at end of file +// following tag combination gives a very clean log stream under logcat(make sure to check regex) : chromium|CleverTap diff --git a/docs/Usage.md b/docs/Usage.md index 7afe8c31..3df717a8 100644 --- a/docs/Usage.md +++ b/docs/Usage.md @@ -22,6 +22,8 @@ All calls to the CleverTap SDK should be made from your Javascript. ```javascript +document.addEventListener('onCleverTapPushPermissionResponse', this.onCleverTapPushPermissionResponse,false); +document.addEventListener('onCleverTapInAppNotificationShow', this.onCleverTapInAppNotificationShow,false);// Only for Android, NO-OP for iOS document.addEventListener('deviceready', this.onDeviceReady, false); document.addEventListener('onCleverTapProfileSync', this.onCleverTapProfileSync, false); // optional: to be notified of CleverTap user profile synchronization updates document.addEventListener('onCleverTapProfileDidInitialize', this.onCleverTapProfileDidInitialize, false); // optional, to be notified when the CleverTap user profile is initialized @@ -40,6 +42,16 @@ document.addEventListener('onCleverTapProductConfigDidActivate', this.onCleverTa document.addEventListener('onCleverTapExperimentsUpdated', this.onCleverTapExperimentsUpdated, false); // optional, to check if Dynamic Variable Experiments were updated document.addEventListener('onCleverTapDisplayUnitsLoaded', this.onCleverTapDisplayUnitsLoaded, false); // optional, to check if Native Display units were loaded +// Push Permission +onCleverTapPushPermissionResponse: function(e) { + console.log(e.accepted) +}, + +// on inapp displayed, Only for Android, NO-OP for iOS +onCleverTapInAppNotificationShow: function(e) { + log("onCleverTapInAppNotificationShow") + log(e.customExtras) +}, // deep link handling onDeepLink: function(e) { @@ -237,7 +249,7 @@ console.log('getInboxMessageForId: ' + r); this.clevertap.deleteInboxMessageForId('message_ID_1234'); ``` -#### Delete bulk messages with Ids - Only for iOS, NO-OP for Android. +#### Delete bulk messages with Ids - Only for iOS, NO-OP for Android [*v2.7.0* onwards Android adds support for this method]. ```javascript this.clevertap.deleteInboxMessagesForIds(['message_ID_1234','message_ID_xyz']); @@ -249,6 +261,18 @@ this.clevertap.deleteInboxMessagesForIds(['message_ID_1234','message_ID_xyz']); this.clevertap.markReadInboxMessageForId('message_ID_1234'); ``` +#### Mark bulk Inbox messages with Ids as Read + +```javascript +this.clevertap.markReadInboxMessagesForIds(['message_ID_1234','message_ID_xyz']); +``` + +#### Dismiss the App Inbox + +```javascript +this.clevertap.dismissInbox(); +``` + #### pushInbox Notification Viewed Event For Id ```javascript diff --git a/docs/Variables.md b/docs/Variables.md new file mode 100644 index 00000000..d2ad6197 --- /dev/null +++ b/docs/Variables.md @@ -0,0 +1,119 @@ +# Overview +You can define variables using the CleverTap Corova SDK. When you define a variable in your code, you can sync them to the CleverTap Dashboard via the provided SDK methods. + +# Supported Variable Types + +Currently, CleverTap SDK supports the following variable types: + +- String +- boolean +- JSON Object +- number + +# Define Variables + +Variables can be defined using the `defineVariables` method. You must provide the names and default values of the variables using a JSON Object. + +```javascript +let variables = { + 'cordova_var_string': 'cordova_var_string_value', + 'cordova_var_map': { + 'cordova_var_map_string': 'cordova_var_map_value' + }, + 'cordova_var_int': 6, + 'cordova_var_float': 6.9, + 'cordova_var_boolean': true + }; +this.clevertap.defineVariables(variables); +``` + +# Setup Callbacks + +CleverTap cordova SDK provides several callbacks for the developer to receive feedback from the SDK. You can use them as per your requirement, using all of them is not mandatory. They are as follows: + +## Status of Variables Fetch Request + +This method provides a boolean flag to ensure that the variables are successfully fetched from the server. + +```javascript +this.clevertap.fetchVariables(success => log("fetchVariables success = " + success)) +``` + +## `onVariablesChanged` + +This callback is invoked when variables are initialized with values fetched from the server. It is called each time new values are fetched. + +```javascript +this.clevertap.onVariablesChanged(val => log("onVariablesChanged value is "+JSON.stringify(val))); +``` + +## `onValueChanged` + +This callback is invoked when the value of the variable changes. You must provide the name of the variable whose value needs to be observed. + +```javascript + this.clevertap.onValueChanged(key,val => log("Changed value is "+JSON.stringify(val))); +``` + +# Sync Defined Variables + +After defining your variables in the code, you must send/sync variables to the server. To do so, the app must be in DEBUG mode and mark a particular CleverTap user profile as a test profile from the CleverTap dashboard. [Learn how to mark a profile as **Test Profile**](https://developer.clevertap.com/docs/concepts-user-profiles#mark-a-user-profile-as-a-test-profile) + +After marking the profile as a test profile, you must sync the app variables in DEBUG mode: + +```javascript + +// 1. Define CleverTap variables +// … +// 2. Add variables/values changed callbacks +// … + +// 3. Sync CleverTap Variables from DEBUG mode/builds +this.clevertap.syncVariables(); +``` + +> 📘 Key Points to Remember +> +> - In a scenario where there is already a draft created by another user profile in the dashboard, the sync call will fail to avoid overriding important changes made by someone else. In this case, Publish or Dismiss the existing draft before you proceed with syncing variables again. However, you can override a draft you created via the sync method previously to optimize the integration experience. +> - You can receive the following console logs from the CleverTap SDK: +> - Variables synced successfully. +> - Unauthorized access from a non-test profile. Please mark this profile as a test profile from the CleverTap dashboard. + +# Fetch Variables During a Session + +You can fetch the updated values for your CleverTap variables from the server during a session. If variables have changed, the appropriate callbacks will be fired. The provided callback provides a boolean flag that indicates if the fetch call was successful. The callback is fired regardless of whether the variables have changed or not. + +```javascript +this.clevertap.fetchVariables(success => log("fetchVariables success = " + success)) +``` + +# Use Fetched Variables Values + +This process involves the following two major steps: + +1. Fetch variable values. +2. Access variable values. + +## Fetch Variable Values + +Variables are updated automatically when server values are received. If you want to receive feedback when a specific variable is updated, use the individual callback: + +```javascript + this.clevertap.onValueChanged(key,val => log("Changed value is "+JSON.stringify(val))); +``` + +## Access Variable Values + +You can access these fetched values in the following two ways: + +### Getting all variables + +```javascript +this.clevertap.getVariables(val => log("getVariables value is "+JSON.stringify(val))) +``` + +### Getting a specific variable + +```javascript +this.clevertap.getVariable('cordova_var_string', val => log("cordova_var_string value is "+JSON.stringify(val)); +``` \ No newline at end of file diff --git a/docs/pushprimer.md b/docs/pushprimer.md new file mode 100644 index 00000000..27051b09 --- /dev/null +++ b/docs/pushprimer.md @@ -0,0 +1,88 @@ +## 🔖 Overview + +Push Primer allows you to enable runtime push permission for sending notifications from an app. + +Starting with the v4.7.0 release, CleverTap Cordova supports Push primer for push notification runtime permission through local in-app. + +For Push Primer, minimum supported version for iOS platform is 10.0 while android 13 for the android platform. + +### Push Primer using Half-Interstitial local In-app +```javascript +let localInApp = { + inAppType: 'half-interstitial', + titleText: 'Get Notified', + messageText: + 'Please enable notifications on your device to use Push Notifications.', + followDeviceOrientation: true, + positiveBtnText: 'Allow', + negativeBtnText: 'Cancel', + backgroundColor: '#FFFFFF', + btnBorderColor: '#0000FF', + titleTextColor: '#0000FF', + messageTextColor: '#000000', + btnTextColor: '#FFFFFF', + btnBackgroundColor: '#0000FF', + btnBorderRadius: '2', + fallbackToSettings: true, + }; + +this.clevertap.promptPushPrimer(localInApp); +``` + +### Push Primer using Alert local In-app +```javascript +this.clevertap.promptPushPrimer({ + inAppType: 'alert', + titleText: 'Get Notified', + messageText: 'Enable Notification permission', + followDeviceOrientation: true, + positiveBtnText: 'Allow', + negativeBtnText: 'Cancel', + fallbackToSettings: true, + }); +``` + +### Prompt the Notification Permission Dialog (without push primer) +It takes boolean as a parameter. If the value passed is true and permission is denied then we fallback to app’s notification settings. If false then we just give the callback saying permission is denied. + +```javascript +this.clevertap.promptForPushPermission(true); +``` + +### Get the Push notification permission status +Returns the status of the push permission in the callback handler. + +```javascript +this.clevertap.isPushPermissionGranted(val => log("isPushPermissionGranted by user " + val)); +``` + +### Description of the localInApp Object passed inside the PromptPushPrimer(localInApp) method + +Key Name| Parameters | Description | Required +:---:|:---:|:---:|:--- +`inAppType` | "half-interstitial" or "alert" | Accepts only half-interstitial & alert type to display the local in-app | Required +`titleText` | String | Sets the title of the local in-app | Required +`messageText` | String | Sets the subtitle of the local in-app | Required +`followDeviceOrientation` | true or false | If true then the local InApp is shown for both portrait and landscape. If it sets false then local InApp only displays for portrait mode | Required +`positiveBtnText` | String | Sets the text of the positive button | Required +`negativeBtnText` | String | Sets the text of the negative button | Required +`fallbackToSettings` | true or false | If true and the permission is denied then we fallback to app’s notification settings, if it’s false then we just give the callback saying permission is denied. | Optional +`backgroundColor` | Accepts Hex color as String | Sets the background color of the local in-app | Optional +`btnBorderColor` | Accepts Hex color as String | Sets the border color of both positive/negative buttons | Optional +`titleTextColor` | Accepts Hex color as String | Sets the title color of the local in-app | Optional +`messageTextColor` | Accepts Hex color as String | Sets the sub-title color of the local in-app | Optional +`btnTextColor` | Accepts Hex color as String | Sets the color of text for both positive/negative buttons | Optional +`btnBackgroundColor` | Accepts Hex color as String | Sets the background color for both positive/negative buttons | Optional +`btnBorderRadius` | String | Sets the radius for both positive/negative buttons. Default radius is “2” if not set | Optional +`fallbackToSettings` | true or false | If the value passed is true then we fallback to app’s notification settings in case permission is denied. If false then we just give the callback saying permission is denied. | Optional + + +### Available Callbacks for Push Primer +Based on notification permission grant/deny, CleverTap Cordova SDK provides a callback with the permission status. +For this You can register the onCleverTapPushPermissionResponseReceived callback: +```javascript +document.addEventListener('onCleverTapPushPermissionResponseReceived', e => { + log("onCleverTapPushPermissionResponseReceived") + log(e.accepted) // grant or deny flag + }) +``` \ No newline at end of file diff --git a/package.json b/package.json index c2a5ec38..57bc2c68 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "clevertap-cordova", - "version": "2.6.2", + "version": "2.7.0", "description": "CleverTap Plugin for Cordova/PhoneGap", "cordova": { "id": "clevertap-cordova", @@ -20,8 +20,8 @@ "cordova-android" ], "engines": { - "cordovaDependencies": { - "2.3.2": { + "cordovaDependencies": { + "2.3.2": { "cordova-ios": ">=4.3.0", "cordova-android": ">6.3.0", "cordova": ">=7.0.0" @@ -30,6 +30,11 @@ "cordova-ios": ">=4.3.0", "cordova-android": ">=11.0.0", "cordova": ">=11.0.0" + }, + "2.7.0": { + "cordova-ios": ">=4.3.0", + "cordova-android": ">=12.0.0", + "cordova": ">=12.0.0" } } }, diff --git a/plugin.xml b/plugin.xml index 02d9e3c8..80926c79 100644 --- a/plugin.xml +++ b/plugin.xml @@ -1,5 +1,5 @@ - + CleverTap CleverTap Plugin for Cordova/PhoneGap Commercial @@ -40,7 +40,16 @@
- + + + + + + + + + + @@ -49,7 +58,7 @@ - + @@ -95,10 +104,10 @@ - + - - + + diff --git a/src/android/CleverTapPlugin.java b/src/android/CleverTapPlugin.java index 8b9fe852..023fd40f 100644 --- a/src/android/CleverTapPlugin.java +++ b/src/android/CleverTapPlugin.java @@ -16,15 +16,27 @@ import android.util.Log; import android.location.Location; +import androidx.annotation.NonNull; +import com.clevertap.android.sdk.PushPermissionResponseListener; +import com.clevertap.android.sdk.inapp.CTInAppNotification; +import com.clevertap.android.sdk.inapp.CTLocalInApp; import com.clevertap.android.sdk.pushnotification.CTPushNotificationListener; import com.clevertap.android.sdk.pushnotification.amp.CTPushAmpListener; +import com.clevertap.android.sdk.variables.CTVariableUtils; +import com.clevertap.android.sdk.variables.Var; +import com.clevertap.android.sdk.variables.callbacks.VariableCallback; +import com.clevertap.android.sdk.variables.callbacks.VariablesChangedCallback; +import java.util.Objects; import java.util.Set; +import java.util.regex.Matcher; +import java.util.regex.Pattern; import org.apache.cordova.CordovaInterface; import org.apache.cordova.CordovaWebView; import org.apache.cordova.CordovaPlugin; import org.apache.cordova.CallbackContext; import org.apache.cordova.PluginResult; +import org.apache.cordova.PluginResult.Status; import org.json.JSONArray; import org.json.JSONException; import org.json.JSONObject; @@ -62,12 +74,14 @@ public class CleverTapPlugin extends CordovaPlugin implements SyncListener, InAppNotificationListener, CTInboxListener, InboxMessageButtonListener, InAppNotificationButtonListener, DisplayUnitListener, - CTFeatureFlagsListener, CTProductConfigListener, CTPushNotificationListener, CTPushAmpListener, InboxMessageListener { + CTFeatureFlagsListener, CTProductConfigListener, CTPushNotificationListener, CTPushAmpListener, InboxMessageListener, + PushPermissionResponseListener { private static final String LOG_TAG = "CLEVERTAP_PLUGIN"; private static String CLEVERTAP_API_ERROR; private static CleverTapAPI cleverTap; private boolean callbackDone = false; + public static Map variables = new HashMap<>(); @Override @@ -86,6 +100,7 @@ public void initialize(CordovaInterface cordova, CordovaWebView webView) { cleverTap.setCTProductConfigListener(this); cleverTap.setCTPushNotificationListener(this); cleverTap.setCTPushAmpListener(this); + cleverTap.registerPushPermissionNotificationResponseListener(this); cleverTap.setLibrary("Cordova"); try { @@ -111,6 +126,10 @@ public void onNewIntent(Intent intent) { if (intent.getAction() != null && intent.getAction().equals(Intent.ACTION_VIEW)) { Uri data = intent.getData(); if (data != null) { + if(!isDeepLinkValid(data)){ + Log.w(LOG_TAG, "Found malicious deep link. Not processing further."); + return; + } final String json = "{'deeplink':'" + data.toString() + "'}"; cordova.getActivity().runOnUiThread(new Runnable() { @@ -1372,14 +1391,6 @@ public void run() { } }); return true; - } else if (action.equals("deleteInboxMessagesForIds")) {// NO-OP for Android - - PluginResult _result = new PluginResult(PluginResult.Status.NO_RESULT); - _result.setKeepCallback(true); - callbackContext.sendPluginResult(_result); - - return true; - } else if (action.equals("markReadInboxMessageForId")) { final String messageId = (args.length() == 1 ? args.getString(0) : ""); @@ -1392,6 +1403,65 @@ public void run() { } }); return true; + } else if (action.equals("markReadInboxMessagesForIds")) { + JSONArray jsonArray = null; + if (args.length() == 1) { + jsonArray = args.getJSONArray(0); + } else { + haveError = true; + errorMsg = "Expected 1 argument"; + } + if (!haveError) { + final JSONArray finalJsonArray = jsonArray; + cordova.getThreadPool().execute(() -> { + try { + cleverTap.markReadInboxMessagesForIDs((ArrayList) toStringList(finalJsonArray)); + + PluginResult _result = new PluginResult(Status.NO_RESULT); + _result.setKeepCallback(true); + callbackContext.sendPluginResult(_result); + } catch (Exception e) { + PluginResult _result = new PluginResult(Status.ERROR, e.getLocalizedMessage()); + _result.setKeepCallback(true); + callbackContext.sendPluginResult(_result); + } + }); + return true; + } + } else if (action.equals("deleteInboxMessagesForIds")) { + JSONArray jsonArray = null; + if (args.length() == 1) { + jsonArray = args.getJSONArray(0); + } else { + haveError = true; + errorMsg = "Expected 1 argument"; + } + if (!haveError) { + final JSONArray finalJsonArray = jsonArray; + cordova.getThreadPool().execute(() -> { + try { + cleverTap.deleteInboxMessagesForIDs((ArrayList) toStringList(finalJsonArray)); + + PluginResult _result = new PluginResult(Status.NO_RESULT); + _result.setKeepCallback(true); + callbackContext.sendPluginResult(_result); + } catch (Exception e) { + PluginResult _result = new PluginResult(Status.ERROR, e.getLocalizedMessage()); + _result.setKeepCallback(true); + callbackContext.sendPluginResult(_result); + } + }); + return true; + } + } else if (action.equals("dismissInbox")) { + cordova.getThreadPool().execute(new Runnable() { + public void run() { + cleverTap.dismissAppInbox(); + PluginResult _result = new PluginResult(PluginResult.Status.NO_RESULT); + _result.setKeepCallback(true); + callbackContext.sendPluginResult(_result); + } + }); } else if (action.equals("pushInboxNotificationViewedEventForId")) { final String messageId = (args.length() == 1 ? args.getString(0) : ""); @@ -1672,6 +1742,232 @@ public void run() { } }); return true; + } else if (action.equals("promptPushPrimer")) { + JSONObject pushPrimerJsonObject = null; + if (args.length() == 1) { + if (!args.isNull(0)) { + try { + pushPrimerJsonObject = processPushPrimerArgument(args.getJSONObject(0)); + if (pushPrimerJsonObject == null) + { + haveError = true; + errorMsg = "Invalid parameters in push primer config"; + } + } catch (Exception e) { + haveError = true; + errorMsg = e.getLocalizedMessage(); + } + } else { + haveError = true; + errorMsg = "object passed to promptPushPrimer can not be null!"; + } + } else { + haveError = true; + errorMsg = "Expected 1 argument"; + } + + if (!haveError) { + final JSONObject finalPushPrimerJsonObject = pushPrimerJsonObject; + cordova.getThreadPool().execute(new Runnable() { + public void run() { + cleverTap.promptPushPrimer(finalPushPrimerJsonObject); + PluginResult _result = new PluginResult(PluginResult.Status.NO_RESULT); + _result.setKeepCallback(true); + callbackContext.sendPluginResult(_result); + } + }); + return true; + } + } else if (action.equals("promptForPushPermission")) { + boolean showFallbackSettings = false; + + if (args.length() == 1) { + showFallbackSettings = args.getBoolean(0); + } else { + haveError = true; + errorMsg = "Expected 1 argument"; + } + if (!haveError) { + final boolean finalShowFallbackSettings = showFallbackSettings; + cordova.getThreadPool().execute(new Runnable() { + public void run() { + cleverTap.promptForPushPermission(finalShowFallbackSettings); + PluginResult _result = new PluginResult(PluginResult.Status.NO_RESULT); + _result.setKeepCallback(true); + callbackContext.sendPluginResult(_result); + } + }); + return true; + } + } else if (action.equals("isPushPermissionGranted")) { + cordova.getThreadPool().execute(new Runnable() { + public void run() { + boolean value = cleverTap.isPushPermissionGranted(); + PluginResult _result = new PluginResult(PluginResult.Status.OK, value); + _result.setKeepCallback(true); + callbackContext.sendPluginResult(_result); + } + }); + return true; + } else if (action.equals("setLibrary")) { + String libName = args.getString(0); + int libVersion = args.getInt(1); + cordova.getThreadPool().execute(new Runnable() { + public void run() { + cleverTap.setCustomSdkVersion(libName,libVersion); + PluginResult _result = new PluginResult(PluginResult.Status.NO_RESULT); + _result.setKeepCallback(true); + callbackContext.sendPluginResult(_result); + } + }); + return true; + } else if (action.equals("syncVariables")) { + cordova.getThreadPool().execute(new Runnable() { + public void run() { + cleverTap.syncVariables(); + PluginResult _result = new PluginResult(PluginResult.Status.NO_RESULT); + _result.setKeepCallback(true); + callbackContext.sendPluginResult(_result); + } + }); + return true; + } else if (action.equals("syncVariablesinProd")) { + cordova.getThreadPool().execute(new Runnable() { + public void run() { + Log.d(LOG_TAG, "syncVariablesinProd is no-op in Android"); + PluginResult _result = new PluginResult(PluginResult.Status.NO_RESULT); + _result.setKeepCallback(true); + callbackContext.sendPluginResult(_result); + } + }); + return true; + } else if (action.equals("fetchVariables")) { + cordova.getThreadPool().execute(() -> { + cleverTap.fetchVariables(isSuccess -> { + PluginResult _result = new PluginResult(PluginResult.Status.OK, isSuccess); + _result.setKeepCallback(true); + callbackContext.sendPluginResult(_result); + }); + + }); + return true; + } else if (action.equals("defineVariables")) { + Map variablesMap = null; + if (args.length() == 1) { + if (!args.isNull(0)) { + try { + variablesMap = toMap(args.getJSONObject(0)); + } catch (Exception e) { + haveError = true; + errorMsg = e.getLocalizedMessage(); + } + } else { + haveError = true; + errorMsg = "object passed to defineVariables can not be null!"; + } + } else { + haveError = true; + errorMsg = "Expected 1 argument"; + } + + if (!haveError) { + final Map finalVariablesJsonObject = variablesMap; + cordova.getThreadPool().execute(() -> { + for (Map.Entry entry : finalVariablesJsonObject.entrySet()) { + String key = entry.getKey(); + Object value = entry.getValue(); + variables.put(key, cleverTap.defineVariable(key, value)); + } + PluginResult _result = new PluginResult(PluginResult.Status.NO_RESULT); + _result.setKeepCallback(true); + callbackContext.sendPluginResult(_result); + }); + return true; + } + } else if (action.equals("getVariable")) { + String variableName = null; + + if (args.length() == 1) { + variableName = args.getString(0); + } else { + haveError = true; + errorMsg = "Expected 1 argument"; + } + + if (!haveError) { + final String finalVariableName = variableName; + cordova.getThreadPool().execute(() -> { + try { + Object value = getVariableValue(finalVariableName); + PluginResult _result = getPluginResult(Status.OK, value); + _result.setKeepCallback(true); + callbackContext.sendPluginResult(_result); + } catch (Exception e) { + PluginResult _result = new PluginResult(Status.ERROR, e.getLocalizedMessage()); + _result.setKeepCallback(true); + callbackContext.sendPluginResult(_result); + } + }); + return true; + } + } else if (action.equals("getVariables")) { + cordova.getThreadPool().execute(() -> { + JSONObject jsonVariables = getVariablesAsJson(); + PluginResult _result = new PluginResult(PluginResult.Status.OK, jsonVariables); + _result.setKeepCallback(true); + callbackContext.sendPluginResult(_result); + }); + return true; + } else if (action.equals("onVariablesChanged")) { + cordova.getThreadPool().execute(() -> { + cleverTap.addVariablesChangedCallback(new VariablesChangedCallback() { + @Override + public void variablesChanged() { + JSONObject jsonVariables = getVariablesAsJson(); + PluginResult _result = new PluginResult(PluginResult.Status.OK,jsonVariables); + _result.setKeepCallback(true); + callbackContext.sendPluginResult(_result); + } + }); + }); + return true; + } else if (action.equals("onValueChanged")) { + + String variableName = null; + + if (args.length() == 1) { + variableName = args.getString(0); + } else { + haveError = true; + errorMsg = "Expected 1 argument"; + } + + if (!haveError) { + final String finalVariableName = variableName; + cordova.getThreadPool().execute(() -> { + try { + if (variables.containsKey(finalVariableName)) { + Var variable = (Var) variables.get(finalVariableName); + variable.addValueChangedCallback(new VariableCallback() { + @Override + public void onValueChanged(final Var variable) { + Object value = getVariableValue(finalVariableName); + PluginResult _result = getPluginResult(Status.OK, value); + _result.setKeepCallback(true); + callbackContext.sendPluginResult(_result); + + } + }); + } + } catch (Exception e) { + PluginResult _result = new PluginResult(Status.ERROR, e.getLocalizedMessage()); + _result.setKeepCallback(true); + callbackContext.sendPluginResult(_result); + } + }); + return true; + } + } result = new PluginResult(PluginResult.Status.ERROR, errorMsg); @@ -1680,6 +1976,43 @@ public void run() { return true; } + @NonNull + private JSONObject getVariablesAsJson() { + JSONObject jsonVariables = new JSONObject(); + for (String key : variables.keySet()) { + try { + jsonVariables.put(key,getVariableValue(key)); + } catch (Exception e) { + e.printStackTrace(); + } + } + return jsonVariables; + } + + @NonNull + private PluginResult getPluginResult(final Status ok, final Object value) { + PluginResult _result; + if (value instanceof Boolean) { + _result = new PluginResult(ok, (Boolean) value); + } else if (value instanceof Double) { + _result = new PluginResult(ok, ((Double) value).floatValue()); + } else if (value instanceof Float) { + _result = new PluginResult(ok, (Float) value); + } else if (value instanceof Integer) { + _result = new PluginResult(ok, (Integer) value); + } else if (value instanceof Long) { + _result = new PluginResult(ok, ((Long) value).intValue()); + } else if (value instanceof String) { + _result = new PluginResult(ok, (String) value); + } else if (value instanceof JSONObject) { + _result = new PluginResult(ok, (JSONObject) value); + } else { + _result = new PluginResult(PluginResult.Status.ERROR, "unknown value type"); + } + + return _result; + } + //DisplayUnitListener public void onDisplayUnitsLoaded(ArrayList units) { @@ -1745,6 +2078,16 @@ public void run() { }); } + @Override + public void onPushPermissionResponse(final boolean accepted) { + final String json = "{'accepted':" + accepted + "}"; + webView.getView().post(new Runnable() { + public void run() { + webView.loadUrl("javascript:cordova.fireDocumentEvent('onCleverTapPushPermissionResponseReceived'," + json + ");"); + } + }); + } + // SyncListener public void profileDataUpdated(JSONObject updates) { @@ -1788,13 +2131,34 @@ public void run() { }); } - public void onInboxItemClicked(CTInboxMessage message){ + @Override + public void onShow(CTInAppNotification inAppNotification) { + if(inAppNotification != null && inAppNotification.getJsonDescription() != null){ + //Read the values + final String json = "{'customExtras':" + inAppNotification.getJsonDescription().toString() + "}"; + webView.getView().post(new Runnable() { + public void run() { + webView.loadUrl("javascript:cordova.fireDocumentEvent('onCleverTapInAppNotificationShow'," + json + ");"); + } + }); + } + } + + public void onInboxItemClicked(CTInboxMessage message, int contentPageIndex, int buttonIndex){ if(message != null && message.getData() != null){ //Read the values - final String json = "{'customExtras':" + message.getData().toString() + "}"; + JSONObject jsonObject = new JSONObject(); + try { + jsonObject.put("data",message.getData()); + jsonObject.put("contentPageIndex",contentPageIndex); + jsonObject.put("buttonIndex",buttonIndex); + } catch (JSONException e) { + Log.e(LOG_TAG,"Failed to parse inbox message."); + } + webView.getView().post(new Runnable() { public void run() { - webView.loadUrl("javascript:cordova.fireDocumentEvent('onCleverTapInboxItemClick'," + json + ");"); + webView.loadUrl("javascript:cordova.fireDocumentEvent('onCleverTapInboxItemClick'," + jsonObject + ");"); } }); } @@ -2059,16 +2423,20 @@ private static HashMap toStringMap(JSONObject object) throws JSO return map; } - private JSONObject getJsonFromMap(Map map) throws JSONException { - JSONObject jsonData = new JSONObject(); - for (String key : map.keySet()) { - Object value = map.get(key); - if (value instanceof Map) { - value = getJsonFromMap((Map) value); + private Object getVariableValue(String name) { + if (variables.containsKey(name)) { + Var variable = (Var) variables.get(name); + Object variableValue = variable.value(); + Object value; + if (CTVariableUtils.DICTIONARY.equals(variable.kind())) { + value = new JSONObject((Map) variableValue); + } else { + value = variableValue; } - jsonData.put(key, value); + return value; } - return jsonData; + throw new IllegalArgumentException( + "Variable name = " + name + " does not exist. Make sure you set variable first."); } private JSONArray displayUnitListToJSONArray(ArrayList displayUnits) throws JSONException { @@ -2135,4 +2503,157 @@ private JSONObject toJson(Bundle bundle) { } return json; } + + private boolean isDeepLinkValid(Uri data) { + String link = Uri.decode(data.toString()); + String patternString = "[{}\\[\\]()\"';]|javascript"; + Pattern pattern = Pattern.compile(patternString); + Matcher matcher = pattern.matcher(link); + return !matcher.find(); + } + + private JSONObject processPushPrimerArgument(JSONObject jsonObject) { + CTLocalInApp.InAppType inAppType = null; + String titleText = null, messageText = null, positiveBtnText = null, negativeBtnText = null, + backgroundColor = null, btnBorderColor = null, titleTextColor = null, messageTextColor = null, + btnTextColor = null, imageUrl = null, btnBackgroundColor = null, btnBorderRadius = null; + boolean fallbackToSettings = false, followDeviceOrientation = false; + + final Iterator iterator = jsonObject.keys(); + while (iterator.hasNext()) { + try { + final String configKey = iterator.next(); + switch (configKey) { + case "inAppType": + inAppType = inAppTypeFromString(jsonObject.getString(configKey)); + break; + case "titleText": + titleText = jsonObject.getString(configKey); + break; + case "messageText": + messageText = jsonObject.getString(configKey); + break; + case "followDeviceOrientation": + followDeviceOrientation = jsonObject.getBoolean(configKey); + break; + case "positiveBtnText": + positiveBtnText = jsonObject.getString(configKey); + break; + case "negativeBtnText": + negativeBtnText = jsonObject.getString(configKey); + break; + case "fallbackToSettings": + fallbackToSettings = jsonObject.getBoolean(configKey); + break; + case "backgroundColor": + backgroundColor = jsonObject.getString(configKey); + break; + case "btnBorderColor": + btnBorderColor = jsonObject.getString(configKey); + break; + case "titleTextColor": + titleTextColor = jsonObject.getString(configKey); + break; + case "messageTextColor": + messageTextColor = jsonObject.getString(configKey); + break; + case "btnTextColor": + btnTextColor = jsonObject.getString(configKey); + break; + case "imageUrl": + imageUrl = jsonObject.getString(configKey); + break; + case "btnBackgroundColor": + btnBackgroundColor = jsonObject.getString(configKey); + break; + case "btnBorderRadius": + btnBorderRadius = jsonObject.getString(configKey); + break; + } + } catch (Throwable t) { + Log.e(LOG_TAG, "invalid parameters in push primer config" + t.getLocalizedMessage()); + return null; + } + } + + //creates the builder instance of localInApp with all the required parameters + CTLocalInApp.Builder.Builder6 builderWithRequiredParams = getLocalInAppBuilderWithRequiredParam( + inAppType, titleText, messageText, followDeviceOrientation, positiveBtnText, negativeBtnText + ); + + //adds the optional parameters to the builder instance + if (backgroundColor != null) { + builderWithRequiredParams.setBackgroundColor(backgroundColor); + } + if (btnBorderColor != null) { + builderWithRequiredParams.setBtnBorderColor(btnBorderColor); + } + if (titleTextColor != null) { + builderWithRequiredParams.setTitleTextColor(titleTextColor); + } + if (messageTextColor != null) { + builderWithRequiredParams.setMessageTextColor(messageTextColor); + } + if (btnTextColor != null) { + builderWithRequiredParams.setBtnTextColor(btnTextColor); + } + if (imageUrl != null) { + builderWithRequiredParams.setImageUrl(imageUrl); + } + if (btnBackgroundColor != null) { + builderWithRequiredParams.setBtnBackgroundColor(btnBackgroundColor); + } + if (btnBorderRadius != null) { + builderWithRequiredParams.setBtnBorderRadius(btnBorderRadius); + } + builderWithRequiredParams.setFallbackToSettings(fallbackToSettings); + + JSONObject localInAppConfig = builderWithRequiredParams.build(); + Log.i(LOG_TAG, "LocalInAppConfig for push primer prompt: " + localInAppConfig); + return localInAppConfig; + + + } + + /** + * Creates an instance of the {@link CTLocalInApp.Builder.Builder6} with the required parameters. + * + * @return the {@link CTLocalInApp.Builder.Builder6} instance + */ + private CTLocalInApp.Builder.Builder6 getLocalInAppBuilderWithRequiredParam(CTLocalInApp.InAppType inAppType, + String titleText, + String messageText, + boolean followDeviceOrientation, + String positiveBtnText, + String negativeBtnText) { + //throws exception if any of the required parameter is missing + if (inAppType == null || titleText == null || messageText == null || positiveBtnText == null + || negativeBtnText == null) { + throw new IllegalArgumentException("mandatory parameters are missing in push primer config"); + } + + CTLocalInApp.Builder builder = CTLocalInApp.builder(); + + return builder.setInAppType(inAppType) + .setTitleText(titleText) + .setMessageText(messageText) + .followDeviceOrientation(followDeviceOrientation) + .setPositiveBtnText(positiveBtnText) + .setNegativeBtnText(negativeBtnText); + } + + //returns InAppType type from the given string + private CTLocalInApp.InAppType inAppTypeFromString(String inAppType) { + if (inAppType == null) { + return null; + } + switch (inAppType) { + case "half-interstitial": + return CTLocalInApp.InAppType.HALF_INTERSTITIAL; + case "alert": + return CTLocalInApp.InAppType.ALERT; + default: + return null; + } + } } \ No newline at end of file diff --git a/src/ios/CleverTapPlugin.h b/src/ios/CleverTapPlugin.h index c59d2d78..2cf1c17f 100644 --- a/src/ios/CleverTapPlugin.h +++ b/src/ios/CleverTapPlugin.h @@ -372,6 +372,16 @@ static NSString * const CTHandleOpenURLNotification = @"CTHandleOpenURLNotificat */ - (void)markReadInboxMessageForId:(CDVInvokedUrlCommand *)command; +/** + This method Mark bulk messages as Read for Given Message Ids + */ +- (void)markReadInboxMessagesForIds:(CDVInvokedUrlCommand *)command; + +/** + Dismisses Appinbox + */ +- (void)dismissInbox:(CDVInvokedUrlCommand *)command; + /** This method Marks Inbox Notification Viewed for Given Message Id */ @@ -448,6 +458,51 @@ static NSString * const CTHandleOpenURLNotification = @"CTHandleOpenURLNotificat */ - (void)getLastFetchTimeStampInMillis: (CDVInvokedUrlCommand *)command; +# pragma mark - Product experiences + +/** + Uploads variables to the server. Requires Development/Debug build/configuration. +*/ +- (void)syncVariables: (CDVInvokedUrlCommand *)command; + +/** +Uploads variables to the server. +@param {boolean} isProduction Provide `true` if variables must be sync in Productuon build/configuration. +*/ +- (void)syncVariablesinProd: (CDVInvokedUrlCommand *)command; + +/** +Forces variables to update from the server. +*/ +- (void)fetchVariables:(CDVInvokedUrlCommand *)command; + +/** +Create variables. +@param {object} variables The JSON Object specifying the varibles to be created. +*/ +- (void)defineVariables: (CDVInvokedUrlCommand *)command; + +/** +Get a variable or a group for the specified name. +@param {string} name - name. +*/ +- (void)getVariable:(CDVInvokedUrlCommand *)command; + +/** +Get all variables via a JSON object. +*/ +- (void)getVariables:(CDVInvokedUrlCommand *)command; + + /** +Adds a callback to be invoked when variables are initialised with server values. Will be called each time new values are fetched. +*/ +- (void)onVariablesChanged:(CDVInvokedUrlCommand *)command; + +/** +Called when the value of the variable changes. +*/ +- (void)onValueChanged:(CDVInvokedUrlCommand *)command; + /** This method fetches String Value for a given key */ @@ -473,5 +528,7 @@ static NSString * const CTHandleOpenURLNotification = @"CTHandleOpenURLNotificat */ - (void)reset; +- (void)setLibrary: (CDVInvokedUrlCommand *)command; + @end diff --git a/src/ios/CleverTapPlugin.m b/src/ios/CleverTapPlugin.m index 7b2b3538..5d56169c 100644 --- a/src/ios/CleverTapPlugin.m +++ b/src/ios/CleverTapPlugin.m @@ -25,13 +25,20 @@ #import "CleverTapPushNotificationDelegate.h" #import "CleverTapInAppNotificationDelegate.h" #import "CleverTap+InAppNotifications.h" +#import "CleverTap+CTVar.h" +#import "CTVar.h" +#import "CTLocalInApp.h" +#import "Clevertap+PushPermission.h" -#import +#if __has_include() +#import +#endif static CleverTap *clevertap; static NSURL *launchDeepLink; static NSDictionary *launchNotification; static NSDateFormatter *dateFormatter; +static NSMutableDictionary *allVariables; @interface CleverTapPlugin () { } @@ -666,7 +673,8 @@ - (void)getEventHistory:(CDVInvokedUrlCommand *)command { - (void)getLocation:(CDVInvokedUrlCommand *)command { - [CleverTap getLocationWithSuccess:^(CLLocationCoordinate2D loc){ +#if __has_include() + [CTLocationManager getLocationWithSuccess:^(CLLocationCoordinate2D loc){ CDVPluginResult *pluginResult = [CDVPluginResult resultWithStatus:CDVCommandStatus_OK messageAsDictionary:@{@"lat":@(loc.latitude), @"lon":@(loc.longitude)}]; [self.commandDelegate sendPluginResult:pluginResult callbackId:command.callbackId]; @@ -674,6 +682,12 @@ - (void)getLocation:(CDVInvokedUrlCommand *)command { CDVPluginResult *pluginResult = [CDVPluginResult resultWithStatus:CDVCommandStatus_ERROR messageAsString:error]; [self.commandDelegate sendPluginResult:pluginResult callbackId:command.callbackId]; }]; +#else + NSString *error = @"Please install the pod CleverTapLocation or intregrate the CleverTapLocation project manually to use the getLocation method. For more details, please refer to the link: https://github.com/CleverTap/clevertap-ios-sdk/blob/location-api/docs/CleverTapLocation.md"; + NSLog(@"%@", error); + CDVPluginResult *pluginResult = [CDVPluginResult resultWithStatus:CDVCommandStatus_ERROR messageAsString:error]; + [self.commandDelegate sendPluginResult:pluginResult callbackId:command.callbackId]; +#endif } - (void)setLocation:(CDVInvokedUrlCommand *)command { @@ -1101,6 +1115,24 @@ - (void)markReadInboxMessageForId:(CDVInvokedUrlCommand *)command { }]; } +/** + Mark Messages as Read in bulk + */ +- (void)markReadInboxMessagesForIds:(CDVInvokedUrlCommand *)command { + + [self.commandDelegate runInBackground:^{ + NSString *messageIds = [command argumentAtIndex:0]; + [clevertap markReadInboxMessagesForIDs: messageIds]; + }]; +} + +/** + Dismisses Appinbox + */ +- (void)dismissInbox:(CDVInvokedUrlCommand *)command { + [clevertap dismissAppInbox]; +} + /** Record Inbox Notification Viewed for MessageID */ @@ -1140,17 +1172,23 @@ - (void)messageButtonTappedWithCustomExtras:(NSDictionary *_Nullable)customExtra } } -- (void)messageDidSelect:(CleverTapInboxMessage *_Nonnull)message{ +- (void)messageDidSelect:(CleverTapInboxMessage *_Nonnull)message atIndex:(int)index withButtonIndex:(int)buttonIndex{ - NSString *jsonString = [self _dictToJson:message.json]; + NSMutableDictionary *jsonObject = [NSMutableDictionary new]; + if ([message json] != nil) { + jsonObject[@"data"] = [NSMutableDictionary dictionaryWithDictionary:[message json]]; + } else { + jsonObject[@"data"] = [NSMutableDictionary new]; + } + jsonObject[@"contentPageIndex"] = @(index); + jsonObject[@"buttonIndex"] = @(buttonIndex); - if (jsonString != nil) { - NSString *js = [NSString stringWithFormat:@"cordova.fireDocumentEvent('onCleverTapInboxItemClick', %@);", jsonString]; + if (jsonObject != nil) { + NSString *js = [NSString stringWithFormat:@"cordova.fireDocumentEvent('onCleverTapInboxItemClick', %@);", jsonObject]; [self.commandDelegate evalJs:js]; } } - #pragma mark - Native Display /** @@ -1348,6 +1386,13 @@ - (void)reset { }]; } +- (void)setLibrary: (CDVInvokedUrlCommand *)command { + NSString *libName = [command argumentAtIndex:0]; + int libVersion = [[command argumentAtIndex:1]intValue]; + [clevertap setLibrary:libName]; + [clevertap setCustomSdkVersion:libName version:libVersion]; +} + #pragma mark Product Config Delegate @@ -1369,6 +1414,262 @@ - (void)ctProductConfigInitialized { [self.commandDelegate evalJs:js]; } +#pragma mark Product Experience + +- (void)syncVariables: (CDVInvokedUrlCommand *)command { + + [self.commandDelegate runInBackground:^{ + [clevertap syncVariables]; + }]; +} + +- (void)syncVariablesinProd: (CDVInvokedUrlCommand *)command { + + [self.commandDelegate runInBackground:^{ + BOOL isProduction = [[command argumentAtIndex:0] boolValue]; + [clevertap syncVariables:isProduction]; + }]; +} + +- (void)fetchVariables:(CDVInvokedUrlCommand *)command { + + [self.commandDelegate runInBackground:^{ + [clevertap fetchVariables:^(BOOL success){ + CDVPluginResult *pluginResult = [CDVPluginResult resultWithStatus:CDVCommandStatus_OK messageAsBool:(BOOL)success]; + [self.commandDelegate sendPluginResult:pluginResult callbackId:command.callbackId]; + }]; + }]; +} + +- (void)defineVariables: (CDVInvokedUrlCommand *)command { + + [self.commandDelegate runInBackground:^{ + NSDictionary *variables = [command argumentAtIndex:0]; + if (!allVariables){ + allVariables = [NSMutableDictionary new]; + } + + if(variables == nil){ + return; + } + [variables enumerateKeysAndObjectsUsingBlock:^(NSString* _Nonnull key, id _Nonnull value, BOOL * _Nonnull stop) { + CTVar *var = [self createVarForName:key andValue:value]; + + if (var) { + allVariables[key] = var; + } + }]; + }]; +} + +- (void)getVariable:(CDVInvokedUrlCommand *)command { + + [self.commandDelegate runInBackground:^{ + NSString *name = [command argumentAtIndex:0]; + CTVar *var = allVariables[name]; + + CDVPluginResult *pluginResult = [CDVPluginResult resultWithStatus:CDVCommandStatus_OK messageAsString:var.value]; + [self.commandDelegate sendPluginResult:pluginResult callbackId:command.callbackId]; + }]; +} + +- (void)getVariables:(CDVInvokedUrlCommand *)command { + + [self.commandDelegate runInBackground:^{ + NSMutableDictionary *varValues = [self getVariableValues]; + + CDVPluginResult *pluginResult = [CDVPluginResult resultWithStatus:CDVCommandStatus_OK messageAsDictionary:varValues]; + [self.commandDelegate sendPluginResult:pluginResult callbackId:command.callbackId]; + }]; +} + +- (void)onVariablesChanged:(CDVInvokedUrlCommand *)command { + + [self.commandDelegate runInBackground:^{ + [clevertap onVariablesChanged:^{ + NSMutableDictionary *varValues = [self getVariableValues]; + CDVPluginResult *pluginResult = [CDVPluginResult resultWithStatus:CDVCommandStatus_OK messageAsDictionary:varValues]; + [self.commandDelegate sendPluginResult:pluginResult callbackId:command.callbackId]; + }]; + }]; +} + +- (void)onValueChanged:(CDVInvokedUrlCommand *)command { + + [self.commandDelegate runInBackground:^{ + NSString *name = [command argumentAtIndex:0]; + CTVar *var = allVariables[name]; + if (var) { + [var onValueChanged:^{ + CDVPluginResult *pluginResult = [CDVPluginResult resultWithStatus:CDVCommandStatus_OK messageAsString:var.value]; + [self.commandDelegate sendPluginResult:pluginResult callbackId:command.callbackId]; + }]; + } + }]; +} + +#pragma mark Push primer + +- (CTLocalInApp*)_localInAppConfigFromReadableMap: (NSDictionary *)json { + CTLocalInApp *inAppBuilder; + CTLocalInAppType inAppType = HALF_INTERSTITIAL; + //Required parameters + NSString *titleText = nil, *messageText = nil, *followDeviceOrientation = nil, *positiveBtnText = nil, *negativeBtnText = nil; + //Additional parameters + NSString *fallbackToSettings = nil, *backgroundColor = nil, *btnBorderColor = nil, *titleTextColor = nil, *messageTextColor = nil, *btnTextColor = nil, *imageUrl = nil, *btnBackgroundColor = nil, *btnBorderRadius = nil; + + if ([json[@"inAppType"] isEqual: @"half-interstitial"]){ + inAppType = HALF_INTERSTITIAL; + } + else { + inAppType = ALERT; + } + if (json[@"titleText"]) { + titleText = [json valueForKey:@"titleText"]; + } + if (json[@"messageText"]) { + messageText = [json valueForKey:@"messageText"]; + } + if (json[@"followDeviceOrientation"]) { + followDeviceOrientation = [json valueForKey:@"followDeviceOrientation"]; + } + if (json[@"positiveBtnText"]) { + positiveBtnText = [json valueForKey:@"positiveBtnText"]; + } + + if (json[@"negativeBtnText"]) { + negativeBtnText = [json valueForKey:@"negativeBtnText"]; + } + + //creates the builder instance with all the required parameters + inAppBuilder = [[CTLocalInApp alloc] initWithInAppType:inAppType + titleText:titleText + messageText:messageText + followDeviceOrientation:followDeviceOrientation + positiveBtnText:positiveBtnText + negativeBtnText:negativeBtnText]; + + //adds optional parameters to the builder instance + if (json[@"fallbackToSettings"]) { + fallbackToSettings = [json valueForKey:@"fallbackToSettings"]; + [inAppBuilder setFallbackToSettings:fallbackToSettings]; + } + if (json[@"backgroundColor"]) { + backgroundColor = [json valueForKey:@"backgroundColor"]; + [inAppBuilder setBackgroundColor:backgroundColor]; + } + if (json[@"btnBorderColor"]) { + btnBorderColor = [json valueForKey:@"btnBorderColor"]; + [inAppBuilder setBtnBorderColor:btnBorderColor]; + } + if (json[@"titleTextColor"]) { + titleTextColor = [json valueForKey:@"titleTextColor"]; + [inAppBuilder setTitleTextColor:titleTextColor]; + } + if (json[@"messageTextColor"]) { + messageTextColor = [json valueForKey:@"messageTextColor"]; + [inAppBuilder setMessageTextColor:messageTextColor]; + } + if (json[@"btnTextColor"]) { + btnTextColor = [json valueForKey:@"btnTextColor"]; + [inAppBuilder setBtnTextColor:btnTextColor]; + } + if (json[@"imageUrl"]) { + imageUrl = [json valueForKey:@"imageUrl"]; + [inAppBuilder setImageUrl:imageUrl]; + } + if (json[@"btnBackgroundColor"]) { + btnBackgroundColor = [json valueForKey:@"btnBackgroundColor"]; + [inAppBuilder setBtnBackgroundColor:btnBackgroundColor]; + } + if (json[@"btnBorderRadius"]) { + btnBorderRadius = [json valueForKey:@"btnBorderRadius"]; + [inAppBuilder setBtnBorderRadius:btnBorderRadius]; + } + return inAppBuilder; +} + +- (void)promptForPushPermission: (CDVInvokedUrlCommand *)command { + + [self.commandDelegate runInBackground:^{ + BOOL showFallbackSettings = [[command argumentAtIndex:0] boolValue]; + [clevertap promptForPushPermission:showFallbackSettings]; + }]; +} + +- (void)promptPushPrimer: (CDVInvokedUrlCommand *)command { + + [self.commandDelegate runInBackground:^{ + NSDictionary *json = [command argumentAtIndex:0]; + if(json == nil){ + return; + } + CTLocalInApp *localInAppBuilder = [self _localInAppConfigFromReadableMap:json]; + [clevertap promptPushPrimer:localInAppBuilder.getLocalInAppSettings]; + }]; +} + +- (void)isPushPermissionGranted:(CDVInvokedUrlCommand *)command { + + [self.commandDelegate runInBackground:^{ + if (@available(iOS 10.0, *)) { + [clevertap getNotificationPermissionStatusWithCompletionHandler:^(UNAuthorizationStatus status) { + BOOL result = (status == UNAuthorizationStatusAuthorized); + NSLog(@"[CleverTap isPushPermissionGranted: %i]", result); + CDVPluginResult *pluginResult = [CDVPluginResult resultWithStatus:CDVCommandStatus_OK messageAsBool:result]; + [self.commandDelegate sendPluginResult:pluginResult callbackId:command.callbackId]; + }]; + } else { + // Fallback on earlier versions + NSLog(@"Push Notification is available from iOS v10.0 or later"); + } + }]; +} + +#pragma mark - CleverTapPushPermissionDelegate + +- (void)onPushPermissionResponse:(BOOL)accepted { + + NSMutableDictionary *json = [NSMutableDictionary new]; + json[@"accepted"] = [NSNumber numberWithBool:accepted]; + + NSString *js = [NSString stringWithFormat:@"cordova.fireDocumentEvent('onCleverTapPushPermissionResponseReceived', %@);", json]; + [self.commandDelegate evalJs:js]; +} + +#pragma mark Helper methods + +- (CTVar *)createVarForName:(NSString *)name andValue:(id)value { + + if ([value isKindOfClass:[NSString class]]) { + return [clevertap defineVar:name withString:value]; + } + if ([value isKindOfClass:[NSDictionary class]]) { + return [clevertap defineVar:name withDictionary:value]; + } + if ([value isKindOfClass:[NSNumber class]]) { + if ([self isBoolNumber:value]) { + return [clevertap defineVar:name withBool:value]; + } + return [clevertap defineVar:name withNumber:value]; + } + return nil; +} + +- (BOOL)isBoolNumber:(NSNumber *)number { + CFTypeID boolID = CFBooleanGetTypeID(); + CFTypeID numID = CFGetTypeID(CFBridgingRetain(number)); + return (numID == boolID); +} + +- (NSMutableDictionary *)getVariableValues { + NSMutableDictionary *varValues = [NSMutableDictionary dictionary]; + [allVariables enumerateKeysAndObjectsUsingBlock:^(id _Nonnull key, CTVar* _Nonnull var, BOOL * _Nonnull stop) { + varValues[key] = var.value; + }]; + return varValues; +} + - (CleverTapInboxStyleConfig*)_dictToInboxStyleConfig: (NSDictionary *)dict { CleverTapInboxStyleConfig *_config = [CleverTapInboxStyleConfig new]; diff --git a/www/CleverTap.js b/www/CleverTap.js index fb74b4f4..98e969a4 100644 --- a/www/CleverTap.js +++ b/www/CleverTap.js @@ -6,6 +6,9 @@ // var CleverTap = function () { + const libName = 'Cordova'; + const libVersion = 20603; + cordova.exec(null, null, "CleverTapPlugin", "setLibrary", [libName, libVersion]); } /******************* @@ -457,6 +460,14 @@ CleverTap.prototype.markReadInboxMessageForId = function (messageId) { cordova.exec(null, null, "CleverTapPlugin", "markReadInboxMessageForId", [messageId]); } +CleverTap.prototype.markReadInboxMessagesForIds = function (messageIds) { + cordova.exec(null, null, "CleverTapPlugin", "markReadInboxMessagesForIds", [messageIds]); +} + +CleverTap.prototype.dismissInbox= function () { + cordova.exec(null, null, "CleverTapPlugin", "dismissInbox", []); +} + CleverTap.prototype.pushInboxNotificationViewedEventForId = function (messageId) { cordova.exec(null, null, "CleverTapPlugin", "pushInboxNotificationViewedEventForId", [messageId]); } @@ -512,6 +523,9 @@ CleverTap.prototype.pushDisplayUnitClickedEventForID = function(unitId){ /**************************** * Feature Flag methods ****************************/ +/** + * @deprecated - Since version 2.7.0 and will be removed in the future versions of this SDK. + */ CleverTap.prototype.getFeatureFlag = function(name,defaultValue,successCallback){ cordova.exec(successCallback, null, "CleverTapPlugin", "getFeatureFlag", [name,defaultValue]); } @@ -519,54 +533,173 @@ CleverTap.prototype.getFeatureFlag = function(name,defaultValue,successCallback) /**************************** * Product Config methods ****************************/ +/** + * @deprecated - Since version 2.7.0 and will be removed in the future versions of this SDK. + */ CleverTap.prototype.setDefaultsMap = function(jsonMap){ cordova.exec(null, null, "CleverTapPlugin", "setDefaultsMap", [jsonMap]); } +/** + * @deprecated - Since version 2.7.0 and will be removed in the future versions of this SDK. + */ CleverTap.prototype.fetch = function(){ cordova.exec(null, null, "CleverTapPlugin", "fetch", []); } +/** + * @deprecated - Since version 2.7.0 and will be removed in the future versions of this SDK. + */ CleverTap.prototype.fetchWithMinimumFetchIntervalInSeconds = function(interval){ cordova.exec(null, null, "CleverTapPlugin", "fetchWithMinimumFetchIntervalInSeconds", [interval]); } +/** + * @deprecated - Since version 2.7.0 and will be removed in the future versions of this SDK. + */ CleverTap.prototype.activate = function(){ cordova.exec(null, null, "CleverTapPlugin", "activate", []); } +/** + * @deprecated - Since version 2.7.0 and will be removed in the future versions of this SDK. + */ CleverTap.prototype.fetchAndActivate = function(){ cordova.exec(null, null, "CleverTapPlugin", "fetchAndActivate", []); } +/** + * @deprecated - Since version 2.7.0 and will be removed in the future versions of this SDK. + */ CleverTap.prototype.setMinimumFetchIntervalInSeconds = function(interval){ cordova.exec(null, null, "CleverTapPlugin", "setMinimumFetchIntervalInSeconds", [interval]); } +/** + * @deprecated - Since version 2.7.0 and will be removed in the future versions of this SDK. + */ CleverTap.prototype.getLastFetchTimeStampInMillis = function(successCallback){ cordova.exec(successCallback, null, "CleverTapPlugin", "getLastFetchTimeStampInMillis", []); } +/** + * @deprecated - Since version 2.7.0 and will be removed in the future versions of this SDK. + */ CleverTap.prototype.getString = function(key,successCallback){ cordova.exec(successCallback, null, "CleverTapPlugin", "getString", [key]); } +/** + * @deprecated - Since version 2.7.0 and will be removed in the future versions of this SDK. + */ CleverTap.prototype.getBoolean = function(key,successCallback){ cordova.exec(successCallback, null, "CleverTapPlugin", "getBoolean", [key]); } +/** + * @deprecated - Since version 2.7.0 and will be removed in the future versions of this SDK. + */ CleverTap.prototype.getLong = function(key,successCallback){ cordova.exec(successCallback, null, "CleverTapPlugin", "getLong", [key]); } +/** + * @deprecated - Since version 2.7.0 and will be removed in the future versions of this SDK. + */ CleverTap.prototype.getDouble = function(key,successCallback){ cordova.exec(successCallback, null, "CleverTapPlugin", "getDouble", [key]); } +/** + * @deprecated - Since version 2.7.0 and will be removed in the future versions of this SDK. + */ CleverTap.prototype.reset = function(){ cordova.exec(null, null, "CleverTapPlugin", "reset", []); } + +/**************************** + * Product Experiences methods + ****************************/ + +/** + Uploads variables to the server. Requires Development/Debug build/configuration. +*/ +CleverTap.prototype.syncVariables = function(){ + cordova.exec(null, null, "CleverTapPlugin", "syncVariables", []); +} + +/** +Uploads variables to the server. +@param {boolean} isProduction Provide `true` if variables must be sync in Productuon build/configuration. +*/ +CleverTap.prototype.syncVariablesinProd = function(isProduction){ + cordova.exec(null, null, "CleverTapPlugin", "syncVariablesinProd", [isProduction]); +} + +/** +Forces variables to update from the server. +*/ +CleverTap.prototype.fetchVariables = function(successCallback){ + cordova.exec(successCallback, null, "CleverTapPlugin", "fetchVariables", []); +} + +/** +Create variables. +@param {object} variables The JSON Object specifying the varibles to be created. +*/ +CleverTap.prototype.defineVariables = function (variables) { + cordova.exec(null, null, "CleverTapPlugin", "defineVariables", [variables]); +} + +/** +Get a variable or a group for the specified name. +@param {string} name - name. +*/ +CleverTap.prototype.getVariable = function (name, successCallback) { + cordova.exec(successCallback, null, "CleverTapPlugin", "getVariable", [name]); +} + +/** +Get all variables via a JSON object. +*/ +CleverTap.prototype.getVariables = function (successCallback) { + cordova.exec(successCallback, null, "CleverTapPlugin", "getVariables", []); +} + + /** +Adds a callback to be invoked when variables are initialised with server values. Will be called each time new values are fetched. +@param {function} handler The callback to add +*/ +CleverTap.prototype.onVariablesChanged = function (handler) { + cordova.exec(handler, null, "CleverTapPlugin", "onVariablesChanged", []); +} + +/** +Called when the value of the variable changes. +@param {name} string the name of the variable +@param {function} handler The callback to add +*/ +CleverTap.prototype.onValueChanged = function (name, handler) { + cordova.exec(handler, null, "CleverTapPlugin", "onValueChanged", [name]); +} + +/**************************** + * Android 13 Push Primer + ****************************/ + +CleverTap.prototype.promptPushPrimer = function(localInAppObject){ + cordova.exec(null, null, "CleverTapPlugin", "promptPushPrimer", [localInAppObject]); +} + +CleverTap.prototype.promptForPushPermission = function(showFallbackSettings){ + cordova.exec(null, null, "CleverTapPlugin", "promptForPushPermission", [showFallbackSettings]); +} + +CleverTap.prototype.isPushPermissionGranted = function(successCallback){ + cordova.exec(successCallback, null, "CleverTapPlugin", "isPushPermissionGranted", []); +} + function convertDateToEpochInProperties(items){ //Conversion of date object in suitable CleverTap format