diff --git a/.ci/scripts/update_pods.sh b/.ci/scripts/update_pods.sh
new file mode 100755
index 000000000000..79cd0699aed7
--- /dev/null
+++ b/.ci/scripts/update_pods.sh
@@ -0,0 +1,10 @@
+#!/bin/bash
+# Copyright 2013 The Flutter Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+set -e
+
+# Ensure that the pods repos are up to date, since analyze will not check for
+# the latest versions of pods, so can use stale Flutter or FlutterMacOS pods
+# for analysis otherwise.
+pod repo update --verbose
diff --git a/.ci/targets/macos_check_podspecs.yaml b/.ci/targets/macos_check_podspecs.yaml
index 9df7e66afd41..946ac66f748a 100644
--- a/.ci/targets/macos_check_podspecs.yaml
+++ b/.ci/targets/macos_check_podspecs.yaml
@@ -2,6 +2,9 @@ tasks:
- name: prepare tool
script: .ci/scripts/prepare_tool.sh
infra_step: true # Note infra steps failing prevents "always" from running.
+ - name: update pods repo
+ script: .ci/scripts/update_pods.sh
+ infra_step: true # Note infra steps failing prevents "always" from running.
- name: validate iOS and macOS podspecs
script: script/tool_runner.sh
args: ["podspec-check"]
diff --git a/packages/google_sign_in/google_sign_in_ios/CHANGELOG.md b/packages/google_sign_in/google_sign_in_ios/CHANGELOG.md
index f48258887480..366117d2be73 100644
--- a/packages/google_sign_in/google_sign_in_ios/CHANGELOG.md
+++ b/packages/google_sign_in/google_sign_in_ios/CHANGELOG.md
@@ -1,6 +1,7 @@
-## NEXT
+## 5.7.0
-* Updates minimum supported SDK version to Flutter 3.10/Dart 3.0.
+* Adds support for macOS.
+* Updates minimum supported SDK version to Flutter 3.16/Dart 3.2.
## 5.6.5
diff --git a/packages/google_sign_in/google_sign_in_ios/README.md b/packages/google_sign_in/google_sign_in_ios/README.md
index 29bcc25fb18f..20cf221aeb56 100644
--- a/packages/google_sign_in/google_sign_in_ios/README.md
+++ b/packages/google_sign_in/google_sign_in_ios/README.md
@@ -1,6 +1,6 @@
# google\_sign\_in\_ios
-The iOS implementation of [`google_sign_in`][1].
+The iOS and macOS implementation of [`google_sign_in`][1].
## Usage
@@ -11,6 +11,21 @@ so you do not need to add it to your `pubspec.yaml`.
However, if you `import` this package to use any of its APIs directly, you
should add it to your `pubspec.yaml` as usual.
+### macOS setup
+
+The GoogleSignIn SDK requires keychain sharing to be enabled, by [adding the
+following entitlements](https://docs.flutter.dev/platform-integration/macos/building#entitlements-and-the-app-sandbox):
+
+```xml
+ keychain-access-groups
+
+ $(AppIdentifierPrefix)com.google.GIDSignIn
+
+```
+
+Without this step, the plugin will throw a `keychain error` `PlatformException`
+when trying to sign in.
+
[1]: https://pub.dev/packages/google_sign_in
[2]: https://flutter.dev/docs/development/packages-and-plugins/developing-packages#endorsed-federated-plugin
diff --git a/packages/google_sign_in/google_sign_in_ios/ios/Assets/.gitkeep b/packages/google_sign_in/google_sign_in_ios/darwin/Assets/.gitkeep
similarity index 100%
rename from packages/google_sign_in/google_sign_in_ios/ios/Assets/.gitkeep
rename to packages/google_sign_in/google_sign_in_ios/darwin/Assets/.gitkeep
diff --git a/packages/google_sign_in/google_sign_in_ios/ios/Classes/FLTGoogleSignInPlugin.h b/packages/google_sign_in/google_sign_in_ios/darwin/Classes/FLTGoogleSignInPlugin.h
similarity index 74%
rename from packages/google_sign_in/google_sign_in_ios/ios/Classes/FLTGoogleSignInPlugin.h
rename to packages/google_sign_in/google_sign_in_ios/darwin/Classes/FLTGoogleSignInPlugin.h
index 503b6a4a32e5..bbcc72da051d 100644
--- a/packages/google_sign_in/google_sign_in_ios/ios/Classes/FLTGoogleSignInPlugin.h
+++ b/packages/google_sign_in/google_sign_in_ios/darwin/Classes/FLTGoogleSignInPlugin.h
@@ -2,10 +2,14 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
+#if TARGET_OS_OSX
+#import
+#else
#import
+#endif
#import "messages.g.h"
@interface FLTGoogleSignInPlugin : NSObject
-
+- (instancetype)init NS_UNAVAILABLE;
@end
diff --git a/packages/google_sign_in/google_sign_in_ios/ios/Classes/FLTGoogleSignInPlugin.m b/packages/google_sign_in/google_sign_in_ios/darwin/Classes/FLTGoogleSignInPlugin.m
similarity index 72%
rename from packages/google_sign_in/google_sign_in_ios/ios/Classes/FLTGoogleSignInPlugin.m
rename to packages/google_sign_in/google_sign_in_ios/darwin/Classes/FLTGoogleSignInPlugin.m
index 5b79511921f3..2f7e558ec202 100644
--- a/packages/google_sign_in/google_sign_in_ios/ios/Classes/FLTGoogleSignInPlugin.m
+++ b/packages/google_sign_in/google_sign_in_ios/darwin/Classes/FLTGoogleSignInPlugin.m
@@ -50,32 +50,37 @@ @interface FLTGoogleSignInPlugin ()
// The contents of GoogleService-Info.plist, if it exists.
@property(strong, nullable) NSDictionary *googleServiceProperties;
-// Redeclared as not a designated initializer.
-- (instancetype)init;
+// The plugin registrar, for querying views.
+@property(strong, nonnull) id registrar;
@end
@implementation FLTGoogleSignInPlugin
+ (void)registerWithRegistrar:(NSObject *)registrar {
- FLTGoogleSignInPlugin *instance = [[FLTGoogleSignInPlugin alloc] init];
+ FLTGoogleSignInPlugin *instance = [[FLTGoogleSignInPlugin alloc] initWithRegistrar:registrar];
[registrar addApplicationDelegate:instance];
FSIGoogleSignInApiSetup(registrar.messenger, instance);
}
-- (instancetype)init {
- return [self initWithSignIn:GIDSignIn.sharedInstance];
+- (instancetype)initWithRegistrar:(NSObject *)registrar {
+ return [self initWithSignIn:GIDSignIn.sharedInstance registrar:registrar];
}
-- (instancetype)initWithSignIn:(GIDSignIn *)signIn {
- return [self initWithSignIn:signIn withGoogleServiceProperties:loadGoogleServiceInfo()];
+- (instancetype)initWithSignIn:(GIDSignIn *)signIn
+ registrar:(NSObject *)registrar {
+ return [self initWithSignIn:signIn
+ registrar:registrar
+ googleServiceProperties:loadGoogleServiceInfo()];
}
- (instancetype)initWithSignIn:(GIDSignIn *)signIn
- withGoogleServiceProperties:(nullable NSDictionary *)googleServiceProperties {
+ registrar:(NSObject *)registrar
+ googleServiceProperties:(nullable NSDictionary *)googleServiceProperties {
self = [super init];
if (self) {
_signIn = signIn;
+ _registrar = registrar;
_googleServiceProperties = googleServiceProperties;
// On the iOS simulator, we get "Broken pipe" errors after sign-in for some
@@ -88,9 +93,19 @@ - (instancetype)initWithSignIn:(GIDSignIn *)signIn
#pragma mark - protocol
+#if TARGET_OS_IOS
- (BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary *)options {
return [self.signIn handleURL:url];
}
+#else
+- (BOOL)handleOpenURLs:(NSArray *)urls {
+ BOOL handled = NO;
+ for (NSURL *url in urls) {
+ handled = handled || [self.signIn handleURL:url];
+ }
+ return handled;
+}
+#endif
#pragma mark - FSIGoogleSignInApi
@@ -134,23 +149,21 @@ - (void)signInWithCompletion:(nonnull void (^)(FSIUserData *_Nullable,
self.signIn.configuration = self.configuration;
}
- [self.signIn signInWithPresentingViewController:[self topViewController]
- hint:nil
- additionalScopes:self.requestedScopes.allObjects
- completion:^(GIDSignInResult *_Nullable signInResult,
- NSError *_Nullable error) {
- GIDGoogleUser *user;
- NSString *serverAuthCode;
- if (signInResult) {
- user = signInResult.user;
- serverAuthCode = signInResult.serverAuthCode;
- }
-
- [self didSignInForUser:user
- withServerAuthCode:serverAuthCode
- completion:completion
- error:error];
- }];
+ [self signInWithHint:nil
+ additionalScopes:self.requestedScopes.allObjects
+ completion:^(GIDSignInResult *_Nullable signInResult, NSError *_Nullable error) {
+ GIDGoogleUser *user;
+ NSString *serverAuthCode;
+ if (signInResult) {
+ user = signInResult.user;
+ serverAuthCode = signInResult.serverAuthCode;
+ }
+
+ [self didSignInForUser:user
+ withServerAuthCode:serverAuthCode
+ completion:completion
+ error:error];
+ }];
} @catch (NSException *e) {
completion(nil, [FlutterError errorWithCode:@"google_sign_in" message:e.reason details:e.name]);
[e raise];
@@ -196,51 +209,67 @@ - (void)requestScopes:(nonnull NSArray *)scopes
message:@"No account to grant scopes."
details:nil]);
}
- [currentUser addScopes:requestedScopes.allObjects
- presentingViewController:[self topViewController]
- completion:^(GIDSignInResult *_Nullable signInResult,
- NSError *_Nullable addedScopeError) {
- BOOL granted = NO;
- FlutterError *error = nil;
-
- if ([addedScopeError.domain isEqualToString:kGIDSignInErrorDomain] &&
- addedScopeError.code == kGIDSignInErrorCodeMismatchWithCurrentUser) {
- error =
- [FlutterError errorWithCode:@"mismatch_user"
- message:@"There is an operation on a previous "
- @"user. Try signing in again."
- details:nil];
- } else if ([addedScopeError.domain isEqualToString:kGIDSignInErrorDomain] &&
- addedScopeError.code ==
- kGIDSignInErrorCodeScopesAlreadyGranted) {
- // Scopes already granted, report success.
- granted = YES;
- } else if (signInResult.user) {
- NSSet *grantedScopes =
- [NSSet setWithArray:signInResult.user.grantedScopes];
- granted = [requestedScopes isSubsetOfSet:grantedScopes];
- }
- completion(error == nil ? @(granted) : nil, error);
- }];
+ [self addScopes:requestedScopes.allObjects
+ completion:^(GIDSignInResult *_Nullable signInResult, NSError *_Nullable addedScopeError) {
+ BOOL granted = NO;
+ FlutterError *error = nil;
+
+ if ([addedScopeError.domain isEqualToString:kGIDSignInErrorDomain] &&
+ addedScopeError.code == kGIDSignInErrorCodeMismatchWithCurrentUser) {
+ error = [FlutterError errorWithCode:@"mismatch_user"
+ message:@"There is an operation on a previous "
+ @"user. Try signing in again."
+ details:nil];
+ } else if ([addedScopeError.domain isEqualToString:kGIDSignInErrorDomain] &&
+ addedScopeError.code == kGIDSignInErrorCodeScopesAlreadyGranted) {
+ // Scopes already granted, report success.
+ granted = YES;
+ } else if (signInResult.user) {
+ NSSet *grantedScopes =
+ [NSSet setWithArray:signInResult.user.grantedScopes];
+ granted = [requestedScopes isSubsetOfSet:grantedScopes];
+ }
+ completion(error == nil ? @(granted) : nil, error);
+ }];
} @catch (NSException *e) {
completion(nil, [FlutterError errorWithCode:@"request_scopes" message:e.reason details:e.name]);
}
}
-#pragma mark - protocol
+#pragma mark - private methods
-- (void)signIn:(GIDSignIn *)signIn presentViewController:(UIViewController *)viewController {
- UIViewController *rootViewController =
- [UIApplication sharedApplication].delegate.window.rootViewController;
- [rootViewController presentViewController:viewController animated:YES completion:nil];
+// Wraps the iOS and macOS sign in display methods.
+- (void)signInWithHint:(nullable NSString *)hint
+ additionalScopes:(nullable NSArray *)additionalScopes
+ completion:(nullable void (^)(GIDSignInResult *_Nullable signInResult,
+ NSError *_Nullable error))completion {
+#if TARGET_OS_OSX
+ [self.signIn signInWithPresentingWindow:self.registrar.view.window
+ hint:hint
+ additionalScopes:additionalScopes
+ completion:completion];
+#else
+ [self.signIn signInWithPresentingViewController:[self topViewController]
+ hint:hint
+ additionalScopes:additionalScopes
+ completion:completion];
+#endif
}
-- (void)signIn:(GIDSignIn *)signIn dismissViewController:(UIViewController *)viewController {
- [viewController dismissViewControllerAnimated:YES completion:nil];
+// Wraps the iOS and macOS scope addition methods.
+- (void)addScopes:(NSArray *)scopes
+ completion:(nullable void (^)(GIDSignInResult *_Nullable signInResult,
+ NSError *_Nullable error))completion {
+ GIDGoogleUser *currentUser = self.signIn.currentUser;
+#if TARGET_OS_OSX
+ [currentUser addScopes:scopes presentingWindow:self.registrar.view.window completion:completion];
+#else
+ [currentUser addScopes:scopes
+ presentingViewController:[self topViewController]
+ completion:completion];
+#endif
}
-#pragma mark - private methods
-
/// @return @c nil if GoogleService-Info.plist not found and clientId is not provided.
- (GIDConfiguration *)configurationWithClientIdArgument:(id)clientIDArg
serverClientIdArgument:(id)serverClientIDArg
@@ -299,6 +328,8 @@ - (void)didSignInForUser:(GIDGoogleUser *)user
}
}
+#if TARGET_OS_IOS
+
- (UIViewController *)topViewController {
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wdeprecated-declarations"
@@ -337,4 +368,6 @@ - (UIViewController *)topViewControllerFromViewController:(UIViewController *)vi
return viewController;
}
+#endif
+
@end
diff --git a/packages/google_sign_in/google_sign_in_ios/ios/Classes/FLTGoogleSignInPlugin.modulemap b/packages/google_sign_in/google_sign_in_ios/darwin/Classes/FLTGoogleSignInPlugin.modulemap
similarity index 100%
rename from packages/google_sign_in/google_sign_in_ios/ios/Classes/FLTGoogleSignInPlugin.modulemap
rename to packages/google_sign_in/google_sign_in_ios/darwin/Classes/FLTGoogleSignInPlugin.modulemap
diff --git a/packages/google_sign_in/google_sign_in_ios/ios/Classes/FLTGoogleSignInPlugin_Test.h b/packages/google_sign_in/google_sign_in_ios/darwin/Classes/FLTGoogleSignInPlugin_Test.h
similarity index 75%
rename from packages/google_sign_in/google_sign_in_ios/ios/Classes/FLTGoogleSignInPlugin_Test.h
rename to packages/google_sign_in/google_sign_in_ios/darwin/Classes/FLTGoogleSignInPlugin_Test.h
index fc18c9b9e513..b145d028ad97 100644
--- a/packages/google_sign_in/google_sign_in_ios/ios/Classes/FLTGoogleSignInPlugin_Test.h
+++ b/packages/google_sign_in/google_sign_in_ios/darwin/Classes/FLTGoogleSignInPlugin_Test.h
@@ -29,12 +29,17 @@ NS_ASSUME_NONNULL_BEGIN
// sign in, sign out, and requesting additional scopes.
@property(strong, readonly) GIDSignIn *signIn;
+/// Inject @c FlutterPluginRegistrar for testing.
+- (instancetype)initWithRegistrar:(NSObject *)registrar;
+
/// Inject @c GIDSignIn for testing.
-- (instancetype)initWithSignIn:(GIDSignIn *)signIn;
+- (instancetype)initWithSignIn:(GIDSignIn *)signIn
+ registrar:(NSObject *)registrar;
/// Inject @c GIDSignIn and @c googleServiceProperties for testing.
- (instancetype)initWithSignIn:(GIDSignIn *)signIn
- withGoogleServiceProperties:(nullable NSDictionary *)googleServiceProperties
+ registrar:(NSObject *)registrar
+ googleServiceProperties:(nullable NSDictionary *)googleServiceProperties
NS_DESIGNATED_INITIALIZER;
@end
diff --git a/packages/google_sign_in/google_sign_in_ios/ios/Classes/google_sign_in_ios-umbrella.h b/packages/google_sign_in/google_sign_in_ios/darwin/Classes/google_sign_in_ios-umbrella.h
similarity index 100%
rename from packages/google_sign_in/google_sign_in_ios/ios/Classes/google_sign_in_ios-umbrella.h
rename to packages/google_sign_in/google_sign_in_ios/darwin/Classes/google_sign_in_ios-umbrella.h
diff --git a/packages/google_sign_in/google_sign_in_ios/ios/Classes/messages.g.h b/packages/google_sign_in/google_sign_in_ios/darwin/Classes/messages.g.h
similarity index 100%
rename from packages/google_sign_in/google_sign_in_ios/ios/Classes/messages.g.h
rename to packages/google_sign_in/google_sign_in_ios/darwin/Classes/messages.g.h
diff --git a/packages/google_sign_in/google_sign_in_ios/ios/Classes/messages.g.m b/packages/google_sign_in/google_sign_in_ios/darwin/Classes/messages.g.m
similarity index 100%
rename from packages/google_sign_in/google_sign_in_ios/ios/Classes/messages.g.m
rename to packages/google_sign_in/google_sign_in_ios/darwin/Classes/messages.g.m
diff --git a/packages/google_sign_in/google_sign_in_ios/example/ios/RunnerTests/GoogleService-Info.plist b/packages/google_sign_in/google_sign_in_ios/darwin/Tests/GoogleService-Info.plist
similarity index 100%
rename from packages/google_sign_in/google_sign_in_ios/example/ios/RunnerTests/GoogleService-Info.plist
rename to packages/google_sign_in/google_sign_in_ios/darwin/Tests/GoogleService-Info.plist
diff --git a/packages/google_sign_in/google_sign_in_ios/example/ios/RunnerTests/GoogleSignInTests.m b/packages/google_sign_in/google_sign_in_ios/darwin/Tests/GoogleSignInTests.m
similarity index 70%
rename from packages/google_sign_in/google_sign_in_ios/example/ios/RunnerTests/GoogleSignInTests.m
rename to packages/google_sign_in/google_sign_in_ios/darwin/Tests/GoogleSignInTests.m
index de504636e65d..1d49c9865f1c 100644
--- a/packages/google_sign_in/google_sign_in_ios/example/ios/RunnerTests/GoogleSignInTests.m
+++ b/packages/google_sign_in/google_sign_in_ios/darwin/Tests/GoogleSignInTests.m
@@ -2,7 +2,12 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
+#include
+#if TARGET_OS_OSX
+@import FlutterMacOS;
+#else
@import Flutter;
+#endif
@import XCTest;
@import google_sign_in_ios;
@@ -33,7 +38,8 @@ - (void)setUp {
self.mockSignIn = mockSignIn;
OCMStub(self.mockPluginRegistrar.messenger).andReturn(self.mockBinaryMessenger);
- self.plugin = [[FLTGoogleSignInPlugin alloc] initWithSignIn:mockSignIn];
+ self.plugin = [[FLTGoogleSignInPlugin alloc] initWithSignIn:mockSignIn
+ registrar:self.mockPluginRegistrar];
[FLTGoogleSignInPlugin registerWithRegistrar:self.mockPluginRegistrar];
NSString *plistPath =
@@ -52,7 +58,8 @@ - (void)testSignOut {
}
- (void)testDisconnect {
- [[self.mockSignIn stub] disconnectWithCompletion:[OCMArg invokeBlockWithArgs:[NSNull null], nil]];
+ [(GIDSignIn *)[self.mockSignIn stub]
+ disconnectWithCompletion:[OCMArg invokeBlockWithArgs:[NSNull null], nil]];
XCTestExpectation *expectation = [self expectationWithDescription:@"expect result returns true"];
[self.plugin disconnectWithCompletion:^(FlutterError *error) {
@@ -63,10 +70,11 @@ - (void)testDisconnect {
}
- (void)testDisconnectIgnoresError {
- NSError *error = [NSError errorWithDomain:kGIDSignInErrorDomain
- code:kGIDSignInErrorCodeHasNoAuthInKeychain
- userInfo:nil];
- [[self.mockSignIn stub] disconnectWithCompletion:[OCMArg invokeBlockWithArgs:error, nil]];
+ NSError *sdkError = [NSError errorWithDomain:kGIDSignInErrorDomain
+ code:kGIDSignInErrorCodeHasNoAuthInKeychain
+ userInfo:nil];
+ [(GIDSignIn *)[self.mockSignIn stub]
+ disconnectWithCompletion:[OCMArg invokeBlockWithArgs:sdkError, nil]];
XCTestExpectation *expectation = [self expectationWithDescription:@"expect result returns true"];
[self.plugin disconnectWithCompletion:^(FlutterError *error) {
@@ -81,7 +89,8 @@ - (void)testDisconnectIgnoresError {
- (void)testInitNoClientIdNoError {
// Init plugin without GoogleService-Info.plist.
self.plugin = [[FLTGoogleSignInPlugin alloc] initWithSignIn:self.mockSignIn
- withGoogleServiceProperties:nil];
+ registrar:self.mockPluginRegistrar
+ googleServiceProperties:nil];
// init call does not provide a clientId.
FSIInitParams *params = [FSIInitParams makeWithScopes:@[]
@@ -96,24 +105,24 @@ - (void)testInitNoClientIdNoError {
- (void)testInitGoogleServiceInfoPlist {
self.plugin = [[FLTGoogleSignInPlugin alloc] initWithSignIn:self.mockSignIn
- withGoogleServiceProperties:self.googleServiceInfo];
+ registrar:self.mockPluginRegistrar
+ googleServiceProperties:self.googleServiceInfo];
FSIInitParams *params = [FSIInitParams makeWithScopes:@[]
hostedDomain:@"example.com"
clientId:nil
serverClientId:nil];
- FlutterError *error;
- [self.plugin initializeSignInWithParameters:params error:&error];
- XCTAssertNil(error);
+ FlutterError *initializationError;
+ [self.plugin initializeSignInWithParameters:params error:&initializationError];
+ XCTAssertNil(initializationError);
// Initialization values used in the next sign in request.
[self.plugin signInWithCompletion:^(FSIUserData *user, FlutterError *error){
}];
- OCMVerify([self.mockSignIn
- signInWithPresentingViewController:[OCMArg isKindOfClass:[FlutterViewController class]]
- hint:nil
- additionalScopes:OCMOCK_ANY
- completion:OCMOCK_ANY]);
+ OCMVerify([self configureMock:self.mockSignIn
+ forSignInWithHint:nil
+ additionalScopes:OCMOCK_ANY
+ completion:OCMOCK_ANY]);
XCTAssertEqualObjects(self.plugin.configuration.hostedDomain, @"example.com");
// Set in example app GoogleService-Info.plist.
@@ -126,25 +135,25 @@ - (void)testInitGoogleServiceInfoPlist {
- (void)testInitDynamicClientIdNullDomain {
// Init plugin without GoogleService-Info.plist.
self.plugin = [[FLTGoogleSignInPlugin alloc] initWithSignIn:self.mockSignIn
- withGoogleServiceProperties:nil];
+ registrar:self.mockPluginRegistrar
+ googleServiceProperties:nil];
FSIInitParams *params = [FSIInitParams makeWithScopes:@[]
hostedDomain:nil
clientId:@"mockClientId"
serverClientId:nil];
- FlutterError *error;
- [self.plugin initializeSignInWithParameters:params error:&error];
- XCTAssertNil(error);
+ FlutterError *initializationError;
+ [self.plugin initializeSignInWithParameters:params error:&initializationError];
+ XCTAssertNil(initializationError);
// Initialization values used in the next sign in request.
[self.plugin signInWithCompletion:^(FSIUserData *user, FlutterError *error){
}];
- OCMVerify([self.mockSignIn
- signInWithPresentingViewController:[OCMArg isKindOfClass:[FlutterViewController class]]
- hint:nil
- additionalScopes:OCMOCK_ANY
- completion:OCMOCK_ANY]);
+ OCMVerify([self configureMock:self.mockSignIn
+ forSignInWithHint:nil
+ additionalScopes:OCMOCK_ANY
+ completion:OCMOCK_ANY]);
XCTAssertEqualObjects(self.plugin.configuration.hostedDomain, nil);
XCTAssertEqualObjects(self.plugin.configuration.clientID, @"mockClientId");
@@ -153,23 +162,23 @@ - (void)testInitDynamicClientIdNullDomain {
- (void)testInitDynamicServerClientIdNullDomain {
self.plugin = [[FLTGoogleSignInPlugin alloc] initWithSignIn:self.mockSignIn
- withGoogleServiceProperties:self.googleServiceInfo];
+ registrar:self.mockPluginRegistrar
+ googleServiceProperties:self.googleServiceInfo];
FSIInitParams *params = [FSIInitParams makeWithScopes:@[]
hostedDomain:nil
clientId:nil
serverClientId:@"mockServerClientId"];
- FlutterError *error;
- [self.plugin initializeSignInWithParameters:params error:&error];
- XCTAssertNil(error);
+ FlutterError *initializationError;
+ [self.plugin initializeSignInWithParameters:params error:&initializationError];
+ XCTAssertNil(initializationError);
// Initialization values used in the next sign in request.
[self.plugin signInWithCompletion:^(FSIUserData *user, FlutterError *error){
}];
- OCMVerify([self.mockSignIn
- signInWithPresentingViewController:[OCMArg isKindOfClass:[FlutterViewController class]]
- hint:nil
- additionalScopes:OCMOCK_ANY
- completion:OCMOCK_ANY]);
+ OCMVerify([self configureMock:self.mockSignIn
+ forSignInWithHint:nil
+ additionalScopes:OCMOCK_ANY
+ completion:OCMOCK_ANY]);
XCTAssertEqualObjects(self.plugin.configuration.hostedDomain, nil);
// Set in example app GoogleService-Info.plist.
@@ -186,7 +195,7 @@ - (void)testInitInfoPlist {
serverClientId:nil];
FlutterError *error;
- self.plugin = [[FLTGoogleSignInPlugin alloc] init];
+ self.plugin = [[FLTGoogleSignInPlugin alloc] initWithRegistrar:self.mockPluginRegistrar];
[self.plugin initializeSignInWithParameters:params error:&error];
XCTAssertNil(error);
XCTAssertNil(self.plugin.configuration);
@@ -243,12 +252,13 @@ - (void)testSignInSilently {
}
- (void)testSignInSilentlyWithError {
- NSError *error = [NSError errorWithDomain:kGIDSignInErrorDomain
- code:kGIDSignInErrorCodeHasNoAuthInKeychain
- userInfo:nil];
+ NSError *sdkError = [NSError errorWithDomain:kGIDSignInErrorDomain
+ code:kGIDSignInErrorCodeHasNoAuthInKeychain
+ userInfo:nil];
[[self.mockSignIn stub]
- restorePreviousSignInWithCompletion:[OCMArg invokeBlockWithArgs:[NSNull null], error, nil]];
+ restorePreviousSignInWithCompletion:[OCMArg
+ invokeBlockWithArgs:[NSNull null], sdkError, nil]];
XCTestExpectation *expectation = [self expectationWithDescription:@"completion called"];
[self.plugin signInSilentlyWithCompletion:^(FSIUserData *user, FlutterError *error) {
@@ -263,7 +273,8 @@ - (void)testSignInSilentlyWithError {
- (void)testSignIn {
self.plugin = [[FLTGoogleSignInPlugin alloc] initWithSignIn:self.mockSignIn
- withGoogleServiceProperties:self.googleServiceInfo];
+ registrar:self.mockPluginRegistrar
+ googleServiceProperties:self.googleServiceInfo];
id mockUser = OCMClassMock([GIDGoogleUser class]);
id mockUserProfile = OCMClassMock([GIDProfileData class]);
OCMStub([mockUserProfile name]).andReturn(@"mockDisplay");
@@ -279,12 +290,10 @@ - (void)testSignIn {
OCMStub([mockSignInResult user]).andReturn(mockUser);
OCMStub([mockSignInResult serverAuthCode]).andReturn(@"mockAuthCode");
- [[self.mockSignIn expect]
- signInWithPresentingViewController:[OCMArg isKindOfClass:[FlutterViewController class]]
- hint:nil
- additionalScopes:@[]
- completion:[OCMArg invokeBlockWithArgs:mockSignInResult,
- [NSNull null], nil]];
+ [self configureMock:[self.mockSignIn expect]
+ forSignInWithHint:nil
+ additionalScopes:@[]
+ completion:[OCMArg invokeBlockWithArgs:mockSignInResult, [NSNull null], nil]];
XCTestExpectation *expectation = [self expectationWithDescription:@"completion called"];
[self.plugin signInWithCompletion:^(FSIUserData *user, FlutterError *error) {
@@ -307,28 +316,26 @@ - (void)testSignIn {
}
- (void)testSignInWithInitializedScopes {
- FlutterError *error;
+ FlutterError *initializationError;
[self.plugin
initializeSignInWithParameters:[FSIInitParams makeWithScopes:@[ @"initial1", @"initial2" ]
hostedDomain:nil
clientId:nil
serverClientId:nil]
- error:&error];
+ error:&initializationError];
id mockUser = OCMClassMock([GIDGoogleUser class]);
OCMStub([mockUser userID]).andReturn(@"mockID");
id mockSignInResult = OCMClassMock([GIDSignInResult class]);
OCMStub([mockSignInResult user]).andReturn(mockUser);
- [[self.mockSignIn expect]
- signInWithPresentingViewController:OCMOCK_ANY
- hint:nil
- additionalScopes:[OCMArg checkWithBlock:^BOOL(NSArray *scopes) {
- return [[NSSet setWithArray:scopes]
- isEqualToSet:[NSSet setWithObjects:@"initial1", @"initial2", nil]];
- }]
- completion:[OCMArg invokeBlockWithArgs:mockSignInResult,
- [NSNull null], nil]];
+ [self configureMock:[self.mockSignIn expect]
+ forSignInWithHint:nil
+ additionalScopes:[OCMArg checkWithBlock:^BOOL(NSArray *scopes) {
+ return [[NSSet setWithArray:scopes]
+ isEqualToSet:[NSSet setWithObjects:@"initial1", @"initial2", nil]];
+ }]
+ completion:[OCMArg invokeBlockWithArgs:mockSignInResult, [NSNull null], nil]];
XCTestExpectation *expectation = [self expectationWithDescription:@"completion called"];
[self.plugin signInWithCompletion:^(FSIUserData *user, FlutterError *error) {
@@ -347,19 +354,17 @@ - (void)testSignInAlreadyGranted {
id mockSignInResult = OCMClassMock([GIDSignInResult class]);
OCMStub([mockSignInResult user]).andReturn(mockUser);
- [[self.mockSignIn stub]
- signInWithPresentingViewController:OCMOCK_ANY
- hint:nil
- additionalScopes:OCMOCK_ANY
- completion:[OCMArg invokeBlockWithArgs:mockSignInResult,
- [NSNull null], nil]];
-
- NSError *error = [NSError errorWithDomain:kGIDSignInErrorDomain
- code:kGIDSignInErrorCodeScopesAlreadyGranted
- userInfo:nil];
- [[self.mockSignIn currentUser] addScopes:OCMOCK_ANY
- presentingViewController:OCMOCK_ANY
- completion:[OCMArg invokeBlockWithArgs:[NSNull null], error, nil]];
+ [self configureMock:[self.mockSignIn stub]
+ forSignInWithHint:nil
+ additionalScopes:OCMOCK_ANY
+ completion:[OCMArg invokeBlockWithArgs:mockSignInResult, [NSNull null], nil]];
+
+ NSError *sdkError = [NSError errorWithDomain:kGIDSignInErrorDomain
+ code:kGIDSignInErrorCodeScopesAlreadyGranted
+ userInfo:nil];
+ [self configureMock:mockUser
+ forAddScopes:OCMOCK_ANY
+ completion:[OCMArg invokeBlockWithArgs:[NSNull null], sdkError, nil]];
XCTestExpectation *expectation = [self expectationWithDescription:@"completion called"];
[self.plugin signInWithCompletion:^(FSIUserData *user, FlutterError *error) {
@@ -371,14 +376,13 @@ - (void)testSignInAlreadyGranted {
}
- (void)testSignInError {
- NSError *error = [NSError errorWithDomain:kGIDSignInErrorDomain
- code:kGIDSignInErrorCodeCanceled
- userInfo:nil];
- [[self.mockSignIn stub]
- signInWithPresentingViewController:OCMOCK_ANY
- hint:nil
- additionalScopes:OCMOCK_ANY
- completion:[OCMArg invokeBlockWithArgs:[NSNull null], error, nil]];
+ NSError *sdkError = [NSError errorWithDomain:kGIDSignInErrorDomain
+ code:kGIDSignInErrorCodeCanceled
+ userInfo:nil];
+ [self configureMock:[self.mockSignIn stub]
+ forSignInWithHint:nil
+ additionalScopes:OCMOCK_ANY
+ completion:[OCMArg invokeBlockWithArgs:[NSNull null], sdkError, nil]];
XCTestExpectation *expectation = [self expectationWithDescription:@"completion called"];
[self.plugin signInWithCompletion:^(FSIUserData *user, FlutterError *error) {
@@ -390,10 +394,10 @@ - (void)testSignInError {
}
- (void)testSignInException {
- OCMExpect([self.mockSignIn signInWithPresentingViewController:OCMOCK_ANY
- hint:OCMOCK_ANY
- additionalScopes:OCMOCK_ANY
- completion:OCMOCK_ANY])
+ OCMExpect([self configureMock:self.mockSignIn
+ forSignInWithHint:OCMOCK_ANY
+ additionalScopes:OCMOCK_ANY
+ completion:OCMOCK_ANY])
.andThrow([NSException exceptionWithName:@"MockName" reason:@"MockReason" userInfo:nil]);
__block FlutterError *error;
@@ -441,11 +445,11 @@ - (void)testGetTokensNoAuthKeychainError {
id mockUser = OCMClassMock([GIDGoogleUser class]);
OCMStub([self.mockSignIn currentUser]).andReturn(mockUser);
- NSError *error = [NSError errorWithDomain:kGIDSignInErrorDomain
- code:kGIDSignInErrorCodeHasNoAuthInKeychain
- userInfo:nil];
- [[mockUser stub]
- refreshTokensIfNeededWithCompletion:[OCMArg invokeBlockWithArgs:[NSNull null], error, nil]];
+ NSError *sdkError = [NSError errorWithDomain:kGIDSignInErrorDomain
+ code:kGIDSignInErrorCodeHasNoAuthInKeychain
+ userInfo:nil];
+ [[mockUser stub] refreshTokensIfNeededWithCompletion:[OCMArg invokeBlockWithArgs:[NSNull null],
+ sdkError, nil]];
XCTestExpectation *expectation = [self expectationWithDescription:@"completion called"];
[self.plugin getAccessTokenWithCompletion:^(FSITokenData *token, FlutterError *error) {
@@ -461,11 +465,11 @@ - (void)testGetTokensCancelledError {
id mockUser = OCMClassMock([GIDGoogleUser class]);
OCMStub([self.mockSignIn currentUser]).andReturn(mockUser);
- NSError *error = [NSError errorWithDomain:kGIDSignInErrorDomain
- code:kGIDSignInErrorCodeCanceled
- userInfo:nil];
- [[mockUser stub]
- refreshTokensIfNeededWithCompletion:[OCMArg invokeBlockWithArgs:[NSNull null], error, nil]];
+ NSError *sdkError = [NSError errorWithDomain:kGIDSignInErrorDomain
+ code:kGIDSignInErrorCodeCanceled
+ userInfo:nil];
+ [[mockUser stub] refreshTokensIfNeededWithCompletion:[OCMArg invokeBlockWithArgs:[NSNull null],
+ sdkError, nil]];
XCTestExpectation *expectation = [self expectationWithDescription:@"completion called"];
[self.plugin getAccessTokenWithCompletion:^(FSITokenData *token, FlutterError *error) {
@@ -481,9 +485,11 @@ - (void)testGetTokensURLError {
id mockUser = OCMClassMock([GIDGoogleUser class]);
OCMStub([self.mockSignIn currentUser]).andReturn(mockUser);
- NSError *error = [NSError errorWithDomain:NSURLErrorDomain code:NSURLErrorTimedOut userInfo:nil];
- [[mockUser stub]
- refreshTokensIfNeededWithCompletion:[OCMArg invokeBlockWithArgs:[NSNull null], error, nil]];
+ NSError *sdkError = [NSError errorWithDomain:NSURLErrorDomain
+ code:NSURLErrorTimedOut
+ userInfo:nil];
+ [[mockUser stub] refreshTokensIfNeededWithCompletion:[OCMArg invokeBlockWithArgs:[NSNull null],
+ sdkError, nil]];
XCTestExpectation *expectation = [self expectationWithDescription:@"completion called"];
[self.plugin getAccessTokenWithCompletion:^(FSITokenData *token, FlutterError *error) {
@@ -499,9 +505,9 @@ - (void)testGetTokensUnknownError {
id mockUser = OCMClassMock([GIDGoogleUser class]);
OCMStub([self.mockSignIn currentUser]).andReturn(mockUser);
- NSError *error = [NSError errorWithDomain:@"BogusDomain" code:42 userInfo:nil];
- [[mockUser stub]
- refreshTokensIfNeededWithCompletion:[OCMArg invokeBlockWithArgs:[NSNull null], error, nil]];
+ NSError *sdkError = [NSError errorWithDomain:@"BogusDomain" code:42 userInfo:nil];
+ [[mockUser stub] refreshTokensIfNeededWithCompletion:[OCMArg invokeBlockWithArgs:[NSNull null],
+ sdkError, nil]];
XCTestExpectation *expectation = [self expectationWithDescription:@"completion called"];
[self.plugin getAccessTokenWithCompletion:^(FSITokenData *token, FlutterError *error) {
@@ -530,12 +536,12 @@ - (void)testRequestScopesIfNoMissingScope {
id mockUser = OCMClassMock([GIDGoogleUser class]);
OCMStub([self.mockSignIn currentUser]).andReturn(mockUser);
- NSError *error = [NSError errorWithDomain:kGIDSignInErrorDomain
- code:kGIDSignInErrorCodeScopesAlreadyGranted
- userInfo:nil];
- [[mockUser stub] addScopes:@[ @"mockScope1" ]
- presentingViewController:OCMOCK_ANY
- completion:[OCMArg invokeBlockWithArgs:[NSNull null], error, nil]];
+ NSError *sdkError = [NSError errorWithDomain:kGIDSignInErrorDomain
+ code:kGIDSignInErrorCodeScopesAlreadyGranted
+ userInfo:nil];
+ [self configureMock:[mockUser stub]
+ forAddScopes:@[ @"mockScope1" ]
+ completion:[OCMArg invokeBlockWithArgs:[NSNull null], sdkError, nil]];
XCTestExpectation *expectation = [self expectationWithDescription:@"completion called"];
[self.plugin requestScopes:@[ @"mockScope1" ]
@@ -551,12 +557,12 @@ - (void)testRequestScopesResultErrorIfMismatchingUser {
id mockUser = OCMClassMock([GIDGoogleUser class]);
OCMStub([self.mockSignIn currentUser]).andReturn(mockUser);
- NSError *error = [NSError errorWithDomain:kGIDSignInErrorDomain
- code:kGIDSignInErrorCodeMismatchWithCurrentUser
- userInfo:nil];
- [[mockUser stub] addScopes:@[ @"mockScope1" ]
- presentingViewController:OCMOCK_ANY
- completion:[OCMArg invokeBlockWithArgs:[NSNull null], error, nil]];
+ NSError *sdkError = [NSError errorWithDomain:kGIDSignInErrorDomain
+ code:kGIDSignInErrorCodeMismatchWithCurrentUser
+ userInfo:nil];
+ [self configureMock:[mockUser stub]
+ forAddScopes:@[ @"mockScope1" ]
+ completion:[OCMArg invokeBlockWithArgs:[NSNull null], sdkError, nil]];
XCTestExpectation *expectation = [self expectationWithDescription:@"completion called"];
[self.plugin requestScopes:@[ @"mockScope1" ]
@@ -572,10 +578,10 @@ - (void)testRequestScopesWithUnknownError {
id mockUser = OCMClassMock([GIDGoogleUser class]);
OCMStub([self.mockSignIn currentUser]).andReturn(mockUser);
- NSError *error = [NSError errorWithDomain:@"BogusDomain" code:42 userInfo:nil];
- [[mockUser stub] addScopes:@[ @"mockScope1" ]
- presentingViewController:OCMOCK_ANY
- completion:[OCMArg invokeBlockWithArgs:[NSNull null], error, nil]];
+ NSError *sdkError = [NSError errorWithDomain:@"BogusDomain" code:42 userInfo:nil];
+ [self configureMock:[mockUser stub]
+ forAddScopes:@[ @"mockScope1" ]
+ completion:[OCMArg invokeBlockWithArgs:[NSNull null], sdkError, nil]];
XCTestExpectation *expectation = [self expectationWithDescription:@"completion called"];
[self.plugin requestScopes:@[ @"mockScope1" ]
@@ -591,7 +597,7 @@ - (void)testRequestScopesException {
id mockUser = OCMClassMock([GIDGoogleUser class]);
OCMStub([self.mockSignIn currentUser]).andReturn(mockUser);
- OCMExpect([mockUser addScopes:@[] presentingViewController:OCMOCK_ANY completion:OCMOCK_ANY])
+ OCMExpect([self configureMock:mockUser forAddScopes:@[] completion:OCMOCK_ANY])
.andThrow([NSException exceptionWithName:@"MockName" reason:@"MockReason" userInfo:nil]);
[self.plugin requestScopes:@[]
@@ -613,9 +619,9 @@ - (void)testRequestScopesReturnsFalseIfOnlySubsetGranted {
OCMStub([mockUser grantedScopes]).andReturn(@[ @"mockScope1" ]);
OCMStub([mockSignInResult user]).andReturn(mockUser);
- [[mockUser stub] addScopes:requestedScopes
- presentingViewController:OCMOCK_ANY
- completion:[OCMArg invokeBlockWithArgs:mockSignInResult, [NSNull null], nil]];
+ [self configureMock:[mockUser stub]
+ forAddScopes:requestedScopes
+ completion:[OCMArg invokeBlockWithArgs:mockSignInResult, [NSNull null], nil]];
XCTestExpectation *expectation = [self expectationWithDescription:@"completion called"];
[self.plugin requestScopes:requestedScopes
@@ -635,9 +641,9 @@ - (void)testRequestsInitializedScopes {
hostedDomain:nil
clientId:nil
serverClientId:nil];
- FlutterError *error;
- [self.plugin initializeSignInWithParameters:params error:&error];
- XCTAssertNil(error);
+ FlutterError *initializationError;
+ [self.plugin initializeSignInWithParameters:params error:&initializationError];
+ XCTAssertNil(initializationError);
// Include one of the initially requested scopes.
NSArray *addedScopes = @[ @"initial1", @"addScope1", @"addScope2" ];
@@ -647,13 +653,13 @@ - (void)testRequestsInitializedScopes {
}];
// All four scopes are requested.
- [[mockUser verify] addScopes:[OCMArg checkWithBlock:^BOOL(NSArray *scopes) {
- return [[NSSet setWithArray:scopes]
- isEqualToSet:[NSSet setWithObjects:@"initial1", @"initial2",
- @"addScope1", @"addScope2", nil]];
- }]
- presentingViewController:OCMOCK_ANY
- completion:OCMOCK_ANY];
+ [self configureMock:[mockUser verify]
+ forAddScopes:[OCMArg checkWithBlock:^BOOL(NSArray *scopes) {
+ return [[NSSet setWithArray:scopes]
+ isEqualToSet:[NSSet setWithObjects:@"initial1", @"initial2", @"addScope1",
+ @"addScope2", nil]];
+ }]
+ completion:OCMOCK_ANY];
}
- (void)testRequestScopesReturnsTrueIfGranted {
@@ -666,9 +672,9 @@ - (void)testRequestScopesReturnsTrueIfGranted {
OCMStub([mockUser grantedScopes]).andReturn(requestedScopes);
OCMStub([mockSignInResult user]).andReturn(mockUser);
- [[mockUser stub] addScopes:requestedScopes
- presentingViewController:OCMOCK_ANY
- completion:[OCMArg invokeBlockWithArgs:mockSignInResult, [NSNull null], nil]];
+ [self configureMock:[mockUser stub]
+ forAddScopes:requestedScopes
+ completion:[OCMArg invokeBlockWithArgs:mockSignInResult, [NSNull null], nil]];
XCTestExpectation *expectation = [self expectationWithDescription:@"completion called"];
[self.plugin requestScopes:requestedScopes
@@ -680,4 +686,34 @@ - (void)testRequestScopesReturnsTrueIfGranted {
[self waitForExpectationsWithTimeout:5.0 handler:nil];
}
+#pragma mark - Utils
+
+- (void)configureMock:(id)mock
+ forAddScopes:(NSArray *)scopes
+ completion:(nullable void (^)(GIDSignInResult *_Nullable signInResult,
+ NSError *_Nullable error))completion {
+#if TARGET_OS_OSX
+ [mock addScopes:scopes presentingWindow:OCMOCK_ANY completion:completion];
+#else
+ [mock addScopes:scopes presentingViewController:OCMOCK_ANY completion:completion];
+#endif
+}
+- (void)configureMock:(id)mock
+ forSignInWithHint:(NSString *)hint
+ additionalScopes:(NSArray *)additionalScopes
+ completion:(nullable void (^)(GIDSignInResult *_Nullable signInResult,
+ NSError *_Nullable error))completion {
+#if TARGET_OS_OSX
+ [mock signInWithPresentingWindow:OCMOCK_ANY
+ hint:hint
+ additionalScopes:additionalScopes
+ completion:completion];
+#else
+ [mock signInWithPresentingViewController:[OCMArg isKindOfClass:[FlutterViewController class]]
+ hint:hint
+ additionalScopes:additionalScopes
+ completion:completion];
+#endif
+}
+
@end
diff --git a/packages/google_sign_in/google_sign_in_ios/ios/google_sign_in_ios.podspec b/packages/google_sign_in/google_sign_in_ios/darwin/google_sign_in_ios.podspec
similarity index 87%
rename from packages/google_sign_in/google_sign_in_ios/ios/google_sign_in_ios.podspec
rename to packages/google_sign_in/google_sign_in_ios/darwin/google_sign_in_ios.podspec
index 9658184c8839..a9a0244d19a1 100644
--- a/packages/google_sign_in/google_sign_in_ios/ios/google_sign_in_ios.podspec
+++ b/packages/google_sign_in/google_sign_in_ios/darwin/google_sign_in_ios.podspec
@@ -15,9 +15,11 @@ Enables Google Sign-In in Flutter apps.
s.source_files = 'Classes/**/*.{h,m}'
s.public_header_files = 'Classes/**/*.h'
s.module_map = 'Classes/FLTGoogleSignInPlugin.modulemap'
- s.dependency 'Flutter'
s.dependency 'GoogleSignIn', '~> 7.0'
s.static_framework = true
- s.platform = :ios, '11.0'
+ s.ios.dependency 'Flutter'
+ s.osx.dependency 'FlutterMacOS'
+ s.ios.deployment_target = '11.0'
+ s.osx.deployment_target = '10.15'
s.pod_target_xcconfig = { 'DEFINES_MODULE' => 'YES' }
end
diff --git a/packages/google_sign_in/google_sign_in_ios/example/ios/Runner.xcodeproj/project.pbxproj b/packages/google_sign_in/google_sign_in_ios/example/ios/Runner.xcodeproj/project.pbxproj
index ca1508eba8ca..e147a2e349b7 100644
--- a/packages/google_sign_in/google_sign_in_ios/example/ios/Runner.xcodeproj/project.pbxproj
+++ b/packages/google_sign_in/google_sign_in_ios/example/ios/Runner.xcodeproj/project.pbxproj
@@ -59,7 +59,7 @@
5A76713E622F06379AEDEBFA /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Pods/Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = ""; };
5C6F5A6C1EC3B4CB008D64B5 /* GeneratedPluginRegistrant.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = GeneratedPluginRegistrant.h; sourceTree = ""; };
5C6F5A6D1EC3B4CB008D64B5 /* GeneratedPluginRegistrant.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GeneratedPluginRegistrant.m; sourceTree = ""; };
- 7A303C2D1E89D76400B1F19E /* GoogleService-Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = "GoogleService-Info.plist"; sourceTree = ""; };
+ 7A303C2D1E89D76400B1F19E /* GoogleService-Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = "GoogleService-Info.plist"; path = "../../darwin/Tests/GoogleService-Info.plist"; sourceTree = SOURCE_ROOT; };
7ACDFB0D1E8944C400BE2D00 /* AppFrameworkInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = AppFrameworkInfo.plist; path = Flutter/AppFrameworkInfo.plist; sourceTree = ""; };
7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = Release.xcconfig; path = Flutter/Release.xcconfig; sourceTree = ""; };
7AFFD8ED1D35381100E5BB4D /* AppDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AppDelegate.h; sourceTree = ""; };
@@ -74,7 +74,7 @@
97C147021CF9000F007C117D /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; };
F582639B44581540871D9BB0 /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Pods/Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; };
F76AC1A22666D0540040C8BC /* RunnerTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = RunnerTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; };
- F76AC1A42666D0540040C8BC /* GoogleSignInTests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = GoogleSignInTests.m; sourceTree = ""; };
+ F76AC1A42666D0540040C8BC /* GoogleSignInTests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = GoogleSignInTests.m; path = ../../darwin/Tests/GoogleSignInTests.m; sourceTree = SOURCE_ROOT; };
F76AC1A62666D0540040C8BC /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; };
F76AC1B02666D0610040C8BC /* RunnerUITests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = RunnerUITests.xctest; sourceTree = BUILT_PRODUCTS_DIR; };
F76AC1B22666D0610040C8BC /* GoogleSignInUITests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = GoogleSignInUITests.m; sourceTree = ""; };
@@ -189,8 +189,8 @@
F76AC1A32666D0540040C8BC /* RunnerTests */ = {
isa = PBXGroup;
children = (
- F76AC1A42666D0540040C8BC /* GoogleSignInTests.m */,
7A303C2D1E89D76400B1F19E /* GoogleService-Info.plist */,
+ F76AC1A42666D0540040C8BC /* GoogleSignInTests.m */,
F76AC1A62666D0540040C8BC /* Info.plist */,
);
path = RunnerTests;
@@ -611,7 +611,10 @@
"$(PROJECT_DIR)/Flutter",
);
INFOPLIST_FILE = Runner/Info.plist;
- LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
+ LD_RUNPATH_SEARCH_PATHS = (
+ "$(inherited)",
+ "@executable_path/Frameworks",
+ );
LIBRARY_SEARCH_PATHS = (
"$(inherited)",
"$(PROJECT_DIR)/Flutter",
@@ -632,7 +635,10 @@
"$(PROJECT_DIR)/Flutter",
);
INFOPLIST_FILE = Runner/Info.plist;
- LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
+ LD_RUNPATH_SEARCH_PATHS = (
+ "$(inherited)",
+ "@executable_path/Frameworks",
+ );
LIBRARY_SEARCH_PATHS = (
"$(inherited)",
"$(PROJECT_DIR)/Flutter",
@@ -649,7 +655,11 @@
BUNDLE_LOADER = "$(TEST_HOST)";
CODE_SIGN_STYLE = Automatic;
INFOPLIST_FILE = RunnerTests/Info.plist;
- LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
+ LD_RUNPATH_SEARCH_PATHS = (
+ "$(inherited)",
+ "@executable_path/Frameworks",
+ "@loader_path/Frameworks",
+ );
PRODUCT_BUNDLE_IDENTIFIER = dev.flutter.plugins.RunnerTests;
PRODUCT_NAME = "$(TARGET_NAME)";
TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Runner.app/Runner";
@@ -663,7 +673,11 @@
BUNDLE_LOADER = "$(TEST_HOST)";
CODE_SIGN_STYLE = Automatic;
INFOPLIST_FILE = RunnerTests/Info.plist;
- LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
+ LD_RUNPATH_SEARCH_PATHS = (
+ "$(inherited)",
+ "@executable_path/Frameworks",
+ "@loader_path/Frameworks",
+ );
PRODUCT_BUNDLE_IDENTIFIER = dev.flutter.plugins.RunnerTests;
PRODUCT_NAME = "$(TARGET_NAME)";
TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Runner.app/Runner";
@@ -675,7 +689,11 @@
buildSettings = {
CODE_SIGN_STYLE = Automatic;
INFOPLIST_FILE = RunnerUITests/Info.plist;
- LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
+ LD_RUNPATH_SEARCH_PATHS = (
+ "$(inherited)",
+ "@executable_path/Frameworks",
+ "@loader_path/Frameworks",
+ );
PRODUCT_BUNDLE_IDENTIFIER = dev.flutter.plugins.RunnerUITests;
PRODUCT_NAME = "$(TARGET_NAME)";
TEST_TARGET_NAME = Runner;
@@ -687,7 +705,11 @@
buildSettings = {
CODE_SIGN_STYLE = Automatic;
INFOPLIST_FILE = RunnerUITests/Info.plist;
- LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
+ LD_RUNPATH_SEARCH_PATHS = (
+ "$(inherited)",
+ "@executable_path/Frameworks",
+ "@loader_path/Frameworks",
+ );
PRODUCT_BUNDLE_IDENTIFIER = dev.flutter.plugins.RunnerUITests;
PRODUCT_NAME = "$(TARGET_NAME)";
TEST_TARGET_NAME = Runner;
diff --git a/packages/google_sign_in/google_sign_in_ios/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json b/packages/google_sign_in/google_sign_in_ios/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json
index d22f10b2ab63..8122b0a0c2f2 100644
--- a/packages/google_sign_in/google_sign_in_ios/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json
+++ b/packages/google_sign_in/google_sign_in_ios/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json
@@ -1,116 +1,121 @@
{
"images" : [
{
- "size" : "20x20",
- "idiom" : "iphone",
"filename" : "Icon-App-20x20@2x.png",
- "scale" : "2x"
+ "idiom" : "iphone",
+ "scale" : "2x",
+ "size" : "20x20"
},
{
- "size" : "20x20",
- "idiom" : "iphone",
"filename" : "Icon-App-20x20@3x.png",
- "scale" : "3x"
+ "idiom" : "iphone",
+ "scale" : "3x",
+ "size" : "20x20"
},
{
- "size" : "29x29",
- "idiom" : "iphone",
"filename" : "Icon-App-29x29@1x.png",
- "scale" : "1x"
+ "idiom" : "iphone",
+ "scale" : "1x",
+ "size" : "29x29"
},
{
- "size" : "29x29",
- "idiom" : "iphone",
"filename" : "Icon-App-29x29@2x.png",
- "scale" : "2x"
+ "idiom" : "iphone",
+ "scale" : "2x",
+ "size" : "29x29"
},
{
- "size" : "29x29",
- "idiom" : "iphone",
"filename" : "Icon-App-29x29@3x.png",
- "scale" : "3x"
+ "idiom" : "iphone",
+ "scale" : "3x",
+ "size" : "29x29"
},
{
- "size" : "40x40",
- "idiom" : "iphone",
"filename" : "Icon-App-40x40@2x.png",
- "scale" : "2x"
+ "idiom" : "iphone",
+ "scale" : "2x",
+ "size" : "40x40"
},
{
- "size" : "40x40",
- "idiom" : "iphone",
"filename" : "Icon-App-40x40@3x.png",
- "scale" : "3x"
+ "idiom" : "iphone",
+ "scale" : "3x",
+ "size" : "40x40"
},
{
- "size" : "60x60",
- "idiom" : "iphone",
"filename" : "Icon-App-60x60@2x.png",
- "scale" : "2x"
+ "idiom" : "iphone",
+ "scale" : "2x",
+ "size" : "60x60"
},
{
- "size" : "60x60",
- "idiom" : "iphone",
"filename" : "Icon-App-60x60@3x.png",
- "scale" : "3x"
+ "idiom" : "iphone",
+ "scale" : "3x",
+ "size" : "60x60"
},
{
- "size" : "20x20",
- "idiom" : "ipad",
"filename" : "Icon-App-20x20@1x.png",
- "scale" : "1x"
+ "idiom" : "ipad",
+ "scale" : "1x",
+ "size" : "20x20"
},
{
- "size" : "20x20",
- "idiom" : "ipad",
"filename" : "Icon-App-20x20@2x.png",
- "scale" : "2x"
+ "idiom" : "ipad",
+ "scale" : "2x",
+ "size" : "20x20"
},
{
- "size" : "29x29",
- "idiom" : "ipad",
"filename" : "Icon-App-29x29@1x.png",
- "scale" : "1x"
+ "idiom" : "ipad",
+ "scale" : "1x",
+ "size" : "29x29"
},
{
- "size" : "29x29",
- "idiom" : "ipad",
"filename" : "Icon-App-29x29@2x.png",
- "scale" : "2x"
+ "idiom" : "ipad",
+ "scale" : "2x",
+ "size" : "29x29"
},
{
- "size" : "40x40",
- "idiom" : "ipad",
"filename" : "Icon-App-40x40@1x.png",
- "scale" : "1x"
+ "idiom" : "ipad",
+ "scale" : "1x",
+ "size" : "40x40"
},
{
- "size" : "40x40",
- "idiom" : "ipad",
"filename" : "Icon-App-40x40@2x.png",
- "scale" : "2x"
+ "idiom" : "ipad",
+ "scale" : "2x",
+ "size" : "40x40"
},
{
- "size" : "76x76",
- "idiom" : "ipad",
"filename" : "Icon-App-76x76@1x.png",
- "scale" : "1x"
+ "idiom" : "ipad",
+ "scale" : "1x",
+ "size" : "76x76"
},
{
- "size" : "76x76",
- "idiom" : "ipad",
"filename" : "Icon-App-76x76@2x.png",
- "scale" : "2x"
+ "idiom" : "ipad",
+ "scale" : "2x",
+ "size" : "76x76"
},
{
- "size" : "83.5x83.5",
- "idiom" : "ipad",
"filename" : "Icon-App-83.5x83.5@2x.png",
- "scale" : "2x"
+ "idiom" : "ipad",
+ "scale" : "2x",
+ "size" : "83.5x83.5"
+ },
+ {
+ "idiom" : "ios-marketing",
+ "scale" : "1x",
+ "size" : "1024x1024"
}
],
"info" : {
- "version" : 1,
- "author" : "xcode"
+ "author" : "xcode",
+ "version" : 1
}
}
diff --git a/packages/google_sign_in/google_sign_in_ios/example/macos/.gitignore b/packages/google_sign_in/google_sign_in_ios/example/macos/.gitignore
new file mode 100644
index 000000000000..746adbb6b9e1
--- /dev/null
+++ b/packages/google_sign_in/google_sign_in_ios/example/macos/.gitignore
@@ -0,0 +1,7 @@
+# Flutter-related
+**/Flutter/ephemeral/
+**/Pods/
+
+# Xcode-related
+**/dgph
+**/xcuserdata/
diff --git a/packages/google_sign_in/google_sign_in_ios/example/macos/Flutter/Flutter-Debug.xcconfig b/packages/google_sign_in/google_sign_in_ios/example/macos/Flutter/Flutter-Debug.xcconfig
new file mode 100644
index 000000000000..4b81f9b2d200
--- /dev/null
+++ b/packages/google_sign_in/google_sign_in_ios/example/macos/Flutter/Flutter-Debug.xcconfig
@@ -0,0 +1,2 @@
+#include? "Pods/Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"
+#include "ephemeral/Flutter-Generated.xcconfig"
diff --git a/packages/google_sign_in/google_sign_in_ios/example/macos/Flutter/Flutter-Release.xcconfig b/packages/google_sign_in/google_sign_in_ios/example/macos/Flutter/Flutter-Release.xcconfig
new file mode 100644
index 000000000000..5caa9d1579e4
--- /dev/null
+++ b/packages/google_sign_in/google_sign_in_ios/example/macos/Flutter/Flutter-Release.xcconfig
@@ -0,0 +1,2 @@
+#include? "Pods/Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"
+#include "ephemeral/Flutter-Generated.xcconfig"
diff --git a/packages/google_sign_in/google_sign_in_ios/example/macos/Podfile b/packages/google_sign_in/google_sign_in_ios/example/macos/Podfile
new file mode 100644
index 000000000000..39a6656a7742
--- /dev/null
+++ b/packages/google_sign_in/google_sign_in_ios/example/macos/Podfile
@@ -0,0 +1,45 @@
+platform :osx, '10.15'
+
+# CocoaPods analytics sends network stats synchronously affecting flutter build latency.
+ENV['COCOAPODS_DISABLE_STATS'] = 'true'
+
+project 'Runner', {
+ 'Debug' => :debug,
+ 'Profile' => :release,
+ 'Release' => :release,
+}
+
+def flutter_root
+ generated_xcode_build_settings_path = File.expand_path(File.join('..', 'Flutter', 'ephemeral', 'Flutter-Generated.xcconfig'), __FILE__)
+ unless File.exist?(generated_xcode_build_settings_path)
+ raise "#{generated_xcode_build_settings_path} must exist. If you're running pod install manually, make sure \"flutter pub get\" is executed first"
+ end
+
+ File.foreach(generated_xcode_build_settings_path) do |line|
+ matches = line.match(/FLUTTER_ROOT\=(.*)/)
+ return matches[1].strip if matches
+ end
+ raise "FLUTTER_ROOT not found in #{generated_xcode_build_settings_path}. Try deleting Flutter-Generated.xcconfig, then run \"flutter pub get\""
+end
+
+require File.expand_path(File.join('packages', 'flutter_tools', 'bin', 'podhelper'), flutter_root)
+
+flutter_macos_podfile_setup
+
+target 'Runner' do
+ use_frameworks!
+ use_modular_headers!
+
+ flutter_install_all_macos_pods File.dirname(File.realpath(__FILE__))
+ target 'RunnerTests' do
+ inherit! :search_paths
+ end
+
+ pod 'OCMock','3.5'
+end
+
+post_install do |installer|
+ installer.pods_project.targets.each do |target|
+ flutter_additional_macos_build_settings(target)
+ end
+end
diff --git a/packages/google_sign_in/google_sign_in_ios/example/macos/Runner.xcodeproj/project.pbxproj b/packages/google_sign_in/google_sign_in_ios/example/macos/Runner.xcodeproj/project.pbxproj
new file mode 100644
index 000000000000..062eccea1799
--- /dev/null
+++ b/packages/google_sign_in/google_sign_in_ios/example/macos/Runner.xcodeproj/project.pbxproj
@@ -0,0 +1,795 @@
+// !$*UTF8*$!
+{
+ archiveVersion = 1;
+ classes = {
+ };
+ objectVersion = 54;
+ objects = {
+
+/* Begin PBXAggregateTarget section */
+ 33CC111A2044C6BA0003C045 /* Flutter Assemble */ = {
+ isa = PBXAggregateTarget;
+ buildConfigurationList = 33CC111B2044C6BA0003C045 /* Build configuration list for PBXAggregateTarget "Flutter Assemble" */;
+ buildPhases = (
+ 33CC111E2044C6BF0003C045 /* ShellScript */,
+ );
+ dependencies = (
+ );
+ name = "Flutter Assemble";
+ productName = FLX;
+ };
+/* End PBXAggregateTarget section */
+
+/* Begin PBXBuildFile section */
+ 330B3F8D2B1E2A5800E6DC3F /* GoogleService-Info.plist in Resources */ = {isa = PBXBuildFile; fileRef = 330B3F8C2B1E2A5800E6DC3F /* GoogleService-Info.plist */; };
+ 331C80D8294CF71000263BE5 /* GoogleSignInTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 331C80D7294CF71000263BE5 /* GoogleSignInTests.m */; };
+ 335BBD1B22A9A15E00E9071D /* GeneratedPluginRegistrant.swift in Sources */ = {isa = PBXBuildFile; fileRef = 335BBD1A22A9A15E00E9071D /* GeneratedPluginRegistrant.swift */; };
+ 33CC10F12044A3C60003C045 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 33CC10F02044A3C60003C045 /* AppDelegate.swift */; };
+ 33CC10F32044A3C60003C045 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 33CC10F22044A3C60003C045 /* Assets.xcassets */; };
+ 33CC10F62044A3C60003C045 /* MainMenu.xib in Resources */ = {isa = PBXBuildFile; fileRef = 33CC10F42044A3C60003C045 /* MainMenu.xib */; };
+ 33CC11132044BFA00003C045 /* MainFlutterWindow.swift in Sources */ = {isa = PBXBuildFile; fileRef = 33CC11122044BFA00003C045 /* MainFlutterWindow.swift */; };
+ D7B8415A3D20001DE212873D /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = A19720E5189178660264EC3F /* Pods_Runner.framework */; };
+ F107B1B7E4ECB85727EC4286 /* Pods_RunnerTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 0BD1DCE969A7E7C76D9CF93C /* Pods_RunnerTests.framework */; };
+/* End PBXBuildFile section */
+
+/* Begin PBXContainerItemProxy section */
+ 331C80D9294CF71000263BE5 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 33CC10E52044A3C60003C045 /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = 33CC10EC2044A3C60003C045;
+ remoteInfo = Runner;
+ };
+ 33CC111F2044C79F0003C045 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 33CC10E52044A3C60003C045 /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = 33CC111A2044C6BA0003C045;
+ remoteInfo = FLX;
+ };
+/* End PBXContainerItemProxy section */
+
+/* Begin PBXCopyFilesBuildPhase section */
+ 33CC110E2044A8840003C045 /* Bundle Framework */ = {
+ isa = PBXCopyFilesBuildPhase;
+ buildActionMask = 2147483647;
+ dstPath = "";
+ dstSubfolderSpec = 10;
+ files = (
+ );
+ name = "Bundle Framework";
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+/* End PBXCopyFilesBuildPhase section */
+
+/* Begin PBXFileReference section */
+ 0BD1DCE969A7E7C76D9CF93C /* Pods_RunnerTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_RunnerTests.framework; sourceTree = BUILT_PRODUCTS_DIR; };
+ 0E1002C336EBB758B6DD1BE4 /* Pods-RunnerTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.release.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.release.xcconfig"; sourceTree = ""; };
+ 330B3F8C2B1E2A5800E6DC3F /* GoogleService-Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = "GoogleService-Info.plist"; path = "../../../darwin/Tests/GoogleService-Info.plist"; sourceTree = ""; };
+ 331C80D5294CF71000263BE5 /* RunnerTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = RunnerTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; };
+ 331C80D7294CF71000263BE5 /* GoogleSignInTests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = GoogleSignInTests.m; path = ../../darwin/Tests/GoogleSignInTests.m; sourceTree = SOURCE_ROOT; };
+ 333000ED22D3DE5D00554162 /* Warnings.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Warnings.xcconfig; sourceTree = ""; };
+ 335BBD1A22A9A15E00E9071D /* GeneratedPluginRegistrant.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = GeneratedPluginRegistrant.swift; sourceTree = ""; };
+ 33CC10ED2044A3C60003C045 /* google_sign_in_ios_example.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = google_sign_in_ios_example.app; sourceTree = BUILT_PRODUCTS_DIR; };
+ 33CC10F02044A3C60003C045 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; };
+ 33CC10F22044A3C60003C045 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; name = Assets.xcassets; path = Runner/Assets.xcassets; sourceTree = ""; };
+ 33CC10F52044A3C60003C045 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/MainMenu.xib; sourceTree = ""; };
+ 33CC10F72044A3C60003C045 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; name = Info.plist; path = Runner/Info.plist; sourceTree = ""; };
+ 33CC11122044BFA00003C045 /* MainFlutterWindow.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MainFlutterWindow.swift; sourceTree = ""; };
+ 33CEB47222A05771004F2AC0 /* Flutter-Debug.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = "Flutter-Debug.xcconfig"; sourceTree = ""; };
+ 33CEB47422A05771004F2AC0 /* Flutter-Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = "Flutter-Release.xcconfig"; sourceTree = ""; };
+ 33CEB47722A0578A004F2AC0 /* Flutter-Generated.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = "Flutter-Generated.xcconfig"; path = "ephemeral/Flutter-Generated.xcconfig"; sourceTree = ""; };
+ 33E51913231747F40026EE4D /* DebugProfile.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = DebugProfile.entitlements; sourceTree = ""; };
+ 33E51914231749380026EE4D /* Release.entitlements */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.entitlements; path = Release.entitlements; sourceTree = ""; };
+ 33E5194F232828860026EE4D /* AppInfo.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = AppInfo.xcconfig; sourceTree = ""; };
+ 4626AA70E7BDF77ABE2E7DB0 /* Pods-RunnerTests.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.profile.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.profile.xcconfig"; sourceTree = ""; };
+ 7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Release.xcconfig; sourceTree = ""; };
+ 8403A54CFF539C6D4BFB2536 /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = ""; };
+ 9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = Debug.xcconfig; sourceTree = ""; };
+ A031586E267538A14E77F28E /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; };
+ A19720E5189178660264EC3F /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; };
+ B2C32822D6302E2419819672 /* Pods-RunnerTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.debug.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.debug.xcconfig"; sourceTree = ""; };
+ C3173B998667B2AD47F260FE /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = ""; };
+/* End PBXFileReference section */
+
+/* Begin PBXFrameworksBuildPhase section */
+ 331C80D2294CF70F00263BE5 /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ F107B1B7E4ECB85727EC4286 /* Pods_RunnerTests.framework in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ 33CC10EA2044A3C60003C045 /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ D7B8415A3D20001DE212873D /* Pods_Runner.framework in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+/* End PBXFrameworksBuildPhase section */
+
+/* Begin PBXGroup section */
+ 330B3F8A2B1E27D300E6DC3F /* RunnerTests */ = {
+ isa = PBXGroup;
+ children = (
+ 330B3F8C2B1E2A5800E6DC3F /* GoogleService-Info.plist */,
+ 331C80D7294CF71000263BE5 /* GoogleSignInTests.m */,
+ );
+ name = RunnerTests;
+ path = Runner;
+ sourceTree = "";
+ };
+ 33BA886A226E78AF003329D5 /* Configs */ = {
+ isa = PBXGroup;
+ children = (
+ 33E5194F232828860026EE4D /* AppInfo.xcconfig */,
+ 9740EEB21CF90195004384FC /* Debug.xcconfig */,
+ 7AFA3C8E1D35360C0083082E /* Release.xcconfig */,
+ 333000ED22D3DE5D00554162 /* Warnings.xcconfig */,
+ );
+ path = Configs;
+ sourceTree = "";
+ };
+ 33CC10E42044A3C60003C045 = {
+ isa = PBXGroup;
+ children = (
+ 33FAB671232836740065AC1E /* Runner */,
+ 33CEB47122A05771004F2AC0 /* Flutter */,
+ 330B3F8A2B1E27D300E6DC3F /* RunnerTests */,
+ 33CC10EE2044A3C60003C045 /* Products */,
+ D73912EC22F37F3D000D13A0 /* Frameworks */,
+ A5245CE44A722A1081437B5D /* Pods */,
+ );
+ sourceTree = "";
+ };
+ 33CC10EE2044A3C60003C045 /* Products */ = {
+ isa = PBXGroup;
+ children = (
+ 33CC10ED2044A3C60003C045 /* google_sign_in_ios_example.app */,
+ 331C80D5294CF71000263BE5 /* RunnerTests.xctest */,
+ );
+ name = Products;
+ sourceTree = "";
+ };
+ 33CC11242044D66E0003C045 /* Resources */ = {
+ isa = PBXGroup;
+ children = (
+ 33CC10F22044A3C60003C045 /* Assets.xcassets */,
+ 33CC10F42044A3C60003C045 /* MainMenu.xib */,
+ 33CC10F72044A3C60003C045 /* Info.plist */,
+ );
+ name = Resources;
+ path = ..;
+ sourceTree = "";
+ };
+ 33CEB47122A05771004F2AC0 /* Flutter */ = {
+ isa = PBXGroup;
+ children = (
+ 335BBD1A22A9A15E00E9071D /* GeneratedPluginRegistrant.swift */,
+ 33CEB47222A05771004F2AC0 /* Flutter-Debug.xcconfig */,
+ 33CEB47422A05771004F2AC0 /* Flutter-Release.xcconfig */,
+ 33CEB47722A0578A004F2AC0 /* Flutter-Generated.xcconfig */,
+ );
+ path = Flutter;
+ sourceTree = "";
+ };
+ 33FAB671232836740065AC1E /* Runner */ = {
+ isa = PBXGroup;
+ children = (
+ 33CC10F02044A3C60003C045 /* AppDelegate.swift */,
+ 33CC11122044BFA00003C045 /* MainFlutterWindow.swift */,
+ 33E51913231747F40026EE4D /* DebugProfile.entitlements */,
+ 33E51914231749380026EE4D /* Release.entitlements */,
+ 33CC11242044D66E0003C045 /* Resources */,
+ 33BA886A226E78AF003329D5 /* Configs */,
+ );
+ path = Runner;
+ sourceTree = "";
+ };
+ A5245CE44A722A1081437B5D /* Pods */ = {
+ isa = PBXGroup;
+ children = (
+ 8403A54CFF539C6D4BFB2536 /* Pods-Runner.debug.xcconfig */,
+ A031586E267538A14E77F28E /* Pods-Runner.release.xcconfig */,
+ C3173B998667B2AD47F260FE /* Pods-Runner.profile.xcconfig */,
+ B2C32822D6302E2419819672 /* Pods-RunnerTests.debug.xcconfig */,
+ 0E1002C336EBB758B6DD1BE4 /* Pods-RunnerTests.release.xcconfig */,
+ 4626AA70E7BDF77ABE2E7DB0 /* Pods-RunnerTests.profile.xcconfig */,
+ );
+ path = Pods;
+ sourceTree = "";
+ };
+ D73912EC22F37F3D000D13A0 /* Frameworks */ = {
+ isa = PBXGroup;
+ children = (
+ A19720E5189178660264EC3F /* Pods_Runner.framework */,
+ 0BD1DCE969A7E7C76D9CF93C /* Pods_RunnerTests.framework */,
+ );
+ name = Frameworks;
+ sourceTree = "";
+ };
+/* End PBXGroup section */
+
+/* Begin PBXNativeTarget section */
+ 331C80D4294CF70F00263BE5 /* RunnerTests */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = 331C80DE294CF71000263BE5 /* Build configuration list for PBXNativeTarget "RunnerTests" */;
+ buildPhases = (
+ 829BC609B118D03CC2221D87 /* [CP] Check Pods Manifest.lock */,
+ 331C80D1294CF70F00263BE5 /* Sources */,
+ 331C80D2294CF70F00263BE5 /* Frameworks */,
+ 331C80D3294CF70F00263BE5 /* Resources */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ 331C80DA294CF71000263BE5 /* PBXTargetDependency */,
+ );
+ name = RunnerTests;
+ productName = RunnerTests;
+ productReference = 331C80D5294CF71000263BE5 /* RunnerTests.xctest */;
+ productType = "com.apple.product-type.bundle.unit-test";
+ };
+ 33CC10EC2044A3C60003C045 /* Runner */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = 33CC10FB2044A3C60003C045 /* Build configuration list for PBXNativeTarget "Runner" */;
+ buildPhases = (
+ 728CBB3DC3D62D9A33FE9D0E /* [CP] Check Pods Manifest.lock */,
+ 33CC10E92044A3C60003C045 /* Sources */,
+ 33CC10EA2044A3C60003C045 /* Frameworks */,
+ 33CC10EB2044A3C60003C045 /* Resources */,
+ 33CC110E2044A8840003C045 /* Bundle Framework */,
+ 3399D490228B24CF009A79C7 /* ShellScript */,
+ 71BCCDB30AA132D041139429 /* [CP] Embed Pods Frameworks */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ 33CC11202044C79F0003C045 /* PBXTargetDependency */,
+ );
+ name = Runner;
+ productName = Runner;
+ productReference = 33CC10ED2044A3C60003C045 /* google_sign_in_ios_example.app */;
+ productType = "com.apple.product-type.application";
+ };
+/* End PBXNativeTarget section */
+
+/* Begin PBXProject section */
+ 33CC10E52044A3C60003C045 /* Project object */ = {
+ isa = PBXProject;
+ attributes = {
+ LastSwiftUpdateCheck = 0920;
+ LastUpgradeCheck = 1430;
+ ORGANIZATIONNAME = "";
+ TargetAttributes = {
+ 331C80D4294CF70F00263BE5 = {
+ CreatedOnToolsVersion = 14.0;
+ TestTargetID = 33CC10EC2044A3C60003C045;
+ };
+ 33CC10EC2044A3C60003C045 = {
+ CreatedOnToolsVersion = 9.2;
+ LastSwiftMigration = 1100;
+ ProvisioningStyle = Automatic;
+ SystemCapabilities = {
+ com.apple.Sandbox = {
+ enabled = 1;
+ };
+ };
+ };
+ 33CC111A2044C6BA0003C045 = {
+ CreatedOnToolsVersion = 9.2;
+ ProvisioningStyle = Manual;
+ };
+ };
+ };
+ buildConfigurationList = 33CC10E82044A3C60003C045 /* Build configuration list for PBXProject "Runner" */;
+ compatibilityVersion = "Xcode 9.3";
+ developmentRegion = en;
+ hasScannedForEncodings = 0;
+ knownRegions = (
+ en,
+ Base,
+ );
+ mainGroup = 33CC10E42044A3C60003C045;
+ productRefGroup = 33CC10EE2044A3C60003C045 /* Products */;
+ projectDirPath = "";
+ projectRoot = "";
+ targets = (
+ 33CC10EC2044A3C60003C045 /* Runner */,
+ 331C80D4294CF70F00263BE5 /* RunnerTests */,
+ 33CC111A2044C6BA0003C045 /* Flutter Assemble */,
+ );
+ };
+/* End PBXProject section */
+
+/* Begin PBXResourcesBuildPhase section */
+ 331C80D3294CF70F00263BE5 /* Resources */ = {
+ isa = PBXResourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ 330B3F8D2B1E2A5800E6DC3F /* GoogleService-Info.plist in Resources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ 33CC10EB2044A3C60003C045 /* Resources */ = {
+ isa = PBXResourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ 33CC10F32044A3C60003C045 /* Assets.xcassets in Resources */,
+ 33CC10F62044A3C60003C045 /* MainMenu.xib in Resources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+/* End PBXResourcesBuildPhase section */
+
+/* Begin PBXShellScriptBuildPhase section */
+ 3399D490228B24CF009A79C7 /* ShellScript */ = {
+ isa = PBXShellScriptBuildPhase;
+ alwaysOutOfDate = 1;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ inputFileListPaths = (
+ );
+ inputPaths = (
+ );
+ outputFileListPaths = (
+ );
+ outputPaths = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ shellPath = /bin/sh;
+ shellScript = "echo \"$PRODUCT_NAME.app\" > \"$PROJECT_DIR\"/Flutter/ephemeral/.app_filename && \"$FLUTTER_ROOT\"/packages/flutter_tools/bin/macos_assemble.sh embed\n";
+ };
+ 33CC111E2044C6BF0003C045 /* ShellScript */ = {
+ isa = PBXShellScriptBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ inputFileListPaths = (
+ Flutter/ephemeral/FlutterInputs.xcfilelist,
+ );
+ inputPaths = (
+ Flutter/ephemeral/tripwire,
+ );
+ outputFileListPaths = (
+ Flutter/ephemeral/FlutterOutputs.xcfilelist,
+ );
+ outputPaths = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ shellPath = /bin/sh;
+ shellScript = "\"$FLUTTER_ROOT\"/packages/flutter_tools/bin/macos_assemble.sh && touch Flutter/ephemeral/tripwire";
+ };
+ 71BCCDB30AA132D041139429 /* [CP] Embed Pods Frameworks */ = {
+ isa = PBXShellScriptBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ inputFileListPaths = (
+ "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-input-files.xcfilelist",
+ );
+ name = "[CP] Embed Pods Frameworks";
+ outputFileListPaths = (
+ "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-output-files.xcfilelist",
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ shellPath = /bin/sh;
+ shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n";
+ showEnvVarsInLog = 0;
+ };
+ 728CBB3DC3D62D9A33FE9D0E /* [CP] Check Pods Manifest.lock */ = {
+ isa = PBXShellScriptBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ inputFileListPaths = (
+ );
+ inputPaths = (
+ "${PODS_PODFILE_DIR_PATH}/Podfile.lock",
+ "${PODS_ROOT}/Manifest.lock",
+ );
+ name = "[CP] Check Pods Manifest.lock";
+ outputFileListPaths = (
+ );
+ outputPaths = (
+ "$(DERIVED_FILE_DIR)/Pods-Runner-checkManifestLockResult.txt",
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ shellPath = /bin/sh;
+ shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n";
+ showEnvVarsInLog = 0;
+ };
+ 829BC609B118D03CC2221D87 /* [CP] Check Pods Manifest.lock */ = {
+ isa = PBXShellScriptBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ inputFileListPaths = (
+ );
+ inputPaths = (
+ "${PODS_PODFILE_DIR_PATH}/Podfile.lock",
+ "${PODS_ROOT}/Manifest.lock",
+ );
+ name = "[CP] Check Pods Manifest.lock";
+ outputFileListPaths = (
+ );
+ outputPaths = (
+ "$(DERIVED_FILE_DIR)/Pods-RunnerTests-checkManifestLockResult.txt",
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ shellPath = /bin/sh;
+ shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n";
+ showEnvVarsInLog = 0;
+ };
+/* End PBXShellScriptBuildPhase section */
+
+/* Begin PBXSourcesBuildPhase section */
+ 331C80D1294CF70F00263BE5 /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ 331C80D8294CF71000263BE5 /* GoogleSignInTests.m in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ 33CC10E92044A3C60003C045 /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ 33CC11132044BFA00003C045 /* MainFlutterWindow.swift in Sources */,
+ 33CC10F12044A3C60003C045 /* AppDelegate.swift in Sources */,
+ 335BBD1B22A9A15E00E9071D /* GeneratedPluginRegistrant.swift in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+/* End PBXSourcesBuildPhase section */
+
+/* Begin PBXTargetDependency section */
+ 331C80DA294CF71000263BE5 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = 33CC10EC2044A3C60003C045 /* Runner */;
+ targetProxy = 331C80D9294CF71000263BE5 /* PBXContainerItemProxy */;
+ };
+ 33CC11202044C79F0003C045 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = 33CC111A2044C6BA0003C045 /* Flutter Assemble */;
+ targetProxy = 33CC111F2044C79F0003C045 /* PBXContainerItemProxy */;
+ };
+/* End PBXTargetDependency section */
+
+/* Begin PBXVariantGroup section */
+ 33CC10F42044A3C60003C045 /* MainMenu.xib */ = {
+ isa = PBXVariantGroup;
+ children = (
+ 33CC10F52044A3C60003C045 /* Base */,
+ );
+ name = MainMenu.xib;
+ path = Runner;
+ sourceTree = "";
+ };
+/* End PBXVariantGroup section */
+
+/* Begin XCBuildConfiguration section */
+ 331C80DB294CF71000263BE5 /* Debug */ = {
+ isa = XCBuildConfiguration;
+ baseConfigurationReference = B2C32822D6302E2419819672 /* Pods-RunnerTests.debug.xcconfig */;
+ buildSettings = {
+ BUNDLE_LOADER = "$(TEST_HOST)";
+ CURRENT_PROJECT_VERSION = 1;
+ GENERATE_INFOPLIST_FILE = YES;
+ MARKETING_VERSION = 1.0;
+ PRODUCT_BUNDLE_IDENTIFIER = dev.flutter.plugins.googleSignInIosExample.RunnerTests;
+ PRODUCT_NAME = "$(TARGET_NAME)";
+ SWIFT_VERSION = 5.0;
+ TEST_HOST = "$(BUILT_PRODUCTS_DIR)/google_sign_in_ios_example.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/google_sign_in_ios_example";
+ };
+ name = Debug;
+ };
+ 331C80DC294CF71000263BE5 /* Release */ = {
+ isa = XCBuildConfiguration;
+ baseConfigurationReference = 0E1002C336EBB758B6DD1BE4 /* Pods-RunnerTests.release.xcconfig */;
+ buildSettings = {
+ BUNDLE_LOADER = "$(TEST_HOST)";
+ CURRENT_PROJECT_VERSION = 1;
+ GENERATE_INFOPLIST_FILE = YES;
+ MARKETING_VERSION = 1.0;
+ PRODUCT_BUNDLE_IDENTIFIER = dev.flutter.plugins.googleSignInIosExample.RunnerTests;
+ PRODUCT_NAME = "$(TARGET_NAME)";
+ SWIFT_VERSION = 5.0;
+ TEST_HOST = "$(BUILT_PRODUCTS_DIR)/google_sign_in_ios_example.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/google_sign_in_ios_example";
+ };
+ name = Release;
+ };
+ 331C80DD294CF71000263BE5 /* Profile */ = {
+ isa = XCBuildConfiguration;
+ baseConfigurationReference = 4626AA70E7BDF77ABE2E7DB0 /* Pods-RunnerTests.profile.xcconfig */;
+ buildSettings = {
+ BUNDLE_LOADER = "$(TEST_HOST)";
+ CURRENT_PROJECT_VERSION = 1;
+ GENERATE_INFOPLIST_FILE = YES;
+ MARKETING_VERSION = 1.0;
+ PRODUCT_BUNDLE_IDENTIFIER = dev.flutter.plugins.googleSignInIosExample.RunnerTests;
+ PRODUCT_NAME = "$(TARGET_NAME)";
+ SWIFT_VERSION = 5.0;
+ TEST_HOST = "$(BUILT_PRODUCTS_DIR)/google_sign_in_ios_example.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/google_sign_in_ios_example";
+ };
+ name = Profile;
+ };
+ 338D0CE9231458BD00FA5F75 /* Profile */ = {
+ isa = XCBuildConfiguration;
+ baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */;
+ buildSettings = {
+ ALWAYS_SEARCH_USER_PATHS = NO;
+ CLANG_ANALYZER_NONNULL = YES;
+ CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
+ CLANG_CXX_LANGUAGE_STANDARD = "gnu++14";
+ CLANG_CXX_LIBRARY = "libc++";
+ CLANG_ENABLE_MODULES = YES;
+ CLANG_ENABLE_OBJC_ARC = YES;
+ CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
+ CLANG_WARN_BOOL_CONVERSION = YES;
+ CLANG_WARN_CONSTANT_CONVERSION = YES;
+ CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
+ CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
+ CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
+ CLANG_WARN_EMPTY_BODY = YES;
+ CLANG_WARN_ENUM_CONVERSION = YES;
+ CLANG_WARN_INFINITE_RECURSION = YES;
+ CLANG_WARN_INT_CONVERSION = YES;
+ CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
+ CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
+ CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
+ CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
+ CLANG_WARN_SUSPICIOUS_MOVE = YES;
+ CODE_SIGN_IDENTITY = "-";
+ COPY_PHASE_STRIP = NO;
+ DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
+ ENABLE_NS_ASSERTIONS = NO;
+ ENABLE_STRICT_OBJC_MSGSEND = YES;
+ GCC_C_LANGUAGE_STANDARD = gnu11;
+ GCC_NO_COMMON_BLOCKS = YES;
+ GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
+ GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
+ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
+ GCC_WARN_UNUSED_FUNCTION = YES;
+ GCC_WARN_UNUSED_VARIABLE = YES;
+ MACOSX_DEPLOYMENT_TARGET = 10.15;
+ MTL_ENABLE_DEBUG_INFO = NO;
+ SDKROOT = macosx;
+ SWIFT_COMPILATION_MODE = wholemodule;
+ SWIFT_OPTIMIZATION_LEVEL = "-O";
+ };
+ name = Profile;
+ };
+ 338D0CEA231458BD00FA5F75 /* Profile */ = {
+ isa = XCBuildConfiguration;
+ baseConfigurationReference = 33E5194F232828860026EE4D /* AppInfo.xcconfig */;
+ buildSettings = {
+ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
+ CLANG_ENABLE_MODULES = YES;
+ CODE_SIGN_ENTITLEMENTS = Runner/DebugProfile.entitlements;
+ CODE_SIGN_STYLE = Automatic;
+ COMBINE_HIDPI_IMAGES = YES;
+ INFOPLIST_FILE = Runner/Info.plist;
+ LD_RUNPATH_SEARCH_PATHS = (
+ "$(inherited)",
+ "@executable_path/../Frameworks",
+ );
+ PROVISIONING_PROFILE_SPECIFIER = "";
+ SWIFT_VERSION = 5.0;
+ };
+ name = Profile;
+ };
+ 338D0CEB231458BD00FA5F75 /* Profile */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ CODE_SIGN_STYLE = Manual;
+ PRODUCT_NAME = "$(TARGET_NAME)";
+ };
+ name = Profile;
+ };
+ 33CC10F92044A3C60003C045 /* Debug */ = {
+ isa = XCBuildConfiguration;
+ baseConfigurationReference = 9740EEB21CF90195004384FC /* Debug.xcconfig */;
+ buildSettings = {
+ ALWAYS_SEARCH_USER_PATHS = NO;
+ CLANG_ANALYZER_NONNULL = YES;
+ CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
+ CLANG_CXX_LANGUAGE_STANDARD = "gnu++14";
+ CLANG_CXX_LIBRARY = "libc++";
+ CLANG_ENABLE_MODULES = YES;
+ CLANG_ENABLE_OBJC_ARC = YES;
+ CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
+ CLANG_WARN_BOOL_CONVERSION = YES;
+ CLANG_WARN_CONSTANT_CONVERSION = YES;
+ CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
+ CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
+ CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
+ CLANG_WARN_EMPTY_BODY = YES;
+ CLANG_WARN_ENUM_CONVERSION = YES;
+ CLANG_WARN_INFINITE_RECURSION = YES;
+ CLANG_WARN_INT_CONVERSION = YES;
+ CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
+ CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
+ CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
+ CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
+ CLANG_WARN_SUSPICIOUS_MOVE = YES;
+ CODE_SIGN_IDENTITY = "-";
+ COPY_PHASE_STRIP = NO;
+ DEBUG_INFORMATION_FORMAT = dwarf;
+ ENABLE_STRICT_OBJC_MSGSEND = YES;
+ ENABLE_TESTABILITY = YES;
+ GCC_C_LANGUAGE_STANDARD = gnu11;
+ GCC_DYNAMIC_NO_PIC = NO;
+ GCC_NO_COMMON_BLOCKS = YES;
+ GCC_OPTIMIZATION_LEVEL = 0;
+ GCC_PREPROCESSOR_DEFINITIONS = (
+ "DEBUG=1",
+ "$(inherited)",
+ );
+ GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
+ GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
+ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
+ GCC_WARN_UNUSED_FUNCTION = YES;
+ GCC_WARN_UNUSED_VARIABLE = YES;
+ MACOSX_DEPLOYMENT_TARGET = 10.15;
+ MTL_ENABLE_DEBUG_INFO = YES;
+ ONLY_ACTIVE_ARCH = YES;
+ SDKROOT = macosx;
+ SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG;
+ SWIFT_OPTIMIZATION_LEVEL = "-Onone";
+ };
+ name = Debug;
+ };
+ 33CC10FA2044A3C60003C045 /* Release */ = {
+ isa = XCBuildConfiguration;
+ baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */;
+ buildSettings = {
+ ALWAYS_SEARCH_USER_PATHS = NO;
+ CLANG_ANALYZER_NONNULL = YES;
+ CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
+ CLANG_CXX_LANGUAGE_STANDARD = "gnu++14";
+ CLANG_CXX_LIBRARY = "libc++";
+ CLANG_ENABLE_MODULES = YES;
+ CLANG_ENABLE_OBJC_ARC = YES;
+ CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
+ CLANG_WARN_BOOL_CONVERSION = YES;
+ CLANG_WARN_CONSTANT_CONVERSION = YES;
+ CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
+ CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
+ CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
+ CLANG_WARN_EMPTY_BODY = YES;
+ CLANG_WARN_ENUM_CONVERSION = YES;
+ CLANG_WARN_INFINITE_RECURSION = YES;
+ CLANG_WARN_INT_CONVERSION = YES;
+ CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
+ CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
+ CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
+ CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
+ CLANG_WARN_SUSPICIOUS_MOVE = YES;
+ CODE_SIGN_IDENTITY = "-";
+ COPY_PHASE_STRIP = NO;
+ DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
+ ENABLE_NS_ASSERTIONS = NO;
+ ENABLE_STRICT_OBJC_MSGSEND = YES;
+ GCC_C_LANGUAGE_STANDARD = gnu11;
+ GCC_NO_COMMON_BLOCKS = YES;
+ GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
+ GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
+ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
+ GCC_WARN_UNUSED_FUNCTION = YES;
+ GCC_WARN_UNUSED_VARIABLE = YES;
+ MACOSX_DEPLOYMENT_TARGET = 10.15;
+ MTL_ENABLE_DEBUG_INFO = NO;
+ SDKROOT = macosx;
+ SWIFT_COMPILATION_MODE = wholemodule;
+ SWIFT_OPTIMIZATION_LEVEL = "-O";
+ };
+ name = Release;
+ };
+ 33CC10FC2044A3C60003C045 /* Debug */ = {
+ isa = XCBuildConfiguration;
+ baseConfigurationReference = 33E5194F232828860026EE4D /* AppInfo.xcconfig */;
+ buildSettings = {
+ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
+ CLANG_ENABLE_MODULES = YES;
+ CODE_SIGN_ENTITLEMENTS = Runner/DebugProfile.entitlements;
+ CODE_SIGN_STYLE = Automatic;
+ COMBINE_HIDPI_IMAGES = YES;
+ INFOPLIST_FILE = Runner/Info.plist;
+ LD_RUNPATH_SEARCH_PATHS = (
+ "$(inherited)",
+ "@executable_path/../Frameworks",
+ );
+ PROVISIONING_PROFILE_SPECIFIER = "";
+ SWIFT_OPTIMIZATION_LEVEL = "-Onone";
+ SWIFT_VERSION = 5.0;
+ };
+ name = Debug;
+ };
+ 33CC10FD2044A3C60003C045 /* Release */ = {
+ isa = XCBuildConfiguration;
+ baseConfigurationReference = 33E5194F232828860026EE4D /* AppInfo.xcconfig */;
+ buildSettings = {
+ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
+ CLANG_ENABLE_MODULES = YES;
+ CODE_SIGN_ENTITLEMENTS = Runner/Release.entitlements;
+ CODE_SIGN_STYLE = Automatic;
+ COMBINE_HIDPI_IMAGES = YES;
+ INFOPLIST_FILE = Runner/Info.plist;
+ LD_RUNPATH_SEARCH_PATHS = (
+ "$(inherited)",
+ "@executable_path/../Frameworks",
+ );
+ PROVISIONING_PROFILE_SPECIFIER = "";
+ SWIFT_VERSION = 5.0;
+ };
+ name = Release;
+ };
+ 33CC111C2044C6BA0003C045 /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ CODE_SIGN_STYLE = Manual;
+ PRODUCT_NAME = "$(TARGET_NAME)";
+ };
+ name = Debug;
+ };
+ 33CC111D2044C6BA0003C045 /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ CODE_SIGN_STYLE = Automatic;
+ PRODUCT_NAME = "$(TARGET_NAME)";
+ };
+ name = Release;
+ };
+/* End XCBuildConfiguration section */
+
+/* Begin XCConfigurationList section */
+ 331C80DE294CF71000263BE5 /* Build configuration list for PBXNativeTarget "RunnerTests" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ 331C80DB294CF71000263BE5 /* Debug */,
+ 331C80DC294CF71000263BE5 /* Release */,
+ 331C80DD294CF71000263BE5 /* Profile */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ 33CC10E82044A3C60003C045 /* Build configuration list for PBXProject "Runner" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ 33CC10F92044A3C60003C045 /* Debug */,
+ 33CC10FA2044A3C60003C045 /* Release */,
+ 338D0CE9231458BD00FA5F75 /* Profile */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ 33CC10FB2044A3C60003C045 /* Build configuration list for PBXNativeTarget "Runner" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ 33CC10FC2044A3C60003C045 /* Debug */,
+ 33CC10FD2044A3C60003C045 /* Release */,
+ 338D0CEA231458BD00FA5F75 /* Profile */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ 33CC111B2044C6BA0003C045 /* Build configuration list for PBXAggregateTarget "Flutter Assemble" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ 33CC111C2044C6BA0003C045 /* Debug */,
+ 33CC111D2044C6BA0003C045 /* Release */,
+ 338D0CEB231458BD00FA5F75 /* Profile */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+/* End XCConfigurationList section */
+ };
+ rootObject = 33CC10E52044A3C60003C045 /* Project object */;
+}
diff --git a/packages/google_sign_in/google_sign_in_ios/example/macos/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/packages/google_sign_in/google_sign_in_ios/example/macos/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist
new file mode 100644
index 000000000000..18d981003d68
--- /dev/null
+++ b/packages/google_sign_in/google_sign_in_ios/example/macos/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist
@@ -0,0 +1,8 @@
+
+
+
+
+ IDEDidComputeMac32BitWarning
+
+
+
diff --git a/packages/google_sign_in/google_sign_in_ios/example/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/packages/google_sign_in/google_sign_in_ios/example/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme
new file mode 100644
index 000000000000..abdbd06b3346
--- /dev/null
+++ b/packages/google_sign_in/google_sign_in_ios/example/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme
@@ -0,0 +1,98 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/packages/google_sign_in/google_sign_in_ios/example/macos/Runner.xcworkspace/contents.xcworkspacedata b/packages/google_sign_in/google_sign_in_ios/example/macos/Runner.xcworkspace/contents.xcworkspacedata
new file mode 100644
index 000000000000..21a3cc14c74e
--- /dev/null
+++ b/packages/google_sign_in/google_sign_in_ios/example/macos/Runner.xcworkspace/contents.xcworkspacedata
@@ -0,0 +1,10 @@
+
+
+
+
+
+
+
diff --git a/packages/google_sign_in/google_sign_in_ios/example/macos/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/packages/google_sign_in/google_sign_in_ios/example/macos/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist
new file mode 100644
index 000000000000..18d981003d68
--- /dev/null
+++ b/packages/google_sign_in/google_sign_in_ios/example/macos/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist
@@ -0,0 +1,8 @@
+
+
+
+
+ IDEDidComputeMac32BitWarning
+
+
+
diff --git a/packages/google_sign_in/google_sign_in_ios/example/macos/Runner/AppDelegate.swift b/packages/google_sign_in/google_sign_in_ios/example/macos/Runner/AppDelegate.swift
new file mode 100644
index 000000000000..5cec4c48f620
--- /dev/null
+++ b/packages/google_sign_in/google_sign_in_ios/example/macos/Runner/AppDelegate.swift
@@ -0,0 +1,13 @@
+// Copyright 2013 The Flutter Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+import Cocoa
+import FlutterMacOS
+
+@NSApplicationMain
+class AppDelegate: FlutterAppDelegate {
+ override func applicationShouldTerminateAfterLastWindowClosed(_ sender: NSApplication) -> Bool {
+ return true
+ }
+}
diff --git a/packages/google_sign_in/google_sign_in_ios/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json b/packages/google_sign_in/google_sign_in_ios/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json
new file mode 100644
index 000000000000..a2ec33f19f11
--- /dev/null
+++ b/packages/google_sign_in/google_sign_in_ios/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json
@@ -0,0 +1,68 @@
+{
+ "images" : [
+ {
+ "size" : "16x16",
+ "idiom" : "mac",
+ "filename" : "app_icon_16.png",
+ "scale" : "1x"
+ },
+ {
+ "size" : "16x16",
+ "idiom" : "mac",
+ "filename" : "app_icon_32.png",
+ "scale" : "2x"
+ },
+ {
+ "size" : "32x32",
+ "idiom" : "mac",
+ "filename" : "app_icon_32.png",
+ "scale" : "1x"
+ },
+ {
+ "size" : "32x32",
+ "idiom" : "mac",
+ "filename" : "app_icon_64.png",
+ "scale" : "2x"
+ },
+ {
+ "size" : "128x128",
+ "idiom" : "mac",
+ "filename" : "app_icon_128.png",
+ "scale" : "1x"
+ },
+ {
+ "size" : "128x128",
+ "idiom" : "mac",
+ "filename" : "app_icon_256.png",
+ "scale" : "2x"
+ },
+ {
+ "size" : "256x256",
+ "idiom" : "mac",
+ "filename" : "app_icon_256.png",
+ "scale" : "1x"
+ },
+ {
+ "size" : "256x256",
+ "idiom" : "mac",
+ "filename" : "app_icon_512.png",
+ "scale" : "2x"
+ },
+ {
+ "size" : "512x512",
+ "idiom" : "mac",
+ "filename" : "app_icon_512.png",
+ "scale" : "1x"
+ },
+ {
+ "size" : "512x512",
+ "idiom" : "mac",
+ "filename" : "app_icon_1024.png",
+ "scale" : "2x"
+ }
+ ],
+ "info" : {
+ "version" : 1,
+ "author" : "xcode"
+ }
+}
diff --git a/packages/google_sign_in/google_sign_in_ios/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_1024.png b/packages/google_sign_in/google_sign_in_ios/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_1024.png
new file mode 100644
index 000000000000..82b6f9d9a33e
Binary files /dev/null and b/packages/google_sign_in/google_sign_in_ios/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_1024.png differ
diff --git a/packages/google_sign_in/google_sign_in_ios/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_128.png b/packages/google_sign_in/google_sign_in_ios/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_128.png
new file mode 100644
index 000000000000..13b35eba55c6
Binary files /dev/null and b/packages/google_sign_in/google_sign_in_ios/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_128.png differ
diff --git a/packages/google_sign_in/google_sign_in_ios/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_16.png b/packages/google_sign_in/google_sign_in_ios/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_16.png
new file mode 100644
index 000000000000..0a3f5fa40fb3
Binary files /dev/null and b/packages/google_sign_in/google_sign_in_ios/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_16.png differ
diff --git a/packages/google_sign_in/google_sign_in_ios/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_256.png b/packages/google_sign_in/google_sign_in_ios/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_256.png
new file mode 100644
index 000000000000..bdb57226d5f2
Binary files /dev/null and b/packages/google_sign_in/google_sign_in_ios/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_256.png differ
diff --git a/packages/google_sign_in/google_sign_in_ios/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_32.png b/packages/google_sign_in/google_sign_in_ios/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_32.png
new file mode 100644
index 000000000000..f083318e09ca
Binary files /dev/null and b/packages/google_sign_in/google_sign_in_ios/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_32.png differ
diff --git a/packages/google_sign_in/google_sign_in_ios/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_512.png b/packages/google_sign_in/google_sign_in_ios/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_512.png
new file mode 100644
index 000000000000..326c0e72c9d8
Binary files /dev/null and b/packages/google_sign_in/google_sign_in_ios/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_512.png differ
diff --git a/packages/google_sign_in/google_sign_in_ios/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_64.png b/packages/google_sign_in/google_sign_in_ios/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_64.png
new file mode 100644
index 000000000000..2f1632cfddf3
Binary files /dev/null and b/packages/google_sign_in/google_sign_in_ios/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_64.png differ
diff --git a/packages/google_sign_in/google_sign_in_ios/example/macos/Runner/Base.lproj/MainMenu.xib b/packages/google_sign_in/google_sign_in_ios/example/macos/Runner/Base.lproj/MainMenu.xib
new file mode 100644
index 000000000000..80e867a4e06b
--- /dev/null
+++ b/packages/google_sign_in/google_sign_in_ios/example/macos/Runner/Base.lproj/MainMenu.xib
@@ -0,0 +1,343 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/packages/google_sign_in/google_sign_in_ios/example/macos/Runner/Configs/AppInfo.xcconfig b/packages/google_sign_in/google_sign_in_ios/example/macos/Runner/Configs/AppInfo.xcconfig
new file mode 100644
index 000000000000..0eb461887f55
--- /dev/null
+++ b/packages/google_sign_in/google_sign_in_ios/example/macos/Runner/Configs/AppInfo.xcconfig
@@ -0,0 +1,14 @@
+// Application-level settings for the Runner target.
+//
+// This may be replaced with something auto-generated from metadata (e.g., pubspec.yaml) in the
+// future. If not, the values below would default to using the project name when this becomes a
+// 'flutter create' template.
+
+// The application's name. By default this is also the title of the Flutter window.
+PRODUCT_NAME = google_sign_in_ios_example
+
+// The application's bundle identifier
+PRODUCT_BUNDLE_IDENTIFIER = dev.flutter.plugins.googleSignInIosExample
+
+// The copyright displayed in application information
+PRODUCT_COPYRIGHT = Copyright © 2023 dev.flutter.plugins. All rights reserved.
diff --git a/packages/google_sign_in/google_sign_in_ios/example/macos/Runner/Configs/Debug.xcconfig b/packages/google_sign_in/google_sign_in_ios/example/macos/Runner/Configs/Debug.xcconfig
new file mode 100644
index 000000000000..36b0fd9464f4
--- /dev/null
+++ b/packages/google_sign_in/google_sign_in_ios/example/macos/Runner/Configs/Debug.xcconfig
@@ -0,0 +1,2 @@
+#include "../../Flutter/Flutter-Debug.xcconfig"
+#include "Warnings.xcconfig"
diff --git a/packages/google_sign_in/google_sign_in_ios/example/macos/Runner/Configs/Release.xcconfig b/packages/google_sign_in/google_sign_in_ios/example/macos/Runner/Configs/Release.xcconfig
new file mode 100644
index 000000000000..dff4f49561c8
--- /dev/null
+++ b/packages/google_sign_in/google_sign_in_ios/example/macos/Runner/Configs/Release.xcconfig
@@ -0,0 +1,2 @@
+#include "../../Flutter/Flutter-Release.xcconfig"
+#include "Warnings.xcconfig"
diff --git a/packages/google_sign_in/google_sign_in_ios/example/macos/Runner/Configs/Warnings.xcconfig b/packages/google_sign_in/google_sign_in_ios/example/macos/Runner/Configs/Warnings.xcconfig
new file mode 100644
index 000000000000..42bcbf4780b1
--- /dev/null
+++ b/packages/google_sign_in/google_sign_in_ios/example/macos/Runner/Configs/Warnings.xcconfig
@@ -0,0 +1,13 @@
+WARNING_CFLAGS = -Wall -Wconditional-uninitialized -Wnullable-to-nonnull-conversion -Wmissing-method-return-type -Woverlength-strings
+GCC_WARN_UNDECLARED_SELECTOR = YES
+CLANG_UNDEFINED_BEHAVIOR_SANITIZER_NULLABILITY = YES
+CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE
+CLANG_WARN__DUPLICATE_METHOD_MATCH = YES
+CLANG_WARN_PRAGMA_PACK = YES
+CLANG_WARN_STRICT_PROTOTYPES = YES
+CLANG_WARN_COMMA = YES
+GCC_WARN_STRICT_SELECTOR_MATCH = YES
+CLANG_WARN_OBJC_REPEATED_USE_OF_WEAK = YES
+CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES
+GCC_WARN_SHADOW = YES
+CLANG_WARN_UNREACHABLE_CODE = YES
diff --git a/packages/google_sign_in/google_sign_in_ios/example/macos/Runner/DebugProfile.entitlements b/packages/google_sign_in/google_sign_in_ios/example/macos/Runner/DebugProfile.entitlements
new file mode 100644
index 000000000000..dddb8a30c851
--- /dev/null
+++ b/packages/google_sign_in/google_sign_in_ios/example/macos/Runner/DebugProfile.entitlements
@@ -0,0 +1,12 @@
+
+
+
+
+ com.apple.security.app-sandbox
+
+ com.apple.security.cs.allow-jit
+
+ com.apple.security.network.server
+
+
+
diff --git a/packages/google_sign_in/google_sign_in_ios/example/macos/Runner/Info.plist b/packages/google_sign_in/google_sign_in_ios/example/macos/Runner/Info.plist
new file mode 100644
index 000000000000..f7026add67e5
--- /dev/null
+++ b/packages/google_sign_in/google_sign_in_ios/example/macos/Runner/Info.plist
@@ -0,0 +1,47 @@
+
+
+
+
+ CFBundleDevelopmentRegion
+ $(DEVELOPMENT_LANGUAGE)
+ CFBundleExecutable
+ $(EXECUTABLE_NAME)
+ CFBundleIconFile
+
+ CFBundleIdentifier
+ $(PRODUCT_BUNDLE_IDENTIFIER)
+ CFBundleInfoDictionaryVersion
+ 6.0
+ CFBundleName
+ $(PRODUCT_NAME)
+ CFBundlePackageType
+ APPL
+ CFBundleShortVersionString
+ $(FLUTTER_BUILD_NAME)
+ CFBundleURLTypes
+
+
+ CFBundleTypeRole
+ Editor
+ CFBundleURLSchemes
+
+ com.googleusercontent.apps.479882132969-9i9aqik3jfjd7qhci1nqf0bm2g71rm1u
+
+
+
+ CFBundleVersion
+ $(FLUTTER_BUILD_NUMBER)
+ GIDClientID
+ 479882132969-9i9aqik3jfjd7qhci1nqf0bm2g71rm1u.apps.googleusercontent.com
+ GIDServerClientID
+ YOUR_SERVER_CLIENT_ID
+ LSMinimumSystemVersion
+ $(MACOSX_DEPLOYMENT_TARGET)
+ NSHumanReadableCopyright
+ $(PRODUCT_COPYRIGHT)
+ NSMainNibFile
+ MainMenu
+ NSPrincipalClass
+ NSApplication
+
+
diff --git a/packages/google_sign_in/google_sign_in_ios/example/macos/Runner/MainFlutterWindow.swift b/packages/google_sign_in/google_sign_in_ios/example/macos/Runner/MainFlutterWindow.swift
new file mode 100644
index 000000000000..f21908966e95
--- /dev/null
+++ b/packages/google_sign_in/google_sign_in_ios/example/macos/Runner/MainFlutterWindow.swift
@@ -0,0 +1,19 @@
+// Copyright 2013 The Flutter Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+import Cocoa
+import FlutterMacOS
+
+class MainFlutterWindow: NSWindow {
+ override func awakeFromNib() {
+ let flutterViewController = FlutterViewController()
+ let windowFrame = self.frame
+ self.contentViewController = flutterViewController
+ self.setFrame(windowFrame, display: true)
+
+ RegisterGeneratedPlugins(registry: flutterViewController)
+
+ super.awakeFromNib()
+ }
+}
diff --git a/packages/google_sign_in/google_sign_in_ios/example/macos/Runner/Release.entitlements b/packages/google_sign_in/google_sign_in_ios/example/macos/Runner/Release.entitlements
new file mode 100644
index 000000000000..852fa1a4728a
--- /dev/null
+++ b/packages/google_sign_in/google_sign_in_ios/example/macos/Runner/Release.entitlements
@@ -0,0 +1,8 @@
+
+
+
+
+ com.apple.security.app-sandbox
+
+
+
diff --git a/packages/google_sign_in/google_sign_in_ios/example/pubspec.yaml b/packages/google_sign_in/google_sign_in_ios/example/pubspec.yaml
index 611a055fd8c8..e59d361ad67a 100644
--- a/packages/google_sign_in/google_sign_in_ios/example/pubspec.yaml
+++ b/packages/google_sign_in/google_sign_in_ios/example/pubspec.yaml
@@ -3,8 +3,8 @@ description: Example of Google Sign-In plugin.
publish_to: none
environment:
- sdk: ">=3.0.0 <4.0.0"
- flutter: ">=3.10.0"
+ sdk: ">=3.2.0 <4.0.0"
+ flutter: ">=3.16.0"
dependencies:
flutter:
diff --git a/packages/google_sign_in/google_sign_in_ios/pigeons/messages.dart b/packages/google_sign_in/google_sign_in_ios/pigeons/messages.dart
index 2baf9af82ad8..c540ee7b60f8 100644
--- a/packages/google_sign_in/google_sign_in_ios/pigeons/messages.dart
+++ b/packages/google_sign_in/google_sign_in_ios/pigeons/messages.dart
@@ -7,8 +7,8 @@ import 'package:pigeon/pigeon.dart';
@ConfigurePigeon(PigeonOptions(
dartOut: 'lib/src/messages.g.dart',
objcOptions: ObjcOptions(prefix: 'FSI'),
- objcHeaderOut: 'ios/Classes/messages.g.h',
- objcSourceOut: 'ios/Classes/messages.g.m',
+ objcHeaderOut: 'darwin/Classes/messages.g.h',
+ objcSourceOut: 'darwin/Classes/messages.g.m',
copyrightHeader: 'pigeons/copyright.txt',
))
diff --git a/packages/google_sign_in/google_sign_in_ios/pubspec.yaml b/packages/google_sign_in/google_sign_in_ios/pubspec.yaml
index 96afed61d20b..4feaa6b71c2d 100644
--- a/packages/google_sign_in/google_sign_in_ios/pubspec.yaml
+++ b/packages/google_sign_in/google_sign_in_ios/pubspec.yaml
@@ -2,11 +2,11 @@ name: google_sign_in_ios
description: iOS implementation of the google_sign_in plugin.
repository: https://github.com/flutter/packages/tree/main/packages/google_sign_in/google_sign_in_ios
issue_tracker: https://github.com/flutter/flutter/issues?q=is%3Aissue+is%3Aopen+label%3A%22p%3A+google_sign_in%22
-version: 5.6.5
+version: 5.7.0
environment:
- sdk: ">=3.0.0 <4.0.0"
- flutter: ">=3.10.0"
+ sdk: ">=3.2.0 <4.0.0"
+ flutter: ">=3.16.0"
flutter:
plugin:
@@ -15,6 +15,11 @@ flutter:
ios:
dartPluginClass: GoogleSignInIOS
pluginClass: FLTGoogleSignInPlugin
+ sharedDarwinSource: true
+ macos:
+ dartPluginClass: GoogleSignInIOS
+ pluginClass: FLTGoogleSignInPlugin
+ sharedDarwinSource: true
dependencies:
flutter:
@@ -36,7 +41,8 @@ topics:
# The example deliberately includes limited-use secrets.
false_secrets:
+ - /darwin/Tests/GoogleService-Info.plist
+ - /darwin/Tests/GoogleSignInTests.m
- /example/ios/Runner/Info.plist
- - /example/ios/RunnerTests/GoogleService-Info.plist
- - /example/ios/RunnerTests/GoogleSignInTests.m
- /example/lib/main.dart
+ - /example/macos/Runner/Info.plist