Leon 2 jaren geleden
bovenliggende
commit
540832f547

+ 10 - 0
ios/AppDelegate.h

@@ -0,0 +1,10 @@
+#import <React/RCTBridgeDelegate.h>
+#import <JPUSHService.h>
+#import <Expo/Expo.h>
+#import <UIKit/UIKit.h>
+
+@interface AppDelegate : EXAppDelegateWrapper <UIApplicationDelegate, RCTBridgeDelegate,JPUSHRegisterDelegate>
+
+@property (nonatomic, strong) UIWindow *window;
+
+@end

+ 66 - 65
ios/hola/AppDelegate.mm → ios/AppDelegate.mm

@@ -5,7 +5,8 @@
 #import <React/RCTRootView.h>
 
 #import <React/RCTAppSetupUtils.h>
-//#import <RCTJPushModule.h>
+#import <RCTJPushModule.h>
+
 #if RCT_NEW_ARCH_ENABLED
 #import <React/CoreModulesPlugins.h>
 #import <React/RCTCxxBridgeDelegate.h>
@@ -32,11 +33,11 @@ static NSString *const kRNConcurrentRoot = @"concurrentRoot";
 - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
 {
   // APNS
-//    JPUSHRegisterEntity * entity = [[JPUSHRegisterEntity alloc] init];
-//    if (@available(iOS 12.0, *)) {
-//      entity.types = JPAuthorizationOptionNone; //JPAuthorizationOptionAlert|JPAuthorizationOptionBadge|JPAuthorizationOptionSou//nd|JPAuthorizationOptionProvidesAppNotificationSettings;
-//    }
-//    [JPUSHService registerForRemoteNotificationConfig:entity delegate:self];
+    JPUSHRegisterEntity * entity = [[JPUSHRegisterEntity alloc] init];
+    if (@available(iOS 12.0, *)) {
+      entity.types = JPAuthorizationOptionNone; //JPAuthorizationOptionAlert|JPAuthorizationOptionBadge|JPAuthorizationOptionSou//nd|JPAuthorizationOptionProvidesAppNotificationSettings;
+    }
+    [JPUSHService registerForRemoteNotificationConfig:entity delegate:self];
   
   RCTAppSetupPrepareApp(application);
 
@@ -137,65 +138,65 @@ static NSString *const kRNConcurrentRoot = @"concurrentRoot";
 
 //************************************************JPush start************************************************
 
-////注册 APNS 成功并上报 DeviceToken
-//- (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken {
-//  [JPUSHService registerDeviceToken:deviceToken];
-//}
-//
-////iOS 7 APNS
-//- (void)application:(UIApplication *)application didReceiveRemoteNotification:  (NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler {
-//  // iOS 10 以下 Required
-//  NSLog(@"iOS 7 APNS");
-//  [JPUSHService handleRemoteNotification:userInfo];
-//  [[NSNotificationCenter defaultCenter] postNotificationName:J_APNS_NOTIFICATION_ARRIVED_EVENT object:userInfo];
-//  completionHandler(UIBackgroundFetchResultNewData);
-//}
-//
-////iOS 10 前台收到消息
-//- (void)jpushNotificationCenter:(UNUserNotificationCenter *)center  willPresentNotification:(UNNotification *)notification withCompletionHandler:(void (^)(NSInteger))completionHandler {
-//  NSDictionary * userInfo = notification.request.content.userInfo;
-//  if([notification.request.trigger isKindOfClass:[UNPushNotificationTrigger class]]) {
-//    // Apns
-//    NSLog(@"iOS 10 APNS 前台收到消息");
-//    [JPUSHService handleRemoteNotification:userInfo];
-//    [[NSNotificationCenter defaultCenter] postNotificationName:J_APNS_NOTIFICATION_ARRIVED_EVENT object:userInfo];
-//  }
-//  else {
-//    // 本地通知 todo
-//    NSLog(@"iOS 10 本地通知 前台收到消息");
-//    [[NSNotificationCenter defaultCenter] postNotificationName:J_LOCAL_NOTIFICATION_ARRIVED_EVENT object:userInfo];
-//  }
-//  //需要执行这个方法,选择是否提醒用户,有 Badge、Sound、Alert 三种类型可以选择设置
-//  completionHandler(UNNotificationPresentationOptionAlert);
-//}
-//
-////iOS 10 消息事件回调
-//- (void)jpushNotificationCenter:(UNUserNotificationCenter *)center didReceiveNotificationResponse:(UNNotificationResponse *)response withCompletionHandler: (void (^)(void))completionHandler {
-//  NSDictionary * userInfo = response.notification.request.content.userInfo;
-//  if([response.notification.request.trigger isKindOfClass:[UNPushNotificationTrigger class]]) {
-//    // Apns
-//    NSLog(@"iOS 10 APNS 消息事件回调");
-//    [JPUSHService handleRemoteNotification:userInfo];
-//    // 保障应用被杀死状态下,用户点击推送消息,打开app后可以收到点击通知事件
-//    [[RCTJPushEventQueue sharedInstance]._notificationQueue insertObject:userInfo atIndex:0];
-//    [[NSNotificationCenter defaultCenter] postNotificationName:J_APNS_NOTIFICATION_OPENED_EVENT object:userInfo];
-//  }
-//  else {
-//    // 本地通知
-//    NSLog(@"iOS 10 本地通知 消息事件回调");
-//    // 保障应用被杀死状态下,用户点击推送消息,打开app后可以收到点击通知事件
-//    [[RCTJPushEventQueue sharedInstance]._localNotificationQueue insertObject:userInfo atIndex:0];
-//    [[NSNotificationCenter defaultCenter] postNotificationName:J_LOCAL_NOTIFICATION_OPENED_EVENT object:userInfo];
-//  }
-//  // 系统要求执行这个方法
-//  completionHandler();
-//}
-//
-////自定义消息
-//- (void)networkDidReceiveMessage:(NSNotification *)notification {
-//  NSDictionary * userInfo = [notification userInfo];
-//  [[NSNotificationCenter defaultCenter] postNotificationName:J_CUSTOM_NOTIFICATION_EVENT object:userInfo];
-//}
+//注册 APNS 成功并上报 DeviceToken
+- (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken {
+  [JPUSHService registerDeviceToken:deviceToken];
+}
+
+//iOS 7 APNS
+- (void)application:(UIApplication *)application didReceiveRemoteNotification:  (NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler {
+  // iOS 10 以下 Required
+  NSLog(@"iOS 7 APNS");
+  [JPUSHService handleRemoteNotification:userInfo];
+  [[NSNotificationCenter defaultCenter] postNotificationName:J_APNS_NOTIFICATION_ARRIVED_EVENT object:userInfo];
+  completionHandler(UIBackgroundFetchResultNewData);
+}
+
+//iOS 10 前台收到消息
+- (void)jpushNotificationCenter:(UNUserNotificationCenter *)center  willPresentNotification:(UNNotification *)notification withCompletionHandler:(void (^)(NSInteger))completionHandler {
+  NSDictionary * userInfo = notification.request.content.userInfo;
+  if([notification.request.trigger isKindOfClass:[UNPushNotificationTrigger class]]) {
+    // Apns
+    NSLog(@"iOS 10 APNS 前台收到消息");
+    [JPUSHService handleRemoteNotification:userInfo];
+    [[NSNotificationCenter defaultCenter] postNotificationName:J_APNS_NOTIFICATION_ARRIVED_EVENT object:userInfo];
+  }
+  else {
+    // 本地通知 todo
+    NSLog(@"iOS 10 本地通知 前台收到消息");
+    [[NSNotificationCenter defaultCenter] postNotificationName:J_LOCAL_NOTIFICATION_ARRIVED_EVENT object:userInfo];
+  }
+  //需要执行这个方法,选择是否提醒用户,有 Badge、Sound、Alert 三种类型可以选择设置
+  completionHandler(UNNotificationPresentationOptionAlert);
+}
+
+//iOS 10 消息事件回调
+- (void)jpushNotificationCenter:(UNUserNotificationCenter *)center didReceiveNotificationResponse:(UNNotificationResponse *)response withCompletionHandler: (void (^)(void))completionHandler {
+  NSDictionary * userInfo = response.notification.request.content.userInfo;
+  if([response.notification.request.trigger isKindOfClass:[UNPushNotificationTrigger class]]) {
+    // Apns
+    NSLog(@"iOS 10 APNS 消息事件回调");
+    [JPUSHService handleRemoteNotification:userInfo];
+    // 保障应用被杀死状态下,用户点击推送消息,打开app后可以收到点击通知事件
+    [[RCTJPushEventQueue sharedInstance]._notificationQueue insertObject:userInfo atIndex:0];
+    [[NSNotificationCenter defaultCenter] postNotificationName:J_APNS_NOTIFICATION_OPENED_EVENT object:userInfo];
+  }
+  else {
+    // 本地通知
+    NSLog(@"iOS 10 本地通知 消息事件回调");
+    // 保障应用被杀死状态下,用户点击推送消息,打开app后可以收到点击通知事件
+    [[RCTJPushEventQueue sharedInstance]._localNotificationQueue insertObject:userInfo atIndex:0];
+    [[NSNotificationCenter defaultCenter] postNotificationName:J_LOCAL_NOTIFICATION_OPENED_EVENT object:userInfo];
+  }
+  // 系统要求执行这个方法
+  completionHandler();
+}
+
+//自定义消息
+- (void)networkDidReceiveMessage:(NSNotification *)notification {
+  NSDictionary * userInfo = [notification userInfo];
+  [[NSNotificationCenter defaultCenter] postNotificationName:J_CUSTOM_NOTIFICATION_EVENT object:userInfo];
+}
 
 
 @end

+ 15 - 0
ios/AppDelegateTemp.h

@@ -0,0 +1,15 @@
+/**
+ * Copyright (c) Facebook, Inc. and its affiliates.
+ *
+ * This source code is licensed under the MIT license found in the
+ * LICENSE file in the root directory of this source tree.
+ */
+
+#import <React/RCTBridgeDelegate.h>
+#import <UIKit/UIKit.h>
+
+@interface AppDelegate : UIResponder <UIApplicationDelegate, RCTBridgeDelegate>
+
+@property (nonatomic, strong) UIWindow *window;
+
+@end

+ 131 - 0
ios/AppDelegateTemp.mm

@@ -0,0 +1,131 @@
+/**
+ * Copyright (c) Facebook, Inc. and its affiliates.
+ *
+ * This source code is licensed under the MIT license found in the
+ * LICENSE file in the root directory of this source tree.
+ */
+
+#import "AppDelegate.h"
+
+#import <RCTJPushModule.h>
+
+#import <React/RCTBridge.h>
+#import <React/RCTBundleURLProvider.h>
+#import <React/RCTRootView.h>
+
+#ifdef NSFoundationVersionNumber_iOS_9_x_Max
+#import <UserNotifications/UserNotifications.h>
+#endif
+
+@interface AppDelegate ()<JPUSHRegisterDelegate>
+
+@end
+
+@implementation AppDelegate
+
+- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions{
+  // JPush初始化配置 可以延时初始化 不再强制在此初始化,在js里可以直接调用init
+//  [JPUSHService setupWithOption:launchOptions appKey:@"02c7f79c9248ecadf25140f7"
+//                        channel:@"dev" apsForProduction:YES];
+  // APNS
+  JPUSHRegisterEntity * entity = [[JPUSHRegisterEntity alloc] init];
+  if (@available(iOS 12.0, *)) {
+    entity.types = JPAuthorizationOptionNone; //JPAuthorizationOptionAlert|JPAuthorizationOptionBadge|JPAuthorizationOptionSou//nd|JPAuthorizationOptionProvidesAppNotificationSettings;
+  }
+  [JPUSHService registerForRemoteNotificationConfig:entity delegate:self];
+  
+  
+//  [launchOptions objectForKey: UIApplicationLaunchOptionsRemoteNotificationKey];
+//  // 自定义消息
+//  NSNotificationCenter *defaultCenter = [NSNotificationCenter defaultCenter];
+//  [defaultCenter addObserver:self selector:@selector(networkDidReceiveMessage:) name:kJPFNetworkDidReceiveMessageNotification object:nil];
+//  // 地理围栏
+//  [JPUSHService registerLbsGeofenceDelegate:self withLaunchOptions:launchOptions];
+  // ReactNative环境配置
+  RCTBridge *bridge = [[RCTBridge alloc] initWithDelegate:self launchOptions:launchOptions];
+  RCTRootView *rootView = [[RCTRootView alloc] initWithBridge:bridge
+                                                   moduleName:@"example"
+                                            initialProperties:nil];
+  rootView.backgroundColor = [[UIColor alloc] initWithRed:1.0f green:1.0f blue:1.0f alpha:1];
+  self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds];
+  UIViewController *rootViewController = [UIViewController new];
+  rootViewController.view = rootView;
+  self.window.rootViewController = rootViewController;
+  [self.window makeKeyAndVisible];
+  return YES;
+}
+
+- (NSURL *)sourceURLForBridge:(RCTBridge *)bridge
+{
+#if DEBUG
+  return [[RCTBundleURLProvider sharedSettings] jsBundleURLForBundleRoot:@"index" fallbackResource:nil];
+#else
+  return [[NSBundle mainBundle] URLForResource:@"main" withExtension:@"jsbundle"];
+#endif
+}
+
+//************************************************JPush start************************************************
+
+//注册 APNS 成功并上报 DeviceToken
+- (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken {
+  [JPUSHService registerDeviceToken:deviceToken];
+}
+
+//iOS 7 APNS
+- (void)application:(UIApplication *)application didReceiveRemoteNotification:  (NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler {
+  // iOS 10 以下 Required
+  NSLog(@"iOS 7 APNS");
+  [JPUSHService handleRemoteNotification:userInfo];
+  [[NSNotificationCenter defaultCenter] postNotificationName:J_APNS_NOTIFICATION_ARRIVED_EVENT object:userInfo];
+  completionHandler(UIBackgroundFetchResultNewData);
+}
+
+//iOS 10 前台收到消息
+- (void)jpushNotificationCenter:(UNUserNotificationCenter *)center  willPresentNotification:(UNNotification *)notification withCompletionHandler:(void (^)(NSInteger))completionHandler {
+  NSDictionary * userInfo = notification.request.content.userInfo;
+  if([notification.request.trigger isKindOfClass:[UNPushNotificationTrigger class]]) {
+    // Apns
+    NSLog(@"iOS 10 APNS 前台收到消息");
+    [JPUSHService handleRemoteNotification:userInfo];
+    [[NSNotificationCenter defaultCenter] postNotificationName:J_APNS_NOTIFICATION_ARRIVED_EVENT object:userInfo];
+  }
+  else {
+    // 本地通知 todo
+    NSLog(@"iOS 10 本地通知 前台收到消息");
+    [[NSNotificationCenter defaultCenter] postNotificationName:J_LOCAL_NOTIFICATION_ARRIVED_EVENT object:userInfo];
+  }
+  //需要执行这个方法,选择是否提醒用户,有 Badge、Sound、Alert 三种类型可以选择设置
+  completionHandler(UNNotificationPresentationOptionAlert);
+}
+
+//iOS 10 消息事件回调
+- (void)jpushNotificationCenter:(UNUserNotificationCenter *)center didReceiveNotificationResponse:(UNNotificationResponse *)response withCompletionHandler: (void (^)(void))completionHandler {
+  NSDictionary * userInfo = response.notification.request.content.userInfo;
+  if([response.notification.request.trigger isKindOfClass:[UNPushNotificationTrigger class]]) {
+    // Apns
+    NSLog(@"iOS 10 APNS 消息事件回调");
+    [JPUSHService handleRemoteNotification:userInfo];
+    // 保障应用被杀死状态下,用户点击推送消息,打开app后可以收到点击通知事件
+    [[RCTJPushEventQueue sharedInstance]._notificationQueue insertObject:userInfo atIndex:0];
+    [[NSNotificationCenter defaultCenter] postNotificationName:J_APNS_NOTIFICATION_OPENED_EVENT object:userInfo];
+  }
+  else {
+    // 本地通知
+    NSLog(@"iOS 10 本地通知 消息事件回调");
+    // 保障应用被杀死状态下,用户点击推送消息,打开app后可以收到点击通知事件
+    [[RCTJPushEventQueue sharedInstance]._localNotificationQueue insertObject:userInfo atIndex:0];
+    [[NSNotificationCenter defaultCenter] postNotificationName:J_LOCAL_NOTIFICATION_OPENED_EVENT object:userInfo];
+  }
+  // 系统要求执行这个方法
+  completionHandler();
+}
+
+//自定义消息
+- (void)networkDidReceiveMessage:(NSNotification *)notification {
+  NSDictionary * userInfo = [notification userInfo];
+  [[NSNotificationCenter defaultCenter] postNotificationName:J_CUSTOM_NOTIFICATION_EVENT object:userInfo];
+}
+
+//************************************************JPush end************************************************
+
+@end

+ 67 - 63
ios/hola.xcodeproj/project.pbxproj

@@ -8,16 +8,16 @@
 
 /* Begin PBXBuildFile section */
 		00E356F31AD99517003FC87E /* holaTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 00E356F21AD99517003FC87E /* holaTests.m */; };
-		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 */; };
+		1616AFC2E937999F0F295448 /* libPods-hola.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 229FCE8257EC1AADB7D7D16E /* libPods-hola.a */; };
 		35319C272B2773AB00471ACA /* libz.tbd in Frameworks */ = {isa = PBXBuildFile; fileRef = 35319C262B2773AB00471ACA /* libz.tbd */; };
 		35319C292B2773B600471ACA /* libresolv.tbd in Frameworks */ = {isa = PBXBuildFile; fileRef = 35319C282B2773B600471ACA /* libresolv.tbd */; };
 		35319C2B2B2773BE00471ACA /* UserNotifications.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 35319C2A2B2773BE00471ACA /* UserNotifications.framework */; };
