【问题标题】:iOS APN not received未收到 iOS APN
【发布时间】:2016-06-13 18:57:48
【问题描述】:

我有一个奇怪的问题。

注册通知的代码如下:

func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
    // PUSH NOTIFICATION

    let notificationTypes: UIUserNotificationType = [UIUserNotificationType.Alert, UIUserNotificationType.Badge, UIUserNotificationType.Sound]
    let pushNotificationSettings = UIUserNotificationSettings(forTypes: notificationTypes, categories: nil)

    application.registerUserNotificationSettings(pushNotificationSettings)
    application.registerForRemoteNotifications()

并处理通知:

func application(application: UIApplication, didReceiveRemoteNotification userInfo: [NSObject : AnyObject], fetchCompletionHandler completionHandler: (UIBackgroundFetchResult) -> Void) {

    let notification = UILocalNotification()
    notification.soundName = UILocalNotificationDefaultSoundName
    notification.alertBody = "TEST"
    application.presentLocalNotificationNow(notification)

当我在 xcode 中测试这个简单的代码时(使用设备,而不是模拟器),没有问题。但是当我在没有 xcode 的情况下(只是在我的手机上)测试它时,没有出现本地通知:没有声音,没有警报,没有徽章,什么都没有。

当应用在后台运行时会出现此问题。

发送的 APN 是静默通知。

有解决办法吗?

编辑

我通过将静默 APN 的优先级降低到 5 来解决它。

【问题讨论】:

  • 应用在后台运行时出现问题。
  • 你是什么意思测试它没有 xcode?​​span>
  • 我的意思是没有调试。我只是在手机上运行该应用程序来测试它。

标签: ios swift apple-push-notifications


【解决方案1】:

我终于找到了问题,请看我的编辑。

当您发送静默 APN(即 content-available 设置为 1)时,APN priority 必须为 5 而不是 10

【讨论】:

    【解决方案2】:

    当通过 xcode 安装时,通知将与开发 (gateway.sandbox.push.apple.com) url 一起使用。将其导出为 ipa (ad-hoc) 并手动安装需要从生产 URL gateway.push.apple.com 发送通知(包括生产密钥)。因此,您必须创建两个密钥,然后您可以在处理 xcode 时使用开发 url 发送通知,并在从导出的 ipa 安装时使用生产发送通知。

    【讨论】:

    • 你的意思是我需要 APN 的生产证书?但我的应用尚未投入生产,不在应用商店中,并由开发证书签名。
    • 如果您还没有使用 Xcode 安装应用程序,则需要生产配置文件和生产证书,我假设这里不是这种情况。
    • 该应用程序是使用 Xcode 安装的,所以我想在这种情况下我不需要生产配置文件和生产证书。
    • 你确定你已经在 Xcode 中启用了适当的后台功能并且你能确认你没有编译一个临时构建吗?
    • 远程通知在后台功能中启用。如何检查它是否是临时构建?
    【解决方案3】:

    如果您已经通过 Xcode 运行过一次应用程序,那么您之前会将令牌存储为默认值。因此,当您再次运行它时,不会调用 registerForRemoteNotifications(),因为您已将其包装在该 if 语句中。

    您应该在每次应用启动时调用 registerForRemoteNotifications()(并且不要假设令牌是固定值,它不是,它可以改变)。

    【讨论】:

    • 是的,这是我的第一个想法,但我尝试调用 registerForRemoteNotifications() 即使令牌已经存储但问题仍然存在。无论如何,我会假设令牌不是固定值,您在这一点上确实是正确的。
    • 您尝试发送什么类型的推送,即定向到用户或定向到应用程序的静默推送?如果是后者,您的设备是否已连接到电源? (我知道这听起来很奇怪,但相信我是有原因的)。
    • 这是无声推送,是的,设备已连接到电源(我的 Macbook 的 USB 插头)。
    【解决方案4】:

    当您编译到生产(临时)并从 Xcode 部署时,您的 deviceToken 会发生变化。 请参阅此answer

    【讨论】:

    • 是的,你是对的。但我不认为 deviceToken 是问题的根源。我删除了我的 if 条件以在每次启动应用程序时调用 application.registerForRemoteNotifications(),但通知问题仍然存在。
    猜你喜欢
    • 1970-01-01
    • 2017-08-26
    • 1970-01-01
    • 2019-08-17
    • 2018-01-03
    • 1970-01-01
    • 2022-11-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多