[iOS 9.3 Notifications payload]: If the app is not registered to notification settings before pushing this profile, it could never register after.

The Notifications Payload specifies the restriction enforced notification settings for apps, using their bundle identifiers. It is supported on iOS 9.3 and later and also the User Channel.


If the app is not registered to notification settings before pushing this profile, it could never register after. The app can be closed or killed, no pop-up will appear after to reauthorize or refuse the notifications on the supervised device. On the other hand, if the app is launched before pushing the Notifications payload, there is no issue.


Steps to Reproduce:

1. From Apple Configurator 2, create a Notifications payload in enabling all the settings and Banners alert.

2. Install app from the App Store on the supervised device.

3. Push a Notifications payload with the app builder identifier.

4. Open the app.


The expected behavior should be the app registration to notification settings with the options defined in Notifications payload. I feel that there is an issue in the Apple workflow. I have already created a ticket at Apple Bug Reporter for this. Meanwhile, is someone reproduced this issue in its environment? Any help could be useful to understand this surprising issue.


Thanks,

Franck

Replies

In iOS 9.2, Apple added the 'isValidated' key in the InstalledApplicationList and ManagedApplicationList dictionaries. If true, the app has validated as allowed to run and is able to run on the device. If an app is enterprise-distributed and is not validated, it will not run on the device until validated. For more info, see InstalledApplicationList Commands Get a List of Third-Party Applications and ManagedApplicationList Commands Provide the Status of Managed Applications.


In iOS 9.3 and later, it is missing the following key 'isRegisteredForRemoteNotifications' in the InstalledApplicationList and ManagedApplicationList dictionaries. A Boolean indicating whether the app is currently registered for remote notifications. FYI, it already exists an API in iOS 8 SDK that returns this info when registering an app for remote notifications. This method reflects whether the remote registration process completed successfully - a process that begins when you call the registerForRemoteNotifications() method. This method does not reflect whether remote notifications are actually available due to connectivity issues. The value returned by this method takes into account the user’s preferences for receiving remote notifications. For more info, see https://developer.apple.com/reference/uikit/uiapplication/2097537-isregisteredforremotenotificatio.


IMHO, the MDM daemon should return the 'isRegisteredForRemoteNotifications' key for each app in the InstalledApplicationList and ManagedApplicationList dictionaries. Without this critical info, the MDM server is unable to know if the app has been launched once on the iOS device.


Note:

This will be only a workaround on MDM server side. However, the root cause should be fixed by Apple on the device (OS). An app launched after installing Notifications payload should normally register to Notification settings with the options defined in this payload. Unfortunately, it is still not the case in the latest iOS version (10.2, 14C92).

For info, I did 2 test cases to understand what happened w/o Notifications payload. With the payload, the device does not add new BBRemoteDataProvider to BBServer from UserNotificationsServer and BulletinBoard processes and consequently, not update the app notification settings. IMHO, the user event notification should be fired w/o Notifications payload but without the user notification alert in the case of this payload. The aim is to update/enforce the app notification settings automatically without user interaction.


Test 1 without Notifications payload:

Jan 2 16:38:57 Ducosuss-iPad SpringBoard[54] <Notice>: Disabling home screen icon rotation for reason: SBAppToAppWorkspaceTransaction

Jan 2 16:38:57 Ducosuss-iPad SpringBoard[54] <Notice>: Disabling home screen icon rotation for reason: <SBCrossfadeIconZoomAnimator:0x10ec180c0>

Jan 2 16:38:57 Ducosuss-iPad SpringBoard[54] <Notice>: Dismissing banner for notification (null)

Jan 2 16:38:58 Ducosuss-iPad SpringBoard[54] <Notice>: Destination SBNotificationBannerDestination is now ready to receive notifications

Jan 2 16:38:58 Ducosuss-iPad SpringBoard[54] <Notice>: Presenting a CFUserNotification on behalf of: SpringBoard.54

Jan 2 16:38:58 Ducosuss-iPad SpringBoard[54] <Notice>: Received request to activate alertItem: <SBUserNotificationAlert: 0x1100746c0; title: \M-b\M^@\M^\YouTube\M-b\M^@\M^] Would Like to Send You Notifications; source: SpringBoard; pid: 54>

