如何在没有iPhone的情况下测试Apple Push Notification Service?


78

是否可以在没有iPhone应用程序的情况下测试Apple Push Notification Services?(在Windows上创建模拟器吗?)

如果不是,我该如何测试?是否有免费的示例应用程序被编译来做到这一点?

我创建了服务器提供程序,但是我需要测试功能。


1
现在该更新最佳答案了。我的回答中的图书馆是如此有用,感谢“ acoomans”!
kaspartus

虽然您可以使用模拟器测试有效载荷。模拟器存在错误,但似乎仍然无法兑现mutable-content密钥。看到这里
亲爱的

Answers:


79

这个答案已经过时了。从2020 / Xcode 11.4开始,现在可以在模拟器中测试推送通知

请在下面的答案中查看此完整说明

不好意思,但是您需要找到一些硬件来测试此功能。

推送通知在模拟器中不可用。它们需要iTunes Connect提供的配置文件,因此需要安装在设备上。这也意味着您可能必须接受Apple iPhone开发人员计划并支付99美元。

从好的方面来说,通过iPhone OS 3.0更新,您可以在任何设备(包括第一代iPhone)上测试此功能。


2
我遇到了同样的问题,您对这个问题的第二部分的回答不清楚: If isn't, how could I test that? Is there a free sample application compiled to do that? I created the Server provider, but I need test the functionallity.
JackLeo

这是在Simulator中支持Push通知的教程链接。medium.com/swlh/...
Hardik维亚斯

但是我对你有个好消息。Xcode 11.4 beta已发布,对我而言,此版本的最大好处是,我们终于可以在iOS模拟器中测试推送通知了!以下是示例实现- medium.com/better-programming/...
Rajath Kornaya

56

您无法测试真实的推送通知。不过,您可以通过以编程方式创建一个应用程序并手动触发您的AppDelegate的应用程序来测试您的应用程序模拟推送通知的响应- application:application didReceiveRemoteNotification:notification方法。

要从其他类(如UIViewController)触发此操作:

[[[UIApplication sharedApplication] delegate]
                    application:[UIApplication sharedApplication]
   didReceiveRemoteNotification:testNotification];

testNotification应该具有与真实通知相同的格式,即包含属性列表对象和NSNull的NSDictionary。

这是如何提供testNotification上述内容的示例:

NSMutableDictionary *notification = [[NSMutableDictionary alloc] init];
[notification setValue:@"Test" forKey:@"alert"];
[notification setValue:@"default" forKey:@"sound"];

NSMutableDictionary *testNotification = [[NSMutableDictionary alloc] init];
[testNotification setValue:notification forKey:@"aps"];

这应该创建一个与NSDictionary一起使用的合理通知。


1
在某处有此示例实现吗?
mirageservo

我没有一个(我的测试实现采用不同的途径,尽管它确实应该按照我上面的建议进行操作)。我猜是经典的“按我说的做,而不是我做”。
Jamon Holmgren

1
这是一个很好的答案。
肯斯坦斯坦·尼古拉索斯

30

如今,我们可以使用此库测试推送通知。

通过终端发送推送很容易:

echo -n '{"message":"message"}' | nc -4u -w1 localhost 9930

echo -n '{"aps":{"alert" : "message","badge" : 99,"sound" : "default"}, "myField" : 54758}' | nc -4u -w1 localhost 9930

14

使用Xcode 11.4 iOS模拟器测试推送通知

作为Xcode的11.4,现在有可能通过模拟推送通知拖放一个.apns文件到iPhone模拟器。在Xcode的11.4版本说明有以下要说的新功能:

Simulator支持模拟远程推送通知,包括后台内容获取通知。在Simulator中,将APNs文件拖放到目标模拟器上。该文件必须是带有有效Apple Push Notification Service有效负载(包括“ aps”键)的JSON文件。它还必须包含顶级“ Simulator Target Bundle”,其字符串值与目标应用程序的bundle标识符匹配。

simctl还支持发送模拟的推送通知。如果文件包含“ Simulator Target Bundle”,则不需要束标识符,否则,您必须将其作为参数提供(8164566):

xcrun simctl push <device> com.example.my-app ExamplePush.apns

这是.apns针对系统设置应用的此类文件的示例:

{
    "Simulator Target Bundle": "com.apple.Preferences",
    "aps": {
        "alert": "This is a simulated notification!",
        "badge": 3,
        "sound": "default"
    }
}

将其拖放到目标模拟器上将显示通知并设置徽章:

iOS模拟器上的通知

现在,要将其用于调试目的,只需将更Simulator Target Bundle改为自己的应用程序的标识符,根据调试需要调整有效负载


这不是发行版本
MeLine

1
好的,但这不会触发didReceiveRemoteNotification吗?点击消息我什么也收不到。
Lukasz Ciastko

