是這樣的,如果你的程序在未啟動的時候,如果用戶點擊通知,notification會通過didFinishLaunchingWithOptions:傳遞給您,如果用戶未點擊通知,則didFinishLaunchingWithOptions:的字典里不會有notification的信息,同理,如果你的程序正在后臺運行,如果用戶點擊通知,則(void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo會在你的程序進入前臺后才會被調(diào)用(注意是通過點按通知啟動才會被調(diào)用)如果用戶收到了通知但是沒有點按通知,而是點擊屏幕上的App圖標進入的app,則(void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo不會被調(diào)用,里面的代碼不會被執(zhí)行。
下面回答你的問題,看你的代碼應該是你知道了通過通知啟動未在后臺運行的App這種情況下如何加載你的userinfo,你是通過ViewController的viewDidLoad來查詢AppDelegate的push屬性,并加載其中的內(nèi)容。不過我認為你這么做是有問題的。以為viewDidLoad會先于application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions執(zhí)行,所以你的viewDidLoad方法執(zhí)行的時候由于application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions尚未執(zhí)行,得到push屬性應該是nil。不知道您有沒有注意這個問題,所以不建議你這么做。正確的做法我認為應該是:
1)為你的AppDelegate添加一個viewController類型的弱引用成員變量或者屬性(比如@property (weak, nonatomic) viewController *mainViewController;
2) 在你的viewDidLoad委托方法里將上述屬性設置為自身( appDelegate.mainViewController=self;? )
3) 為你的viewController創(chuàng)建一個公開的方法,用以AppDelegate發(fā)送消息告知viewController內(nèi)容有更新
//? viewController.h
@interface viewController : NSViewController
.....
-(void)updateForNotification;
....
@end
// viewController.m
@implementation viewController
......
-(void)updateForNotification {
NSString *url = [[NSString alloc] init];
RKAppDelegate *appDelegate = [[UIApplication sharedApplication] delegate];
url = [ NSString stringWithFormat:@"%@", appDelegate.push];
if ([url isEqual:@"(null)"])
{
[self.webViewDelegate loadUrl:@"http://www.baidu.com"];
}else{
[self.webViewDelegate loadUrl:url];
appDelegate.push = nil;
}
}
.....
@end
4) 最后要做的就是AppDelegate在合適的時機發(fā)送這個消息,也就是在兩個預通知有關的委托方法里處理自己的push并調(diào)用mainViewController的updateForNotification方法。
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions{
if (launchOptions) {
NSString *pushString =? [NSString stringWithFormat:@"%@", launchOptions];
RKAppDelegate *appDelegate = [[UIApplication sharedApplication] delegate];
NSString *url= [[launchOptions objectForKey:@"UIApplicationLaunchOptionsRemoteNotificationKey"] objectForKey:@"url"];
appDelegate.push= url;
[_mainViewController updateForNotification];
}
}
- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo {
// 處理你的userinfo并將需要的信息賦值給appDelegate的push屬性
.............Your code here..........
[_mainViewController updateForNotification];
}
希望有幫助
補充一下,(void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo不僅僅是用戶點擊推送進入app時候會被調(diào)用,用戶在前臺的時候收到推送通知的時候,推送不會顯示,但是該過程也會被調(diào)用,所以需要在這個地方注意一下。可以判斷一下程序是剛剛進入前臺,還是已在前臺。并選擇是否通知viewController。