2016-09-22 171 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