3

プッシュ通知を含むXamarin.iOSアプリケーションを作成しています。Xamarin iOS - プッシュ通知 - 到着からクリックされたプッシュ通知を区別する

アプリが(バックグラウンドではなく)実行されていない場合、プッシュ通知が(適切なペイロードで)到着したとき、OSは通知の処理を引き継いでユーザーに提示します閉じている間にユーザーが通知をクリックすると、FinishedLaunchingメソッドのNSDictionaryオプションパラメータ(UIApplication.LaunchOptionsRemoteNotificationKeyキーが含まれているかどうかを調べる)からこの情報を取得できます。

これまでのところ、すべてが素晴らしいです。アプリケーションが実行されている場合

が、私は2つのシナリオがあり、

1)プッシュ通知が届きます。 2)ユーザがアプリを起動した後に早く到着したプッシュ通知をクリックしたとき(

)、ReceivedRemoteNotificationメソッドが呼び出されます。

シナリオ1またはシナリオ2でReceivedRemoteNotificationが呼び出されたかどうかは、どのようにして知ることができますか。

私はXamarinが新しく、Webを検索しましたが、解決策が見つかりませんでした。

誰でも私にこれを助けることができますか?

ありがとうございました。

+0

私はアプリがアプリの実行中に受信した通知にユーザータップを経由して開始されたときにReceivedRemoteNotificationが呼ば見たことないと思います。通知がデバイスで配信されたときにアプリが実行されている場合にのみ呼び出されています。 –

答えて

4

上記のコードは、Objective-Cである

+0

私の答えと比較すると、これは間違いなく試してみる価値があります! –

1

アプリが停止している間に受け取った通知をユーザーがタップしてアプリを起動したときに、私はReceivedRemoteNotificationが呼び出されたとは思えません。通知がデバイスで配信されたときにアプリが実行されている場合にのみ呼び出されています。だからというフラグをFinishedLaunchingtrueから呼び出すと、ReceivedRemoteNotificationから呼び出されると、falseというフラグを渡すことで区別します。

これは出荷用の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

@RJVクマールが提案したアプローチをOPで調整してみるつもりです。なぜなら、これはもっと多くのiOSを意識しているからです。ニース! –

2

は非常にありがとう、didReceiveRemoteNotificationメソッド内、次の条件を使用して

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

FYI-をアプリケーションの状態を確認します多くの@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) 
    { 
    } 
} 
関連する問題