我通过推送通知实现了我的iPhone应用程序。我基本上成功实现了推送通知。当我点击推送通知消息时,该消息将显示在ViewController上的消息标签上。但是,当我打开图标(应用程序)时,它没有返回任何通知。我需要显示推送通知,不仅要点击推送通知,而且如果iOS用户也只是打开应用程序,它应该有效。
这是我的代码。
AppDelegate.m
-(BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary
*)launchOptions
{
[[UIApplication sharedApplication] registerForRemoteNotificationTypes:
(UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeSound | UIRemoteNotificationTypeAlert)];
}
- (void)application:(UIApplication*)application didReceiveRemoteNotification: (NSDictionary*)userInfo{
NSString *messageAlert = [[userInfo objectForKey:@"aps"] objectForKey:@"alert"];
NSLog(@"Received Push Message: %@", messageAlert );
[[NSNotificationCenter defaultCenter] postNotificationName:@"MyNotification" object:messageAlert];
在我的ViewController.m
上- (void)viewDidLoad
{
[super viewDidLoad];
[[NSNotificationCenter defaultCenter] addObserverForName:@"MyNotification" object:nil queue:nil usingBlock:^(NSNotification *note) {
NSString *_string = note.object;
messages.text = _string; //message
}];
}
}
当我点击通知时,它会显示通知。但是当我打开应用程序时,通知也必须显示该消息。怎么做?请帮帮我。
答案 0 :(得分:9)
推送通知主要有四种状态进入设备。让我们逐一考虑每个案例: -
CASE 1:当应用程序真正没有加载到内存中时(例如,当你启动它时,启动画面显示等),然后应用程序:didFinishLaunchingWithOptions被调用,你可以得到推送通知如下:
NSDictionary *remoteNotif = [launchOptions objectForKey:UIApplicationLaunchOptionsRemoteNotificationKey];
if(remoteNotif)
{
//Handle remote notification
}
案例2:如果应用程序已加载到内存中且处于ACTIVE状态(例如,应用程序当前在设备上打开)则只有应用程序:(UIApplication *)app didReceiveRemoteNotification:(NSDictionary *)userInfo叫做。正常的,正如你在这种情况下说的那样成功。
案例3:如果应用程序已加载到内存但不是ACTIVE并且没有后台(例如,您启动了应用程序,然后按下主页按钮,等待10秒钟),然后您单击推送通知上的操作按钮,仅调用didReceiveRemoteNotification。遵循以下方法。
-(void)application:(UIApplication *)app didReceiveRemoteNotification:(NSDictionary *)userInfo
{
if([app applicationState] == UIApplicationStateInactive)
{
//If the application state was inactive, this means the user pressed an action button
// from a notification.
//Handle notification
}
}
案例4:当应用程序处于后台时,然后点击图标,然后根据Apple的文档,您无法检索所有待处理的通知。
注意:为了解决这个问题,Apple在iOS 7中引入了应用程序后台启动的概念。但到目前为止,你不能这样做,直到iOS 6开发你必须坚持下去。
希望这有助于你!
答案 1 :(得分:4)
当用户点按应用图标时,方法didReceiveRemoteNotification不会触发。您需要在应用程序中捕获通知:didfinishLauncingWithOptions。有点像这样:
NSDictionary *localNotif =
[launchOptions objectForKey:UIApplicationLaunchOptionsRemoteNotificationKey];
NSLog(@"launchOptions: %@", launchOptions);
NSLog(@"localNotif: %@", localNotif);
if (localNotif) {
NSDictionary *itemName = [localNotif objectForKey:@"aps"];
NSLog(@"dict: %@, aps: %@", localNotif, itemName);
//your methods to process notification
}
答案 2 :(得分:1)
你做不到。这就是apple document所说的:
如果在运行iOS的设备上轻触应用程序图标,则应用程序会调用相同的方法,但不会提供有关通知的信息。如果在运行OS X的计算机上单击应用程序图标,则应用程序将调用委托的applicationDidFinishLaunching:方法,其中委托可以获取远程通知负载。
您可能希望查看this question & answer。