Testing push notifications in the Simulator with Xcode 11.4
Tags: ios, tutorial
Published: 2020-02-13 09:15:42

> This post was originally published on [my blog](https://www.donnywals.com/the-blog) where I publish weekly articles and tips.

> Xcode 11.4 is currently still in beta, keep in mind that you can't use this version of Xcode to ship apps to the store. Read my guide on [installing multiple Xcode versions](https://www/donnywals.com/installing-multiple-xcode-versions-with-xcversion/) alongside each other if you want to play with the Xcode 11.4 beta while keeping your copy of 11.3.1 around as well.

For years we've had to resort to using physical devices when testing push notifications. With Xcode 11.4, Apple finally gives developers the tools needed to test push notifications on the iOS Simulator. I'm going to assume you already know how to add push notifications to your app. If you've never added push notifications to an app before, I have a post that describes [how to set up and test push notifications without a third-party service](https://www.donnywals.com/testing-your-push-notifications-without-a-third-party-service/). That post should get you all set up to follow along with this post.

## Sending a test push from the command line

Xcode comes with several command-line tools that allow you to run your tests, builds and other tasks directly from the Terminal in macOS. If you have Xcode installed, it should automatically install the command line tools on its first launch. If you've followed my guide on [having multiple Xcode versions installed](https://www/donnywals.com/installing-multiple-xcode-versions-with-xcversion/), make sure to select Xcode 11.4 or newer by running `xcversion select 11.4` and replace 11.4 with the version of Xcode you want to use. Doing this will make sure the Xcode command line tools point to the correct toolchain.

When you have an iOS 13.4 or newer simulator running, all you need to send a push notification is an apns notification payload. The payload should look similar to the following:

```json
{
  "Simulator Target Bundle": "com.donnywals.SilentPushDemo",
  "aps": {
    "alert": {
      "title": "Push on the simulator",
      "subtitle": "So cool...",
      "body": "This notification is going to show up in the simulator!"
    }
  }
}
```

The formatting of the push notification is the same as it would be when you send it from a server to a device. The only exception is the `"Simulator Target Bundle"` top-level key. This key should not be present in push notifications that you send from a production server. To send this push notification, you can run the following terminal command:

```bash
xcrun simctl push booted test_push.apns
```

This will send a test push notification to all booted simulators. The last argument passed to this command is the path to the file that contains the test push notification. In this case, it's a file called `test_push.apns` which exists in the directory as the one I'm running the command from.

The `"Simulator Target Bundle"` can be omitted from the file, but then the terminal command would be slightly different:

```bash
xcrun simctl push booted <your-bundle-identifier> test_push.apns
```

When you don't include your app's bundle identifier in the payload, you need to specify the bundle identifier of the receiving app in the command. Make sure you replace `<your-bundle-identifier>` with the receiving application's bundle identifier.

## Sending a test push notification without the command line

If you're not comfortable using the command line to send a test push, you can also drag your test push notification directly to the simulator to have it delivered to that specific simulator immediately.

When doing this, make sure your file has `.apns` as its extension, and it must include the `"Simulator Target Bundle"` top-level key so the simulator knows which application should receive your test push.

## In Summary

The ability to test push notifications in the simulator is a feature that iOS developers have wanted for a very long time, and I think that it's great that Apple has finally provided us with this ability. Especially because they managed to make the process so straightforward by keeping everything local to the machine you're developing on.

If you want to test with notifications that are actually generated and sent from your server, you still need to use a physical device because the simulator doesn't support true remote notifications just yet. However, I think this is a great step in the right direction and I'm sure I will use this feature regularly.

If you have any questions or feedback for me, make sure to reach out on [Twitter](https://twitter.com/donnywals).