larryaasen / upgrader Goto Github PK
View Code? Open in Web Editor NEWA Flutter package for prompting users to upgrade when there is a newer version of the app in the store.
License: MIT License
A Flutter package for prompting users to upgrade when there is a newer version of the app in the store.
License: MIT License
According to the Readme:
On Android, this widget does nothing as there is no easy way to query the Google Play Store for metadata about an app. Without the metadata, the widget cannot compare the app version with the latest Play Store version. It will not disrupt the widget tree and can be included in an Android without any issues.
However, in my application (not using an Appcast) the upgrader popup was shown to Android users, redirecting them to the AppStore. Looking at the code, it seems like the check has been commented:
// // If this platform is not iOS, skip the iTunes lookup
// if (!Platform.isIOS) {
// return false;
// }
Hi,
Is this requirement necessary for this package? Just wondering because the version in master and dev channel at the moment is at 1.20.0 now.
Hi @larryaasen ,
Is this package ready for AndroidX? If not, do you have a plan to do so?
Thanks in advance.
I use the latest version from pub.dev: upgrader: ^0.10.1
Then I got this
How to solve it? Thank you
Running "flutter pub get" in BuangDuit...
The current Flutter SDK version is 1.13.6.
Because buangduit depends on upgrader >=0.10.1 which requires Flutter SDK version >=1.12.0 <1.13.0, version solving failed.
pub get failed (1; Because buangduit depends on upgrader >=0.10.1 which requires Flutter SDK version >=1.12.0 <1.13.0, version solving failed.)
exit code 1
Hi @larryaasen ,
In my app, before the MaterialApp, I have long initializing process, which including the user authentication as well. During the initializing process, there will be a loading screen display. After the initialization, MaterialApp will be called and home is routed to a Login page. In the Login page, it checks if user has been successfully authenticated (during initialization) so it would re-route to the App main page.
So my question is, where should I apply the UpgradeAlert?
Thanks in advance.
Hi, thank you for the great package!
Do I understand correctly that there is no way to make localization for the message with version number?
String message() {
return 'A new version of ${appName()} is available! Version ${currentAppStoreVersion()} is now available-you have ${currentInstalledVersion()}.';
}
(file upgrader.dart)
If not possible can you please make the property with this String for customization, please?
I can see my package, but installed and available version is not displaying.
Faced issues.
I'm getting this error in debug.
flutter version 1.20.4 channel stable
upgrader version 2.5.0
xml version 4.2.0
--on ios--
flutter: upgrader: build UpgradeAlert
flutter: upgrader: package info packageName: com.kolayyakit.KolayYakit
flutter: upgrader: package info version: 2.6
flutter: upgrader: countryCode: US
flutter: upgrader: build UpgradeAlert
[VERBOSE-2:ui_dart_state.cc(166)] Unhandled Exception: Invalid argument(s) (replacement): Must not be null
#0 _StringBase.replaceAll (dart:core-patch/string_patch.dart:637:30)
#1 Upgrader.message (package:upgrader/src/upgrader.dart:248:15)
#2 Upgrader.checkVersion. (package:upgrader/src/upgrader.dart:264:24)
#3 new Future.delayed. (dart:async/future.dart:325:39)
#4 _rootRun (dart:async/zone.dart:1182:47)
#5 _CustomZone.run (dart:async/zone.dart:1093:19)
#6 _CustomZone.runGuarded (dart:async/zone.dart:997:7)
#7 _CustomZone.bindCallbackGuarded. (dart:async/zone.dart:1037:23)
#8 _rootRun (dart:async/zone.dart:1190:13)
#9 _CustomZone.run (dart:async/zone.dart:1093:19)
#10 _CustomZone.bindCallback. (dart:async/zone.dart:1021:23)
#11 Timer._createTimer. (dart:async-patch/timer_patch.dart:18:15)
#12 _Timer._runTimers (dart:isolate-patch/timer_impl.dart:<…>
--on android--
I/flutter (13693): upgrader: build UpgradeAlert
I/flutter (13693): upgrader: build UpgradeAlert
I/flutter (13693): upgrader: package info packageName: com.ilerleyen.kolayyakit
I/flutter (13693): upgrader: package info version: 2.6.1
I/flutter (13693): upgrader: appcast is available for this platform
E/flutter (13693): [ERROR:flutter/lib/ui/ui_dart_state.cc(166)] Unhandled Exception: NoSuchMethodError: The method 'replaceAll' was called on null.
E/flutter (13693): Receiver: null
E/flutter (13693): Tried calling: replaceAll("{{appName}}", "Kolay Yakıt")
E/flutter (13693): #0 Object.noSuchMethod (dart:core-patch/object_patch.dart:51:5)
E/flutter (13693): #1 Upgrader.message (package:upgrader/src/upgrader.dart:248:15)
E/flutter (13693): #2 Upgrader.checkVersion. (package:upgrader/src/upgrader.dart:264:24)
E/flutter (13693): #3 new Future.delayed. (dart:async/future.dart:325:39)
E/flutter (13693): #4 _rootRun (dart:async/zone.dart:1182:47)
E/flutter (13693): #5 _CustomZone.run (dart:async/zone.dart:1093:19)
E/flutter (13693): #6 _CustomZone.runGuarded (dart:async/zone.dart:997:7)
E/flutter (13693): #7 _CustomZone.bindCallbackGuarded. (dart:async/zone.dart:1037:23)
E/flutter (13693): #8 _rootRun (dart:async/zone.dart:1190:13)
E/flutter (13693): #9 _CustomZone.run (dart:async/zone.dart:1093:19)
E/flutter (13693): #10 _CustomZone.bindCallback. (dart:async/zone.dart:1021:23)
E/flutter (13693): #11 Timer._createTimer. (dart:async-patch/timer_patch.dart:18:15)
E/flutter (13693): #12 _Timer._runTimers (dart:isolate-patch/timer_impl.dart:397:19)
E/flutter (13693): #13 _Timer._handleMessage (dart:isolate-patch/timer_impl.dart:428:5)
E/flutter (13693): #14 _RawReceivePortImpl._handleMessage (dart:isolate-patch/isolate_patch.dart:168:12)
E/flutter (13693):
I/flutter (13693): "<" expected at 1:1
I/flutter (13693): upgrader: appcast item count: 0
Hi, how can I solve this error when implementing the plugin, I did tests and the string that cannot be parse is samsung/hero2ltexx/hero2lte:7.0/NRD90M/G935FXXU2DRB6:user/release-keys
I/flutter (20116): Version: samsung/hero2ltexx/hero2lte:7.0/NRD90M/G935FXXU2DRB6:user/release-keys E/flutter (20116): [ERROR:flutter/lib/ui/ui_dart_state.cc(148)] Unhandled Exception: FormatException: Not a properly formatted version stringE/flutter (20116): #0 Version.parse (package:version/version.dart:134)
After flutter upgrade to 1.20 I get compile error
Launching lib/main.dart on AOSP on IA Emulator in debug mode...
Running Gradle task 'assembleDebug'...
../../flutter/.pub-cache/hosted/pub.dartlang.org/upgrader-2.5.0/lib/src/appcast.dart:86:36: Error: Method not found: 'XmlDocument.parse'.
final document = XmlDocument.parse(xmlString);
^^^^^
It can be fixed by changing
final document = XmlDocument.parse(xmlString);
to
final document = parse(xmlString);
in
/.pub-cache/hosted/pub.dartlang.org/upgrader-2.5.0/lib/src/appcast.dart
But it not solution, because it package cash.
[✓] Flutter (Channel stable, 1.20.0, on Mac OS X 10.14.5 18F132, locale en-US)
[✓] Android toolchain - develop for Android devices (Android SDK version 29.0.3)
[✓] Xcode - develop for iOS and macOS (Xcode 11.3)
[✓] Android Studio (version 3.6)
[✓] IntelliJ IDEA Ultimate Edition (version 2019.3.2)
[✓] VS Code (version 1.42.1)
[✓] Connected device (2 available)
I am looking for language translations of message strings for this upgrader package. I already have English and Spanish languages. Looking for many more including Chinese, Japanese, Korean, Russian, French, German, Italian. Please place a comment in this issue with the six translated strings for the language of your choice.
Use this empty form below to get started. Copy this and fill it out:
Language name:
language code:
body:
ignore button:
later button:
update button:
prompt:
release notes:
title:
Note: The body string supports mustache style template variables such as {{appName}}.
Language name: English
language code: en
body: A new version of {{appName}} is available! Version {{currentAppStoreVersion}} is now available-you have {{currentInstalledVersion}}.
ignore button: IGNORE
later button: LATER
update button: UPDATE NOW
prompt: Would you like to update it now?
release notes: Release Notes
title: Update App?
Language name: Spanish
language code: es
body: ¡Una nueva versión de {{appName}} está disponible! La versión {{currentAppStoreVersion}} ya está disponible, usted tiene {{currentInstalledVersion}}.
ignore button: IGNORAR
later button: MÁS TARDE
update button: ACTUALIZAR
prompt: ¿Le gustaría actualizar ahora?
release notes: Notas De Lanzamiento
title: ¿Actualizar la aplicación?
I used updateAlert as the way the example uses. However, when I download the app version 1.01 from App Store, it still asks me to update even though I have the newest version. Why did that happen?
When i choose update now. The package only redirect to app store. But my device is using android.
I used UpgradeAlert in my app. In the UpgradeAlert, my app name is shown null. How can I resolve this issue?
void onUserUpdated(BuildContext context, bool shouldPop) {
if (debugLogging) {
print('upgrader: button tapped: $buttonTitleUpdate');
}
// If this callback has been provided, call it.
var doProcess = true;
if (this.onUpdate != null) {
doProcess = onUpdate();
}
if (doProcess) {
_sendUserToAppStore();
}
if (shouldPop) {
_pop(context);
}
}
Mocking the rss feed for this package isn't currently possible without alteration to the upgrader.dart
file. Although you can override the client on the Upgrader
class, a new instance of the Appcast
class is created inside of the _updateVersionInfo
method. Since the Upgrader
s client
isn't passed into the Appcast
constructor, a new Client
is created and the mocked client is not used.
Alter line 155 of the upgrader.dart
from this:
final appcast = Appcast();
to this:
final appcast = Appcast(client: client);
I assumed that when an update is available, it redirects to a link where the user can download the application. But can Upgrader detect if the app finishes downloading and can it be installed via some function in the Upgrader package?
Any lookup (by id, by app bundle id) returns null if the app isn't available on the US App Store.
Please, fix or suggest a workaround.
can you add parameter for dismiss on press back button?
canDismissDialog is parameter for tap outside alert dialog but if use android we also can dismiss dialog with back button
Hi @larryaasen ,
May I know what is the different between ignore and later button?
Can we hide one of it?
Thanks in advance.
I'm using the latest version and have integrated UpgradeAlert to my home screen:
UpgradeAlert(
debugLogging: true,
minAppVersion: leastIosVersion,
child: _buildBody(),
)
when the app version is lower than minAppVersion, the alert is shown and the update is forced.
when the app is higher than minAppVersion, despite I see an update is available in logs, the alert is not shown:
flutter: upgrader: package info packageName: com.xxx.app
flutter: upgrader: package info version: 0.00.30
flutter: upgrader: countryCode: MY
flutter: upgrader: appStoreVersion: 0.00.50
flutter: upgrader: installedVersion: 0.00.30
flutter: upgrader: isUpdateAvailable: true
pub-cache/hosted/pub.flutter-io.cn/upgrader-0.11.1/lib/src/upgrade_alert.dart:388:46: Error: The getter 'headline6' isn't defined for the class 'TextTheme'.
add download and install apk in android
MESSAGE:#0 _StringBase.replaceAll (dart:core-patch/string_patch.dart:637)
#1 Upgrader.message (package:upgrader/src/upgrader.dart:248)
#2 Upgrader.checkVersion. (package:upgrader/src/upgrader.dart:264)
#3 new Future.delayed. (dart:async/future.dart:325)
#4 _rootRun (dart:async/zone.dart:1182)
#5 _CustomZone.run (dart:async/zone.dart:1093)
#6 _CustomZone.runGuarded (dart:async/zone.dart:997)
#7 _CustomZone.bindCallbackGuarded. (dart:async/zone.dart:1037)
#8 _rootRun (dart:async/zone.dart:1190)
#9 _CustomZone.run (dart:async/zone.dart:1093)
#10 _CustomZone.bindCallback. (dart:async/zone.dart:1021)
#11 SemanticsConfiguration._addArgumentlessAction. (package:flutter/src/semantics/semantics.dart:2847)
#12 _Timer._runTimers (dart:isolate-patch/timer_impl.dart:397)
#13 _Timer._handleMessage (dart:isolate-patch/timer_impl.dart:428)
#14 _RawReceivePortImpl._handleMessage (dart:isolate-patch/isolate_patch.dart:168)
I'm sorry, one small question
Does it work for Android without appcast? Will it display popup message if new version is published on Google Play?
I used this useful pub, and now i want to publish my app to the appstore,
is there any setting that i should do before publish
for example I think I should add notification to my app id in app store pannel
could you please guide me about this issue?
initState I call below code _checkForIOSUpdate() to see if iOS update available. Based on this result I show UpgradeAlert() or not.
(A) In Build Widget I run _checkUpdate = true ? UpgradeAlert() : new Container() so if no update user doesn't need to see UpgradeAlert() checking...
(B) initState I call _checkForIOSUpdate
/// CHECK FOR IOS UPDATE
Future _checkForIOSUpdate() async {
Upgrader().clearSavedSettings();
Upgrader().debugDisplayAlways = false;
Upgrader().debugDisplayOnce = false;
await Upgrader().initialize();
bool _isAvailable = Upgrader().isUpdateAvailable();
await Future.delayed(Duration(milliseconds: 250));
print('_isAvailable: $_isAvailable');
if (_isAvailable == true) {
setState(() {
_checkUpdate = true;
});
} else {
setState(() {
_checkUpdate = false;
});
}
}
when isUpdateAvailable() called at the first time app running,
_appStoreVersion & _installedVersion always null, so the dialog will not show,
in my case, i put UpgradeAlert as a child of scaffold in my Home view,.
when application run, and load the home view, i debug the _appStoreVersion & _installedVersion always null
but, when i switch to other page in my app, and back to Home, the _appStoreVersion & _installedVersion filled, and the Popup Alert show..
how to solve this ?
can to explain with an example with sample application? very confused to understand it for me.
Because app depends on upgrader >=0.10.1 which requires Flutter SDK version >=1.12.0 <1.13.0, version solving failed.
Add this your pubspec.yaml
dependency_overrides:
upgrader: ^0.10.4
By the way, many thanks for the nice work. 👍
Hi,
I am trying to use this package for my iOS app which is in App Store. But I am not sure where to start. Is the example file is enough? Or can you post more deatils now not use for iOS. Also I want to force user to update always. how to disable other 2 buttons? Thanks
Hello there!
I am new to this package and tried installing upgrader 2.4.0 following the tutorial, but got the following error after "Flutter Run":
Compiler message:
../../sdk/flutter/.pub-cache/hosted/pub.dartlang.org/upgrader-2.4.0/lib/src/appcas
t.dart:86:36: Error: Method not found: 'XmlDocument.parse'.
final document = XmlDocument.parse(xmlString);
^^^^^
Could you kindly guide me in the right direction?
Thanks for your contribution!
Hi,
Sorry for my English but how to I get my app version from android and iOS. I couldn't find any good example, alse I want to force to update.
I use your example but I am not sure where to put my android app on google palay and iOS app on appstore.
you have:
For Android:
final appcast = Appcast();
final items = await appcast.parseAppcastItemsFromUri('https://raw.githubusercontent.com/larryaasen/upgrader/master/test/testappcast.xml');
final bestItem = appcast.bestItem();
For iOS:
final iTunes = ITunesSearchAPI();
final resultsFuture = iTunes.lookupByBundleId('com.google.Maps');
resultsFuture.then((results) {
print('results: $results');
});
For iOS I think I will replace this com.google.Maps to my app but for android how to do it?
Also for Android you said 'On Android, setup the Appcast.' how can I set the app cast and where?
If you can created a step by step example it will be good for us
Thanks
I want to use this lib in my app
could you please tell me the steps?
should I need change anything in xCode runner?
where should i add or change versions?
I recieved this error: upgrader.ITunesResults.version: RangeError (index): Invalid value: Valid value range is empty: 0
and this: upgrader.ITunesResults.trackViewUrl: RangeError (index): Invalid value: Valid value range is empty: 0
I just wraped my Splash Screen Widget with UpgradeAlert widget.
First, congratulate them on the application. It works very well.
Is there any way to change the default text "A new version of [app_name] is available! Version [X.X] is now available you have [X.0.0]" to customText ?. To be able to change it to any language like buttonTitleIgnore, buttonTitleLater, buttonTitleUpdate, title or prompt.
Hi, I don't know how to avoid this thing.
I checked my flutter.versionName is the new one that I remotely share with XML file.
My new flutter.versionName= 1.1.1
But even the app updated it is still showing existed app as 1.0 .
Is that affected by auto-update that is not change the flutter.versionName?
do you have any idea?
Thanks
/C:/flutter/.pub-cache/hosted/pub.dartlang.org/upgrader-2.6.0/lib/src/appcast.dart:86:36: Error: Method not found: 'XmlDocument.parse'. final document = XmlDocument.parse(xmlString);
I am getting the following error message:
flutter: upgrader: RangeError (index): Invalid value: Valid value range is empty: 0
Not sure if I am doing something wrong here, the examples are not clear.
I'm getting an error with version 2.2.0 (I have to use 2.2.0 because >=2.2.1 breaks iOS with Method not found: 'XmlDocument.parse'.
Looks like _installedVersion
is not getting set soon enough, because _packageInfo.version
returns a string. You can see from the stack trace, but UpgradeAlert calls Text(Upgrader().message())
, which calls currentInstalledVersion()
, which is null.
It only happens on when upgrader is show as app first loads. Hot reloading fixes the issue, but a hot restart that loads the upgrader on the first page is throwing this error.
Tried calling WidgetsFlutterBinding.ensureInitialized();
in case that fixes anything, but no luck.
Flutter version 1.20.1
flutter: [2020-08-10 17:17:39.177563 | ConsoleHandler | INFO] ---------- ERROR ----------
flutter: [2020-08-10 17:17:39.177938 | ConsoleHandler | INFO] Invalid argument(s) (replacement): Must not be null
flutter: [2020-08-10 17:17:39.178612 | ConsoleHandler | INFO]
flutter: [2020-08-10 17:17:39.179452 | ConsoleHandler | INFO] ------- STACK TRACE -------
flutter: [2020-08-10 17:17:39.180092 | ConsoleHandler | INFO] #0 _StringBase.replaceAll (dart:core-patch/string_patch.dart:637:30)
flutter: [2020-08-10 17:17:39.180469 | ConsoleHandler | INFO] #1 Upgrader.message (package:upgrader/src/upgrader.dart:251:15)
flutter: [2020-08-10 17:17:39.180754 | ConsoleHandler | INFO] #2 UpgradeCard.build.<anonymous closure> (package:upgrader/src/upgrade_alert.dart:216:43)
flutter: [2020-08-10 17:17:39.181070 | ConsoleHandler | INFO] #3 _FutureBuilderState.build (package:flutter/src/widgets/async.dart:740:55)
flutter: [2020-08-10 17:17:39.181429 | ConsoleHandler | INFO] #4 StatefulElement.build (package:flutter/src/widgets/framework.dart:4663:28)
flutter: [2020-08-10 17:17:39.181869 | ConsoleHandler | INFO] #5 ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:4546:15)
flutter: [2020-08-10 17:17:39.182208 | ConsoleHandler | INFO] #6 StatefulElement.performRebuild (package:flutter/src/widgets/framework.dart:4719:11)
flutter: [2020-08-10 17:17:39.182470 | ConsoleHandler | INFO] #7 Element.rebuild (package:flutter/src/widgets/framework.dart:4262:5)
flutter: [2020-08-10 17:17:39.182786 | ConsoleHandler | INFO] #8 BuildOwner.buildScope (package:flutter/src/widgets/framework.dart:2667:33)
flutter: [2020-08-10 17:17:39.183146 | ConsoleHandler | INFO] #9 WidgetsBinding.drawFrame (package:flutter/src/widgets/binding.dart:866:20)
flutter: [2020-08-10 17:17:39.183440 | ConsoleHandler | INFO] #10 RendererBinding._handlePersistentFrameCallback (package:flutter/src/rendering/binding.dart:286:5)
flutter: [2020-08-10 17:17:39.183782 | ConsoleHandler | INFO] #11 SchedulerBinding._invokeFrameCallback (package:flutter/src/scheduler/binding.dart:1117:15)
flutter: [2020-08-10 17:17:39.184135 | ConsoleHandler | INFO] #12 SchedulerBinding.handleDrawFrame (package:flutter/src/scheduler/binding.dart:1056:9)
flutter: [2020-08-10 17:17:39.184480 | ConsoleHandler | INFO] #13 SchedulerBinding._handleDrawFrame (package:flutter/src/scheduler/binding.dart:972:5)
flutter: [2020-08-10 17:17:39.184796 | ConsoleHandler | INFO] #14 _rootRun (dart:async/zone.dart:1190:13)
flutter: [2020-08-10 17:17:39.185188 | ConsoleHandler | INFO] #15 _CustomZone.run (dart:async/zone.dart:1093:19)
flutter: [2020-08-10 17:17:39.185543 | ConsoleHandler | INFO] #16 _CustomZone.runGuarded (dart:async/zone.dart:997:7)
flutter: [2020-08-10 17:17:39.185855 | ConsoleHandler | INFO] #17 _invoke (dart:ui/hooks.dart:253:10)
flutter: [2020-08-10 17:17:39.186180 | ConsoleHandler | INFO] #18 _drawFrame (dart:ui/hooks.dart:211:3)
flutter: [2020-08-10 17:17:39.186911 | ConsoleHandler | INFO]
flutter: [2020-08-10 17:17:39.187507 | ConsoleHandler | INFO] ======================================================================
flutter: [2020-08-10 17:17:39.216065 | Catcher | INFO] Report result: true
Hi, does this package work for testFlight?
When an item includes a critical issue tag in the RSS feed for android the alert dialog should not pop after pressing the "Update Now" button.
If the user presses this button and goes back to the app without upgrading, they are no longer gated by the alert dialog (because it was popped).
Expected:
Alert dialog gates the user if they haven't upgraded.
Actual:
Alert dialog goes away after clicking the "Upgrade Now" button.
will upgrader change current version and keep latest version in the app?
Hi,
Im currently developing an app using flutter with your library. With debug version the Upgrade Alert still not appear in my app even it printed out build UpgradeAlert in the debug console (my app bundle is already on app store with the version of 1.1.3 and my current xcode build version is 0.0.1). This is my code:
body: UpgradeAlert( debugLogging: true, debugDisplayOnce: true, debugAlwaysUpgrade: true, child: SizedBox.expand( child: PageView( controller: _pageController, onPageChanged: (index) { setState(() => _currentIndex = index); }, children: buildListContentPageView(context), ), ), ),
and this is my debug console result:
Is it not working with non-realease version if it does how can i debug it and use it in my code?
Thanks for your support.
Edit 1: Im using upgrader version 2.2.0 due to version coflict with xml version.
Hi @larryaasen ,
Do you mind add the Appcast for android implementation into your example? I have no idea how to start with that.
Thanks in advance.
what is Appcast and how to configure Appcast?
final appcast = Appcast();
final items = await appcast.parseAppcastItemsFromUri('https://raw.githubusercontent.com/larryaasen/upgrader/master/test/testappcast.xml');
final bestItem = appcast.bestItem();
What is this URL "https://raw.githubusercontent.com/larryaasen/upgrader/master/test/testappcast.xml"?
<?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>
Where do I need to configure the XML
final appcastURL = 'https://www.mydomain.com/myappcast.xml';
final cfg = AppcastConfiguration(url: appcastURL, supportedOS: ['android']);
what is the appcastURL?
The current Flutter SDK version is 1.14.3.
Because xXx depends on upgrader >=0.10.1 which requires Flutter SDK version >=1.12.0 <1.13.0, version solving failed.
I'm wondering if this plugin support (or will support) Android's "native" in-app update (https://developer.android.com/guide/app-bundle/in-app-updates)?
So I have a few questions here on how the package works.
I want to force updates base on the semantic versioning. So if the app updates from 1.0.0 to 2.0.0, I want to be able to force my users to see the message and update, otherwise just pop the alert with default settings.
But for that I would need the version, what is the best way to do that? Because I don't see any public Futures or methods with callbacks.
something like that?
Upgrader().installAppStoreListingURL(myURL);
if (Upgrader().currentAppStoreVersion().someparsing() > Upgrader().currentInstalledVersion().someparsing()) {
bool _shouldForceUpgrade = true;
}
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.