升级器

当应用商店中有新版本时,用于提示用户升级的 Flutter 包。

当应用商店有新版本可用时,会显示一个简单的警报提示小部件或卡片。如今,现代应用商店很少需要说服用户升级,因为大多数用户已经在使用自动升级功能。但是,有时应用程序需要比平时更快地更新,而催促用户升级可以鼓励他们更快地升级。此外,随着Flutter未来支持的不仅仅是Android和iOS应用商店,其他应用商店的用户更有可能需要被催促升级。

该UI有两种形式:警报或卡片。UpgradeAlert类用于显示弹出警报提示,UpgradeCard类用于显示内联Material Design卡片。

升级器包中显示的文本已本地化为英语和西班牙语,并支持自定义。

警报示例

只需将您的body widget包装在UpgradeAlert widget中,它将处理其余部分。

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

void main() => runApp(MyApp());

class MyApp extends StatelessWidget {
  MyApp({
    Key key,
  }) : super(key: key);

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Upgrader Example',
      home: Scaffold(
          appBar: AppBar(
            title: Text('Upgrader Example'),
          ),
          body: UpgradeAlert(
            child: Center(child: Text('Checking...')),
          )
      ),
    );
  }
}

警报截图

example1

卡片示例

只需在您的build方法中返回一个UpgradeCard widget,就会显示一个Material Design卡片
当检测到更新时。当未检测到更新时,该widget的宽度和高度将为0.0。

return Container(
        margin: EdgeInsets.fromLTRB(12.0, 0.0, 12.0, 0.0),
        child: UpgradeCard());

卡片截图

example2

自定义

可以通过设置UpgradeAlert widget构造函数中的参数来定制UpgradeAlert widget。
UpgradeAlert widget。

  • appcastConfig: appcast配置,默认为null
  • client: 可以替换为模拟测试的HTTP客户端,默认为null
  • daysUntilAlertAgain: 再次提醒用户的天数,默认为3
  • debugDisplayAlways: 始终强制显示升级,默认为false
  • debugDisplayOnce: 至少显示一次升级,默认为false
  • debugLogging: 显示日志记录语句,默认为false
  • messages: 可选的本地化消息,用于在升级器中显示
  • onIgnore: 点击忽略按钮时调用,默认为null
  • onLater: 点击稍后按钮时调用,默认为null
  • onUpdate: 点击更新按钮时调用,默认为null
  • showIgnore: 隐藏或显示对话框中的忽略按钮,默认为true
  • showLater: 隐藏或显示对话框中的稍后按钮,默认为true
  • canDismissDialog: 点击警报对话框外部是否可以关闭警报对话框,默认为false(警报卡片不使用)
  • countryCode: 将覆盖系统语言环境的国家代码,默认为null(仅限iOS)
  • minAppVersion: 此应用支持的最低应用版本。此应用的早期版本将被强制更新到当前版本。默认为null

限制

这些widget适用于Android和iOS。在iOS上运行时,App Store将提供
最新的应用程序版本,并在适当的时候显示提示。

在Android上,此widget
不做任何事情,因为无法轻松查询Google Play商店的应用程序元数据。
没有元数据,widget就无法将应用程序版本与最新的Play商店版本进行比较。
它不会破坏widget树,并且可以
包含在Android中而没有任何问题。

现在有一个appcast可用于Android和iOS,以远程配置
最新的应用程序版本。

Appcast

这个Flutter包中的Appcast类被Upgrader widgets使用
从appcast下载应用程序详细信息,
基于Andy Matuschak的Sparkle框架。
您可以在此处阅读Sparkle文档
https://sparkle-project.org/documentation/publishing/.

Appcast是一个RSS feed,其中有一个频道,包含一系列描述
一个应用程序版本的项。Appcast将描述每个应用程序版本,并将提供最新的应用程序
版本给Upgrader,指示何时推荐升级。

Appcast必须托管在每个人都可以访问该应用程序的服务器上。Appcast
XML文件可以在发布过程中自动生成,或者在应用程序商店中有新版本后手动更新。
已在应用程序商店中提供。

Appcast类可以独立使用,也可以作为Upgrader的一部分使用。

Appcast示例

final appcast = Appcast();
final items = await appcast.parseAppcastItemsFromUri('https://raw.githubusercontent.com/larryaasen/upgrader/master/test/testappcast.xml');
final bestItem = appcast.bestItem();

Appcast示例文件

