diff --git a/.github/workflows/builds.yml b/.github/workflows/builds.yml index e215d112..21e07d69 100644 --- a/.github/workflows/builds.yml +++ b/.github/workflows/builds.yml @@ -37,6 +37,42 @@ jobs: -scheme GoogleSignIn-Package \ -destination "platform=OS X" + spm-app-check-11: + # Package.swift accepts app-check 11.x and 12.x, but Package.resolved is gitignored, so + # spm-build-test always gets the newest (12.x). Pin the latest 11.x (what Firebase 12 + # apps resolve) to keep SPM + AppCheckCore 11 covered. iOS only: all App Check code is + # behind TARGET_OS_IOS && !TARGET_OS_MACCATALYST. + runs-on: macos-15 + steps: + - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 + - name: Select Xcode + run: sudo xcode-select -s /Applications/Xcode_16.4.app/Contents/Developer + - name: Pin app-check to the latest 11.x + run: | + version=$(git ls-remote --tags --refs https://github.com/google/app-check.git '11.*' \ + | sed 's|.*refs/tags/||' | sort -V | tail -1) + echo "Pinning app-check $version" + # `resolve --version` can only re-pin an already-resolved dependency. + swift package resolve + swift package resolve app-check --version "$version" + - name: Build unit test target + run: | + xcodebuild \ + -scheme GoogleSignIn-Package \ + -sdk iphonesimulator \ + -destination "platform=iOS Simulator,name=iPhone 16" \ + -onlyUsePackageVersionsFromResolvedFile \ + build-for-testing + - name: Run unit test target + run: | + xcodebuild \ + -scheme GoogleSignIn-Package \ + -sdk iphonesimulator \ + -destination "platform=iOS Simulator,name=iPhone 16,OS=18.5" \ + -onlyUsePackageVersionsFromResolvedFile \ + test-without-building + + xcode-27-preview-archive: # Archive every supported platform against the Xcode 27 preview image. The # image is preview, so this job does not block merges. diff --git a/CHANGELOG.md b/CHANGELOG.md index 7703fa75..5864bdaf 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,7 @@ # Unreleased - Fix a crash when a server error response carries a non-string value under its `error` key. The EMM error handler sent `-hasPrefix:` to whatever value was present, raising an unrecognized selector exception on a number, array or object. - Fix a custom `nonce` and requested token `claims` being dropped when a sign-in is continued after a Device Policy app restart. +- Add Swift Package Manager support for AppCheckCore 12.x, enabling compatibility with Firebase 13. CocoaPods installations remain restricted to AppCheckCore 11.x # 10.0.0 - **BREAKING**: Update to AppAuth 3.0.0 and GTMAppAuth 6.0.0, which raises the minimum deployment targets to iOS 15.0 and macOS 12.0, widens the `GTMSessionFetcher` dependency to allow 4.x and 5.x, and renames the version-specific Swift Package Manager manifest to `Package@swift-5.7.swift`. Projects that must keep supporting earlier OS versions should stay on GoogleSignIn 9.2.0. ([#628](https://github.com/google/GoogleSignIn-iOS/pull/628)) diff --git a/GoogleSignIn/Sources/GIDAppCheck/Implementations/Fake/GIDAppCheckProviderFake.h b/GoogleSignIn/Sources/GIDAppCheck/Implementations/Fake/GIDAppCheckProviderFake.h index e294273f..5a862c16 100644 --- a/GoogleSignIn/Sources/GIDAppCheck/Implementations/Fake/GIDAppCheckProviderFake.h +++ b/GoogleSignIn/Sources/GIDAppCheck/Implementations/Fake/GIDAppCheckProviderFake.h @@ -16,7 +16,7 @@ #import #if TARGET_OS_IOS && !TARGET_OS_MACCATALYST -#import +@import AppCheckCore; @class GACAppCheckToken; diff --git a/GoogleSignIn/Sources/GIDAppCheck/Implementations/Fake/GIDAppCheckProviderFake.m b/GoogleSignIn/Sources/GIDAppCheck/Implementations/Fake/GIDAppCheckProviderFake.m index 903fc3ff..44e54692 100644 --- a/GoogleSignIn/Sources/GIDAppCheck/Implementations/Fake/GIDAppCheckProviderFake.m +++ b/GoogleSignIn/Sources/GIDAppCheck/Implementations/Fake/GIDAppCheckProviderFake.m @@ -16,7 +16,7 @@ #if TARGET_OS_IOS && !TARGET_OS_MACCATALYST -#import +@import AppCheckCore; NSUInteger const kGIDAppCheckProviderFakeError = 1; diff --git a/GoogleSignIn/Sources/GIDAppCheck/Implementations/GIDAppCheck.m b/GoogleSignIn/Sources/GIDAppCheck/Implementations/GIDAppCheck.m index a886eec4..ccdc3de3 100644 --- a/GoogleSignIn/Sources/GIDAppCheck/Implementations/GIDAppCheck.m +++ b/GoogleSignIn/Sources/GIDAppCheck/Implementations/GIDAppCheck.m @@ -18,11 +18,7 @@ #if TARGET_OS_IOS && !TARGET_OS_MACCATALYST -#import -#import -#import -#import -#import +@import AppCheckCore; #import "GoogleSignIn/Sources/GIDAppCheck/Implementations/GIDAppCheck.h" #import "GoogleSignIn/Sources/Public/GoogleSignIn/GIDAppCheckError.h" @@ -115,15 +111,8 @@ - (void)prepareForAppCheckWithCompletion:(nullable GIDAppCheckPrepareCompletion) } [self.appCheck limitedUseTokenWithCompletion:^(GACAppCheckTokenResult * _Nonnull result) { - NSError * __block maybeError = result.error; @synchronized (self) { - if (!result.token && !result.error) { - maybeError = [NSError errorWithDomain:kGIDAppCheckErrorDomain - code:kGIDAppCheckUnexpectedError - userInfo:nil]; - } - - if (result.token) { + if (!result.error) { [self.userDefaults setBool:YES forKey:kGIDAppCheckPreparedKey]; } @@ -134,7 +123,7 @@ - (void)prepareForAppCheckWithCompletion:(nullable GIDAppCheckPrepareCompletion) for (GIDAppCheckPrepareCompletion savedCompletion in callbacks) { - savedCompletion(maybeError); + savedCompletion(result.error); } }]; }); @@ -143,7 +132,7 @@ - (void)prepareForAppCheckWithCompletion:(nullable GIDAppCheckPrepareCompletion) - (void)getLimitedUseTokenWithCompletion:(nullable GIDAppCheckTokenCompletion)completion { dispatch_async(self.workerQueue, ^{ [self.appCheck limitedUseTokenWithCompletion:^(GACAppCheckTokenResult * _Nonnull result) { - if (result.token) { + if (!result.error) { [self.userDefaults setBool:YES forKey:kGIDAppCheckPreparedKey]; } if (completion) { diff --git a/GoogleSignIn/Sources/GIDSignIn.m b/GoogleSignIn/Sources/GIDSignIn.m index abbb803e..f3ca57da 100644 --- a/GoogleSignIn/Sources/GIDSignIn.m +++ b/GoogleSignIn/Sources/GIDSignIn.m @@ -30,7 +30,7 @@ #import "GoogleSignIn/Sources/GIDSignInCallbackSchemes.h" #import "GoogleSignIn/Sources/GIDClaimsInternalOptions.h" #if TARGET_OS_IOS && !TARGET_OS_MACCATALYST -#import +@import AppCheckCore; #import "GoogleSignIn/Sources/GIDAppCheck/Implementations/GIDAppCheck.h" #import "GoogleSignIn/Sources/GIDAppCheck/UI/GIDActivityIndicatorViewController.h" #import "GoogleSignIn/Sources/GIDEMMErrorHandler.h" diff --git a/GoogleSignIn/Tests/Unit/GIDAppCheckTest.m b/GoogleSignIn/Tests/Unit/GIDAppCheckTest.m index 7c0610ae..61e0624e 100644 --- a/GoogleSignIn/Tests/Unit/GIDAppCheckTest.m +++ b/GoogleSignIn/Tests/Unit/GIDAppCheckTest.m @@ -17,7 +17,7 @@ #if TARGET_OS_IOS && !TARGET_OS_MACCATALYST #import -#import +@import AppCheckCore; #import "GoogleSignIn/Sources/GIDAppCheck/Implementations/GIDAppCheck.h" #import "GoogleSignIn/Sources/GIDAppCheck/Implementations/Fake/GIDAppCheckProviderFake.h" #import "GoogleSignIn/Sources/Public/GoogleSignIn/GIDAppCheckError.h" diff --git a/GoogleSignIn/Tests/Unit/GIDSignInTest.m b/GoogleSignIn/Tests/Unit/GIDSignInTest.m index ed959f12..658311a2 100644 --- a/GoogleSignIn/Tests/Unit/GIDSignInTest.m +++ b/GoogleSignIn/Tests/Unit/GIDSignInTest.m @@ -35,7 +35,7 @@ #import "GoogleSignIn/Sources/GIDClaimsInternalOptions.h" #if TARGET_OS_IOS && !TARGET_OS_MACCATALYST -#import +@import AppCheckCore; #import "GoogleSignIn/Sources/GIDAppCheck/Implementations/GIDAppCheck.h" #import "GoogleSignIn/Sources/GIDAppCheck/Implementations/Fake/GIDAppCheckProviderFake.h" #import "GoogleSignIn/Sources/GIDEMMErrorHandler.h" @@ -426,8 +426,11 @@ - (void)testConfigureFailsNoTokenOrError { XCTestExpectation *configureFailsExpecation = [self expectationWithDescription:@"Configure fails expectation"]; + NSError *expectedError = [NSError errorWithDomain:kGIDAppCheckErrorDomain + code:kGIDAppCheckUnexpectedError + userInfo:nil]; GIDAppCheckProviderFake *fakeProvider = - [[GIDAppCheckProviderFake alloc] initWithAppCheckToken:nil error:nil]; + [[GIDAppCheckProviderFake alloc] initWithAppCheckToken:nil error:expectedError]; GIDAppCheck *appCheck = [[GIDAppCheck alloc] initWithAppCheckProvider:fakeProvider userDefaults:_testUserDefaults]; diff --git a/Package.swift b/Package.swift index bad348a0..03f18d99 100644 --- a/Package.swift +++ b/Package.swift @@ -46,7 +46,7 @@ let package = Package( from: "3.0.0"), .package( url: "https://github.com/google/app-check.git", - from: "11.0.0"), + "11.0.0" ..< "13.0.0"), .package( url: "https://github.com/google/GTMAppAuth.git", from: "6.0.0"),