我正在使用 firebase 动态链接在我的应用程序中打开电子邮件验证链接,但不幸的是,点击该链接后应用程序不会启动。
到目前为止我做了什么
创建新用户时,将通过电子邮件发送一个链接以供验证:
if(firebaseUser != null && !firebaseUser.emailVerified){
await createUserInDatabaseIfNew(firebaseUser);
var actionCodeSettings = auth.ActionCodeSettings(
url: 'https://muslimcoloc.page.link/?email=${firebaseUser.email}',
dynamicLinkDomain: "muslimcoloc.page.link",
androidInstallApp: true,
androidMinimumVersion: "12",
androidPackageName: "com.app.muslim_coloc",
iOSBundleId: "com.muslim_coloc.ios",
handleCodeInApp: true,
);
await firebaseUser.sendEmailVerification(actionCodeSettings);
}
我在 firebase 控制台中得到了 dynamicLinkDomain :
然后,我在我的 main.dart
文件中处理链接的接收,使用 firebase dynamic links package :
void main() async {
WidgetsFlutterBinding.ensureInitialized();
await Firebase.initializeApp();
runApp(
MyApp(),
);
}
class MyApp extends StatelessWidget {
MyApp({Key key, }) : super(key: key);
@override
Widget build(BuildContext context) {
return AppView();
}
}
class AppView extends StatefulWidget {
const AppView({
Key key,
}) : super(key: key);
@override
_AppViewState createState() => _AppViewState();
}
class _AppViewState extends State<AppView> with WidgetsBindingObserver {
@override
void initState() {
super.initState();
WidgetsBinding.instance.addObserver(this);
}
@override
void didChangeAppLifecycleState(AppLifecycleState state) {
if (state == AppLifecycleState.resumed) {
this.initDynamicLinks();
}
}
void initDynamicLinks() async {
FirebaseDynamicLinks.instance.onLink(
onSuccess: (PendingDynamicLinkData dynamicLink) async {
final Uri deepLink = dynamicLink?.link;
FirebaseAuth auth = FirebaseAuth.instance;
//Get actionCode from the dynamicLink
var actionCode = deepLink.queryParameters['oobCode'];
try {
await auth.checkActionCode(actionCode);
await auth.applyActionCode(actionCode);
// If successful, reload the user:
auth.currentUser.reload();
} on FirebaseAuthException catch (e) {
if (e.code == 'invalid-action-code') {
print('The code is invalid.');
}
}
if (deepLink != null) {
Navigator.pushNamed(context, deepLink.path);
}
},
onError: (OnLinkErrorException e) async {
print('onLinkError');
print(e.message);
}
);
final PendingDynamicLinkData data =
await FirebaseDynamicLinks.instance.getInitialLink();
final Uri deepLink = data?.link;
if (deepLink != null) {
Navigator.pushNamed(context, deepLink.path);
}
}
@override
Widget build(BuildContext context) {
return MaterialApp(...)
}
当我点击电子邮件的链接时,应用程序和浏览器都没有启动。这是发生了什么:
它尝试在浏览器上启动一些东西,但随后返回到 gmail。
但是,如果我在桌面浏览器中单击链接,它会正常工作,电子邮件已通过验证。
我很难理解这是怎么回事。我做事的方式有问题吗?
最佳答案
您应该根据文档编写一个函数来处理您的动态链接,这在我当前使用的应用程序中对我有用:
void handleDynamicLinks() async {
///To bring INTO FOREGROUND FROM DYNAMIC LINK.
FirebaseDynamicLinks.instance.onLink(
onSuccess: (PendingDynamicLinkData dynamicLinkData) async {
await _handleDeepLink(dynamicLinkData);
},
onError: (OnLinkErrorException e) async {
print('DynamicLink Failed: ${e.message}');
return e.message;
},
);
final PendingDynamicLinkData data =
await FirebaseDynamicLinks.instance.getInitialLink();
_handleDeepLink(data);
}
// bool _deeplink = true;
_handleDeepLink(PendingDynamicLinkData data) async {
final Uri? deeplink = data.link;
if (deeplink != null) {
print('Handling Deep Link | deepLink: $deeplink');
}
}
在初始化状态中:
@override
void initState() {
handleDynamicLinks();
super.initState();
}
把这个逻辑写在你的主页上。不在 void(main..etc)
但是在那之后的第一个小部件中,它应该可以工作。
此外,请务必仔细检查您的包名称,即 com.example.yourAwesomeApp123
,这是让整个系统知道在按下动态链接时要打开哪个应用程序的原因。
关于firebase - flutter : Dynamic Link not launching the app,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66839446/