+		35B0D6E02B4D4EE10059F156 /* AppDelegate.mm in Sources */ = {isa = PBXBuildFile; fileRef = 35B0D6DF2B4D4EE10059F156 /* AppDelegate.mm */; };
 		579F4B7496BF069C27C20BC7 /* ExpoModulesProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = 064FE7D59874E5A1126C807C /* ExpoModulesProvider.swift */; };
-		589C1FB4AA5701C79971DD81 /* libPods-hola-holaTests.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 8AAE9F8592CF06668475AFFB /* libPods-hola-holaTests.a */; };
+		682C35EF43DC55E8D625554F /* libPods-hola-holaTests.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 5C2DF1055D750361F8EB3838 /* libPods-hola-holaTests.a */; };
 		81AB9BB82411601600AC10FF /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 81AB9BB72411601600AC10FF /* LaunchScreen.storyboard */; };
-		867C7DD4FFE23E00C4C0C489 /* libPods-hola.a in Frameworks */ = {isa = PBXBuildFile; fileRef = C1A155D64897F048ABABF108 /* libPods-hola.a */; };
 		D840888E11B75659D34CCA71 /* ExpoModulesProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = ED392737ABFDE2508D91B66F /* ExpoModulesProvider.swift */; };
 /* End PBXBuildFile section */
 
