// SPDX-License-Identifier: BUSL-1.1; Copyright (c) 2025 Social Connect Labs, Inc.; Licensed under BUSL-1.1 (see LICENSE); Apache-2.0 from 2029-06-11 #import "AppDelegate.h" #import #import #import #import #import #import #import @implementation AppDelegate - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { [FIRApp configure]; if ([UNUserNotificationCenter class] != nil) { UNUserNotificationCenter *center = [UNUserNotificationCenter currentNotificationCenter]; center.delegate = self; // NOTE: Notification permission request removed from app launch // Permission is now requested only when user explicitly enables notifications // (e.g., in Points screen or settings) // The auto-request was causing unwanted permission prompts on first app launch } self.moduleName = @"OpenPassport"; self.initialProps = @{}; return [super application:application didFinishLaunchingWithOptions:launchOptions]; } - (NSURL *)sourceURLForBridge:(RCTBridge *)bridge { return [self bundleURL]; } - (NSURL *)bundleURL { #if DEBUG return [[RCTBundleURLProvider sharedSettings] jsBundleURLForBundleRoot:@"index"]; #else return [[NSBundle mainBundle] URLForResource:@"main" withExtension:@"jsbundle"]; #endif } - (BOOL)application:(UIApplication *)application continueUserActivity:(NSUserActivity *)userActivity restorationHandler:(void (^)(NSArray> * _Nullable))restorationHandler { return [RCTLinkingManager application:application continueUserActivity:userActivity restorationHandler:restorationHandler]; } // Handle device token registration - (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken { NSString *token = [self stringFromDeviceToken:deviceToken]; NSLog(@"APNs device token: %@", token); #ifdef DEBUG [[FIRMessaging messaging] setAPNSToken:deviceToken type:FIRMessagingAPNSTokenTypeSandbox]; #else [[FIRMessaging messaging] setAPNSToken:deviceToken type:FIRMessagingAPNSTokenTypeProd]; #endif } // Handle device token registration errors - (void)application:(UIApplication *)application didFailToRegisterForRemoteNotificationsWithError:(NSError *)error { NSLog(@"Failed to register for remote notifications: %@", error); } // Handle notifications when app is in foreground - (void)userNotificationCenter:(UNUserNotificationCenter *)center willPresentNotification:(UNNotification *)notification withCompletionHandler:(void (^)(UNNotificationPresentationOptions options))completionHandler { // Display the notification in foreground completionHandler(UNNotificationPresentationOptionSound | UNNotificationPresentationOptionBanner | UNNotificationPresentationOptionBadge); } // Convert device token to string format for logging - (NSString *)stringFromDeviceToken:(NSData *)deviceToken { const unsigned char *tokenBuffer = (const unsigned char *)deviceToken.bytes; NSMutableString *tokenString = [NSMutableString string]; for (NSUInteger i = 0; i < deviceToken.length; i++) { [tokenString appendFormat:@"%02X", tokenBuffer[i]]; } return [tokenString copy]; } // for segment deep link tracking - (BOOL)application:(UIApplication *)application openURL: (NSURL *)url options:(nonnull NSDictionary *)options { [AnalyticsReactNative trackDeepLink:url withOptions:options]; return YES; } @end