diff --git a/.jazzy.yaml b/.jazzy.yaml index dacce82ef9..dcf48cf314 100644 --- a/.jazzy.yaml +++ b/.jazzy.yaml @@ -2,7 +2,7 @@ clean: true author: RevenueCat author_url: https://revenuecat.com sdk: iphonesimulator -module_version: 4.18.0-SNAPSHOT +module_version: 4.19.0 github_url: https://github.com/revenuecat/purchases-ios github_file_prefix: https://github.com/revenuecat/purchases-ios/tree/4.18.0-SNAPSHOT output: generated_docs diff --git a/.version b/.version index 614324e56a..a69aa5a428 100644 --- a/.version +++ b/.version @@ -1 +1 @@ -4.18.0-SNAPSHOT +4.19.0 diff --git a/CHANGELOG.latest.md b/CHANGELOG.latest.md index 8c61c66f79..981d776422 100644 --- a/CHANGELOG.latest.md +++ b/CHANGELOG.latest.md @@ -1,24 +1,128 @@ ### New Features -* Introduced Custom Entitlements Computation mode (#2439) via Andy Boedo (@aboedo) * Create separate `SPM` library to enable custom entitlement computation (#2440) via NachoSoto (@NachoSoto) - -This new library allows apps to use a smaller version of the RevenueCat SDK, intended for apps that will do their own entitlement computation separate from RevenueCat. - -Apps using this mode rely on webhooks to signal their backends to refresh entitlements with RevenueCat. - -See the [demo app for an example and usage instructions](https://github.com/RevenueCat/purchases-ios/tree/main/Examples/testCustomEntitlementsComputation). - +* Custom Entitlements Computation mode (#2439) via Andy Boedo (@aboedo) +* Introduced `Configuration.EntitlementVerificationMode` and `VerificationResult` (#2277) via NachoSoto (@NachoSoto) +* `PurchasesDiagnostics`: added step to verify signature verification (#2267) via NachoSoto (@NachoSoto) +* `HTTPClient`: added signature validation and introduced `ErrorCode.signatureVerificationFailed` (#2272) via NachoSoto (@NachoSoto) ### Bugfixes * `PurchaseOrchestrator`: fix incorrect `InitiationSource` for SK1 queue transactions (#2430) via NachoSoto (@NachoSoto) - -### Other Changes +* `CustomerInfoManager`: fixed deadlock caused by reading `CustomerInfo` inside of observer (#2412) via NachoSoto (@NachoSoto) +* Fix deadlock when sending notification center in customerInfoListener (#2407) via Andy Boedo (@aboedo) +* `Xcode 14.3`: fixed compilation errors (#2399) via NachoSoto (@NachoSoto) +* `DispatchTimeInterval`: fixed Xcode 14.3 compilation (#2397) via NachoSoto (@NachoSoto) +* Temporarily disable entitlement mapping (#2386) via Andy Boedo (@aboedo) +* `DeviceCache`: workaround for potential deadlock (#2375) via NachoSoto (@NachoSoto) +* `Purchases.deinit`: don't reset `Purchases.proxyURL` (#2346) via NachoSoto (@NachoSoto) +* `ETagManager`: don't use ETags if response verification failed (#2347) via NachoSoto (@NachoSoto) +* `DispatchTimeInterval` & `Date`: avoid 32-bit overflows, fix `watchOS` crashes (#2342) via NachoSoto (@NachoSoto) +* Fix issue with missing subscriber attributes if set after login but before login callback (#2313) via Toni Rico (@tonidero) +* Fixed `Bundle: Sendable` conformance (#2301) via NachoSoto (@NachoSoto) +* Fixed `PurchasesOrchestrator` compilation error on Xcode 14.3 beta 1 (#2292) via NachoSoto (@NachoSoto) +### Performance Improvements * Update offerings cache when switchUser(to:) is called (#2455) via Andy Boedo (@aboedo) -* Updated example code for the sample app for Custom Entitlements (#2454) via Andy Boedo (@aboedo) -* Custom Entitlement Computation: API testers (#2452) via NachoSoto (@NachoSoto) * Custom Entitlement Computation: avoid `getCustomerInfo` requests for cancelled purchases (#2449) via NachoSoto (@NachoSoto) +* `PostReceiptDataOperation` / `GetCustomerInfoOperation`: only invoke response handlers once (#2377) via NachoSoto (@NachoSoto) +* `AppleReceipt.mostRecentActiveSubscription`: performance optimization (#2332) via NachoSoto (@NachoSoto) +### Dependency Updates +* Bump fastlane-plugin-revenuecat_internal from `3b03efa` to `fe45299` (#2459) via dependabot[bot] (@dependabot[bot]) +* Bump fastlane-plugin-revenuecat_internal from `8482a43` to `3b03efa` (#2413) via dependabot[bot] (@dependabot[bot]) +* Bump danger from 9.2.0 to 9.3.0 (#2433) via dependabot[bot] (@dependabot[bot]) +* Bump cocoapods from 1.12.0 to 1.12.1 (#2414) via dependabot[bot] (@dependabot[bot]) +* Bump fastlane from 2.212.1 to 2.212.2 (#2411) via dependabot[bot] (@dependabot[bot]) +* Bump fastlane-plugin-revenuecat_internal from `9255366` to `8482a43` (#2401) via dependabot[bot] (@dependabot[bot]) +* Bump activesupport from 7.0.4.2 to 7.0.4.3 (#2339) via dependabot[bot] (@dependabot[bot]) +* Bump cocoapods from 1.11.3 to 1.12.0 (#2317) via dependabot[bot] (@dependabot[bot]) +* Bump fastlane from 2.212.0 to 2.212.1 (#2314) via dependabot[bot] (@dependabot[bot]) +* Bump fastlane from 2.211.0 to 2.212.0 (#2298) via dependabot[bot] (@dependabot[bot]) +### Other Changes +* `Integration Tests`: removed `@preconcurrency import` (#2464) via NachoSoto (@NachoSoto) +* Clean up: moved `ReceiptParserTests-Info.plist` out of root (#2460) via NachoSoto (@NachoSoto) +* Update `CHANGELOG` (#2461) via NachoSoto (@NachoSoto) +* Custom Entitlement Computation: API testers (#2452) via NachoSoto (@NachoSoto) +* updated example code for the sample app for Custom Entitlements (#2454) via Andy Boedo (@aboedo) +* Update `SwiftSnapshotTesting` (#2453) via NachoSoto (@NachoSoto) +* Custom Entitlement Computation: re-enable `syncPurchases`/`restorePurchases` (#2451) via NachoSoto (@NachoSoto) * Custom Entitlement Computation: disabled unnecessary APIs (#2442) via NachoSoto (@NachoSoto) +* `customEntitlementsComputation`: update the copy in the sample app to explain the new usage (#2443) via Andy Boedo (@aboedo) +* Fixed docs (#2432) via Kaunteya Suryawanshi (@kaunteya) +* clarify reasoning for disfavoredOverload in logIn (#2434) via Andy Boedo (@aboedo) +* remove unnecessary line break (#2435) via Andy Boedo (@aboedo) +* `ProductEntitlementMapping`: enabled entitlement mapping fetching (#2425) via NachoSoto (@NachoSoto) +* `BackendPostReceiptDataTests`: increased timeout to fix flaky test (#2426) via NachoSoto (@NachoSoto) * `StoreKit1Wrapper`: added log when adding payment to queue (#2423) via NachoSoto (@NachoSoto) * `StoreKit1Wrapper`: added debug log when transaction is removed but no callbacks to notify (#2418) via NachoSoto (@NachoSoto) -* `customEntitlementsComputation`: update the copy in the sample app to explain the new usage (#2443) via Andy Boedo (@aboedo) -* Clarify reasoning for `disfavoredOverload` in logIn (#2434) via Andy Boedo (@aboedo) -* Documentation: improved `async` API docs (#2432) via Kaunteya Suryawanshi (@kaunteya) +* Updated requirements to drop Xcode 13.x support (#2419) via NachoSoto (@NachoSoto) +* `Integration Tests`: fixed flaky errors when loading offerings (#2420) via NachoSoto (@NachoSoto) +* `PurchaseTester`: fixed compilation for `internal` entitlement verification (#2417) via NachoSoto (@NachoSoto) +* `ETagManager`/`HTTPClient`: sending new `X-RC-Last-Refresh-Time` header (#2373) via NachoSoto (@NachoSoto) +* SwiftUI Sample Project: Refactor Package terms method to a computed property (#2405) via Joseph Kokenge (@JOyo246) +* clean up v3 load shedder integration tests (#2402) via Andy Boedo (@aboedo) +* `CircleCI`: use `Xcode 14.3.0` (#2398) via NachoSoto (@NachoSoto) +* Fix iOS 12 compilation (#2394) via NachoSoto (@NachoSoto) +* Added new `VerificationResult.verifiedOnDevice` (#2379) via NachoSoto (@NachoSoto) +* `SwiftLint`: fixed lint with new 0.51.0 version (#2395) via NachoSoto (@NachoSoto) +* `PurchaseTester`: fix memory leaks (#2392) via Keita Watanabe (@kitwtnb) +* Integration tests: add scheduled job (#2389) via Andy Boedo (@aboedo) +* Add lane for running iOS v3 load shedder integration tests (#2388) via Andy Boedo (@aboedo) +* iOS v3 load shedder integration tests (#2387) via Andy Boedo (@aboedo) +* `Offline Entitlements`: created `LoadShedderIntegrationTests` (#2362) via NachoSoto (@NachoSoto) +* Purchases.configure: log warning if attempting to use a static appUserID (#2385) via Mark Villacampa (@MarkVillacampa) +* `SubscriberAttributesManagerIntegrationTests`: fixed flaky failures (#2381) via NachoSoto (@NachoSoto) +* redirect to latest version of migration guide (#2384) via Andy Boedo (@aboedo) +* Fix migration guide link (#2383) via Andy Boedo (@aboedo) +* `@DefaultDecodable.Now`: fixed flaky test (#2374) via NachoSoto (@NachoSoto) +* `PurchaseTesterSwiftUI`: fixed iOS compilation (#2376) via NachoSoto (@NachoSoto) +* `SubscriberAttributesManagerIntegrationTests`: fixed potential race condition (#2380) via NachoSoto (@NachoSoto) +* `Offline Entitlements`: create `CustomerInfo` from offline entitlements (#2358) via NachoSoto (@NachoSoto) +* Added `@DefaultDecodable.Now` (#2372) via NachoSoto (@NachoSoto) +* `HTTPClient`: debug log when performing redirects (#2371) via NachoSoto (@NachoSoto) +* `HTTPClient`: new flag to force server errors (#2370) via NachoSoto (@NachoSoto) +* `OfferingsManager`: fixed Xcode 13.x build (#2369) via NachoSoto (@NachoSoto) +* `Offline Entitlements`: store `ProductEntitlementMapping` in cache (#2355) via NachoSoto (@NachoSoto) +* `Offline Entitlements`: added support for fetching `ProductEntitlementMappingResponse` in `OfflineEntitlementsAPI` (#2353) via NachoSoto (@NachoSoto) +* `Offline Entitlements`: created `ProductEntitlementMapping` (#2365) via NachoSoto (@NachoSoto) +* Implemented `NetworkError.isServerDown` (#2367) via NachoSoto (@NachoSoto) +* `ETagManager`: added test for 304 responses with no etag (#2360) via NachoSoto (@NachoSoto) +* `TestLogHandler`: increased default capacity (#2357) via NachoSoto (@NachoSoto) +* `OfferingsManager`: moved log to common method to remove hardcoded string (#2363) via NachoSoto (@NachoSoto) +* `Offline Entitlements`: created `ProductEntitlementMappingResponse` (#2351) via NachoSoto (@NachoSoto) +* `HTTPClient`: added test for 2xx response for request with etag (#2361) via NachoSoto (@NachoSoto) +* `PurchaseTesterSwiftUI` improvements (#2345) via NachoSoto (@NachoSoto) +* `ConfigureStrings`: fixed double-space typo (#2344) via NachoSoto (@NachoSoto) +* `ETagManagerTests`: fixed tests on iOS 12 (#2349) via NachoSoto (@NachoSoto) +* `DeviceCache`: simplified constructor (#2354) via NachoSoto (@NachoSoto) +* `Trusted Entitlements`: changed all APIs to `internal` (#2350) via NachoSoto (@NachoSoto) +* Version 4.17.9 release notes (#2348) via NachoSoto (@NachoSoto) +* `CI`: also run tests on `watchOS` (#2340) via NachoSoto (@NachoSoto) +* `VerificationResult.notRequested`: removed caching reference (#2337) via NachoSoto (@NachoSoto) +* `RELEASING.md`: added GitHub rate limiting parameter (#2336) via NachoSoto (@NachoSoto) +* Finished signature verification `HTTPClient` tests (#2333) via NachoSoto (@NachoSoto) +* `Configuration.Builder.with(entitlementVerificationMode:)`: improved documentation (#2334) via NachoSoto (@NachoSoto) +* `ETagManager`: don't ignore failed etags with `Signing.VerificationMode.informational` (#2331) via NachoSoto (@NachoSoto) +* `IdentityManager`: clear `ETagManager` and `DeviceCache` if verification is enabled but cached `CustomerInfo` is not (#2330) via NachoSoto (@NachoSoto) +* Made `Configuration.EntitlementVerificationMode.enforced` unavailable (#2329) via NachoSoto (@NachoSoto) +* Refactor: reorganized files in new Security and Misc folders (#2326) via NachoSoto (@NachoSoto) +* `CustomerInfo`: use same grace period logic for active subscriptions (#2327) via NachoSoto (@NachoSoto) +* `HTTPClient`: don't verify 4xx/5xx responses (#2322) via NachoSoto (@NachoSoto) +* `PurchaseTester`: fixed compilation from verification API changes (#2328) via NachoSoto (@NachoSoto) +* `EntitlementInfo`: request date is not optional (#2325) via NachoSoto (@NachoSoto) +* Add additional logging on init (#2324) via Cody Kerns (@codykerns) +* replace `iff` with `if and only if` (#2323) via Andy Boedo (@aboedo) +* `CustomerInfo`: removed `entitlementVerification` (#2320) via NachoSoto (@NachoSoto) +* Renamed `VerificationResult.notVerified` to `.notRequested` (#2321) via NachoSoto (@NachoSoto) +* `EntitlementInfo`: add a grace period limit to outdated entitlements (#2288) via NachoSoto (@NachoSoto) +* Update `CustomerInfo.requestDate` from 304 responses (#2310) via NachoSoto (@NachoSoto) +* Remove Logging Typo (#2315) via Nick Kohrn (@nickkohrn) +* `Purchases.restorePurchases`: added docstring about successful results (#2316) via NachoSoto (@NachoSoto) +* `Signing`: added request time & eTag to signature verification (#2309) via NachoSoto (@NachoSoto) +* `HTTPClient`: changed header search to be case-insensitive (#2308) via NachoSoto (@NachoSoto) +* `HTTPClient`: automatically add `nonce` based on `HTTPRequest.Path` (#2286) via NachoSoto (@NachoSoto) +* `PurchaseTester`: added ability to reload `CustomerInfo` with a custom `CacheFetchPolicy` (#2312) via NachoSoto (@NachoSoto) +* `RELEASING.md`: fixed hotfix instructions (#2304) via NachoSoto (@NachoSoto) +* `PurchaseTester`: fixed leak when reconfiguring `Purchases` (#2311) via NachoSoto (@NachoSoto) +* Fix issue where underlying error information for product fetch errors was not printed in log. (#2281) via Chris Vasselli (@chrisvasselli) +* `PurchaseTester`: added ability to set `Configuration.EntitlementVerificationMode` (#2290) via NachoSoto (@NachoSoto) +* SwiftUI: Paywall View should respond to changes on the UserView model (#2297) via ConfusedVorlon (@ConfusedVorlon) +* Deprecate `usesStoreKit2IfAvailable` (#2293) via Andy Boedo (@aboedo) +* clarifies error messages for storekit 1 bugs (#2294) via Andy Boedo (@aboedo) +* `Signing`: updated to use production public key (#2274) via NachoSoto (@NachoSoto) diff --git a/CHANGELOG.md b/CHANGELOG.md index ade1090173..1dfd9715c8 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,133 @@ +## 4.19.0 +### New Features +* Create separate `SPM` library to enable custom entitlement computation (#2440) via NachoSoto (@NachoSoto) +* Custom Entitlements Computation mode (#2439) via Andy Boedo (@aboedo) +* Introduced `Configuration.EntitlementVerificationMode` and `VerificationResult` (#2277) via NachoSoto (@NachoSoto) +* `PurchasesDiagnostics`: added step to verify signature verification (#2267) via NachoSoto (@NachoSoto) +* `HTTPClient`: added signature validation and introduced `ErrorCode.signatureVerificationFailed` (#2272) via NachoSoto (@NachoSoto) +### Bugfixes +* `PurchaseOrchestrator`: fix incorrect `InitiationSource` for SK1 queue transactions (#2430) via NachoSoto (@NachoSoto) +* `CustomerInfoManager`: fixed deadlock caused by reading `CustomerInfo` inside of observer (#2412) via NachoSoto (@NachoSoto) +* Fix deadlock when sending notification center in customerInfoListener (#2407) via Andy Boedo (@aboedo) +* `Xcode 14.3`: fixed compilation errors (#2399) via NachoSoto (@NachoSoto) +* `DispatchTimeInterval`: fixed Xcode 14.3 compilation (#2397) via NachoSoto (@NachoSoto) +* Temporarily disable entitlement mapping (#2386) via Andy Boedo (@aboedo) +* `DeviceCache`: workaround for potential deadlock (#2375) via NachoSoto (@NachoSoto) +* `Purchases.deinit`: don't reset `Purchases.proxyURL` (#2346) via NachoSoto (@NachoSoto) +* `ETagManager`: don't use ETags if response verification failed (#2347) via NachoSoto (@NachoSoto) +* `DispatchTimeInterval` & `Date`: avoid 32-bit overflows, fix `watchOS` crashes (#2342) via NachoSoto (@NachoSoto) +* Fix issue with missing subscriber attributes if set after login but before login callback (#2313) via Toni Rico (@tonidero) +* Fixed `Bundle: Sendable` conformance (#2301) via NachoSoto (@NachoSoto) +* Fixed `PurchasesOrchestrator` compilation error on Xcode 14.3 beta 1 (#2292) via NachoSoto (@NachoSoto) +### Performance Improvements +* Update offerings cache when switchUser(to:) is called (#2455) via Andy Boedo (@aboedo) +* Custom Entitlement Computation: avoid `getCustomerInfo` requests for cancelled purchases (#2449) via NachoSoto (@NachoSoto) +* `PostReceiptDataOperation` / `GetCustomerInfoOperation`: only invoke response handlers once (#2377) via NachoSoto (@NachoSoto) +* `AppleReceipt.mostRecentActiveSubscription`: performance optimization (#2332) via NachoSoto (@NachoSoto) +### Dependency Updates +* Bump fastlane-plugin-revenuecat_internal from `3b03efa` to `fe45299` (#2459) via dependabot[bot] (@dependabot[bot]) +* Bump fastlane-plugin-revenuecat_internal from `8482a43` to `3b03efa` (#2413) via dependabot[bot] (@dependabot[bot]) +* Bump danger from 9.2.0 to 9.3.0 (#2433) via dependabot[bot] (@dependabot[bot]) +* Bump cocoapods from 1.12.0 to 1.12.1 (#2414) via dependabot[bot] (@dependabot[bot]) +* Bump fastlane from 2.212.1 to 2.212.2 (#2411) via dependabot[bot] (@dependabot[bot]) +* Bump fastlane-plugin-revenuecat_internal from `9255366` to `8482a43` (#2401) via dependabot[bot] (@dependabot[bot]) +* Bump activesupport from 7.0.4.2 to 7.0.4.3 (#2339) via dependabot[bot] (@dependabot[bot]) +* Bump cocoapods from 1.11.3 to 1.12.0 (#2317) via dependabot[bot] (@dependabot[bot]) +* Bump fastlane from 2.212.0 to 2.212.1 (#2314) via dependabot[bot] (@dependabot[bot]) +* Bump fastlane from 2.211.0 to 2.212.0 (#2298) via dependabot[bot] (@dependabot[bot]) +### Other Changes +* `Integration Tests`: removed `@preconcurrency import` (#2464) via NachoSoto (@NachoSoto) +* Clean up: moved `ReceiptParserTests-Info.plist` out of root (#2460) via NachoSoto (@NachoSoto) +* Update `CHANGELOG` (#2461) via NachoSoto (@NachoSoto) +* Custom Entitlement Computation: API testers (#2452) via NachoSoto (@NachoSoto) +* updated example code for the sample app for Custom Entitlements (#2454) via Andy Boedo (@aboedo) +* Update `SwiftSnapshotTesting` (#2453) via NachoSoto (@NachoSoto) +* Custom Entitlement Computation: re-enable `syncPurchases`/`restorePurchases` (#2451) via NachoSoto (@NachoSoto) +* Custom Entitlement Computation: disabled unnecessary APIs (#2442) via NachoSoto (@NachoSoto) +* `customEntitlementsComputation`: update the copy in the sample app to explain the new usage (#2443) via Andy Boedo (@aboedo) +* Fixed docs (#2432) via Kaunteya Suryawanshi (@kaunteya) +* clarify reasoning for disfavoredOverload in logIn (#2434) via Andy Boedo (@aboedo) +* remove unnecessary line break (#2435) via Andy Boedo (@aboedo) +* `ProductEntitlementMapping`: enabled entitlement mapping fetching (#2425) via NachoSoto (@NachoSoto) +* `BackendPostReceiptDataTests`: increased timeout to fix flaky test (#2426) via NachoSoto (@NachoSoto) +* `StoreKit1Wrapper`: added log when adding payment to queue (#2423) via NachoSoto (@NachoSoto) +* `StoreKit1Wrapper`: added debug log when transaction is removed but no callbacks to notify (#2418) via NachoSoto (@NachoSoto) +* Updated requirements to drop Xcode 13.x support (#2419) via NachoSoto (@NachoSoto) +* `Integration Tests`: fixed flaky errors when loading offerings (#2420) via NachoSoto (@NachoSoto) +* `PurchaseTester`: fixed compilation for `internal` entitlement verification (#2417) via NachoSoto (@NachoSoto) +* `ETagManager`/`HTTPClient`: sending new `X-RC-Last-Refresh-Time` header (#2373) via NachoSoto (@NachoSoto) +* SwiftUI Sample Project: Refactor Package terms method to a computed property (#2405) via Joseph Kokenge (@JOyo246) +* clean up v3 load shedder integration tests (#2402) via Andy Boedo (@aboedo) +* `CircleCI`: use `Xcode 14.3.0` (#2398) via NachoSoto (@NachoSoto) +* Fix iOS 12 compilation (#2394) via NachoSoto (@NachoSoto) +* Added new `VerificationResult.verifiedOnDevice` (#2379) via NachoSoto (@NachoSoto) +* `SwiftLint`: fixed lint with new 0.51.0 version (#2395) via NachoSoto (@NachoSoto) +* `PurchaseTester`: fix memory leaks (#2392) via Keita Watanabe (@kitwtnb) +* Integration tests: add scheduled job (#2389) via Andy Boedo (@aboedo) +* Add lane for running iOS v3 load shedder integration tests (#2388) via Andy Boedo (@aboedo) +* iOS v3 load shedder integration tests (#2387) via Andy Boedo (@aboedo) +* `Offline Entitlements`: created `LoadShedderIntegrationTests` (#2362) via NachoSoto (@NachoSoto) +* Purchases.configure: log warning if attempting to use a static appUserID (#2385) via Mark Villacampa (@MarkVillacampa) +* `SubscriberAttributesManagerIntegrationTests`: fixed flaky failures (#2381) via NachoSoto (@NachoSoto) +* redirect to latest version of migration guide (#2384) via Andy Boedo (@aboedo) +* Fix migration guide link (#2383) via Andy Boedo (@aboedo) +* `@DefaultDecodable.Now`: fixed flaky test (#2374) via NachoSoto (@NachoSoto) +* `PurchaseTesterSwiftUI`: fixed iOS compilation (#2376) via NachoSoto (@NachoSoto) +* `SubscriberAttributesManagerIntegrationTests`: fixed potential race condition (#2380) via NachoSoto (@NachoSoto) +* `Offline Entitlements`: create `CustomerInfo` from offline entitlements (#2358) via NachoSoto (@NachoSoto) +* Added `@DefaultDecodable.Now` (#2372) via NachoSoto (@NachoSoto) +* `HTTPClient`: debug log when performing redirects (#2371) via NachoSoto (@NachoSoto) +* `HTTPClient`: new flag to force server errors (#2370) via NachoSoto (@NachoSoto) +* `OfferingsManager`: fixed Xcode 13.x build (#2369) via NachoSoto (@NachoSoto) +* `Offline Entitlements`: store `ProductEntitlementMapping` in cache (#2355) via NachoSoto (@NachoSoto) +* `Offline Entitlements`: added support for fetching `ProductEntitlementMappingResponse` in `OfflineEntitlementsAPI` (#2353) via NachoSoto (@NachoSoto) +* `Offline Entitlements`: created `ProductEntitlementMapping` (#2365) via NachoSoto (@NachoSoto) +* Implemented `NetworkError.isServerDown` (#2367) via NachoSoto (@NachoSoto) +* `ETagManager`: added test for 304 responses with no etag (#2360) via NachoSoto (@NachoSoto) +* `TestLogHandler`: increased default capacity (#2357) via NachoSoto (@NachoSoto) +* `OfferingsManager`: moved log to common method to remove hardcoded string (#2363) via NachoSoto (@NachoSoto) +* `Offline Entitlements`: created `ProductEntitlementMappingResponse` (#2351) via NachoSoto (@NachoSoto) +* `HTTPClient`: added test for 2xx response for request with etag (#2361) via NachoSoto (@NachoSoto) +* `PurchaseTesterSwiftUI` improvements (#2345) via NachoSoto (@NachoSoto) +* `ConfigureStrings`: fixed double-space typo (#2344) via NachoSoto (@NachoSoto) +* `ETagManagerTests`: fixed tests on iOS 12 (#2349) via NachoSoto (@NachoSoto) +* `DeviceCache`: simplified constructor (#2354) via NachoSoto (@NachoSoto) +* `Trusted Entitlements`: changed all APIs to `internal` (#2350) via NachoSoto (@NachoSoto) +* Version 4.17.9 release notes (#2348) via NachoSoto (@NachoSoto) +* `CI`: also run tests on `watchOS` (#2340) via NachoSoto (@NachoSoto) +* `VerificationResult.notRequested`: removed caching reference (#2337) via NachoSoto (@NachoSoto) +* `RELEASING.md`: added GitHub rate limiting parameter (#2336) via NachoSoto (@NachoSoto) +* Finished signature verification `HTTPClient` tests (#2333) via NachoSoto (@NachoSoto) +* `Configuration.Builder.with(entitlementVerificationMode:)`: improved documentation (#2334) via NachoSoto (@NachoSoto) +* `ETagManager`: don't ignore failed etags with `Signing.VerificationMode.informational` (#2331) via NachoSoto (@NachoSoto) +* `IdentityManager`: clear `ETagManager` and `DeviceCache` if verification is enabled but cached `CustomerInfo` is not (#2330) via NachoSoto (@NachoSoto) +* Made `Configuration.EntitlementVerificationMode.enforced` unavailable (#2329) via NachoSoto (@NachoSoto) +* Refactor: reorganized files in new Security and Misc folders (#2326) via NachoSoto (@NachoSoto) +* `CustomerInfo`: use same grace period logic for active subscriptions (#2327) via NachoSoto (@NachoSoto) +* `HTTPClient`: don't verify 4xx/5xx responses (#2322) via NachoSoto (@NachoSoto) +* `PurchaseTester`: fixed compilation from verification API changes (#2328) via NachoSoto (@NachoSoto) +* `EntitlementInfo`: request date is not optional (#2325) via NachoSoto (@NachoSoto) +* Add additional logging on init (#2324) via Cody Kerns (@codykerns) +* replace `iff` with `if and only if` (#2323) via Andy Boedo (@aboedo) +* `CustomerInfo`: removed `entitlementVerification` (#2320) via NachoSoto (@NachoSoto) +* Renamed `VerificationResult.notVerified` to `.notRequested` (#2321) via NachoSoto (@NachoSoto) +* `EntitlementInfo`: add a grace period limit to outdated entitlements (#2288) via NachoSoto (@NachoSoto) +* Update `CustomerInfo.requestDate` from 304 responses (#2310) via NachoSoto (@NachoSoto) +* Remove Logging Typo (#2315) via Nick Kohrn (@nickkohrn) +* `Purchases.restorePurchases`: added docstring about successful results (#2316) via NachoSoto (@NachoSoto) +* `Signing`: added request time & eTag to signature verification (#2309) via NachoSoto (@NachoSoto) +* `HTTPClient`: changed header search to be case-insensitive (#2308) via NachoSoto (@NachoSoto) +* `HTTPClient`: automatically add `nonce` based on `HTTPRequest.Path` (#2286) via NachoSoto (@NachoSoto) +* `PurchaseTester`: added ability to reload `CustomerInfo` with a custom `CacheFetchPolicy` (#2312) via NachoSoto (@NachoSoto) +* `RELEASING.md`: fixed hotfix instructions (#2304) via NachoSoto (@NachoSoto) +* `PurchaseTester`: fixed leak when reconfiguring `Purchases` (#2311) via NachoSoto (@NachoSoto) +* Fix issue where underlying error information for product fetch errors was not printed in log. (#2281) via Chris Vasselli (@chrisvasselli) +* `PurchaseTester`: added ability to set `Configuration.EntitlementVerificationMode` (#2290) via NachoSoto (@NachoSoto) +* SwiftUI: Paywall View should respond to changes on the UserView model (#2297) via ConfusedVorlon (@ConfusedVorlon) +* Deprecate `usesStoreKit2IfAvailable` (#2293) via Andy Boedo (@aboedo) +* clarifies error messages for storekit 1 bugs (#2294) via Andy Boedo (@aboedo) +* `Signing`: updated to use production public key (#2274) via NachoSoto (@NachoSoto) + ## 4.18.0 ### New Features * Introduced Custom Entitlements Computation mode (#2439) via Andy Boedo (@aboedo) diff --git a/RevenueCat.podspec b/RevenueCat.podspec index df031bb338..2437812d71 100644 --- a/RevenueCat.podspec +++ b/RevenueCat.podspec @@ -1,6 +1,6 @@ Pod::Spec.new do |s| s.name = "RevenueCat" - s.version = "4.18.0-SNAPSHOT" + s.version = "4.19.0" s.summary = "Subscription and in-app-purchase backend service." s.description = <<-DESC diff --git a/Sources/Info.plist b/Sources/Info.plist index e91699da99..bf336bd81a 100644 --- a/Sources/Info.plist +++ b/Sources/Info.plist @@ -17,7 +17,7 @@ CFBundlePackageType $(PRODUCT_BUNDLE_PACKAGE_TYPE) CFBundleShortVersionString - 4.18.0 + 4.19.0 CFBundleVersion $(CURRENT_PROJECT_VERSION) LSApplicationCategoryType diff --git a/Sources/Misc/SystemInfo.swift b/Sources/Misc/SystemInfo.swift index 3182c6896f..83aa5da0cc 100644 --- a/Sources/Misc/SystemInfo.swift +++ b/Sources/Misc/SystemInfo.swift @@ -53,7 +53,7 @@ class SystemInfo { } static var frameworkVersion: String { - return "4.18.0-SNAPSHOT" + return "4.19.0" } static var systemVersion: String { diff --git a/Tests/BackendIntegrationTestApp/Info.plist b/Tests/BackendIntegrationTestApp/Info.plist index da5899d2e3..e2d294152c 100644 --- a/Tests/BackendIntegrationTestApp/Info.plist +++ b/Tests/BackendIntegrationTestApp/Info.plist @@ -17,7 +17,7 @@ CFBundlePackageType $(PRODUCT_BUNDLE_PACKAGE_TYPE) CFBundleShortVersionString - 4.18.0 + 4.19.0 CFBundleVersion 1 LSRequiresIPhoneOS diff --git a/Tests/BackendIntegrationTests/Info.plist b/Tests/BackendIntegrationTests/Info.plist index 6f4ce7247b..47b631fe0e 100644 --- a/Tests/BackendIntegrationTests/Info.plist +++ b/Tests/BackendIntegrationTests/Info.plist @@ -15,7 +15,7 @@ CFBundlePackageType $(PRODUCT_BUNDLE_PACKAGE_TYPE) CFBundleShortVersionString - 4.18.0 + 4.19.0 CFBundleVersion 1 diff --git a/Tests/InstallationTests/CommonFiles/RevenueCat-Swift.h b/Tests/InstallationTests/CommonFiles/RevenueCat-Swift.h index 1a6504ed73..d00d5c1aa2 100644 --- a/Tests/InstallationTests/CommonFiles/RevenueCat-Swift.h +++ b/Tests/InstallationTests/CommonFiles/RevenueCat-Swift.h @@ -1,4 +1,4 @@ -// Generated by Apple Swift version 5.7.2 (swiftlang-5.7.2.135.5 clang-1400.0.29.51) +// Generated by Apple Swift version 5.8 (swiftlang-5.8.0.124.2 clang-1403.0.22.11.100) #ifndef REVENUECAT_SWIFT_H #define REVENUECAT_SWIFT_H #pragma clang diagnostic push @@ -21,7 +21,6 @@ # include #endif -#pragma clang diagnostic ignored "-Wduplicate-method-match" #pragma clang diagnostic ignored "-Wauto-import" #if defined(__OBJC__) #include @@ -30,10 +29,24 @@ #include #include #include +#include +#include +#include +#include #else #include #include #include +#include +#endif +#if defined(__cplusplus) +#if __has_include() +# include +#else +# ifndef __ptrauth_swift_value_witness_function_pointer +# define __ptrauth_swift_value_witness_function_pointer(x) +# endif +#endif #endif #if !defined(SWIFT_TYPEDEFS) @@ -69,53 +82,66 @@ typedef unsigned int swift_uint4 __attribute__((__ext_vector_type__(4))); # if __has_feature(objc_class_property) # define SWIFT_CLASS_PROPERTY(...) __VA_ARGS__ # else -# define SWIFT_CLASS_PROPERTY(...) +# define SWIFT_CLASS_PROPERTY(...) # endif #endif - -#if __has_attribute(objc_runtime_name) -# define SWIFT_RUNTIME_NAME(X) __attribute__((objc_runtime_name(X))) -#else -# define SWIFT_RUNTIME_NAME(X) +#if !defined(SWIFT_RUNTIME_NAME) +# if __has_attribute(objc_runtime_name) +# define SWIFT_RUNTIME_NAME(X) __attribute__((objc_runtime_name(X))) +# else +# define SWIFT_RUNTIME_NAME(X) +# endif #endif -#if __has_attribute(swift_name) -# define SWIFT_COMPILE_NAME(X) __attribute__((swift_name(X))) -#else -# define SWIFT_COMPILE_NAME(X) +#if !defined(SWIFT_COMPILE_NAME) +# if __has_attribute(swift_name) +# define SWIFT_COMPILE_NAME(X) __attribute__((swift_name(X))) +# else +# define SWIFT_COMPILE_NAME(X) +# endif #endif -#if __has_attribute(objc_method_family) -# define SWIFT_METHOD_FAMILY(X) __attribute__((objc_method_family(X))) -#else -# define SWIFT_METHOD_FAMILY(X) +#if !defined(SWIFT_METHOD_FAMILY) +# if __has_attribute(objc_method_family) +# define SWIFT_METHOD_FAMILY(X) __attribute__((objc_method_family(X))) +# else +# define SWIFT_METHOD_FAMILY(X) +# endif #endif -#if __has_attribute(noescape) -# define SWIFT_NOESCAPE __attribute__((noescape)) -#else -# define SWIFT_NOESCAPE +#if !defined(SWIFT_NOESCAPE) +# if __has_attribute(noescape) +# define SWIFT_NOESCAPE __attribute__((noescape)) +# else +# define SWIFT_NOESCAPE +# endif #endif -#if __has_attribute(ns_consumed) -# define SWIFT_RELEASES_ARGUMENT __attribute__((ns_consumed)) -#else -# define SWIFT_RELEASES_ARGUMENT +#if !defined(SWIFT_RELEASES_ARGUMENT) +# if __has_attribute(ns_consumed) +# define SWIFT_RELEASES_ARGUMENT __attribute__((ns_consumed)) +# else +# define SWIFT_RELEASES_ARGUMENT +# endif #endif -#if __has_attribute(warn_unused_result) -# define SWIFT_WARN_UNUSED_RESULT __attribute__((warn_unused_result)) -#else -# define SWIFT_WARN_UNUSED_RESULT +#if !defined(SWIFT_WARN_UNUSED_RESULT) +# if __has_attribute(warn_unused_result) +# define SWIFT_WARN_UNUSED_RESULT __attribute__((warn_unused_result)) +# else +# define SWIFT_WARN_UNUSED_RESULT +# endif #endif -#if __has_attribute(noreturn) -# define SWIFT_NORETURN __attribute__((noreturn)) -#else -# define SWIFT_NORETURN +#if !defined(SWIFT_NORETURN) +# if __has_attribute(noreturn) +# define SWIFT_NORETURN __attribute__((noreturn)) +# else +# define SWIFT_NORETURN +# endif #endif #if !defined(SWIFT_CLASS_EXTRA) -# define SWIFT_CLASS_EXTRA +# define SWIFT_CLASS_EXTRA #endif #if !defined(SWIFT_PROTOCOL_EXTRA) -# define SWIFT_PROTOCOL_EXTRA +# define SWIFT_PROTOCOL_EXTRA #endif #if !defined(SWIFT_ENUM_EXTRA) -# define SWIFT_ENUM_EXTRA +# define SWIFT_ENUM_EXTRA #endif #if !defined(SWIFT_CLASS) # if __has_attribute(objc_subclassing_restricted) @@ -135,28 +161,25 @@ typedef unsigned int swift_uint4 __attribute__((__ext_vector_type__(4))); # define SWIFT_RESILIENT_CLASS_NAMED(SWIFT_NAME) SWIFT_CLASS_NAMED(SWIFT_NAME) # endif #endif - #if !defined(SWIFT_PROTOCOL) # define SWIFT_PROTOCOL(SWIFT_NAME) SWIFT_RUNTIME_NAME(SWIFT_NAME) SWIFT_PROTOCOL_EXTRA # define SWIFT_PROTOCOL_NAMED(SWIFT_NAME) SWIFT_COMPILE_NAME(SWIFT_NAME) SWIFT_PROTOCOL_EXTRA #endif - #if !defined(SWIFT_EXTENSION) # define SWIFT_EXTENSION(M) SWIFT_PASTE(M##_Swift_, __LINE__) #endif - #if !defined(OBJC_DESIGNATED_INITIALIZER) # if __has_attribute(objc_designated_initializer) # define OBJC_DESIGNATED_INITIALIZER __attribute__((objc_designated_initializer)) # else -# define OBJC_DESIGNATED_INITIALIZER +# define OBJC_DESIGNATED_INITIALIZER # endif #endif #if !defined(SWIFT_ENUM_ATTR) -# if defined(__has_attribute) && __has_attribute(enum_extensibility) +# if __has_attribute(enum_extensibility) # define SWIFT_ENUM_ATTR(_extensibility) __attribute__((enum_extensibility(_extensibility))) # else -# define SWIFT_ENUM_ATTR(_extensibility) +# define SWIFT_ENUM_ATTR(_extensibility) # endif #endif #if !defined(SWIFT_ENUM) @@ -185,14 +208,16 @@ typedef unsigned int swift_uint4 __attribute__((__ext_vector_type__(4))); #if !defined(SWIFT_DEPRECATED_MSG) # define SWIFT_DEPRECATED_MSG(...) __attribute__((deprecated(__VA_ARGS__))) #endif -#if __has_feature(attribute_diagnose_if_objc) -# define SWIFT_DEPRECATED_OBJC(Msg) __attribute__((diagnose_if(1, Msg, "warning"))) -#else -# define SWIFT_DEPRECATED_OBJC(Msg) SWIFT_DEPRECATED_MSG(Msg) +#if !defined(SWIFT_DEPRECATED_OBJC) +# if __has_feature(attribute_diagnose_if_objc) +# define SWIFT_DEPRECATED_OBJC(Msg) __attribute__((diagnose_if(1, Msg, "warning"))) +# else +# define SWIFT_DEPRECATED_OBJC(Msg) SWIFT_DEPRECATED_MSG(Msg) +# endif #endif #if defined(__OBJC__) #if !defined(IBSegueAction) -# define IBSegueAction +# define IBSegueAction #endif #endif #if !defined(SWIFT_EXTERN) @@ -205,26 +230,31 @@ typedef unsigned int swift_uint4 __attribute__((__ext_vector_type__(4))); #if !defined(SWIFT_CALL) # define SWIFT_CALL __attribute__((swiftcall)) #endif +#if !defined(SWIFT_INDIRECT_RESULT) +# define SWIFT_INDIRECT_RESULT __attribute__((swift_indirect_result)) +#endif +#if !defined(SWIFT_CONTEXT) +# define SWIFT_CONTEXT __attribute__((swift_context)) +#endif +#if !defined(SWIFT_ERROR_RESULT) +# define SWIFT_ERROR_RESULT __attribute__((swift_error_result)) +#endif #if defined(__cplusplus) -#if !defined(SWIFT_NOEXCEPT) # define SWIFT_NOEXCEPT noexcept -#endif #else -#if !defined(SWIFT_NOEXCEPT) # define SWIFT_NOEXCEPT #endif +#if defined(_WIN32) +#if !defined(SWIFT_IMPORT_STDLIB_SYMBOL) +# define SWIFT_IMPORT_STDLIB_SYMBOL __declspec(dllimport) #endif -#if defined(__cplusplus) -#if !defined(SWIFT_CXX_INT_DEFINED) -#define SWIFT_CXX_INT_DEFINED -namespace swift { -using Int = ptrdiff_t; -using UInt = size_t; -} +#else +#if !defined(SWIFT_IMPORT_STDLIB_SYMBOL) +# define SWIFT_IMPORT_STDLIB_SYMBOL #endif #endif #if defined(__OBJC__) -#if __has_feature(modules) +#if __has_feature(objc_modules) #if __has_warning("-Watimport-in-framework-header") #pragma clang diagnostic ignored "-Watimport-in-framework-header" #endif @@ -532,6 +562,69 @@ typedef SWIFT_ENUM_NAMED(NSInteger, RCAttributionNetwork, "AttributionNetwork", RCAttributionNetworkAdServices = 7, }; +@class NSUserDefaults; +@class RCDangerousSettings; +@class RCPlatformInfo; +enum RCEntitlementVerificationMode : NSInteger; +@class RCConfiguration; + +/// The Builder for Configuration. +SWIFT_CLASS_NAMED("Builder") +@interface RCConfigurationBuilder : NSObject +/// Create a new builder with your API key. +/// \param apiKey The API Key generated for your app from https://app.revenuecat.com/ +/// +- (nonnull instancetype)initWithAPIKey:(NSString * _Nonnull)apiKey OBJC_DESIGNATED_INITIALIZER; +/// Update your API key. +- (RCConfigurationBuilder * _Nonnull)withApiKey:(NSString * _Nonnull)apiKey SWIFT_WARN_UNUSED_RESULT; +/// Set an appUserID. +/// note: +/// Best practice is to use a salted hash of your unique app user ids. +/// important: +/// Set this property if you have your own user identifiers that you manage. +/// \param appUserID The unique app user id for this user. This user id will allow users to share their +/// purchases and subscriptions across devices. Pass nil or an empty string if you want Purchases +/// to generate this for you. +/// +- (RCConfigurationBuilder * _Nonnull)withAppUserID:(NSString * _Nullable)appUserID SWIFT_WARN_UNUSED_RESULT; +/// Set observerMode. +/// \param observerMode Set this to true if you have your own IAP implementation and want to use only +/// RevenueCat’s backend. Default is false. +/// +- (RCConfigurationBuilder * _Nonnull)withObserverMode:(BOOL)observerMode SWIFT_WARN_UNUSED_RESULT; +/// Set userDefaults. +/// \param userDefaults Custom UserDefaults to use +/// +- (RCConfigurationBuilder * _Nonnull)withUserDefaults:(NSUserDefaults * _Nonnull)userDefaults SWIFT_WARN_UNUSED_RESULT; +/// Set dangerousSettings. +/// \param dangerousSettings Only use if suggested by RevenueCat support team. +/// +- (RCConfigurationBuilder * _Nonnull)withDangerousSettings:(RCDangerousSettings * _Nonnull)dangerousSettings SWIFT_WARN_UNUSED_RESULT; +/// Set networkTimeout. +- (RCConfigurationBuilder * _Nonnull)withNetworkTimeout:(NSTimeInterval)networkTimeout SWIFT_WARN_UNUSED_RESULT; +/// Set storeKit1Timeout. +- (RCConfigurationBuilder * _Nonnull)withStoreKit1Timeout:(NSTimeInterval)storeKit1Timeout SWIFT_WARN_UNUSED_RESULT; +/// Set platformInfo. +- (RCConfigurationBuilder * _Nonnull)withPlatformInfo:(RCPlatformInfo * _Nonnull)platformInfo SWIFT_WARN_UNUSED_RESULT; +- (RCConfigurationBuilder * _Nonnull)withEntitlementVerificationMode:(enum RCEntitlementVerificationMode)mode SWIFT_WARN_UNUSED_RESULT SWIFT_AVAILABILITY(watchos,introduced=6.2) SWIFT_AVAILABILITY(tvos,introduced=13.0) SWIFT_AVAILABILITY(macos,introduced=10.15) SWIFT_AVAILABILITY(ios,introduced=13.0); +/// Generate a Configuration object given the values configured by this builder. +- (RCConfiguration * _Nonnull)build SWIFT_WARN_UNUSED_RESULT; +- (nonnull instancetype)init SWIFT_UNAVAILABLE; ++ (nonnull instancetype)new SWIFT_UNAVAILABLE_MSG("-init is unavailable"); +@end + + +@interface RCConfigurationBuilder (SWIFT_EXTENSION(RevenueCat)) +/// Set usesStoreKit2IfAvailable. If true, the SDK will use StoreKit 2 APIs internally. If disabled, it will use StoreKit 1 APIs instead. +/// important: +/// This configuration flag has been deprecated, and will be replaced by automatic remote configuration in the future. +/// However, apps using it should work correctly. +/// \param usesStoreKit2IfAvailable enable StoreKit 2 on devices that support it. +/// Defaults to false. +/// +- (RCConfigurationBuilder * _Nonnull)withUsesStoreKit2IfAvailable:(BOOL)usesStoreKit2IfAvailable SWIFT_WARN_UNUSED_RESULT SWIFT_DEPRECATED_MSG("\n RevenueCat currently uses StoreKit 1 for purchases, as its stability in production scenarios has\n proven to be more performant than StoreKit 2.\n\n We're collecting more data on the best approach, but StoreKit 1 vs StoreKit 2 is an implementation detail\n that you shouldn't need to care about.\n\n Simply remove this method call to let RevenueCat decide for you which StoreKit implementation to use.\n "); +@end + /// Specifies the behavior for a caching API. typedef SWIFT_ENUM_NAMED(NSInteger, RCCacheFetchPolicy, "CacheFetchPolicy", open) { /// Returns values from the cache, or throws an error if not available. @@ -565,7 +658,6 @@ SWIFT_CLASS("_TtC10RevenueCat25CacheableNetworkOperation") @interface CacheableNetworkOperation : NetworkOperation @end -@class RCConfigurationBuilder; /// Configuration can be used when configuring the Purchases instance. It is not required to be used, but /// highly recommended. This class follows a builder pattern. @@ -591,7 +683,6 @@ SWIFT_CLASS("_TtC10RevenueCat25CacheableNetworkOperation") /// .with(userDefaults: myUserDefaults) /// .with(networkTimeout: 15) /// .with(storeKit1Timeout: 15) -/// .with(usesStoreKit2IfAvailable: true) /// .build() /// Purchases.configure(with: configuration) /// @@ -604,79 +695,36 @@ SWIFT_CLASS_NAMED("Configuration") + (nonnull instancetype)new SWIFT_UNAVAILABLE_MSG("-init is unavailable"); @end -@class NSUserDefaults; -@class RCDangerousSettings; -@class RCPlatformInfo; -enum RCEntitlementVerificationLevel : NSInteger; - -/// The Builder for Configuration. -SWIFT_CLASS_NAMED("Builder") -@interface RCConfigurationBuilder : NSObject -/// Create a new builder with your API key. -/// \param apiKey The API Key generated for your app from https://app.revenuecat.com/ -/// -- (nonnull instancetype)initWithAPIKey:(NSString * _Nonnull)apiKey OBJC_DESIGNATED_INITIALIZER; -/// Update your API key. -- (RCConfigurationBuilder * _Nonnull)withApiKey:(NSString * _Nonnull)apiKey SWIFT_WARN_UNUSED_RESULT; -/// Set an appUserID. -/// note: -/// Best practice is to use a salted hash of your unique app user ids. -/// important: -/// Set this property if you have your own user identifiers that you manage. -/// \param appUserID The unique app user id for this user. This user id will allow users to share their -/// purchases and subscriptions across devices. Pass nil or an empty string if you want Purchases -/// to generate this for you. -/// -- (RCConfigurationBuilder * _Nonnull)withAppUserID:(NSString * _Nullable)appUserID SWIFT_WARN_UNUSED_RESULT; -/// Set observerMode. -/// \param observerMode Set this to true if you have your own IAP implementation and want to use only -/// RevenueCat’s backend. Default is false. -/// -- (RCConfigurationBuilder * _Nonnull)withObserverMode:(BOOL)observerMode SWIFT_WARN_UNUSED_RESULT; -/// Set userDefaults. -/// \param userDefaults Custom UserDefaults to use -/// -- (RCConfigurationBuilder * _Nonnull)withUserDefaults:(NSUserDefaults * _Nonnull)userDefaults SWIFT_WARN_UNUSED_RESULT; -/// Set usesStoreKit2IfAvailable. -/// \param usesStoreKit2IfAvailable opt in using StoreKit 2 on devices that support it. -/// Defaults to false. -/// -- (RCConfigurationBuilder * _Nonnull)withUsesStoreKit2IfAvailable:(BOOL)usesStoreKit2IfAvailable SWIFT_WARN_UNUSED_RESULT; -/// Set dangerousSettings. -/// \param dangerousSettings Only use if suggested by RevenueCat support team. -/// -- (RCConfigurationBuilder * _Nonnull)withDangerousSettings:(RCDangerousSettings * _Nonnull)dangerousSettings SWIFT_WARN_UNUSED_RESULT; -/// Set networkTimeout. -- (RCConfigurationBuilder * _Nonnull)withNetworkTimeout:(NSTimeInterval)networkTimeout SWIFT_WARN_UNUSED_RESULT; -/// Set storeKit1Timeout. -- (RCConfigurationBuilder * _Nonnull)withStoreKit1Timeout:(NSTimeInterval)storeKit1Timeout SWIFT_WARN_UNUSED_RESULT; -/// Set platformInfo. -- (RCConfigurationBuilder * _Nonnull)withPlatformInfo:(RCPlatformInfo * _Nonnull)platformInfo SWIFT_WARN_UNUSED_RESULT; -/// Set Configuration/EntitlementVerificationLevel -/// note: -/// this requires iOS 13+ -/// -/// throws: -/// ErrorCode/configurationError if the key cannot be loaded -- (RCConfigurationBuilder * _Nullable)withEntitlementVerificationLevel:(enum RCEntitlementVerificationLevel)level error:(NSError * _Nullable * _Nullable)error SWIFT_WARN_UNUSED_RESULT SWIFT_AVAILABILITY(watchos,introduced=6.2) SWIFT_AVAILABILITY(tvos,introduced=13.0) SWIFT_AVAILABILITY(macos,introduced=10.15) SWIFT_AVAILABILITY(ios,introduced=13.0); -/// Generate a Configuration object given the values configured by this builder. -- (RCConfiguration * _Nonnull)build SWIFT_WARN_UNUSED_RESULT; -- (nonnull instancetype)init SWIFT_UNAVAILABLE; -+ (nonnull instancetype)new SWIFT_UNAVAILABLE_MSG("-init is unavailable"); -@end @interface RCConfiguration (SWIFT_EXTENSION(RevenueCat)) @end /// Defines how strict EntitlementInfo verification ought to be. -typedef SWIFT_ENUM_NAMED(NSInteger, RCEntitlementVerificationLevel, "EntitlementVerificationLevel", closed) { -/// The SDK will perform no entitlement verification. - RCEntitlementVerificationLevelDisabled = 0, -/// The SDK will verify entitlements, but will not fail to parse them if verification failed. - RCEntitlementVerificationLevelInformationOnly = 1, -/// The SDK will verify entitlements, and it will throw an error if verification failed. - RCEntitlementVerificationLevelEnforced = 2, +///