您是否尝试过使用didReceiveLocalNotification(仅出于模拟目的)?除此之外:您可能应该只使用UserNotifications框架提供的方法。我想那些方法会起作用...
fredpi

您知道一种使用OneSignal推送通知模拟此情况的方法吗?
助记符23

@ mnemonic23如果要通过此方法测试传入的OneSignal通知的处理,则必须找出OneSignal推送通知有效负载的外观,然后复制该确切的负载。但是我想不出一个有意义的方案:如果您想测试应用程序对有效负载的处理,则与OneSignal交付机制无关;如果您想测试OneSignal传递机制是否有效,这种lokal推送模拟将无济于事。
fredpi

6

模拟器不执行推送通知。

要从服务器推送,您必须具有要推送到的设备以及该设备上的应用程序。

令牌包含应用程序标识以及设备ID。


4

Apple支持模拟器的推送通知。iOS 13.4及更高版本或Xcode 11.4及更高版本。

像通常那样创建Xcode项目并实现用户通知和授权权限。

iOS 13.4及更高版本的模拟器中运行应用程序。

将您的应用程序置于后台。

  1. 创建一个名为“ payload.apns ”的APNS有效负载文件
{
  "aps": {
    "alert": {
      "title": "Test Push",
      "body": "Success! Push notification in simulator! 🎉",
      "sound": "default"
    },
    "badge": 10
  },
  "Simulator Target Bundle": "com.company.app"
}
  1. 拖放到您的iOS模拟器中。

现在,您的推送通知将出现在模拟器上。

您还可以通过终端模拟推送通知

通过打开Window-> Devices and Simulators获得模拟器标识符,然后选择目标模拟器并右键单击并复制您的标识符。

现在构建一个终端命令,例如

xcrun simctl push <simulator-identifier> <path-to-payload-file>

例如:

xcrun simctl push 27A23727-45A9-4C12-BE29-8C0E6D1E5360 payload.apns

运行此命令并在模拟器中模拟推送通知


3

你必须使用

NSString *notificationString = @"{\"aps\":{\"alert\":\"Test alert\",\"sound\":\"default\"}}";

NSData *notificationData = [notificationString dataUsingEncoding:NSUTF8StringEncoding];

NSDictionary *testNotification = [NSJSONSerialization JSONObjectWithData:notificationData options:0 error:&error];

[[[UIApplication sharedApplication] delegate] application:[UIApplication sharedApplication] didReceiveRemoteNotification:testNotification  fetchCompletionHandler:nil];

3

Xcode 11.4 Beta开始在模拟器中支持推送通知

Simulator支持模拟远程推送通知,包括后台内容获取通知。在模拟器中,将APNs文件拖放到目标模拟器上。该文件必须是带有有效Apple Push Notification Service有效负载(包括“ aps”密钥)的JSON文件。它还必须包含顶级“ Simulator Target Bundle”,其字符串值与目标应用程序的bundle标识符匹配。

simctl还支持发送模拟的推送通知。如果文件包含“ Simulator Target Bundle”,则不需要束标识符,否则,您必须将其作为参数提供(8164566):

$ xcrun simctl push <device> com.example.my-app ExamplePush.apns

发行说明:https : //developer.apple.com/documentation/xcode_release_notes/xcode_11_4_beta_release_notes


重复一个星期前提供的更清晰简明的答案
标记

2

除了@fredpi的答案,您还可以使用Poes命令行工具。它使我们能够在iOS模拟器上快速测试远程推送通知,而无需创建JSON有效负载文件。

Poes --help
OVERVIEW: A Swift command-line tool to easily send push notifications to the iOS simulator

USAGE: Poes <options>

OPTIONS:
  --body, -b            The body of the Push Notification
  --bundle-identifier   The bundle identifier to push to
  --mutable, -m         Adds the mutable-content key to the payload
  --title, -t           The title of the Push Notification
  --verbose             Show extra logging for debugging purposes
  --help                Display available options

以下命令足以发送带有默认标题和正文的简单推送通知:

$ Poes --bundle-identifier com.wetransfer.app --verbose
Generated payload:

{
  "aps" : {
    "alert" : {
      "title" : "Default title",
      "body" : "Default body"
    },
    "mutable-content" : false
  }
}

Sending push notification...
Push notification sent successfully

1

是的,您可以在模拟器上检查推送通知,但必须在应用程序中使用名为SimulatorRemoteNotifications的库。通过仅使用4-5个步骤,您就可以在模拟器上测试推送通知。

他们也提供POD:

pod 'SimulatorRemoteNotifications', '~> 0.0.3'

请解释更多!
Negar Moshtaghi

2
@NegarMoshtaghi请打开我提供的答案链接,其中包含有关如何使用,如何工作以及全部的完整过程。
Sagar Shirbhate

这个图书馆有5-6年的历史,还可以使用吗?
Mark Han
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.