簡體   English   中英

當應用程序在后台運行時,將觸發哪種方法進行推送通知?

[英]Which method will be triggered for pushnotification when app is in background?

我已經在我的應用程序中實現了推送通知。 當App在前台時,將調用didReceiveRemoteNotification方法。 但是當應用程序在后台運行時,不會調用此方法。 服務器端使用以下模式:

{ 
  aps: {
          content-available: 1,
          sound: "default"
       }
}

但是仍然沒有調用didReceiveRemoteNotification。 推送通知到達后要觸發該方法還需要做些什么。

當設備收到推送通知時,有一個新的API可用於處理后台事件:

- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult result))handler

現在,根據文檔:

與application:didReceiveRemoteNotification:方法不同,該方法僅在您的應用程序運行時才被調用,而無論應用程序的狀態如何,系統都會調用此方法。 如果您的應用程序已掛起或未運行,則系統會在調用該方法之前喚醒或啟動您的應用程序並將其置於后台運行狀態。

調用此方法時,您的應用最多有30秒的掛鍾時間來執行下載操作並調用指定的完成處理程序塊。 實際上,您的應用程序應在下載所需數據后盡快調用處理程序塊。 如果您沒有及時調用處理程序,則您的應用將被暫停。 更重要的是,系統使用經過的時間來計算應用程序后台下載的功耗和數據成本。

要觸發此方法,您的通知有效負載必須包含鍵content-available

{
    "aps" : {
        "content-available" : 1
    },
    "content-id" : 42
}

示例代碼:

- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler
{
    NSLog(@"Remote Notification userInfo is %@", userInfo);

    NSNumber *contentID = userInfo[@"content-id"];
    // Do something with the content ID
    completionHandler(UIBackgroundFetchResultNewData);
}

當推送通知到達應用程序活動狀態時,將調用didReceiveRemoteNotification方法。 如果在推送通知到達時app處於非活動狀態,則調用didReceiveRemoteNotification方法的選項是單擊從通知列表接收的通知並變為活動狀態。 如果應用程序在推送通知到達時處於非活動狀態,並且通過不單擊接收到的通知就變為活動狀態,則通常無法調用didReceiveRemoteNotification方法。

如果您需要應用程序,則可以通過自定義服務器進行處理。 每當應用程序激活時,都可以實施API調用以列出待處理的通知。

這將被稱為:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions;

檢查launchOptions

  NSDictionary *pushInformation = [launchOptions objectForKey:UIApplicationLaunchOptionsRemoteNotificationKey];
  if(pushInformation)
  {
    // App opened with push notification
  }

didReceiveRemoteNotification如果您的應用程序位於UIApplicationStateActive則會調用

didReceiveRemoteNotification如果您的應用程序是將被稱為UIApplicationStateBackgroundUIApplicationStateInactive和用戶打開從通知中心推送通知。

如果應用程序不在后台,則會在啟動時調用didFinishLaunchingWithOptions

- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo{

    if (application.applicationState == UIApplicationStateActive )
    {
       //Your Code here
    }
    else if (application.applicationState == UIApplicationStateBackground || application.applicationState == UIApplicationStateInactive)
    {
        //Your code here
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM