There are a couple of libraries available
https://github.com/antiraum/THPinViewController
https://github.com/D-32/DMPasscode
https://github.com/tiny2n/JKLLockScreenViewController
If you wish to do it yourself or in middle of implenting it, get the top most controller in willEnterForground method, present your lock screen controller on that controller, on successful pin checking dismiss your lock screen controller, and if you need to notify others, push a notificiation
This is how you can get the top most controller
- (UIViewController*)topViewControllerWithRootViewController:(UIViewController*)rootViewController {
if ([rootViewController isKindOfClass:[UITabBarController class]]) {
UITabBarController* tabBarController = (UITabBarController*)rootViewController;
return [self topViewControllerWithRootViewController:tabBarController.selectedViewController];
} else if ([rootViewController isKindOfClass:[UINavigationController class]]) {
UINavigationController* navigationController = (UINavigationController*)rootViewController;
return [self topViewControllerWithRootViewController:navigationController.visibleViewController];
} else if (rootViewController.presentedViewController) {
UIViewController* presentedViewController = rootViewController.presentedViewController;
return [self topViewControllerWithRootViewController:presentedViewController];
} else {
return rootViewController;
}
}
Swift
func topViewControllerWithRootViewController(rootViewController: UIViewController!) -> UIViewController! {
if rootViewController.isKindOfClass(UITabBarController) {
let tabbarController = rootViewController as! UITabBarController
return self.topViewControllerWithRootViewController(tabbarController.selectedViewController)
}else if (rootViewController.isKindOfClass(UINavigationController)) {
let navigationController = rootViewController as! UINavigationController
return self.topViewControllerWithRootViewController(navigationController.visibleViewController)
}else if ((rootViewController.presentedViewController) != nil){
let controller = rootViewController.presentedViewController
return self.topViewControllerWithRootViewController(controller)
}else {
return rootViewController
}
}
Usage
let topController = self.topViewControllerWithRootViewController(UIApplication.sharedApplication().delegate?.window??.rootViewController)
Modifiy and make an extension or use it as you wish