2016-09-22 137 views
2

我试图在我的应用处于前台时显示本地通知。我在显示远程通知时没有问题,但是当应用程序在前台运行时遇到问题。我只有新的iOS 10的问题。xcode 8和iOS 10本地通知

func application(application: UIApplication, didReceiveRemoteNotification userInfo: [NSObject : AnyObject], 
       fetchCompletionHandler completionHandler: (UIBackgroundFetchResult) -> Void) { 
    // TODO: Handle data of notification 

if application.applicationState == UIApplicationState.Active { 
    //print("Message ID: \(userInfo["gcm.message_id"]!)") 
    //print("Message ID: \(userInfo.keys)") 
     dispatch_async(dispatch_get_main_queue(), {() -> Void in 

      if (userInfo["notice"] != nil) { 

       if #available(iOS 10.0, *) { 

        print ("yes") 

        let content = UNMutableNotificationContent() 
        content.title = "My Car Wash" 
        content.body = (userInfo["notice"] as? String)! 
       } 

       else 
       { 
        let localNotification = UILocalNotification() 
        localNotification.fireDate = NSDate(timeIntervalSinceNow:0) 
        localNotification.alertBody = userInfo["notice"] as? String 
        localNotification.soundName = UILocalNotificationDefaultSoundName 

        localNotification.alertAction = nil 
        localNotification.timeZone = NSTimeZone.defaultTimeZone() 
        UIApplication.sharedApplication().scheduleLocalNotification(localNotification) 
        let systemSoundID: SystemSoundID = 1000 
        // to play sound 
        AudioServicesPlaySystemSound (systemSoundID) 
        AudioServicesPlaySystemSound(kSystemSoundID_Vibrate) 
        completionHandler(.NewData) 
       } 

      } 

     })} 
} 

我的iPhone运行iOS 10,我可以看到“是”被打印出来。我的应用程序具有必需的通知权限。

func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool { 
     // Register for remote notifications 
     let settings: UIUserNotificationSettings = 
      UIUserNotificationSettings(forTypes: [.Alert, .Badge, .Sound], categories: nil) 
     application.registerUserNotificationSettings(settings) 
     application.registerForRemoteNotifications() 
     // [END register_for_notifications] 
     FIRApp.configure() 
     // Add observer for InstanceID token refresh callback. 
     NSNotificationCenter.defaultCenter().addObserver(self, selector: #selector(self.tokenRefreshNotification), 
                 name: kFIRInstanceIDTokenRefreshNotification, object: nil) 
     return true 
    } 

正如在iOS 9设备上提到的,代码工作正常,当应用程序未运行时我收到通知。当应用处于前台时,问题出现在iOS 10上。我一直在寻找谷歌一段时间,但我仍然不在那里。任何帮助或建议将不胜感激。

+0

这应该对你有帮助:https://makeapppie.com/2016/08/08/how-to-make-local-notifications-in-ios-10/#comments – Do2

+0

用Objective-C方法http:// stackoverflow。 COM /问题/ 37938771/uilocalnotification-被弃用的功能于ios10/37969401#37969401 – ElonChan

回答

3

您的代码不iOS10工作,你必须使用

UserNotifications框架

对于运行iOS 9及以下的设备,实现AppDelegate application:didReceiveRemoteNotification:处理收到通知时,客户端应用程序是在前景

对于运行iOS 10及以上的设备,实现

UNUserNotificationCenterDelegate userNotificationCenter:willPresentNotification:withCompletionHandler: 

