66 lines
1.9 KiB
Dart
66 lines
1.9 KiB
Dart
|
|
import 'package:firebase_dynamic_links/firebase_dynamic_links.dart';
|
||
|
|
import 'package:flutter/services.dart';
|
||
|
|
import 'package:guru_app/guru_app.dart';
|
||
|
|
import 'package:guru_navigator/guru_navigator.dart';
|
||
|
|
import 'package:guru_utils/log/log.dart';
|
||
|
|
import 'package:guru_utils/router/router.dart';
|
||
|
|
import 'package:guru_utils/uri/uri_utils.dart';
|
||
|
|
|
||
|
|
/// Created by Haoyi on 5/20/21
|
||
|
|
|
||
|
|
class DxLinkManager {
|
||
|
|
static final DxLinkManager instance = DxLinkManager._();
|
||
|
|
|
||
|
|
DxLinkManager._();
|
||
|
|
|
||
|
|
void initDynamicLinks() async {
|
||
|
|
FirebaseDynamicLinks.instance.onLink.listen((PendingDynamicLinkData? dynamicLink) async {
|
||
|
|
final Uri? deepLink = dynamicLink?.link;
|
||
|
|
Log.d("### onDynamicLink $deepLink");
|
||
|
|
if (deepLink != null) {
|
||
|
|
_openLink(deepLink);
|
||
|
|
}
|
||
|
|
}, onError: (e) async {
|
||
|
|
Log.w('onLinkError ${e.message} ${e.stacktrace}', error: e);
|
||
|
|
});
|
||
|
|
|
||
|
|
final PendingDynamicLinkData? data =
|
||
|
|
await FirebaseDynamicLinks.instance.getInitialLink().catchError((error, stacktrace) {
|
||
|
|
Log.d("getInitialLink error:$error $stacktrace");
|
||
|
|
});
|
||
|
|
final Uri? deepLink = data?.link;
|
||
|
|
Log.d("initDynamicLinks: $deepLink");
|
||
|
|
if (deepLink != null) {
|
||
|
|
Future.delayed(const Duration(seconds: 2), () => _openLink(deepLink));
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
Future<dynamic> _handleDeeplink(MethodCall call) async {
|
||
|
|
Log.d("call.method: ${call.method} arguments:${call.arguments}");
|
||
|
|
switch (call.method) {
|
||
|
|
case "navigate":
|
||
|
|
final uri = Uri.parse(call.arguments["uri"]);
|
||
|
|
if ((uri.authority.isNotEmpty != true) ||
|
||
|
|
uri.toString().contains(GuruApp.instance.appSpec.details.authority)) {
|
||
|
|
_openLink(uri);
|
||
|
|
} else {
|
||
|
|
UriUtils.launchURL(uri);
|
||
|
|
}
|
||
|
|
}
|
||
|
|
return true;
|
||
|
|
}
|
||
|
|
|
||
|
|
void initDeeplink() async {
|
||
|
|
GuruNavigator.init(_handleDeeplink);
|
||
|
|
}
|
||
|
|
|
||
|
|
void init() async {
|
||
|
|
initDeeplink();
|
||
|
|
initDynamicLinks();
|
||
|
|
}
|
||
|
|
|
||
|
|
void _openLink(Uri uri) {
|
||
|
|
RouteCenter.instance.dispatchUri(uri);
|
||
|
|
}
|
||
|
|
}
|