<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:sparkle="http://www.andymatuschak.org/xml-namespaces/sparkle">
    <channel>
        <title>Debt Now App - Appcast</title>
        <item>
            <title>Version 1.15.0</title>
            <description>desc</description>
            <pubDate>Sun, 30 Dec 2018 12:00:00 +0000</pubDate>
            <enclosure url="https://play.google.com/store/apps/details?id=com.moonwink.treasury" sparkle:version="1.15.0" sparkle:os="android" />
        </item>
    </channel>
</rss>

Android和iOS组合示例

@override
Widget build(BuildContext context) {
  // On Android, setup the Appcast.
  // On iOS, the default behavior will be to use the App Store version of
  // the app, so update the Bundle Identifier in example/ios/Runner with a
  // valid identifier already in the App Store.
  final appcastURL = 'https://www.mydomain.com/myappcast.xml';
  final cfg = AppcastConfiguration(url: appcastURL, supportedOS: ['android']);

  return MaterialApp(
    title: 'Upgrader Example',
    home: Scaffold(
        appBar: AppBar(
          title: Text('Upgrader Example'),
        ),
        body: UpgradeAlert(
          appcastConfig: cfg,
          debugLogging: true,
          child: Center(child: Text('Checking...')),
        )),
  );
}

自定义显示

升级器中显示的字符串可以通过扩展UpgraderMessages类来定制,
以提供自定义值。

例如,要将忽略按钮替换为自定义值,首先创建一个新的
类,该类扩展UpgraderMessages,并覆盖buttonTitleIgnore函数。然后,
在调用UpgradeAlert(或UpgradeCard)时,添加messages参数,并实例
化您的扩展类。这是一个例子

class MyUpgraderMessages extends UpgraderMessages {
  @override
  String get buttonTitleIgnore => 'My Ignore';
}

UpgradeAlert(messages: MyUpgraderMessages());

语言本地化

升级器中显示的字符串已经为多种语言进行了本地化。未来将支持新语言,
通过小的更新。

支持的语言

  • 英语 (en)
  • 阿拉伯语 (ar)
  • 法语 (fr)
  • 葡萄牙语 (pt)
  • 西班牙语 (es)
  • 波兰语 (pl)

可以通过扩展UpgraderMessages类,为升级器包提供额外的语言,
以提供自定义值。

在您的代码中。例如,要添加西班牙语(es)(已提供),首先创建一个新
类,该类扩展UpgraderMessages,并覆盖message函数。然后,
为每个消息添加一个字符串。最后,在调用UpgradeAlert(或UpgradeCard)时,添加messages参数,并实例
化您的扩展类。这是一个例子

class MySpanishMessages extends UpgraderMessages {
  /// Override the message function to provide custom language localization.
  @override
  String message(UpgraderMessage messageKey) {
    if (languageCode == 'es') {
      switch (messageKey) {
        case UpgraderMessage.body:
          return 'es A new version of {{appName}} is available!';
        case UpgraderMessage.buttonTitleIgnore:
          return 'es Ignore';
        case UpgraderMessage.buttonTitleLater:
          return 'es Later';
        case UpgraderMessage.buttonTitleUpdate:
          return 'es Update Now';
        case UpgraderMessage.prompt:
          return 'es Want to update?';
        case UpgraderMessage.title:
          return 'es Update App?';
      }
    }
    // Messages that are not provided above can still use the default values.
    return super.message(messageKey);
  }
}

UpgradeAlert(messages: MySpanishMessages());

化。您甚至可以强制升级包使用特定的语言,而不是
设备上的系统语言。只需在显示警报或卡片时,将语言代码传递给UpgraderMessages的实例。
这是一个例子

UpgradeAlert(messages: UpgraderMessages(code: 'es'));

iTunes搜索API

此Flutter包中有一个类,被升级器widgets用于从
下载应用程序详细信息
iTunes搜索API.
ITunesSearchAPI类可以独立使用,用于查询iTunes的应用程序详细信息。

ITunesSearchAPI示例

final iTunes = ITunesSearchAPI();
final resultsFuture = iTunes.lookupByBundleId('com.google.Maps');
resultsFuture.then((results) {
    print('results: $results');
});

结果

results--1-

命令行应用程序

有一个命令行应用程序用于显示iTunes搜索的结果。代码位于
bin/itunes_lookup.dart,可以从命令行运行,如下所示

$ dart itunes_lookup.dart bundleid=com.google.Maps

结果

upgrader: download: https://itunes.apple.com/lookup?bundleId=com.google.Maps
upgrader: response statusCode: 200
itunes_lookup bundleId: com.google.Maps
itunes_lookup trackViewUrl: https://apps.apple.com/us/app/google-maps-transit-food/id585027354?uo=4
itunes_lookup version: 5.31
itunes_lookup all results:
{resultCount: 1, results: 
...

GitHub

https://github.com/larryaasen/upgrader