44 lines
1.2 KiB
Dart
44 lines
1.2 KiB
Dart
import 'dart:convert';
|
|
|
|
import 'package:go_router/go_router.dart';
|
|
|
|
import 'app_router.dart';
|
|
|
|
/// 统一将 Scheme、Universal Link 和推送 payload 收敛为应用内路由。
|
|
abstract final class DeepLinkService {
|
|
static void handle(String raw) {
|
|
final target = _route(raw);
|
|
if (target != null) rootNavigatorKey.currentContext?.go(target);
|
|
}
|
|
|
|
static String? _route(String raw) {
|
|
var source = raw.trim();
|
|
try {
|
|
final json = jsonDecode(source);
|
|
if (json is Map) {
|
|
source = '${json['deep_link'] ?? json['url'] ?? json['link'] ?? ''}';
|
|
}
|
|
} catch (_) {}
|
|
final uri = Uri.tryParse(source);
|
|
if (uri == null) return null;
|
|
if (uri.scheme == 'jinzhi') {
|
|
final path = uri.path.isEmpty ? '/assets' : uri.path;
|
|
return _allowed(path)
|
|
? '$path${uri.hasQuery ? '?${uri.query}' : ''}'
|
|
: null;
|
|
}
|
|
if ((uri.scheme == 'https' || uri.scheme == 'http') && _allowed(uri.path)) {
|
|
return '${uri.path}${uri.hasQuery ? '?${uri.query}' : ''}';
|
|
}
|
|
return null;
|
|
}
|
|
|
|
static bool _allowed(String path) => const {
|
|
'/assets',
|
|
'/market',
|
|
'/news',
|
|
'/profile',
|
|
'/settings',
|
|
}.contains(path);
|
|
}
|