3

我正在創建一個包含推送通知的Xamarin.iOS應用程序。Xamarin iOS - 推送通知 - 區分從抵達點擊的推送通知

我注意到,如果應用程序沒有運行(不只是在後臺),當推送通知到達(使用正確的有效載荷)時,操作系統將接管處理通知並將其呈現給用戶並且如果用戶在關閉時點擊通知,我將能夠從FinishedLaunching方法的NSDictionary選項參數中獲取此信息(查找它是否包含UIApplication.LaunchOptionsRemoteNotificationKey鍵)

到目前爲止,一切都很棒。

,但我有兩個場景,

1)推送通知的應用程序運行時到達。 2)用戶在啓動應用程序

後,點擊了較早抵達的推送通知(應用程序關閉時),則調用方法ReceivedRemoteNotification。我的問題是: 如何知道ReceivedRemoteNotification是由場景1還是場景2調用的?

我剛接觸Xamarin,我在網上搜索過它,但找不到解決方案。

任何人都可以幫助我嗎?

謝謝。

+0

,我不認爲我已經看到,當應用程序通過用戶自來水開始收到通知,而應用程序正在運行ReceivedRemoteNotification調用。如果應用程序在設備上傳遞通知時運行,我只會看到這個名稱。 –

回答

4

請用以下的條件,didReceiveRemoteNotification方法中的應用程序狀態,

UIApplicationState state = [[UIApplication sharedApplication] applicationState]; 
if (state == UIApplicationStateBackground || state == UIApplicationStateInactive) 
{//write here...Application opened by tapping notification} 

FYI-上面的代碼是在Objective-C

+0

與我的回答相比,這絕對值得一試! –

1

我不認爲我見過ReceivedRemoteNotification,當應用程序通過用戶點擊接收到的應用程序停止時收到的通知啓動時調用。如果應用程序在設備上傳遞通知時運行,我只會看到這個名稱。因此,如果從FinishedLaunching調用isAppAlreadyRunning集合false,如果從ReceivedRemoteNotification調用true,則我們區分。

這似乎在運送Xamarin.iOS應用程序中運行良好。所有的代碼是在AppDelegate.cs

public override bool FinishedLaunching(UIApplication app, NSDictionary options) 
{ 

... 

    // Initialize Xamarin Forms and load the application. 
    Xamarin.Forms.Forms.Init(); 
    LoadApplication(new Forms.App(0)); 

    // Check if App was opened by Push Notification. 
    var keyName = new NSString("UIApplicationLaunchOptionsRemoteNotificationKey"); 
    if (options != null && options.Keys != null && options.Keys.Length != 0 && options.ContainsKey(keyName)) 
    { 
     NSDictionary pushOptions = options.ObjectForKey(keyName) as NSDictionary; 
     ProcessPushNotification(pushOptions, false); 
    } 

    return base.FinishedLaunching(app, options); 
} 

public override void ReceivedRemoteNotification(UIApplication app, NSDictionary userInfo) 
{ 
    Debug.WriteLine("ReceivedRemoteNotification entered."); 
    ProcessPushNotification(userInfo, true); 
} 

protected void ProcessPushNotification(NSDictionary userInfo, bool isAppAlreadyRunning) 
{ 
    if (userInfo == null) return; 
    if (isAppAlreadyRunning) 
    { 
     // do something with this knowledge... 
    } 

    ... 
} 
+0

我將嘗試由OP調整的@RJV Kumar提出的方法,因爲它看起來更像iOS。太好了! –

2

非常感謝你很多@RJVKumar這就是我一直在尋找的!

幫助別人,這是在C#代碼:

public override void ReceivedRemoteNotification(UIApplication application, NSDictionary userInfo) 
{ 
    if (application.ApplicationState == UIApplicationState.Active) 
    { 
    } 
    else if (application.ApplicationState == UIApplicationState.Background) 
    { 
    } 
    else if (application.ApplicationState == UIApplicationState.Inactive) 
    { 
    } 
}