85

是否可以在没有 iPhone 应用程序的情况下测试 Apple 推送通知服务?(在 Windows 上创建模拟器?)

如果不是,我怎么能测试呢?是否有编译的免费示例应用程序可以做到这一点?

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

4

12 回答 12

81

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

在下面的答案中查看完整的解释

很抱歉,您需要找到一些硬件来测试此功能。

推送通知在模拟器中不可用。它们需要来自 iTunes Connect 的配置文件,因此需要安装在设备上。这也意味着你可能必须被苹果 iPhone 开发者计划接纳并支付 99 美元。

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

于 2009-07-04T20:19:17.523 回答
57

您无法测试真正的推送通知。但是,您可以通过以编程方式创建一个并手动触发 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 来使用。

于 2012-12-13T17:48:12.553 回答
34
于 2020-02-05T23:06:24.217 回答
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
于 2013-07-15T06:43:57.683 回答
13

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

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

于 2020-04-02T13:51:08.410 回答
6

模拟器不做推送通知。

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

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

于 2009-08-17T16:23:35.437 回答
4

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

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

simctl 还支持发送模拟推送通知。如果文件包含“模拟器目标包”,则不需要包标识符,否则您必须将其作为参数提供 (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

于 2020-02-12T05:43:28.593 回答
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];
于 2014-07-01T15:19:28.330 回答
3

除了@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
于 2020-02-09T14:52:43.843 回答
1

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

他们也提供 POD:

pod 'SimulatorRemoteNotifications', '~> 0.0.3'
于 2018-09-21T13:46:14.310 回答
1

看起来现在我们有非常强大的库https://github.com/ctreffs/SwiftSimctl

SimulatorRemoteNotifications至少它比这里提到的 lib 强大得多。这也被淘汰了。

于 2020-11-19T14:37:41.007 回答
0

要获得自 Xcode 11.4 和 Xcode 12.4 起更完整的答案:

  1. Simulator 支持模拟远程推送通知,包括后台内容获取通知。在模拟器中,将 APNs 文件拖放到目标模拟器上。该文件必须是具有有效 Apple 推送通知服务负载的 JSON 文件,包括“aps”键。它还必须包含一个顶级“模拟器目标包”,其字符串值与目标应用程序的包标识符匹配。simctl 还支持发送模拟推送通知。

  2. 通知服务扩展在模拟推送通知中不起作用。不支持可变内容键。(55822721)

参考:Xcode 11.4 发行说明

于 2021-02-24T01:28:47.360 回答