iOS: Disable Swizzling

FlareRain iOS SDK uses Method Swizzling to replace the required method implementation for push notification operation at runtime with its own. As a result, it is possible to achieve a more streamlined integration by eliminating the need for a complicated implementation process.

However, if you want to use it with other push services, you need to disable swizzling so that all services can share the original method. Disabling swizzling requires adding some code.

But don't worry! We have created all 1:1 correspondence methods so that you can integrate very easily. Follow this guide step by step to disable Method Swizzling.

1. Required Steps

Familiarize yourself with the tasks required to disable Method Swizzling. Just add 5 lines!

  1. Update SDK version 1.1.0 or higher

  2. Add FlareLaneSwizzlingEnabled: false to Info.plist

  3. Add 1 method to AppDelegate

  4. Add 2 methods to UNUserNotificationCenter

  5. Add 2 methods to UNNotificationServiceExtension

2. Add a property to Info.plist

After selecting the target project in Xcode, go to Info -> Custom iOS Target Properties -> Add Row

Key: FlareLaneSwizzlingEnabled

Value: 'NO' with Boolean Type

4. Update AppDelegate

  1. application(:didRegisterForRemoteNotificationsWithDeviceToken:)

import FlareLane

@main
class AppDelegate: UIResponder, UIApplicationDelegate {
  // ...
  func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) {
    // Add the code below
    FlareLaneAppDelegate.shared.application(application, didRegisterForRemoteNotificationsWithDeviceToken: deviceToken)
  }
  // ...
}

5. Update UNUserNotificationCenter

  1. Set a delegate of UNUserNotificationCenterDelegate to your AppDelegate

  2. userNotificationCenter(:willPresent:withCompletionHandler:)

  3. userNotificationCenter(:didReceive:withCompletionHandler:)

import FlareLane

@main
class AppDelegate: UIResponder, UIApplicationDelegate {
  func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
    // 1
    UNUserNotificationCenter.current().delegate = self
  }
}

extension AppDelegate: UNUserNotificationCenterDelegate {
  // 2
  func userNotificationCenter(_ center: UNUserNotificationCenter, willPresent notification: UNNotification, withCompletionHandler completionHandler: @escaping (UNNotificationPresentationOptions) -> Void) {
    FlareLaneNotificationCenter.shared.userNotificationCenter(center, willPresent: notification, withCompletionHandler: completionHandler)
  }
  // 3
  func userNotificationCenter(_ center: UNUserNotificationCenter, didReceive response: UNNotificationResponse, withCompletionHandler completionHandler: @escaping () -> Void) {
    FlareLaneNotificationCenter.shared.userNotificationCenter(center, didReceive: response, withCompletionHandler: completionHandler)
  }
}

6. Update UNNotificationServiceExtension

  1. didReceive(:withContentHandler:)

  2. serviceExtensionTimeWillExpire()

import FlareLane

class NotificationService: UNNotificationServiceExtension {
  override func didReceive(_ request: UNNotificationRequest, withContentHandler contentHandler: @escaping (UNNotificationContent) -> Void) {
    // 1
    // Only handle notifications sent by FlareLane.
    if FlareLaneNotificationServiceExtensionHelper.shared.isFlareLaneNotification(request) {
      FlareLaneNotificationServiceExtensionHelper.shared.didReceive(request, withContentHandler: contentHandler)
    } else {
      // ...
    }
  }
  
  override func serviceExtensionTimeWillExpire() {
    // 2
    FlareLaneNotificationServiceExtensionHelper.shared.serviceExtensionTimeWillExpire()
  }
}

Last updated