Skip to content

watchOS: fixed crash on single-target apps#1849

Merged
NachoSoto merged 2 commits into
mainfrom
watchos-extension-crash
Aug 19, 2022
Merged

watchOS: fixed crash on single-target apps#1849
NachoSoto merged 2 commits into
mainfrom
watchos-extension-crash

Conversation

@NachoSoto

@NachoSoto NachoSoto commented Aug 17, 2022

Copy link
Copy Markdown
Contributor

Fixes CSDK-416.

Starting on watchOS 9.0 (Xcode 14.0), watchOS apps can be configured as a single target.
Apps that run in this single-target crash when calling WKExtension.shared:

-[WKExtension init]:62: Critical failure. Simulating crash: Condition failed:"NO". WKExtension is part of WatchKit.framework and can only be instanciated from a WatchKit Extension

To prevent this, we can use WKApplication if it's available.

Fixes [CSDK-416].

Starting on `watchOS 9.0` (Xcode 14.0), `watchOS` apps can be configured as a single target.
Apps that run in this single-target crash when calling `WKExtension.shared`.

To prevent this, we can use `WKApplication` if it's available.
@NachoSoto NachoSoto requested a review from a team August 17, 2022 21:57
@tonidero

Copy link
Copy Markdown
Contributor

Looks like tests failed. Looks good otherwise.

@NachoSoto

Copy link
Copy Markdown
Contributor Author

Yeah it compiled locally with Xcode 14 and 13, I'll need to look into it.

@NachoSoto

Copy link
Copy Markdown
Contributor Author

Fixed. Turns out WKApplication is available on watchOS 7.0 and after, but it's not public API until Xcode 14.

#else
// Before Xcode 14, single-target extensions aren't supported (and WKApplication isn't available)
return WKExtension.shared().applicationState == .background
#endif

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Well this becomes slightly more complex, having to check for 2 things... But well, I don't have a better way to do it and it's not too bad.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yeah, but moving forward we'll only have one. Once Xcode 14 is mandatory, and when we drop anything before watchOS 7.0, there's really only one implementation :)

