2015-12-02 46 views
3

我正在寻找如何处理推送通知有效负载数据的方式,只要通知到达客户端应用程序而不打开或点击它。而且我仍然不会获取数据,除非用户点击或只有当用户点击屏幕上的通知时才会触发功能didReceiveRemoteNotification。所以,当通知到达客户端应用程序时,如何获取通知有效载荷数据,即使用户忽略(没有打开或点击)它。处理推送通知有效负载数据

信息:我听说GCM(Google Cloud Messaging)可以在客户端应用程序用户点击通知或不通知的情况下生成通知处理程序。它可以在不需要时即刻捕获通知有效载荷json数据用户点击或打开它。是吗?

我真的需要一个人来接我,通知ios的有效载荷数据,甚至不需要用户打开或点击它。

更新:该应用程序仍在设备上运行,这意味着它是active.I可以得到有效载荷数据,当我点击我的通知是“{APS:} JSON我得到它。但是,我仍然无法得到当我不打开通知”

数据这是我的状态

当应用程序在前台,我得到的数据。 1.I运行应用程序,

2.发送通知,

3.Get与警报通知,

4,我得到的数据(有效载荷)。

当应用程序处于活动状态时正常工作。

但是,当应用程序达到背景

1.Run的应用程序,

2.Close应用程序按home键,

3.Send通知,

4 。获取通知。

5.但是,无法获取数据,直到我点击通知我在横幅 或通知中心收到通知。

但是,当我点击通知横幅或通知它去应用程序,然后我得到的数据。

是否有无论如何,我可以得到的数据,如果应用程序在后台收到通知时。

下面是代码:

import UIKit 
import RealmSwift 

let realm = try! Realm() 

@UIApplicationMain 
class AppDelegate: UIResponder, UIApplicationDelegate { 

var window: UIWindow? 
var data : [NSObject : AnyObject]! 

func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool { 
    //one singnal is the push notification service that i use for push notification. 
    let oneSignal = OneSignal(launchOptions: launchOptions, appId: "__app_id__") { (message, additionalData, isActive) in 
     NSLog("OneSignal Notification opened:\nMessage: %@", message) 

     if additionalData != nil { 
      NSLog("additionalData: %@", additionalData) 
     } 
    } 
    oneSignal.enableInAppAlertNotification(true) 
    return true 
} 

func application(application: UIApplication, didReceiveRemoteNotification userInfo: [NSObject : AnyObject], fetchCompletionHandler completionHandler: (UIBackgroundFetchResult) -> Void) { 
    print("User Info : \(userInfo)") 
    if let custom = userInfo["custom"] as? NSDictionary{ 
     if let a = custom["a"] as? NSDictionary{ 
      print("A : \(a)") 
     } 
    } 
} 
+0

就得到这种方法didReceiveRemoteNotification通知数据? –

+0

@Maulik当用户点击(打开)它,是的...我得到有效载荷(json)数据。 –

+0

我认为你不打开通知屏幕时,应用程序关闭我的权利 ? –

回答

1

我碰到了同样的问题来了。正如前面的评论所述,this post非常有帮助。

According to Apple

当远程通知到达时,系统将显示 通知给用户,并在背景中启动应用程序(如果需要的话 ),以便它可以调用此方法。在 背景中启动您的应用程序可为您提供处理通知的时间,并下载与其关联的任何 数据,从而最大限度地减少通知到达之间经过的时间量,并将该数据显示给用户 。

您需要做的第一件事就是让您的应用程序在后台执行某些操作。您可以在info.plist中添加Required background mode,然后将其添加到App downloads content in response to push notifications。您的info.plist应该是这个样子:

info.plist Required background modes

现在这样做,当它收到一个通知你的应用程序应该清醒。您可以在didReceiveRemoteNotification内执行一个小代码。如此。

func application(application: UIApplication, didReceiveRemoteNotification userInfo: [NSObject : AnyObject], fetchCompletionHandler completionHandler: (UIBackgroundFetchResult) -> Void) { 
//do some code here 
UIBackgroundFetchResult.NewData 
} 

注意,你必须要注意completionHandler:

只要处理完的通知,则必须调用 块的处理器参数或您的应用程序将被终止。您的 应用程序有多达30秒的挂钟时间来处理 通知并调用指定的完成处理程序块。

让我知道,如果一切都清楚了:)