Skip to content

Commit 0979cf1

Browse files
authored
Fix macOS login (#200)
* Fix Facebook login doesn't work * Fix sign in button loosing margin * Also update Android & iOS configuration best practices
1 parent fa654b6 commit 0979cf1

File tree

16 files changed

+176
-71
lines changed

16 files changed

+176
-71
lines changed

README.md

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ upload the apps to GCS (automatically deleted after 30 days).
2121
- Windows
2222
- State management with [provider](https://pub.dev/packages/provider)
2323
- Apple login via [apple_sign_in](https://pub.dev/packages/apple_sign_in)
24-
- Facebook login via [flutter_facebook_login](https://pub.dev/packages/flutter_facebook_login)
24+
- Facebook login via [flutter_facebook_auth](https://pub.dev/packages/flutter_facebook_auth)
2525
- Google login via [google_sign_in](https://pub.dev/packages/google_sign_in)
2626
- Store authentication token with [flutter_secure_storage](https://pub.dev/packages/flutter_secure_storage)
2727
- Render HTML with [flutter_widget_from_html](https://pub.dev/packages/flutter_widget_from_html)
@@ -72,7 +72,7 @@ Pick a unique package name across Play Store and App Store then update these fil
7272

7373
- `.github/workflows/flutter.yml` GCS_BUCKET, GCS_URL
7474
- `android/app/build.gradle` applicationId, signingConfigs.release
75-
- `android/app/src/main/AndroidManifest.xml` package, android:label
75+
- `android/app/src/main/AndroidManifest.xml` package, android:label, com.facebook.FacebookContentProvider
7676
- `android/app/src/main/res/values/strings.xml` app_name, facebook_app_id, facebook_client_token, fb_login_protocol_scheme
7777
- `android/fastlane/metadata/android/en-US/` title.txt, full_description.txt, short_description.txt
7878
- `android/fastlane/Appfile`
@@ -82,6 +82,7 @@ Pick a unique package name across Play Store and App Store then update these fil
8282
- `ios/fastlane/Appfile`
8383
- `ios/fastlane/Fastfile` xcargs (PROVISIONING_PROFILE_SPECIFIER), manifest (appURL, displayImageURL, fullSizeImageURL)
8484
- `ios/fastlane/Matchfile`
85+
- `lib/src/abstracts/facebook_log_in.dart` Facebook appId
8586
- `linux/CMakeLists.txt` APPLICATION_ID
8687
- `macos/Runner/Configs/AppInfo.xcconfig`
8788
- `macos/Runner.xcodeproj/project.pbxproj` PROVISIONING_PROFILE_SPECIFIER x3

android/app/src/main/AndroidManifest.xml

Lines changed: 50 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,64 +1,94 @@
1-
<manifest xmlns:android="http://schemas.android.com/apk/res/android">
1+
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
2+
xmlns:tools="http://schemas.android.com/tools">
23

3-
<uses-permission android:name="android.permission.INTERNET"/>
4+
<uses-permission android:name="android.permission.INTERNET" />
5+
6+
<!-- flutter_facebook_auth -->
7+
<uses-permission
8+
android:name="com.google.android.gms.permission.AD_ID"
9+
tools:node="remove" />
10+
<queries>
11+
<provider android:authorities="com.facebook.katana.provider.PlatformProvider" />
12+
</queries>
413

514
<application
15+
android:name="${applicationName}"
616
android:allowBackup="true"
717
android:fullBackupContent="@xml/backup_rules"
8-
android:label="@string/app_name"
9-
android:name="${applicationName}"
10-
android:icon="@mipmap/ic_launcher">
18+
android:icon="@mipmap/ic_launcher"
19+
android:label="@string/app_name">
1120
<activity
1221
android:name=".MainActivity"
22+
android:configChanges="orientation|keyboardHidden|keyboard|screenSize|smallestScreenSize|locale|layoutDirection|fontScale|screenLayout|density|uiMode"
1323
android:exported="true"
24+
android:hardwareAccelerated="true"
1425
android:launchMode="singleTop"
1526
android:theme="@style/LaunchTheme"
16-
android:configChanges="orientation|keyboardHidden|keyboard|screenSize|smallestScreenSize|locale|layoutDirection|fontScale|screenLayout|density|uiMode"
17-
android:hardwareAccelerated="true"
1827
android:windowSoftInputMode="adjustResize">
1928
<!-- Specifies an Android theme to apply to this Activity as soon as
2029
the Android process has started. This theme is visible to the user
2130
while the Flutter UI initializes. After that, this theme continues
2231
to determine the Window background behind the Flutter UI. -->
2332
<meta-data
24-
android:name="io.flutter.embedding.android.NormalTheme"
25-
android:resource="@style/NormalTheme"
26-
/>
33+
android:name="io.flutter.embedding.android.NormalTheme"
34+
android:resource="@style/NormalTheme" />
35+
2736
<intent-filter>
28-
<action android:name="android.intent.action.MAIN"/>
29-
<category android:name="android.intent.category.LAUNCHER"/>
37+
<action android:name="android.intent.action.MAIN" />
38+
<category android:name="android.intent.category.LAUNCHER" />
3039
</intent-filter>
3140
<intent-filter android:autoVerify="true">
3241
<action android:name="android.intent.action.VIEW" />
42+
3343
<category android:name="android.intent.category.DEFAULT" />
3444
<category android:name="android.intent.category.BROWSABLE" />
35-
<data android:scheme="https" android:host="tinhte.vn" />
45+
46+
<data
47+
android:host="tinhte.vn"
48+
android:scheme="https" />
3649
</intent-filter>
3750
<intent-filter>
3851
<action android:name="FLUTTER_NOTIFICATION_CLICK" />
3952
<category android:name="android.intent.category.DEFAULT" />
4053
</intent-filter>
4154
</activity>
4255

43-
<meta-data android:name="com.facebook.sdk.ApplicationId"
44-
android:value="@string/facebook_app_id"/>
45-
<meta-data android:name="com.facebook.sdk.ClientToken"
46-
android:value="@string/facebook_client_token"/>
56+
<meta-data
57+
android:name="com.facebook.sdk.AdvertiserIDCollectionEnabled"
58+
android:value="false" />
59+
<meta-data
60+
android:name="com.facebook.sdk.ApplicationId"
61+
android:value="@string/facebook_app_id" />
62+
<meta-data
63+
android:name="com.facebook.sdk.ApplicationName"
64+
android:value="@string/facebook_app_name" />
65+
<meta-data
66+
android:name="com.facebook.sdk.AutoLogAppEventsEnabled"
67+
android:value="false" />
68+
<meta-data
69+
android:name="com.facebook.sdk.ClientToken"
70+
android:value="@string/facebook_client_token" />
4771

48-
<activity android:name="com.facebook.FacebookActivity"
49-
android:configChanges=
50-
"keyboard|keyboardHidden|screenLayout|screenSize|orientation"
72+
<activity
73+
android:name="com.facebook.FacebookActivity"
74+
android:configChanges="keyboard|keyboardHidden|screenLayout|screenSize|orientation"
5175
android:label="@string/app_name" />
5276
<activity
5377
android:name="com.facebook.CustomTabActivity"
5478
android:exported="true">
5579
<intent-filter>
5680
<action android:name="android.intent.action.VIEW" />
81+
5782
<category android:name="android.intent.category.DEFAULT" />
5883
<category android:name="android.intent.category.BROWSABLE" />
84+
5985
<data android:scheme="@string/fb_login_protocol_scheme" />
6086
</intent-filter>
6187
</activity>
88+
<provider
89+
android:name="com.facebook.FacebookContentProvider"
90+
android:authorities="com.facebook.app.FacebookContentProvider566879507102666"
91+
android:exported="true" />
6292

6393
<service
6494
android:name=".FcmService"

android/app/src/main/res/values/strings.xml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
<resources>
33
<string name="app_name">ttdemo</string>
44
<string name="facebook_app_id">566879507102666</string>
5+
<string name="facebook_app_name">com.daohoangson.flutter_ttdemo</string>
56
<string name="facebook_client_token">bee1edd35d32695d76209b09c46c60dc</string>
67
<string name="fb_login_protocol_scheme">fb566879507102666</string>
78
</resources>

ios/Podfile.lock

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -135,11 +135,11 @@ PODS:
135135
- shared_preferences_foundation (0.0.1):
136136
- Flutter
137137
- FlutterMacOS
138+
- sign_in_with_apple (0.0.1):
139+
- Flutter
138140
- sqflite (0.0.3):
139141
- Flutter
140142
- FMDB (>= 2.7.5)
141-
- the_apple_sign_in (1.0.0):
142-
- Flutter
143143
- uni_links (0.0.1):
144144
- Flutter
145145
- url_launcher_ios (0.0.1):
@@ -166,8 +166,8 @@ DEPENDENCIES:
166166
- path_provider_foundation (from `.symlinks/plugins/path_provider_foundation/darwin`)
167167
- share_plus (from `.symlinks/plugins/share_plus/ios`)
168168
- shared_preferences_foundation (from `.symlinks/plugins/shared_preferences_foundation/darwin`)
169+
- sign_in_with_apple (from `.symlinks/plugins/sign_in_with_apple/ios`)
169170
- sqflite (from `.symlinks/plugins/sqflite/ios`)
170-
- the_apple_sign_in (from `.symlinks/plugins/the_apple_sign_in/ios`)
171171
- uni_links (from `.symlinks/plugins/uni_links/ios`)
172172
- url_launcher_ios (from `.symlinks/plugins/url_launcher_ios/ios`)
173173
- video_player_avfoundation (from `.symlinks/plugins/video_player_avfoundation/ios`)
@@ -228,10 +228,10 @@ EXTERNAL SOURCES:
228228
:path: ".symlinks/plugins/share_plus/ios"
229229
shared_preferences_foundation:
230230
:path: ".symlinks/plugins/shared_preferences_foundation/darwin"
231+
sign_in_with_apple:
232+
:path: ".symlinks/plugins/sign_in_with_apple/ios"
231233
sqflite:
232234
:path: ".symlinks/plugins/sqflite/ios"
233-
the_apple_sign_in:
234-
:path: ".symlinks/plugins/the_apple_sign_in/ios"
235235
uni_links:
236236
:path: ".symlinks/plugins/uni_links/ios"
237237
url_launcher_ios:
@@ -280,8 +280,8 @@ SPEC CHECKSUMS:
280280
PromisesSwift: 28dca69a9c40779916ac2d6985a0192a5cb4a265
281281
share_plus: 599aa54e4ea31d4b4c0e9c911bcc26c55e791028
282282
shared_preferences_foundation: 5b919d13b803cadd15ed2dc053125c68730e5126
283+
sign_in_with_apple: f3bf75217ea4c2c8b91823f225d70230119b8440
283284
sqflite: 31f7eba61e3074736dff8807a9b41581e4f7f15a
284-
the_apple_sign_in: 2e78c83cdb09eba07bb16dcc1f3bc12fcdc8263d
285285
uni_links: d97da20c7701486ba192624d99bffaaffcfc298a
286286
url_launcher_ios: 08a3dfac5fb39e8759aeb0abbd5d9480f30fc8b4
287287
video_player_avfoundation: 81e49bb3d9fb63dccf9fa0f6d877dc3ddbeac126

ios/Runner.xcodeproj/project.pbxproj

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -207,6 +207,7 @@
207207
9705A1C41CF9048500538489 /* Embed Frameworks */,
208208
3B06AD1E1E4923F5004D2608 /* Thin Binary */,
209209
420D8C6449EA17AD742D8994 /* [CP] Embed Pods Frameworks */,
210+
D544E1D3BEDF3DE7A67CADF9 /* [firebase_crashlytics] Crashlytics Upload Symbols */,
210211
);
211212
buildRules = (
212213
);
@@ -348,6 +349,26 @@
348349
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";
349350
showEnvVarsInLog = 0;
350351
};
352+
D544E1D3BEDF3DE7A67CADF9 /* [firebase_crashlytics] Crashlytics Upload Symbols */ = {
353+
isa = PBXShellScriptBuildPhase;
354+
buildActionMask = 2147483647;
355+
files = (
356+
);
357+
inputFileListPaths = (
358+
);
359+
inputPaths = (
360+
"\"${DWARF_DSYM_FOLDER_PATH}/${DWARF_DSYM_FILE_NAME}/Contents/Resources/DWARF/${TARGET_NAME}\"",
361+
"\"$(SRCROOT)/$(BUILT_PRODUCTS_DIR)/$(INFOPLIST_PATH)\"",
362+
);
363+
name = "[firebase_crashlytics] Crashlytics Upload Symbols";
364+
outputFileListPaths = (
365+
);
366+
outputPaths = (
367+
);
368+
runOnlyForDeploymentPostprocessing = 0;
369+
shellPath = /bin/sh;
370+
shellScript = "\"$PODS_ROOT/FirebaseCrashlytics/upload-symbols\" --flutter-project \"$PROJECT_DIR/firebase_app_id_file.json\" ";
371+
};
351372
D7D718D14130634A5D9FA4D1 /* [CP] Check Pods Manifest.lock */ = {
352373
isa = PBXShellScriptBuildPhase;
353374
buildActionMask = 2147483647;

ios/Runner/Info.plist

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,8 @@
4141
<string>$(FLUTTER_BUILD_NUMBER)</string>
4242
<key>FacebookAppID</key>
4343
<string>566879507102666</string>
44+
<key>FacebookAutoLogAppEventsEnabled</key>
45+
<false/>
4446
<key>FacebookClientToken</key>
4547
<string>bee1edd35d32695d76209b09c46c60dc</string>
4648
<key>FacebookDisplayName</key>
@@ -51,8 +53,6 @@
5153
<array>
5254
<string>fbapi</string>
5355
<string>fb-messenger-share-api</string>
54-
<string>fbauth2</string>
55-
<string>fbshareextension</string>
5656
</array>
5757
<key>LSRequiresIPhoneOS</key>
5858
<true/>

lib/main.dart

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ import 'package:flutter/material.dart';
33
import 'package:flutter_localizations/flutter_localizations.dart';
44
import 'package:provider/provider.dart';
55
import 'package:the_app/src/abstracts/error_reporting.dart' as error_reporting;
6+
import 'package:the_app/src/abstracts/facebook_log_in.dart' as facebook_log_in;
67
import 'package:the_app/src/abstracts/firebase.dart' as firebase;
78
import 'package:the_app/src/intl.dart';
89
import 'package:the_app/src/link.dart';
@@ -21,20 +22,17 @@ import 'package:timeago/timeago.dart' as timeago;
2122
void main() async {
2223
timeago.setLocaleMessages('vi', timeago.ViMessages());
2324

24-
WidgetsFlutterBinding.ensureInitialized();
25-
await firebase.initializeApp();
26-
error_reporting.configureErrorReporting();
27-
push_notification.configurePushNotification();
28-
2925
DarkTheme? darkTheme;
3026
DevTools? devTools;
3127
FontScale? fontScale;
3228
String? initialLink;
3329
String? initialPath;
30+
WidgetsFlutterBinding.ensureInitialized();
3431
await Future.wait([
3532
DarkTheme.create().then((value) => darkTheme = value),
3633
FontScale.create().then((value) => fontScale = value),
3734
DevTools.create().then((value) => devTools = value),
35+
facebook_log_in.configureFacebookLogin(),
3836
uni_links.getInitialLink().then((value) => initialLink = value),
3937
firebase.initializeApp().then((value) async {
4038
error_reporting.configureErrorReporting();
Lines changed: 16 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,26 @@
1+
import 'dart:io';
2+
13
import 'package:flutter/widgets.dart';
24
import 'package:the_app/src/intl.dart';
3-
import 'package:the_apple_sign_in/the_apple_sign_in.dart' as lib;
5+
import 'package:sign_in_with_apple/sign_in_with_apple.dart' as lib;
46

5-
Future<bool> get isSupported => lib.TheAppleSignIn.isAvailable();
7+
final isSupported = Platform.isIOS;
68

79
Future<String> signIn(BuildContext context) async {
810
final l10n = l(context);
911

10-
const req = lib.AppleIdRequest(requestedScopes: [lib.Scope.email]);
11-
final result = await lib.TheAppleSignIn.performRequests([req]);
12-
13-
switch (result.status) {
14-
case lib.AuthorizationStatus.authorized:
15-
return String.fromCharCodes(result.credential!.identityToken!);
16-
case lib.AuthorizationStatus.cancelled:
12+
try {
13+
final credential = await lib.SignInWithApple.getAppleIDCredential(
14+
scopes: [
15+
lib.AppleIDAuthorizationScopes.email,
16+
],
17+
);
18+
return credential.identityToken!;
19+
} on lib.SignInWithAppleAuthorizationException catch (e) {
20+
if (e.code == lib.AuthorizationErrorCode.canceled) {
1721
throw StateError(l10n.loginErrorCancelled(l10n.loginWithApple));
18-
case lib.AuthorizationStatus.error:
19-
throw StateError(result.error!.localizedDescription!);
22+
} else {
23+
throw StateError(e.message);
24+
}
2025
}
2126
}

lib/src/abstracts/facebook_log_in.dart

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,26 @@
1+
import 'package:flutter/foundation.dart';
12
import 'package:flutter/material.dart';
23
import 'package:flutter_facebook_auth/flutter_facebook_auth.dart' as lib;
34
import 'package:the_app/src/intl.dart';
45

6+
Future<void> configureFacebookLogin() async {
7+
if (defaultTargetPlatform == TargetPlatform.macOS) {
8+
await lib.FacebookAuth.instance.webAndDesktopInitialize(
9+
appId: "566879507102666",
10+
cookie: true,
11+
xfbml: true,
12+
version: "v14.0",
13+
);
14+
}
15+
}
16+
517
Future<String> logIn(BuildContext context) async {
618
final l10n = l(context);
7-
final result = await lib.FacebookAuth.instance.login();
19+
final result = await lib.FacebookAuth.instance.login(
20+
permissions: const [
21+
'email',
22+
],
23+
);
824
switch (result.status) {
925
case lib.LoginStatus.success:
1026
return result.accessToken!.token;

lib/src/screens/login.dart

Lines changed: 1 addition & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,6 @@ class _LoginFormState extends State<LoginForm> {
4343

4444
LoginAssociatable? _associatable;
4545
LoginTfa? _tfa;
46-
bool _canLoginApple = false;
4746
bool _isLoggingIn = false;
4847

4948
String _username = '';
@@ -52,18 +51,6 @@ class _LoginFormState extends State<LoginForm> {
5251

5352
_LoginFormState();
5453

55-
@override
56-
void initState() {
57-
super.initState();
58-
59-
if (config.loginWithApple) {
60-
apple_sign_in.isSupported.then((ok) {
61-
if (!ok || !mounted) return;
62-
setState(() => _canLoginApple = true);
63-
});
64-
}
65-
}
66-
6754
@override
6855
void dispose() {
6956
focusNodePassword.dispose();
@@ -145,7 +132,7 @@ class _LoginFormState extends State<LoginForm> {
145132
),
146133
],
147134
),
148-
if (_canLoginApple)
135+
if (config.loginWithApple && apple_sign_in.isSupported)
149136
SignInButton.apple(
150137
onPressed: _loginApple,
151138
text: l(context).loginWithApple,

0 commit comments

Comments
 (0)