处理通知收到时,客户端应用程序在前台(从这里https://firebase.google.com/docs/notifications/ios/console-audience

您的代码必须是类似的东西(对火力地堡通知):

import UIKit 
import UserNotifications 

import Firebase 
import FirebaseInstanceID 
import FirebaseMessaging 

@UIApplicationMain 
class AppDelegate: UIResponder, UIApplicationDelegate { 

    var window: UIWindow? 

    func application(application: UIApplication, 
        didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool { 

    // [START register_for_notifications] 
    if #available(iOS 10.0, *) { 
     let authOptions : UNAuthorizationOptions = [.Alert, .Badge, .Sound] 
     UNUserNotificationCenter.currentNotificationCenter().requestAuthorizationWithOptions(
     authOptions, 
     completionHandler: {_,_ in }) 

     // For iOS 10 display notification (sent via APNS) 
     UNUserNotificationCenter.currentNotificationCenter().delegate = self 
     // For iOS 10 data message (sent via FCM) 
     FIRMessaging.messaging().remoteMessageDelegate = self 

    } else { 
     let settings: UIUserNotificationSettings = 
     UIUserNotificationSettings(forTypes: [.Alert, .Badge, .Sound], categories: nil) 
     application.registerUserNotificationSettings(settings) 
     application.registerForRemoteNotifications() 
    } 


    // [END register_for_notifications] 

    FIRApp.configure() 

    // Add observer for InstanceID token refresh callback. 
    NSNotificationCenter.defaultCenter().addObserver(self, 
     selector: #selector(self.tokenRefreshNotification), 
     name: kFIRInstanceIDTokenRefreshNotification, 
     object: nil) 

    return true 
    } 

    // [START receive_message] 
    func application(application: UIApplication, didReceiveRemoteNotification userInfo: [NSObject : AnyObject], 
        fetchCompletionHandler completionHandler: (UIBackgroundFetchResult) -> Void) { 
    // If you are receiving a notification message while your app is in the background, 
    // this callback will not be fired till the user taps on the notification launching the application. 
    // TODO: Handle data of notification 

    // Print message ID. 
    print("Message ID: \(userInfo["gcm.message_id"]!)") 

    // Print full message. 
    print("%@", userInfo) 
    } 
    // [END receive_message] 

    // [START refresh_token] 
    func tokenRefreshNotification(notification: NSNotification) { 
    if let refreshedToken = FIRInstanceID.instanceID().token() { 
     print("InstanceID token: \(refreshedToken)") 
    } 

    // Connect to FCM since connection may have failed when attempted before having a token. 
    connectToFcm() 
    } 
    // [END refresh_token] 

    // [START connect_to_fcm] 
    func connectToFcm() { 
    FIRMessaging.messaging().connectWithCompletion { (error) in 
     if (error != nil) { 
     print("Unable to connect with FCM. \(error)") 
     } else { 
     print("Connected to FCM.") 
     } 
    } 
    } 
    // [END connect_to_fcm] 

    func applicationDidBecomeActive(application: UIApplication) { 
    connectToFcm() 
    } 

    // [START disconnect_from_fcm] 
    func applicationDidEnterBackground(application: UIApplication) { 
    FIRMessaging.messaging().disconnect() 
    print("Disconnected from FCM.") 
    } 
    // [END disconnect_from_fcm] 
} 

// [START ios_10_message_handling] 
@available(iOS 10, *) 
extension AppDelegate : UNUserNotificationCenterDelegate { 

    // Receive displayed notifications for iOS 10 devices. 
    func userNotificationCenter(center: UNUserNotificationCenter, 
           willPresentNotification notification: UNNotification, 
    withCompletionHandler completionHandler: (UNNotificationPresentationOptions) -> Void) { 
    let userInfo = notification.request.content.userInfo 
    // Print message ID. 
    print("Message ID: \(userInfo["gcm.message_id"]!)") 

    // Print full message. 
    print("%@", userInfo) 
    } 
} 

extension AppDelegate : FIRMessagingDelegate { 
    // Receive data message on iOS 10 devices. 
    func applicationReceivedRemoteMessage(remoteMessage: FIRMessagingRemoteMessage) { 
    print("%@", remoteMessage.appData) 
    } 
} 

// [END ios_10_message_handling] 

从这里:https://github.com/firebase/quickstart-ios/blob/master/messaging/FCMSwift/AppDelegate.swift