// // AppDelegate.swift // GMERemittance // // Created by Fm-user on 11/30/17. // Copyright © 2017 Gobal Money Express Co. Ltd. All rights reserved. // import UIKit import Firebase import FirebaseAuth import UserNotifications import FirebaseInstanceID import FirebaseMessaging import BRYXBanner import Fabric import Crashlytics import AlamofireNetworkActivityLogger import IQKeyboardManagerSwift import LGSideMenuController import Localize_Swift import ChannelIO let server: Server = .kftcTest var overlayView: UIView? @UIApplicationMain class AppDelegate: UIResponder, UIApplicationDelegate { var window: UIWindow? func application( _ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]? ) -> Bool { UIApplication.shared.applicationIconBadgeNumber = 0 NetworkActivityLogger.shared.startLogging() NetworkActivityLogger.shared.level = .debug IQKeyboardManager.shared.enable = true IQKeyboardManager.shared.shouldResignOnTouchOutside = true FirebaseApp.configure() Fabric.with([Crashlytics.self]) Fabric.sharedSDK().debug = true Messaging.messaging().delegate = self let center = UNUserNotificationCenter.current() center.delegate = self center.requestAuthorization(options: [.alert, .sound, .badge]) { (_, _) in} application.registerForRemoteNotifications() print("FCM Token: \(Messaging.messaging().fcmToken ?? "nil")") // Initialize ChannelIO ChannelIO.initialize() setUUID() setupNavBar() setEntryPoint() UserDefaults.standard.removeObject(forKey: AppConstants.isOpenedTokenRenwalAlert) UserDefaults.standard.removeObject(forKey: AppConstants.isOpenedPopupNotification) return true } func application( _ application: UIApplication, didReceiveRemoteNotification userInfo: [AnyHashable: Any] ) { } func application( _ application: UIApplication, didReceiveRemoteNotification userInfo: [AnyHashable: Any], fetchCompletionHandler completionHandler: @escaping (UIBackgroundFetchResult) -> Void ) { ChannelIO.handlePushNotification(userInfo) { completionHandler(.noData) } } func application( _ application: UIApplication, didFailToRegisterForRemoteNotificationsWithError error: Error ) { } func application( _ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data ) { let deviceTokenString = deviceToken.reduce("", {$0 + String(format: "%02X", $1)}) print("APNs device token: \(deviceTokenString)") Messaging.messaging().apnsToken = deviceToken ChannelIO.initPushToken(deviceToken: deviceToken) } func applicationDidEnterBackground(_ application: UIApplication) { let store = UserDefaults.standard let language = Localize.currentLanguage() store.set(language, forKey: AppConstants.currentLanguage) let viewcontroller = UIViewController() viewcontroller.view.backgroundColor = AppConstants.themeRedColor viewcontroller.view.frame = UIScreen.main.bounds overlayView = viewcontroller.view guard let view = overlayView else {return} let topView = UIApplication.shared.keyWindow?.subviews.last topView?.addSubview(view) topView?.bringSubview(toFront: view) } func applicationWillEnterForeground(_ application: UIApplication) { if let language = UserDefaults.standard.string(forKey: AppConstants.currentLanguage) { Localize.setCurrentLanguage(language) } overlayView?.removeFromSuperview() } } // MARK: - Other Functions extension AppDelegate { private func setUUID() { if UserDefaults.standard.string(forKey: AppConstants.uuid) == nil { let uuid = UUID().uuidString UserDefaults.standard.set(uuid, forKey: AppConstants.uuid) } } private func setupNavBar() { let appearance = UINavigationBar.appearance() appearance.backIndicatorImage = #imageLiteral(resourceName: "backIconBlack") appearance.backIndicatorTransitionMaskImage = #imageLiteral(resourceName: "backIconBlack") appearance.tintColor = UIColor.black } private func setEntryPoint() { guard let _ = KeyChain.shared.get(key: .email), (KeyChain.shared.get(key: .login) ?? "1") == "1" ? true : false else { self.goSplashScreen() return } let biometricAuthenticationWireframe = BiometricAuthenticationWireframe() biometricAuthenticationWireframe.openWithDelegate( on: self.window!, delegate: self ) } private func doLogin(){ self.window?.rootViewController?.showProgressHud() let loginService = LoginService() guard let userID = KeyChain.shared.get(key: .email), let password = KeyChain.shared.get(key: .password) else { self.goSplashScreen() return } loginService._login( userId: userID, password: password, success: { (user) in let accessCode = user?.accessCode ?? "" let accessCodeBase64 = accessCode Utility.save(user: user, accessCodeBase64: accessCodeBase64, password: password, login: true) let mainWireFrame = MainWireframe.shared let tabBarViewController = mainWireFrame?.getMainView() let sidemenuVc = UIStoryboard(name: "SideMenu", bundle: nil).instantiateViewController(withIdentifier: "SideMenuViewController") as! SideMenuViewController let sideMenuController = LGSideMenuController(rootViewController: tabBarViewController, leftViewController: sidemenuVc, rightViewController: nil) sideMenuController.rootViewLayerShadowColor = UIColor(white: 0.9, alpha: 0.6) sideMenuController.rootViewLayerShadowRadius = 8.0 sideMenuController.leftViewPresentationStyle = .scaleFromBig sideMenuController.leftViewWidth = UIScreen.main.bounds.width - 70.0 if #available(iOS 10.0, *) { sideMenuController.leftViewBackgroundBlurEffect = UIBlurEffect(style: .regular) } else { // Fallback on earlier versions } self.window?.rootViewController?.hideProgressHud() self.window?.backgroundColor = sidemenuVc.view.backgroundColor self.window?.rootViewController = sideMenuController }) { (error) in self.window?.rootViewController?.hideProgressHud() self.window?.rootViewController?.alert(type: .error, message: error.localizedDescription, title: "Warning"){ // if failed login, remove all in keychain, change logout status and then go splash screen KeyChain.shared.removeAll() self.goSplashScreen() } } } private func goSplashScreen() { let splashWireframe = SplashScreenWireframe() let nav = UINavigationController.init(rootViewController: splashWireframe.getMainView()) self.window?.rootViewController = nav } } // MARK: - UNUserNotificationCenterDelegate extension AppDelegate: UNUserNotificationCenterDelegate { func userNotificationCenter( _ center: UNUserNotificationCenter, willPresent notification: UNNotification, withCompletionHandler completionHandler: @escaping (UNNotificationPresentationOptions) -> Void ) { let userInfo = notification.request.content.userInfo print("Message ID: \(userInfo["gcm_message_id"] ?? "nil")") completionHandler([ UNNotificationPresentationOptions.alert, UNNotificationPresentationOptions.sound, UNNotificationPresentationOptions.badge ]) } func userNotificationCenter( _ center: UNUserNotificationCenter, didReceive response: UNNotificationResponse, withCompletionHandler completionHandler: @escaping () -> Void ) { let userInfo = response.notification.request.content.userInfo print("Message ID: \(userInfo["gcm_message_id"] ?? "nil")") if ChannelIO.isChannelPushNotification(userInfo) { ChannelIO.handlePushNotification(userInfo) } print(userInfo) completionHandler() } } // MARK: - MessagingDelegate extension AppDelegate: MessagingDelegate { func messaging(_ messaging: Messaging, didReceiveRegistrationToken fcmToken: String) { print("Firebase registration token: \(fcmToken)") let userInfo = ["token": fcmToken] NotificationCenter.default.post( name: Notification.Name("FCMToken"), object: nil, userInfo: userInfo ) } func messaging(_ messaging: Messaging, didReceive remoteMessage: MessagingRemoteMessage) { print("Received data message: \(remoteMessage.appData)") } } // MARK: - BiometricAuthenticationViewControllerDelegate extension AppDelegate: BiometricAuthenticationViewControllerDelegate{ func viewController(_ viewController: BiometricAuthenticationViewController, informationTitleLabel titleLabel: UILabel, authenticationButton button: UIButton) { titleLabel.text = "bio_login_intro_text".localized() button.setTitle("login_text".localized(), for: .normal) } func didComplete(_ viewController: BiometricAuthenticationViewController) { self.doLogin() } func viewController( _ viewController: BiometricAuthenticationViewController, didFailWithError error: BiometricAuthenticationError, errorMessage: String? ) { print("BiometricAuthenticationWireframe Error: \(errorMessage ?? "")") // if don't use biometric authentication or user press password DispatchQueue.main.async { switch error { case .biometryNotAvailable, .userFallback: let secureKeypad = SecureKeypad(target: viewController) secureKeypad.delegate = self secureKeypad.present(animated: true) case .notBeConfigured, .biometryNotEnrolled: viewController.alert(type: .error, message: error.message) default: break } } } func doSelectLocalAuthenticationPolicy(_ viewController: BiometricAuthenticationViewController) -> BiometricAuthenticationPolicy { return .deviceOwnerAuthenticationWithBiometrics } } // MARK: - SecureKeypadDelegate extension AppDelegate: SecureKeypadDelegate { func didComplete(_ encryptedString: String) { if encryptedString != "" { KeyChain.shared.save(data: encryptedString, key: .password) self.doLogin() } } }