1// Copyright 2015-present 650 Industries. All rights reserved. 2#import "EXDevMenuAppInfo.h" 3#if __has_include(<EXDevMenu/EXDevMenu-Swift.h>) 4#import <EXDevMenu/EXDevMenu-Swift.h> 5#else 6#import <EXDevMenu-Swift.h> 7#endif 8#import <EXManifests/EXManifestsManifestFactory.h> 9 10@implementation EXDevMenuAppInfo 11 12+(NSDictionary *)getAppInfo 13{ 14 NSMutableDictionary *appInfo = [NSMutableDictionary new]; 15 16 NSString *appIcon = [EXDevMenuAppInfo getAppIcon]; 17 NSString *runtimeVersion = [EXDevMenuAppInfo getUpdatesConfigForKey:@"EXUpdatesRuntimeVersion"]; 18 NSString *sdkVersion = [EXDevMenuAppInfo getUpdatesConfigForKey:@"EXUpdatesSDKVersion"]; 19 NSString *appVersion = [EXDevMenuAppInfo getFormattedAppVersion]; 20 NSString *appName = [[NSBundle mainBundle] objectForInfoDictionaryKey: @"CFBundleDisplayName"] ?: [[NSBundle mainBundle] objectForInfoDictionaryKey: @"CFBundleExecutable"]; 21 22 DevMenuManager *manager = [DevMenuManager shared]; 23 24 if (manager.currentManifest != nil) { 25 appName = [manager.currentManifest name]; 26 appVersion = [manager.currentManifest version]; 27 } 28 29 NSString *engine; 30 NSString *bridgeDescription = [[[manager currentBridge] batchedBridge] bridgeDescription]; 31 if ([bridgeDescription containsString:@"Hermes"]) { 32 engine = @"Hermes"; 33 } else if ([bridgeDescription containsString:@"V8"]) { 34 engine = @"V8"; 35 } else { 36 engine = @"JSC"; 37 } 38 39 NSString *hostUrl = [manager.currentManifestURL absoluteString] ?: @""; 40 41 appInfo[@"appName"] = appName; 42 appInfo[@"appIcon"] = appIcon; 43 appInfo[@"appVersion"] = appVersion; 44 appInfo[@"runtimeVersion"] = runtimeVersion; 45 appInfo[@"sdkVersion"] = sdkVersion; 46 appInfo[@"hostUrl"] = hostUrl; 47 appInfo[@"engine"] = engine; 48 49 return appInfo; 50} 51 52+(NSString *)getAppIcon 53{ 54 NSString *appIcon = @""; 55 NSString *appIconName = [[[[[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleIcons"] objectForKey:@"CFBundlePrimaryIcon"] objectForKey:@"CFBundleIconFiles"] lastObject]; 56 57 if (appIconName != nil) { 58 NSString *resourcePath = [[NSBundle mainBundle] resourcePath]; 59 NSString *appIconPath = [[resourcePath stringByAppendingString:appIconName] stringByAppendingString:@".png"]; 60 appIcon = [@"file://" stringByAppendingString:appIconPath]; 61 } 62 63 return appIcon; 64} 65 66+(NSString *)getUpdatesConfigForKey:(NSString *)key 67{ 68 NSString *value = @""; 69 NSString *path = [[NSBundle mainBundle] pathForResource:@"Expo" ofType:@"plist"]; 70 71 if (path != nil) { 72 NSDictionary *expoConfig = [NSDictionary dictionaryWithContentsOfFile:path]; 73 74 if (expoConfig != nil) { 75 value = [expoConfig objectForKey:key] ?: @""; 76 } 77 } 78 79 return value; 80} 81 82+(NSString *)getFormattedAppVersion 83{ 84 NSString *shortVersion = [[NSBundle mainBundle] objectForInfoDictionaryKey:@"CFBundleShortVersionString"]; 85 NSString *buildVersion = [[NSBundle mainBundle] objectForInfoDictionaryKey:@"CFBundleVersion"]; 86 NSString *appVersion = [NSString stringWithFormat:@"%@ (%@)", shortVersion, buildVersion]; 87 return appVersion; 88} 89 90@end 91