在同一部手机上管理多个用户的APN通知

时间:2016-05-24 21:08:25

标签: swift apple-push-notifications ios9

我想知道如果许多用户在同一个设备上使用相同的应用程序时如何管理Apple推送通知,因为设备令牌对于每个设备都是唯一的。

如果我在同一设备上的应用上有2个注册用户,如果通知是针对userA但是userB当前已登录到该应用,如何阻止推送通知出现?

如果应用程序位于前台,那么可以通过用户ID轻松管理,如果APN不适合此用户,则会阻止执行代码。

但如果应用程序在后台,如何处理? 设备将收到APN,将发出警报,并将显示通知,无论用户当前登录到应用程序...

2 个答案:

答案 0 :(得分:1)

根据您关于在应用程序位于前台时能够处理该情况的评论,我假设该通知具有一些信息,用于标识通知所针对的用户。看起来如果您存储了一些标识当前用户登录的信息,在NSUserDefaults中,您应该能够在didReceiveRemoteNotification中检索该信息,并根据该信息决定是否应该处理通知。

更新添加更多信息:

您还需要实施application:didReceiveRemoteNotification:fetchCompletionHandler 并将您的通知转换为“静音”通知,然后在您从要抑制的通知中过滤掉要显示的通知后,您将为要显示的通知创建本地通知。您还需要在info.plist中添加UIBackgroundModes,并在您的有效负载中包含“content-available”键。有关详细信息,请参阅here

<key>UIBackgroundModes</key>
    <array>
        <string>fetch</string>
        <string>remote-notification</string>
    </array>
使用fetchCompletionHandler实现版本是严重,因为当应用程序处于后台时,不会调用没有该版本的版本。

以下是我的某个应用程序的示例,它接收位置更新请求的“静默”通知,并且还接收一些“非静默”通知。如果应用程序处于活动状态,我会显示“toast”,如果应用程序在后台,我会从远程通知创建本地通知,然后触发它。

func application(application: UIApplication, didReceiveRemoteNotification userInfo: [NSObject : AnyObject], fetchCompletionHandler handler: (UIBackgroundFetchResult) -> Void ) {
    log?.info("******* got a remote message = \(userInfo)  *******")
    let message: String = (userInfo["message"] ?? "stop") as! String
    log?.info("message = \(message)")
    switch message {
    case "update_locations":
      log?.info("starting location update cycle")
      locationUploader?.startUploading(handler)
    case "micropost_created":
      log?.info("got a new micropost notification")
      let notification = UILocalNotification()
      let userName = userInfo["user_name"] as? String ?? ""
      let content = userInfo["content"] as? String ?? ""
      notification.alertTitle = "Micropost from \(userName)"
      let alertBody = "\(userName) said: \(content)"
      notification.alertBody = alertBody
      notification.soundName = UILocalNotificationDefaultSoundName
      application.presentLocalNotificationNow(notification)
      if let topMostView = application.keyWindow {
        topMostView.makeToast(message: alertBody)
      }
      handler(.NewData)
    default:
      handler(.NoData)
    }
  }

答案 1 :(得分:0)

为了解决上述问题,我有两个选择  1.注销时,从登录用户的服务器数据库中删除令牌,每次新用户登录到新令牌的应用请求并发送到服务器时。  2.在注销时,应用程序可以从通知中心取消注册,登录应用程序必须自行注册以通知并更新服务器上的令牌。

以下是注册和取消注册通知的代码。 注销时:[[UIApplication sharedApplication] unregisterForRemoteNotifications];

登录时:

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