,
16 | let urlString = arguments["url"] as? String,
17 | let url = URL(string: urlString),
18 | let callbackURLScheme = arguments["callbackUrlScheme"] as? String,
19 | let preferEphemeral = arguments["preferEphemeral"] as? Bool
20 | {
21 |
22 | var sessionToKeepAlive: Any? = nil // if we do not keep the session alive, it will get closed immediately while showing the dialog
23 | let completionHandler = { (url: URL?, err: Error?) in
24 | sessionToKeepAlive = nil
25 |
26 | if let err = err {
27 | if #available(iOS 12, *) {
28 | if case ASWebAuthenticationSessionError.canceledLogin = err {
29 | result(FlutterError(code: "CANCELED", message: "User canceled login", details: nil))
30 | return
31 | }
32 | }
33 |
34 | if #available(iOS 11, *) {
35 | if case SFAuthenticationError.canceledLogin = err {
36 | result(FlutterError(code: "CANCELED", message: "User canceled login", details: nil))
37 | return
38 | }
39 | }
40 |
41 | result(FlutterError(code: "EUNKNOWN", message: err.localizedDescription, details: nil))
42 | return
43 | }
44 |
45 | guard let url = url else {
46 | result(FlutterError(code: "EUNKNOWN", message: "URL was null, but no error provided.", details: nil))
47 | return
48 | }
49 |
50 | result(url.absoluteString)
51 | }
52 |
53 | if #available(iOS 12, *) {
54 | let session = ASWebAuthenticationSession(url: url, callbackURLScheme: callbackURLScheme, completionHandler: completionHandler)
55 |
56 | if #available(iOS 13, *) {
57 | guard var topController = UIApplication.shared.keyWindow?.rootViewController else {
58 | result(FlutterError.aquireRootViewControllerFailed)
59 | return
60 | }
61 |
62 | while let presentedViewController = topController.presentedViewController {
63 | topController = presentedViewController
64 | }
65 | if let nav = topController as? UINavigationController {
66 | topController = nav.visibleViewController ?? topController
67 | }
68 |
69 | guard let contextProvider = topController as? ASWebAuthenticationPresentationContextProviding else {
70 | result(FlutterError.aquireRootViewControllerFailed)
71 | return
72 | }
73 | session.presentationContextProvider = contextProvider
74 | session.prefersEphemeralWebBrowserSession = preferEphemeral
75 | }
76 |
77 | session.start()
78 | sessionToKeepAlive = session
79 | } else if #available(iOS 11, *) {
80 | let session = SFAuthenticationSession(url: url, callbackURLScheme: callbackURLScheme, completionHandler: completionHandler)
81 | session.start()
82 | sessionToKeepAlive = session
83 | } else {
84 | result(FlutterError(code: "FAILED", message: "This plugin does currently not support iOS lower than iOS 11" , details: nil))
85 | }
86 | } else if (call.method == "cleanUpDanglingCalls") {
87 | // we do not keep track of old callbacks on iOS, so nothing to do here
88 | result(nil)
89 | } else {
90 | result(FlutterMethodNotImplemented)
91 | }
92 | }
93 | }
94 |
95 | @available(iOS 13, *)
96 | extension FlutterViewController: ASWebAuthenticationPresentationContextProviding {
97 | public func presentationAnchor(for session: ASWebAuthenticationSession) -> ASPresentationAnchor {
98 | return self.view.window!
99 | }
100 | }
101 |
102 | fileprivate extension FlutterError {
103 | static var aquireRootViewControllerFailed: FlutterError {
104 | return FlutterError(code: "AQUIRE_ROOT_VIEW_CONTROLLER_FAILED", message: "Failed to aquire root view controller" , details: nil)
105 | }
106 | }
107 |
--------------------------------------------------------------------------------
/android/gradlew:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env sh
2 |
3 | #
4 | # Copyright 2015 the original author or authors.
5 | #
6 | # Licensed under the Apache License, Version 2.0 (the "License");
7 | # you may not use this file except in compliance with the License.
8 | # You may obtain a copy of the License at
9 | #
10 | # https://www.apache.org/licenses/LICENSE-2.0
11 | #
12 | # Unless required by applicable law or agreed to in writing, software
13 | # distributed under the License is distributed on an "AS IS" BASIS,
14 | # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15 | # See the License for the specific language governing permissions and
16 | # limitations under the License.
17 | #
18 |
19 | ##############################################################################
20 | ##
21 | ## Gradle start up script for UN*X
22 | ##
23 | ##############################################################################
24 |
25 | # Attempt to set APP_HOME
26 | # Resolve links: $0 may be a link
27 | PRG="$0"
28 | # Need this for relative symlinks.
29 | while [ -h "$PRG" ] ; do
30 | ls=`ls -ld "$PRG"`
31 | link=`expr "$ls" : '.*-> \(.*\)$'`
32 | if expr "$link" : '/.*' > /dev/null; then
33 | PRG="$link"
34 | else
35 | PRG=`dirname "$PRG"`"/$link"
36 | fi
37 | done
38 | SAVED="`pwd`"
39 | cd "`dirname \"$PRG\"`/" >/dev/null
40 | APP_HOME="`pwd -P`"
41 | cd "$SAVED" >/dev/null
42 |
43 | APP_NAME="Gradle"
44 | APP_BASE_NAME=`basename "$0"`
45 |
46 | # Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
47 | DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"'
48 |
49 | # Use the maximum available, or set MAX_FD != -1 to use that value.
50 | MAX_FD="maximum"
51 |
52 | warn () {
53 | echo "$*"
54 | }
55 |
56 | die () {
57 | echo
58 | echo "$*"
59 | echo
60 | exit 1
61 | }
62 |
63 | # OS specific support (must be 'true' or 'false').
64 | cygwin=false
65 | msys=false
66 | darwin=false
67 | nonstop=false
68 | case "`uname`" in
69 | CYGWIN* )
70 | cygwin=true
71 | ;;
72 | Darwin* )
73 | darwin=true
74 | ;;
75 | MINGW* )
76 | msys=true
77 | ;;
78 | NONSTOP* )
79 | nonstop=true
80 | ;;
81 | esac
82 |
83 | CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
84 |
85 | # Determine the Java command to use to start the JVM.
86 | if [ -n "$JAVA_HOME" ] ; then
87 | if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
88 | # IBM's JDK on AIX uses strange locations for the executables
89 | JAVACMD="$JAVA_HOME/jre/sh/java"
90 | else
91 | JAVACMD="$JAVA_HOME/bin/java"
92 | fi
93 | if [ ! -x "$JAVACMD" ] ; then
94 | die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME
95 |
96 | Please set the JAVA_HOME variable in your environment to match the
97 | location of your Java installation."
98 | fi
99 | else
100 | JAVACMD="java"
101 | which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
102 |
103 | Please set the JAVA_HOME variable in your environment to match the
104 | location of your Java installation."
105 | fi
106 |
107 | # Increase the maximum file descriptors if we can.
108 | if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then
109 | MAX_FD_LIMIT=`ulimit -H -n`
110 | if [ $? -eq 0 ] ; then
111 | if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then
112 | MAX_FD="$MAX_FD_LIMIT"
113 | fi
114 | ulimit -n $MAX_FD
115 | if [ $? -ne 0 ] ; then
116 | warn "Could not set maximum file descriptor limit: $MAX_FD"
117 | fi
118 | else
119 | warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT"
120 | fi
121 | fi
122 |
123 | # For Darwin, add options to specify how the application appears in the dock
124 | if $darwin; then
125 | GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\""
126 | fi
127 |
128 | # For Cygwin or MSYS, switch paths to Windows format before running java
129 | if [ "$cygwin" = "true" -o "$msys" = "true" ] ; then
130 | APP_HOME=`cygpath --path --mixed "$APP_HOME"`
131 | CLASSPATH=`cygpath --path --mixed "$CLASSPATH"`
132 | JAVACMD=`cygpath --unix "$JAVACMD"`
133 |
134 | # We build the pattern for arguments to be converted via cygpath
135 | ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null`
136 | SEP=""
137 | for dir in $ROOTDIRSRAW ; do
138 | ROOTDIRS="$ROOTDIRS$SEP$dir"
139 | SEP="|"
140 | done
141 | OURCYGPATTERN="(^($ROOTDIRS))"
142 | # Add a user-defined pattern to the cygpath arguments
143 | if [ "$GRADLE_CYGPATTERN" != "" ] ; then
144 | OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)"
145 | fi
146 | # Now convert the arguments - kludge to limit ourselves to /bin/sh
147 | i=0
148 | for arg in "$@" ; do
149 | CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -`
150 | CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option
151 |
152 | if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition
153 | eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"`
154 | else
155 | eval `echo args$i`="\"$arg\""
156 | fi
157 | i=`expr $i + 1`
158 | done
159 | case $i in
160 | 0) set -- ;;
161 | 1) set -- "$args0" ;;
162 | 2) set -- "$args0" "$args1" ;;
163 | 3) set -- "$args0" "$args1" "$args2" ;;
164 | 4) set -- "$args0" "$args1" "$args2" "$args3" ;;
165 | 5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;;
166 | 6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;;
167 | 7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;;
168 | 8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;;
169 | 9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;;
170 | esac
171 | fi
172 |
173 | # Escape application args
174 | save () {
175 | for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done
176 | echo " "
177 | }
178 | APP_ARGS=`save "$@"`
179 |
180 | # Collect all arguments for the java command, following the shell quoting and substitution rules
181 | eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS"
182 |
183 | exec "$JAVACMD" "$@"
184 |
--------------------------------------------------------------------------------
/example/pubspec.lock:
--------------------------------------------------------------------------------
1 | # Generated by pub
2 | # See https://dart.dev/tools/pub/glossary#lockfile
3 | packages:
4 | async:
5 | dependency: transitive
6 | description:
7 | name: async
8 | sha256: "947bfcf187f74dbc5e146c9eb9c0f10c9f8b30743e341481c1e2ed3ecc18c20c"
9 | url: "https://pub.dev"
10 | source: hosted
11 | version: "2.11.0"
12 | boolean_selector:
13 | dependency: transitive
14 | description:
15 | name: boolean_selector
16 | sha256: "6cfb5af12253eaf2b368f07bacc5a80d1301a071c73360d746b7f2e32d762c66"
17 | url: "https://pub.dev"
18 | source: hosted
19 | version: "2.1.1"
20 | characters:
21 | dependency: transitive
22 | description:
23 | name: characters
24 | sha256: "04a925763edad70e8443c99234dc3328f442e811f1d8fd1a72f1c8ad0f69a605"
25 | url: "https://pub.dev"
26 | source: hosted
27 | version: "1.3.0"
28 | clock:
29 | dependency: transitive
30 | description:
31 | name: clock
32 | sha256: cb6d7f03e1de671e34607e909a7213e31d7752be4fb66a86d29fe1eb14bfb5cf
33 | url: "https://pub.dev"
34 | source: hosted
35 | version: "1.1.1"
36 | collection:
37 | dependency: transitive
38 | description:
39 | name: collection
40 | sha256: ee67cb0715911d28db6bf4af1026078bd6f0128b07a5f66fb2ed94ec6783c09a
41 | url: "https://pub.dev"
42 | source: hosted
43 | version: "1.18.0"
44 | cupertino_icons:
45 | dependency: "direct main"
46 | description:
47 | name: cupertino_icons
48 | sha256: ba631d1c7f7bef6b729a622b7b752645a2d076dba9976925b8f25725a30e1ee6
49 | url: "https://pub.dev"
50 | source: hosted
51 | version: "1.0.8"
52 | fake_async:
53 | dependency: transitive
54 | description:
55 | name: fake_async
56 | sha256: "511392330127add0b769b75a987850d136345d9227c6b94c96a04cf4a391bf78"
57 | url: "https://pub.dev"
58 | source: hosted
59 | version: "1.3.1"
60 | file:
61 | dependency: transitive
62 | description:
63 | name: file
64 | sha256: "5fc22d7c25582e38ad9a8515372cd9a93834027aacf1801cf01164dac0ffa08c"
65 | url: "https://pub.dev"
66 | source: hosted
67 | version: "7.0.0"
68 | flutter:
69 | dependency: "direct main"
70 | description: flutter
71 | source: sdk
72 | version: "0.0.0"
73 | flutter_driver:
74 | dependency: transitive
75 | description: flutter
76 | source: sdk
77 | version: "0.0.0"
78 | flutter_lints:
79 | dependency: "direct dev"
80 | description:
81 | name: flutter_lints
82 | sha256: "3f41d009ba7172d5ff9be5f6e6e6abb4300e263aab8866d2a0842ed2a70f8f0c"
83 | url: "https://pub.dev"
84 | source: hosted
85 | version: "4.0.0"
86 | flutter_test:
87 | dependency: "direct dev"
88 | description: flutter
89 | source: sdk
90 | version: "0.0.0"
91 | flutter_web_auth:
92 | dependency: "direct main"
93 | description:
94 | path: ".."
95 | relative: true
96 | source: path
97 | version: "0.6.0"
98 | flutter_web_plugins:
99 | dependency: transitive
100 | description: flutter
101 | source: sdk
102 | version: "0.0.0"
103 | fuchsia_remote_debug_protocol:
104 | dependency: transitive
105 | description: flutter
106 | source: sdk
107 | version: "0.0.0"
108 | integration_test:
109 | dependency: "direct dev"
110 | description: flutter
111 | source: sdk
112 | version: "0.0.0"
113 | leak_tracker:
114 | dependency: transitive
115 | description:
116 | name: leak_tracker
117 | sha256: "3f87a60e8c63aecc975dda1ceedbc8f24de75f09e4856ea27daf8958f2f0ce05"
118 | url: "https://pub.dev"
119 | source: hosted
120 | version: "10.0.5"
121 | leak_tracker_flutter_testing:
122 | dependency: transitive
123 | description:
124 | name: leak_tracker_flutter_testing
125 | sha256: "932549fb305594d82d7183ecd9fa93463e9914e1b67cacc34bc40906594a1806"
126 | url: "https://pub.dev"
127 | source: hosted
128 | version: "3.0.5"
129 | leak_tracker_testing:
130 | dependency: transitive
131 | description:
132 | name: leak_tracker_testing
133 | sha256: "6ba465d5d76e67ddf503e1161d1f4a6bc42306f9d66ca1e8f079a47290fb06d3"
134 | url: "https://pub.dev"
135 | source: hosted
136 | version: "3.0.1"
137 | lints:
138 | dependency: transitive
139 | description:
140 | name: lints
141 | sha256: "976c774dd944a42e83e2467f4cc670daef7eed6295b10b36ae8c85bcbf828235"
142 | url: "https://pub.dev"
143 | source: hosted
144 | version: "4.0.0"
145 | matcher:
146 | dependency: transitive
147 | description:
148 | name: matcher
149 | sha256: d2323aa2060500f906aa31a895b4030b6da3ebdcc5619d14ce1aada65cd161cb
150 | url: "https://pub.dev"
151 | source: hosted
152 | version: "0.12.16+1"
153 | material_color_utilities:
154 | dependency: transitive
155 | description:
156 | name: material_color_utilities
157 | sha256: f7142bb1154231d7ea5f96bc7bde4bda2a0945d2806bb11670e30b850d56bdec
158 | url: "https://pub.dev"
159 | source: hosted
160 | version: "0.11.1"
161 | meta:
162 | dependency: transitive
163 | description:
164 | name: meta
165 | sha256: bdb68674043280c3428e9ec998512fb681678676b3c54e773629ffe74419f8c7
166 | url: "https://pub.dev"
167 | source: hosted
168 | version: "1.15.0"
169 | path:
170 | dependency: transitive
171 | description:
172 | name: path
173 | sha256: "087ce49c3f0dc39180befefc60fdb4acd8f8620e5682fe2476afd0b3688bb4af"
174 | url: "https://pub.dev"
175 | source: hosted
176 | version: "1.9.0"
177 | platform:
178 | dependency: transitive
179 | description:
180 | name: platform
181 | sha256: "9b71283fc13df574056616011fb138fd3b793ea47cc509c189a6c3fa5f8a1a65"
182 | url: "https://pub.dev"
183 | source: hosted
184 | version: "3.1.5"
185 | process:
186 | dependency: transitive
187 | description:
188 | name: process
189 | sha256: "21e54fd2faf1b5bdd5102afd25012184a6793927648ea81eea80552ac9405b32"
190 | url: "https://pub.dev"
191 | source: hosted
192 | version: "5.0.2"
193 | sky_engine:
194 | dependency: transitive
195 | description: flutter
196 | source: sdk
197 | version: "0.0.99"
198 | source_span:
199 | dependency: transitive
200 | description:
201 | name: source_span
202 | sha256: "53e943d4206a5e30df338fd4c6e7a077e02254531b138a15aec3bd143c1a8b3c"
203 | url: "https://pub.dev"
204 | source: hosted
205 | version: "1.10.0"
206 | stack_trace:
207 | dependency: transitive
208 | description:
209 | name: stack_trace
210 | sha256: "73713990125a6d93122541237550ee3352a2d84baad52d375a4cad2eb9b7ce0b"
211 | url: "https://pub.dev"
212 | source: hosted
213 | version: "1.11.1"
214 | stream_channel:
215 | dependency: transitive
216 | description:
217 | name: stream_channel
218 | sha256: ba2aa5d8cc609d96bbb2899c28934f9e1af5cddbd60a827822ea467161eb54e7
219 | url: "https://pub.dev"
220 | source: hosted
221 | version: "2.1.2"
222 | string_scanner:
223 | dependency: transitive
224 | description:
225 | name: string_scanner
226 | sha256: "556692adab6cfa87322a115640c11f13cb77b3f076ddcc5d6ae3c20242bedcde"
227 | url: "https://pub.dev"
228 | source: hosted
229 | version: "1.2.0"
230 | sync_http:
231 | dependency: transitive
232 | description:
233 | name: sync_http
234 | sha256: "7f0cd72eca000d2e026bcd6f990b81d0ca06022ef4e32fb257b30d3d1014a961"
235 | url: "https://pub.dev"
236 | source: hosted
237 | version: "0.3.1"
238 | term_glyph:
239 | dependency: transitive
240 | description:
241 | name: term_glyph
242 | sha256: a29248a84fbb7c79282b40b8c72a1209db169a2e0542bce341da992fe1bc7e84
243 | url: "https://pub.dev"
244 | source: hosted
245 | version: "1.2.1"
246 | test_api:
247 | dependency: transitive
248 | description:
249 | name: test_api
250 | sha256: "5b8a98dafc4d5c4c9c72d8b31ab2b23fc13422348d2997120294d3bac86b4ddb"
251 | url: "https://pub.dev"
252 | source: hosted
253 | version: "0.7.2"
254 | vector_math:
255 | dependency: transitive
256 | description:
257 | name: vector_math
258 | sha256: "80b3257d1492ce4d091729e3a67a60407d227c27241d6927be0130c98e741803"
259 | url: "https://pub.dev"
260 | source: hosted
261 | version: "2.1.4"
262 | vm_service:
263 | dependency: transitive
264 | description:
265 | name: vm_service
266 | sha256: "5c5f338a667b4c644744b661f309fb8080bb94b18a7e91ef1dbd343bed00ed6d"
267 | url: "https://pub.dev"
268 | source: hosted
269 | version: "14.2.5"
270 | webdriver:
271 | dependency: transitive
272 | description:
273 | name: webdriver
274 | sha256: "003d7da9519e1e5f329422b36c4dcdf18d7d2978d1ba099ea4e45ba490ed845e"
275 | url: "https://pub.dev"
276 | source: hosted
277 | version: "3.0.3"
278 | sdks:
279 | dart: ">=3.5.3 <4.0.0"
280 | flutter: ">=3.18.0-18.0.pre.54"
281 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # Web Auth for Flutter
2 |
3 | A Flutter plugin for authenticating a user with a web service, even if the web service is run by a third party. Most commonly used with OAuth2, but can be used with any web flow that can redirect to a custom scheme.
4 |
5 | In the background, this plugin uses [`ASWebAuthenticationSession`][ASWebAuthenticationSession] on iOS 12+ and macOS 10.15+, [`SFAuthenticationSession`][SFAuthenticationSession] on iOS 11, [Chrome Custom Tabs][Chrome Custom Tabs] on Android and opens a new window on Web. You can build it with iOS 8+, but it is currently only supported by iOS 11 or higher.
6 |
7 | [ASWebAuthenticationSession]: https://developer.apple.com/documentation/authenticationservices/aswebauthenticationsession
8 | [SFAuthenticationSession]: https://developer.apple.com/documentation/safariservices/sfauthenticationsession
9 | [Chrome Custom Tabs]: https://developer.chrome.com/multidevice/android/customtabs
10 |
11 | | **iOS** | **Android** |
12 | | ---------------------- | ------------------------------ |
13 | |  |  |
14 |
15 | | **macOS** |
16 | | -------------------------- |
17 | |  |
18 |
19 | ## Usage
20 |
21 | To authenticate against your own custom site:
22 |
23 | ```dart
24 | import 'package:flutter_web_auth/flutter_web_auth.dart';
25 |
26 | // Present the dialog to the user
27 | final result = await FlutterWebAuth.authenticate(url: "https://my-custom-app.com/connect", callbackUrlScheme: "my-custom-app");
28 |
29 | // Extract token from resulting url
30 | final token = Uri.parse(result).queryParameters['token']
31 | ```
32 |
33 | To authenticate the user using Google's OAuth2:
34 |
35 | ```dart
36 | import 'package:flutter_web_auth/flutter_web_auth.dart';
37 |
38 | import 'dart:convert' show jsonDecode;
39 | import 'package:http/http.dart' as http;
40 |
41 | // App specific variables
42 | final googleClientId = 'XXXXXXXXXXXX-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx.apps.googleusercontent.com';
43 | final callbackUrlScheme = 'com.googleusercontent.apps.XXXXXXXXXXXX-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx';
44 |
45 | // Construct the url
46 | final url = Uri.https('accounts.google.com', '/o/oauth2/v2/auth', {
47 | 'response_type': 'code',
48 | 'client_id': googleClientId,
49 | 'redirect_uri': '$callbackUrlScheme:/',
50 | 'scope': 'email',
51 | });
52 |
53 | // Present the dialog to the user
54 | final result = await FlutterWebAuth.authenticate(url: url.toString(), callbackUrlScheme: callbackUrlScheme);
55 |
56 | // Extract code from resulting url
57 | final code = Uri.parse(result).queryParameters['code'];
58 |
59 | // Construct an Uri to Google's oauth2 endpoint
60 | final url = Uri.https('www.googleapis.com', 'oauth2/v4/token');
61 |
62 | // Use this code to get an access token
63 | final response = await http.post(url, body: {
64 | 'client_id': googleClientId,
65 | 'redirect_uri': '$callbackUrlScheme:/',
66 | 'grant_type': 'authorization_code',
67 | 'code': code,
68 | });
69 |
70 | // Get the access token from the response
71 | final accessToken = jsonDecode(response.body)['access_token'] as String;
72 | ```
73 |
74 | **Note:** To use multiple scopes with Google, you need to encode them as a single string, separated by spaces. For example, `scope: 'email https://www.googleapis.com/auth/userinfo.profile'`. Here is [a list of all supported scopes](https://developers.google.com/identity/protocols/oauth2/scopes).
75 |
76 | ## Setup
77 |
78 | Setup works as for any Flutter plugin, expect the Android and Web caveats outlined below:
79 |
80 | ### Android
81 |
82 | In order to capture the callback url, the following `activity` needs to be added to your `AndroidManifest.xml`. Be sure to relpace `YOUR_CALLBACK_URL_SCHEME_HERE` with your actual callback url scheme.
83 |
84 | ```xml
85 |
86 |
87 |
88 |
89 |
90 |
91 |
92 |
93 |
94 |
95 |
96 |
97 |
98 |
99 | ```
100 |
101 | ### Web
102 |
103 | On the Web platform an endpoint needs to be created that captures the callback URL and sends it to the application using the JavaScript `postMessage()` method. In the `./web` folder of the project, create an HTML file with the name e.g. `auth.html` with content:
104 |
105 | ```html
106 |
107 | Authentication complete
108 | Authentication is complete. If this does not happen automatically, please
109 | close the window.
110 |
116 | ```
117 |
118 | Redirection URL passed to the authentication service must be the same as the URL on which the application is running (schema, host, port if necessary) and the path must point to created HTML file, `/auth.html` in this case. The `callbackUrlScheme` parameter of the `authenticate()` method does not take into account, so it is possible to use a schema for native platforms in the code.
119 |
120 | For the Sign in with Apple in web_message response mode, postMessage from https://appleid.apple.com is also captured, and the authorization object is returned as a URL fragment encoded as a query string (for compatibility with other providers).
121 |
122 | ## Troubleshooting
123 |
124 | When you use this package for the first time, there are some problems you may have. These are some of the common solutions
125 |
126 | ### Troubleshooting `callbackUrlScheme`
127 |
128 | - `callbackUrlScheme` must be a valid schema string or else this wont work.
129 | - A valid RFC 3986 URL scheme must consist of "a letter and followed by any combination of letters, digits, plus ("+"), period ("."), or hyphen ("-")."
130 | - scheme = ALPHA *( ALPHA / DIGIT / "+" / "-" / "." )
131 | - This means you can not use underscore "_", space " " or uppercase "ABCDEF...". You can not also start with a number. See [RFC3986#page-17](https://www.rfc-editor.org/rfc/rfc3986#page-17)
132 | - examples of VALID `callbackUrlScheme` are `callback-scheme`, `another.scheme`, `examplescheme`
133 | - examples of INVALID `callbackUrlScheme` are `callback_scheme`,`1another.scheme`, `exampleScheme`
134 |
135 | ### Troubleshooting Flutter App
136 |
137 | - You have to tell the `FlutterWebAuth.authenticate` function what your `callbackUrlScheme` is.
138 | - Example if your `callbackUrlScheme` is `valid-callback-scheme`, your dart code will look like
139 |
140 | ```dart
141 | import 'package:flutter_web_auth/flutter_web_auth.dart';
142 |
143 | // Present the dialog to the user
144 | final result = await FlutterWebAuth.authenticate(url: "https://my-custom-app.com/connect", callbackUrlScheme: "valid-callback-scheme");
145 | ```
146 |
147 | ### Troubleshooting Android
148 |
149 | - You are required to update your `AndroidManifest.xml` to include the `com.linusu.flutter_web_auth.CallbackActivity` activity something like
150 |
151 | ```xml
152 |
153 |
154 |
155 |
156 |
157 |
158 |
159 |
160 |
161 |
162 |
163 |
164 |
165 |
166 |
167 | ```
168 |
169 | - Example of valid `AndroidManifest.xml` with VALID `callbackUrlScheme`. in the example below `valid-callback-scheme` is our `callbackUrlScheme`
170 |
171 | ```xml
172 |
173 |
174 |
175 |
176 |
177 |
178 |
179 |
180 |
181 |
182 |
183 |
184 |
185 |
186 | ```
187 |
188 | - If you are targeting S+ (version 31 and above) you need to provide an explicit value for `android:exported`. If you followed earlier installation instructions this was not included. Make sure that you add `android:exported="true"` to the `com.linusu.flutter_web_auth.CallbackActivity` activity in your `AndroidManifest.xml` file.
189 |
190 | ```diff
191 | -
192 | +
193 | ```
194 |
195 | ### Troubleshooting OAuth redirects
196 |
197 | - Your OAuth Provider must redirect to the valid `callbackUrlScheme` + `://`. This mean if your `callbackUrlScheme` is `validscheme`, your OAuth Provider must redirect to `validscheme://`
198 | - Example with `php`
199 | ```php
200 | Go Back to App
212 | ```
213 |
214 | ### Troubleshooting passing data to app
215 |
216 | - You can pass data back to your app by adding GET query parameters. This means by adding name=value type of data after your `callbackUrlScheme` + `://` + `?`
217 | - example to pass `access-token` to your app a valid url for that could be
218 |
219 | ```text
220 | my-callback-schema://?access-token=jdu9292s
221 | ```
222 |
223 | - You can pass multipe data by concatenating with `&`
224 |
225 | ```text
226 | my-callback-schema://?data1=value1&data2=value2
227 | ```
228 |
229 | - example to pass `access-token` and `user_id` to your app a valid url for that could be
230 |
231 | ```text
232 | my-callback-schema://?access-token=jdu9292s&user_id=23
233 | ```
234 |
235 | - You can get the data in your app by using `Uri.parse(result).queryParameters`
236 |
237 | ```dart
238 | // Present the dialog to the user
239 | final result = await FlutterWebAuth.authenticate(url: "https://my-custom-app.com/connect", callbackUrlScheme: "valid-callback-scheme");
240 | // Extract token from resulting url
241 | String accessToken = Uri.parse(result).queryParameters['access-token'];
242 | String userId = Uri.parse(result).queryParameters['user_id'];
243 | ```
244 |
245 | ### Cannot open keyboard on iOS
246 |
247 | This seems to be a bug in `ASWebAuthenticationSession`, and no work around have been found. Please see [issue #120](https://github.com/LinusU/flutter_web_auth/issues/120) for more info.
248 |
249 | ### Error on macOS if Chrome is default browser
250 |
251 | This seems to be a bug in `ASWebAuthenticationSession`, and no work around have been found. Please see [issue #136](https://github.com/LinusU/flutter_web_auth/issues/136) for more info.
252 |
--------------------------------------------------------------------------------
/example/macos/Runner/Base.lproj/MainMenu.xib:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
333 |
334 |
335 |
336 |
337 |
338 |
339 |
340 |
341 |
342 |
343 |
344 |
--------------------------------------------------------------------------------
/example/ios/Runner.xcodeproj/project.pbxproj:
--------------------------------------------------------------------------------
1 | // !$*UTF8*$!
2 | {
3 | archiveVersion = 1;
4 | classes = {
5 | };
6 | objectVersion = 54;
7 | objects = {
8 |
9 | /* Begin PBXBuildFile section */
10 | 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */ = {isa = PBXBuildFile; fileRef = 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */; };
11 | 331C808B294A63AB00263BE5 /* RunnerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 331C807B294A618700263BE5 /* RunnerTests.swift */; };
12 | 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */; };
13 | 74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74858FAE1ED2DC5600515810 /* AppDelegate.swift */; };
14 | 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FA1CF9000F007C117D /* Main.storyboard */; };
15 | 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FD1CF9000F007C117D /* Assets.xcassets */; };
16 | 97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */; };
17 | A3143F062D0495028253E2F1 /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 6B8E2FE615F702B8C539DF7F /* Pods_Runner.framework */; };
18 | A7A9D35890057D806AACAE05 /* Pods_RunnerTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = ECA7C49ED332AB6540F2FFBE /* Pods_RunnerTests.framework */; };
19 | /* End PBXBuildFile section */
20 |
21 | /* Begin PBXContainerItemProxy section */
22 | 331C8085294A63A400263BE5 /* PBXContainerItemProxy */ = {
23 | isa = PBXContainerItemProxy;
24 | containerPortal = 97C146E61CF9000F007C117D /* Project object */;
25 | proxyType = 1;
26 | remoteGlobalIDString = 97C146ED1CF9000F007C117D;
27 | remoteInfo = Runner;
28 | };
29 | /* End PBXContainerItemProxy section */
30 |
31 | /* Begin PBXCopyFilesBuildPhase section */
32 | 9705A1C41CF9048500538489 /* Embed Frameworks */ = {
33 | isa = PBXCopyFilesBuildPhase;
34 | buildActionMask = 2147483647;
35 | dstPath = "";
36 | dstSubfolderSpec = 10;
37 | files = (
38 | );
39 | name = "Embed Frameworks";
40 | runOnlyForDeploymentPostprocessing = 0;
41 | };
42 | /* End PBXCopyFilesBuildPhase section */
43 |
44 | /* Begin PBXFileReference section */
45 | 0E026D3883213B0E1D243BE3 /* 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 = ""; };
46 | 1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GeneratedPluginRegistrant.h; sourceTree = ""; };
47 | 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GeneratedPluginRegistrant.m; sourceTree = ""; };
48 | 331C807B294A618700263BE5 /* RunnerTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RunnerTests.swift; sourceTree = ""; };
49 | 331C8081294A63A400263BE5 /* RunnerTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = RunnerTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; };
50 | 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = AppFrameworkInfo.plist; path = Flutter/AppFrameworkInfo.plist; sourceTree = ""; };
51 | 6B8E2FE615F702B8C539DF7F /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; };
52 | 74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Runner-Bridging-Header.h"; sourceTree = ""; };
53 | 74858FAE1ED2DC5600515810 /* AppDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; };
54 | 7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = Release.xcconfig; path = Flutter/Release.xcconfig; sourceTree = ""; };
55 | 884805677B771AC65FBEC69C /* 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 = ""; };
56 | 9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Debug.xcconfig; path = Flutter/Debug.xcconfig; sourceTree = ""; };
57 | 9740EEB31CF90195004384FC /* Generated.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Generated.xcconfig; path = Flutter/Generated.xcconfig; sourceTree = ""; };
58 | 97C146EE1CF9000F007C117D /* Runner.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Runner.app; sourceTree = BUILT_PRODUCTS_DIR; };
59 | 97C146FB1CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; };
60 | 97C146FD1CF9000F007C117D /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; };
61 | 97C147001CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; };
62 | 97C147021CF9000F007C117D /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; };
63 | A8DEF5409B07AC609F30F05E /* 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 = ""; };
64 | BB0862EB4003D6C6163E9725 /* 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 = ""; };
65 | DC6DF15CF2F84F3224C59BA6 /* 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 = ""; };
66 | ECA7C49ED332AB6540F2FFBE /* Pods_RunnerTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_RunnerTests.framework; sourceTree = BUILT_PRODUCTS_DIR; };
67 | F1A746F38A623793558F9DA3 /* 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 = ""; };
68 | /* End PBXFileReference section */
69 |
70 | /* Begin PBXFrameworksBuildPhase section */
71 | 97C146EB1CF9000F007C117D /* Frameworks */ = {
72 | isa = PBXFrameworksBuildPhase;
73 | buildActionMask = 2147483647;
74 | files = (
75 | A3143F062D0495028253E2F1 /* Pods_Runner.framework in Frameworks */,
76 | );
77 | runOnlyForDeploymentPostprocessing = 0;
78 | };
79 | B9ED3590DFDC6A6586B8E77D /* Frameworks */ = {
80 | isa = PBXFrameworksBuildPhase;
81 | buildActionMask = 2147483647;
82 | files = (
83 | A7A9D35890057D806AACAE05 /* Pods_RunnerTests.framework in Frameworks */,
84 | );
85 | runOnlyForDeploymentPostprocessing = 0;
86 | };
87 | /* End PBXFrameworksBuildPhase section */
88 |
89 | /* Begin PBXGroup section */
90 | 21BB9C9D6170E03B053D9C76 /* Pods */ = {
91 | isa = PBXGroup;
92 | children = (
93 | DC6DF15CF2F84F3224C59BA6 /* Pods-Runner.debug.xcconfig */,
94 | BB0862EB4003D6C6163E9725 /* Pods-Runner.release.xcconfig */,
95 | 0E026D3883213B0E1D243BE3 /* Pods-Runner.profile.xcconfig */,
96 | A8DEF5409B07AC609F30F05E /* Pods-RunnerTests.debug.xcconfig */,
97 | F1A746F38A623793558F9DA3 /* Pods-RunnerTests.release.xcconfig */,
98 | 884805677B771AC65FBEC69C /* Pods-RunnerTests.profile.xcconfig */,
99 | );
100 | name = Pods;
101 | path = Pods;
102 | sourceTree = "";
103 | };
104 | 2662D64544CA3970C2FC3142 /* Frameworks */ = {
105 | isa = PBXGroup;
106 | children = (
107 | 6B8E2FE615F702B8C539DF7F /* Pods_Runner.framework */,
108 | ECA7C49ED332AB6540F2FFBE /* Pods_RunnerTests.framework */,
109 | );
110 | name = Frameworks;
111 | sourceTree = "";
112 | };
113 | 331C8082294A63A400263BE5 /* RunnerTests */ = {
114 | isa = PBXGroup;
115 | children = (
116 | 331C807B294A618700263BE5 /* RunnerTests.swift */,
117 | );
118 | path = RunnerTests;
119 | sourceTree = "";
120 | };
121 | 9740EEB11CF90186004384FC /* Flutter */ = {
122 | isa = PBXGroup;
123 | children = (
124 | 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */,
125 | 9740EEB21CF90195004384FC /* Debug.xcconfig */,
126 | 7AFA3C8E1D35360C0083082E /* Release.xcconfig */,
127 | 9740EEB31CF90195004384FC /* Generated.xcconfig */,
128 | );
129 | name = Flutter;
130 | sourceTree = "";
131 | };
132 | 97C146E51CF9000F007C117D = {
133 | isa = PBXGroup;
134 | children = (
135 | 9740EEB11CF90186004384FC /* Flutter */,
136 | 97C146F01CF9000F007C117D /* Runner */,
137 | 97C146EF1CF9000F007C117D /* Products */,
138 | 331C8082294A63A400263BE5 /* RunnerTests */,
139 | 21BB9C9D6170E03B053D9C76 /* Pods */,
140 | 2662D64544CA3970C2FC3142 /* Frameworks */,
141 | );
142 | sourceTree = "";
143 | };
144 | 97C146EF1CF9000F007C117D /* Products */ = {
145 | isa = PBXGroup;
146 | children = (
147 | 97C146EE1CF9000F007C117D /* Runner.app */,
148 | 331C8081294A63A400263BE5 /* RunnerTests.xctest */,
149 | );
150 | name = Products;
151 | sourceTree = "";
152 | };
153 | 97C146F01CF9000F007C117D /* Runner */ = {
154 | isa = PBXGroup;
155 | children = (
156 | 97C146FA1CF9000F007C117D /* Main.storyboard */,
157 | 97C146FD1CF9000F007C117D /* Assets.xcassets */,
158 | 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */,
159 | 97C147021CF9000F007C117D /* Info.plist */,
160 | 1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */,
161 | 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */,
162 | 74858FAE1ED2DC5600515810 /* AppDelegate.swift */,
163 | 74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */,
164 | );
165 | path = Runner;
166 | sourceTree = "";
167 | };
168 | /* End PBXGroup section */
169 |
170 | /* Begin PBXNativeTarget section */
171 | 331C8080294A63A400263BE5 /* RunnerTests */ = {
172 | isa = PBXNativeTarget;
173 | buildConfigurationList = 331C8087294A63A400263BE5 /* Build configuration list for PBXNativeTarget "RunnerTests" */;
174 | buildPhases = (
175 | 1FE375C65236475469EA4B9B /* [CP] Check Pods Manifest.lock */,
176 | 331C807D294A63A400263BE5 /* Sources */,
177 | 331C807F294A63A400263BE5 /* Resources */,
178 | B9ED3590DFDC6A6586B8E77D /* Frameworks */,
179 | );
180 | buildRules = (
181 | );
182 | dependencies = (
183 | 331C8086294A63A400263BE5 /* PBXTargetDependency */,
184 | );
185 | name = RunnerTests;
186 | productName = RunnerTests;
187 | productReference = 331C8081294A63A400263BE5 /* RunnerTests.xctest */;
188 | productType = "com.apple.product-type.bundle.unit-test";
189 | };
190 | 97C146ED1CF9000F007C117D /* Runner */ = {
191 | isa = PBXNativeTarget;
192 | buildConfigurationList = 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */;
193 | buildPhases = (
194 | B9216A486AD22F945C3018D4 /* [CP] Check Pods Manifest.lock */,
195 | 9740EEB61CF901F6004384FC /* Run Script */,
196 | 97C146EA1CF9000F007C117D /* Sources */,
197 | 97C146EB1CF9000F007C117D /* Frameworks */,
198 | 97C146EC1CF9000F007C117D /* Resources */,
199 | 9705A1C41CF9048500538489 /* Embed Frameworks */,
200 | 3B06AD1E1E4923F5004D2608 /* Thin Binary */,
201 | C16CEE4270A639EDEB2E24F8 /* [CP] Embed Pods Frameworks */,
202 | );
203 | buildRules = (
204 | );
205 | dependencies = (
206 | );
207 | name = Runner;
208 | productName = Runner;
209 | productReference = 97C146EE1CF9000F007C117D /* Runner.app */;
210 | productType = "com.apple.product-type.application";
211 | };
212 | /* End PBXNativeTarget section */
213 |
214 | /* Begin PBXProject section */
215 | 97C146E61CF9000F007C117D /* Project object */ = {
216 | isa = PBXProject;
217 | attributes = {
218 | BuildIndependentTargetsInParallel = YES;
219 | LastUpgradeCheck = 1510;
220 | ORGANIZATIONNAME = "";
221 | TargetAttributes = {
222 | 331C8080294A63A400263BE5 = {
223 | CreatedOnToolsVersion = 14.0;
224 | TestTargetID = 97C146ED1CF9000F007C117D;
225 | };
226 | 97C146ED1CF9000F007C117D = {
227 | CreatedOnToolsVersion = 7.3.1;
228 | LastSwiftMigration = 1100;
229 | };
230 | };
231 | };
232 | buildConfigurationList = 97C146E91CF9000F007C117D /* Build configuration list for PBXProject "Runner" */;
233 | compatibilityVersion = "Xcode 9.3";
234 | developmentRegion = en;
235 | hasScannedForEncodings = 0;
236 | knownRegions = (
237 | en,
238 | Base,
239 | );
240 | mainGroup = 97C146E51CF9000F007C117D;
241 | productRefGroup = 97C146EF1CF9000F007C117D /* Products */;
242 | projectDirPath = "";
243 | projectRoot = "";
244 | targets = (
245 | 97C146ED1CF9000F007C117D /* Runner */,
246 | 331C8080294A63A400263BE5 /* RunnerTests */,
247 | );
248 | };
249 | /* End PBXProject section */
250 |
251 | /* Begin PBXResourcesBuildPhase section */
252 | 331C807F294A63A400263BE5 /* Resources */ = {
253 | isa = PBXResourcesBuildPhase;
254 | buildActionMask = 2147483647;
255 | files = (
256 | );
257 | runOnlyForDeploymentPostprocessing = 0;
258 | };
259 | 97C146EC1CF9000F007C117D /* Resources */ = {
260 | isa = PBXResourcesBuildPhase;
261 | buildActionMask = 2147483647;
262 | files = (
263 | 97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */,
264 | 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */,
265 | 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */,
266 | 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */,
267 | );
268 | runOnlyForDeploymentPostprocessing = 0;
269 | };
270 | /* End PBXResourcesBuildPhase section */
271 |
272 | /* Begin PBXShellScriptBuildPhase section */
273 | 1FE375C65236475469EA4B9B /* [CP] Check Pods Manifest.lock */ = {
274 | isa = PBXShellScriptBuildPhase;
275 | buildActionMask = 2147483647;
276 | files = (
277 | );
278 | inputFileListPaths = (
279 | );
280 | inputPaths = (
281 | "${PODS_PODFILE_DIR_PATH}/Podfile.lock",
282 | "${PODS_ROOT}/Manifest.lock",
283 | );
284 | name = "[CP] Check Pods Manifest.lock";
285 | outputFileListPaths = (
286 | );
287 | outputPaths = (
288 | "$(DERIVED_FILE_DIR)/Pods-RunnerTests-checkManifestLockResult.txt",
289 | );
290 | runOnlyForDeploymentPostprocessing = 0;
291 | shellPath = /bin/sh;
292 | 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";
293 | showEnvVarsInLog = 0;
294 | };
295 | 3B06AD1E1E4923F5004D2608 /* Thin Binary */ = {
296 | isa = PBXShellScriptBuildPhase;
297 | alwaysOutOfDate = 1;
298 | buildActionMask = 2147483647;
299 | files = (
300 | );
301 | inputPaths = (
302 | "${TARGET_BUILD_DIR}/${INFOPLIST_PATH}",
303 | );
304 | name = "Thin Binary";
305 | outputPaths = (
306 | );
307 | runOnlyForDeploymentPostprocessing = 0;
308 | shellPath = /bin/sh;
309 | shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" embed_and_thin";
310 | };
311 | 9740EEB61CF901F6004384FC /* Run Script */ = {
312 | isa = PBXShellScriptBuildPhase;
313 | alwaysOutOfDate = 1;
314 | buildActionMask = 2147483647;
315 | files = (
316 | );
317 | inputPaths = (
318 | );
319 | name = "Run Script";
320 | outputPaths = (
321 | );
322 | runOnlyForDeploymentPostprocessing = 0;
323 | shellPath = /bin/sh;
324 | shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" build";
325 | };
326 | B9216A486AD22F945C3018D4 /* [CP] Check Pods Manifest.lock */ = {
327 | isa = PBXShellScriptBuildPhase;
328 | buildActionMask = 2147483647;
329 | files = (
330 | );
331 | inputFileListPaths = (
332 | );
333 | inputPaths = (
334 | "${PODS_PODFILE_DIR_PATH}/Podfile.lock",
335 | "${PODS_ROOT}/Manifest.lock",
336 | );
337 | name = "[CP] Check Pods Manifest.lock";
338 | outputFileListPaths = (
339 | );
340 | outputPaths = (
341 | "$(DERIVED_FILE_DIR)/Pods-Runner-checkManifestLockResult.txt",
342 | );
343 | runOnlyForDeploymentPostprocessing = 0;
344 | shellPath = /bin/sh;
345 | 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";
346 | showEnvVarsInLog = 0;
347 | };
348 | C16CEE4270A639EDEB2E24F8 /* [CP] Embed Pods Frameworks */ = {
349 | isa = PBXShellScriptBuildPhase;
350 | buildActionMask = 2147483647;
351 | files = (
352 | );
353 | inputFileListPaths = (
354 | "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-input-files.xcfilelist",
355 | );
356 | name = "[CP] Embed Pods Frameworks";
357 | outputFileListPaths = (
358 | "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-output-files.xcfilelist",
359 | );
360 | runOnlyForDeploymentPostprocessing = 0;
361 | shellPath = /bin/sh;
362 | shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n";
363 | showEnvVarsInLog = 0;
364 | };
365 | /* End PBXShellScriptBuildPhase section */
366 |
367 | /* Begin PBXSourcesBuildPhase section */
368 | 331C807D294A63A400263BE5 /* Sources */ = {
369 | isa = PBXSourcesBuildPhase;
370 | buildActionMask = 2147483647;
371 | files = (
372 | 331C808B294A63AB00263BE5 /* RunnerTests.swift in Sources */,
373 | );
374 | runOnlyForDeploymentPostprocessing = 0;
375 | };
376 | 97C146EA1CF9000F007C117D /* Sources */ = {
377 | isa = PBXSourcesBuildPhase;
378 | buildActionMask = 2147483647;
379 | files = (
380 | 74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */,
381 | 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */,
382 | );
383 | runOnlyForDeploymentPostprocessing = 0;
384 | };
385 | /* End PBXSourcesBuildPhase section */
386 |
387 | /* Begin PBXTargetDependency section */
388 | 331C8086294A63A400263BE5 /* PBXTargetDependency */ = {
389 | isa = PBXTargetDependency;
390 | target = 97C146ED1CF9000F007C117D /* Runner */;
391 | targetProxy = 331C8085294A63A400263BE5 /* PBXContainerItemProxy */;
392 | };
393 | /* End PBXTargetDependency section */
394 |
395 | /* Begin PBXVariantGroup section */
396 | 97C146FA1CF9000F007C117D /* Main.storyboard */ = {
397 | isa = PBXVariantGroup;
398 | children = (
399 | 97C146FB1CF9000F007C117D /* Base */,
400 | );
401 | name = Main.storyboard;
402 | sourceTree = "";
403 | };
404 | 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */ = {
405 | isa = PBXVariantGroup;
406 | children = (
407 | 97C147001CF9000F007C117D /* Base */,
408 | );
409 | name = LaunchScreen.storyboard;
410 | sourceTree = "";
411 | };
412 | /* End PBXVariantGroup section */
413 |
414 | /* Begin XCBuildConfiguration section */
415 | 249021D3217E4FDB00AE95B9 /* Profile */ = {
416 | isa = XCBuildConfiguration;
417 | buildSettings = {
418 | ALWAYS_SEARCH_USER_PATHS = NO;
419 | ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES;
420 | CLANG_ANALYZER_NONNULL = YES;
421 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
422 | CLANG_CXX_LIBRARY = "libc++";
423 | CLANG_ENABLE_MODULES = YES;
424 | CLANG_ENABLE_OBJC_ARC = YES;
425 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
426 | CLANG_WARN_BOOL_CONVERSION = YES;
427 | CLANG_WARN_COMMA = YES;
428 | CLANG_WARN_CONSTANT_CONVERSION = YES;
429 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
430 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
431 | CLANG_WARN_EMPTY_BODY = YES;
432 | CLANG_WARN_ENUM_CONVERSION = YES;
433 | CLANG_WARN_INFINITE_RECURSION = YES;
434 | CLANG_WARN_INT_CONVERSION = YES;
435 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
436 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
437 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
438 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
439 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
440 | CLANG_WARN_STRICT_PROTOTYPES = YES;
441 | CLANG_WARN_SUSPICIOUS_MOVE = YES;
442 | CLANG_WARN_UNREACHABLE_CODE = YES;
443 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
444 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
445 | COPY_PHASE_STRIP = NO;
446 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
447 | ENABLE_NS_ASSERTIONS = NO;
448 | ENABLE_STRICT_OBJC_MSGSEND = YES;
449 | ENABLE_USER_SCRIPT_SANDBOXING = NO;
450 | GCC_C_LANGUAGE_STANDARD = gnu99;
451 | GCC_NO_COMMON_BLOCKS = YES;
452 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
453 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
454 | GCC_WARN_UNDECLARED_SELECTOR = YES;
455 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
456 | GCC_WARN_UNUSED_FUNCTION = YES;
457 | GCC_WARN_UNUSED_VARIABLE = YES;
458 | IPHONEOS_DEPLOYMENT_TARGET = 12.0;
459 | MTL_ENABLE_DEBUG_INFO = NO;
460 | SDKROOT = iphoneos;
461 | SUPPORTED_PLATFORMS = iphoneos;
462 | TARGETED_DEVICE_FAMILY = "1,2";
463 | VALIDATE_PRODUCT = YES;
464 | };
465 | name = Profile;
466 | };
467 | 249021D4217E4FDB00AE95B9 /* Profile */ = {
468 | isa = XCBuildConfiguration;
469 | baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */;
470 | buildSettings = {
471 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
472 | CLANG_ENABLE_MODULES = YES;
473 | CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)";
474 | DEVELOPMENT_TEAM = TUYUZ63ZY8;
475 | ENABLE_BITCODE = NO;
476 | INFOPLIST_FILE = Runner/Info.plist;
477 | LD_RUNPATH_SEARCH_PATHS = (
478 | "$(inherited)",
479 | "@executable_path/Frameworks",
480 | );
481 | PRODUCT_BUNDLE_IDENTIFIER = com.example.flutterWebAuthExample;
482 | PRODUCT_NAME = "$(TARGET_NAME)";
483 | SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h";
484 | SWIFT_VERSION = 5.0;
485 | VERSIONING_SYSTEM = "apple-generic";
486 | };
487 | name = Profile;
488 | };
489 | 331C8088294A63A400263BE5 /* Debug */ = {
490 | isa = XCBuildConfiguration;
491 | baseConfigurationReference = A8DEF5409B07AC609F30F05E /* Pods-RunnerTests.debug.xcconfig */;
492 | buildSettings = {
493 | BUNDLE_LOADER = "$(TEST_HOST)";
494 | CODE_SIGN_STYLE = Automatic;
495 | CURRENT_PROJECT_VERSION = 1;
496 | GENERATE_INFOPLIST_FILE = YES;
497 | MARKETING_VERSION = 1.0;
498 | PRODUCT_BUNDLE_IDENTIFIER = com.example.flutterWebAuthExample.RunnerTests;
499 | PRODUCT_NAME = "$(TARGET_NAME)";
500 | SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG;
501 | SWIFT_OPTIMIZATION_LEVEL = "-Onone";
502 | SWIFT_VERSION = 5.0;
503 | TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Runner.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/Runner";
504 | };
505 | name = Debug;
506 | };
507 | 331C8089294A63A400263BE5 /* Release */ = {
508 | isa = XCBuildConfiguration;
509 | baseConfigurationReference = F1A746F38A623793558F9DA3 /* Pods-RunnerTests.release.xcconfig */;
510 | buildSettings = {
511 | BUNDLE_LOADER = "$(TEST_HOST)";
512 | CODE_SIGN_STYLE = Automatic;
513 | CURRENT_PROJECT_VERSION = 1;
514 | GENERATE_INFOPLIST_FILE = YES;
515 | MARKETING_VERSION = 1.0;
516 | PRODUCT_BUNDLE_IDENTIFIER = com.example.flutterWebAuthExample.RunnerTests;
517 | PRODUCT_NAME = "$(TARGET_NAME)";
518 | SWIFT_VERSION = 5.0;
519 | TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Runner.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/Runner";
520 | };
521 | name = Release;
522 | };
523 | 331C808A294A63A400263BE5 /* Profile */ = {
524 | isa = XCBuildConfiguration;
525 | baseConfigurationReference = 884805677B771AC65FBEC69C /* Pods-RunnerTests.profile.xcconfig */;
526 | buildSettings = {
527 | BUNDLE_LOADER = "$(TEST_HOST)";
528 | CODE_SIGN_STYLE = Automatic;
529 | CURRENT_PROJECT_VERSION = 1;
530 | GENERATE_INFOPLIST_FILE = YES;
531 | MARKETING_VERSION = 1.0;
532 | PRODUCT_BUNDLE_IDENTIFIER = com.example.flutterWebAuthExample.RunnerTests;
533 | PRODUCT_NAME = "$(TARGET_NAME)";
534 | SWIFT_VERSION = 5.0;
535 | TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Runner.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/Runner";
536 | };
537 | name = Profile;
538 | };
539 | 97C147031CF9000F007C117D /* Debug */ = {
540 | isa = XCBuildConfiguration;
541 | buildSettings = {
542 | ALWAYS_SEARCH_USER_PATHS = NO;
543 | ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES;
544 | CLANG_ANALYZER_NONNULL = YES;
545 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
546 | CLANG_CXX_LIBRARY = "libc++";
547 | CLANG_ENABLE_MODULES = YES;
548 | CLANG_ENABLE_OBJC_ARC = YES;
549 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
550 | CLANG_WARN_BOOL_CONVERSION = YES;
551 | CLANG_WARN_COMMA = YES;
552 | CLANG_WARN_CONSTANT_CONVERSION = YES;
553 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
554 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
555 | CLANG_WARN_EMPTY_BODY = YES;
556 | CLANG_WARN_ENUM_CONVERSION = YES;
557 | CLANG_WARN_INFINITE_RECURSION = YES;
558 | CLANG_WARN_INT_CONVERSION = YES;
559 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
560 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
561 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
562 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
563 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
564 | CLANG_WARN_STRICT_PROTOTYPES = YES;
565 | CLANG_WARN_SUSPICIOUS_MOVE = YES;
566 | CLANG_WARN_UNREACHABLE_CODE = YES;
567 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
568 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
569 | COPY_PHASE_STRIP = NO;
570 | DEBUG_INFORMATION_FORMAT = dwarf;
571 | ENABLE_STRICT_OBJC_MSGSEND = YES;
572 | ENABLE_TESTABILITY = YES;
573 | ENABLE_USER_SCRIPT_SANDBOXING = NO;
574 | GCC_C_LANGUAGE_STANDARD = gnu99;
575 | GCC_DYNAMIC_NO_PIC = NO;
576 | GCC_NO_COMMON_BLOCKS = YES;
577 | GCC_OPTIMIZATION_LEVEL = 0;
578 | GCC_PREPROCESSOR_DEFINITIONS = (
579 | "DEBUG=1",
580 | "$(inherited)",
581 | );
582 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
583 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
584 | GCC_WARN_UNDECLARED_SELECTOR = YES;
585 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
586 | GCC_WARN_UNUSED_FUNCTION = YES;
587 | GCC_WARN_UNUSED_VARIABLE = YES;
588 | IPHONEOS_DEPLOYMENT_TARGET = 12.0;
589 | MTL_ENABLE_DEBUG_INFO = YES;
590 | ONLY_ACTIVE_ARCH = YES;
591 | SDKROOT = iphoneos;
592 | TARGETED_DEVICE_FAMILY = "1,2";
593 | };
594 | name = Debug;
595 | };
596 | 97C147041CF9000F007C117D /* Release */ = {
597 | isa = XCBuildConfiguration;
598 | buildSettings = {
599 | ALWAYS_SEARCH_USER_PATHS = NO;
600 | ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES;
601 | CLANG_ANALYZER_NONNULL = YES;
602 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
603 | CLANG_CXX_LIBRARY = "libc++";
604 | CLANG_ENABLE_MODULES = YES;
605 | CLANG_ENABLE_OBJC_ARC = YES;
606 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
607 | CLANG_WARN_BOOL_CONVERSION = YES;
608 | CLANG_WARN_COMMA = YES;
609 | CLANG_WARN_CONSTANT_CONVERSION = YES;
610 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
611 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
612 | CLANG_WARN_EMPTY_BODY = YES;
613 | CLANG_WARN_ENUM_CONVERSION = YES;
614 | CLANG_WARN_INFINITE_RECURSION = YES;
615 | CLANG_WARN_INT_CONVERSION = YES;
616 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
617 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
618 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
619 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
620 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
621 | CLANG_WARN_STRICT_PROTOTYPES = YES;
622 | CLANG_WARN_SUSPICIOUS_MOVE = YES;
623 | CLANG_WARN_UNREACHABLE_CODE = YES;
624 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
625 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
626 | COPY_PHASE_STRIP = NO;
627 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
628 | ENABLE_NS_ASSERTIONS = NO;
629 | ENABLE_STRICT_OBJC_MSGSEND = YES;
630 | ENABLE_USER_SCRIPT_SANDBOXING = NO;
631 | GCC_C_LANGUAGE_STANDARD = gnu99;
632 | GCC_NO_COMMON_BLOCKS = YES;
633 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
634 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
635 | GCC_WARN_UNDECLARED_SELECTOR = YES;
636 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
637 | GCC_WARN_UNUSED_FUNCTION = YES;
638 | GCC_WARN_UNUSED_VARIABLE = YES;
639 | IPHONEOS_DEPLOYMENT_TARGET = 12.0;
640 | MTL_ENABLE_DEBUG_INFO = NO;
641 | SDKROOT = iphoneos;
642 | SUPPORTED_PLATFORMS = iphoneos;
643 | SWIFT_COMPILATION_MODE = wholemodule;
644 | SWIFT_OPTIMIZATION_LEVEL = "-O";
645 | TARGETED_DEVICE_FAMILY = "1,2";
646 | VALIDATE_PRODUCT = YES;
647 | };
648 | name = Release;
649 | };
650 | 97C147061CF9000F007C117D /* Debug */ = {
651 | isa = XCBuildConfiguration;
652 | baseConfigurationReference = 9740EEB21CF90195004384FC /* Debug.xcconfig */;
653 | buildSettings = {
654 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
655 | CLANG_ENABLE_MODULES = YES;
656 | CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)";
657 | DEVELOPMENT_TEAM = TUYUZ63ZY8;
658 | ENABLE_BITCODE = NO;
659 | INFOPLIST_FILE = Runner/Info.plist;
660 | LD_RUNPATH_SEARCH_PATHS = (
661 | "$(inherited)",
662 | "@executable_path/Frameworks",
663 | );
664 | PRODUCT_BUNDLE_IDENTIFIER = com.example.flutterWebAuthExample;
665 | PRODUCT_NAME = "$(TARGET_NAME)";
666 | SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h";
667 | SWIFT_OPTIMIZATION_LEVEL = "-Onone";
668 | SWIFT_VERSION = 5.0;
669 | VERSIONING_SYSTEM = "apple-generic";
670 | };
671 | name = Debug;
672 | };
673 | 97C147071CF9000F007C117D /* Release */ = {
674 | isa = XCBuildConfiguration;
675 | baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */;
676 | buildSettings = {
677 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
678 | CLANG_ENABLE_MODULES = YES;
679 | CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)";
680 | DEVELOPMENT_TEAM = TUYUZ63ZY8;
681 | ENABLE_BITCODE = NO;
682 | INFOPLIST_FILE = Runner/Info.plist;
683 | LD_RUNPATH_SEARCH_PATHS = (
684 | "$(inherited)",
685 | "@executable_path/Frameworks",
686 | );
687 | PRODUCT_BUNDLE_IDENTIFIER = com.example.flutterWebAuthExample;
688 | PRODUCT_NAME = "$(TARGET_NAME)";
689 | SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h";
690 | SWIFT_VERSION = 5.0;
691 | VERSIONING_SYSTEM = "apple-generic";
692 | };
693 | name = Release;
694 | };
695 | /* End XCBuildConfiguration section */
696 |
697 | /* Begin XCConfigurationList section */
698 | 331C8087294A63A400263BE5 /* Build configuration list for PBXNativeTarget "RunnerTests" */ = {
699 | isa = XCConfigurationList;
700 | buildConfigurations = (
701 | 331C8088294A63A400263BE5 /* Debug */,
702 | 331C8089294A63A400263BE5 /* Release */,
703 | 331C808A294A63A400263BE5 /* Profile */,
704 | );
705 | defaultConfigurationIsVisible = 0;
706 | defaultConfigurationName = Release;
707 | };
708 | 97C146E91CF9000F007C117D /* Build configuration list for PBXProject "Runner" */ = {
709 | isa = XCConfigurationList;
710 | buildConfigurations = (
711 | 97C147031CF9000F007C117D /* Debug */,
712 | 97C147041CF9000F007C117D /* Release */,
713 | 249021D3217E4FDB00AE95B9 /* Profile */,
714 | );
715 | defaultConfigurationIsVisible = 0;
716 | defaultConfigurationName = Release;
717 | };
718 | 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */ = {
719 | isa = XCConfigurationList;
720 | buildConfigurations = (
721 | 97C147061CF9000F007C117D /* Debug */,
722 | 97C147071CF9000F007C117D /* Release */,
723 | 249021D4217E4FDB00AE95B9 /* Profile */,
724 | );
725 | defaultConfigurationIsVisible = 0;
726 | defaultConfigurationName = Release;
727 | };
728 | /* End XCConfigurationList section */
729 | };
730 | rootObject = 97C146E61CF9000F007C117D /* Project object */;
731 | }
732 |
--------------------------------------------------------------------------------