[google_sign_in] Add macOS support (#4962)

Adds macOS support to `google_sign_in_ios` by moving the existing source to `darwin/`, adjusting it somewhat to be macOS-compatible, and enabling `sharedDarwinSource` in the podspec.

Unlike previous cases of code sharing, this doesn't rename the package to be something more generic, since when we do that the name is based on the underlying SDK, and the SDK is still mostly called "Google Sign-In for iOS", so I don't think there's a better name to give it at the moment.

Most of https://github.com/flutter/flutter/issues/46157
(Once this lands, there will be a follow-up PR to update the app-facing package to endorse it and list it in the README.)
This commit is contained in:
stuartmorgan
2023-12-06 10:42:06 -08:00
committed by GitHub
parent cc11b14993
commit afd451711a
47 changed files with 1934 additions and 276 deletions

10
.ci/scripts/update_pods.sh Executable file
View File

@ -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

View File

@ -2,6 +2,9 @@ tasks:
- name: prepare tool - name: prepare tool
script: .ci/scripts/prepare_tool.sh script: .ci/scripts/prepare_tool.sh
infra_step: true # Note infra steps failing prevents "always" from running. 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 - name: validate iOS and macOS podspecs
script: script/tool_runner.sh script: script/tool_runner.sh
args: ["podspec-check"] args: ["podspec-check"]

View File

@ -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 ## 5.6.5

View File

@ -1,6 +1,6 @@
# google\_sign\_in\_ios # google\_sign\_in\_ios
The iOS implementation of [`google_sign_in`][1]. The iOS and macOS implementation of [`google_sign_in`][1].
## Usage ## 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 However, if you `import` this package to use any of its APIs directly, you
should add it to your `pubspec.yaml` as usual. 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
<key>keychain-access-groups</key>
<array>
<string>$(AppIdentifierPrefix)com.google.GIDSignIn</string>
</array>
```
Without this step, the plugin will throw a `keychain error` `PlatformException`
when trying to sign in.
[1]: https://pub.dev/packages/google_sign_in [1]: https://pub.dev/packages/google_sign_in
[2]: https://flutter.dev/docs/development/packages-and-plugins/developing-packages#endorsed-federated-plugin [2]: https://flutter.dev/docs/development/packages-and-plugins/developing-packages#endorsed-federated-plugin

View File

@ -2,10 +2,14 @@
// Use of this source code is governed by a BSD-style license that can be // Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file. // found in the LICENSE file.
#if TARGET_OS_OSX
#import <FlutterMacOS/FlutterMacOS.h>
#else
#import <Flutter/Flutter.h> #import <Flutter/Flutter.h>
#endif
#import "messages.g.h" #import "messages.g.h"
@interface FLTGoogleSignInPlugin : NSObject <FlutterPlugin, FSIGoogleSignInApi> @interface FLTGoogleSignInPlugin : NSObject <FlutterPlugin, FSIGoogleSignInApi>
- (instancetype)init NS_UNAVAILABLE;
@end @end

View File

@ -50,32 +50,37 @@ static FlutterError *getFlutterError(NSError *error) {
// The contents of GoogleService-Info.plist, if it exists. // The contents of GoogleService-Info.plist, if it exists.
@property(strong, nullable) NSDictionary<NSString *, id> *googleServiceProperties; @property(strong, nullable) NSDictionary<NSString *, id> *googleServiceProperties;
// Redeclared as not a designated initializer. // The plugin registrar, for querying views.
- (instancetype)init; @property(strong, nonnull) id<FlutterPluginRegistrar> registrar;
@end @end
@implementation FLTGoogleSignInPlugin @implementation FLTGoogleSignInPlugin
+ (void)registerWithRegistrar:(NSObject<FlutterPluginRegistrar> *)registrar { + (void)registerWithRegistrar:(NSObject<FlutterPluginRegistrar> *)registrar {
FLTGoogleSignInPlugin *instance = [[FLTGoogleSignInPlugin alloc] init]; FLTGoogleSignInPlugin *instance = [[FLTGoogleSignInPlugin alloc] initWithRegistrar:registrar];
[registrar addApplicationDelegate:instance]; [registrar addApplicationDelegate:instance];
FSIGoogleSignInApiSetup(registrar.messenger, instance); FSIGoogleSignInApiSetup(registrar.messenger, instance);
} }
- (instancetype)init { - (instancetype)initWithRegistrar:(NSObject<FlutterPluginRegistrar> *)registrar {
return [self initWithSignIn:GIDSignIn.sharedInstance]; return [self initWithSignIn:GIDSignIn.sharedInstance registrar:registrar];
}
- (instancetype)initWithSignIn:(GIDSignIn *)signIn {
return [self initWithSignIn:signIn withGoogleServiceProperties:loadGoogleServiceInfo()];
} }
- (instancetype)initWithSignIn:(GIDSignIn *)signIn - (instancetype)initWithSignIn:(GIDSignIn *)signIn
withGoogleServiceProperties:(nullable NSDictionary<NSString *, id> *)googleServiceProperties { registrar:(NSObject<FlutterPluginRegistrar> *)registrar {
return [self initWithSignIn:signIn
registrar:registrar
googleServiceProperties:loadGoogleServiceInfo()];
}
- (instancetype)initWithSignIn:(GIDSignIn *)signIn
registrar:(NSObject<FlutterPluginRegistrar> *)registrar
googleServiceProperties:(nullable NSDictionary<NSString *, id> *)googleServiceProperties {
self = [super init]; self = [super init];
if (self) { if (self) {
_signIn = signIn; _signIn = signIn;
_registrar = registrar;
_googleServiceProperties = googleServiceProperties; _googleServiceProperties = googleServiceProperties;
// On the iOS simulator, we get "Broken pipe" errors after sign-in for some // On the iOS simulator, we get "Broken pipe" errors after sign-in for some
@ -88,9 +93,19 @@ static FlutterError *getFlutterError(NSError *error) {
#pragma mark - <FlutterPlugin> protocol #pragma mark - <FlutterPlugin> protocol
#if TARGET_OS_IOS
- (BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary *)options { - (BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary *)options {
return [self.signIn handleURL:url]; return [self.signIn handleURL:url];
} }
#else
- (BOOL)handleOpenURLs:(NSArray<NSURL *> *)urls {
BOOL handled = NO;
for (NSURL *url in urls) {
handled = handled || [self.signIn handleURL:url];
}
return handled;
}
#endif
#pragma mark - FSIGoogleSignInApi #pragma mark - FSIGoogleSignInApi
@ -134,23 +149,21 @@ static FlutterError *getFlutterError(NSError *error) {
self.signIn.configuration = self.configuration; self.signIn.configuration = self.configuration;
} }
[self.signIn signInWithPresentingViewController:[self topViewController] [self signInWithHint:nil
hint:nil additionalScopes:self.requestedScopes.allObjects
additionalScopes:self.requestedScopes.allObjects completion:^(GIDSignInResult *_Nullable signInResult, NSError *_Nullable error) {
completion:^(GIDSignInResult *_Nullable signInResult, GIDGoogleUser *user;
NSError *_Nullable error) { NSString *serverAuthCode;
GIDGoogleUser *user; if (signInResult) {
NSString *serverAuthCode; user = signInResult.user;
if (signInResult) { serverAuthCode = signInResult.serverAuthCode;
user = signInResult.user; }
serverAuthCode = signInResult.serverAuthCode;
}
[self didSignInForUser:user [self didSignInForUser:user
withServerAuthCode:serverAuthCode withServerAuthCode:serverAuthCode
completion:completion completion:completion
error:error]; error:error];
}]; }];
} @catch (NSException *e) { } @catch (NSException *e) {
completion(nil, [FlutterError errorWithCode:@"google_sign_in" message:e.reason details:e.name]); completion(nil, [FlutterError errorWithCode:@"google_sign_in" message:e.reason details:e.name]);
[e raise]; [e raise];
@ -196,51 +209,67 @@ static FlutterError *getFlutterError(NSError *error) {
message:@"No account to grant scopes." message:@"No account to grant scopes."
details:nil]); details:nil]);
} }
[currentUser addScopes:requestedScopes.allObjects [self addScopes:requestedScopes.allObjects
presentingViewController:[self topViewController] completion:^(GIDSignInResult *_Nullable signInResult, NSError *_Nullable addedScopeError) {
completion:^(GIDSignInResult *_Nullable signInResult, BOOL granted = NO;
NSError *_Nullable addedScopeError) { FlutterError *error = nil;
BOOL granted = NO;
FlutterError *error = nil;
if ([addedScopeError.domain isEqualToString:kGIDSignInErrorDomain] && if ([addedScopeError.domain isEqualToString:kGIDSignInErrorDomain] &&
addedScopeError.code == kGIDSignInErrorCodeMismatchWithCurrentUser) { addedScopeError.code == kGIDSignInErrorCodeMismatchWithCurrentUser) {
error = error = [FlutterError errorWithCode:@"mismatch_user"
[FlutterError errorWithCode:@"mismatch_user" message:@"There is an operation on a previous "
message:@"There is an operation on a previous " @"user. Try signing in again."
@"user. Try signing in again." details:nil];
details:nil]; } else if ([addedScopeError.domain isEqualToString:kGIDSignInErrorDomain] &&
} else if ([addedScopeError.domain isEqualToString:kGIDSignInErrorDomain] && addedScopeError.code == kGIDSignInErrorCodeScopesAlreadyGranted) {
addedScopeError.code == // Scopes already granted, report success.
kGIDSignInErrorCodeScopesAlreadyGranted) { granted = YES;
// Scopes already granted, report success. } else if (signInResult.user) {
granted = YES; NSSet<NSString *> *grantedScopes =
} else if (signInResult.user) { [NSSet setWithArray:signInResult.user.grantedScopes];
NSSet<NSString *> *grantedScopes = granted = [requestedScopes isSubsetOfSet:grantedScopes];
[NSSet setWithArray:signInResult.user.grantedScopes]; }
granted = [requestedScopes isSubsetOfSet:grantedScopes]; completion(error == nil ? @(granted) : nil, error);
} }];
completion(error == nil ? @(granted) : nil, error);
}];
} @catch (NSException *e) { } @catch (NSException *e) {
completion(nil, [FlutterError errorWithCode:@"request_scopes" message:e.reason details:e.name]); completion(nil, [FlutterError errorWithCode:@"request_scopes" message:e.reason details:e.name]);
} }
} }
#pragma mark - <GIDSignInUIDelegate> protocol
- (void)signIn:(GIDSignIn *)signIn presentViewController:(UIViewController *)viewController {
UIViewController *rootViewController =
[UIApplication sharedApplication].delegate.window.rootViewController;
[rootViewController presentViewController:viewController animated:YES completion:nil];
}
- (void)signIn:(GIDSignIn *)signIn dismissViewController:(UIViewController *)viewController {
[viewController dismissViewControllerAnimated:YES completion:nil];
}
#pragma mark - private methods #pragma mark - private methods
// Wraps the iOS and macOS sign in display methods.
- (void)signInWithHint:(nullable NSString *)hint
additionalScopes:(nullable NSArray<NSString *> *)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
}
// Wraps the iOS and macOS scope addition methods.
- (void)addScopes:(NSArray<NSString *> *)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
}
/// @return @c nil if GoogleService-Info.plist not found and clientId is not provided. /// @return @c nil if GoogleService-Info.plist not found and clientId is not provided.
- (GIDConfiguration *)configurationWithClientIdArgument:(id)clientIDArg - (GIDConfiguration *)configurationWithClientIdArgument:(id)clientIDArg
serverClientIdArgument:(id)serverClientIDArg serverClientIdArgument:(id)serverClientIDArg
@ -299,6 +328,8 @@ static FlutterError *getFlutterError(NSError *error) {
} }
} }
#if TARGET_OS_IOS
- (UIViewController *)topViewController { - (UIViewController *)topViewController {
#pragma clang diagnostic push #pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wdeprecated-declarations" #pragma clang diagnostic ignored "-Wdeprecated-declarations"
@ -337,4 +368,6 @@ static FlutterError *getFlutterError(NSError *error) {
return viewController; return viewController;
} }
#endif
@end @end

View File

@ -29,12 +29,17 @@ NS_ASSUME_NONNULL_BEGIN
// sign in, sign out, and requesting additional scopes. // sign in, sign out, and requesting additional scopes.
@property(strong, readonly) GIDSignIn *signIn; @property(strong, readonly) GIDSignIn *signIn;
/// Inject @c FlutterPluginRegistrar for testing.
- (instancetype)initWithRegistrar:(NSObject<FlutterPluginRegistrar> *)registrar;
/// Inject @c GIDSignIn for testing. /// Inject @c GIDSignIn for testing.
- (instancetype)initWithSignIn:(GIDSignIn *)signIn; - (instancetype)initWithSignIn:(GIDSignIn *)signIn
registrar:(NSObject<FlutterPluginRegistrar> *)registrar;
/// Inject @c GIDSignIn and @c googleServiceProperties for testing. /// Inject @c GIDSignIn and @c googleServiceProperties for testing.
- (instancetype)initWithSignIn:(GIDSignIn *)signIn - (instancetype)initWithSignIn:(GIDSignIn *)signIn
withGoogleServiceProperties:(nullable NSDictionary<NSString *, id> *)googleServiceProperties registrar:(NSObject<FlutterPluginRegistrar> *)registrar
googleServiceProperties:(nullable NSDictionary<NSString *, id> *)googleServiceProperties
NS_DESIGNATED_INITIALIZER; NS_DESIGNATED_INITIALIZER;
@end @end

View File

@ -2,7 +2,12 @@
// Use of this source code is governed by a BSD-style license that can be // Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file. // found in the LICENSE file.
#include <TargetConditionals.h>
#if TARGET_OS_OSX
@import FlutterMacOS;
#else
@import Flutter; @import Flutter;
#endif
@import XCTest; @import XCTest;
@import google_sign_in_ios; @import google_sign_in_ios;
@ -33,7 +38,8 @@
self.mockSignIn = mockSignIn; self.mockSignIn = mockSignIn;
OCMStub(self.mockPluginRegistrar.messenger).andReturn(self.mockBinaryMessenger); 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]; [FLTGoogleSignInPlugin registerWithRegistrar:self.mockPluginRegistrar];
NSString *plistPath = NSString *plistPath =
@ -52,7 +58,8 @@
} }
- (void)testDisconnect { - (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"]; XCTestExpectation *expectation = [self expectationWithDescription:@"expect result returns true"];
[self.plugin disconnectWithCompletion:^(FlutterError *error) { [self.plugin disconnectWithCompletion:^(FlutterError *error) {
@ -63,10 +70,11 @@
} }
- (void)testDisconnectIgnoresError { - (void)testDisconnectIgnoresError {
NSError *error = [NSError errorWithDomain:kGIDSignInErrorDomain NSError *sdkError = [NSError errorWithDomain:kGIDSignInErrorDomain
code:kGIDSignInErrorCodeHasNoAuthInKeychain code:kGIDSignInErrorCodeHasNoAuthInKeychain
userInfo:nil]; userInfo:nil];
[[self.mockSignIn stub] disconnectWithCompletion:[OCMArg invokeBlockWithArgs:error, nil]]; [(GIDSignIn *)[self.mockSignIn stub]
disconnectWithCompletion:[OCMArg invokeBlockWithArgs:sdkError, nil]];
XCTestExpectation *expectation = [self expectationWithDescription:@"expect result returns true"]; XCTestExpectation *expectation = [self expectationWithDescription:@"expect result returns true"];
[self.plugin disconnectWithCompletion:^(FlutterError *error) { [self.plugin disconnectWithCompletion:^(FlutterError *error) {
@ -81,7 +89,8 @@
- (void)testInitNoClientIdNoError { - (void)testInitNoClientIdNoError {
// Init plugin without GoogleService-Info.plist. // Init plugin without GoogleService-Info.plist.
self.plugin = [[FLTGoogleSignInPlugin alloc] initWithSignIn:self.mockSignIn self.plugin = [[FLTGoogleSignInPlugin alloc] initWithSignIn:self.mockSignIn
withGoogleServiceProperties:nil]; registrar:self.mockPluginRegistrar
googleServiceProperties:nil];
// init call does not provide a clientId. // init call does not provide a clientId.
FSIInitParams *params = [FSIInitParams makeWithScopes:@[] FSIInitParams *params = [FSIInitParams makeWithScopes:@[]
@ -96,24 +105,24 @@
- (void)testInitGoogleServiceInfoPlist { - (void)testInitGoogleServiceInfoPlist {
self.plugin = [[FLTGoogleSignInPlugin alloc] initWithSignIn:self.mockSignIn self.plugin = [[FLTGoogleSignInPlugin alloc] initWithSignIn:self.mockSignIn
withGoogleServiceProperties:self.googleServiceInfo]; registrar:self.mockPluginRegistrar
googleServiceProperties:self.googleServiceInfo];
FSIInitParams *params = [FSIInitParams makeWithScopes:@[] FSIInitParams *params = [FSIInitParams makeWithScopes:@[]
hostedDomain:@"example.com" hostedDomain:@"example.com"
clientId:nil clientId:nil
serverClientId:nil]; serverClientId:nil];
FlutterError *error; FlutterError *initializationError;
[self.plugin initializeSignInWithParameters:params error:&error]; [self.plugin initializeSignInWithParameters:params error:&initializationError];
XCTAssertNil(error); XCTAssertNil(initializationError);
// Initialization values used in the next sign in request. // Initialization values used in the next sign in request.
[self.plugin signInWithCompletion:^(FSIUserData *user, FlutterError *error){ [self.plugin signInWithCompletion:^(FSIUserData *user, FlutterError *error){
}]; }];
OCMVerify([self.mockSignIn OCMVerify([self configureMock:self.mockSignIn
signInWithPresentingViewController:[OCMArg isKindOfClass:[FlutterViewController class]] forSignInWithHint:nil
hint:nil additionalScopes:OCMOCK_ANY
additionalScopes:OCMOCK_ANY completion:OCMOCK_ANY]);
completion:OCMOCK_ANY]);
XCTAssertEqualObjects(self.plugin.configuration.hostedDomain, @"example.com"); XCTAssertEqualObjects(self.plugin.configuration.hostedDomain, @"example.com");
// Set in example app GoogleService-Info.plist. // Set in example app GoogleService-Info.plist.
@ -126,25 +135,25 @@
- (void)testInitDynamicClientIdNullDomain { - (void)testInitDynamicClientIdNullDomain {
// Init plugin without GoogleService-Info.plist. // Init plugin without GoogleService-Info.plist.
self.plugin = [[FLTGoogleSignInPlugin alloc] initWithSignIn:self.mockSignIn self.plugin = [[FLTGoogleSignInPlugin alloc] initWithSignIn:self.mockSignIn
withGoogleServiceProperties:nil]; registrar:self.mockPluginRegistrar
googleServiceProperties:nil];
FSIInitParams *params = [FSIInitParams makeWithScopes:@[] FSIInitParams *params = [FSIInitParams makeWithScopes:@[]
hostedDomain:nil hostedDomain:nil
clientId:@"mockClientId" clientId:@"mockClientId"
serverClientId:nil]; serverClientId:nil];
FlutterError *error; FlutterError *initializationError;
[self.plugin initializeSignInWithParameters:params error:&error]; [self.plugin initializeSignInWithParameters:params error:&initializationError];
XCTAssertNil(error); XCTAssertNil(initializationError);
// Initialization values used in the next sign in request. // Initialization values used in the next sign in request.
[self.plugin signInWithCompletion:^(FSIUserData *user, FlutterError *error){ [self.plugin signInWithCompletion:^(FSIUserData *user, FlutterError *error){
}]; }];
OCMVerify([self.mockSignIn OCMVerify([self configureMock:self.mockSignIn
signInWithPresentingViewController:[OCMArg isKindOfClass:[FlutterViewController class]] forSignInWithHint:nil
hint:nil additionalScopes:OCMOCK_ANY
additionalScopes:OCMOCK_ANY completion:OCMOCK_ANY]);
completion:OCMOCK_ANY]);
XCTAssertEqualObjects(self.plugin.configuration.hostedDomain, nil); XCTAssertEqualObjects(self.plugin.configuration.hostedDomain, nil);
XCTAssertEqualObjects(self.plugin.configuration.clientID, @"mockClientId"); XCTAssertEqualObjects(self.plugin.configuration.clientID, @"mockClientId");
@ -153,23 +162,23 @@
- (void)testInitDynamicServerClientIdNullDomain { - (void)testInitDynamicServerClientIdNullDomain {
self.plugin = [[FLTGoogleSignInPlugin alloc] initWithSignIn:self.mockSignIn self.plugin = [[FLTGoogleSignInPlugin alloc] initWithSignIn:self.mockSignIn
withGoogleServiceProperties:self.googleServiceInfo]; registrar:self.mockPluginRegistrar
googleServiceProperties:self.googleServiceInfo];
FSIInitParams *params = [FSIInitParams makeWithScopes:@[] FSIInitParams *params = [FSIInitParams makeWithScopes:@[]
hostedDomain:nil hostedDomain:nil
clientId:nil clientId:nil
serverClientId:@"mockServerClientId"]; serverClientId:@"mockServerClientId"];
FlutterError *error; FlutterError *initializationError;
[self.plugin initializeSignInWithParameters:params error:&error]; [self.plugin initializeSignInWithParameters:params error:&initializationError];
XCTAssertNil(error); XCTAssertNil(initializationError);
// Initialization values used in the next sign in request. // Initialization values used in the next sign in request.
[self.plugin signInWithCompletion:^(FSIUserData *user, FlutterError *error){ [self.plugin signInWithCompletion:^(FSIUserData *user, FlutterError *error){
}]; }];
OCMVerify([self.mockSignIn OCMVerify([self configureMock:self.mockSignIn
signInWithPresentingViewController:[OCMArg isKindOfClass:[FlutterViewController class]] forSignInWithHint:nil
hint:nil additionalScopes:OCMOCK_ANY
additionalScopes:OCMOCK_ANY completion:OCMOCK_ANY]);
completion:OCMOCK_ANY]);
XCTAssertEqualObjects(self.plugin.configuration.hostedDomain, nil); XCTAssertEqualObjects(self.plugin.configuration.hostedDomain, nil);
// Set in example app GoogleService-Info.plist. // Set in example app GoogleService-Info.plist.
@ -186,7 +195,7 @@
serverClientId:nil]; serverClientId:nil];
FlutterError *error; FlutterError *error;
self.plugin = [[FLTGoogleSignInPlugin alloc] init]; self.plugin = [[FLTGoogleSignInPlugin alloc] initWithRegistrar:self.mockPluginRegistrar];
[self.plugin initializeSignInWithParameters:params error:&error]; [self.plugin initializeSignInWithParameters:params error:&error];
XCTAssertNil(error); XCTAssertNil(error);
XCTAssertNil(self.plugin.configuration); XCTAssertNil(self.plugin.configuration);
@ -243,12 +252,13 @@
} }
- (void)testSignInSilentlyWithError { - (void)testSignInSilentlyWithError {
NSError *error = [NSError errorWithDomain:kGIDSignInErrorDomain NSError *sdkError = [NSError errorWithDomain:kGIDSignInErrorDomain
code:kGIDSignInErrorCodeHasNoAuthInKeychain code:kGIDSignInErrorCodeHasNoAuthInKeychain
userInfo:nil]; userInfo:nil];
[[self.mockSignIn stub] [[self.mockSignIn stub]
restorePreviousSignInWithCompletion:[OCMArg invokeBlockWithArgs:[NSNull null], error, nil]]; restorePreviousSignInWithCompletion:[OCMArg
invokeBlockWithArgs:[NSNull null], sdkError, nil]];
XCTestExpectation *expectation = [self expectationWithDescription:@"completion called"]; XCTestExpectation *expectation = [self expectationWithDescription:@"completion called"];
[self.plugin signInSilentlyWithCompletion:^(FSIUserData *user, FlutterError *error) { [self.plugin signInSilentlyWithCompletion:^(FSIUserData *user, FlutterError *error) {
@ -263,7 +273,8 @@
- (void)testSignIn { - (void)testSignIn {
self.plugin = [[FLTGoogleSignInPlugin alloc] initWithSignIn:self.mockSignIn self.plugin = [[FLTGoogleSignInPlugin alloc] initWithSignIn:self.mockSignIn
withGoogleServiceProperties:self.googleServiceInfo]; registrar:self.mockPluginRegistrar
googleServiceProperties:self.googleServiceInfo];
id mockUser = OCMClassMock([GIDGoogleUser class]); id mockUser = OCMClassMock([GIDGoogleUser class]);
id mockUserProfile = OCMClassMock([GIDProfileData class]); id mockUserProfile = OCMClassMock([GIDProfileData class]);
OCMStub([mockUserProfile name]).andReturn(@"mockDisplay"); OCMStub([mockUserProfile name]).andReturn(@"mockDisplay");
@ -279,12 +290,10 @@
OCMStub([mockSignInResult user]).andReturn(mockUser); OCMStub([mockSignInResult user]).andReturn(mockUser);
OCMStub([mockSignInResult serverAuthCode]).andReturn(@"mockAuthCode"); OCMStub([mockSignInResult serverAuthCode]).andReturn(@"mockAuthCode");
[[self.mockSignIn expect] [self configureMock:[self.mockSignIn expect]
signInWithPresentingViewController:[OCMArg isKindOfClass:[FlutterViewController class]] forSignInWithHint:nil
hint:nil additionalScopes:@[]
additionalScopes:@[] completion:[OCMArg invokeBlockWithArgs:mockSignInResult, [NSNull null], nil]];
completion:[OCMArg invokeBlockWithArgs:mockSignInResult,
[NSNull null], nil]];
XCTestExpectation *expectation = [self expectationWithDescription:@"completion called"]; XCTestExpectation *expectation = [self expectationWithDescription:@"completion called"];
[self.plugin signInWithCompletion:^(FSIUserData *user, FlutterError *error) { [self.plugin signInWithCompletion:^(FSIUserData *user, FlutterError *error) {
@ -307,28 +316,26 @@
} }
- (void)testSignInWithInitializedScopes { - (void)testSignInWithInitializedScopes {
FlutterError *error; FlutterError *initializationError;
[self.plugin [self.plugin
initializeSignInWithParameters:[FSIInitParams makeWithScopes:@[ @"initial1", @"initial2" ] initializeSignInWithParameters:[FSIInitParams makeWithScopes:@[ @"initial1", @"initial2" ]
hostedDomain:nil hostedDomain:nil
clientId:nil clientId:nil
serverClientId:nil] serverClientId:nil]
error:&error]; error:&initializationError];
id mockUser = OCMClassMock([GIDGoogleUser class]); id mockUser = OCMClassMock([GIDGoogleUser class]);
OCMStub([mockUser userID]).andReturn(@"mockID"); OCMStub([mockUser userID]).andReturn(@"mockID");
id mockSignInResult = OCMClassMock([GIDSignInResult class]); id mockSignInResult = OCMClassMock([GIDSignInResult class]);
OCMStub([mockSignInResult user]).andReturn(mockUser); OCMStub([mockSignInResult user]).andReturn(mockUser);
[[self.mockSignIn expect] [self configureMock:[self.mockSignIn expect]
signInWithPresentingViewController:OCMOCK_ANY forSignInWithHint:nil
hint:nil additionalScopes:[OCMArg checkWithBlock:^BOOL(NSArray<NSString *> *scopes) {
additionalScopes:[OCMArg checkWithBlock:^BOOL(NSArray<NSString *> *scopes) { return [[NSSet setWithArray:scopes]
return [[NSSet setWithArray:scopes] isEqualToSet:[NSSet setWithObjects:@"initial1", @"initial2", nil]];
isEqualToSet:[NSSet setWithObjects:@"initial1", @"initial2", nil]]; }]
}] completion:[OCMArg invokeBlockWithArgs:mockSignInResult, [NSNull null], nil]];
completion:[OCMArg invokeBlockWithArgs:mockSignInResult,
[NSNull null], nil]];
XCTestExpectation *expectation = [self expectationWithDescription:@"completion called"]; XCTestExpectation *expectation = [self expectationWithDescription:@"completion called"];
[self.plugin signInWithCompletion:^(FSIUserData *user, FlutterError *error) { [self.plugin signInWithCompletion:^(FSIUserData *user, FlutterError *error) {
@ -347,19 +354,17 @@
id mockSignInResult = OCMClassMock([GIDSignInResult class]); id mockSignInResult = OCMClassMock([GIDSignInResult class]);
OCMStub([mockSignInResult user]).andReturn(mockUser); OCMStub([mockSignInResult user]).andReturn(mockUser);
[[self.mockSignIn stub] [self configureMock:[self.mockSignIn stub]
signInWithPresentingViewController:OCMOCK_ANY forSignInWithHint:nil
hint:nil additionalScopes:OCMOCK_ANY
additionalScopes:OCMOCK_ANY completion:[OCMArg invokeBlockWithArgs:mockSignInResult, [NSNull null], nil]];
completion:[OCMArg invokeBlockWithArgs:mockSignInResult,
[NSNull null], nil]];
NSError *error = [NSError errorWithDomain:kGIDSignInErrorDomain NSError *sdkError = [NSError errorWithDomain:kGIDSignInErrorDomain
code:kGIDSignInErrorCodeScopesAlreadyGranted code:kGIDSignInErrorCodeScopesAlreadyGranted
userInfo:nil]; userInfo:nil];
[[self.mockSignIn currentUser] addScopes:OCMOCK_ANY [self configureMock:mockUser
presentingViewController:OCMOCK_ANY forAddScopes:OCMOCK_ANY
completion:[OCMArg invokeBlockWithArgs:[NSNull null], error, nil]]; completion:[OCMArg invokeBlockWithArgs:[NSNull null], sdkError, nil]];
XCTestExpectation *expectation = [self expectationWithDescription:@"completion called"]; XCTestExpectation *expectation = [self expectationWithDescription:@"completion called"];
[self.plugin signInWithCompletion:^(FSIUserData *user, FlutterError *error) { [self.plugin signInWithCompletion:^(FSIUserData *user, FlutterError *error) {
@ -371,14 +376,13 @@
} }
- (void)testSignInError { - (void)testSignInError {
NSError *error = [NSError errorWithDomain:kGIDSignInErrorDomain NSError *sdkError = [NSError errorWithDomain:kGIDSignInErrorDomain
code:kGIDSignInErrorCodeCanceled code:kGIDSignInErrorCodeCanceled
userInfo:nil]; userInfo:nil];
[[self.mockSignIn stub] [self configureMock:[self.mockSignIn stub]
signInWithPresentingViewController:OCMOCK_ANY forSignInWithHint:nil
hint:nil additionalScopes:OCMOCK_ANY
additionalScopes:OCMOCK_ANY completion:[OCMArg invokeBlockWithArgs:[NSNull null], sdkError, nil]];
completion:[OCMArg invokeBlockWithArgs:[NSNull null], error, nil]];
XCTestExpectation *expectation = [self expectationWithDescription:@"completion called"]; XCTestExpectation *expectation = [self expectationWithDescription:@"completion called"];
[self.plugin signInWithCompletion:^(FSIUserData *user, FlutterError *error) { [self.plugin signInWithCompletion:^(FSIUserData *user, FlutterError *error) {
@ -390,10 +394,10 @@
} }
- (void)testSignInException { - (void)testSignInException {
OCMExpect([self.mockSignIn signInWithPresentingViewController:OCMOCK_ANY OCMExpect([self configureMock:self.mockSignIn
hint:OCMOCK_ANY forSignInWithHint:OCMOCK_ANY
additionalScopes:OCMOCK_ANY additionalScopes:OCMOCK_ANY
completion:OCMOCK_ANY]) completion:OCMOCK_ANY])
.andThrow([NSException exceptionWithName:@"MockName" reason:@"MockReason" userInfo:nil]); .andThrow([NSException exceptionWithName:@"MockName" reason:@"MockReason" userInfo:nil]);
__block FlutterError *error; __block FlutterError *error;
@ -441,11 +445,11 @@
id mockUser = OCMClassMock([GIDGoogleUser class]); id mockUser = OCMClassMock([GIDGoogleUser class]);
OCMStub([self.mockSignIn currentUser]).andReturn(mockUser); OCMStub([self.mockSignIn currentUser]).andReturn(mockUser);
NSError *error = [NSError errorWithDomain:kGIDSignInErrorDomain NSError *sdkError = [NSError errorWithDomain:kGIDSignInErrorDomain
code:kGIDSignInErrorCodeHasNoAuthInKeychain code:kGIDSignInErrorCodeHasNoAuthInKeychain
userInfo:nil]; userInfo:nil];
[[mockUser stub] [[mockUser stub] refreshTokensIfNeededWithCompletion:[OCMArg invokeBlockWithArgs:[NSNull null],
refreshTokensIfNeededWithCompletion:[OCMArg invokeBlockWithArgs:[NSNull null], error, nil]]; sdkError, nil]];
XCTestExpectation *expectation = [self expectationWithDescription:@"completion called"]; XCTestExpectation *expectation = [self expectationWithDescription:@"completion called"];
[self.plugin getAccessTokenWithCompletion:^(FSITokenData *token, FlutterError *error) { [self.plugin getAccessTokenWithCompletion:^(FSITokenData *token, FlutterError *error) {
@ -461,11 +465,11 @@
id mockUser = OCMClassMock([GIDGoogleUser class]); id mockUser = OCMClassMock([GIDGoogleUser class]);
OCMStub([self.mockSignIn currentUser]).andReturn(mockUser); OCMStub([self.mockSignIn currentUser]).andReturn(mockUser);
NSError *error = [NSError errorWithDomain:kGIDSignInErrorDomain NSError *sdkError = [NSError errorWithDomain:kGIDSignInErrorDomain
code:kGIDSignInErrorCodeCanceled code:kGIDSignInErrorCodeCanceled
userInfo:nil]; userInfo:nil];
[[mockUser stub] [[mockUser stub] refreshTokensIfNeededWithCompletion:[OCMArg invokeBlockWithArgs:[NSNull null],
refreshTokensIfNeededWithCompletion:[OCMArg invokeBlockWithArgs:[NSNull null], error, nil]]; sdkError, nil]];
XCTestExpectation *expectation = [self expectationWithDescription:@"completion called"]; XCTestExpectation *expectation = [self expectationWithDescription:@"completion called"];
[self.plugin getAccessTokenWithCompletion:^(FSITokenData *token, FlutterError *error) { [self.plugin getAccessTokenWithCompletion:^(FSITokenData *token, FlutterError *error) {
@ -481,9 +485,11 @@
id mockUser = OCMClassMock([GIDGoogleUser class]); id mockUser = OCMClassMock([GIDGoogleUser class]);
OCMStub([self.mockSignIn currentUser]).andReturn(mockUser); OCMStub([self.mockSignIn currentUser]).andReturn(mockUser);
NSError *error = [NSError errorWithDomain:NSURLErrorDomain code:NSURLErrorTimedOut userInfo:nil]; NSError *sdkError = [NSError errorWithDomain:NSURLErrorDomain
[[mockUser stub] code:NSURLErrorTimedOut
refreshTokensIfNeededWithCompletion:[OCMArg invokeBlockWithArgs:[NSNull null], error, nil]]; userInfo:nil];
[[mockUser stub] refreshTokensIfNeededWithCompletion:[OCMArg invokeBlockWithArgs:[NSNull null],
sdkError, nil]];
XCTestExpectation *expectation = [self expectationWithDescription:@"completion called"]; XCTestExpectation *expectation = [self expectationWithDescription:@"completion called"];
[self.plugin getAccessTokenWithCompletion:^(FSITokenData *token, FlutterError *error) { [self.plugin getAccessTokenWithCompletion:^(FSITokenData *token, FlutterError *error) {
@ -499,9 +505,9 @@
id mockUser = OCMClassMock([GIDGoogleUser class]); id mockUser = OCMClassMock([GIDGoogleUser class]);
OCMStub([self.mockSignIn currentUser]).andReturn(mockUser); OCMStub([self.mockSignIn currentUser]).andReturn(mockUser);
NSError *error = [NSError errorWithDomain:@"BogusDomain" code:42 userInfo:nil]; NSError *sdkError = [NSError errorWithDomain:@"BogusDomain" code:42 userInfo:nil];
[[mockUser stub] [[mockUser stub] refreshTokensIfNeededWithCompletion:[OCMArg invokeBlockWithArgs:[NSNull null],
refreshTokensIfNeededWithCompletion:[OCMArg invokeBlockWithArgs:[NSNull null], error, nil]]; sdkError, nil]];
XCTestExpectation *expectation = [self expectationWithDescription:@"completion called"]; XCTestExpectation *expectation = [self expectationWithDescription:@"completion called"];
[self.plugin getAccessTokenWithCompletion:^(FSITokenData *token, FlutterError *error) { [self.plugin getAccessTokenWithCompletion:^(FSITokenData *token, FlutterError *error) {
@ -530,12 +536,12 @@
id mockUser = OCMClassMock([GIDGoogleUser class]); id mockUser = OCMClassMock([GIDGoogleUser class]);
OCMStub([self.mockSignIn currentUser]).andReturn(mockUser); OCMStub([self.mockSignIn currentUser]).andReturn(mockUser);
NSError *error = [NSError errorWithDomain:kGIDSignInErrorDomain NSError *sdkError = [NSError errorWithDomain:kGIDSignInErrorDomain
code:kGIDSignInErrorCodeScopesAlreadyGranted code:kGIDSignInErrorCodeScopesAlreadyGranted
userInfo:nil]; userInfo:nil];
[[mockUser stub] addScopes:@[ @"mockScope1" ] [self configureMock:[mockUser stub]
presentingViewController:OCMOCK_ANY forAddScopes:@[ @"mockScope1" ]
completion:[OCMArg invokeBlockWithArgs:[NSNull null], error, nil]]; completion:[OCMArg invokeBlockWithArgs:[NSNull null], sdkError, nil]];
XCTestExpectation *expectation = [self expectationWithDescription:@"completion called"]; XCTestExpectation *expectation = [self expectationWithDescription:@"completion called"];
[self.plugin requestScopes:@[ @"mockScope1" ] [self.plugin requestScopes:@[ @"mockScope1" ]
@ -551,12 +557,12 @@
id mockUser = OCMClassMock([GIDGoogleUser class]); id mockUser = OCMClassMock([GIDGoogleUser class]);
OCMStub([self.mockSignIn currentUser]).andReturn(mockUser); OCMStub([self.mockSignIn currentUser]).andReturn(mockUser);
NSError *error = [NSError errorWithDomain:kGIDSignInErrorDomain NSError *sdkError = [NSError errorWithDomain:kGIDSignInErrorDomain
code:kGIDSignInErrorCodeMismatchWithCurrentUser code:kGIDSignInErrorCodeMismatchWithCurrentUser
userInfo:nil]; userInfo:nil];
[[mockUser stub] addScopes:@[ @"mockScope1" ] [self configureMock:[mockUser stub]
presentingViewController:OCMOCK_ANY forAddScopes:@[ @"mockScope1" ]
completion:[OCMArg invokeBlockWithArgs:[NSNull null], error, nil]]; completion:[OCMArg invokeBlockWithArgs:[NSNull null], sdkError, nil]];
XCTestExpectation *expectation = [self expectationWithDescription:@"completion called"]; XCTestExpectation *expectation = [self expectationWithDescription:@"completion called"];
[self.plugin requestScopes:@[ @"mockScope1" ] [self.plugin requestScopes:@[ @"mockScope1" ]
@ -572,10 +578,10 @@
id mockUser = OCMClassMock([GIDGoogleUser class]); id mockUser = OCMClassMock([GIDGoogleUser class]);
OCMStub([self.mockSignIn currentUser]).andReturn(mockUser); OCMStub([self.mockSignIn currentUser]).andReturn(mockUser);
NSError *error = [NSError errorWithDomain:@"BogusDomain" code:42 userInfo:nil]; NSError *sdkError = [NSError errorWithDomain:@"BogusDomain" code:42 userInfo:nil];
[[mockUser stub] addScopes:@[ @"mockScope1" ] [self configureMock:[mockUser stub]
presentingViewController:OCMOCK_ANY forAddScopes:@[ @"mockScope1" ]
completion:[OCMArg invokeBlockWithArgs:[NSNull null], error, nil]]; completion:[OCMArg invokeBlockWithArgs:[NSNull null], sdkError, nil]];
XCTestExpectation *expectation = [self expectationWithDescription:@"completion called"]; XCTestExpectation *expectation = [self expectationWithDescription:@"completion called"];
[self.plugin requestScopes:@[ @"mockScope1" ] [self.plugin requestScopes:@[ @"mockScope1" ]
@ -591,7 +597,7 @@
id mockUser = OCMClassMock([GIDGoogleUser class]); id mockUser = OCMClassMock([GIDGoogleUser class]);
OCMStub([self.mockSignIn currentUser]).andReturn(mockUser); 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]); .andThrow([NSException exceptionWithName:@"MockName" reason:@"MockReason" userInfo:nil]);
[self.plugin requestScopes:@[] [self.plugin requestScopes:@[]
@ -613,9 +619,9 @@
OCMStub([mockUser grantedScopes]).andReturn(@[ @"mockScope1" ]); OCMStub([mockUser grantedScopes]).andReturn(@[ @"mockScope1" ]);
OCMStub([mockSignInResult user]).andReturn(mockUser); OCMStub([mockSignInResult user]).andReturn(mockUser);
[[mockUser stub] addScopes:requestedScopes [self configureMock:[mockUser stub]
presentingViewController:OCMOCK_ANY forAddScopes:requestedScopes
completion:[OCMArg invokeBlockWithArgs:mockSignInResult, [NSNull null], nil]]; completion:[OCMArg invokeBlockWithArgs:mockSignInResult, [NSNull null], nil]];
XCTestExpectation *expectation = [self expectationWithDescription:@"completion called"]; XCTestExpectation *expectation = [self expectationWithDescription:@"completion called"];
[self.plugin requestScopes:requestedScopes [self.plugin requestScopes:requestedScopes
@ -635,9 +641,9 @@
hostedDomain:nil hostedDomain:nil
clientId:nil clientId:nil
serverClientId:nil]; serverClientId:nil];
FlutterError *error; FlutterError *initializationError;
[self.plugin initializeSignInWithParameters:params error:&error]; [self.plugin initializeSignInWithParameters:params error:&initializationError];
XCTAssertNil(error); XCTAssertNil(initializationError);
// Include one of the initially requested scopes. // Include one of the initially requested scopes.
NSArray<NSString *> *addedScopes = @[ @"initial1", @"addScope1", @"addScope2" ]; NSArray<NSString *> *addedScopes = @[ @"initial1", @"addScope1", @"addScope2" ];
@ -647,13 +653,13 @@
}]; }];
// All four scopes are requested. // All four scopes are requested.
[[mockUser verify] addScopes:[OCMArg checkWithBlock:^BOOL(NSArray<NSString *> *scopes) { [self configureMock:[mockUser verify]
return [[NSSet setWithArray:scopes] forAddScopes:[OCMArg checkWithBlock:^BOOL(NSArray<NSString *> *scopes) {
isEqualToSet:[NSSet setWithObjects:@"initial1", @"initial2", return [[NSSet setWithArray:scopes]
@"addScope1", @"addScope2", nil]]; isEqualToSet:[NSSet setWithObjects:@"initial1", @"initial2", @"addScope1",
}] @"addScope2", nil]];
presentingViewController:OCMOCK_ANY }]
completion:OCMOCK_ANY]; completion:OCMOCK_ANY];
} }
- (void)testRequestScopesReturnsTrueIfGranted { - (void)testRequestScopesReturnsTrueIfGranted {
@ -666,9 +672,9 @@
OCMStub([mockUser grantedScopes]).andReturn(requestedScopes); OCMStub([mockUser grantedScopes]).andReturn(requestedScopes);
OCMStub([mockSignInResult user]).andReturn(mockUser); OCMStub([mockSignInResult user]).andReturn(mockUser);
[[mockUser stub] addScopes:requestedScopes [self configureMock:[mockUser stub]
presentingViewController:OCMOCK_ANY forAddScopes:requestedScopes
completion:[OCMArg invokeBlockWithArgs:mockSignInResult, [NSNull null], nil]]; completion:[OCMArg invokeBlockWithArgs:mockSignInResult, [NSNull null], nil]];
XCTestExpectation *expectation = [self expectationWithDescription:@"completion called"]; XCTestExpectation *expectation = [self expectationWithDescription:@"completion called"];
[self.plugin requestScopes:requestedScopes [self.plugin requestScopes:requestedScopes
@ -680,4 +686,34 @@
[self waitForExpectationsWithTimeout:5.0 handler:nil]; [self waitForExpectationsWithTimeout:5.0 handler:nil];
} }
#pragma mark - Utils
- (void)configureMock:(id)mock
forAddScopes:(NSArray<NSString *> *)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<NSString *> *)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 @end

View File

@ -15,9 +15,11 @@ Enables Google Sign-In in Flutter apps.
s.source_files = 'Classes/**/*.{h,m}' s.source_files = 'Classes/**/*.{h,m}'
s.public_header_files = 'Classes/**/*.h' s.public_header_files = 'Classes/**/*.h'
s.module_map = 'Classes/FLTGoogleSignInPlugin.modulemap' s.module_map = 'Classes/FLTGoogleSignInPlugin.modulemap'
s.dependency 'Flutter'
s.dependency 'GoogleSignIn', '~> 7.0' s.dependency 'GoogleSignIn', '~> 7.0'
s.static_framework = true 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' } s.pod_target_xcconfig = { 'DEFINES_MODULE' => 'YES' }
end end

View File

@ -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 = "<group>"; }; 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 = "<group>"; };
5C6F5A6C1EC3B4CB008D64B5 /* GeneratedPluginRegistrant.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = GeneratedPluginRegistrant.h; sourceTree = "<group>"; }; 5C6F5A6C1EC3B4CB008D64B5 /* GeneratedPluginRegistrant.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = GeneratedPluginRegistrant.h; sourceTree = "<group>"; };
5C6F5A6D1EC3B4CB008D64B5 /* GeneratedPluginRegistrant.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GeneratedPluginRegistrant.m; sourceTree = "<group>"; }; 5C6F5A6D1EC3B4CB008D64B5 /* GeneratedPluginRegistrant.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GeneratedPluginRegistrant.m; sourceTree = "<group>"; };
7A303C2D1E89D76400B1F19E /* GoogleService-Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = "GoogleService-Info.plist"; sourceTree = "<group>"; }; 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 = "<group>"; }; 7ACDFB0D1E8944C400BE2D00 /* AppFrameworkInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = AppFrameworkInfo.plist; path = Flutter/AppFrameworkInfo.plist; sourceTree = "<group>"; };
7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = Release.xcconfig; path = Flutter/Release.xcconfig; sourceTree = "<group>"; }; 7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = Release.xcconfig; path = Flutter/Release.xcconfig; sourceTree = "<group>"; };
7AFFD8ED1D35381100E5BB4D /* AppDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AppDelegate.h; sourceTree = "<group>"; }; 7AFFD8ED1D35381100E5BB4D /* AppDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AppDelegate.h; sourceTree = "<group>"; };
@ -74,7 +74,7 @@
97C147021CF9000F007C117D /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; }; 97C147021CF9000F007C117D /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
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 = "<group>"; }; 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 = "<group>"; };
F76AC1A22666D0540040C8BC /* RunnerTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = RunnerTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; 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 = "<group>"; }; 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 = "<group>"; }; F76AC1A62666D0540040C8BC /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
F76AC1B02666D0610040C8BC /* RunnerUITests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = RunnerUITests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; 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 = "<group>"; }; F76AC1B22666D0610040C8BC /* GoogleSignInUITests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = GoogleSignInUITests.m; sourceTree = "<group>"; };
@ -189,8 +189,8 @@
F76AC1A32666D0540040C8BC /* RunnerTests */ = { F76AC1A32666D0540040C8BC /* RunnerTests */ = {
isa = PBXGroup; isa = PBXGroup;
children = ( children = (
F76AC1A42666D0540040C8BC /* GoogleSignInTests.m */,
7A303C2D1E89D76400B1F19E /* GoogleService-Info.plist */, 7A303C2D1E89D76400B1F19E /* GoogleService-Info.plist */,
F76AC1A42666D0540040C8BC /* GoogleSignInTests.m */,
F76AC1A62666D0540040C8BC /* Info.plist */, F76AC1A62666D0540040C8BC /* Info.plist */,
); );
path = RunnerTests; path = RunnerTests;
@ -611,7 +611,10 @@
"$(PROJECT_DIR)/Flutter", "$(PROJECT_DIR)/Flutter",
); );
INFOPLIST_FILE = Runner/Info.plist; INFOPLIST_FILE = Runner/Info.plist;
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)",
"@executable_path/Frameworks",
);
LIBRARY_SEARCH_PATHS = ( LIBRARY_SEARCH_PATHS = (
"$(inherited)", "$(inherited)",
"$(PROJECT_DIR)/Flutter", "$(PROJECT_DIR)/Flutter",
@ -632,7 +635,10 @@
"$(PROJECT_DIR)/Flutter", "$(PROJECT_DIR)/Flutter",
); );
INFOPLIST_FILE = Runner/Info.plist; INFOPLIST_FILE = Runner/Info.plist;
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)",
"@executable_path/Frameworks",
);
LIBRARY_SEARCH_PATHS = ( LIBRARY_SEARCH_PATHS = (
"$(inherited)", "$(inherited)",
"$(PROJECT_DIR)/Flutter", "$(PROJECT_DIR)/Flutter",
@ -649,7 +655,11 @@
BUNDLE_LOADER = "$(TEST_HOST)"; BUNDLE_LOADER = "$(TEST_HOST)";
CODE_SIGN_STYLE = Automatic; CODE_SIGN_STYLE = Automatic;
INFOPLIST_FILE = RunnerTests/Info.plist; 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_BUNDLE_IDENTIFIER = dev.flutter.plugins.RunnerTests;
PRODUCT_NAME = "$(TARGET_NAME)"; PRODUCT_NAME = "$(TARGET_NAME)";
TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Runner.app/Runner"; TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Runner.app/Runner";
@ -663,7 +673,11 @@
BUNDLE_LOADER = "$(TEST_HOST)"; BUNDLE_LOADER = "$(TEST_HOST)";
CODE_SIGN_STYLE = Automatic; CODE_SIGN_STYLE = Automatic;
INFOPLIST_FILE = RunnerTests/Info.plist; 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_BUNDLE_IDENTIFIER = dev.flutter.plugins.RunnerTests;
PRODUCT_NAME = "$(TARGET_NAME)"; PRODUCT_NAME = "$(TARGET_NAME)";
TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Runner.app/Runner"; TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Runner.app/Runner";
@ -675,7 +689,11 @@
buildSettings = { buildSettings = {
CODE_SIGN_STYLE = Automatic; CODE_SIGN_STYLE = Automatic;
INFOPLIST_FILE = RunnerUITests/Info.plist; 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_BUNDLE_IDENTIFIER = dev.flutter.plugins.RunnerUITests;
PRODUCT_NAME = "$(TARGET_NAME)"; PRODUCT_NAME = "$(TARGET_NAME)";
TEST_TARGET_NAME = Runner; TEST_TARGET_NAME = Runner;
@ -687,7 +705,11 @@
buildSettings = { buildSettings = {
CODE_SIGN_STYLE = Automatic; CODE_SIGN_STYLE = Automatic;
INFOPLIST_FILE = RunnerUITests/Info.plist; 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_BUNDLE_IDENTIFIER = dev.flutter.plugins.RunnerUITests;
PRODUCT_NAME = "$(TARGET_NAME)"; PRODUCT_NAME = "$(TARGET_NAME)";
TEST_TARGET_NAME = Runner; TEST_TARGET_NAME = Runner;

View File

@ -1,116 +1,121 @@
{ {
"images" : [ "images" : [
{ {
"size" : "20x20",
"idiom" : "iphone",
"filename" : "Icon-App-20x20@2x.png", "filename" : "Icon-App-20x20@2x.png",
"scale" : "2x" "idiom" : "iphone",
"scale" : "2x",
"size" : "20x20"
}, },
{ {
"size" : "20x20",
"idiom" : "iphone",
"filename" : "Icon-App-20x20@3x.png", "filename" : "Icon-App-20x20@3x.png",
"scale" : "3x" "idiom" : "iphone",
"scale" : "3x",
"size" : "20x20"
}, },
{ {
"size" : "29x29",
"idiom" : "iphone",
"filename" : "Icon-App-29x29@1x.png", "filename" : "Icon-App-29x29@1x.png",
"scale" : "1x" "idiom" : "iphone",
"scale" : "1x",
"size" : "29x29"
}, },
{ {
"size" : "29x29",
"idiom" : "iphone",
"filename" : "Icon-App-29x29@2x.png", "filename" : "Icon-App-29x29@2x.png",
"scale" : "2x" "idiom" : "iphone",
"scale" : "2x",
"size" : "29x29"
}, },
{ {
"size" : "29x29",
"idiom" : "iphone",
"filename" : "Icon-App-29x29@3x.png", "filename" : "Icon-App-29x29@3x.png",
"scale" : "3x" "idiom" : "iphone",
"scale" : "3x",
"size" : "29x29"
}, },
{ {
"size" : "40x40",
"idiom" : "iphone",
"filename" : "Icon-App-40x40@2x.png", "filename" : "Icon-App-40x40@2x.png",
"scale" : "2x" "idiom" : "iphone",
"scale" : "2x",
"size" : "40x40"
}, },
{ {
"size" : "40x40",
"idiom" : "iphone",
"filename" : "Icon-App-40x40@3x.png", "filename" : "Icon-App-40x40@3x.png",
"scale" : "3x" "idiom" : "iphone",
"scale" : "3x",
"size" : "40x40"
}, },
{ {
"size" : "60x60",
"idiom" : "iphone",
"filename" : "Icon-App-60x60@2x.png", "filename" : "Icon-App-60x60@2x.png",
"scale" : "2x"
},
{
"size" : "60x60",
"idiom" : "iphone", "idiom" : "iphone",
"scale" : "2x",
"size" : "60x60"
},
{
"filename" : "Icon-App-60x60@3x.png", "filename" : "Icon-App-60x60@3x.png",
"scale" : "3x" "idiom" : "iphone",
"scale" : "3x",
"size" : "60x60"
}, },
{ {
"size" : "20x20",
"idiom" : "ipad",
"filename" : "Icon-App-20x20@1x.png", "filename" : "Icon-App-20x20@1x.png",
"scale" : "1x" "idiom" : "ipad",
"scale" : "1x",
"size" : "20x20"
}, },
{ {
"size" : "20x20",
"idiom" : "ipad",
"filename" : "Icon-App-20x20@2x.png", "filename" : "Icon-App-20x20@2x.png",
"scale" : "2x" "idiom" : "ipad",
"scale" : "2x",
"size" : "20x20"
}, },
{ {
"size" : "29x29",
"idiom" : "ipad",
"filename" : "Icon-App-29x29@1x.png", "filename" : "Icon-App-29x29@1x.png",
"scale" : "1x" "idiom" : "ipad",
"scale" : "1x",
"size" : "29x29"
}, },
{ {
"size" : "29x29",
"idiom" : "ipad",
"filename" : "Icon-App-29x29@2x.png", "filename" : "Icon-App-29x29@2x.png",
"scale" : "2x" "idiom" : "ipad",
"scale" : "2x",
"size" : "29x29"
}, },
{ {
"size" : "40x40",
"idiom" : "ipad",
"filename" : "Icon-App-40x40@1x.png", "filename" : "Icon-App-40x40@1x.png",
"scale" : "1x" "idiom" : "ipad",
"scale" : "1x",
"size" : "40x40"
}, },
{ {
"size" : "40x40",
"idiom" : "ipad",
"filename" : "Icon-App-40x40@2x.png", "filename" : "Icon-App-40x40@2x.png",
"scale" : "2x" "idiom" : "ipad",
"scale" : "2x",
"size" : "40x40"
}, },
{ {
"size" : "76x76",
"idiom" : "ipad",
"filename" : "Icon-App-76x76@1x.png", "filename" : "Icon-App-76x76@1x.png",
"scale" : "1x" "idiom" : "ipad",
"scale" : "1x",
"size" : "76x76"
}, },
{ {
"size" : "76x76",
"idiom" : "ipad",
"filename" : "Icon-App-76x76@2x.png", "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", "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" : { "info" : {
"version" : 1, "author" : "xcode",
"author" : "xcode" "version" : 1
} }
} }

View File

@ -0,0 +1,7 @@
# Flutter-related
**/Flutter/ephemeral/
**/Pods/
# Xcode-related
**/dgph
**/xcuserdata/

View File

@ -0,0 +1,2 @@
#include? "Pods/Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"
#include "ephemeral/Flutter-Generated.xcconfig"

View File

@ -0,0 +1,2 @@
#include? "Pods/Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"
#include "ephemeral/Flutter-Generated.xcconfig"

View File

@ -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

View File

@ -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 = "<group>"; };
330B3F8C2B1E2A5800E6DC3F /* GoogleService-Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = "GoogleService-Info.plist"; path = "../../../darwin/Tests/GoogleService-Info.plist"; sourceTree = "<group>"; };
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 = "<group>"; };
335BBD1A22A9A15E00E9071D /* GeneratedPluginRegistrant.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = GeneratedPluginRegistrant.swift; sourceTree = "<group>"; };
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 = "<group>"; };
33CC10F22044A3C60003C045 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; name = Assets.xcassets; path = Runner/Assets.xcassets; sourceTree = "<group>"; };
33CC10F52044A3C60003C045 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/MainMenu.xib; sourceTree = "<group>"; };
33CC10F72044A3C60003C045 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; name = Info.plist; path = Runner/Info.plist; sourceTree = "<group>"; };
33CC11122044BFA00003C045 /* MainFlutterWindow.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MainFlutterWindow.swift; sourceTree = "<group>"; };
33CEB47222A05771004F2AC0 /* Flutter-Debug.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = "Flutter-Debug.xcconfig"; sourceTree = "<group>"; };
33CEB47422A05771004F2AC0 /* Flutter-Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = "Flutter-Release.xcconfig"; sourceTree = "<group>"; };
33CEB47722A0578A004F2AC0 /* Flutter-Generated.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = "Flutter-Generated.xcconfig"; path = "ephemeral/Flutter-Generated.xcconfig"; sourceTree = "<group>"; };
33E51913231747F40026EE4D /* DebugProfile.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = DebugProfile.entitlements; sourceTree = "<group>"; };
33E51914231749380026EE4D /* Release.entitlements */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.entitlements; path = Release.entitlements; sourceTree = "<group>"; };
33E5194F232828860026EE4D /* AppInfo.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = AppInfo.xcconfig; sourceTree = "<group>"; };
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 = "<group>"; };
7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Release.xcconfig; sourceTree = "<group>"; };
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 = "<group>"; };
9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = Debug.xcconfig; sourceTree = "<group>"; };
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 = "<group>"; };
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 = "<group>"; };
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 = "<group>"; };
/* 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 = "<group>";
};
33BA886A226E78AF003329D5 /* Configs */ = {
isa = PBXGroup;
children = (
33E5194F232828860026EE4D /* AppInfo.xcconfig */,
9740EEB21CF90195004384FC /* Debug.xcconfig */,
7AFA3C8E1D35360C0083082E /* Release.xcconfig */,
333000ED22D3DE5D00554162 /* Warnings.xcconfig */,
);
path = Configs;
sourceTree = "<group>";
};
33CC10E42044A3C60003C045 = {
isa = PBXGroup;
children = (
33FAB671232836740065AC1E /* Runner */,
33CEB47122A05771004F2AC0 /* Flutter */,
330B3F8A2B1E27D300E6DC3F /* RunnerTests */,
33CC10EE2044A3C60003C045 /* Products */,
D73912EC22F37F3D000D13A0 /* Frameworks */,
A5245CE44A722A1081437B5D /* Pods */,
);
sourceTree = "<group>";
};
33CC10EE2044A3C60003C045 /* Products */ = {
isa = PBXGroup;
children = (
33CC10ED2044A3C60003C045 /* google_sign_in_ios_example.app */,
331C80D5294CF71000263BE5 /* RunnerTests.xctest */,
);
name = Products;
sourceTree = "<group>";
};
33CC11242044D66E0003C045 /* Resources */ = {
isa = PBXGroup;
children = (
33CC10F22044A3C60003C045 /* Assets.xcassets */,
33CC10F42044A3C60003C045 /* MainMenu.xib */,
33CC10F72044A3C60003C045 /* Info.plist */,
);
name = Resources;
path = ..;
sourceTree = "<group>";
};
33CEB47122A05771004F2AC0 /* Flutter */ = {
isa = PBXGroup;
children = (
335BBD1A22A9A15E00E9071D /* GeneratedPluginRegistrant.swift */,
33CEB47222A05771004F2AC0 /* Flutter-Debug.xcconfig */,
33CEB47422A05771004F2AC0 /* Flutter-Release.xcconfig */,
33CEB47722A0578A004F2AC0 /* Flutter-Generated.xcconfig */,
);
path = Flutter;
sourceTree = "<group>";
};
33FAB671232836740065AC1E /* Runner */ = {
isa = PBXGroup;
children = (
33CC10F02044A3C60003C045 /* AppDelegate.swift */,
33CC11122044BFA00003C045 /* MainFlutterWindow.swift */,
33E51913231747F40026EE4D /* DebugProfile.entitlements */,
33E51914231749380026EE4D /* Release.entitlements */,
33CC11242044D66E0003C045 /* Resources */,
33BA886A226E78AF003329D5 /* Configs */,
);
path = Runner;
sourceTree = "<group>";
};
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 = "<group>";
};
D73912EC22F37F3D000D13A0 /* Frameworks */ = {
isa = PBXGroup;
children = (
A19720E5189178660264EC3F /* Pods_Runner.framework */,
0BD1DCE969A7E7C76D9CF93C /* Pods_RunnerTests.framework */,
);
name = Frameworks;
sourceTree = "<group>";
};
/* 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 = "<group>";
};
/* 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 */;
}

View File

@ -0,0 +1,8 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>IDEDidComputeMac32BitWarning</key>
<true/>
</dict>
</plist>

View File

@ -0,0 +1,98 @@
<?xml version="1.0" encoding="UTF-8"?>
<Scheme
LastUpgradeVersion = "1430"
version = "1.3">
<BuildAction
parallelizeBuildables = "YES"
buildImplicitDependencies = "YES">
<BuildActionEntries>
<BuildActionEntry
buildForTesting = "YES"
buildForRunning = "YES"
buildForProfiling = "YES"
buildForArchiving = "YES"
buildForAnalyzing = "YES">
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "33CC10EC2044A3C60003C045"
BuildableName = "google_sign_in_ios_example.app"
BlueprintName = "Runner"
ReferencedContainer = "container:Runner.xcodeproj">
</BuildableReference>
</BuildActionEntry>
</BuildActionEntries>
</BuildAction>
<TestAction
buildConfiguration = "Debug"
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
shouldUseLaunchSchemeArgsEnv = "YES">
<MacroExpansion>
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "33CC10EC2044A3C60003C045"
BuildableName = "google_sign_in_ios_example.app"
BlueprintName = "Runner"
ReferencedContainer = "container:Runner.xcodeproj">
</BuildableReference>
</MacroExpansion>
<Testables>
<TestableReference
skipped = "NO"
parallelizable = "YES">
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "331C80D4294CF70F00263BE5"
BuildableName = "RunnerTests.xctest"
BlueprintName = "RunnerTests"
ReferencedContainer = "container:Runner.xcodeproj">
</BuildableReference>
</TestableReference>
</Testables>
</TestAction>
<LaunchAction
buildConfiguration = "Debug"
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
launchStyle = "0"
useCustomWorkingDirectory = "NO"
ignoresPersistentStateOnLaunch = "NO"
debugDocumentVersioning = "YES"
debugServiceExtension = "internal"
allowLocationSimulation = "YES">
<BuildableProductRunnable
runnableDebuggingMode = "0">
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "33CC10EC2044A3C60003C045"
BuildableName = "google_sign_in_ios_example.app"
BlueprintName = "Runner"
ReferencedContainer = "container:Runner.xcodeproj">
</BuildableReference>
</BuildableProductRunnable>
</LaunchAction>
<ProfileAction
buildConfiguration = "Profile"
shouldUseLaunchSchemeArgsEnv = "YES"
savedToolIdentifier = ""
useCustomWorkingDirectory = "NO"
debugDocumentVersioning = "YES">
<BuildableProductRunnable
runnableDebuggingMode = "0">
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "33CC10EC2044A3C60003C045"
BuildableName = "google_sign_in_ios_example.app"
BlueprintName = "Runner"
ReferencedContainer = "container:Runner.xcodeproj">
</BuildableReference>
</BuildableProductRunnable>
</ProfileAction>
<AnalyzeAction
buildConfiguration = "Debug">
</AnalyzeAction>
<ArchiveAction
buildConfiguration = "Release"
revealArchiveInOrganizer = "YES">
</ArchiveAction>
</Scheme>

View File

@ -0,0 +1,10 @@
<?xml version="1.0" encoding="UTF-8"?>
<Workspace
version = "1.0">
<FileRef
location = "group:Runner.xcodeproj">
</FileRef>
<FileRef
location = "group:Pods/Pods.xcodeproj">
</FileRef>
</Workspace>

View File

@ -0,0 +1,8 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>IDEDidComputeMac32BitWarning</key>
<true/>
</dict>
</plist>

View File

@ -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
}
}

View File

@ -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"
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.2 KiB

View File

@ -0,0 +1,343 @@
<?xml version="1.0" encoding="UTF-8"?>
<document type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="3.0" toolsVersion="14490.70" targetRuntime="MacOSX.Cocoa" propertyAccessControl="none" useAutolayout="YES" customObjectInstantitationMethod="direct">
<dependencies>
<deployment identifier="macosx"/>
<plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="14490.70"/>
<capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
</dependencies>
<objects>
<customObject id="-2" userLabel="File's Owner" customClass="NSApplication">
<connections>
<outlet property="delegate" destination="Voe-Tx-rLC" id="GzC-gU-4Uq"/>
</connections>
</customObject>
<customObject id="-1" userLabel="First Responder" customClass="FirstResponder"/>
<customObject id="-3" userLabel="Application" customClass="NSObject"/>
<customObject id="Voe-Tx-rLC" customClass="AppDelegate" customModule="Runner" customModuleProvider="target">
<connections>
<outlet property="applicationMenu" destination="uQy-DD-JDr" id="XBo-yE-nKs"/>
<outlet property="mainFlutterWindow" destination="QvC-M9-y7g" id="gIp-Ho-8D9"/>
</connections>
</customObject>
<customObject id="YLy-65-1bz" customClass="NSFontManager"/>
<menu title="Main Menu" systemMenu="main" id="AYu-sK-qS6">
<items>
<menuItem title="APP_NAME" id="1Xt-HY-uBw">
<modifierMask key="keyEquivalentModifierMask"/>
<menu key="submenu" title="APP_NAME" systemMenu="apple" id="uQy-DD-JDr">
<items>
<menuItem title="About APP_NAME" id="5kV-Vb-QxS">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="orderFrontStandardAboutPanel:" target="-1" id="Exp-CZ-Vem"/>
</connections>
</menuItem>
<menuItem isSeparatorItem="YES" id="VOq-y0-SEH"/>
<menuItem title="Preferences…" keyEquivalent="," id="BOF-NM-1cW"/>
<menuItem isSeparatorItem="YES" id="wFC-TO-SCJ"/>
<menuItem title="Services" id="NMo-om-nkz">
<modifierMask key="keyEquivalentModifierMask"/>
<menu key="submenu" title="Services" systemMenu="services" id="hz9-B4-Xy5"/>
</menuItem>
<menuItem isSeparatorItem="YES" id="4je-JR-u6R"/>
<menuItem title="Hide APP_NAME" keyEquivalent="h" id="Olw-nP-bQN">
<connections>
<action selector="hide:" target="-1" id="PnN-Uc-m68"/>
</connections>
</menuItem>
<menuItem title="Hide Others" keyEquivalent="h" id="Vdr-fp-XzO">
<modifierMask key="keyEquivalentModifierMask" option="YES" command="YES"/>
<connections>
<action selector="hideOtherApplications:" target="-1" id="VT4-aY-XCT"/>
</connections>
</menuItem>
<menuItem title="Show All" id="Kd2-mp-pUS">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="unhideAllApplications:" target="-1" id="Dhg-Le-xox"/>
</connections>
</menuItem>
<menuItem isSeparatorItem="YES" id="kCx-OE-vgT"/>
<menuItem title="Quit APP_NAME" keyEquivalent="q" id="4sb-4s-VLi">
<connections>
<action selector="terminate:" target="-1" id="Te7-pn-YzF"/>
</connections>
</menuItem>
</items>
</menu>
</menuItem>
<menuItem title="Edit" id="5QF-Oa-p0T">
<modifierMask key="keyEquivalentModifierMask"/>
<menu key="submenu" title="Edit" id="W48-6f-4Dl">
<items>
<menuItem title="Undo" keyEquivalent="z" id="dRJ-4n-Yzg">
<connections>
<action selector="undo:" target="-1" id="M6e-cu-g7V"/>
</connections>
</menuItem>
<menuItem title="Redo" keyEquivalent="Z" id="6dh-zS-Vam">
<connections>
<action selector="redo:" target="-1" id="oIA-Rs-6OD"/>
</connections>
</menuItem>
<menuItem isSeparatorItem="YES" id="WRV-NI-Exz"/>
<menuItem title="Cut" keyEquivalent="x" id="uRl-iY-unG">
<connections>
<action selector="cut:" target="-1" id="YJe-68-I9s"/>
</connections>
</menuItem>
<menuItem title="Copy" keyEquivalent="c" id="x3v-GG-iWU">
<connections>
<action selector="copy:" target="-1" id="G1f-GL-Joy"/>
</connections>
</menuItem>
<menuItem title="Paste" keyEquivalent="v" id="gVA-U4-sdL">
<connections>
<action selector="paste:" target="-1" id="UvS-8e-Qdg"/>
</connections>
</menuItem>
<menuItem title="Paste and Match Style" keyEquivalent="V" id="WeT-3V-zwk">
<modifierMask key="keyEquivalentModifierMask" option="YES" command="YES"/>
<connections>
<action selector="pasteAsPlainText:" target="-1" id="cEh-KX-wJQ"/>
</connections>
</menuItem>
<menuItem title="Delete" id="pa3-QI-u2k">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="delete:" target="-1" id="0Mk-Ml-PaM"/>
</connections>
</menuItem>
<menuItem title="Select All" keyEquivalent="a" id="Ruw-6m-B2m">
<connections>
<action selector="selectAll:" target="-1" id="VNm-Mi-diN"/>
</connections>
</menuItem>
<menuItem isSeparatorItem="YES" id="uyl-h8-XO2"/>
<menuItem title="Find" id="4EN-yA-p0u">
<modifierMask key="keyEquivalentModifierMask"/>
<menu key="submenu" title="Find" id="1b7-l0-nxx">
<items>
<menuItem title="Find…" tag="1" keyEquivalent="f" id="Xz5-n4-O0W">
<connections>
<action selector="performFindPanelAction:" target="-1" id="cD7-Qs-BN4"/>
</connections>
</menuItem>
<menuItem title="Find and Replace…" tag="12" keyEquivalent="f" id="YEy-JH-Tfz">
<modifierMask key="keyEquivalentModifierMask" option="YES" command="YES"/>
<connections>
<action selector="performFindPanelAction:" target="-1" id="WD3-Gg-5AJ"/>
</connections>
</menuItem>
<menuItem title="Find Next" tag="2" keyEquivalent="g" id="q09-fT-Sye">
<connections>
<action selector="performFindPanelAction:" target="-1" id="NDo-RZ-v9R"/>
</connections>
</menuItem>
<menuItem title="Find Previous" tag="3" keyEquivalent="G" id="OwM-mh-QMV">
<connections>
<action selector="performFindPanelAction:" target="-1" id="HOh-sY-3ay"/>
</connections>
</menuItem>
<menuItem title="Use Selection for Find" tag="7" keyEquivalent="e" id="buJ-ug-pKt">
<connections>
<action selector="performFindPanelAction:" target="-1" id="U76-nv-p5D"/>
</connections>
</menuItem>
<menuItem title="Jump to Selection" keyEquivalent="j" id="S0p-oC-mLd">
<connections>
<action selector="centerSelectionInVisibleArea:" target="-1" id="IOG-6D-g5B"/>
</connections>
</menuItem>
</items>
</menu>
</menuItem>
<menuItem title="Spelling and Grammar" id="Dv1-io-Yv7">
<modifierMask key="keyEquivalentModifierMask"/>
<menu key="submenu" title="Spelling" id="3IN-sU-3Bg">
<items>
<menuItem title="Show Spelling and Grammar" keyEquivalent=":" id="HFo-cy-zxI">
<connections>
<action selector="showGuessPanel:" target="-1" id="vFj-Ks-hy3"/>
</connections>
</menuItem>
<menuItem title="Check Document Now" keyEquivalent=";" id="hz2-CU-CR7">
<connections>
<action selector="checkSpelling:" target="-1" id="fz7-VC-reM"/>
</connections>
</menuItem>
<menuItem isSeparatorItem="YES" id="bNw-od-mp5"/>
<menuItem title="Check Spelling While Typing" id="rbD-Rh-wIN">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="toggleContinuousSpellChecking:" target="-1" id="7w6-Qz-0kB"/>
</connections>
</menuItem>
<menuItem title="Check Grammar With Spelling" id="mK6-2p-4JG">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="toggleGrammarChecking:" target="-1" id="muD-Qn-j4w"/>
</connections>
</menuItem>
<menuItem title="Correct Spelling Automatically" id="78Y-hA-62v">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="toggleAutomaticSpellingCorrection:" target="-1" id="2lM-Qi-WAP"/>
</connections>
</menuItem>
</items>
</menu>
</menuItem>
<menuItem title="Substitutions" id="9ic-FL-obx">
<modifierMask key="keyEquivalentModifierMask"/>
<menu key="submenu" title="Substitutions" id="FeM-D8-WVr">
<items>
<menuItem title="Show Substitutions" id="z6F-FW-3nz">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="orderFrontSubstitutionsPanel:" target="-1" id="oku-mr-iSq"/>
</connections>
</menuItem>
<menuItem isSeparatorItem="YES" id="gPx-C9-uUO"/>
<menuItem title="Smart Copy/Paste" id="9yt-4B-nSM">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="toggleSmartInsertDelete:" target="-1" id="3IJ-Se-DZD"/>
</connections>
</menuItem>
<menuItem title="Smart Quotes" id="hQb-2v-fYv">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="toggleAutomaticQuoteSubstitution:" target="-1" id="ptq-xd-QOA"/>
</connections>
</menuItem>
<menuItem title="Smart Dashes" id="rgM-f4-ycn">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="toggleAutomaticDashSubstitution:" target="-1" id="oCt-pO-9gS"/>
</connections>
</menuItem>
<menuItem title="Smart Links" id="cwL-P1-jid">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="toggleAutomaticLinkDetection:" target="-1" id="Gip-E3-Fov"/>
</connections>
</menuItem>
<menuItem title="Data Detectors" id="tRr-pd-1PS">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="toggleAutomaticDataDetection:" target="-1" id="R1I-Nq-Kbl"/>
</connections>
</menuItem>
<menuItem title="Text Replacement" id="HFQ-gK-NFA">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="toggleAutomaticTextReplacement:" target="-1" id="DvP-Fe-Py6"/>
</connections>
</menuItem>
</items>
</menu>
</menuItem>
<menuItem title="Transformations" id="2oI-Rn-ZJC">
<modifierMask key="keyEquivalentModifierMask"/>
<menu key="submenu" title="Transformations" id="c8a-y6-VQd">
<items>
<menuItem title="Make Upper Case" id="vmV-6d-7jI">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="uppercaseWord:" target="-1" id="sPh-Tk-edu"/>
</connections>
</menuItem>
<menuItem title="Make Lower Case" id="d9M-CD-aMd">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="lowercaseWord:" target="-1" id="iUZ-b5-hil"/>
</connections>
</menuItem>
<menuItem title="Capitalize" id="UEZ-Bs-lqG">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="capitalizeWord:" target="-1" id="26H-TL-nsh"/>
</connections>
</menuItem>
</items>
</menu>
</menuItem>
<menuItem title="Speech" id="xrE-MZ-jX0">
<modifierMask key="keyEquivalentModifierMask"/>
<menu key="submenu" title="Speech" id="3rS-ZA-NoH">
<items>
<menuItem title="Start Speaking" id="Ynk-f8-cLZ">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="startSpeaking:" target="-1" id="654-Ng-kyl"/>
</connections>
</menuItem>
<menuItem title="Stop Speaking" id="Oyz-dy-DGm">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="stopSpeaking:" target="-1" id="dX8-6p-jy9"/>
</connections>
</menuItem>
</items>
</menu>
</menuItem>
</items>
</menu>
</menuItem>
<menuItem title="View" id="H8h-7b-M4v">
<modifierMask key="keyEquivalentModifierMask"/>
<menu key="submenu" title="View" id="HyV-fh-RgO">
<items>
<menuItem title="Enter Full Screen" keyEquivalent="f" id="4J7-dP-txa">
<modifierMask key="keyEquivalentModifierMask" control="YES" command="YES"/>
<connections>
<action selector="toggleFullScreen:" target="-1" id="dU3-MA-1Rq"/>
</connections>
</menuItem>
</items>
</menu>
</menuItem>
<menuItem title="Window" id="aUF-d1-5bR">
<modifierMask key="keyEquivalentModifierMask"/>
<menu key="submenu" title="Window" systemMenu="window" id="Td7-aD-5lo">
<items>
<menuItem title="Minimize" keyEquivalent="m" id="OY7-WF-poV">
<connections>
<action selector="performMiniaturize:" target="-1" id="VwT-WD-YPe"/>
</connections>
</menuItem>
<menuItem title="Zoom" id="R4o-n2-Eq4">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="performZoom:" target="-1" id="DIl-cC-cCs"/>
</connections>
</menuItem>
<menuItem isSeparatorItem="YES" id="eu3-7i-yIM"/>
<menuItem title="Bring All to Front" id="LE2-aR-0XJ">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="arrangeInFront:" target="-1" id="DRN-fu-gQh"/>
</connections>
</menuItem>
</items>
</menu>
</menuItem>
<menuItem title="Help" id="EPT-qC-fAb">
<modifierMask key="keyEquivalentModifierMask"/>
<menu key="submenu" title="Help" systemMenu="help" id="rJ0-wn-3NY"/>
</menuItem>
</items>
<point key="canvasLocation" x="142" y="-258"/>
</menu>
<window title="APP_NAME" allowsToolTipsWhenApplicationIsInactive="NO" autorecalculatesKeyViewLoop="NO" releasedWhenClosed="NO" animationBehavior="default" id="QvC-M9-y7g" customClass="MainFlutterWindow" customModule="Runner" customModuleProvider="target">
<windowStyleMask key="styleMask" titled="YES" closable="YES" miniaturizable="YES" resizable="YES"/>
<rect key="contentRect" x="335" y="390" width="800" height="600"/>
<rect key="screenRect" x="0.0" y="0.0" width="2560" height="1577"/>
<view key="contentView" wantsLayer="YES" id="EiT-Mj-1SZ">
<rect key="frame" x="0.0" y="0.0" width="800" height="600"/>
<autoresizingMask key="autoresizingMask"/>
</view>
</window>
</objects>
</document>

View File

@ -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.

View File

@ -0,0 +1,2 @@
#include "../../Flutter/Flutter-Debug.xcconfig"
#include "Warnings.xcconfig"

View File

@ -0,0 +1,2 @@
#include "../../Flutter/Flutter-Release.xcconfig"
#include "Warnings.xcconfig"

View File

@ -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

View File

@ -0,0 +1,12 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>com.apple.security.app-sandbox</key>
<true/>
<key>com.apple.security.cs.allow-jit</key>
<true/>
<key>com.apple.security.network.server</key>
<true/>
</dict>
</plist>

View File

@ -0,0 +1,47 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>CFBundleDevelopmentRegion</key>
<string>$(DEVELOPMENT_LANGUAGE)</string>
<key>CFBundleExecutable</key>
<string>$(EXECUTABLE_NAME)</string>
<key>CFBundleIconFile</key>
<string></string>
<key>CFBundleIdentifier</key>
<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>
<key>CFBundleInfoDictionaryVersion</key>
<string>6.0</string>
<key>CFBundleName</key>
<string>$(PRODUCT_NAME)</string>
<key>CFBundlePackageType</key>
<string>APPL</string>
<key>CFBundleShortVersionString</key>
<string>$(FLUTTER_BUILD_NAME)</string>
<key>CFBundleURLTypes</key>
<array>
<dict>
<key>CFBundleTypeRole</key>
<string>Editor</string>
<key>CFBundleURLSchemes</key>
<array>
<string>com.googleusercontent.apps.479882132969-9i9aqik3jfjd7qhci1nqf0bm2g71rm1u</string>
</array>
</dict>
</array>
<key>CFBundleVersion</key>
<string>$(FLUTTER_BUILD_NUMBER)</string>
<key>GIDClientID</key>
<string>479882132969-9i9aqik3jfjd7qhci1nqf0bm2g71rm1u.apps.googleusercontent.com</string>
<key>GIDServerClientID</key>
<string>YOUR_SERVER_CLIENT_ID</string>
<key>LSMinimumSystemVersion</key>
<string>$(MACOSX_DEPLOYMENT_TARGET)</string>
<key>NSHumanReadableCopyright</key>
<string>$(PRODUCT_COPYRIGHT)</string>
<key>NSMainNibFile</key>
<string>MainMenu</string>
<key>NSPrincipalClass</key>
<string>NSApplication</string>
</dict>
</plist>

View File

@ -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()
}
}

View File

@ -0,0 +1,8 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>com.apple.security.app-sandbox</key>
<true/>
</dict>
</plist>

View File

@ -3,8 +3,8 @@ description: Example of Google Sign-In plugin.
publish_to: none publish_to: none
environment: environment:
sdk: ">=3.0.0 <4.0.0" sdk: ">=3.2.0 <4.0.0"
flutter: ">=3.10.0" flutter: ">=3.16.0"
dependencies: dependencies:
flutter: flutter:

View File

@ -7,8 +7,8 @@ import 'package:pigeon/pigeon.dart';
@ConfigurePigeon(PigeonOptions( @ConfigurePigeon(PigeonOptions(
dartOut: 'lib/src/messages.g.dart', dartOut: 'lib/src/messages.g.dart',
objcOptions: ObjcOptions(prefix: 'FSI'), objcOptions: ObjcOptions(prefix: 'FSI'),
objcHeaderOut: 'ios/Classes/messages.g.h', objcHeaderOut: 'darwin/Classes/messages.g.h',
objcSourceOut: 'ios/Classes/messages.g.m', objcSourceOut: 'darwin/Classes/messages.g.m',
copyrightHeader: 'pigeons/copyright.txt', copyrightHeader: 'pigeons/copyright.txt',
)) ))

View File

@ -2,11 +2,11 @@ name: google_sign_in_ios
description: iOS implementation of the google_sign_in plugin. 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 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 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: environment:
sdk: ">=3.0.0 <4.0.0" sdk: ">=3.2.0 <4.0.0"
flutter: ">=3.10.0" flutter: ">=3.16.0"
flutter: flutter:
plugin: plugin:
@ -15,6 +15,11 @@ flutter:
ios: ios:
dartPluginClass: GoogleSignInIOS dartPluginClass: GoogleSignInIOS
pluginClass: FLTGoogleSignInPlugin pluginClass: FLTGoogleSignInPlugin
sharedDarwinSource: true
macos:
dartPluginClass: GoogleSignInIOS
pluginClass: FLTGoogleSignInPlugin
sharedDarwinSource: true
dependencies: dependencies:
flutter: flutter:
@ -36,7 +41,8 @@ topics:
# The example deliberately includes limited-use secrets. # The example deliberately includes limited-use secrets.
false_secrets: false_secrets:
- /darwin/Tests/GoogleService-Info.plist
- /darwin/Tests/GoogleSignInTests.m
- /example/ios/Runner/Info.plist - /example/ios/Runner/Info.plist
- /example/ios/RunnerTests/GoogleService-Info.plist
- /example/ios/RunnerTests/GoogleSignInTests.m
- /example/lib/main.dart - /example/lib/main.dart
- /example/macos/Runner/Info.plist