当App在iOS中运行Xamarin.Forms时,没有获得推送通知

时间:2018-05-09 13:55:35

标签: xamarin.forms xamarin.ios apple-push-notifications urbanairship.com

我已经实施了UrbanAirship以进行推送通知。当应用程序在后台关闭时,我会收到通知。但是,当应用程序运行时,我没有收到通知。

我附上了我的代码。有人可以调查一下,让我知道我在这里缺少什么吗?

谢谢。

AppDelegates.cs

public override bool FinishedLaunching(UIApplication uiApplication, NSDictionary launchOptions)
{
    UAirship.TakeOff();

    Xamarin.Forms.Forms.Init();
    LoadApplication(new App());

    UIApplication.SharedApplication.StatusBarHidden = false;
    UIApplication.SharedApplication.SetStatusBarStyle(UIStatusBarStyle.LightContent, false);

    _networkManager = new NetworkManager();

    UAirship.Push.UserPushNotificationsEnabled = true; 
    string chanelid = UAirship.Push.ChannelID;

    return base.FinishedLaunching(uiApplication, launchOptions);
}

[Export("userNotificationCenter:didReceiveNotificationResponse:withCompletionHandler:")]
public void DidReceiveNotificationResponse(UserNotifications.UNUserNotificationCenter center, UserNotifications.UNNotificationResponse response, Action completionHandler)
{
    var alert = new UIAlertView("Title1", "Message1", null, "Cancel", "OK");
    alert.Show();
    //TAPPED NOTIFICATION
}

//Or 

//Fire when background received notification is clicked
public override void DidReceiveRemoteNotification(UIApplication application, NSDictionary userInfo, Action<UIBackgroundFetchResult> completionHandler)
{
    var alert = new UIAlertView("Title2", "Message2", null, "Cancel", "OK");
    alert.Show();
}

info.plist中

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
  <dict>
    <key>CFBundleExecutable</key>
    <string></string>
    <key>CFBundleDisplayName</key>
    <string>MyProject</string>
    <key>CFBundleName</key>
    <string>MyProject</string>
    <key>CFBundleIdentifier</key>
    <string>com.xxxxxxxx.xxxxx</string>
    <key>CFBundleShortVersionString</key>
    <string>1.0</string>
    <key>CFBundleVersion</key>
    <string>1.0</string>
    <key>LSRequiresIPhoneOS</key>
    <true/>
    <key>MinimumOSVersion</key>
    <string>8.0</string>
    <key>UIDeviceFamily</key>
    <array>
      <integer>1</integer>
      <integer>2</integer>
    </array>
    <key>UILaunchStoryboardName</key>
    <string>LaunchScreen</string>
    <key>UIRequiredDeviceCapabilities</key>
    <array>
      <string>armv7</string>
    </array>
    <key>UISupportedInterfaceOrientations</key>
    <array>
      <string>UIInterfaceOrientationPortrait</string>
    </array>
    <key>UISupportedInterfaceOrientations~ipad</key>
    <array>
      <string>UIInterfaceOrientationPortrait</string>
      <string>UIInterfaceOrientationPortraitUpsideDown</string>
      <string>UIInterfaceOrientationLandscapeLeft</string>
      <string>UIInterfaceOrientationLandscapeRight</string>
    </array>
    <key>XSAppIconAssets</key>
    <string>Assets.xcassets/AppIcons.appiconset</string>
    <key>UIViewControllerBasedStatusBarAppearance</key>
    <false/>
    <key>NSAppTransportSecurity</key>
    <dict>
      <key>NSExceptionDomains</key>
      <dict>
        //some values
      </dict>
    </dict>
    <key>LSApplicationQueriesSchemes</key>
    <array>
      <string>fbapi</string>
      <string>fb-messenger-api</string>
      <string>fbauth2</string>
      <string>fbshareextension</string>
    </array>
    <key>UIStatusBarHidden</key>
    <true/>
    <key>UIMainStoryboardFile</key>
    <string>LaunchScreen</string>
    <key>NSPhotoLibraryUsageDescription</key>
    <string></string>
    <key>UIBackgroundModes</key>
    <array>
      <string>remote-notification</string>
    </array>
  </dict>
</plist>

规范

Windows 10

Visual Studio 2017(企业版)

Xamarin.Forms

1 个答案:

答案 0 :(得分:0)

我们有很多问题需要我们的工作。这就是我们提出的在前景和背景中工作的内容:

[Export("userNotificationCenter:willPresentNotification:withCompletionHandler:")]
public void WillPresentNotification(UNUserNotificationCenter center, UNNotification notification, Action<UNNotificationPresentationOptions> completionHandler)
{
    //FOREGROUND
    handleNotification(notification.Request.Content.UserInfo);
    completionHandler(UNNotificationPresentationOptions.Alert);
}
public void ApplicationReceivedRemoteMessage(RemoteMessage remoteMessage)
{
    //REMOTE iOS 10
    //NOT USED CURRENTLY
    handleNotification(remoteMessage.AppData);
}
public override void DidReceiveRemoteNotification(UIApplication application, NSDictionary userInfo, Action<UIBackgroundFetchResult> completionHandler)
{
    //BACKGROUND
    handleNotification(userInfo);
    completionHandler(UIBackgroundFetchResult.NewData);
}

private void handleNotification(NSDictionary userInfo)
{
    var payload = userInfo["TheStringIdentifierWhenSendingANotification"];

    var notificationData = JsonConvert.DeserializeObject<NotificationData>(payload.ToString());

    if (notificationData != null)
        MessagingCenter.Send<INotification, NotificationData>(this, Core.Helpers.Constants.Messaging.Notification, notificationData);
}

我看到的主要区别是我们的方法是willPresentNotification,而你的方法是didReceiveNotificationResponse。我不确定它是否会在以后的iOS版本中发生变化,但请尝试使用此方法,看看它是否适合您。

此外,我假设您收到任何通知,然后您的证书和权利设置正确;但仔细检查一下。