@@ -37,21 +37,22 @@
 		00E356F21AD99517003FC87E /* holaTests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = holaTests.m; sourceTree = "<group>"; };
 		064FE7D59874E5A1126C807C /* ExpoModulesProvider.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ExpoModulesProvider.swift; path = "Pods/Target Support Files/Pods-hola-holaTests/ExpoModulesProvider.swift"; sourceTree = "<group>"; };
 		13B07F961A680F5B00A75B9A /* hola.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = hola.app; sourceTree = BUILT_PRODUCTS_DIR; };
-		13B07FAF1A68108700A75B9A /* AppDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = AppDelegate.h; path = hola/AppDelegate.h; sourceTree = "<group>"; };
-		13B07FB01A68108700A75B9A /* AppDelegate.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; name = AppDelegate.mm; path = hola/AppDelegate.mm; sourceTree = "<group>"; };
 		13B07FB51A68108700A75B9A /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; name = Images.xcassets; path = hola/Images.xcassets; sourceTree = "<group>"; };
 		13B07FB61A68108700A75B9A /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = Info.plist; path = hola/Info.plist; sourceTree = "<group>"; };
 		13B07FB71A68108700A75B9A /* main.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = main.m; path = hola/main.m; sourceTree = "<group>"; };
+		229FCE8257EC1AADB7D7D16E /* libPods-hola.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-hola.a"; sourceTree = BUILT_PRODUCTS_DIR; };
 		35319C262B2773AB00471ACA /* libz.tbd */ = {isa = PBXFileReference; lastKnownFileType = "sourcecode.text-based-dylib-definition"; name = libz.tbd; path = usr/lib/libz.tbd; sourceTree = SDKROOT; };
 		35319C282B2773B600471ACA /* libresolv.tbd */ = {isa = PBXFileReference; lastKnownFileType = "sourcecode.text-based-dylib-definition"; name = libresolv.tbd; path = usr/lib/libresolv.tbd; sourceTree = SDKROOT; };
 		35319C2A2B2773BE00471ACA /* UserNotifications.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UserNotifications.framework; path = System/Library/Frameworks/UserNotifications.framework; sourceTree = SDKROOT; };
-		6502F77A49B592A71F1EDF93 /* Pods-hola-holaTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-hola-holaTests.debug.xcconfig"; path = "Target Support Files/Pods-hola-holaTests/Pods-hola-holaTests.debug.xcconfig"; sourceTree = "<group>"; };
-		74EC722D7CF582147AB1768A /* Pods-hola.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-hola.debug.xcconfig"; path = "Target Support Files/Pods-hola/Pods-hola.debug.xcconfig"; sourceTree = "<group>"; };
+		35B0D6DE2B4D4EE10059F156 /* AppDelegate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = AppDelegate.h; sourceTree = "<group>"; };
+		35B0D6DF2B4D4EE10059F156 /* AppDelegate.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; path = AppDelegate.mm; sourceTree = "<group>"; };
+		35B0D6E12B4D58540059F156 /* hola.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; name = hola.entitlements; path = hola/hola.entitlements; sourceTree = "<group>"; };
+		35D120583D7F592A3931F5B3 /* Pods-hola.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-hola.release.xcconfig"; path = "Target Support Files/Pods-hola/Pods-hola.release.xcconfig"; sourceTree = "<group>"; };
+		5C2DF1055D750361F8EB3838 /* libPods-hola-holaTests.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-hola-holaTests.a"; sourceTree = BUILT_PRODUCTS_DIR; };
+		79481516D62ED012C19B3DCA /* Pods-hola.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-hola.debug.xcconfig"; path = "Target Support Files/Pods-hola/Pods-hola.debug.xcconfig"; sourceTree = "<group>"; };
 		81AB9BB72411601600AC10FF /* LaunchScreen.storyboard */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.storyboard; name = LaunchScreen.storyboard; path = hola/LaunchScreen.storyboard; sourceTree = "<group>"; };
-		8AAE9F8592CF06668475AFFB /* libPods-hola-holaTests.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-hola-holaTests.a"; sourceTree = BUILT_PRODUCTS_DIR; };
-		C1A155D64897F048ABABF108 /* libPods-hola.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-hola.a"; sourceTree = BUILT_PRODUCTS_DIR; };
-		CF4A209C03F78431E19C436D /* Pods-hola.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-hola.release.xcconfig"; path = "Target Support Files/Pods-hola/Pods-hola.release.xcconfig"; sourceTree = "<group>"; };
-		DB30B309E741FC430A4E6504 /* Pods-hola-holaTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-hola-holaTests.release.xcconfig"; path = "Target Support Files/Pods-hola-holaTests/Pods-hola-holaTests.release.xcconfig"; sourceTree = "<group>"; };
+		8F320C61A55A2DAC79329C55 /* Pods-hola-holaTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-hola-holaTests.release.xcconfig"; path = "Target Support Files/Pods-hola-holaTests/Pods-hola-holaTests.release.xcconfig"; sourceTree = "<group>"; };
+		AB4A64394957AF054E00E80E /* Pods-hola-holaTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-hola-holaTests.debug.xcconfig"; path = "Target Support Files/Pods-hola-holaTests/Pods-hola-holaTests.debug.xcconfig"; sourceTree = "<group>"; };
 		ED297162215061F000B7C4FE /* JavaScriptCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = JavaScriptCore.framework; path = System/Library/Frameworks/JavaScriptCore.framework; sourceTree = SDKROOT; };
 		ED392737ABFDE2508D91B66F /* ExpoModulesProvider.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ExpoModulesProvider.swift; path = "Pods/Target Support Files/Pods-hola/ExpoModulesProvider.swift"; sourceTree = "<group>"; };
 /* End PBXFileReference section */
@@ -61,7 +62,7 @@
 			isa = PBXFrameworksBuildPhase;
 			buildActionMask = 2147483647;
 			files = (
-				589C1FB4AA5701C79971DD81 /* libPods-hola-holaTests.a in Frameworks */,
+				682C35EF43DC55E8D625554F /* libPods-hola-holaTests.a in Frameworks */,
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 		};
@@ -72,7 +73,7 @@
 				35319C2B2B2773BE00471ACA /* UserNotifications.framework in Frameworks */,
 				35319C292B2773B600471ACA /* libresolv.tbd in Frameworks */,
 				35319C272B2773AB00471ACA /* libz.tbd in Frameworks */,
-				867C7DD4FFE23E00C4C0C489 /* libPods-hola.a in Frameworks */,
+				1616AFC2E937999F0F295448 /* libPods-hola.a in Frameworks */,
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 		};
@@ -99,12 +100,13 @@
 		13B07FAE1A68108700A75B9A /* hola */ = {
 			isa = PBXGroup;
 			children = (
-				13B07FAF1A68108700A75B9A /* AppDelegate.h */,
-				13B07FB01A68108700A75B9A /* AppDelegate.mm */,
+				35B0D6E12B4D58540059F156 /* hola.entitlements */,
 				13B07FB51A68108700A75B9A /* Images.xcassets */,
 				13B07FB61A68108700A75B9A /* Info.plist */,
 				81AB9BB72411601600AC10FF /* LaunchScreen.storyboard */,
 				13B07FB71A68108700A75B9A /* main.m */,
+				35B0D6DE2B4D4EE10059F156 /* AppDelegate.h */,
+				35B0D6DF2B4D4EE10059F156 /* AppDelegate.mm */,
 			);
 			name = hola;
 			sourceTree = "<group>";
@@ -116,8 +118,8 @@
 				35319C282B2773B600471ACA /* libresolv.tbd */,
 				35319C262B2773AB00471ACA /* libz.tbd */,
 				ED297162215061F000B7C4FE /* JavaScriptCore.framework */,
-				C1A155D64897F048ABABF108 /* libPods-hola.a */,
-				8AAE9F8592CF06668475AFFB /* libPods-hola-holaTests.a */,
+				229FCE8257EC1AADB7D7D16E /* libPods-hola.a */,
+				5C2DF1055D750361F8EB3838 /* libPods-hola-holaTests.a */,
 			);
 			name = Frameworks;
 			sourceTree = "<group>";
@@ -174,10 +176,10 @@
 		BBD78D7AC51CEA395F1C20DB /* Pods */ = {
 			isa = PBXGroup;
 			children = (
-				74EC722D7CF582147AB1768A /* Pods-hola.debug.xcconfig */,
-				CF4A209C03F78431E19C436D /* Pods-hola.release.xcconfig */,
-				6502F77A49B592A71F1EDF93 /* Pods-hola-holaTests.debug.xcconfig */,
-				DB30B309E741FC430A4E6504 /* Pods-hola-holaTests.release.xcconfig */,
+				79481516D62ED012C19B3DCA /* Pods-hola.debug.xcconfig */,
+				35D120583D7F592A3931F5B3 /* Pods-hola.release.xcconfig */,
+				AB4A64394957AF054E00E80E /* Pods-hola-holaTests.debug.xcconfig */,
+				8F320C61A55A2DAC79329C55 /* Pods-hola-holaTests.release.xcconfig */,
 			);
 			path = Pods;
 			sourceTree = "<group>";
@@ -197,12 +199,12 @@
 			isa = PBXNativeTarget;
 			buildConfigurationList = 00E357021AD99517003FC87E /* Build configuration list for PBXNativeTarget "holaTests" */;
 			buildPhases = (
-				92EB18701135B12378177FAA /* [CP] Check Pods Manifest.lock */,
+				82B77EC464B8920DAA46A805 /* [CP] Check Pods Manifest.lock */,
 				00E356EA1AD99517003FC87E /* Sources */,
 				00E356EB1AD99517003FC87E /* Frameworks */,
 				00E356EC1AD99517003FC87E /* Resources */,
-				504C429C0C4669A21F79FDAA /* [CP] Embed Pods Frameworks */,
-				55C77C075B0B4D97FE56741C /* [CP] Copy Pods Resources */,
+				4B3959536330E7692C5AAAB0 /* [CP] Embed Pods Frameworks */,
+				71F138D7614EA4DCF1438A8E /* [CP] Copy Pods Resources */,
 			);
 			buildRules = (
 			);
@@ -218,14 +220,14 @@
 			isa = PBXNativeTarget;
 			buildConfigurationList = 13B07F931A680F5B00A75B9A /* Build configuration list for PBXNativeTarget "hola" */;
 			buildPhases = (
-				7F6E04164E2D6F6AF4901CB5 /* [CP] Check Pods Manifest.lock */,
+				C334C6E6C729730030B26EB3 /* [CP] Check Pods Manifest.lock */,
 				FD10A7F022414F080027D42C /* Start Packager */,
 				13B07F871A680F5B00A75B9A /* Sources */,
 				13B07F8C1A680F5B00A75B9A /* Frameworks */,
 				13B07F8E1A680F5B00A75B9A /* Resources */,
 				00DD1BFF1BD5951E006B06BC /* Bundle React Native code and images */,
-				FB09B49D7EBA5195E9500822 /* [CP] Embed Pods Frameworks */,
-				CC0708FABD678C34A902D89C /* [CP] Copy Pods Resources */,
+				A2DB8B71D173E52425DF1056 /* [CP] Embed Pods Frameworks */,
+				1030CD4DB2876089ED4A117B /* [CP] Copy Pods Resources */,
 			);
 			buildRules = (
 			);
@@ -308,63 +310,58 @@
 			shellPath = /bin/sh;
 			shellScript = "set -e\n\nWITH_ENVIRONMENT=\"../node_modules/react-native/scripts/xcode/with-environment.sh\"\nREACT_NATIVE_XCODE=\"../node_modules/react-native/scripts/react-native-xcode.sh\"\n\n/bin/sh -c \"$WITH_ENVIRONMENT $REACT_NATIVE_XCODE\"\n";
 		};
-		504C429C0C4669A21F79FDAA /* [CP] Embed Pods Frameworks */ = {
+		1030CD4DB2876089ED4A117B /* [CP] Copy Pods Resources */ = {
 			isa = PBXShellScriptBuildPhase;
 			buildActionMask = 2147483647;
 			files = (
 			);
 			inputFileListPaths = (
-				"${PODS_ROOT}/Target Support Files/Pods-hola-holaTests/Pods-hola-holaTests-frameworks-${CONFIGURATION}-input-files.xcfilelist",
+				"${PODS_ROOT}/Target Support Files/Pods-hola/Pods-hola-resources-${CONFIGURATION}-input-files.xcfilelist",
 			);
-			name = "[CP] Embed Pods Frameworks";
+			name = "[CP] Copy Pods Resources";
 			outputFileListPaths = (
-				"${PODS_ROOT}/Target Support Files/Pods-hola-holaTests/Pods-hola-holaTests-frameworks-${CONFIGURATION}-output-files.xcfilelist",
+				"${PODS_ROOT}/Target Support Files/Pods-hola/Pods-hola-resources-${CONFIGURATION}-output-files.xcfilelist",
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 			shellPath = /bin/sh;
-			shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-hola-holaTests/Pods-hola-holaTests-frameworks.sh\"\n";
+			shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-hola/Pods-hola-resources.sh\"\n";
 			showEnvVarsInLog = 0;
 		};
-		55C77C075B0B4D97FE56741C /* [CP] Copy Pods Resources */ = {
+		4B3959536330E7692C5AAAB0 /* [CP] Embed Pods Frameworks */ = {
 			isa = PBXShellScriptBuildPhase;
 			buildActionMask = 2147483647;
 			files = (
 			);
 			inputFileListPaths = (
-				"${PODS_ROOT}/Target Support Files/Pods-hola-holaTests/Pods-hola-holaTests-resources-${CONFIGURATION}-input-files.xcfilelist",
+				"${PODS_ROOT}/Target Support Files/Pods-hola-holaTests/Pods-hola-holaTests-frameworks-${CONFIGURATION}-input-files.xcfilelist",
 			);
-			name = "[CP] Copy Pods Resources";
+			name = "[CP] Embed Pods Frameworks";
 			outputFileListPaths = (
-				"${PODS_ROOT}/Target Support Files/Pods-hola-holaTests/Pods-hola-holaTests-resources-${CONFIGURATION}-output-files.xcfilelist",
+				"${PODS_ROOT}/Target Support Files/Pods-hola-holaTests/Pods-hola-holaTests-frameworks-${CONFIGURATION}-output-files.xcfilelist",
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 			shellPath = /bin/sh;
-			shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-hola-holaTests/Pods-hola-holaTests-resources.sh\"\n";
+			shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-hola-holaTests/Pods-hola-holaTests-frameworks.sh\"\n";
 			showEnvVarsInLog = 0;
 		};
-		7F6E04164E2D6F6AF4901CB5 /* [CP] Check Pods Manifest.lock */ = {
+		71F138D7614EA4DCF1438A8E /* [CP] Copy Pods Resources */ = {
 			isa = PBXShellScriptBuildPhase;
 			buildActionMask = 2147483647;
 			files = (
 			);
 			inputFileListPaths = (
+				"${PODS_ROOT}/Target Support Files/Pods-hola-holaTests/Pods-hola-holaTests-resources-${CONFIGURATION}-input-files.xcfilelist",
 			);
-			inputPaths = (
-				"${PODS_PODFILE_DIR_PATH}/Podfile.lock",
-				"${PODS_ROOT}/Manifest.lock",
-			);
-			name = "[CP] Check Pods Manifest.lock";
+			name = "[CP] Copy Pods Resources";
 			outputFileListPaths = (
-			);
-			outputPaths = (
-				"$(DERIVED_FILE_DIR)/Pods-hola-checkManifestLockResult.txt",
+				"${PODS_ROOT}/Target Support Files/Pods-hola-holaTests/Pods-hola-holaTests-resources-${CONFIGURATION}-output-files.xcfilelist",
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 			shellPath = /bin/sh;
-			shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n    # print error to STDERR\n    echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n    exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n";
+			shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-hola-holaTests/Pods-hola-holaTests-resources.sh\"\n";
 			showEnvVarsInLog = 0;
 		};
-		92EB18701135B12378177FAA /* [CP] Check Pods Manifest.lock */ = {
+		82B77EC464B8920DAA46A805 /* [CP] Check Pods Manifest.lock */ = {
 			isa = PBXShellScriptBuildPhase;
 			buildActionMask = 2147483647;
 			files = (
@@ -386,38 +383,43 @@
 			shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n    # print error to STDERR\n    echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n    exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n";
 			showEnvVarsInLog = 0;
 		};
-		CC0708FABD678C34A902D89C /* [CP] Copy Pods Resources */ = {
+		A2DB8B71D173E52425DF1056 /* [CP] Embed Pods Frameworks */ = {
 			isa = PBXShellScriptBuildPhase;
 			buildActionMask = 2147483647;
 			files = (
 			);
 			inputFileListPaths = (
-				"${PODS_ROOT}/Target Support Files/Pods-hola/Pods-hola-resources-${CONFIGURATION}-input-files.xcfilelist",
+				"${PODS_ROOT}/Target Support Files/Pods-hola/Pods-hola-frameworks-${CONFIGURATION}-input-files.xcfilelist",
 			);
-			name = "[CP] Copy Pods Resources";
+			name = "[CP] Embed Pods Frameworks";
 			outputFileListPaths = (
-				"${PODS_ROOT}/Target Support Files/Pods-hola/Pods-hola-resources-${CONFIGURATION}-output-files.xcfilelist",
+				"${PODS_ROOT}/Target Support Files/Pods-hola/Pods-hola-frameworks-${CONFIGURATION}-output-files.xcfilelist",
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 			shellPath = /bin/sh;
-			shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-hola/Pods-hola-resources.sh\"\n";
+			shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-hola/Pods-hola-frameworks.sh\"\n";
 			showEnvVarsInLog = 0;
 		};
-		FB09B49D7EBA5195E9500822 /* [CP] Embed Pods Frameworks */ = {
+		C334C6E6C729730030B26EB3 /* [CP] Check Pods Manifest.lock */ = {
 			isa = PBXShellScriptBuildPhase;
 			buildActionMask = 2147483647;
 			files = (
 			);
 			inputFileListPaths = (
-				"${PODS_ROOT}/Target Support Files/Pods-hola/Pods-hola-frameworks-${CONFIGURATION}-input-files.xcfilelist",
 			);
-			name = "[CP] Embed Pods Frameworks";
+			inputPaths = (
+				"${PODS_PODFILE_DIR_PATH}/Podfile.lock",
+				"${PODS_ROOT}/Manifest.lock",
+			);
+			name = "[CP] Check Pods Manifest.lock";
 			outputFileListPaths = (
-				"${PODS_ROOT}/Target Support Files/Pods-hola/Pods-hola-frameworks-${CONFIGURATION}-output-files.xcfilelist",
+			);
+			outputPaths = (
+				"$(DERIVED_FILE_DIR)/Pods-hola-checkManifestLockResult.txt",
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 			shellPath = /bin/sh;
-			shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-hola/Pods-hola-frameworks.sh\"\n";
+			shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n    # print error to STDERR\n    echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n    exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n";
 			showEnvVarsInLog = 0;
 		};
 		FD10A7F022414F080027D42C /* Start Packager */ = {
@@ -455,7 +457,7 @@
 			isa = PBXSourcesBuildPhase;
 			buildActionMask = 2147483647;
 			files = (
-				13B07FBC1A68108700A75B9A /* AppDelegate.mm in Sources */,
+				35B0D6E02B4D4EE10059F156 /* AppDelegate.mm in Sources */,
 				13B07FC11A68108700A75B9A /* main.m in Sources */,
 				D840888E11B75659D34CCA71 /* ExpoModulesProvider.swift in Sources */,
 			);
@@ -474,7 +476,7 @@
 /* Begin XCBuildConfiguration section */
 		00E356F61AD99517003FC87E /* Debug */ = {
 			isa = XCBuildConfiguration;
-			baseConfigurationReference = 6502F77A49B592A71F1EDF93 /* Pods-hola-holaTests.debug.xcconfig */;
+			baseConfigurationReference = AB4A64394957AF054E00E80E /* Pods-hola-holaTests.debug.xcconfig */;
 			buildSettings = {
 				BUNDLE_LOADER = "$(TEST_HOST)";
 				CODE_SIGN_STYLE = Manual;
@@ -504,7 +506,7 @@
 		};
 		00E356F71AD99517003FC87E /* Release */ = {
 			isa = XCBuildConfiguration;
-			baseConfigurationReference = DB30B309E741FC430A4E6504 /* Pods-hola-holaTests.release.xcconfig */;
+			baseConfigurationReference = 8F320C61A55A2DAC79329C55 /* Pods-hola-holaTests.release.xcconfig */;
 			buildSettings = {
 				BUNDLE_LOADER = "$(TEST_HOST)";
 				CODE_SIGN_STYLE = Manual;
@@ -531,10 +533,11 @@
 		};
 		13B07F941A680F5B00A75B9A /* Debug */ = {
 			isa = XCBuildConfiguration;
-			baseConfigurationReference = 74EC722D7CF582147AB1768A /* Pods-hola.debug.xcconfig */;
+			baseConfigurationReference = 79481516D62ED012C19B3DCA /* Pods-hola.debug.xcconfig */;
 			buildSettings = {
 				ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
 				CLANG_ENABLE_MODULES = YES;
+				CODE_SIGN_ENTITLEMENTS = hola/hola.entitlements;
 				CODE_SIGN_STYLE = Manual;
 				CURRENT_PROJECT_VERSION = 1;
 				DEVELOPMENT_TEAM = 2ULWQK4QBS;
@@ -561,10 +564,11 @@
 		};
 		13B07F951A680F5B00A75B9A /* Release */ = {
 			isa = XCBuildConfiguration;
-			baseConfigurationReference = CF4A209C03F78431E19C436D /* Pods-hola.release.xcconfig */;
+			baseConfigurationReference = 35D120583D7F592A3931F5B3 /* Pods-hola.release.xcconfig */;
 			buildSettings = {
 				ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
 				CLANG_ENABLE_MODULES = YES;
+				CODE_SIGN_ENTITLEMENTS = hola/hola.entitlements;
 				CODE_SIGN_STYLE = Manual;
 				CURRENT_PROJECT_VERSION = 1;
 				DEVELOPMENT_TEAM = 2ULWQK4QBS;

+ 0 - 0
ios/hola/AppDelegate.h → ios/hola/AppDelegate2.h


+ 202 - 0
ios/hola/AppDelegate2.mm

@@ -0,0 +1,202 @@
+#import "AppDelegate2.h"
+
+#import <React/RCTBridge.h>
+#import <React/RCTBundleURLProvider.h>
+#import <React/RCTRootView.h>
+
+#import <React/RCTAppSetupUtils.h>
+#import <RCTJPushModule.h>
+#import <JPUSHService.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,JPUSHRegisterDelegate> {
+  RCTTurboModuleManager *_turboModuleManager;
+  RCTSurfacePresenterBridgeAdapter *_bridgeAdapter;
+  std::shared_ptr<const facebook::react::ReactNativeConfig> _reactNativeConfig;
+  facebook::react::ContextContainer::Shared _contextContainer;
+}
+@end
+#endif
+
+@implementation AppDelegate
+
+- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
+{
+  // APNS
+    JPUSHRegisterEntity * entity = [[JPUSHRegisterEntity alloc] init];
+    if (@available(iOS 12.0, *)) {
+      entity.types = JPAuthorizationOptionNone; //JPAuthorizationOptionAlert|JPAuthorizationOptionBadge|JPAuthorizationOptionSou//nd|JPAuthorizationOptionProvidesAppNotificationSettings;
+    }
+    [JPUSHService registerForRemoteNotificationConfig:entity delegate:self];
+  
+  RCTAppSetupPrepareApp(application);
+
+  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:@"taroDemo" 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];
+  return YES;
+}
+
+/// 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;
+}
+
+- (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
+
+//************************************************JPush start************************************************
+
+//注册 APNS 成功并上报 DeviceToken
+- (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken {
+  [JPUSHService registerDeviceToken:deviceToken];
+}
+
+//iOS 7 APNS
+- (void)application:(UIApplication *)application didReceiveRemoteNotification:  (NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler {
+  // iOS 10 以下 Required
+  NSLog(@"iOS 7 APNS");
+  [JPUSHService handleRemoteNotification:userInfo];
+  [[NSNotificationCenter defaultCenter] postNotificationName:J_APNS_NOTIFICATION_ARRIVED_EVENT object:userInfo];
+  completionHandler(UIBackgroundFetchResultNewData);
+}
+
+//iOS 10 前台收到消息
+- (void)jpushNotificationCenter:(UNUserNotificationCenter *)center  willPresentNotification:(UNNotification *)notification withCompletionHandler:(void (^)(NSInteger))completionHandler {
+  NSDictionary * userInfo = notification.request.content.userInfo;
+  if([notification.request.trigger isKindOfClass:[UNPushNotificationTrigger class]]) {
+    // Apns
+    NSLog(@"iOS 10 APNS 前台收到消息");
+    [JPUSHService handleRemoteNotification:userInfo];
+    [[NSNotificationCenter defaultCenter] postNotificationName:J_APNS_NOTIFICATION_ARRIVED_EVENT object:userInfo];
+  }
+  else {
+    // 本地通知 todo
+    NSLog(@"iOS 10 本地通知 前台收到消息");
+    [[NSNotificationCenter defaultCenter] postNotificationName:J_LOCAL_NOTIFICATION_ARRIVED_EVENT object:userInfo];
+  }
+  //需要执行这个方法,选择是否提醒用户,有 Badge、Sound、Alert 三种类型可以选择设置
+  completionHandler(UNNotificationPresentationOptionAlert);
+}
+
+//iOS 10 消息事件回调
+- (void)jpushNotificationCenter:(UNUserNotificationCenter *)center didReceiveNotificationResponse:(UNNotificationResponse *)response withCompletionHandler: (void (^)(void))completionHandler {
+  NSDictionary * userInfo = response.notification.request.content.userInfo;
+  if([response.notification.request.trigger isKindOfClass:[UNPushNotificationTrigger class]]) {
+    // Apns
+    NSLog(@"iOS 10 APNS 消息事件回调");
+    [JPUSHService handleRemoteNotification:userInfo];
+    // 保障应用被杀死状态下,用户点击推送消息,打开app后可以收到点击通知事件
+    [[RCTJPushEventQueue sharedInstance]._notificationQueue insertObject:userInfo atIndex:0];
+    [[NSNotificationCenter defaultCenter] postNotificationName:J_APNS_NOTIFICATION_OPENED_EVENT object:userInfo];
+  }
+  else {
+    // 本地通知
+    NSLog(@"iOS 10 本地通知 消息事件回调");
+    // 保障应用被杀死状态下,用户点击推送消息,打开app后可以收到点击通知事件
+    [[RCTJPushEventQueue sharedInstance]._localNotificationQueue insertObject:userInfo atIndex:0];
+    [[NSNotificationCenter defaultCenter] postNotificationName:J_LOCAL_NOTIFICATION_OPENED_EVENT object:userInfo];
+  }
+  // 系统要求执行这个方法
+  completionHandler();
+}
+
+//自定义消息
+- (void)networkDidReceiveMessage:(NSNotification *)notification {
+  NSDictionary * userInfo = [notification userInfo];
+  [[NSNotificationCenter defaultCenter] postNotificationName:J_CUSTOM_NOTIFICATION_EVENT object:userInfo];
+}
+
+
+@end

+ 8 - 0
ios/hola/hola.entitlements

@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
+<plist version="1.0">
+<dict>
+	<key>aps-environment</key>
+	<string>development</string>
+</dict>
+</plist>

+ 2 - 0
package.json

@@ -85,6 +85,8 @@
 		"expo-sensors": "~12.0.1",
 		"i18next": "^23.5.1",
 		"i18next-browser-languagedetector": "^7.1.0",
+		"jcore-react-native": "^2.1.5",
+		"jpush-react-native": "^3.0.6",
 		"react": "^18.1.0",
 		"react-dom": "^18.1.0",
 		"react-i18next": "^13.2.2",

+ 49 - 5
src/app.tsx

@@ -6,6 +6,8 @@ import store from './store/store'
 import { View } from '@tarojs/components'
 import GlobalModal from './components/layout/GlobalModal'
 import Taro from '@tarojs/taro'
+// import jgPush from './utils/push.rn'
+
 
 // import 'taro-ui/dist/style/index.scss'
 
@@ -38,12 +40,54 @@ const App: React.FC<PropsWithChildren> = ({ children }) => {
 
   }
   else {
-    // Taro.getStorage({
-    //   key:'isDebug',
-    //   success:res=>{
-    //     // global.isDebug = res
-    //   }
+    console.log('oppsu')
+    const test = require('./utils/push').default
+    test()
+    // jgPush()
+    // const JPush = require('jpush-react-native')
+
+    // JPush.init({ appKey: "4fcc3e237eec4c4fb804ad49", channel: "dev", production: false });
+    // //连接状态
+    // JPush.addConnectEventListener(result => {
+    //   console.log(result)
+    //   debugger
     // })
+    // console.log('rn jpush init')
+
+    // //通知回调
+    // var notificationListener = result => {
+    //   console.log("notificationListener:" + JSON.stringify(result))
+    //   alert(JSON.stringify(result))
+    // };
+    // JPush.addNotificationListener(notificationListener);
+    // //本地通知回调
+    // var localNotificationListener = result => {
+    //   console.log("localNotificationListener:" + JSON.stringify(result))
+    // };
+    // JPush.addLocalNotificationListener(localNotificationListener);
+    // //自定义消息回调
+    // var customMessageListener = result => {
+    //   console.log("customMessageListener:" + JSON.stringify(result))
+    // };
+    // JPush.addCustomMessageListener(customMessageListener);
+    // //应用内消息回调
+    // JPush.pageEnterTo("HomePage") // 进入首页,当页面退出时请调用 JPush.pageLeave('HomePage')
+    // var inappMessageListener = result => {
+    //   console.log("inappMessageListener:" + JSON.stringify(result))
+    //   alert(JSON.stringify(result))
+    // };
+    // JPush.addInappMessageListener(inappMessageListener);
+    // //tag alias事件回调
+    // var tagAliasListener = result => {
+    //   console.log("tagAliasListener:" + JSON.stringify(result))
+    // };
+    // JPush.addTagAliasListener(tagAliasListener);
+    // //手机号码事件回调
+    // var mobileNumberListener = result => {
+    //   console.log("mobileNumberListener:" + JSON.stringify(result))
+    // };
+    // JPush.addMobileNumberListener(mobileNumberListener);
+
   }
 
   return <Provider store={store}>

+ 0 - 1
src/components/navigation/TabBar.tsx

@@ -8,7 +8,6 @@ import { ColorType } from '@/context/themes/color';
 export default function Component(props: { index: number }) {
     const common = useSelector((state: any) => state.common);
     const [selIndex] = useState(props.index)
-    console.log('tabbar')
     function switchTab(index: number) {
         switch (index) {
             case 0:

+ 141 - 5
src/features/workout/Workout.tsx

@@ -11,7 +11,7 @@ import Layout from '@/components/layout/layout'
 import NoData from "@/components/view/NoData";
 import { ResultType, checkFail, checkRetry, checkStart, checkSuccess, resetStatus, setResult } from "@/store/action_results";
 import RequestType, { thirdPartRequest } from "@/services/thirdPartRequest";
-import { ModalType, NaviBarTitleShowType, TemplateType, WorkoutType } from "@/utils/types";
+import { MetricModalType, ModalType, NaviBarTitleShowType, TemplateType, WorkoutType } from "@/utils/types";
 import { useTranslation } from "react-i18next";
 import { jumpPage } from "@/features/trackTimeDuration/hooks/Common";
 import TitleView from "@/features/trackTimeDuration/components/TitleView";
@@ -20,8 +20,10 @@ import { ColorType } from "@/context/themes/color";
 import SetGoal from "@/features/workout/SetGoal";
 import Working from "@/features/workout/Working";
 import { startSuccess } from "@/store/workout";
-import { workoutGroups } from "@/services/workout";
+import { workoutFollows, workoutGroups } from "@/services/workout";
 import { setAuth } from "../trackSomething/hooks/werun";
+import MetricModalOrder from "../trackSomething/components/MetricModalOrder";
+import MetricModalChoose from "../trackSomething/components/MetricModalChoose";
 // import { useNavigation } from "@react-navigation/native";
 
 let useNavigation;
@@ -51,6 +53,16 @@ export default function Component(props: any) {
     const [count, setCount] = useState(0)
     const [isStart, setIsStart] = useState(false)
     const [targetTime, setTargetTime] = useState(0)
+    const [showPageContainer, setShowPageContainer] = useState(false)
+    const [modalType, setModalType] = useState(MetricModalType.none)
+
+    const [groups, setGroups] = useState([])
+    const [orignalGroups, setOrignalGroups] = useState([])
+    const [limits, setLimits] = useState(null)
+    const [orders, setOrders] = useState([])
+    const [newOrders, setNewOrders] = useState([])
+    const [resultOrders, setResultOrders] = useState([])
+
     let navigation;
     if (useNavigation) {
         navigation = useNavigation()
@@ -67,6 +79,7 @@ export default function Component(props: any) {
         }
         dispatch(resetStatus())
         getCards();
+        getGroups();
         const now = new Date();
         const nextMidnight = new Date(now.getFullYear(), now.getMonth(), now.getDate() + 1, 0, 0, 0);
         const timeUntilMidnight = nextMidnight.getTime() - now.getTime();
@@ -122,6 +135,7 @@ export default function Component(props: any) {
 
     global.refreshActivity = () => {
         getCards()
+        getGroups()
     }
 
     function getCards() {
@@ -146,8 +160,16 @@ export default function Component(props: any) {
             setLoaded(true)
         })
 
-        workoutGroups().then(res => {
+        
+    }
 
+    function getGroups(){
+        workoutGroups().then(res => {
+            var array = (res as any).groups
+            setOrignalGroups(JSON.parse(JSON.stringify(array)))
+            setGroups(array)
+            setLimits((res as any).num_options_limit)
+            setNewOrders([])
 
         })
     }
@@ -372,8 +394,30 @@ export default function Component(props: any) {
         isEnable = true;
     }
 
-    function addBtnClick(){
-        
+    function addBtnClick() {
+        Taro.showActionSheet({
+            itemList: [t('feature.track_something.metric.choose_metric'),
+            t('feature.track_something.metric.order')]
+        })
+            .then(res => {
+                switch (res.tapIndex) {
+                    case 0:
+                        global.metricAdd = true
+                        setModalType(MetricModalType.choose)
+                        setShowPageContainer(true)
+
+                        break;
+                    case 1:
+                        global.metricAdd = false
+                        setModalType(MetricModalType.order)
+                        setShowPageContainer(true)
+                        break;
+                }
+            })
+            .catch(err => {
+                console.log(err.errMsg)
+            })
+
     }
 
     function headerView() {
@@ -475,6 +519,87 @@ export default function Component(props: any) {
         </View>
     }
 
+    function modalCancel() {
+        setShowPageContainer(false)
+        onPageContainerCancel()
+    }
+
+    function modalConfirm(datas, newOrders, resultOrders, groups) {
+        setOrders(datas)
+        setGroups(groups)
+        setNewOrders(newOrders)
+        setResultOrders(resultOrders)
+        setModalType(MetricModalType.order)
+    }
+
+    function modalOrderCancel() {
+        if (global.metricAdd) {
+            setModalType(MetricModalType.choose)
+        }
+        else {
+            setShowPageContainer(false)
+            onPageContainerCancel()
+        }
+    }
+
+    function modalOrderConfirm(datas) {
+        var array: any = []
+        datas.map(item => {
+            array.push(item.code)
+        })
+        workoutFollows({ codes: array }).then(res => {
+            getCards()
+            getGroups()
+            setList((res as any).cards)
+            // setOrignalGroups(groups)
+        })
+        setShowPageContainer(false)
+    }
+
+    function metricModalContent() {
+        switch (modalType) {
+            case MetricModalType.choose:
+                return <MetricModalChoose
+                    themeColor={ColorType.workout}
+                    cancel={modalCancel}
+                    confirm={modalConfirm}
+                    array={groups}
+                    orders={orders}
+                    newOrders={newOrders}
+                    limit={limits}
+                />
+            case MetricModalType.order:
+                return <MetricModalOrder
+                    themeColor={ColorType.workout}
+                    cancel={modalOrderCancel}
+                    confirm={modalOrderConfirm}
+                    array={resultOrders} />
+        }
+        return <View />
+    }
+
+    function onPageContainerCancel() {
+        if (modalType == MetricModalType.choose || modalType == MetricModalType.order) {
+            debugger
+            var array: any = [];
+            list.map(item => {
+                array.push({
+                    name: (item as any).name,
+                    code: (item as any).code,
+                    is_following: true
+                })
+            })
+            // debugger
+            setOrders(array)
+            setNewOrders([])
+            setGroups(JSON.parse(JSON.stringify(orignalGroups)))
+            // setGroups(orignalGroups)
+        }
+        else {
+            setTempMetricItem(null)
+        }
+    }
+
     return <View style={{ position: 'relative' }}>
         <Layout type={TemplateType.customHeader} header={headerView()} children={showErrorPage ? <NoData refresh={() => { getCards() }} /> : detail()}
             title={t('page.activity.title')}
@@ -499,5 +624,16 @@ export default function Component(props: any) {
                 }
             </Modal>
         }
+
+        {
+            showPageContainer && <Modal dismiss={() => {
+                onPageContainerCancel()
+                setShowPageContainer(false)
+            }} confirm={() => { }}>
+                {
+                    metricModalContent()
+                }
+            </Modal>
+        }
     </View>
 }

+ 19 - 0
src/pages/demo.scss

@@ -8,4 +8,23 @@
     margin-left: 40px;
     margin-right: 40px;
     background-color: #00ffff;
+}
+
+.demoMain{
+    width: 750px;
+    height: 80vh;
+    overflow: scroll;
+    display: flex;
+    flex-direction: row;
+}
+
+.demoItem{
+    display: flex;
+    flex-direction: 0;
+    width: 72px;
+    height: 72px;
+    border-radius: 36px;
+    // background-color: paleturquoise;
+    margin-left: 20px;
+    margin-bottom: 20px;
 }

+ 23 - 2
src/pages/demo.tsx

@@ -1,7 +1,7 @@
 import MoveList from '@/features/trackSomething/components/MoveList';
 import MoveOrderList from '@/features/trackSomething/components/MoveOrderList';
 import { rpxToPx } from '@/utils/tools';
-import { Canvas, View, Text, PageContainer, ScrollView } from '@tarojs/components';
+import { Canvas, View, Text, PageContainer, ScrollView,Image } from '@tarojs/components';
 
 import { MovableArea, MovableView } from "@tarojs/components";
 import VirtualList from '@tarojs/components/virtual-list';
@@ -17,12 +17,33 @@ import Timer from '@/components/basic/Timer';
 
 
 export default function Demo() {
+  // 定义一个二维数组
+  const array: number[][] = [];
 
+  // 初始化二维数组
+  for (let i = 0; i < 12; i++) {
+    array[i] = new Array(31).fill(0);
+  }
 
-  console.log('oppsu')
+  console.log(array)
   return (
     <View>
       <Timer />
+
+      <ScrollView scrollX scrollY enableFlex className='demoMain'>
+        {
+          array.map((list, i) => {
+            return <View >
+              {
+                list.map((item, j) => {
+                  return <Image className='demoItem' mode="aspectFill" src='https://fast-dev.oss-cn-beijing.aliyuncs.com/users/3e1751a7280581c5c183b0fd8261da15/food-journal/2024/307e27cf-c284-4054-b59d-fb75fe5bd6a6_20240109154737_945.webp?x-oss-process=image/resize,w_50,limit_0'/>
+                  // return <View className='demoItem'></View>
+                })
+              }
+            </View>
+          })
+        }
+      </ScrollView>
     </View>
   )
 }

+ 12 - 1
src/services/workout.tsx

@@ -1,4 +1,4 @@
-import { API_WORKOUT_GROUPS } from "./http/api";
+import { API_WORKOUT_FOLLOWS, API_WORKOUT_GROUPS } from "./http/api";
 import { request } from "./http/request";
 
 
@@ -11,4 +11,15 @@ export const workoutGroups = ()=>{
             // dispatch(loginSuccess(res));
         })
     })
+}
+
+export const workoutFollows= (params) => {
+    return new Promise((resolve) => {
+        request({
+            url: API_WORKOUT_FOLLOWS, method: 'POST', data: { ...params }
+        }).then(res => {
+            resolve(res);
+            // dispatch(loginSuccess(res));
+        })
+    })
 }

+ 49 - 0
src/utils/push.tsx

@@ -0,0 +1,49 @@
+import JPush from 'jpush-react-native';
+
+export default function jgPush() {
+    // const JPush = require('jpush-react-native')
+    // debugger
+    console.log('asefasf')
+    JPush.init({ appKey: "4fcc3e237eec4c4fb804ad49", channel: "dev", production: false });
+    //连接状态
+    JPush.addConnectEventListener(result => {
+        console.log(result)
+        debugger
+    })
+
+    console.log('young')
+
+    //通知回调
+    var notificationListener = result => {
+        console.log("notificationListener:" + JSON.stringify(result))
+        alert(JSON.stringify(result))
+    };
+    JPush.addNotificationListener(notificationListener);
+    //本地通知回调
+    var localNotificationListener = result => {
+        console.log("localNotificationListener:" + JSON.stringify(result))
+    };
+    JPush.addLocalNotificationListener(localNotificationListener);
+    //自定义消息回调
+    var customMessageListener = result => {
+        console.log("customMessageListener:" + JSON.stringify(result))
+    };
+    JPush.addCustomMessageListener(customMessageListener);
+    //应用内消息回调
+    JPush.pageEnterTo("HomePage") // 进入首页,当页面退出时请调用 JPush.pageLeave('HomePage')
+    var inappMessageListener = result => {
+        console.log("inappMessageListener:" + JSON.stringify(result))
+        alert(JSON.stringify(result))
+    };
+    JPush.addInappMessageListener(inappMessageListener);
+    //tag alias事件回调
+    var tagAliasListener = result => {
+        console.log("tagAliasListener:" + JSON.stringify(result))
+    };
+    JPush.addTagAliasListener(tagAliasListener);
+    //手机号码事件回调
+    var mobileNumberListener = result => {
+        console.log("mobileNumberListener:" + JSON.stringify(result))
+    };
+    JPush.addMobileNumberListener(mobileNumberListener);
+}

+ 10 - 0
yarn.lock

@@ -10050,6 +10050,11 @@ javascript-stringify@^2.0.1:
   resolved "https://registry.npmmirror.com/javascript-stringify/-/javascript-stringify-2.1.0.tgz#27c76539be14d8bd128219a2d731b09337904e79"
   integrity sha512-JVAfqNPTvNq3sB/VHQJAFxN/sPgKnsKrCwyRt15zwNCdrMMJDdcEOdubuy+DuJYYdm0ox1J4uzEuYKkN+9yhVg==
 
+jcore-react-native@^2.1.5:
+  version "2.1.5"
+  resolved "https://registry.yarnpkg.com/jcore-react-native/-/jcore-react-native-2.1.5.tgz#1cdf6984578deff0a335b9c2891e3611452cbcad"
+  integrity sha512-2MkdanUaRxpiWa6C6EMk3W3XPlxFCAFE/HyYVoS1uAUwu45lPVkXowhbRtna93J77rChFuZf5ErciyDwNiGH9Q==
+
 jest-get-type@^26.3.0:
   version "26.3.0"
   resolved "https://registry.npmmirror.com/jest-get-type/-/jest-get-type-26.3.0.tgz#e97dc3c3f53c2b406ca7afaed4493b1d099199e0"
@@ -10132,6 +10137,11 @@ joycon@^3.0.1:
   resolved "https://registry.npmmirror.com/joycon/-/joycon-3.1.1.tgz#bce8596d6ae808f8b68168f5fc69280996894f03"
   integrity sha512-34wB/Y7MW7bzjKRjUKTa46I2Z7eV62Rkhva+KkopW7Qvv/OSWBqvkSY7vusOPrNuZcUG3tApvdVgNB8POj3SPw==
 
+jpush-react-native@^3.0.6:
+  version "3.0.6"
+  resolved "https://registry.yarnpkg.com/jpush-react-native/-/jpush-react-native-3.0.6.tgz#9322725a2c50d9d51b3d433df360b6b57a59bd65"
+  integrity sha512-ajOzIDaX67H/Aplmh42QhC6EtmZRaTgumEdncBQJG0LScRHEHrw1Rill+f705AZ8oGJ8Vjb6dLR4a37MzYkAnQ==
+
 js-base64@^2.1.9:
   version "2.6.4"
   resolved "https://registry.npmmirror.com/js-base64/-/js-base64-2.6.4.tgz#f4e686c5de1ea1f867dbcad3d46d969428df98c4"