Related Symbols

+///
    +///
  • +/// VerificationResult +///
  • +///
  • +/// Configuration/Builder/with(entitlementVerificationMode:) +///
  • +///
  • +/// EntitlementInfos/verification +///
  • +///
+typedef SWIFT_ENUM_NAMED(NSInteger, RCEntitlementVerificationMode, "EntitlementVerificationMode", closed) { +/// The SDK will not perform any entitlement verification. + RCEntitlementVerificationModeDisabled = 0, +/// Enable entitlement verification. +/// If verification fails, this will be indicated with VerificationResult/failed +/// but parsing will not fail. +/// This can be useful if you want to handle validation failures but still grant access. + RCEntitlementVerificationModeInformational = 1, +/// Enable entitlement verification. +/// If verification fails when fetching CustomerInfo and/or EntitlementInfos +/// ErrorCode/signatureVerificationFailed will be thrown. + RCEntitlementVerificationModeEnforced = 2, }; @@ -775,11 +823,12 @@ SWIFT_CLASS_NAMED("CustomerInfo") + + @interface RCCustomerInfo (SWIFT_EXTENSION(RevenueCat)) @property (nonatomic, readonly, copy) NSDictionary * _Nonnull rawData; @end - @class RCStoreTransaction; @interface RCCustomerInfo (SWIFT_EXTENSION(RevenueCat)) @@ -792,6 +841,8 @@ SWIFT_CLASS_NAMED("CustomerInfo") + + /// Only use a Dangerous Setting if suggested by RevenueCat support team. SWIFT_CLASS_NAMED("DangerousSettings") @interface RCDangerousSettings : NSObject @@ -802,6 +853,27 @@ SWIFT_CLASS_NAMED("DangerousSettings") /// synced before finishing any consumable transaction, otherwise RevenueCat won’t register the purchase. /// Auto syncing of purchases is enabled by default. @property (nonatomic, readonly) BOOL autoSyncPurchases; +/// A property meant for apps that do their own entitlements computation, separated from RevenueCat. +/// It: +/// important: +/// This is a dangerous setting and should only be used if you intend to do your own entitlement +/// granting, separate from RevenueCat. +///
    +///
  • +/// disables automatic CustomerInfo cache updates +///
  • +///
  • +/// disables Purchases/logOut() and Purchases/logOut(completion:) +///
  • +///
  • +/// disallows configuration of the SDK without an appUserID +///
  • +///
  • +/// disables automatic firing of the PurchasesDelegate’s CustomerInfo listener when setting the delegate. +/// It will only be called when the SDK posts a receipt or after customerInfo on device changes. +///
  • +///
+@property (nonatomic, readonly) BOOL customEntitlementComputation; - (nonnull instancetype)init; /// Only use a Dangerous Setting if suggested by RevenueCat support team. /// \param autoSyncPurchases Disable or enable subscribing to the StoreKit queue. @@ -809,6 +881,10 @@ SWIFT_CLASS_NAMED("DangerousSettings") /// automatically. /// - (nonnull instancetype)initWithAutoSyncPurchases:(BOOL)autoSyncPurchases; +/// note: +/// this is internal only so the only public way to enable customEntitlementComputation +/// is through Purchases/configureInCustomEntitlementsComputationMode(apiKey:appUserID:). +- (nonnull instancetype)initWithAutoSyncPurchases:(BOOL)autoSyncPurchases customEntitlementComputation:(BOOL)customEntitlementComputation; @end @@ -816,6 +892,7 @@ SWIFT_CLASS_NAMED("DangerousSettings") enum RCPeriodType : NSInteger; enum RCStore : NSInteger; enum RCPurchaseOwnershipType : NSInteger; +enum RCVerificationResult : NSInteger; /// The EntitlementInfo object gives you access to all of the information about the status of a user entitlement. SWIFT_CLASS_NAMED("EntitlementInfo") @@ -866,6 +943,7 @@ SWIFT_CLASS_NAMED("EntitlementInfo") /// or shared to them by a family member. This can be useful for onboarding users who have had /// an entitlement shared with them, but might not be entirely aware of the benefits they now have. @property (nonatomic, readonly) enum RCPurchaseOwnershipType ownershipType; +@property (nonatomic, readonly) enum RCVerificationResult verification SWIFT_AVAILABILITY(watchos,introduced=6.2) SWIFT_AVAILABILITY(tvos,introduced=13.0) SWIFT_AVAILABILITY(macos,introduced=10.15) SWIFT_AVAILABILITY(ios,introduced=13.0); @property (nonatomic, readonly, copy) NSDictionary * _Nonnull rawData; @property (nonatomic, readonly, copy) NSString * _Nonnull description; - (BOOL)isEqual:(id _Nullable)object SWIFT_WARN_UNUSED_RESULT; @@ -911,6 +989,7 @@ SWIFT_CLASS_NAMED("EntitlementInfos") /// entitlementInfos["pro_entitlement_id"]. @property (nonatomic, readonly, copy) NSDictionary * _Nonnull all; - (RCEntitlementInfo * _Nullable)objectForKeyedSubscript:(NSString * _Nonnull)key SWIFT_WARN_UNUSED_RESULT; +@property (nonatomic, readonly) enum RCVerificationResult verification SWIFT_AVAILABILITY(watchos,introduced=6.2) SWIFT_AVAILABILITY(tvos,introduced=13.0) SWIFT_AVAILABILITY(macos,introduced=10.15) SWIFT_AVAILABILITY(ios,introduced=13.0); @property (nonatomic, readonly, copy) NSString * _Nonnull description; - (BOOL)isEqual:(id _Nullable)object SWIFT_WARN_UNUSED_RESULT; - (nonnull instancetype)init SWIFT_UNAVAILABLE; @@ -991,6 +1070,8 @@ typedef SWIFT_ENUM_NAMED(NSInteger, RCPurchasesErrorCode, "ErrorCode", open) { RCAPIEndpointBlocked SWIFT_COMPILE_NAME("apiEndpointBlockedError") = 33, RCInvalidPromotionalOfferError SWIFT_COMPILE_NAME("invalidPromotionalOfferError") = 34, RCOfflineConnectionError SWIFT_COMPILE_NAME("offlineConnectionError") = 35, + RCFeatureNotAvailableInCustomEntitlementsComputationMode SWIFT_COMPILE_NAME("featureNotAvailableInCustomEntitlementsComputationMode") = 36, + RCSignatureVerificationFailed SWIFT_COMPILE_NAME("signatureVerificationFailed") = 37, }; static NSString * _Nonnull const RCPurchasesErrorCodeDomain = @"RevenueCat.ErrorCode"; @@ -1043,6 +1124,12 @@ SWIFT_CLASS("_TtC10RevenueCat21GetOfferingsOperation") +SWIFT_CLASS("_TtC10RevenueCat37GetProductEntitlementMappingOperation") +@interface GetProductEntitlementMappingOperation : CacheableNetworkOperation +@end + + + enum RCIntroEligibilityStatus : NSInteger; @@ -1058,11 +1145,11 @@ SWIFT_CLASS_NAMED("IntroEligibility") + @interface RCIntroEligibility (SWIFT_EXTENSION(RevenueCat)) @property (nonatomic, readonly, copy) NSString * _Nonnull description; @end - /// Enum of different possible states for intro price eligibility status. ///
    ///
  • @@ -1114,7 +1201,6 @@ typedef SWIFT_ENUM_NAMED(NSInteger, RCLogLevel, "LogLevel", open) { - /// Information that represents a non-subscription purchase made by a user. SWIFT_CLASS_NAMED("NonSubscriptionTransaction") @interface RCNonSubscriptionTransaction : NSObject @@ -1751,13 +1837,19 @@ SWIFT_PROTOCOL_NAMED("PurchasesType") /// important: /// Call this method when a user has decided to purchase a product. /// Only call this in direct response to user input. -/// From here Purchases will handle the purchase with StoreKit and call the PurchaseCompletedBlock. +/// From here Purchases will handle the purchase with StoreKit and return PurchaseResultData. /// note: -/// You do not need to finish the transaction yourself in the completion callback, Purchases will +/// You do not need to finish the transaction yourself after this, Purchases will /// handle this for you. -/// If the user cancelled, userCancelled will be true. /// \param product The StoreProduct the user intends to purchase. /// +/// +/// throws: +/// An error of type ErrorCode is thrown if a failure occurs while purchasing +/// +/// returns: +/// A tuple with StoreTransaction and a CustomerInfo if the purchase was successful. +/// If the user cancelled the purchase, userCancelled will be true. - (void)purchaseWithProduct:(RCStoreProduct * _Nonnull)product completionHandler:(void (^ _Nonnull)(RCStoreTransaction * _Nullable, RCCustomerInfo * _Nullable, BOOL, NSError * _Nullable))completionHandler SWIFT_AVAILABILITY(watchos,introduced=6.2) SWIFT_AVAILABILITY(tvos,introduced=13.0) SWIFT_AVAILABILITY(macos,introduced=10.15) SWIFT_AVAILABILITY(ios,introduced=13.0); /// Initiates a purchase of a Package. /// important: @@ -1779,14 +1871,74 @@ SWIFT_PROTOCOL_NAMED("PurchasesType") /// important: /// Call this method when a user has decided to purchase a product. /// Only call this in direct response to user input. -/// From here Purchases will handle the purchase with StoreKit and call the PurchaseCompletedBlock. +/// From here Purchases will handle the purchase with StoreKit and return PurchaseResultData. /// note: -/// You do not need to finish the transaction yourself in the completion callback, Purchases will +/// You do not need to finish the transaction yourself after this, Purchases will /// handle this for you. -/// If the user cancelled, userCancelled will be true. /// \param package The Package the user intends to purchase /// +/// +/// throws: +/// An error of type ErrorCode is thrown if a failure occurs while purchasing +/// +/// returns: +/// A tuple with StoreTransaction and a CustomerInfo if the purchase was successful. +/// If the user cancelled the purchase, userCancelled will be true. - (void)purchaseWithPackage:(RCPackage * _Nonnull)package completionHandler:(void (^ _Nonnull)(RCStoreTransaction * _Nullable, RCCustomerInfo * _Nullable, BOOL, NSError * _Nullable))completionHandler SWIFT_AVAILABILITY(watchos,introduced=6.2) SWIFT_AVAILABILITY(tvos,introduced=13.0) SWIFT_AVAILABILITY(macos,introduced=10.15) SWIFT_AVAILABILITY(ios,introduced=13.0); +/// This method will post all purchases associated with the current App Store account to RevenueCat and become +/// associated with the current appUserID. If the receipt is being used by an existing user, the current +/// appUserID will be aliased together with the appUserID of the existing user. +/// Going forward, either appUserID will be able to reference the same user. +/// You shouldn’t use this method if you have your own account system. In that case “restoration” is provided +/// by your app passing the same appUserID used to purchase originally. +/// note: +/// This may force your users to enter the App Store password so should only be performed on request of +/// the user. Typically with a button in settings or near your purchase UI. Use +/// Purchases/syncPurchases(completion:) if you need to restore transactions programmatically. +/// warning: +/// Receiving a CustomerInfo instead of an error does not imply that the user has any +/// entitlements, simply that the process was successful. You must verify the CustomerInfo/entitlements +/// to confirm that they are active. +- (void)restorePurchasesWithCompletion:(void (^ _Nullable)(RCCustomerInfo * _Nullable, NSError * _Nullable))completion; +/// This method will post all purchases associated with the current App Store account to RevenueCat and become +/// associated with the current appUserID. If the receipt is being used by an existing user, the current +/// appUserID will be aliased together with the appUserID of the existing user. +/// Going forward, either appUserID will be able to reference the same user. +/// You shouldn’t use this method if you have your own account system. In that case “restoration” is provided +/// by your app passing the same appUserID used to purchase originally. +/// note: +/// This may force your users to enter the App Store password so should only be performed on request of +/// the user. Typically with a button in settings or near your purchase UI. Use +/// Purchases/syncPurchases(completion:) if you need to restore transactions programmatically. +/// warning: +/// Receiving a CustomerInfo instead of an error does not imply that the user has any +/// entitlements, simply that the process was successful. You must verify the CustomerInfo/entitlements +/// to confirm that they are active. +- (void)restorePurchasesWithCompletionHandler:(void (^ _Nonnull)(RCCustomerInfo * _Nullable, NSError * _Nullable))completionHandler SWIFT_AVAILABILITY(watchos,introduced=6.2) SWIFT_AVAILABILITY(tvos,introduced=13.0) SWIFT_AVAILABILITY(macos,introduced=10.15) SWIFT_AVAILABILITY(ios,introduced=13.0); +/// This method will post all purchases associated with the current App Store account to RevenueCat and +/// become associated with the current appUserID. +/// If the receipt is being used by an existing user, the current appUserID will be aliased together with +/// the appUserID of the existing user. +/// Going forward, either appUserID will be able to reference the same user. +/// warning: +/// This function should only be called if you’re not calling any purchase method. +/// note: +/// This method will not trigger a login prompt from App Store. However, if the receipt currently +/// on the device does not contain subscriptions, but the user has made subscription purchases, this method +/// won’t be able to restore them. Use Purchases/restorePurchases(completion:) to cover those cases. +- (void)syncPurchasesWithCompletion:(void (^ _Nullable)(RCCustomerInfo * _Nullable, NSError * _Nullable))completion; +/// This method will post all purchases associated with the current App Store account to RevenueCat and +/// become associated with the current appUserID. +/// If the receipt is being used by an existing user, the current appUserID will be aliased together with +/// the appUserID of the existing user. +/// Going forward, either appUserID will be able to reference the same user. +/// warning: +/// This function should only be called if you’re not calling any purchase method. +/// note: +/// This method will not trigger a login prompt from App Store. However, if the receipt currently +/// on the device does not contain subscriptions, but the user has made subscription purchases, this method +/// won’t be able to restore them. Use Purchases/restorePurchases(completion:) to cover those cases. +- (void)syncPurchasesWithCompletionHandler:(void (^ _Nonnull)(RCCustomerInfo * _Nullable, NSError * _Nullable))completionHandler SWIFT_AVAILABILITY(watchos,introduced=6.2) SWIFT_AVAILABILITY(tvos,introduced=13.0) SWIFT_AVAILABILITY(macos,introduced=10.15) SWIFT_AVAILABILITY(ios,introduced=13.0); /// Initiates a purchase of a StoreProduct with a PromotionalOffer. /// Use this function if you are not using the Offerings system to purchase a StoreProduct with an /// applied PromotionalOffer. @@ -1825,15 +1977,21 @@ SWIFT_PROTOCOL_NAMED("PurchasesType") /// If you are using the Offerings system, use Purchases/purchase(package:promotionalOffer:completion:) instead. /// Call this method when a user has decided to purchase a product with an applied discount. /// Only call this in direct response to user input. -/// From here Purchases will handle the purchase with StoreKit and call the PurchaseCompletedBlock. +/// From here Purchases will handle the purchase with StoreKit and return PurchaseResultData. /// note: -/// You do not need to finish the transaction yourself in the completion callback, Purchases will handle +/// You do not need to finish the transaction yourself after this, Purchases will handle /// this for you. -/// If the user cancelled, userCancelled will be true. /// \param product The StoreProduct the user intends to purchase /// /// \param promotionalOffer The PromotionalOffer to apply to the purchase /// +/// +/// throws: +/// An error of type ErrorCode is thrown if a failure occurs while purchasing +/// +/// returns: +/// A tuple with StoreTransaction and a CustomerInfo if the purchase was successful. +/// If the user cancelled the purchase, userCancelled will be true. - (void)purchaseWithProduct:(RCStoreProduct * _Nonnull)product promotionalOffer:(RCPromotionalOffer * _Nonnull)promotionalOffer completionHandler:(void (^ _Nonnull)(RCStoreTransaction * _Nullable, RCCustomerInfo * _Nullable, BOOL, NSError * _Nullable))completionHandler SWIFT_AVAILABILITY(watchos,introduced=6.2) SWIFT_AVAILABILITY(tvos,introduced=13.0) SWIFT_AVAILABILITY(macos,introduced=10.15) SWIFT_AVAILABILITY(ios,introduced=13.0); /// Purchase the passed Package. /// Call this method when a user has decided to purchase a product with an applied discount. Only call this in @@ -1854,63 +2012,23 @@ SWIFT_PROTOCOL_NAMED("PurchasesType") - (void)purchasePackage:(RCPackage * _Nonnull)package withPromotionalOffer:(RCPromotionalOffer * _Nonnull)promotionalOffer completion:(void (^ _Nonnull)(RCStoreTransaction * _Nullable, RCCustomerInfo * _Nullable, NSError * _Nullable, BOOL))completion SWIFT_AVAILABILITY(tvos,introduced=12.2) SWIFT_AVAILABILITY(maccatalyst,introduced=13.0) SWIFT_AVAILABILITY(watchos,introduced=6.2) SWIFT_AVAILABILITY(macos,introduced=10.14.4) SWIFT_AVAILABILITY(ios,introduced=12.2); /// Purchase the passed Package. /// Call this method when a user has decided to purchase a product with an applied discount. Only call this in -/// direct response to user input. From here Purchases will handle the purchase with StoreKit and call the -/// PurchaseCompletedBlock. +/// direct response to user input. From here Purchases will handle the purchase with StoreKit and return +/// PurchaseResultData. /// note: -/// You do not need to finish the transaction yourself in the completion callback, Purchases will handle +/// You do not need to finish the transaction yourself after this, Purchases will handle /// this for you. -/// If the user cancelled, userCancelled will be true. /// \param package The Package the user intends to purchase /// /// \param promotionalOffer The PromotionalOffer to apply to the purchase /// +/// +/// throws: +/// An error of type ErrorCode is thrown if a failure occurs while purchasing +/// +/// returns: +/// A tuple with StoreTransaction and a CustomerInfo if the purchase was successful. +/// If the user cancelled the purchase, userCancelled will be true. - (void)purchaseWithPackage:(RCPackage * _Nonnull)package promotionalOffer:(RCPromotionalOffer * _Nonnull)promotionalOffer completionHandler:(void (^ _Nonnull)(RCStoreTransaction * _Nullable, RCCustomerInfo * _Nullable, BOOL, NSError * _Nullable))completionHandler SWIFT_AVAILABILITY(watchos,introduced=6.2) SWIFT_AVAILABILITY(tvos,introduced=13.0) SWIFT_AVAILABILITY(macos,introduced=10.15) SWIFT_AVAILABILITY(ios,introduced=13.0); -/// This method will post all purchases associated with the current App Store account to RevenueCat and become -/// associated with the current appUserID. If the receipt is being used by an existing user, the current -/// appUserID will be aliased together with the appUserID of the existing user. -/// Going forward, either appUserID will be able to reference the same user. -/// You shouldn’t use this method if you have your own account system. In that case “restoration” is provided -/// by your app passing the same appUserID used to purchase originally. -/// note: -/// This may force your users to enter the App Store password so should only be performed on request of -/// the user. Typically with a button in settings or near your purchase UI. Use -/// Purchases/syncPurchases(completion:) if you need to restore transactions programmatically. -- (void)restorePurchasesWithCompletion:(void (^ _Nullable)(RCCustomerInfo * _Nullable, NSError * _Nullable))completion; -/// This method will post all purchases associated with the current App Store account to RevenueCat and become -/// associated with the current appUserID. If the receipt is being used by an existing user, the current -/// appUserID will be aliased together with the appUserID of the existing user. -/// Going forward, either appUserID will be able to reference the same user. -/// You shouldn’t use this method if you have your own account system. In that case “restoration” is provided -/// by your app passing the same appUserID used to purchase originally. -/// note: -/// This may force your users to enter the App Store password so should only be performed on request of -/// the user. Typically with a button in settings or near your purchase UI. Use -/// Purchases/syncPurchases(completion:) if you need to restore transactions programmatically. -- (void)restorePurchasesWithCompletionHandler:(void (^ _Nonnull)(RCCustomerInfo * _Nullable, NSError * _Nullable))completionHandler SWIFT_AVAILABILITY(watchos,introduced=6.2) SWIFT_AVAILABILITY(tvos,introduced=13.0) SWIFT_AVAILABILITY(macos,introduced=10.15) SWIFT_AVAILABILITY(ios,introduced=13.0); -/// This method will post all purchases associated with the current App Store account to RevenueCat and -/// become associated with the current appUserID. -/// If the receipt is being used by an existing user, the current appUserID will be aliased together with -/// the appUserID of the existing user. -/// Going forward, either appUserID will be able to reference the same user. -/// warning: -/// This function should only be called if you’re not calling any purchase method. -/// note: -/// This method will not trigger a login prompt from App Store. However, if the receipt currently -/// on the device does not contain subscriptions, but the user has made subscription purchases, this method -/// won’t be able to restore them. Use Purchases/restorePurchases(completion:) to cover those cases. -- (void)syncPurchasesWithCompletion:(void (^ _Nullable)(RCCustomerInfo * _Nullable, NSError * _Nullable))completion; -/// This method will post all purchases associated with the current App Store account to RevenueCat and -/// become associated with the current appUserID. -/// If the receipt is being used by an existing user, the current appUserID will be aliased together with -/// the appUserID of the existing user. -/// Going forward, either appUserID will be able to reference the same user. -/// warning: -/// This function should only be called if you’re not calling any purchase method. -/// note: -/// This method will not trigger a login prompt from App Store. However, if the receipt currently -/// on the device does not contain subscriptions, but the user has made subscription purchases, this method -/// won’t be able to restore them. Use Purchases/restorePurchases(completion:) to cover those cases. -- (void)syncPurchasesWithCompletionHandler:(void (^ _Nonnull)(RCCustomerInfo * _Nullable, NSError * _Nullable))completionHandler SWIFT_AVAILABILITY(watchos,introduced=6.2) SWIFT_AVAILABILITY(tvos,introduced=13.0) SWIFT_AVAILABILITY(macos,introduced=10.15) SWIFT_AVAILABILITY(ios,introduced=13.0); /// Computes whether or not a user is eligible for the introductory pricing period of a given product. /// You should use this method to determine whether or not you show the user the normal product price or /// the introductory price. This also applies to trials (trials are considered a type of introductory pricing). @@ -2253,7 +2371,6 @@ SWIFT_CLASS_PROPERTY(@property (nonatomic, class, readonly, copy) NSString * _No - SWIFT_PROTOCOL("_TtP10RevenueCat29PurchasesOrchestratorDelegate_") @protocol PurchasesOrchestratorDelegate - (void)readyForPromotedProduct:(RCStoreProduct * _Nonnull)product purchase:(void (^ _Nonnull)(void (^ _Nonnull)(RCStoreTransaction * _Nullable, RCCustomerInfo * _Nullable, NSError * _Nullable, BOOL)))startPurchase; @@ -2280,6 +2397,8 @@ SWIFT_PROTOCOL("_TtP10RevenueCat29PurchasesOrchestratorDelegate_") @end + + @interface RCPurchases (SWIFT_EXTENSION(RevenueCat)) SWIFT_CLASS_PROPERTY(@property (nonatomic, class, strong) RCPlatformInfo * _Nullable platformInfo;) + (RCPlatformInfo * _Nullable)platformInfo SWIFT_WARN_UNUSED_RESULT; @@ -2296,6 +2415,14 @@ SWIFT_CLASS_NAMED("PlatformInfo") +@interface RCPurchases (SWIFT_EXTENSION(RevenueCat)) +- (void)logIn:(NSString * _Nonnull)appUserID completion:(void (^ _Nonnull)(RCCustomerInfo * _Nullable, BOOL, NSError * _Nullable))completion; +- (void)logIn:(NSString * _Nonnull)appUserID completionHandler:(void (^ _Nonnull)(RCCustomerInfo * _Nullable, BOOL, NSError * _Nullable))completionHandler SWIFT_AVAILABILITY(watchos,introduced=6.2) SWIFT_AVAILABILITY(tvos,introduced=13.0) SWIFT_AVAILABILITY(macos,introduced=10.15) SWIFT_AVAILABILITY(ios,introduced=13.0); +- (void)logOutWithCompletion:(void (^ _Nullable)(RCCustomerInfo * _Nullable, NSError * _Nullable))completion; +- (void)logOutWithCompletionHandler:(void (^ _Nonnull)(RCCustomerInfo * _Nullable, NSError * _Nullable))completionHandler SWIFT_AVAILABILITY(watchos,introduced=6.2) SWIFT_AVAILABILITY(tvos,introduced=13.0) SWIFT_AVAILABILITY(macos,introduced=10.15) SWIFT_AVAILABILITY(ios,introduced=13.0); +@end + + @interface RCPurchases (SWIFT_EXTENSION(RevenueCat)) /// Configures an instance of the Purchases SDK with a specified Configuration. /// The instance will be set as a singleton. @@ -2306,7 +2433,6 @@ SWIFT_CLASS_NAMED("PlatformInfo") /// \code /// Purchases.configure( /// with: Configuration.Builder(withAPIKey: Constants.apiKey) -/// .with(usesStoreKit2IfAvailable: true) /// .with(observerMode: false) /// .with(appUserID: "") /// .build() @@ -2327,7 +2453,6 @@ SWIFT_CLASS_NAMED("PlatformInfo") /// \code /// Purchases.configure( /// with: .init(withAPIKey: Constants.apiKey) -/// .with(usesStoreKit2IfAvailable: true) /// .with(observerMode: false) /// .with(appUserID: "") /// ) @@ -2416,6 +2541,14 @@ SWIFT_CLASS_PROPERTY(@property (nonatomic, class) BOOL debugLogsEnabled SWIFT_DE @end +@interface RCPurchases (SWIFT_EXTENSION(RevenueCat)) +@property (nonatomic, readonly, copy) NSString * _Nonnull appUserID; +@property (nonatomic, readonly) BOOL isAnonymous; +- (void)getOfferingsWithCompletion:(void (^ _Nonnull)(RCOfferings * _Nullable, NSError * _Nullable))completion; +- (void)offeringsWithCompletionHandler:(void (^ _Nonnull)(RCOfferings * _Nullable, NSError * _Nullable))completionHandler SWIFT_AVAILABILITY(watchos,introduced=6.2) SWIFT_AVAILABILITY(tvos,introduced=13.0) SWIFT_AVAILABILITY(macos,introduced=10.15) SWIFT_AVAILABILITY(ios,introduced=13.0); +@end + + @interface RCPurchases (SWIFT_EXTENSION(RevenueCat)) + (RCPurchases * _Nonnull)configureWithAPIKey:(NSString * _Nonnull)apiKey appUserID:(NSString * _Nullable)appUserID observerMode:(BOOL)observerMode userDefaults:(NSUserDefaults * _Nullable)userDefaults SWIFT_AVAILABILITY(maccatalyst,deprecated=1,message="'configure' has been renamed to 'configure(with:)'") SWIFT_AVAILABILITY(macos,deprecated=1,message="'configure' has been renamed to 'configure(with:)'") SWIFT_AVAILABILITY(watchos,deprecated=1,message="'configure' has been renamed to 'configure(with:)'") SWIFT_AVAILABILITY(tvos,deprecated=1,message="'configure' has been renamed to 'configure(with:)'") SWIFT_AVAILABILITY(ios,deprecated=1,message="'configure' has been renamed to 'configure(with:)'"); + (RCPurchases * _Nonnull)configureWithAPIKey:(NSString * _Nonnull)apiKey appUserID:(NSString * _Nullable)appUserID observerMode:(BOOL)observerMode userDefaults:(NSUserDefaults * _Nullable)userDefaults useStoreKit2IfAvailable:(BOOL)useStoreKit2IfAvailable SWIFT_AVAILABILITY(maccatalyst,deprecated=1,message="'configure' has been renamed to 'configure(with:)'") SWIFT_AVAILABILITY(macos,deprecated=1,message="'configure' has been renamed to 'configure(with:)'") SWIFT_AVAILABILITY(watchos,deprecated=1,message="'configure' has been renamed to 'configure(with:)'") SWIFT_AVAILABILITY(tvos,deprecated=1,message="'configure' has been renamed to 'configure(with:)'") SWIFT_AVAILABILITY(ios,deprecated=1,message="'configure' has been renamed to 'configure(with:)'"); @@ -2429,18 +2562,6 @@ SWIFT_CLASS_PROPERTY(@property (nonatomic, class) BOOL automaticAppleSearchAdsAt -@interface RCPurchases (SWIFT_EXTENSION(RevenueCat)) -@property (nonatomic, readonly, copy) NSString * _Nonnull appUserID; -@property (nonatomic, readonly) BOOL isAnonymous; -- (void)logIn:(NSString * _Nonnull)appUserID completion:(void (^ _Nonnull)(RCCustomerInfo * _Nullable, BOOL, NSError * _Nullable))completion; -- (void)logIn:(NSString * _Nonnull)appUserID completionHandler:(void (^ _Nonnull)(RCCustomerInfo * _Nullable, BOOL, NSError * _Nullable))completionHandler SWIFT_AVAILABILITY(watchos,introduced=6.2) SWIFT_AVAILABILITY(tvos,introduced=13.0) SWIFT_AVAILABILITY(macos,introduced=10.15) SWIFT_AVAILABILITY(ios,introduced=13.0); -- (void)logOutWithCompletion:(void (^ _Nullable)(RCCustomerInfo * _Nullable, NSError * _Nullable))completion; -- (void)logOutWithCompletionHandler:(void (^ _Nonnull)(RCCustomerInfo * _Nullable, NSError * _Nullable))completionHandler SWIFT_AVAILABILITY(watchos,introduced=6.2) SWIFT_AVAILABILITY(tvos,introduced=13.0) SWIFT_AVAILABILITY(macos,introduced=10.15) SWIFT_AVAILABILITY(ios,introduced=13.0); -- (void)getOfferingsWithCompletion:(void (^ _Nonnull)(RCOfferings * _Nullable, NSError * _Nullable))completion; -- (void)offeringsWithCompletionHandler:(void (^ _Nonnull)(RCOfferings * _Nullable, NSError * _Nullable))completionHandler SWIFT_AVAILABILITY(watchos,introduced=6.2) SWIFT_AVAILABILITY(tvos,introduced=13.0) SWIFT_AVAILABILITY(macos,introduced=10.15) SWIFT_AVAILABILITY(ios,introduced=13.0); -@end - - @interface RCPurchases (SWIFT_EXTENSION(RevenueCat)) - (void)collectDeviceIdentifiers SWIFT_AVAILABILITY(maccatalyst,deprecated=0.0.1,message="'collectDeviceIdentifiers' has been renamed to 'attribution.collectDeviceIdentifiers()'") SWIFT_AVAILABILITY(macos,deprecated=0.0.1,message="'collectDeviceIdentifiers' has been renamed to 'attribution.collectDeviceIdentifiers()'") SWIFT_AVAILABILITY(watchos,deprecated=0.0.1,message="'collectDeviceIdentifiers' has been renamed to 'attribution.collectDeviceIdentifiers()'") SWIFT_AVAILABILITY(tvos,deprecated=0.0.1,message="'collectDeviceIdentifiers' has been renamed to 'attribution.collectDeviceIdentifiers()'") SWIFT_AVAILABILITY(ios,deprecated=0.0.1,message="'collectDeviceIdentifiers' has been renamed to 'attribution.collectDeviceIdentifiers()'"); @@ -2643,14 +2764,14 @@ SWIFT_CLASS_PROPERTY(@property (nonatomic, class) BOOL automaticAppleSearchAdsAt - (void)purchaseWithProduct:(RCStoreProduct * _Nonnull)product completionHandler:(void (^ _Nonnull)(RCStoreTransaction * _Nullable, RCCustomerInfo * _Nullable, BOOL, NSError * _Nullable))completionHandler SWIFT_AVAILABILITY(watchos,introduced=6.2) SWIFT_AVAILABILITY(tvos,introduced=13.0) SWIFT_AVAILABILITY(macos,introduced=10.15) SWIFT_AVAILABILITY(ios,introduced=13.0); - (void)purchasePackage:(RCPackage * _Nonnull)package withCompletion:(void (^ _Nonnull)(RCStoreTransaction * _Nullable, RCCustomerInfo * _Nullable, NSError * _Nullable, BOOL))completion; - (void)purchaseWithPackage:(RCPackage * _Nonnull)package completionHandler:(void (^ _Nonnull)(RCStoreTransaction * _Nullable, RCCustomerInfo * _Nullable, BOOL, NSError * _Nullable))completionHandler SWIFT_AVAILABILITY(watchos,introduced=6.2) SWIFT_AVAILABILITY(tvos,introduced=13.0) SWIFT_AVAILABILITY(macos,introduced=10.15) SWIFT_AVAILABILITY(ios,introduced=13.0); -- (void)purchaseProduct:(RCStoreProduct * _Nonnull)product withPromotionalOffer:(RCPromotionalOffer * _Nonnull)promotionalOffer completion:(void (^ _Nonnull)(RCStoreTransaction * _Nullable, RCCustomerInfo * _Nullable, NSError * _Nullable, BOOL))completion SWIFT_AVAILABILITY(tvos,introduced=12.2) SWIFT_AVAILABILITY(maccatalyst,introduced=13.0) SWIFT_AVAILABILITY(watchos,introduced=6.2) SWIFT_AVAILABILITY(macos,introduced=10.14.4) SWIFT_AVAILABILITY(ios,introduced=12.2); -- (void)purchaseWithProduct:(RCStoreProduct * _Nonnull)product promotionalOffer:(RCPromotionalOffer * _Nonnull)promotionalOffer completionHandler:(void (^ _Nonnull)(RCStoreTransaction * _Nullable, RCCustomerInfo * _Nullable, BOOL, NSError * _Nullable))completionHandler SWIFT_AVAILABILITY(watchos,introduced=6.2) SWIFT_AVAILABILITY(tvos,introduced=13.0) SWIFT_AVAILABILITY(macos,introduced=10.15) SWIFT_AVAILABILITY(ios,introduced=13.0); -- (void)purchasePackage:(RCPackage * _Nonnull)package withPromotionalOffer:(RCPromotionalOffer * _Nonnull)promotionalOffer completion:(void (^ _Nonnull)(RCStoreTransaction * _Nullable, RCCustomerInfo * _Nullable, NSError * _Nullable, BOOL))completion SWIFT_AVAILABILITY(tvos,introduced=12.2) SWIFT_AVAILABILITY(maccatalyst,introduced=13.0) SWIFT_AVAILABILITY(watchos,introduced=6.2) SWIFT_AVAILABILITY(macos,introduced=10.14.4) SWIFT_AVAILABILITY(ios,introduced=12.2); -- (void)purchaseWithPackage:(RCPackage * _Nonnull)package promotionalOffer:(RCPromotionalOffer * _Nonnull)promotionalOffer completionHandler:(void (^ _Nonnull)(RCStoreTransaction * _Nullable, RCCustomerInfo * _Nullable, BOOL, NSError * _Nullable))completionHandler SWIFT_AVAILABILITY(watchos,introduced=6.2) SWIFT_AVAILABILITY(tvos,introduced=13.0) SWIFT_AVAILABILITY(macos,introduced=10.15) SWIFT_AVAILABILITY(ios,introduced=13.0); - (void)syncPurchasesWithCompletion:(void (^ _Nullable)(RCCustomerInfo * _Nullable, NSError * _Nullable))completion; - (void)syncPurchasesWithCompletionHandler:(void (^ _Nonnull)(RCCustomerInfo * _Nullable, NSError * _Nullable))completionHandler SWIFT_AVAILABILITY(watchos,introduced=6.2) SWIFT_AVAILABILITY(tvos,introduced=13.0) SWIFT_AVAILABILITY(macos,introduced=10.15) SWIFT_AVAILABILITY(ios,introduced=13.0); - (void)restorePurchasesWithCompletion:(void (^ _Nullable)(RCCustomerInfo * _Nullable, NSError * _Nullable))completion; - (void)restorePurchasesWithCompletionHandler:(void (^ _Nonnull)(RCCustomerInfo * _Nullable, NSError * _Nullable))completionHandler SWIFT_AVAILABILITY(watchos,introduced=6.2) SWIFT_AVAILABILITY(tvos,introduced=13.0) SWIFT_AVAILABILITY(macos,introduced=10.15) SWIFT_AVAILABILITY(ios,introduced=13.0); +- (void)purchaseProduct:(RCStoreProduct * _Nonnull)product withPromotionalOffer:(RCPromotionalOffer * _Nonnull)promotionalOffer completion:(void (^ _Nonnull)(RCStoreTransaction * _Nullable, RCCustomerInfo * _Nullable, NSError * _Nullable, BOOL))completion SWIFT_AVAILABILITY(tvos,introduced=12.2) SWIFT_AVAILABILITY(maccatalyst,introduced=13.0) SWIFT_AVAILABILITY(watchos,introduced=6.2) SWIFT_AVAILABILITY(macos,introduced=10.14.4) SWIFT_AVAILABILITY(ios,introduced=12.2); +- (void)purchaseWithProduct:(RCStoreProduct * _Nonnull)product promotionalOffer:(RCPromotionalOffer * _Nonnull)promotionalOffer completionHandler:(void (^ _Nonnull)(RCStoreTransaction * _Nullable, RCCustomerInfo * _Nullable, BOOL, NSError * _Nullable))completionHandler SWIFT_AVAILABILITY(watchos,introduced=6.2) SWIFT_AVAILABILITY(tvos,introduced=13.0) SWIFT_AVAILABILITY(macos,introduced=10.15) SWIFT_AVAILABILITY(ios,introduced=13.0); +- (void)purchasePackage:(RCPackage * _Nonnull)package withPromotionalOffer:(RCPromotionalOffer * _Nonnull)promotionalOffer completion:(void (^ _Nonnull)(RCStoreTransaction * _Nullable, RCCustomerInfo * _Nullable, NSError * _Nullable, BOOL))completion SWIFT_AVAILABILITY(tvos,introduced=12.2) SWIFT_AVAILABILITY(maccatalyst,introduced=13.0) SWIFT_AVAILABILITY(watchos,introduced=6.2) SWIFT_AVAILABILITY(macos,introduced=10.14.4) SWIFT_AVAILABILITY(ios,introduced=12.2); +- (void)purchaseWithPackage:(RCPackage * _Nonnull)package promotionalOffer:(RCPromotionalOffer * _Nonnull)promotionalOffer completionHandler:(void (^ _Nonnull)(RCStoreTransaction * _Nullable, RCCustomerInfo * _Nullable, BOOL, NSError * _Nullable))completionHandler SWIFT_AVAILABILITY(watchos,introduced=6.2) SWIFT_AVAILABILITY(tvos,introduced=13.0) SWIFT_AVAILABILITY(macos,introduced=10.15) SWIFT_AVAILABILITY(ios,introduced=13.0); - (void)checkTrialOrIntroDiscountEligibility:(NSArray * _Nonnull)productIdentifiers completion:(void (^ _Nonnull)(NSDictionary * _Nonnull))completion; - (void)checkTrialOrIntroDiscountEligibilityWithProductIdentifiers:(NSArray * _Nonnull)productIdentifiers completionHandler:(void (^ _Nonnull)(NSDictionary * _Nonnull))completionHandler SWIFT_AVAILABILITY(watchos,introduced=6.2) SWIFT_AVAILABILITY(macos,introduced=10.15) SWIFT_AVAILABILITY(tvos,introduced=13.0) SWIFT_AVAILABILITY(ios,introduced=13.0); - (void)checkTrialOrIntroDiscountEligibilityForProduct:(RCStoreProduct * _Nonnull)product completion:(void (^ _Nonnull)(enum RCIntroEligibilityStatus))completion; @@ -2743,7 +2864,6 @@ SWIFT_CLASS_PROPERTY(@property (nonatomic, class, readonly, strong, getter=defau @end - SWIFT_AVAILABILITY(watchos,introduced=6.2) SWIFT_AVAILABILITY(tvos,introduced=13.0) SWIFT_AVAILABILITY(macos,introduced=10.15) SWIFT_AVAILABILITY(ios,introduced=13.0) @interface RCPurchasesDiagnostics (SWIFT_EXTENSION(RevenueCat)) /// Perform tests to ensure SDK is configured correctly. @@ -2758,6 +2878,7 @@ SWIFT_AVAILABILITY(watchos,introduced=6.2) SWIFT_AVAILABILITY(tvos,introduced=13 + /// A type that can parse Apple receipts from a device. /// This implements parsing based on Apple’s documentation. /// To use this class you must access PurchasesReceiptParser/default: @@ -2781,7 +2902,6 @@ SWIFT_CLASS("_TtC10RevenueCat22PurchasesReceiptParser") - @interface PurchasesReceiptParser (SWIFT_EXTENSION(RevenueCat)) /// A default instance of PurchasesReceiptParser SWIFT_CLASS_PROPERTY(@property (nonatomic, class, readonly, strong, getter=default) PurchasesReceiptParser * _Nonnull default_;) @@ -2790,11 +2910,24 @@ SWIFT_CLASS_PROPERTY(@property (nonatomic, class, readonly, strong, getter=defau + SWIFT_CLASS("_TtC10RevenueCat21RCPurchasesErrorUtils") SWIFT_AVAILABILITY(maccatalyst,obsoleted=1) SWIFT_AVAILABILITY(macos,obsoleted=1) SWIFT_AVAILABILITY(watchos,obsoleted=1) SWIFT_AVAILABILITY(tvos,obsoleted=1) SWIFT_AVAILABILITY(ios,obsoleted=1) @interface RCPurchasesErrorUtils : NSObject - (nonnull instancetype)init OBJC_DESIGNATED_INITIALIZER; @end +@class NSURLSession; +@class NSURLSessionTask; +@class NSHTTPURLResponse; +@class NSURLRequest; + +/// Implementation of URLSessionTaskDelegate that logs when the task will perform a redirection. +SWIFT_CLASS("_TtC10RevenueCat29RedirectLoggerSessionDelegate") +@interface RedirectLoggerSessionDelegate : NSObject +- (void)URLSession:(NSURLSession * _Nonnull)session task:(NSURLSessionTask * _Nonnull)task willPerformHTTPRedirection:(NSHTTPURLResponse * _Nonnull)response newRequest:(NSURLRequest * _Nonnull)request completionHandler:(void (^ _Nonnull)(NSURLRequest * _Nullable))completionHandler; +- (nonnull instancetype)init OBJC_DESIGNATED_INITIALIZER; +@end + /// Status codes for refund requests. typedef SWIFT_ENUM_NAMED(NSInteger, RCRefundRequestStatus, "RefundRequestStatus", open) { /// User canceled submission of the refund request. @@ -2889,7 +3022,7 @@ SWIFT_CLASS_NAMED("StoreProduct") @property (nonatomic, readonly, copy) NSString * _Nullable currencyCode; @property (nonatomic, readonly, copy) NSString * _Nonnull localizedPriceString; @property (nonatomic, readonly, copy) NSString * _Nonnull productIdentifier; -@property (nonatomic, readonly) BOOL isFamilyShareable SWIFT_AVAILABILITY(watchos,introduced=8.0) SWIFT_AVAILABILITY(tvos,introduced=14.0) SWIFT_AVAILABILITY(macos,introduced=11.0) SWIFT_AVAILABILITY(ios,introduced=14.0); +@property (nonatomic, readonly) BOOL isFamilyShareable SWIFT_AVAILABILITY(watchos,introduced=7.0) SWIFT_AVAILABILITY(tvos,introduced=14.0) SWIFT_AVAILABILITY(macos,introduced=11.0) SWIFT_AVAILABILITY(ios,introduced=14.0); @property (nonatomic, readonly, copy) NSString * _Nullable subscriptionGroupIdentifier SWIFT_AVAILABILITY(watchos,introduced=6.2) SWIFT_AVAILABILITY(macos,introduced=10.14) SWIFT_AVAILABILITY(tvos,introduced=12.0) SWIFT_AVAILABILITY(maccatalyst,introduced=13.0) SWIFT_AVAILABILITY(ios,introduced=12.0); @property (nonatomic, readonly, strong) NSNumberFormatter * _Nullable priceFormatter; @property (nonatomic, readonly, strong) RCSubscriptionPeriod * _Nullable subscriptionPeriod SWIFT_AVAILABILITY(watchos,introduced=6.2) SWIFT_AVAILABILITY(tvos,introduced=11.2) SWIFT_AVAILABILITY(macos,introduced=10.13.2) SWIFT_AVAILABILITY(ios,introduced=11.2); @@ -3163,6 +3296,32 @@ SWIFT_CLASS_NAMED("Transaction") SWIFT_AVAILABILITY(macos,obsoleted=1,message="' +typedef SWIFT_ENUM_NAMED(NSInteger, RCVerificationResult, "VerificationResult", closed) { +/// No verification was done. +/// This can happen for multiple reasons: +///
      +///
    1. +/// Verification is not enabled in Configuration +///
    2. +///
    3. +/// Verification can’t be performed prior to iOS 13.0 +///
    4. +///
    + RCVerificationResultNotRequested = 0, +/// Entitlements were verified with our server. + RCVerificationResultVerified = 1, +/// Entitlements were created and verified on device through StoreKit 2. + RCVerificationResultVerifiedOnDevice = 3, +/// Entitlement verification failed, possibly due to a MiTM attack. +///

    Related Symbols

    +///
      +///
    • +/// ErrorCode/signatureVerificationFailed +///
    • +///
    + RCVerificationResultFailed = 2, +}; + #endif #if defined(__cplusplus) #endif diff --git a/Tests/UnitTests/Info.plist b/Tests/UnitTests/Info.plist index 6f4ce7247b..47b631fe0e 100644 --- a/Tests/UnitTests/Info.plist +++ b/Tests/UnitTests/Info.plist @@ -15,7 +15,7 @@ CFBundlePackageType $(PRODUCT_BUNDLE_PACKAGE_TYPE) CFBundleShortVersionString - 4.18.0 + 4.19.0 CFBundleVersion 1 diff --git a/Tests/UnitTestsHostApp/Info.plist b/Tests/UnitTestsHostApp/Info.plist index a3f567f9fc..e065cda931 100644 --- a/Tests/UnitTestsHostApp/Info.plist +++ b/Tests/UnitTestsHostApp/Info.plist @@ -17,7 +17,7 @@ CFBundlePackageType $(PRODUCT_BUNDLE_PACKAGE_TYPE) CFBundleShortVersionString - 4.18.0 + 4.19.0 CFBundleVersion 1 LSRequiresIPhoneOS diff --git a/scripts/docs/index.html b/scripts/docs/index.html index f12fb9ac35..65a7293a20 100644 --- a/scripts/docs/index.html +++ b/scripts/docs/index.html @@ -2,7 +2,7 @@ - + diff --git a/scripts/docs/v4_api_migration_guide.html b/scripts/docs/v4_api_migration_guide.html index 67507906b6..7e37d07385 100644 --- a/scripts/docs/v4_api_migration_guide.html +++ b/scripts/docs/v4_api_migration_guide.html @@ -2,7 +2,7 @@ - +