iOS : Disable Push Notifications drop down tray programatically - objective-c

In my app design, I have a dropdown menu from the top as the user swipes down the top edge of the screen. This interferes with the Push notification tray. Is there any way to disable the default tray dropdown when my app is in the foreground?

Currently, there is no public API for manipulating the behavior of the notification center or how to prevent it.
I think it is a design decision to keep a consistent user experience at the price of developer freedom. I do not think it's not likely that an app will ever be able to block a notification's appearance, and only slightly less unlikely that an app would be able to prevent the notification center from appearing.
After all, it is what made iOS so successful. The consistency between the operating system and apps in general.

Related

How can I detect/observe when third party app launches a full screen process?

I would like to build a helper app for gamers, and to build some extra functionality I would like to observe/time certain third party games behaviors, more specifically when the game actually launches the full screen process.
For example: my app is a system tray app, the game has a "launcher" app with lobby and menu screens. Once the game launches the extra process, usually OS X will switch resolutions (optionally) and my App would be notified somehow. Then I can start a timer. Once game match finishes, either the process is closed, or the game is not full screen anymore, my app gets a second notification and I can stop the timer.
Are there official Apple APIs that provide any way to observe/poll for the app going full screen and/or launch additional windows that I can reliably assume it's the actual game screen?
I doubt you're going to find a completely comprehensive solution. There are many ways for apps to achieve a full-screen experience and most don't provide a notification about that fact.
A full-screen app can modify the presentationOptions of NSApplication to hide the Dock and menu bar. Another app can use key-value observing to monitor its application object's currentSystemPresentationOptions property, which will reflect the current system status.
A full-screen app can capture the displays (although Apple discourages this technique). You can try to detect this by calling CGDisplayIsCaptured(), although it's been deprecated since 10.9 with no replacement. It may be possible that, if you register a callback with CGDisplayRegisterReconfigurationCallback(), you'll get called when something captures the display. However, capturing the display is sort of about preventing other processes from noticing such changes, so maybe not. In that case, you'd have to poll. You might also poll for the current display mode; changing the mode is the primary reason why a game would capture the display in the first place.
A full-screen game could also just create a borderless window the size of the screen and set its window level to be in front of the Dock and menu bar (and other apps' windows). There's not really a notification about this. You could detect it using the CGWindowList API, but you would have to poll. For example, you could call CGWindowListCopyWindowInfo(kCGWindowListOptionOnScreenOnly, kCGNullWindowID) and iterate through the dictionaries looking for one the size of the screen and at a window level above kCGStatusWindowLevel.
(You might be able to use the Accessibility API to get a notification when the frontmost window changes, so you'd only have to poll when that happens.)
You cannot observe a notification if there is none. So firstly you need to know if the app you want to observe is actually sending a notification that is observable. You cannot 'hook' into other apps without their planned consent.

Programmatically disable all Notification Center banners on Mac

Can a Mac app temporarily disable Notification Center, for example while it is doing a full-screen presentation? Apple says alerts are "automatically disabled while you’re presenting in Keynote. They also won’t appear if your display is mirrored on an external monitor." Do third-party apps also have the ability to temporary disable notifications?
I don't think so, but my assumptions are base on iOS, where you can't turn off notification center at all.
You can enable Focus (aka Do Not Disturb) which will hide current notifications and prevent new ones from popping up. See https://support.apple.com/guide/mac-help/turn-a-focus-on-or-off-mchl999b7c1a/mac for how to enable/disable it.
I do not know if applications themselves have control over enabling/disabling Focus.
I use the Touch Bar and add the Focus button to quickly enable it if I need to present or share screen. I do not see a keyboard shortcut you can set in Monterrey like you could in Big Sur.

Windows 8 metro UI: what is a new place for tray notification icons?

Before windows 8, if application want to non-intrusively inform user that something happens, it displays tray icon, maybe animated. For example, if e-mail application finds a new e-mail, it displays a new tray icon (outlook) or animate it's own icon in tray (all other e-mail clients).
With new Windows 8 Metro UI it's a new screen with tiles that supposed to be a main thing user will use to launch and switch apps. Where is no tray area in this mode, but many other things - charms area, something like status area that displays clock and battery usage etc.
According to Microsoft Metro UI design guides - what is the new place for poor e-mail app notification icon?
I think what you want is a notification. There are three kinds of notifications: a tile update, a badge update on the tile or a "toast" in the upper right corner of the screen (when in another application). The various options for these types of notifications are listed here.
The new place to let someone know your app has updated information is the tile itself.
These are called "Live Tiles" because they're intended to be dynamic, and change as new data becomes available.
http://www.winsupersite.com/article/windows8/windows-8-feature-focus-tiles-143175

Disable the "Notification Center" on iPad (phonegap) application

Is there any way to remove the swipe event that pulls in the notification center from the top of the ipad when developing an ipad app? If there is an easy way in PhoneGap, that would be best, if not - I can manually implement any Objective-C solution.
The app is already in full screen, and there are some gestures that including swiping at the top. These iPads are distributed to the sales force of this company, and they want that feature (top swipe notification center) disabled.
Cheers!
When your app is in fullscreen mode, Notification Center switches to a two-swipe system: swipe once to bring up a little handle, and swipe down on the handle to bring up Notification Center. This should avoid most interference.
Other than that, there's no public way to disable this gesture.
Of course not. At least not without a jailbroken phone. Notification Center is built into the OS and cannot be disabled by third party apps. As #jtbandes pointed out, their is the "handle" option, but there is no way to completely disable the functionality.

How can you disable the iOS Notification Center within your App?

If you have a full screen iOS app and you want to prevent the notification center from being pulled down, can you and how?
Also can you block notification alerts or banners from displaying while your app is loading? (I think this is a no way for sure but wanted to ask just in case.)
It has been my experience that fullscreen apps (statusBarHidden = YES) have a slightly different notification center behavior by default: Swiping down over the area previously occupied by the status bar will only show a little tab. Only swiping the tab will then show the notification center. This has been enough to prevent accidental activation for me so far.
Currently, there is no public API for manipulating the behavior of the notification center. I am of the opinion that it's not likely that an app will ever be able to block a notification's appearance, and only slightly less unlikely that an app would be able to prevent the notification center from appearing. iOS is all about a consistent user experience experience at the price of developer freedom. I could see being frustrated by this kind of functionality if I were an unexpecting user.
All that said, there is always the dark-side of undocumented APIs. I would not be surprised if you could pull off some cleverness using those on a jailbroken device, but that's not my cup-o'-tea.
I just now figured this out. I am developing a game that runs in landscape and whenever I touched the left side, the notification center tab would appear. To fix this, you want to add the following:
setStatusBarOrientation:UIInterfaceOrientationLandscapeLeft
I added this right after I setStatusBarHidden and I no longer have the problem of the notification tab.
Hope that helps.
An API was introduced in iOS 11, alongside a change in behavior to how Notification Center (and Control Center) is presented, to allow you to specify the desired behavior.
UIViewController.preferredScreenEdgesDeferringSystemGestures
In iOS 11+, Notification Center will always pull down when swiping from the very top of the screen, even if the status bar is hidden. preferredScreenEdgesDeferringSystemGestures allows you to specify that swiping a screen edge should not trigger the standard system UI, and instead it will provide a pull-out tab that the user must swipe again to bring out the system UI.
This is intended to be used for games where users swipe frequently, where it would be undesired to bring in system UI instead of control the game. For an immersive app like that, you can return .all to specify you don't want any system UI to appear the first time you swipe any edges of the screen, and it should instead prefer your app's own gestures.
Note that this will disable the ability to swipe once from the bottom to close an app on iPhones and iPads that don't have home buttons - the user will have to swipe twice to close the app.
There is still no way to completely disable Notification Center from within your app, nor prevent notifications from appearing while your app is in the foreground.
I built a very simple code snippet to address this issue programatically. I have a timer set-up in my app delegate that runs every .2 seconds each time it runs it keeps moving the status bar orientation so it doesn't impact the game play. I haven't experienced the annoying notification center in my app since! The only issue is the volume control rotates constantly and might be annoying but it's less annoying than notification center
int tick=0;
-(void)toggleNC
{
[[UIApplication sharedApplication] setStatusBarHidden:YES];
tick++;
if (tick==1)
{
[[UIApplication sharedApplication] setStatusBarOrientation:UIInterfaceOrientationLandscapeLeft];
}
if (tick==2){
[[UIApplication sharedApplication] setStatusBarOrientation:UIInterfaceOrientationLandscapeRight];
}
if (tick==3){
[[UIApplication sharedApplication] setStatusBarOrientation:UIInterfaceOrientationPortrait];
}
if (tick==4){
[[UIApplication sharedApplication] setStatusBarOrientation:UIInterfaceOrientationPortraitUpsideDown];
tick=0;
}
}