expo-dev-launcher 57.0.5 → 57.0.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md
CHANGED
|
@@ -10,6 +10,14 @@
|
|
|
10
10
|
|
|
11
11
|
### 💡 Others
|
|
12
12
|
|
|
13
|
+
## 57.0.7 — 2026-07-17
|
|
14
|
+
|
|
15
|
+
_This version does not introduce any user-facing changes._
|
|
16
|
+
|
|
17
|
+
## 57.0.6 — 2026-07-15
|
|
18
|
+
|
|
19
|
+
_This version does not introduce any user-facing changes._
|
|
20
|
+
|
|
13
21
|
## 57.0.5 — 2026-07-03
|
|
14
22
|
|
|
15
23
|
### 🐛 Bug fixes
|
|
@@ -33,6 +41,7 @@ _This version does not introduce any user-facing changes._
|
|
|
33
41
|
### 🎉 New features
|
|
34
42
|
|
|
35
43
|
- Add a Settings toggle to switch between auto-launching the most recent app and showing the launcher. ([#47131](https://github.com/expo/expo/pull/47131) by [@alanjhughes](https://github.com/alanjhughes))
|
|
44
|
+
- [iOS] Add build's expiration date to Settings. ([#47190](https://github.com/expo/expo/pull/47190) by [@gabrieldonadel](https://github.com/gabrieldonadel))
|
|
36
45
|
|
|
37
46
|
### 🐛 Bug fixes
|
|
38
47
|
|
package/android/build.gradle
CHANGED
|
@@ -26,13 +26,13 @@ expoModule {
|
|
|
26
26
|
}
|
|
27
27
|
|
|
28
28
|
group = "host.exp.exponent"
|
|
29
|
-
version = "57.0.
|
|
29
|
+
version = "57.0.7"
|
|
30
30
|
|
|
31
31
|
android {
|
|
32
32
|
namespace "expo.modules.devlauncher"
|
|
33
33
|
defaultConfig {
|
|
34
34
|
versionCode 9
|
|
35
|
-
versionName "57.0.
|
|
35
|
+
versionName "57.0.7"
|
|
36
36
|
}
|
|
37
37
|
|
|
38
38
|
buildTypes {
|
|
@@ -676,9 +676,71 @@ static const NSTimeInterval EXDevLauncherDefaultRequestTimeout = 10.0;
|
|
|
676
676
|
[buildInfo setObject:sdkVersion forKey:@"sdkVersion"];
|
|
677
677
|
}
|
|
678
678
|
|
|
679
|
+
NSString *appExpirationDate = [self getAppExpirationDate];
|
|
680
|
+
if (appExpirationDate) {
|
|
681
|
+
[buildInfo setObject:appExpirationDate forKey:@"appExpirationDate"];
|
|
682
|
+
}
|
|
683
|
+
|
|
679
684
|
return buildInfo;
|
|
680
685
|
}
|
|
681
686
|
|
|
687
|
+
-(nullable NSString *)getAppExpirationDate
|
|
688
|
+
{
|
|
689
|
+
// App Store and Simulator builds don't have mobileprovision
|
|
690
|
+
NSString *path = [[NSBundle mainBundle] pathForResource:@"embedded" ofType:@"mobileprovision"];
|
|
691
|
+
if (!path) {
|
|
692
|
+
return nil;
|
|
693
|
+
}
|
|
694
|
+
|
|
695
|
+
NSError *error;
|
|
696
|
+
NSString *profileString = [NSString stringWithContentsOfFile:path encoding:NSASCIIStringEncoding error:&error];
|
|
697
|
+
if (!profileString) {
|
|
698
|
+
return nil;
|
|
699
|
+
}
|
|
700
|
+
|
|
701
|
+
NSScanner *scanner = [NSScanner scannerWithString:profileString];
|
|
702
|
+
if (![scanner scanUpToString:@"<?xml version=\"1.0\" encoding=\"UTF-8\"?>" intoString:nil]) {
|
|
703
|
+
return nil;
|
|
704
|
+
}
|
|
705
|
+
|
|
706
|
+
NSString *plistString;
|
|
707
|
+
if (![scanner scanUpToString:@"</plist>" intoString:&plistString]) {
|
|
708
|
+
return nil;
|
|
709
|
+
}
|
|
710
|
+
plistString = [plistString stringByAppendingString:@"</plist>"];
|
|
711
|
+
|
|
712
|
+
NSData *plistData = [plistString dataUsingEncoding:NSUTF8StringEncoding];
|
|
713
|
+
id plist = [NSPropertyListSerialization propertyListWithData:plistData
|
|
714
|
+
options:NSPropertyListImmutable
|
|
715
|
+
format:NULL
|
|
716
|
+
error:NULL];
|
|
717
|
+
NSDate *expiration = [plist isKindOfClass:[NSDictionary class]] ? plist[@"ExpirationDate"] : nil;
|
|
718
|
+
if (![expiration isKindOfClass:[NSDate class]]) {
|
|
719
|
+
return nil;
|
|
720
|
+
}
|
|
721
|
+
|
|
722
|
+
NSDateFormatter *formatter = [NSDateFormatter new];
|
|
723
|
+
formatter.dateStyle = NSDateFormatterMediumStyle;
|
|
724
|
+
formatter.timeStyle = NSDateFormatterNoStyle;
|
|
725
|
+
NSString *formattedDate = [formatter stringFromDate:expiration];
|
|
726
|
+
|
|
727
|
+
NSCalendar *calendar = [NSCalendar currentCalendar];
|
|
728
|
+
NSDate *today = [calendar startOfDayForDate:[NSDate date]];
|
|
729
|
+
NSDate *expirationDay = [calendar startOfDayForDate:expiration];
|
|
730
|
+
NSInteger days = [calendar components:NSCalendarUnitDay fromDate:today toDate:expirationDay options:0].day;
|
|
731
|
+
|
|
732
|
+
NSString *relative;
|
|
733
|
+
if (days == 0) {
|
|
734
|
+
relative = @"today";
|
|
735
|
+
} else if (days == 1) {
|
|
736
|
+
relative = @"1 day";
|
|
737
|
+
} else {
|
|
738
|
+
relative = [NSString stringWithFormat:@"%ld days", (long)days];
|
|
739
|
+
}
|
|
740
|
+
|
|
741
|
+
return relative;
|
|
742
|
+
}
|
|
743
|
+
|
|
682
744
|
-(NSString *)getAppIcon
|
|
683
745
|
{
|
|
684
746
|
NSString *appIcon = @"";
|
|
@@ -17,7 +17,8 @@ struct SettingsTabView: View {
|
|
|
17
17
|
"runtimeVersion": viewModel.buildInfo["runtimeVersion"] as? String ?? "",
|
|
18
18
|
"sdkVersion": viewModel.structuredBuildInfo.sdkVersion ?? "",
|
|
19
19
|
"appName": viewModel.buildInfo["appName"] as? String ?? "",
|
|
20
|
-
"appVersion": viewModel.buildInfo["appVersion"] as? String ?? ""
|
|
20
|
+
"appVersion": viewModel.buildInfo["appVersion"] as? String ?? "",
|
|
21
|
+
"appExpirationDate": viewModel.buildInfo["appExpirationDate"] as? String ?? ""
|
|
21
22
|
]
|
|
22
23
|
|
|
23
24
|
do {
|
|
@@ -51,6 +52,10 @@ struct SettingsTabView: View {
|
|
|
51
52
|
|
|
52
53
|
VStack(spacing: 0) {
|
|
53
54
|
version
|
|
55
|
+
if let expiration = viewModel.buildInfo["appExpirationDate"] as? String {
|
|
56
|
+
Divider()
|
|
57
|
+
expirationRow(expiration)
|
|
58
|
+
}
|
|
54
59
|
Divider()
|
|
55
60
|
copyToClipboardButton
|
|
56
61
|
}
|
|
@@ -170,6 +175,17 @@ struct SettingsTabView: View {
|
|
|
170
175
|
.padding(.vertical, 12)
|
|
171
176
|
}
|
|
172
177
|
|
|
178
|
+
private func expirationRow(_ text: String) -> some View {
|
|
179
|
+
HStack {
|
|
180
|
+
Text("Expires in")
|
|
181
|
+
Spacer()
|
|
182
|
+
Text(text)
|
|
183
|
+
.foregroundColor(.secondary)
|
|
184
|
+
}
|
|
185
|
+
.padding(.horizontal)
|
|
186
|
+
.padding(.vertical, 12)
|
|
187
|
+
}
|
|
188
|
+
|
|
173
189
|
private var copyToClipboardButton: some View {
|
|
174
190
|
#if os(tvOS)
|
|
175
191
|
Text("Clipboard not available on tvOS")
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "expo-dev-launcher",
|
|
3
3
|
"title": "Expo Development Launcher",
|
|
4
|
-
"version": "57.0.
|
|
4
|
+
"version": "57.0.7",
|
|
5
5
|
"description": "Pre-release version of the Expo development launcher package for testing.",
|
|
6
6
|
"repository": {
|
|
7
7
|
"type": "git",
|
|
@@ -15,9 +15,9 @@
|
|
|
15
15
|
"license": "MIT",
|
|
16
16
|
"homepage": "https://docs.expo.dev",
|
|
17
17
|
"dependencies": {
|
|
18
|
-
"@expo/schema-utils": "^57.0.
|
|
19
|
-
"expo-dev-menu": "~57.0.
|
|
20
|
-
"expo-manifests": "~57.0.
|
|
18
|
+
"@expo/schema-utils": "^57.0.2",
|
|
19
|
+
"expo-dev-menu": "~57.0.7",
|
|
20
|
+
"expo-manifests": "~57.0.1"
|
|
21
21
|
},
|
|
22
22
|
"peerDependencies": {
|
|
23
23
|
"expo": "*",
|
|
@@ -25,9 +25,9 @@
|
|
|
25
25
|
},
|
|
26
26
|
"devDependencies": {
|
|
27
27
|
"@types/node": "^22.14.0",
|
|
28
|
-
"expo": "57.0.
|
|
28
|
+
"expo": "57.0.7"
|
|
29
29
|
},
|
|
30
|
-
"gitHead": "
|
|
30
|
+
"gitHead": "0dac79c8469fa00b76fb8f402c47ed61f3d6317e",
|
|
31
31
|
"scripts": {
|
|
32
32
|
"build:plugin": "expo-module build plugin",
|
|
33
33
|
"expo-module": "expo-module"
|