3

Я создаю приложение Xamarin.iOS, которое включает push-уведомления.Xamarin iOS - Push-уведомления - отличное уведомление о нажатии нажата от полученного

Я заметил, что если приложение не работает (не только на заднем плане), когда прибыло push-уведомление (с правильной нагрузкой), ОС возьмет на себя обработку уведомления и представит его пользователю и если пользователь нажимает на уведомление во время его закрытия, я смогу получить эту информацию из параметра параметров NSDictionary метода FinishedLaunching (если он содержит ключ UIApplication.LaunchOptionsRemoteNotificationKey)

пока что все отлично ,

, но у меня есть два сценария,

1) толкающее поступает уведомление, когда приложение работает. 2) пользователь нажал на push-уведомление, которое прибыло ранее (пока приложение было закрыто) после того, как он запускает приложение

для обоих сценариев вызывается метод 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, когда приложение запускается при нажатии на уведомление пользователя, когда приложение остановлено. Я видел это только в том случае, если приложение запущено, когда уведомление отправлено на устройство. Таким образом, мы различаем, пропустив флаг с именем isAppAlreadyRunning, установленный false, если вызвано от FinishedLaunching, true, если вызвано от ReceivedRemoteNotification.

Это, кажется, хорошо работает в приложении 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 Kumar как измененный OP, потому что он выглядит намного более осведомленным о 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) 
    { 
    } 
} 
Смежные вопросы