Jan 2 16:38:58 Ducosuss-iPad SpringBoard[54] <Notice>: Activation - Pending activation of <SBUserNotificationAlert: 0x1100746c0; title: \M-b\M^@\M^\YouTube\M-b\M^@\M^] Would Like to Send You Notifications; source: SpringBoard; pid: 54> due to reason: (

Jan 2 16:38:58 Ducosuss-iPad SpringBoard[54] <Notice>: Undimming for source: programmatic

Jan 2 16:38:58 Ducosuss-iPad SpringBoard[54] <Notice>: returning the workspace lock time (120.000000) from _nextLockTimeDuration

Jan 2 16:38:58 Ducosuss-iPad SpringBoard[54] <Notice>: returning the workspace dim time (100.000000) from _nextIdleTimeDuration

Jan 2 16:38:58 Ducosuss-iPad SpringBoard[54] <Notice>: Setting next idle duration (source:1) to: 100.000000 lockAfterDim: 20.000000

Jan 2 16:38:58 Ducosuss-iPad SpringBoard[54] <Notice>: Setting _lastBKUserEventTimerMode=2 with duration=100.000000

Jan 2 16:38:58 Ducosuss-iPad SpringBoard[54] <Notice>: Enabling home screen icon rotation for reason: <SBCrossfadeIconZoomAnimator:0x10ec180c0>

Jan 2 16:38:58 Ducosuss-iPad SpringBoard[54] <Notice>: Activation - Presenting <SBUserNotificationAlert: 0x1100746c0; title: \M-b\M^@\M^\YouTube\M-b\M^@\M^] Would Like to Send You Notifications; source: SpringBoard; pid: 54> with presenter: <SBUnlockedAlertItemPresenter: 0x174206dd0>

Jan 2 16:38:58 Ducosuss-iPad SpringBoard[54] <Notice>: Undimming for source: notification

Jan 2 16:38:58 Ducosuss-iPad SpringBoard[54] <Notice>: returning the workspace lock time (120.000000) from _nextLockTimeDuration

Jan 2 16:38:58 Ducosuss-iPad SpringBoard[54] <Notice>: returning the workspace dim time (100.000000) from _nextIdleTimeDuration

Jan 2 16:38:58 Ducosuss-iPad SpringBoard[54] <Notice>: Setting next idle duration (source:12) to: 100.000000 lockAfterDim: 20.000000

Jan 2 16:38:58 Ducosuss-iPad SpringBoard[54] <Notice>: Setting _lastBKUserEventTimerMode=2 with duration=100.000000

Jan 2 16:38:58 Ducosuss-iPad SpringBoard[54] <Notice>: SB orientation locked: NO; user lock: NO, overrides: NO

Jan 2 16:38:58 Ducosuss-iPad SpringBoard[54] <Notice>: Enabling home screen icon rotation for reason: SBAppToAppWorkspaceTransaction

Jan 2 16:39:07 Ducosuss-iPad SpringBoard[54] <Notice>: User Event Notification fired

Jan 2 16:39:07 Ducosuss-iPad SpringBoard[54] <Notice>: Deactivated alertItem: <SBUserNotificationAlert: 0x1100746c0; title: \M-b\M^@\M^\YouTube\M-b\M^@\M^] Would Like to Send You Notifications; source: SpringBoard; pid: 54>

Jan 2 16:39:07 Ducosuss-iPad SpringBoard(UserNotificationsServer)[54] <Notice>: [com.google.ios.youtube] Enable notifications: 1 [authorizationOptions: 7]

Jan 2 16:39:07 Ducosuss-iPad SpringBoard(UserNotificationsServer)[54] <Notice>: [com.google.ios.youtube] Create default data provider

Jan 2 16:39:07 Ducosuss-iPad SpringBoard(UserNotificationsServer)[54] <Notice>: [com.google.ios.youtube] Enable notifications: 1 [authorizationOptions: 7]

Jan 2 16:39:07 Ducosuss-iPad SpringBoard(BulletinBoard)[54] <Notice>: com.apple.usernotificationsserver.DefaultDataProviderFactory updating data provider proxy for section com.google.ios.youtube

Jan 2 16:39:07 Ducosuss-iPad SpringBoard(BulletinBoard)[54] <Notice>: com.apple.usernotificationsserver.DefaultDataProviderFactory adding new data provider proxy for section com.google.ios.youtube

Jan 2 16:39:07 Ducosuss-iPad SpringBoard(UserNotificationsServer)[54] <Notice>: [com.google.ios.youtube] Update SectionInfo

Jan 2 16:39:07 Ducosuss-iPad SpringBoard(BulletinBoard)[54] <Notice>: ADDING REMOTE

Jan 2 16:39:07 Ducosuss-iPad SpringBoard(BulletinBoard)[54] <Notice>: BBDataProviderManager adding data provider <BBRemoteDataProvider 0x1702b42e0; com.google.ios.youtube> to BBServer

Jan 2 16:39:07 Ducosuss-iPad SpringBoard(UserNotificationsServer)[54] <Notice>: [com.google.ios.youtube] Remove all pending notifications

Jan 2 16:39:07 Ducosuss-iPad SpringBoard(FrontBoard)[54] <Info>: checking for prefetched object for key=SBApplicationLocalNotificationsLastFireDate bundleID=<private>

Jan 2 16:39:07 Ducosuss-iPad SpringBoard(FrontBoard)[54] <Info>: found object (null)

Jan 2 16:39:07 Ducosuss-iPad SpringBoard(FrontBoard)[54] <Info>: checking for prefetched object for key=SBApplicationLocalNotificationsLastFireDate bundleID=<private>

Jan 2 16:39:07 Ducosuss-iPad SpringBoard(FrontBoard)[54] <Info>: found object (null)

Jan 2 16:39:07 Ducosuss-iPad SpringBoard(UserNotificationsServer)[54] <Notice>: [com.google.ios.youtube] Load last local notification fire date: (null)

Jan 2 16:39:07 Ducosuss-iPad SpringBoard(UserNotificationsServer)[54] <Notice>: [com.google.ios.youtube] Save pending 0 notifications to application data store

Jan 2 16:39:07 Ducosuss-iPad SpringBoard(FrontBoard)[54] <Info>: checking for prefetched object for key=PendingNotificationRecords bundleID=<private>

Jan 2 16:39:07 Ducosuss-iPad SpringBoard(FrontBoard)[54] <Info>: no object found

Jan 2 16:39:07 Ducosuss-iPad SpringBoard(BulletinBoard)[54] <Notice>: Section settings for data provider com.google.ios.youtube: <BBSectionInfo: 0x174331120> Section com.google.ios.youtube <BBSectionInfoSettings: 0x174e40720> Section settings: allows notifications = NO, shows in NC = YES, Lockscreen = YES, shows on external devices = YES, shows message preview = YES, Alert style = Banner, Push settings = [s:---] [e:---] (unmanaged) 'YouTube' 'YouTube', allows notifications = NO

Jan 2 16:39:07 Ducosuss-iPad SpringBoard(FrontBoard)[54] <Info>: fetching object for key=PendingNotificationRecords bundleID=<private> checkPrefetch=NO

Jan 2 16:39:07 Ducosuss-iPad SpringBoard(BulletinBoard)[54] <Notice>: BBDataProviderProxy setting server proxy: <_NSXPCDistantObject: 0x171473e40>

Jan 2 16:39:07 Ducosuss-iPad SpringBoard(UserNotificationsServer)[54] <Notice>: [com.google.ios.youtube] Did create default data provider

Jan 2 16:39:07 Ducosuss-iPad SpringBoard(BulletinBoard)[54] <Notice>: BBDataProviderProxy resuming proxy queue

Jan 2 16:39:07 Ducosuss-iPad SpringBoard(UserNotificationsServer)[54] <Notice>: dataProviderDidLoad: com.google.ios.youtube

Jan 2 16:39:07 Ducosuss-iPad SpringBoard(UserNotificationsServer)[54] <Notice>: [com.google.ios.youtube] Update SectionInfo

Jan 2 16:39:07 Ducosuss-iPad SpringBoard(BulletinBoard)[54] <Notice>: SettingsGateway changed section settings: com.google.ios.youtube

Jan 2 16:39:07 Ducosuss-iPad SpringBoard(BulletinBoard)[54] <Notice>: Saving updated section info for: com.google.ios.youtube

Old = <BBSectionInfo: 0x174331120> Section com.google.ios.youtube <BBSectionInfoSettings: 0x174e40720> Section settings: allows notifications = NO, shows in NC = YES, Lockscreen = YES, shows on external devices = YES, shows message preview = YES, Alert style = Banner, Push settings = [s:---] [e:---] (unmanaged) 'YouTube' 'YouTube', allows notifications = NO

New = <private>

Jan 2 16:39:07 Ducosuss-iPad SpringBoard(UserNotificationsServer)[54] <Notice>: [com.google.ios.youtube] SectionInfo did change

Jan 2 16:39:07 Ducosuss-iPad SpringBoard(UserNotificationsServer)[54] <Notice>: [com.google.ios.youtube] Notify observers that user notifications were enabled

Jan 2 16:39:07 Ducosuss-iPad SpringBoard(UserNotificationsServer)[54] <Notice>: [com.google.ios.youtube] Enable user notifications for remote notifications

Jan 2 16:39:07 Ducosuss-iPad SpringBoard(UserNotificationsServer)[54] <Notice>: [com.google.ios.youtube] Recalculate topics because user notifications was enabled

Jan 2 16:39:07 Ducosuss-iPad SpringBoard(UserNotificationsServer)[54] <Notice>: [com.google.ios.youtube] Request per-app token with token identifier ECA0EBB2-DD00-4618-BCCE-0D39E64D0DBB

Jan 2 16:39:07 Ducosuss-iPad SpringBoard(UserNotificationsServer)[54] <Notice>: Setting topics for environment production:

enabled: (

"com.google.ios.youtube"

)

ignored: (

)

opportunistic:(

"com.zenprise.zpmdmbeta"

)



Test 2 with Notifications payload:

Jan 2 16:55:31 Ducosuss-iPad SpringBoard[54] <Notice>: Disabling home screen icon rotation for reason: SBAppToAppWorkspaceTransaction

Jan 2 16:55:31 Ducosuss-iPad SpringBoard[54] <Notice>: Disabling home screen icon rotation for reason: <SBCrossfadeIconZoomAnimator:0x10ec27fd0>

Jan 2 16:55:31 Ducosuss-iPad SpringBoard[54] <Notice>: Dismissing banner for notification (null)

Jan 2 16:55:32 Ducosuss-iPad SpringBoard[54] <Notice>: Destination SBNotificationBannerDestination is now ready to receive notifications

Jan 2 16:55:34 Ducosuss-iPad SpringBoard[54] <Notice>: Undimming for source: programmatic

Jan 2 16:55:34 Ducosuss-iPad SpringBoard[54] <Notice>: returning the workspace lock time (120.000000) from _nextLockTimeDuration

Jan 2 16:55:34 Ducosuss-iPad SpringBoard[54] <Notice>: returning the workspace dim time (100.000000) from _nextIdleTimeDuration

Jan 2 16:55:34 Ducosuss-iPad SpringBoard[54] <Notice>: Setting next idle duration (source:1) to: 100.000000 lockAfterDim: 20.000000

Jan 2 16:55:34 Ducosuss-iPad SpringBoard[54] <Notice>: Setting _lastBKUserEventTimerMode=2 with duration=100.000000

Jan 2 16:55:34 Ducosuss-iPad SpringBoard[54] <Notice>: Enabling home screen icon rotation for reason: <SBCrossfadeIconZoomAnimator:0x10ec27fd0>

Jan 2 16:55:34 Ducosuss-iPad SpringBoard[54] <Notice>: SB orientation locked: NO; user lock: NO, overrides: NO

Jan 2 16:55:34 Ducosuss-iPad SpringBoard[54] <Notice>: Enabling home screen icon rotation for reason: SBAppToAppWorkspaceTransaction

Jan 2 16:55:44 Ducosuss-iPad SpringBoard[54] <Info>: Setting device orientation from backboardd to: 5