Flutter AppCenter Bundle 更新至空安全插件flutter_appcenter_bundle_updated_to_null_safety的使用

发布于 1周前 作者 h691938207 来自 Flutter

Flutter AppCenter Bundle 更新至空安全插件flutter_appcenter_bundle_updated_to_null_safety的使用

简介

此插件目前集成了AppCenter分析、崩溃报告和分发功能。

开始使用

要开始使用,请访问AppCenter并注册您的应用程序。

对于详细的AppCenter API参考,请访问AppCenter文档

构建

AppCenter分发在发布到Google Play时存在一个问题。为了解决这个问题,您可以使用以下命令:

flutter build --flavor googlePlay

来构建Google Play版本,并使用:

flutter build --flavor appCenter

来构建AppCenter版本。

默认情况下,flutter build apk 命令会在 build/app/outputs/flutter-apk 目录下生成两个版本。您需要在 android/app/build.gradle 文件中添加以下部分:

android {
  ...

  flavorDimensions "distribute"
  productFlavors {
      appCenter {
          dimension "distribute"
      }

      googlePlay {
          dimension "distribute"
      }
  }

  // 这可能是必需的,详见 https://github.com/flutter/flutter/issues/58247
  lintOptions {
      disable 'InvalidPackage'
      checkReleaseBuilds false
  }
}

如果您已经有风味设置并希望合并,请检查示例项目。请注意,风味维度是正交的。您可能只需要重用分发风味以获得最佳构建性能。有关详细信息,请参阅这篇文章

在解决本地构建问题时,请先尝试运行示例项目。

使用

基本用法

import 'package:flutter_appcenter_bundle_updated_to_null_safety/flutter_appcenter_bundle_updated_to_null_safety.dart';

await AppCenter.startAsync(
    appSecretAndroid: '******',
    appSecretIOS: '******',
    enableAnalytics: true, // 默认为true
    enableCrashes: true, // 默认为true
    enableDistribute: true, // 默认为false
    usePrivateDistributeTrack: false, // 默认为false
    disableAutomaticCheckForUpdate: false, // 默认为false
  );

AppCenter.trackEventAsync('my event', <String, String> {
  'prop1': 'prop1',
  'prop2': 'prop2',
});

动态启用或禁用功能

await AppCenter.configureAnalyticsAsync(enabled: true);

await AppCenter.configureCrashesAsync(enabled: true);

await AppCenter.configureDistributeAsync(enabled: true);

await AppCenter.configureDistributeDebugAsync(enabled: true); // 仅限Android

await AppCenter.checkForUpdateAsync(); // 手动检查更新

故障排除

iOS: [!] CocoaPods找不到兼容的版本

手动删除 podfile.lock 并重新构建,这是在升级iOS原生依赖项时常见的问题。

Android构建问题

始终检查示例项目是否可以构建。如果不能,请报告问题。如果可以构建,请检查Gradle设置。

检查点包括:

  • Gradle版本(在 gradle-wrapper.properties 中)
  • Kotlin版本(在 build.gradle 中)
  • compileSdkVersion(在 build.gradle 中)
  • com.android.tools.build:gradle 版本(在 build.gradle 中)
  • lintOptions(在示例中)查看 issue
Execution failed for task ':app:lintVitalAppCenterRelease'
  • build.gradle 脚本(在示例中)
  • settings.gradle(在示例中)

jcenter退役

由于jcenter将于2021年5月1日退役,请替换为以下配置:

repositories {
     google()
     // jcenter()
     mavenCentral()
     gradlePluginPortal()
 }

示例代码

以下是完整的示例代码,展示如何使用插件。

import 'package:flutter/material.dart';

import 'package:package_info_plus/package_info_plus.dart';
import 'package:flutter_appcenter_bundle_updated_to_null_safety/flutter_appcenter_bundle_updated_to_null_safety.dart';

void main() async {
  WidgetsFlutterBinding.ensureInitialized();
  await AppCenter.startAsync(
    appSecretAndroid: '49361c2e-b788-4bc2-a33d-838b04b3e06b',
    appSecretIOS: '2da3d93f-6b3f-48f9-920f-2d63ae3cd25a',
    enableDistribute: false,
  );
  await AppCenter.configureDistributeDebugAsync(enabled: false);

  runApp(MyApp());
}

