IOS推送通知声音不来

Posted

技术标签:

【中文标题】IOS推送通知声音不来【英文标题】:IOS Push Notifications sound not coming 【发布时间】:2019-02-01 15:52:18 【问题描述】:

我正在处理 ios 推送通知,我可以在其中获取推送通知。但问题是我在收到推送通知时无法听到任何声音。我也检查了我的通知中心,在那里我已经启用了声音。我的代码如下,请指导我如何解决这个问题。

    @UIApplicationMain class AppDelegate: UIResponder, UIApplicationDelegate, UNUserNotificationCenterDelegate 

    var window: UIWindow?


    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool 
        UNUserNotificationCenter.current().delegate = self

        UNUserNotificationCenter.current().requestAuthorization(options: [.alert, .sound, .badge]) 
            (granted, error) in
            print("Permission granted: \(granted)")
            guard granted else  return 
            self.getNotificationSettings()
        

        return true
    

    func userNotificationCenter(_ center: UNUserNotificationCenter, willPresent notification: UNNotification, withCompletionHandler completionHandler: @escaping (UNNotificationPresentationOptions) -> Void)
    
        completionHandler([.alert, .badge, .sound])
    

    func getNotificationSettings() 
        UNUserNotificationCenter.current().getNotificationSettings  (settings) in
            print("Notification settings: \(settings)")
            guard settings.authorizationStatus == .authorized else 
                return
            
            DispatchQueue.main.async(execute: 
                UIApplication.shared.registerForRemoteNotifications()
            )
        
    

    func application(_ application: UIApplication,
                     didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) 
        createInstallationOnParse(deviceTokenData: deviceToken)
    


    func applicationWillResignActive(_ application: UIApplication) 
    

    func applicationDidEnterBackground(_ application: UIApplication) 
    

    func applicationWillEnterForeground(_ application: UIApplication) 
    

    func applicationDidBecomeActive(_ application: UIApplication) 
    

    func applicationWillTerminate(_ application: UIApplication) 
    

    func application(_ application: UIApplication,
                     didFailToRegisterForRemoteNotificationsWithError error: Error) 
        print("Failed to register: \(error)")
    


【问题讨论】:

【参考方案1】:

添加

class AppDelegate: UIResponder, UIApplicationDelegate , UNUserNotificationCenterDelegate 

当你这样做时

 UNUserNotificationCenter.current().delegate = self as? UNUserNotificationCenterDelegate

委托没有被保留,willPresent 方法没有被调用,所以这样做

 UNUserNotificationCenter.current().delegate = self   

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool 


    if #available(iOS 10.0, *) 
        let authOptions: UNAuthorizationOptions = [.alert, .badge, .sound]
        UNUserNotificationCenter.current().requestAuthorization(
            options: authOptions,
            completionHandler: _, _ in )

        // For iOS 10 display notification (sent via APNS)
        UNUserNotificationCenter.current().delegate = self

     else 
        let settings: UIUserNotificationSettings =
            UIUserNotificationSettings(types: [.alert, .badge, .sound], categories: nil)
        application.registerUserNotificationSettings(settings)
    

    application.registerForRemoteNotifications() 

    return true



func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) 
    let token = deviceToken.map  String(format: "%02.2hhx", $0) .joined()
    print("tokenMyDevice : \(token)")

 

func application(_ application: UIApplication,
                 didReceiveRemoteNotification userInfo: [AnyHashable : Any],
                 fetchCompletionHandler completionHandler: @escaping (UIBackgroundFetchResult) -> Void) 


    print("get push :  " , userInfo ,  UIApplication.shared.applicationState )



在此处阅读失败错误

func application(_ application: UIApplication, didFailToRegisterForRemoteNotificationsWithError error: Error) 
    print("failed to register for remote notifications with with error: \(error)")


@available(iOS 10, *)
extension AppDelegate : UNUserNotificationCenterDelegate 

    // Receive displayed notifications for iOS 10 devices.
    func userNotificationCenter(_ center: UNUserNotificationCenter,
                                willPresent notification: UNNotification,
                                withCompletionHandler completionHandler: @escaping (UNNotificationPresentationOptions) -> Void) 

     completionHandler([.sound,.alert])


    


【讨论】:

感谢您的回答,在我上面的代码 sn-p 中,我已经把您建议的那行放在了上面。请您检查并指导我。 你能检查我更新的答案吗?还是不行。 我已经尝试过你的建议,仍然没有声音。 你删除了willPresent ? 请检查一下。仍然没有声音..但我能够在后台和前台获得推送通知。

以上是关于IOS推送通知声音不来的主要内容,如果未能解决你的问题,请参考以下文章

iOS推送通知自定义声音

iOS - 仅带声音的推送通知

如何使用 FCM 在 ios 推送通知中播放自定义通知声音

ios8 的 Parse 推送通知中没有声音

IOS推送通知自定义声音不起作用

使用 GCM 的 iOS 自定义推送通知声音