Page Menu
Home
Phorge
Search
Configure Global Search
Log In
Files
F32179155
D14977.1765072034.diff
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Flag For Later
Award Token
Size
36 KB
Referenced Files
None
Subscribers
None
D14977.1765072034.diff
View Options
diff --git a/native/ios/Comm-Bridging-Header.h b/native/ios/Comm-Bridging-Header.h
--- a/native/ios/Comm-Bridging-Header.h
+++ b/native/ios/Comm-Bridging-Header.h
@@ -2,3 +2,7 @@
// Use this file to import your target's public headers that you would like to
// expose to Swift.
//
+#import "CommIOSNotifications.h"
+#import "Comm/DBInit.h"
+#import "Comm/Tools.h"
+#import "CommIOSServicesClient.h"
\ No newline at end of file
diff --git a/native/ios/Comm.xcodeproj/project.pbxproj b/native/ios/Comm.xcodeproj/project.pbxproj
--- a/native/ios/Comm.xcodeproj/project.pbxproj
+++ b/native/ios/Comm.xcodeproj/project.pbxproj
@@ -8,9 +8,7 @@
/* Begin PBXBuildFile section */
0E02677D2D81ED6600788249 /* DMOperationStore.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 0E02677C2D81ED6600788249 /* DMOperationStore.cpp */; };
- 13B07FBC1A68108700A75B9A /* AppDelegate.mm in Sources */ = {isa = PBXBuildFile; fileRef = 13B07FB01A68108700A75B9A /* AppDelegate.mm */; };
13B07FBF1A68108700A75B9A /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 13B07FB51A68108700A75B9A /* Images.xcassets */; };
- 13B07FC11A68108700A75B9A /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 13B07FB71A68108700A75B9A /* main.m */; };
1F537ACC7B60DC049C0ECFA7 /* ExpoModulesProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = 769A87FB41BCE3FEF97FD59A /* ExpoModulesProvider.swift */; };
34055C152BAD31AC0008E713 /* SyncedMetadataStore.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 34055C142BAD31AC0008E713 /* SyncedMetadataStore.cpp */; };
34329B442B9EC7EC00233438 /* IntegrityStore.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 34329B3F2B9EBFCE00233438 /* IntegrityStore.cpp */; };
@@ -19,6 +17,8 @@
443650412E21F3F200026241 /* StringUtils.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 443650402E21F3F200026241 /* StringUtils.cpp */; };
443650422E21F3F200026241 /* StringUtils.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 443650402E21F3F200026241 /* StringUtils.cpp */; };
443650452E21F47600026241 /* CommInitializerModule.mm in Sources */ = {isa = PBXBuildFile; fileRef = 443650442E21F47600026241 /* CommInitializerModule.mm */; };
+ 44F116742DE474D30027DDA6 /* DBInit.mm in Sources */ = {isa = PBXBuildFile; fileRef = 44F116732DE474D30027DDA6 /* DBInit.mm */; };
+ 44F116752DE474D30027DDA6 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 44F116712DE474D30027DDA6 /* AppDelegate.swift */; };
71142A7726C2650B0039DCBD /* CommSecureStoreIOSWrapper.mm in Sources */ = {isa = PBXBuildFile; fileRef = 71142A7626C2650A0039DCBD /* CommSecureStoreIOSWrapper.mm */; };
711B408425DA97F9005F8F06 /* dummy.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7F26E81B24440D87004049C6 /* dummy.swift */; };
71762A75270D8AAE00F565ED /* PlatformSpecificTools.mm in Sources */ = {isa = PBXBuildFile; fileRef = 71762A74270D8AAE00F565ED /* PlatformSpecificTools.mm */; };
@@ -162,11 +162,8 @@
0E02677E2D81ED7B00788249 /* DMOperationStoreOperations.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = DMOperationStoreOperations.h; sourceTree = "<group>"; };
0E0267862D970E9500788249 /* DeleteMessageSpec.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = DeleteMessageSpec.h; path = PersistentStorageUtilities/MessageOperationsUtilities/MessageSpecs/DeleteMessageSpec.h; sourceTree = "<group>"; };
13B07F961A680F5B00A75B9A /* Comm.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Comm.app; sourceTree = BUILT_PRODUCTS_DIR; };
- 13B07FAF1A68108700A75B9A /* AppDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = AppDelegate.h; path = Comm/AppDelegate.h; sourceTree = "<group>"; };
- 13B07FB01A68108700A75B9A /* AppDelegate.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; name = AppDelegate.mm; path = Comm/AppDelegate.mm; sourceTree = "<group>"; };
13B07FB51A68108700A75B9A /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; name = Images.xcassets; path = Comm/Images.xcassets; sourceTree = "<group>"; };
13B07FB61A68108700A75B9A /* Info.release.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = Info.release.plist; path = Comm/Info.release.plist; sourceTree = "<group>"; };
- 13B07FB71A68108700A75B9A /* main.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = main.m; path = Comm/main.m; sourceTree = "<group>"; };
2DDA0A22FECC9DAA5C19C35D /* Metadata.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Metadata.h; sourceTree = "<group>"; };
34055C132BAD31AB0008E713 /* SyncedMetadataStore.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = SyncedMetadataStore.h; path = PersistentStorageUtilities/DataStores/SyncedMetadataStore.h; sourceTree = "<group>"; };
34055C142BAD31AC0008E713 /* SyncedMetadataStore.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = SyncedMetadataStore.cpp; path = PersistentStorageUtilities/DataStores/SyncedMetadataStore.cpp; sourceTree = "<group>"; };
@@ -187,6 +184,9 @@
443650402E21F3F200026241 /* StringUtils.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = StringUtils.cpp; sourceTree = "<group>"; };
443650432E21F47600026241 /* CommInitializerModule.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = CommInitializerModule.h; sourceTree = "<group>"; };
443650442E21F47600026241 /* CommInitializerModule.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; path = CommInitializerModule.mm; sourceTree = "<group>"; };
+ 44F116712DE474D30027DDA6 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; name = AppDelegate.swift; path = Comm/AppDelegate.swift; sourceTree = "<group>"; };
+ 44F116722DE474D30027DDA6 /* DBInit.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = DBInit.h; path = Comm/DBInit.h; sourceTree = "<group>"; };
+ 44F116732DE474D30027DDA6 /* DBInit.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = DBInit.mm; path = Comm/DBInit.mm; sourceTree = "<group>"; };
71142A7526C2650A0039DCBD /* CommSecureStoreIOSWrapper.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = CommSecureStoreIOSWrapper.h; path = Comm/CommSecureStoreIOSWrapper.h; sourceTree = "<group>"; };
71142A7626C2650A0039DCBD /* CommSecureStoreIOSWrapper.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; name = CommSecureStoreIOSWrapper.mm; path = Comm/CommSecureStoreIOSWrapper.mm; sourceTree = "<group>"; };
711CF80E25DC096000A00FBD /* libFolly.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; path = libFolly.a; sourceTree = BUILT_PRODUCTS_DIR; };
@@ -427,12 +427,12 @@
71B8CCB626BD30EC0040C0A2 /* CommCoreImplementations */,
7F788C2B248AA2130098F071 /* SplashScreen.storyboard */,
7FCFD8BD1E81B8DF00629B0E /* Comm.entitlements */,
- 13B07FAF1A68108700A75B9A /* AppDelegate.h */,
- 13B07FB01A68108700A75B9A /* AppDelegate.mm */,
13B07FB51A68108700A75B9A /* Images.xcassets */,
7F554F822332D58B007CB9F7 /* Info.debug.plist */,
13B07FB61A68108700A75B9A /* Info.release.plist */,
- 13B07FB71A68108700A75B9A /* main.m */,
+ 44F116712DE474D30027DDA6 /* AppDelegate.swift */,
+ 44F116722DE474D30027DDA6 /* DBInit.h */,
+ 44F116732DE474D30027DDA6 /* DBInit.mm */,
7FCEA2DC2444010B004017B1 /* Comm-Bridging-Header.h */,
7F26E81B24440D87004049C6 /* dummy.swift */,
);
@@ -1390,8 +1390,9 @@
8E2CC2592B5C99B0000C94D6 /* KeyserverStore.cpp in Sources */,
DFD5E77C2B05181400C32B6A /* RustSecureStore.cpp in Sources */,
71BF5B7526B401D300EDE27D /* Tools.cpp in Sources */,
- 13B07FBC1A68108700A75B9A /* AppDelegate.mm in Sources */,
7FE4D9F5291DFE9300667BF6 /* commJSI-generated.cpp in Sources */,
+ 44F116742DE474D30027DDA6 /* DBInit.mm in Sources */,
+ 44F116752DE474D30027DDA6 /* AppDelegate.swift in Sources */,
8B652FA6295EAA5B009F8163 /* RustCallback.cpp in Sources */,
71142A7726C2650B0039DCBD /* CommSecureStoreIOSWrapper.mm in Sources */,
7FBB2A7B29EEA2A4002C6493 /* Base64.cpp in Sources */,
@@ -1416,7 +1417,6 @@
443650452E21F47600026241 /* CommInitializerModule.mm in Sources */,
DFD5E77E2B05264000C32B6A /* AESCrypto.mm in Sources */,
8EA59BD62A6E8E0400EB4F53 /* DraftStore.cpp in Sources */,
- 13B07FC11A68108700A75B9A /* main.m in Sources */,
71BE844B2636A944002849D2 /* SQLiteQueryExecutor.cpp in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
diff --git a/native/ios/Comm/AppDelegate.h b/native/ios/Comm/AppDelegate.h
deleted file mode 100644
--- a/native/ios/Comm/AppDelegate.h
+++ /dev/null
@@ -1,10 +0,0 @@
-#import <Expo/Expo.h>
-#import <React/RCTBridgeDelegate.h>
-#import <UIKit/UIKit.h>
-
-@interface AppDelegate
- : EXAppDelegateWrapper <UIApplicationDelegate, RCTBridgeDelegate>
-
-@property(nonatomic, strong) UIWindow *window;
-
-@end
diff --git a/native/ios/Comm/AppDelegate.mm b/native/ios/Comm/AppDelegate.mm
deleted file mode 100644
--- a/native/ios/Comm/AppDelegate.mm
+++ /dev/null
@@ -1,456 +0,0 @@
-#import "AppDelegate.h"
-
-#import <React/RCTBridge.h>
-#import <React/RCTBundleURLProvider.h>
-#import <React/RCTRootView.h>
-
-#import <React/RCTAppSetupUtils.h>
-
-#if RCT_NEW_ARCH_ENABLED
-#import <React/CoreModulesPlugins.h>
-#import <React/RCTCxxBridgeDelegate.h>
-#import <React/RCTFabricSurfaceHostingProxyRootView.h>
-#import <React/RCTSurfacePresenter.h>
-#import <React/RCTSurfacePresenterBridgeAdapter.h>
-#import <ReactCommon/RCTTurboModuleManager.h>
-#import <react/config/ReactNativeConfig.h>
-static NSString *const kRNConcurrentRoot = @"concurrentRoot";
-@interface AppDelegate () <
- RCTCxxBridgeDelegate,
- RCTTurboModuleManagerDelegate> {
- RCTTurboModuleManager *_turboModuleManager;
- RCTSurfacePresenterBridgeAdapter *_bridgeAdapter;
- std::shared_ptr<const facebook::react::ReactNativeConfig> _reactNativeConfig;
- facebook::react::ContextContainer::Shared _contextContainer;
-}
-@end
-#endif
-
-#import "CommIOSNotifications.h"
-#import "Orientation.h"
-#import <React/RCTConvert.h>
-
-#import <React/RCTBridge+Private.h>
-#import <React/RCTCxxBridgeDelegate.h>
-#import <React/RCTJSIExecutorRuntimeInstaller.h>
-#import <React/RCTLinkingManager.h>
-#import <cxxreact/JSExecutor.h>
-#import <jsireact/JSIExecutor.h>
-#import <reacthermes/HermesExecutorFactory.h>
-
-#import "CommConstants.h"
-#import "CommCoreModule.h"
-#import "CommIOSServicesClient.h"
-#import "CommMMKV.h"
-#import "CommRustModule.h"
-#import "CommUtilsModule.h"
-#import "GlobalDBSingleton.h"
-#import "Logger.h"
-#import "MessageOperationsUtilities.h"
-#import "TemporaryMessageStorage.h"
-#import "ThreadOperations.h"
-#import "Tools.h"
-#import <cstdio>
-#import <stdexcept>
-#import <string>
-
-#import <ReactCommon/RCTTurboModuleManager.h>
-
-#import <RNReanimated/REAInitializer.h>
-
-#import <UserNotifications/UserNotifications.h>
-
-NSString *const setUnreadStatusKey = @"setUnreadStatus";
-NSString *const threadIDKey = @"threadID";
-NSString *const newMessageInfosNSNotification =
- @"app.comm.ns_new_message_infos";
-CFStringRef newMessageInfosDarwinNotification =
- CFSTR("app.comm.darwin_new_message_infos");
-
-void didReceiveNewMessageInfosDarwinNotification(
- CFNotificationCenterRef center,
- void *observer,
- CFStringRef name,
- const void *object,
- CFDictionaryRef userInfo) {
- [[NSNotificationCenter defaultCenter]
- postNotificationName:newMessageInfosNSNotification
- object:nil];
-}
-
-@interface AppDelegate () <
- RCTCxxBridgeDelegate,
- RCTTurboModuleManagerDelegate> {
-}
-@end
-
-@implementation AppDelegate
-
-- (BOOL)application:(UIApplication *)application
- willFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
- [self attemptDatabaseInitialization];
- [self registerForNewMessageInfosNotifications];
- comm::CommMMKV::initialize();
- return YES;
-}
-
-- (BOOL)application:(UIApplication *)application
- didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
- RCTAppSetupPrepareApp(application);
-
- [self moveMessagesToDatabase:NO];
- [self scheduleNSEBlobsDeletion];
- [[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryAmbient
- error:nil];
-
- RCTBridge *bridge =
- [self.reactDelegate createBridgeWithDelegate:self
- launchOptions:launchOptions];
-
-#if RCT_NEW_ARCH_ENABLED
- _contextContainer =
- std::make_shared<facebook::react::ContextContainer const>();
- _reactNativeConfig =
- std::make_shared<facebook::react::EmptyReactNativeConfig const>();
- _contextContainer->insert("ReactNativeConfig", _reactNativeConfig);
- _bridgeAdapter = [[RCTSurfacePresenterBridgeAdapter alloc]
- initWithBridge:bridge
- contextContainer:_contextContainer];
- bridge.surfacePresenter = _bridgeAdapter.surfacePresenter;
-#endif
-
- NSDictionary *initProps = [self prepareInitialProps];
- UIView *rootView = [self.reactDelegate createRootViewWithBridge:bridge
- moduleName:@"Comm"
- initialProperties:initProps];
-
- if (@available(iOS 13.0, *)) {
- rootView.backgroundColor = [UIColor systemBackgroundColor];
- } else {
- rootView.backgroundColor = [UIColor whiteColor];
- }
-
- self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds];
- UIViewController *rootViewController =
- [self.reactDelegate createRootViewController];
- rootViewController.view = rootView;
- self.window.rootViewController = rootViewController;
- [self.window makeKeyAndVisible];
- [super application:application didFinishLaunchingWithOptions:launchOptions];
-
- // This prevents a very small flicker from occurring before expo-splash-screen
- // is able to display
- UIView *launchScreenView =
- [[UIStoryboard storyboardWithName:@"SplashScreen"
- bundle:nil] instantiateInitialViewController]
- .view;
- launchScreenView.frame = self.window.bounds;
-
- ((RCTRootView *)rootView).loadingView = launchScreenView;
- ((RCTRootView *)rootView).loadingViewFadeDelay = 0;
- ((RCTRootView *)rootView).loadingViewFadeDuration = 0.001;
-
- return YES;
-}
-
-- (BOOL)application:(UIApplication *)application
- openURL:(NSURL *)url
- options:
- (NSDictionary<UIApplicationOpenURLOptionsKey, id> *)options {
- return [RCTLinkingManager application:application
- openURL:url
- options:options];
-}
-
-- (BOOL)application:(UIApplication *)application
- continueUserActivity:(nonnull NSUserActivity *)userActivity
- restorationHandler:
- (nonnull void (^)(NSArray<id<UIUserActivityRestoring>> *_Nullable))
- restorationHandler {
- return [RCTLinkingManager application:application
- continueUserActivity:userActivity
- restorationHandler:restorationHandler];
-}
-
-- (NSArray<id<RCTBridgeModule>> *)extraModulesForBridge:(RCTBridge *)bridge {
- // If you'd like to export some custom RCTBridgeModules that are not Expo
- // modules, add them here!
- return @[];
-}
-
-/// This method controls whether the `concurrentRoot`feature of React18 is
-/// turned on or off.
-///
-/// @see: https://reactjs.org/blog/2022/03/29/react-v18.html
-/// @note: This requires to be rendering on Fabric (i.e. on the New
-/// Architecture).
-/// @return: `true` if the `concurrentRoot` feture is enabled. Otherwise, it
-/// returns `false`.
-- (BOOL)concurrentRootEnabled {
- // Switch this bool to turn on and off the concurrent root
- return true;
-}
-- (NSDictionary *)prepareInitialProps {
- NSMutableDictionary *initProps = [NSMutableDictionary new];
-#ifdef RCT_NEW_ARCH_ENABLED
- initProps[kRNConcurrentRoot] = @([self concurrentRootEnabled]);
-#endif
- return initProps;
-}
-
-- (void)application:(UIApplication *)application
- didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken {
- [CommIOSNotifications
- didRegisterForRemoteNotificationsWithDeviceToken:deviceToken];
-}
-
-- (void)application:(UIApplication *)application
- didFailToRegisterForRemoteNotificationsWithError:(NSError *)error {
- [CommIOSNotifications didFailToRegisterForRemoteNotificationsWithError:error];
-}
-
-// Required for the notification event. You must call the completion handler
-// after handling the remote notification.
-- (void)application:(UIApplication *)application
- didReceiveRemoteNotification:(NSDictionary *)notification
- fetchCompletionHandler:
- (void (^)(UIBackgroundFetchResult))completionHandler {
-
- [CommIOSNotifications didReceiveRemoteNotification:notification
- fetchCompletionHandler:completionHandler];
-}
-
-- (UIInterfaceOrientationMask)application:(UIApplication *)application
- supportedInterfaceOrientationsForWindow:(UIWindow *)window {
- return [Orientation getOrientation];
-}
-
-- (NSURL *)sourceURLForBridge:(RCTBridge *)bridge {
-#if DEBUG
- return
- [[RCTBundleURLProvider sharedSettings] jsBundleURLForBundleRoot:@"index"];
-#else
- return [[NSBundle mainBundle] URLForResource:@"main"
- withExtension:@"jsbundle"];
-#endif
-}
-
-#if RCT_NEW_ARCH_ENABLED
-#pragma mark - RCTCxxBridgeDelegate
-- (std::unique_ptr<facebook::react::JSExecutorFactory>)
- jsExecutorFactoryForBridge:(RCTBridge *)bridge {
- _turboModuleManager =
- [[RCTTurboModuleManager alloc] initWithBridge:bridge
- delegate:self
- jsInvoker:bridge.jsCallInvoker];
- return RCTAppSetupDefaultJsExecutorFactory(bridge, _turboModuleManager);
-}
-#pragma mark RCTTurboModuleManagerDelegate
-- (Class)getModuleClassFromName:(const char *)name {
- return RCTCoreModulesClassProvider(name);
-}
-- (std::shared_ptr<facebook::react::TurboModule>)
- getTurboModule:(const std::string &)name
- jsInvoker:(std::shared_ptr<facebook::react::CallInvoker>)jsInvoker {
- return nullptr;
-}
-- (std::shared_ptr<facebook::react::TurboModule>)
- getTurboModule:(const std::string &)name
- initParams:
- (const facebook::react::ObjCTurboModule::InitParams &)params {
- return nullptr;
-}
-- (id<RCTTurboModule>)getModuleInstanceFromClass:(Class)moduleClass {
- return RCTAppSetupDefaultModuleFromClass(moduleClass);
-}
-#endif
-
-using JSExecutorFactory = facebook::react::JSExecutorFactory;
-using HermesExecutorFactory = facebook::react::HermesExecutorFactory;
-using Runtime = facebook::jsi::Runtime;
-
-- (std::unique_ptr<JSExecutorFactory>)jsExecutorFactoryForBridge:
- (RCTBridge *)bridge {
- __weak __typeof(self) weakSelf = self;
-
- const auto commRuntimeInstaller = [weakSelf,
- bridge](facebook::jsi::Runtime &rt) {
- if (!bridge) {
- return;
- }
- __typeof(self) strongSelf = weakSelf;
- if (strongSelf) {
- std::shared_ptr<comm::CommCoreModule> coreNativeModule =
- std::make_shared<comm::CommCoreModule>(bridge.jsCallInvoker);
- std::shared_ptr<comm::CommUtilsModule> utilsNativeModule =
- std::make_shared<comm::CommUtilsModule>(bridge.jsCallInvoker);
- std::shared_ptr<comm::CommRustModule> rustNativeModule =
- std::make_shared<comm::CommRustModule>(bridge.jsCallInvoker);
- std::shared_ptr<comm::CommConstants> nativeConstants =
- std::make_shared<comm::CommConstants>();
-
- rt.global().setProperty(
- rt,
- facebook::jsi::PropNameID::forAscii(rt, "CommCoreModule"),
- facebook::jsi::Object::createFromHostObject(rt, coreNativeModule));
- rt.global().setProperty(
- rt,
- facebook::jsi::PropNameID::forAscii(rt, "CommUtilsModule"),
- facebook::jsi::Object::createFromHostObject(rt, utilsNativeModule));
- rt.global().setProperty(
- rt,
- facebook::jsi::PropNameID::forAscii(rt, "CommRustModule"),
- facebook::jsi::Object::createFromHostObject(rt, rustNativeModule));
- rt.global().setProperty(
- rt,
- facebook::jsi::PropNameID::forAscii(rt, "CommConstants"),
- facebook::jsi::Object::createFromHostObject(rt, nativeConstants));
- }
- };
- const auto installer =
- reanimated::REAJSIExecutorRuntimeInstaller(bridge, commRuntimeInstaller);
-
- return std::make_unique<HermesExecutorFactory>(
- facebook::react::RCTJSIExecutorRuntimeInstaller(installer),
- JSIExecutor::defaultTimeoutInvoker,
- makeRuntimeConfig(3072));
-}
-
-- (void)attemptDatabaseInitialization {
- std::string sqliteFilePath =
- std::string([[Tools getSQLiteFilePath] UTF8String]);
- // Previous Comm versions used app group location for SQLite
- // database, so that NotificationService was able to acces it directly.
- // Unfortunately it caused errores related to system locks. The code
- // below re-migrates SQLite from app group to app specific location
- // on devices where previous Comm version was installed.
- NSString *appGroupSQLiteFilePath = [Tools getAppGroupSQLiteFilePath];
- if ([NSFileManager.defaultManager fileExistsAtPath:appGroupSQLiteFilePath] &&
- std::rename(
- std::string([appGroupSQLiteFilePath UTF8String]).c_str(),
- sqliteFilePath.c_str())) {
- throw std::runtime_error(
- "Failed to move SQLite database from app group to default location");
- }
- comm::GlobalDBSingleton::instance.scheduleOrRun([&sqliteFilePath]() {
- comm::DatabaseManager::initializeQueryExecutor(sqliteFilePath);
- });
-}
-
-- (void)moveMessagesToDatabase:(BOOL)sendBackgroundMessagesInfosToJS {
- TemporaryMessageStorage *temporaryStorage =
- [[TemporaryMessageStorage alloc] init];
- NSArray<NSString *> *messages = [temporaryStorage readAndClearMessages];
-
- if (sendBackgroundMessagesInfosToJS && messages && messages.count) {
- [CommIOSNotifications
- didReceiveBackgroundMessageInfos:@{@"messageInfosArray" : messages}];
- }
-
- for (NSString *message in messages) {
- std::string messageInfos = std::string([message UTF8String]);
- comm::GlobalDBSingleton::instance.scheduleOrRun([messageInfos]() mutable {
- comm::MessageOperationsUtilities::storeMessageInfos(messageInfos);
- });
- }
-
- TemporaryMessageStorage *temporaryRescindsStorage =
- [[TemporaryMessageStorage alloc] initForRescinds];
- NSArray<NSString *> *rescindMessages =
- [temporaryRescindsStorage readAndClearMessages];
- for (NSString *rescindMessage in rescindMessages) {
- NSData *binaryRescindMessage =
- [rescindMessage dataUsingEncoding:NSUTF8StringEncoding];
-
- NSError *jsonError = nil;
- NSDictionary *rescindPayload =
- [NSJSONSerialization JSONObjectWithData:binaryRescindMessage
- options:0
- error:&jsonError];
- if (jsonError) {
- comm::Logger::log(
- "Failed to deserialize persisted rescind payload. Details: " +
- std::string([jsonError.localizedDescription UTF8String]));
- continue;
- }
-
- if (!(rescindPayload[setUnreadStatusKey] && rescindPayload[threadIDKey])) {
- continue;
- }
-
- std::string threadID =
- std::string([rescindPayload[threadIDKey] UTF8String]);
- comm::GlobalDBSingleton::instance.scheduleOrRun([threadID]() mutable {
- comm::ThreadOperations::updateSQLiteUnreadStatus(threadID, false);
- });
- }
-}
-
-- (void)didReceiveNewMessageInfosNSNotification:(NSNotification *)notification {
- [self moveMessagesToDatabase:YES];
- [self scheduleNSEBlobsDeletion];
-}
-
-- (void)registerForNewMessageInfosNotifications {
- [[NSNotificationCenter defaultCenter]
- addObserver:self
- selector:@selector(didReceiveNewMessageInfosNSNotification:)
- name:newMessageInfosNSNotification
- object:nil];
-
- CFNotificationCenterAddObserver(
- CFNotificationCenterGetDarwinNotifyCenter(),
- (__bridge const void *)(self),
- didReceiveNewMessageInfosDarwinNotification,
- newMessageInfosDarwinNotification,
- NULL,
- CFNotificationSuspensionBehaviorDeliverImmediately);
-}
-
-// NSE has limited time to process notifications. Therefore
-// deferable and low priority networking such as fetched
-// blob deletion from blob service should be handled by the
-// main app on a low priority background thread.
-
-- (void)scheduleNSEBlobsDeletion {
- dispatch_async(
- dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0), ^{
- [CommIOSServicesClient.sharedInstance deleteStoredBlobs];
- });
-}
-
-- (void)applicationWillResignActive:(UIApplication *)application {
- [[CommIOSServicesClient sharedInstance] cancelOngoingRequests];
-}
-
-// Copied from
-// ReactAndroid/src/main/java/com/facebook/hermes/reactexecutor/OnLoad.cpp
-static ::hermes::vm::RuntimeConfig
-makeRuntimeConfig(::hermes::vm::gcheapsize_t heapSizeMB) {
- namespace vm = ::hermes::vm;
- auto gcConfigBuilder =
- vm::GCConfig::Builder()
- .withName("RN")
- // For the next two arguments: avoid GC before TTI by initializing the
- // runtime to allocate directly in the old generation, but revert to
- // normal operation when we reach the (first) TTI point.
- .withAllocInYoung(false)
- .withRevertToYGAtTTI(true);
-
- if (heapSizeMB > 0) {
- gcConfigBuilder.withMaxHeapSize(heapSizeMB << 20);
- }
-
-#if DEBUG
- return vm::RuntimeConfig::Builder()
- .withGCConfig(gcConfigBuilder.build())
- .withEnableSampleProfiling(true)
- .build();
-#else
- return vm::RuntimeConfig::Builder()
- .withGCConfig(gcConfigBuilder.build())
- .build();
-#endif
-}
-
-@end
diff --git a/native/ios/Comm/AppDelegate.swift b/native/ios/Comm/AppDelegate.swift
new file mode 100644
--- /dev/null
+++ b/native/ios/Comm/AppDelegate.swift
@@ -0,0 +1,176 @@
+import Expo
+import React
+import ReactAppDependencyProvider
+import Foundation
+
+let newMessageInfosNSNotification = Notification.Name("app.comm.ns_new_message_infos")
+let newMessageInfosDarwinNotification: CFString = ("app.comm.darwin_new_message_infos") as CFString
+
+func didReceiveNewMessageInfosDarwinNotification(
+ center: CFNotificationCenter?,
+ observer: UnsafeMutableRawPointer?,
+ name: CFNotificationName?,
+ object: UnsafeRawPointer?,
+ userInfo: CFDictionary?
+) {
+ NotificationCenter.default.post(name: newMessageInfosNSNotification, object: nil)
+}
+
+@UIApplicationMain
+public class AppDelegate: ExpoAppDelegate {
+ var window: UIWindow?
+
+ var reactNativeDelegate: ExpoReactNativeFactoryDelegate?
+ var reactNativeFactory: RCTReactNativeFactory?
+
+ public override func application(
+ _ application: UIApplication,
+ willFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]? = nil
+ ) -> Bool {
+ DBInit.attemptDatabaseInitialization()
+ registerForNewMessageInfosNotifications()
+ DBInit.initMMKV()
+ return true
+ }
+
+ public override func application(
+ _ application: UIApplication,
+ didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]? = nil
+ ) -> Bool {
+ DBInit.moveMessages(toDatabase: false)
+ scheduleNSEBlobsDeletion();
+ do {
+ try AVAudioSession.sharedInstance().setCategory(AVAudioSession.Category.ambient)
+ } catch {
+
+ }
+
+ let delegate = ReactNativeDelegate()
+ let factory = ExpoReactNativeFactory(delegate: delegate)
+ delegate.dependencyProvider = RCTAppDependencyProvider()
+
+ reactNativeDelegate = delegate
+ reactNativeFactory = factory
+ bindReactNativeFactory(factory)
+
+#if os(iOS) || os(tvOS)
+ window = UIWindow(frame: UIScreen.main.bounds)
+ factory.startReactNative(
+ withModuleName: "Comm",
+ in: window,
+ launchOptions: launchOptions)
+#endif
+
+ if let launchScreenView = UIStoryboard.init(name: "SplashScreen", bundle: nil).instantiateInitialViewController()?.view {
+ if let bounds = window?.bounds {
+ launchScreenView.frame = bounds;
+ }
+ if let rootView = (window?.rootViewController?.view as? RCTRootView) {
+ rootView.backgroundColor = UIColor.systemBackground
+ rootView.loadingView = launchScreenView
+ rootView.loadingViewFadeDelay = 0
+ rootView.loadingViewFadeDuration = 0.001
+ }
+ }
+
+ return super.application(application, didFinishLaunchingWithOptions: launchOptions)
+ }
+
+ // Linking API
+ public override func application(
+ _ app: UIApplication,
+ open url: URL,
+ options: [UIApplication.OpenURLOptionsKey: Any] = [:]
+ ) -> Bool {
+ return super.application(app, open: url, options: options) || RCTLinkingManager.application(app, open: url, options: options)
+ }
+
+ // Universal Links
+ public override func application(
+ _ application: UIApplication,
+ continue userActivity: NSUserActivity,
+ restorationHandler: @escaping ([UIUserActivityRestoring]?) -> Void
+ ) -> Bool {
+ let result = RCTLinkingManager.application(application, continue: userActivity, restorationHandler: restorationHandler)
+ return super.application(application, continue: userActivity, restorationHandler: restorationHandler) || result
+ }
+
+ public override func application(
+ _ application: UIApplication,
+ didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data
+ ) {
+ CommIOSNotifications.didRegisterForRemoteNotifications(withDeviceToken: deviceToken)
+ }
+
+ public override func application(
+ _ application: UIApplication,
+ didFailToRegisterForRemoteNotificationsWithError error: Error
+ ) {
+ CommIOSNotifications.didFailToRegisterForRemoteNotificationsWithError(error)
+ }
+
+ // Required for the notification event. You must call the completion handler
+ // after handling the remote notification.
+ public override func application(
+ _ application: UIApplication,
+ didReceiveRemoteNotification notification: [AnyHashable : Any],
+ fetchCompletionHandler completionHandler: @escaping (UIBackgroundFetchResult) -> Void
+ ) {
+ CommIOSNotifications.didReceiveRemoteNotification(notification, fetchCompletionHandler: completionHandler)
+ }
+
+ @objc private func didReceiveNewMessageInfosNSNotification(notification: Notification) {
+ DBInit.moveMessages(toDatabase: true)
+ scheduleNSEBlobsDeletion()
+ }
+
+ private func registerForNewMessageInfosNotifications() {
+ NotificationCenter.default.addObserver(
+ self,
+ selector: #selector(self.didReceiveNewMessageInfosNSNotification(notification:)),
+ name: newMessageInfosNSNotification,
+ object: nil
+ )
+
+ CFNotificationCenterAddObserver(
+ CFNotificationCenterGetDarwinNotifyCenter(),
+ Unmanaged.passUnretained(self).toOpaque(),
+ didReceiveNewMessageInfosDarwinNotification,
+ newMessageInfosDarwinNotification,
+ nil,
+ CFNotificationSuspensionBehavior.deliverImmediately
+ )
+ }
+
+ // NSE has limited time to process notifications. Therefore
+ // deferable and low priority networking such as fetched
+ // blob deletion from blob service should be handled by the
+ // main app on a low priority background thread.
+
+ private func scheduleNSEBlobsDeletion() {
+ DispatchQueue.global(qos: .background).async {
+ (CommIOSServicesClient.sharedInstance() as? CommIOSServicesClient)?.deleteStoredBlobs()
+ }
+ }
+
+ public override func applicationWillResignActive(_ application: UIApplication) {
+ (CommIOSServicesClient.sharedInstance() as? CommIOSServicesClient)?.cancelOngoingRequests()
+ }
+}
+
+class ReactNativeDelegate: ExpoReactNativeFactoryDelegate {
+ // Extension point for config-plugins
+
+ override func sourceURL(for bridge: RCTBridge) -> URL? {
+ // needed to return the correct URL for expo-dev-client.
+ bridge.bundleURL ?? bundleURL()
+ }
+
+ override func bundleURL() -> URL? {
+#if DEBUG
+ return RCTBundleURLProvider.sharedSettings().jsBundleURL(forBundleRoot: ".expo/.virtual-metro-entry")
+#else
+ return Bundle.main.url(forResource: "main", withExtension: "jsbundle")
+#endif
+ }
+}
diff --git a/native/ios/Comm/DBInit.h b/native/ios/Comm/DBInit.h
new file mode 100644
--- /dev/null
+++ b/native/ios/Comm/DBInit.h
@@ -0,0 +1,9 @@
+#import <Foundation/Foundation.h>
+
+@interface DBInit : NSObject
+
++ (void)attemptDatabaseInitialization;
++ (void)moveMessagesToDatabase:(BOOL)sendBackgroundMessagesInfosToJS;
++ (void)initMMKV;
+
+@end
diff --git a/native/ios/Comm/DBInit.mm b/native/ios/Comm/DBInit.mm
new file mode 100644
--- /dev/null
+++ b/native/ios/Comm/DBInit.mm
@@ -0,0 +1,98 @@
+#import "DBInit.h"
+#import "CommConstants.h"
+#import "CommCoreModule.h"
+#import "CommIOSNotifications.h"
+#import "CommIOSServicesClient.h"
+#import "CommMMKV.h"
+#import "CommRustModule.h"
+#import "CommUtilsModule.h"
+#import "GlobalDBSingleton.h"
+#import "Logger.h"
+#import "MessageOperationsUtilities.h"
+#import "TemporaryMessageStorage.h"
+#import "ThreadOperations.h"
+#import "Tools.h"
+#import <cstdio>
+#import <stdexcept>
+#import <string>
+
+NSString *const setUnreadStatusKey = @"setUnreadStatus";
+NSString *const threadIDKey = @"threadID";
+
+@implementation DBInit
+
++ (void)attemptDatabaseInitialization {
+ std::string sqliteFilePath =
+ std::string([[Tools getSQLiteFilePath] UTF8String]);
+ // Previous Comm versions used app group location for SQLite
+ // database, so that NotificationService was able to acces it directly.
+ // Unfortunately it caused errores related to system locks. The code
+ // below re-migrates SQLite from app group to app specific location
+ // on devices where previous Comm version was installed.
+ NSString *appGroupSQLiteFilePath = [Tools getAppGroupSQLiteFilePath];
+ if ([NSFileManager.defaultManager fileExistsAtPath:appGroupSQLiteFilePath] &&
+ std::rename(
+ std::string([appGroupSQLiteFilePath UTF8String]).c_str(),
+ sqliteFilePath.c_str())) {
+ throw std::runtime_error(
+ "Failed to move SQLite database from app group to default location");
+ }
+ comm::GlobalDBSingleton::instance.scheduleOrRun([&sqliteFilePath]() {
+ comm::DatabaseManager::initializeQueryExecutor(sqliteFilePath);
+ });
+}
+
++ (void)moveMessagesToDatabase:(BOOL)sendBackgroundMessagesInfosToJS {
+ TemporaryMessageStorage *temporaryStorage =
+ [[TemporaryMessageStorage alloc] init];
+ NSArray<NSString *> *messages = [temporaryStorage readAndClearMessages];
+
+ if (sendBackgroundMessagesInfosToJS && messages && messages.count) {
+ [CommIOSNotifications
+ didReceiveBackgroundMessageInfos:@{@"messageInfosArray" : messages}];
+ }
+
+ for (NSString *message in messages) {
+ std::string messageInfos = std::string([message UTF8String]);
+ comm::GlobalDBSingleton::instance.scheduleOrRun([messageInfos]() mutable {
+ comm::MessageOperationsUtilities::storeMessageInfos(messageInfos);
+ });
+ }
+
+ TemporaryMessageStorage *temporaryRescindsStorage =
+ [[TemporaryMessageStorage alloc] initForRescinds];
+ NSArray<NSString *> *rescindMessages =
+ [temporaryRescindsStorage readAndClearMessages];
+ for (NSString *rescindMessage in rescindMessages) {
+ NSData *binaryRescindMessage =
+ [rescindMessage dataUsingEncoding:NSUTF8StringEncoding];
+
+ NSError *jsonError = nil;
+ NSDictionary *rescindPayload =
+ [NSJSONSerialization JSONObjectWithData:binaryRescindMessage
+ options:0
+ error:&jsonError];
+ if (jsonError) {
+ comm::Logger::log(
+ "Failed to deserialize persisted rescind payload. Details: " +
+ std::string([jsonError.localizedDescription UTF8String]));
+ continue;
+ }
+
+ if (!(rescindPayload[setUnreadStatusKey] && rescindPayload[threadIDKey])) {
+ continue;
+ }
+
+ std::string threadID =
+ std::string([rescindPayload[threadIDKey] UTF8String]);
+ comm::GlobalDBSingleton::instance.scheduleOrRun([threadID]() mutable {
+ comm::ThreadOperations::updateSQLiteUnreadStatus(threadID, false);
+ });
+ }
+}
+
++ (void)initMMKV {
+ comm::CommMMKV::initialize();
+}
+
+@end
diff --git a/native/ios/Comm/main.m b/native/ios/Comm/main.m
deleted file mode 100644
--- a/native/ios/Comm/main.m
+++ /dev/null
@@ -1,10 +0,0 @@
-#import <UIKit/UIKit.h>
-
-#import "AppDelegate.h"
-
-int main(int argc, char *argv[]) {
- @autoreleasepool {
- return UIApplicationMain(
- argc, argv, nil, NSStringFromClass([AppDelegate class]));
- }
-}
File Metadata
Details
Attached
Mime Type
text/plain
Expires
Sun, Dec 7, 1:47 AM (14 h, 42 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
5842022
Default Alt Text
D14977.1765072034.diff (36 KB)
Attached To
Mode
D14977: [native][RN79][skip-ci] Migrate AppDelegate to Swift
Attached
Detach File
Event Timeline
Log In to Comment