class MyApp extends StatefulWidget {
  [@override](/user/override)
  _MyAppState createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  [@override](/user/override)
  void initState() {
    super.initState();
    AppCenter.trackEventAsync('_MyAppState.initState');
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: const Text('插件示例应用'),
        ),
        body: Container(
          padding: EdgeInsets.all(20),
          child: Column(
            mainAxisAlignment: MainAxisAlignment.center,
            crossAxisAlignment: CrossAxisAlignment.start,
            children: [
              const PackageInfoContent(),
              const SizedBox(height: 8.0),
              FutureBuilder(
                future: AppCenter.isCrashesEnabledAsync(),
                builder: (_, AsyncSnapshot<bool?> snapshot) {
                  if (snapshot.hasData) {
                    final isCrashesEnabled = snapshot.data!;

                    return Text('IsCrashesEnabled: $isCrashesEnabled');
                  }

                  return const CircularProgressIndicator.adaptive();
                },
              ),
              const SizedBox(height: 8.0),
              FutureBuilder(
                future: AppCenter.isAnalyticsEnabledAsync(),
                builder: (_, AsyncSnapshot<bool?> snapshot) {
                  if (snapshot.hasData) {
                    final isAnalyticsEnabled = snapshot.data!;

                    return Text('IsAnalyticsEnabled: $isAnalyticsEnabled');
                  }

                  return const CircularProgressIndicator.adaptive();
                },
              ),
              const SizedBox(height: 8.0),
              FutureBuilder(
                future: AppCenter.isDistributeEnabledAsync(),
                builder: (_, AsyncSnapshot<bool?> snapshot) {
                  if (snapshot.hasData) {
                    final isDistributeEnabled = snapshot.data!;

                    return Text('IsDistributeEnabled: $isDistributeEnabled');
                  }

                  return const CircularProgressIndicator.adaptive();
                },
              ),
            ],
          ),
        ),
      ),
    );
  }
}

class PackageInfoContent extends StatelessWidget {
  const PackageInfoContent();

  [@override](/user/override)
  Widget build(BuildContext context) {
    return FutureBuilder(
      future: PackageInfo.fromPlatform(),
      builder: (_, AsyncSnapshot<PackageInfo> snapshot) {
        if (snapshot.hasData) {
          final packageInfo = snapshot.data!;

          return Column(
            crossAxisAlignment: CrossAxisAlignment.start,
            children: [
              Text('应用名称:\n${packageInfo.appName}'),
              const SizedBox(height: 8.0),
              Text('包名:\n${packageInfo.packageName}'),
              const SizedBox(height: 8.0),
              Text('版本号:\n${packageInfo.version}'),
              const SizedBox(height: 8.0),
              Text('构建号:\n${packageInfo.buildNumber}'),
            ],
          );
        }

        return const CircularProgressIndicator.adaptive();
      },
    );
  }
}

更多关于Flutter AppCenter Bundle 更新至空安全插件flutter_appcenter_bundle_updated_to_null_safety的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter AppCenter Bundle 更新至空安全插件flutter_appcenter_bundle_updated_to_null_safety的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,下面是一个关于如何使用已迁移到空安全(null safety)的 flutter_appcenter_bundle 插件的示例代码。这个插件通常用于集成 Microsoft App Center 到 Flutter 应用中,以便进行应用分发、崩溃报告和数据分析。

首先,确保你已经在 pubspec.yaml 文件中添加了 flutter_appcenter_bundle 依赖,并且已经运行了 flutter pub get

dependencies:
  flutter:
    sdk: flutter
  flutter_appcenter_bundle: ^最新版本号  # 请替换为实际的最新版本号

接下来,在你的 Flutter 应用中,你可以按照以下步骤进行配置和使用:

  1. 初始化 App Center

在你的应用的入口文件(通常是 main.dart)中,初始化 App Center。你需要在调用任何 App Center 服务之前完成这一步。

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

void main() {
  // 初始化 App Center
  AppCenter.configure(
    appSecret: '你的AppSecret',  // 请替换为你的实际AppSecret
    services: [
      Crashes.class,
      Analytics.class,
      // 如果需要其他服务,可以在这里添加,例如:Distribute.class
    ],
  );

  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter AppCenter Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: MyHomePage(),
    );
  }
}

class MyHomePage extends StatefulWidget {
  @override
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Flutter AppCenter Demo'),
      ),
      body: Center(
        child: Text('Check console for App Center logs'),
      ),
      floatingActionButton: FloatingActionButton(
        onPressed: () {
          // 模拟一个崩溃
          Crashes.hasCrashedInLastSession().then((bool hasCrashed) {
            if (!hasCrashed) {
              throw Exception('This is a simulated crash');
            }
          });
        },
        tooltip: 'Crash',
        child: Icon(Icons.bug_report),
      ),
    );
  }
}
  1. 使用 Analytics 服务

你可以在应用的任何地方使用 Analytics 服务来记录自定义事件。

// 记录一个自定义事件
Analytics.trackEvent(
  name: 'user_action',
  properties: <String, dynamic>{
    'action': 'button_clicked',
    'button_name': 'example_button',
  },
);
  1. 处理 Crashes

在上面的示例中,我们已经在 FloatingActionButton 的 onPressed 方法中模拟了一个崩溃。在实际应用中,你可以根据需要记录和处理崩溃。

  1. 分发更新(可选)

如果你需要集成分发功能,可以使用 Distribute 服务。注意,这部分功能需要额外的配置,并且可能涉及到从 App Center 控制台上传新的应用版本。

// 检查是否有可用的更新
Distribute.checkForUpdate().then((bool updateAvailable) {
  if (updateAvailable) {
    // 提示用户更新应用
    Distribute.releaseUpdate().then((bool updateInstalled) {
      if (updateInstalled) {
        // 更新已安装,可以提示用户重启应用
      }
    });
  }
});

请确保你已经正确设置了 App Center 的相关配置,包括在 App Center 控制台中为你的应用添加了正确的密钥和服务。

这个示例展示了如何初始化 App Center、记录自定义事件、模拟崩溃以及检查应用更新。根据你的实际需求,你可以进一步扩展和自定义这些功能。

回到顶部