主題 : ios 遠程推送消息時程序在后臺該怎么處理???

是這樣的,如果你的程序在未啟動的時候,如果用戶點擊通知,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。

最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內(nèi)容