Flutter后台访问插件backdoor_flutter的使用

Flutter后台访问插件backdoor_flutter的使用

Flutter Backdoor Package

此插件添加了一个后门功能,用于检查自由职业或其他项目的支付状态。

需求

一个托管的JSON文件,格式如下:

https://raw.githubusercontent.com/gktirkha/backdoor_flutter/refs/heads/master/assets/example-hosted.json

单个JSON文件可以处理多个项目。

JSON参数

  1. apps: 包含所有应用对象。如果要添加新应用,只需添加即可。

    在每个应用中可以添加以下参数:

    • status: 必填参数,可以有以下值:

      • PAID: 支付未完成
      • UNPAID: 支付已完成
      • ALLOW_LIMITED_LAUNCHES: 使用最大启动机制
      • ON_TRIAL: 使用到期日期机制
    • target_version: 检查与代码中配置的版本是否匹配(应大于0)

    • should_check_after_paid: 即使状态为已支付,也强制检查在线JSON(一旦设置为false,具有缓存数据的设备将不会有任何影响)

    • check_during_trial: 在试用期内强制检查在线JSON(一旦设置为false,具有缓存数据的设备将不会有任何影响)

    • expire_date: ON_TRIAL机制的过期日期

    • warning_date:ON_TRIAL机制中发出警告

    • max_launch: 超过多少次启动后应检查在线JSON的ALLOW_LIMITED_LAUNCHES机制

    • strict_max_launch: 如果设置为false(默认在flutter代码中为true),则启动计数将在flutter代码中重置。如果设置为true,超过限制后将调用OnLimitedLaunchExceeded,否则启动计数将重置。

    • developer_details: 可选的json对象(Map)

    • additional_fields: 可以发送任何内容

流程图

  1. 图像文件
  2. draw.io

使用方法

请参阅dart文档版本:Dart Doc

步骤1:添加依赖

dependencies:
    backdoor_flutter: ^latest_version

步骤2:在代码中使用

import 'dart:developer';

import 'package:backdoor_flutter/backdoor_flutter.dart';
import 'package:flutter/material.dart';

void main() async {
  WidgetsFlutterBinding.ensureInitialized();

  await BackdoorFlutter.init(
    jsonUrl:
        "https://raw.githubusercontent.com/gktirkha/backdoor_flutter/beta/assets/example-hosted.json",
    appName: "trial_expire",
    version: 1,
  );
  runApp(const MainApp());
}

class MainApp extends StatelessWidget {
  const MainApp({super.key});

  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        body: Center(
          child: ElevatedButton(
            onPressed: () {
              BackdoorFlutter.checkStatus(
                onException: (exception) {
                  log(exception.toString(), name: "onException");
                },
                onUnhandled: (reason, backdoorPaymentModel) {
                  log(reason.name, name: "onUnhandled");
                  log(backdoorPaymentModel.toString(), name: "onUnhandled");
                },
                onAppNotFound: () {
                  log("onAppNotFound", name: "onAppNotFound");
                },
                onLimitedLaunch: (backdoorPaymentModel, currentCount) {
                  log(currentCount.toString(), name: "onLimitedLaunch");
                  log(backdoorPaymentModel.toString(), name: "onLimitedLaunch");
                },
                onLimitedLaunchExceeded: (backdoorPaymentModel) {
                  log(backdoorPaymentModel.toString(),
                      name: "onLimitedLaunchExceeded");
                },
                onPaid: (backdoorPaymentModel) {
                  log(backdoorPaymentModel.toString(), name: "onPaid");
                },
                onTargetVersionMisMatch:
                    (backdoorPaymentModel, targetVersion, configuredVersion) {
                  log(backdoorPaymentModel.toString(),
                      name: "onTargetVersionMisMatch");
                  log(targetVersion.toString(),
                      name: "onTargetVersionMisMatch Target Version");
                  log(configuredVersion.toString(),
                      name: "onTargetVersionMisMatch Configured Version");
                },
                onTrial: (backdoorPaymentModel, expiryDate, warningDate) {
                  log(backdoorPaymentModel.toString(), name: "onTrial");
                  log(expiryDate.toString(), name: "onTrial expiryDate");
                  log(warningDate.toString(), name: "onTrial warningDate");
                },
                onTrialEnded: (backdoorPaymentModel, expiryDate) {
                  log(backdoorPaymentModel.toString(), name: "onTrialEnded");
                  log(expiryDate.toString(), name: "onTrialEnded expiryDate");
                },
                onTrialWarning:
                    (backdoorPaymentModel, expiryDate, warningDate) {
                  log(backdoorPaymentModel.toString(), name: "onTrialWarning");
                  log(expiryDate.toString(), name: "onTrialWarning expiryDate");
                  log(warningDate.toString(),
                      name: "onTrialWarning warningDate");
                },
                onUnPaid: (backdoorPaymentModel) {
                  log(backdoorPaymentModel.toString(), name: "onUnPaid");
                },
              );
            },
            child: const Text("Check App"),
          ),
        ),
      ),
    );
  }
}

更多关于Flutter后台访问插件backdoor_flutter的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter后台访问插件backdoor_flutter的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


backdoor_flutter 是一个 Flutter 插件,用于在开发过程中提供一些调试和测试功能。它允许开发者通过一个 HTTP 服务器在运行时访问和修改应用程序的内部状态。这对于调试、性能测试和自动化测试非常有用。

以下是如何使用 backdoor_flutter 插件的基本步骤:

1. 添加依赖

首先,你需要在 pubspec.yaml 文件中添加 backdoor_flutter 插件的依赖:

dependencies:
  flutter:
    sdk: flutter
  backdoor_flutter: ^0.1.0  # 请检查最新版本

然后运行 flutter pub get 来获取依赖。

2. 导入插件

在你的 Dart 代码中导入 backdoor_flutter 插件:

import 'package:backdoor_flutter/backdoor_flutter.dart';

3. 初始化 Backdoor

在你的应用程序启动时初始化 Backdoor。通常,你可以在 main.dart 文件中进行操作:

void main() async {
  WidgetsFlutterBinding.ensureInitialized();
  
  // 初始化 Backdoor
  await Backdoor.initialize(
    port: 8080,  // 设置服务器端口
    enableLogging: true,  // 启用日志记录
  );
  
  runApp(MyApp());
}

4. 暴露方法或变量

你可以使用 Backdoor.expose 方法来暴露应用程序中的方法或变量,以便通过 HTTP 请求进行访问或修改。

class MyApp extends StatelessWidget {
  int counter = 0;

  MyApp() {
    // 暴露一个整数变量
    Backdoor.expose('counter', () => counter, (value) => counter = value);

    // 暴露一个方法
    Backdoor.expose('increment', () {
      counter++;
      return 'Counter incremented to $counter';
    });
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Backdoor Example',
      home: Scaffold(
        appBar: AppBar(
          title: Text('Backdoor Example'),
        ),
        body: Center(
          child: Text('Counter: $counter'),
        ),
      ),
    );
  }
}
回到顶部