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