iOS Tutorial Push notifications

B4i v1.50 added support for push notifications. Push notifications feature requires some configuration.
Patience is a virtue ;)

The following steps are required inside Apple developer console:
1. Create a new explicit (non-wildcard) App ID with the package name of the push app. For example anywheresoftware.b4i.push. Enable push notification service.
2. Create an Apple Push Notification SSL certificate. Use the same certSigningRequest.csr file that you previously created.
3. Create a provision file with the new App ID.

Note that you can always delete all certificates and provisions and start from scratch.

The last step is done in the IDE by clicking on Tools - Build Server - Create Push Keystore. This sends the required files to the Mac builder which then creates a file named push.keystore. This file will be used by the B4X Push Server to connect to Apple service.

Make sure to switch to HD by clicking on the small gear button:

At the end of the process the key folder should look like:



Whenever the app starts we need to register the app for remote notifications. This is done with this code:
App.RegisterUserNotifications(True, True, True) 'allow badge, sound and alert

The PushToken event will be raised with the device token. We then send the token to the push server:
Private Sub Application_PushToken (Success As Boolean, Token() As Byte)
   If Success Then
     Dim bc As ByteConverter
     Dim j As HttpJob
     j.Initialize("j", Me)
     j.PostString(ServerUrl & "/devicetoken", "token=" & bc.HexFromBytes(Token) & "&type=1")
     Log("Error getting token: " & LastException)
   End If
End Sub

Private Sub JobDone(j As HttpJob)
   If j.Success Then
     Log("Token uploaded successfully.")
     Log("Error uploading token")
   End If
End Sub

The Application_RemoteNotification event will be raised when a message arrives while the app is in the foreground. If the app is not in the foreground then a standard alert message will appear. The user can click on the message to start the app.
The Application_RemoteNotification event will be fired after the app has started.

Private Sub Application_RemoteNotification (Message As Map, CompletionHandler As CompletionHandler)
   Log("Remote notification: " & Message)
   Dim m As Map = Message.Get("aps")
End Sub

Note the new signature of Application_RemoteNotification. You should call CompletionHandler.Complete once you are done with the task related to the message. This is mainly important for silent push messages, though you should always call it.

You should use the #ProvisionFile attribute to explicitly select the push.mobileprovision file.

See also:
Apple documentation:
B4X Push Server:
Managing multiple certificates / provision files
Last edited:


Active Member
Licensed User
Are there any "special" settings to be done when uploading for production?

My app uploads OK, but late after I receive an email that states:

Missing Push Notification Entitlement - Your app appears to include API used to register with the Apple Push Notification service, but the app signature's entitlements do not include the "aps-environment" entitlement.

Not sure if I'm missing something. It did work for development.


Alberto Iglesias

Well-Known Member
Licensed User
Hey Erel,

Some questions:

1) When "App.IsInitialized" turn to TRUE?

2) After this instructions:

App.RegisterUserNotifications(True, True, True)

the Iphone should be appear the message to accept Notifications by the user, right? not working!!!

Now I rebuild all of certifieds, aps and profile, and generate the PUSH STORE by B4i IDE and aparently is OK.

I got the APP token through "Application_PushToken" aparently is OK.

But when I try to send a PUSH message not work.

I do another app and work, but now its not working.

I think the problem is in the first step, NOT APPEAR A MESSAGE FOR ACCEPT NOTIFICATIONS, why?


Alberto Iglesias

Alberto Iglesias

Well-Known Member
Licensed User
In the settings OK:

Look my certifies:



The log in B4i, retrieving the TOKEN from apple servers


I generate the pusk.keystore and use in PUSHSERVER B4J


The APP compile OK, aparently is all OK, but not works!

Where I do something wrong?

For gererate the certifies i dont use MAC for nothing, only in windows and B4i, im a right? for create a .CSR, etc

Alberto Iglesias

Well-Known Member
Licensed User

Can you post the push server logs?

Before I create the certifieds, I delete all logs, and the recreate when push, look in attachment.

I dont see where I´m doing wrong
I try with sandbox and production servers


    2.6 KB · Views: 391

Alberto Iglesias

Well-Known Member
Licensed User
I try in these phones: iPhone 5S, iPhone 6 and iPhone 6 PLUS and still not working!

Can be my B4iBuilder? I have a 1.50.... Do you have new version?

Have a correct sequence for create steps to push work?

My steps:

1: [In B4i] Create a project in B4i with package name and save-it
2: [In B4i] Create a Private Sign Key to generate: B4i.keystore, B4i.p12 and certSigningRequest.csr (I use only this last one)
3: [In Apple Member Center] Generate an iOS Certificates (development or production) using the certSigningRequest.csr
4: [In Apple Member Center] Generate the APP ID with push notification (based on package name)
5: [In Apple Member Center] Generate the APNS certificate (based on package name)
6: [In Apple Member Center] Generate the profile
7: [In B4i] Create Push Keytore
8: [in PUSH SERVER B4J] Send Push based on this push keystore

Alberto Iglesias

Well-Known Member
Licensed User

In my log appear all ok, but still not receveing the push. I think i create the certificates more than 30 times.

Can you try to send to me? Look this token


and result when try to send

Qtde of rows: 1
Token: EED9B135CDAD3C760D1A2D31F5DC13D019FD367A7A88E3EAFC806EE761E2187C
Message sent to 1 device(s).

I put the push.keystore attachment in this.. Can you please try to send to me a simple push?

In CONFIG.TXT i use this:




    3.3 KB · Views: 467

Alberto Iglesias

Well-Known Member
Licensed User
But I can test with distribution server no? My certificates i try with sandbox and distribution and both not work
I try with and

The PushServer can be installed in anywhere no? And the only needed files to work should be push.keystore and password, is correct?

I ask you for do a simple test to send a message to me, with this token and keystore, to you can look the terminal/log messages and find my error.


Staff member
Licensed User
But I can test with distribution server no?
No. During development you can only use the sandbox with development APN ssl. Only when you release the app to the app store you will switch to non-sandbox.

Run the server from B4J IDE. With your store file it immediately disconnects (see the terminated message):


It is probably a distribution APN instead of development.

Alberto Iglesias

Well-Known Member
Licensed User

I deleted all certificates, and gerenate again with Development environment, but still not working!


Now I used this configurations:


I put the push.keystore now with development certificates, can you HELPPP MEEEEEEEEE!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! AHHHHHHHHHHHHH


2015-02-17 13:38:31.078:INFO::main: Logging initialized @1152ms
2015-02-17 13:38:31.500:INFO:eek:ejs.Server:main: jetty-9.1.z-SNAPSHOT
2015-02-17 13:38:31.609:WARN:eek:ejh.MimeTypes:main: java.util.MissingResourceExcep
tion: Can't find bundle for base name org/eclipse/jetty/http/encoding, locale pt
2015-02-17 13:38:31.671:INFO:eek:ejsh.ContextHandler:main: Started o.e.j.s.ServletC
2015-02-17 13:38:31.687:INFO:eek:ejs.AbstractNCSARequestLog:main: Opened C:\Aplic\P
2015-02-17 13:38:32.125:INFO:eek:ejs.ServerConnector:main: Started ServerConnector@
2015-02-17 13:38:32.125:INFO:eek:ejs.Server:main: Started @2347ms
server version: 0.9
server is listening on port: 51044
Socket connected.
Token added: 3AC37F558C0B6BE4A77C29F45FBE6BA36A641CCF9B8E4491F060F385691BCBC9
send message to
send message to => EED9B135CDAD3C760D1A2D31F5DC13D019FD367A7A88E3EAFC806EE761E21
send message to => 3AC37F558C0B6BE4A77C29F45FBE6BA36A641CCF9B8E4491F060F385691BC

Trying to reconnect...
Socket connected.


    3.3 KB · Views: 441

Alberto Iglesias

Well-Known Member
Licensed User
I don´t know if this information help you to identify the issue:

Normally, when you install an app and pass by the lines:

App.RegisterUserNotifications(True, True, True) 'allow badge, sound and alert

should be appear a message to accept the notifications, is correct? But not appearing!

I think this problem is before the push server. Can be with b4iBuilder? I using a 1.50 version of B4iBuilder.

Alberto Iglesias

Well-Known Member
Licensed User

2 problems solved:

  • The PUSH Server is always disconnect for some reason unknown, but I create a PUSH iOS Tool and works very well, look in

  • For the Notification Alert in APP first time launch appear again, have a tip in a APPLE FORUM in a
    Troubleshooting Push Notifications, look in:

Resetting the Push Notifications Permissions Alert on iOS

  • The first time a push-enabled app registers for push notifications, iOS asks the user if they wish to receive notifications for that app. Once the user has responded to this alert it is not presented again unless the device is restored or the app has been uninstalled for at least a day.

    If you want to simulate a first-time run of your app, you can leave the app uninstalled for a day. You can achieve the latter without actually waiting a day by following these steps:
    1. Delete your app from the device.

    2. Turn the device off completely and turn it back on.

    3. Go to Settings > General > Date & Time and set the date ahead a day or more.

    4. Turn the device off completely again and turn it back on.