【发布时间】:2011-07-18 11:48:35
【问题描述】:
当应用程序在后台接收到远程推送通知时,应用程序进入 applicationDidBecomeActive。从那里,我如何从通知中访问数据的 NSDictionary?
【问题讨论】:
标签: iphone objective-c cocoa-touch nsnotifications
当应用程序在后台接收到远程推送通知时,应用程序进入 applicationDidBecomeActive。从那里,我如何从通知中访问数据的 NSDictionary?
【问题讨论】:
标签: iphone objective-c cocoa-touch nsnotifications
通知数据在application:didReceiveRemoteNotification: 中传送到您的应用程序。如果你想在applicationDidBecomeActive: 中处理它,你应该将它存储在application:didReceiveRemoteNotification: 并在applicationDidBecomeActive 中再次读取。
【讨论】:
application:didReceiveRemoteNotification: 中,您可以查询-[UIApplication applicationState] 以了解您的应用是否已经在前台。如果是,则立即处理通知。
Swift 版本:
var dUserInfo: [NSObject : AnyObject]?
func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
// code...
if let info = launchOptions?[UIApplicationLaunchOptionsRemoteNotificationKey] as? [NSObject : AnyObject] {
dUserInfo = info
}
return true
}
func application(application: UIApplication, didReceiveRemoteNotification userInfo: [NSObject : AnyObject]) {
dUserInfo = userInfo
}
func applicationDidBecomeActive(application: UIApplication) {
// code...
self.yourAction(dUserInfo)
}
func yourAction(userInfo: [NSObject : AnyObject]?) {
if let info = userInfo?["aps"] as? Dictionary<String, AnyObject> {
}
}
【讨论】:
我使用这段代码来管理推送:
在 AppDelegate 中
@implementation AppDelegate{
NSDictionary *dUserInfo; //To storage the push data
}
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
//Check for options
if (launchOptions != nil)
{
//Store the data from the push.
dUserInfo = [launchOptions objectForKey:UIApplicationLaunchOptionsRemoteNotificationKey];
if (dUserInfo != nil)
{
//Do whatever you need
}
}
return YES;
}
- (void)applicationDidBecomeActive:(UIApplication *)application
{
//Data from the push.
if (dUserInfo != nil)
{
//Do whatever you need
}
}
- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo
{
//Store the data from the push.
if (userInfo != nil)
{
dUserInfo = userInfo;
}
}
我希望这对某人有用。
编码愉快。
【讨论】:
如果您的应用在收到并点击推送通知时处于background 状态,则应用将使用application:didFinishLaunchingWithOptions: 而不是application:didReceiveRemoteNotification: 调用。
可以从launchOptions 字典中的application:didFinishLaunchingWithOptions: 访问推送通知负载。
【讨论】: