系统不显示推送通知

Posted

技术标签:

【中文标题】系统不显示推送通知【英文标题】:System not showing push notification 【发布时间】:2013-07-11 19:45:38 【问题描述】:

我正在实现推送通知,如果应用程序在前台,它们会被正确接收,使用数据调用didReceiveRemoteNotification。所以我认为令牌和服务器问题为零。 当应用程序处于后台时,它会变得丑陋:我发送通知并且从未在通知中心显示为收到,而不是显示徽章。 在 Settings/Notifications/MyApp 中,一切都处于活动状态。 可能是因为我使用了开发证书还是因为 Apple 的沙盒问题? 任何想法将不胜感激。 谢谢

【问题讨论】:

我在这里看到同样的问题***.com/questions/7965417/… 不是同一个问题,链接的一个是指应用程序在前台运行时没有出现PN,而这个是在后台运行时,或者根本没有运行。不过还是谢谢。 【参考方案1】:

已修复。创建有效负载时,我使用的是简单数组,而不是带有 ['aps'] 键的数组。服务器端问题。我不知道为什么当文档说它不会时,Apple 会发送格式不正确的通知。这个细节让我觉得服务器端没问题,这就是我没有粘贴代码的原因,抱歉。

错误:

  $payload = array('alert' => $this->code->getText(),
                   'sound' => 'default', 
                   'badge' => '1');
  $message['payload'] = json_encode($payload);

右:

$body['aps'] = array(
                'alert' => $this->code->getText(),
                'sound' => 'default',
                'badge' => '1'
            );
            $message['payload'] = json_encode($body);

然后发送代码...

  if ($this->sendNotification($message['device_token'], 
                              $message['payload']))        
   else   // failed to deliver
      $this->reconnectToAPNS();
     

【讨论】:

【参考方案2】:

根据您的描述,我假设您有时会收到 APN(Apple 推送通知)。仔细检查 AppDelegate 中的代码,看看是否有以下内容:

在你的- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions

你应该有

[[UIApplication sharedApplication] registerForRemoteNotificationTypes:(UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeSound | UIRemoteNotificationTypeAlert)];

在您的 didReceiveRemoteNotification 中尝试此代码以查看收到 APN 时会发生什么:

-(void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo
NSLog(@"remote notification: %@",[userInfo description]);
NSDictionary *apsInfo = [userInfo objectForKey:@"aps"];

NSString *alert = [apsInfo objectForKey:@"alert"];
NSLog(@"Received Push Alert: %@", alert);

NSString *sound = [apsInfo objectForKey:@"sound"];
NSLog(@"Received Push Sound: %@", sound);

NSString *badge = [apsInfo objectForKey:@"badge"];
NSLog(@"Received Push Badge: %@", badge);

最后确保您实际上已成功注册以接收 APN:

- (void)application:(UIApplication*)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData*)deviceToken 
NSLog(@"My token is: %@", deviceToken);

包含此代码以防您在注册 APN 时遇到错误:

- (void)application:(UIApplication*)application didFailToRegisterForRemoteNotificationsWithError:(NSError*)error 
NSLog(@"Failed to get token, error: %@", error);

【讨论】:

应用程序在前台时,一切都经过仔细检查并正常工作。感谢您的时间和精力。 您有关于如何处理传入 APN 的代码吗?请记住,如果您的应用程序在后台,则只会播放声音并更新徽章计数。一旦您的应用程序处于前台,您将必须处理任何更新/同步服务器端。 是的,我知道并且在收到推送时我正在请求该客户端的服务器更新,但问题是应该在手机上显示一个通知(在通知中心滑块中),一个警报(在设置应用程序/通知中使用用户指定的样式),声音和徽章在应用程序处于后台时没有出现,因此用户永远不会意识到有新的东西(当他打开应用程序时,它会请求更新服务器)。 这听起来很像应用程序没有显示通知的权限。查看您的 iPhone/iPad 的通知中心,查看您的应用是否被允许/包含以接收 APN。请记住,如果用户在您的应用首次启动时未授予通知权限,则只有在通知中心进行手动更改才能将其撤消。 我知道您指的是“设置/通知/我的应用程序”,这里的一切都是活动的。这也没有意义,因为当它在前台时通知正在到达,所以权限应该没问题。

以上是关于系统不显示推送通知的主要内容,如果未能解决你的问题,请参考以下文章

iPhone:存储和显示推送通知

带计时器的推送通知 - iPhone

iOS手机差距——推送通知不显示通知服务提示框

网络推送通知不显示电脑是不是关闭或睡眠

chrome (macOS) 不显示桌面推送通知

推送通知有时不显示