codepush 0.2.3
codepush: ^0.2.3 copied to clipboard
Ship Dart fixes to installed Flutter apps without an app-store review. Signed patches, staged rollout, crash-safe rollback. Android needs no forked engine.
0.2.3 #
A patch could permanently switch off the update check. Once a patch was applied, every later launch skipped the check: the startup timer's callback read a static field in this library, and applying a patch can reinitialise the libraries it replaces, so that field read back null and the callback returned before doing anything. The device kept running the first patch it ever received while later patches sat published, signed and fetchable. Found on a real device, where patch 2 never arrived twice in a row.
The check now runs from the config captured when it was scheduled, so nothing on that path depends on static state outliving a patch. A patch must never be able to disable the mechanism that would replace it.
A check that is due also records itself as scheduled, so a check that never
runs is distinguishable from one that ran and found nothing — those two were
identical from outside the device, which is why this went unnoticed.
0.2.2 #
The device now records what the update check decided, not only what the boot
loader did. Those are different things and only the second was ever written
down: the check is where a patch is accepted or refused, and its one output was
a debugPrint that does not reach a release build's console. So on a real
device, "I published a patch and nothing changed" had no answer — the boot
status kept correctly reporting the previous patch while the new one was being
declined for an invisible reason.
0.2.1 #
The device status file now records which patch a launch acted on. The outcome
alone could not answer the two questions actually asked of a device — "did my
new patch land" and "did the rollback take" — because a before/after pair both
report applied with the same replaced count.
0.2.0 #
Fixes the default patch contract, which named five packages the first app to
use CodePush happened to depend on: go_router, intl, dio, shared_preferences
and get. The compiler resolves every library a contract names, so any project
without one of them failed an iOS release with "Couldn't resolve the package".
They were also redundant — codepush release ios already adds every library
the app links. The contract now lists framework libraries only.
0.1.0 #
First release.