@NachoSoto NachoSoto merged commit 1d8b3c6 into main Aug 19, 2022
@NachoSoto NachoSoto deleted the watchos-extension-crash branch August 19, 2022 19:14
@vegaro vegaro mentioned this pull request Aug 26, 2022
kaushikpaperboat pushed a commit to Kiddopia/purchases-ios that referenced this pull request Sep 7, 2022
* rc-4.11.0: (964 commits)
  Update RevenueCat-Swift.h for version 4.11.0
  Version bump for 4.11.0
  skip if needed and adds automatic_release (RevenueCat#1870)
  Fixed crash on `async` SK1 cancelled purchase (RevenueCat#1869)
  Added `beginRefundRequest` overload with completion block (RevenueCat#1861)
  Release/4.10.3 (RevenueCat#1867)
  Update fastlane-plugin-revenuecat_internal and fix release-train job (RevenueCat#1866)
  fix typo in comment (RevenueCat#1863)
  Use Dangerfile repository (RevenueCat#1864)
  `CircleCI`: added job for building SDK with `SPM` (RevenueCat#1860)
  `TrialOrIntroPriceEligibilityChecker`: return `.noIntroOfferExists` if the product has no introductory offer (RevenueCat#1859)
  `Lock`: changed default implementation to use `NSLock` (RevenueCat#1819)
  `Offering: Sendable` conformance (RevenueCat#1826)
  `ReceiptParser: Sendable` conformance (RevenueCat#1825)
  `CustomerInfo: Sendable` conformance (RevenueCat#1824)
  Added `Collection.onlyElement` (RevenueCat#1857)
  README updates (RevenueCat#1856)
  `IntegrationTests`: actually fail test if tests aren't configured (RevenueCat#1855)
  `watchOS`: fixed crash on single-target apps (RevenueCat#1849)
  Prepare next version: 4.11.0-SNAPSHOT (RevenueCat#1854)
  ...

# Conflicts:
#	.circleci/config.yml
#	.jazzy.yaml
#	.version
#	CHANGELOG.latest.md
#	CHANGELOG.md
#	Gemfile.lock
#	Package.swift
#	Purchases/Attribution/RCAttributionFetcher.h
#	Purchases/Attribution/RCAttributionFetcher.m
#	Purchases/Attribution/RCAttributionPoster.m
#	Purchases/Attribution/RCAttributionTypeFactory.h
#	Purchases/Attribution/RCAttributionTypeFactory.m
#	Purchases/Caching/RCDeviceCache.m
#	Purchases/Misc/RCSystemInfo.m
#	Purchases/Networking/RCBackend.h
#	Purchases/Networking/RCBackend.m
#	Purchases/ProtectedExtensions/RCAttributionTypeFactory+Protected.h
#	Purchases/Public/RCPurchases.h
#	Purchases/Public/RCPurchases.m
#	Purchases/Public/RCPurchasesErrorUtils.h
#	Purchases/Public/RCPurchasesErrorUtils.m
#	Purchases/Purchasing/RCOfferingsFactory.m
#	Purchases/Purchasing/RCStoreKitRequestFetcher.h
#	Purchases/Purchasing/RCStoreKitRequestFetcher.m
#	Purchases/SubscriberAttributes/RCSubscriberAttributesManager.h
#	Purchases/SubscriberAttributes/RCSubscriberAttributesManager.m
#	PurchasesCoreSwift.podspec
#	PurchasesCoreSwift/Info.plist
#	PurchasesCoreSwift/Logging/Strings/AttributionStrings.swift
#	PurchasesCoreSwift/Logging/Strings/IdentityStrings.swift
#	PurchasesCoreSwift/Logging/Strings/OfferingStrings.swift
#	PurchasesCoreSwift/Misc/OperationDispatcher.swift
#	PurchasesCoreSwift/SubscriberAttributes/SpecialSubscriberAttributes.swift
#	PurchasesTests/Info.plist
#	PurchasesTests/Mocks/MockAttributionFetcher.swift
#	PurchasesTests/Mocks/MockAttributionTypeFactory.swift
#	PurchasesTests/Mocks/MockBackend.swift
#	PurchasesTests/Mocks/MockOfferingsFactory.swift
#	PurchasesTests/Mocks/MockRequestFetcher.swift
#	PurchasesTests/Networking/BackendTests.swift
#	PurchasesTests/Purchasing/OfferingsTests.swift
#	PurchasesTests/Purchasing/PurchasesTests.swift
#	PurchasesTests/SubscriberAttributes/PurchasesSubscriberAttributesTests.swift
#	RevenueCat.podspec
#	Sources/Info.plist
#	Tests/BackendIntegrationTestApp/Info.plist
#	Tests/BackendIntegrationTests/Info.plist
#	Tests/InstallationTests/CocoapodsInstallation/Gemfile.lock
#	Tests/InstallationTests/XcodeDirectInstallation/XcodeDirectInstallation.xcodeproj/project.pbxproj
#	Tests/UnitTests/Attribution/AttributionTypeFactoryTests.swift
#	Tests/UnitTests/Info.plist
#	Tests/UnitTests/Mocks/MockProductsRequest.swift
#	Tests/UnitTests/Mocks/MockSubscriberAttributesManager.swift
#	Tests/UnitTests/Purchasing/StoreKitRequestFetcherTests.swift
#	fastlane/Fastfile
NachoSoto added a commit that referenced this pull request Sep 8, 2022
…nd before watchOS 9.0

Follow up to #1849. That fix was incomplete, and still crashed when ran before watchOS 9.0.
Fixes [SDKONCALL-119] and [CSDK-416] and #1891.

There are 3 variables we need to take into account:
- `watchOS` version
- Xcode version
- Dual/single target app

| watchOS       | Xcode     | Dual / Single target | Before PR          | With this PR      |
|---------------|-----------|----------------------|--------------------|-------------------|
| < 9.0         | < 14.x    | Single               | `WKExtension`      | `WKExtension`     |
| < 9.0         | < 14.x    | Dual                 |  N/A               |     N/A           |
| < 9.0         | >= 14.0   | Single               | crash ⚠️    |  always `false`   |
| < 9.0         | >= 14.0   | Dual                 | `WKApplication`    | `WKExtension`     |
| >= 9.0        | >= 14.0   | Single               | `WKApplication`    | `WKApplication`   |
| >= 9.0        | >= 14.0   | Dual                 | `WKApplication`    | `WKApplication`   |
NachoSoto added a commit that referenced this pull request Sep 8, 2022
…nd before watchOS 9.0 (#1895)

Follow up to #1849. That fix was incomplete, and still crashed when ran before watchOS 9.0.
Fixes [SDKONCALL-119] and [CSDK-416] and #1891.

There are 3 variables we need to take into account:
- `watchOS` version
- Xcode version
- Dual/single target app

| watchOS       | Xcode     | Dual / Single target | Before PR          | With this PR      |
|---------------|-----------|----------------------|--------------------|-------------------|
| < 9.0         | < 14.x    | Single               | `WKExtension`      | `WKExtension`     |
| < 9.0         | < 14.x    | Dual                 |  N/A               |     N/A           |
| < 9.0         | >= 14.0   | Single               | crash ⚠️    |  always `false`   |
| < 9.0         | >= 14.0   | Dual                 | `WKApplication`    | `WKExtension`     |
| >= 9.0        | >= 14.0   | Single               | `WKApplication`    | `WKApplication`   |
| >= 9.0        | >= 14.0   | Dual                 | `WKApplication`    | `WKApplication`   |
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants