How to Send Push Notifications to the iOS Simulator
As of Xcode 11.4 beta, you can!
Push notifications are one of the most popular ways for developers to keep users engaged in their apps. In iOS applications, push notifications can be incorporated by using the Apple Push Notification service (APNs).
However, it’s not as easy as it sounds since there is a long list of things to do for setting this up. Plus, what’s worse is that we have to use a real device to test if push notifications are working or not since push notifications aren’t supported in Xcode’s iOS Simulator.
But I have some good news for you. Xcode 11.4 beta is out and the best part about this release for me is that we can finally test push notifications in the iOS Simulator!
The release note of Xcode 11.4 beta consists of a section that says:
“Simulator supports simulating remote push notifications, including background content fetch notifications. In Simulator, drag and drop an APNs file onto the target simulator. The file must be a JSON file with a valid Apple Push Notification Service payload, including the “aps” key. It must also contain a top-level “Simulator Target Bundle” with a string value matching the target application‘s bundle identifier.
simctl also supports sending simulated push notifications. If the file contains “Simulator Target Bundle” the bundle identifier is not required, otherwise you must provide it as an argument (8164566):
We’ll go in-depth about what this means in the latter part of the post. But for now, let’s be happy because the hassle of having to use a real device for testing push notifications is finally gone.
How Do We Do It?
So, now, let’s see how we can use this newly-arrived feature of Xcode 11.4 beta. For this, you obviously need to have Xcode 11.4 beta or higher. I currently have Xcode 11.4 beta.
Now, let’s create a new project. I’ve named it TestPushNotifications and the user interface I chose is Storyboard. You can choose SwiftUI if you want.
Creating a new project
Just to make the app look good (though it won’t help…), I’ve added a UILabel that says “Hello, world!” in View Controller of Main.storyboard.
Now, when we run the app in a simulator, iPhone 11 Pro Max in this case, it looks like this:
This is where the fun begins! Let’s go to the AppDelegate.swift file and add the following line below import UIKit to import Apple’s UserNotifications framework.
import UserNotifications
Now, in the AppDelegate class, let’s create a function, registerForPushNotifications(), that requests permission from the user to allow the app to send push notifications.
Let’s call the function we just created, from the application(_:didFinishLaunchingWithOptions:) method of AppDelegate.
For that, add registerForPushNotifications() above the return true statement. Your AppDelegate.swift file will look something like this:
//
// AppDelegate.swift
// TestPushNotifications
//
import UIKit
import UserNotifications
@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
// Override point for customization after application launch.
registerForPushNotifications()
return true
}
// MARK: UISceneSession Lifecycle
func application(_ application: UIApplication, configurationForConnecting connectingSceneSession: UISceneSession, options: UIScene.ConnectionOptions) -> UISceneConfiguration {
// Called when a new scene session is being created.
// Use this method to select a configuration to create the new scene with.
return UISceneConfiguration(name: "Default Configuration", sessionRole: connectingSceneSession.role)
}
func application(_ application: UIApplication, didDiscardSceneSessions sceneSessions: Set<UISceneSession>) {
// Called when the user discards a scene session.
// If any sessions were discarded while the application was not running, this will be called shortly after application:didFinishLaunchingWithOptions.
// Use this method to release any resources that were specific to the discarded scenes, as they will not return.
}
func registerForPushNotifications() {
UNUserNotificationCenter.current()
.requestAuthorization(options: [.alert, .sound, .badge]) {
(granted, error) in
print("Permission granted: \(granted)")
}
}
}
When we run the app, we get a dialog asking for permission to allow the app to send push notifications. Tap Allow.
Dialog asking for permission from the user to allow the app to send push notifications
The release note of Xcode 11.4 beta says:
"simctl also supports sending simulated push notifications. If the file contains “Simulator Target Bundle”, the bundle identifier is not required, otherwise, you must provide it as an argument (8164566):
Now, let’s try what it says. For that, we require a JSON file with a valid Apple Push Notification Service payload.
Apple’s documentation, entitled “Generating a Remote Notification”, gives a clear idea about how we can create such a file. I’m creating a file named notification.apns on my desktop and adding the following content in it:
Here, <device> is to be replaced by the device identifier, com.example.my-app is to be replaced by your project’s bundle identifier, and ExamplePush.apns is to be replaced by the filename of our apns file.
Note that the bundle identifier is not necessary in the command, if you add it with the “Simulator Target Bundle” key in the apns file.
You can retrieve your simulator’s device identifier by following the steps shown in the GIF below:
Finding the device identifier of the simulator we are using (iPhone 11 Pro Max, in this case)
And you can retrieve the bundle identifier of your project by following the steps shown in the GIF below:
Finding the bundle identifier of the project
Before we execute the command, we have to send the app to the background first. That’s how the push notification will be visible.
Note: If you want the push notification to be visible even when the app is on the foreground, you can make AppDelegate conform to UNUserNotificationCenterDelegate and implement its userNotificationCenter(_:willPresent:withCompletionHandler:) method. And make sure that you have included the following line before calling registerForPushNotifications() in application(_:didFinishLaunchingWithOptions:) method:
As soon as it is executed, this is what we can see in the simulator — a push notification:
A push notification in Simulator
That’s how we can run a command to show push notifications in our simulator!
But wait, if you are not quite comfortable with using the terminal, there’s another way. Remember what the release note said?
“In Simulator, drag and drop an APNs file onto the target simulator. The file must be a JSON file with a valid Apple Push Notification Service payload, including the “aps” key. It must also contain a top-level “Simulator Target Bundle” with a string value matching the target application‘s bundle identifier.”
We can simply drag and drop our apns file into the simulator to get a push notification. But for that, we will have to make some modifications in the apns file.
In the notification.apns file that we created previously, let’s add one more key, "Simulator Target Bundle”, which will hold the value of our bundle identifier, which is “np.com.sagunrajlage.TestPushNotifications” in my case.
Low code vs. No code: Which is better for web and mobile app development? Are you an entrepreneur with plans to undertake a software development project for your business? Alternatively, are you an IT leader in an enterprise planning to undertake such a project? There might be situations where your software development team is heavily stretched and you just don’t have time to hire enough people to meet the project schedule. Businesses face this situation often! How do you undertake your project in such circumstances? Low-code and/or no-code development can help. In this article, we talk about low code vs no code development for web and mobile apps. We introduce both and discuss their pros and cons. Subsequently, we talk about their similarities and differences. We discuss scenarios where you might want to use them. Finally, we discuss scenarios where you should choose custom software development instead of low-code/no-code. Read on. Low-code development: An introduction “Low code...
What if we told you, in less than 24 hours you could have your entire online Drop-shipping store setup? Our team will setup your brand so you can start making a profit! Here's what you get with our branding packages. ✓ Logo Design ✓ Conversion Optimised Store Templates ✓ Legal Pages Setup ✓ Product Supplier Integration ✓ Payment Gateway & Shipping Setup ✓ And MORE! Start your original drop shipping brand today! 👉 What are you waiting for, Contact us to create your own Drop-shipping store with Facebook/Instagram shop or connect your existing eCommerce application to Facebook/Instagram shop. Who We Are? We are agileHorde Technologies , an award-winning Mobile and Web Apps/E-commerce development company based in India, USA, Philippines. We develop apps that help businesses engage customers effectively . If you want to find out more, or are looking to outsource development of a tailored application, please reach us at info@agilehorde.co...
Google appears to be gearing up to finally release the Tiles API for its WearOS wearable platform. Compared to Apple’s WatchOS, developments for WearOS are so few and far between that it often feels that Google has given up. However, it’s clear Google hasn’t fully thrown in the towel when it comes to its wearable platform. In 2019, (yes, 2019…) Google announced ‘Tiles’ for WearOS. Tiles are essentially widgets which offer glanceable information to the user at a swipe: Initially limited to just five Tiles, Google updated WearOS in September to support up to ten. Despite being released over a year ago, Tiles have been limited to Google’s own and third-party developers have been left in the cold. That finally looks set to change in the coming weeks. A commit appeared in the Android Open Source Project on December 17th titled ‘Initial commit of Wear Tiles API’ which is fairly self-explanatory. There’s no guarantee that Google will make the API public (although ...
Comments
Post a Comment