• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    迪恩网络公众号

ios - Firebase iOS 11 在按钮按下后要求用户通知

[复制链接]
菜鸟教程小白 发表于 2022-12-12 14:07:36 | 显示全部楼层 |阅读模式 打印 上一主题 下一主题

我正在使用 Firebase 在 iOS 11 上启用推送通知。我试图仅在按下按钮后询问用户的通知权限。

目前,该应用在加载时会立即请求用户许可。按下按钮后,我想在 EnableNotificationViewController.swift 类中请求此权限。

AppDelegate.swift

import UIKit
import Firebase
import FBSDKCoreKit
import UserNotifications
import FirebaseInstanceID
import FirebaseMessaging

@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate, UNUserNotificationCenterDelegate, MessagingDelegate {

    var window: UIWindow?

    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
        // Override point for customization after application launch.

        FirebaseApp.configure()

        // [START set_messaging_delegate]
        Messaging.messaging().delegate = self


        if #available(iOS 10.0, *) {
            // For iOS 10 display notification (sent via APNS)
            UNUserNotificationCenter.current().delegate = self

            let authOptions: UNAuthorizationOptions = [.alert, .badge, .sound]
            UNUserNotificationCenter.current().requestAuthorization(
                options: authOptions,
                completionHandler: {_, _ in })
        } else {
            let settings: UIUserNotificationSettings =
                UIUserNotificationSettings(types: [.alert, .badge, .sound], categories: nil)
            application.registerUserNotificationSettings(settings)
        }

        application.registerForRemoteNotifications()

        FBSDKApplicationDelegate.sharedInstance().application(application, didFinishLaunchingWithOptions: launchOptions)
        return true
    }

    func application(_ application: UIApplication, open url: URL, sourceApplication: String?, annotation: Any) -> Bool {
        return FBSDKApplicationDelegate.sharedInstance().application(application, open: url, sourceApplication: sourceApplication, annotation: annotation)
    }

    func applicationWillResignActive(_ application: UIApplication) {
        // Sent when the application is about to move from active to inactive state. This can occur for certain types of temporary interruptions (such as an incoming phone call or SMS message) or when the user quits the application and it begins the transition to the background state.
        // Use this method to pause ongoing tasks, disable timers, and invalidate graphics rendering callbacks. Games should use this method to pause the game.
    }

    func applicationDidEnterBackground(_ application: UIApplication) {
        // Use this method to release shared resources, save user data, invalidate timers, and store enough application state information to restore your application to its current state in case it is terminated later.
        // If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits.
    }

    func applicationWillEnterForeground(_ application: UIApplication) {
        // Called as part of the transition from the background to the active state; here you can undo many of the changes made on entering the background.
    }

    func applicationDidBecomeActive(_ application: UIApplication) {
        // Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface.
        FBSDKAppEvents.activateApp()
    }

    func applicationWillTerminate(_ application: UIApplication) {
        // Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:.
    }

    // MARK: - Notifications

    // The callback to handle data message received via FCM for devices running iOS 10 or above.
    func application(received remoteMessage: MessagingRemoteMessage) {
        print(remoteMessage.appData)
    }


}

EnableLocationViewController.swift

import UIKit
import Spring
import Firebase

class EnableNotificationsViewController: UIViewController {

    // MARK: - Outlets
    @IBOutlet weak var textLabel: DesignableLabel!

    // MARK: - View Did Load
    override func viewDidLoad() {
        super.viewDidLoad()

    }

    // MARK: - Actions
    @IBAction func notificationButton(_ sender: UIButton) {

    }


}



Best Answer-推荐答案


你需要将远程通知权限请求移动到 AppDelegate 中的一个方法中,然后从名为 EnableNotificationsViewController 的 ViewController 中调用此方法。

让我们从 AppDelegate 开始并添加 registerAPNSServicesForApplication 方法:

///- register with APNS
func registerAPNSServicesForApplication(_ application: UIApplication,withBlock block: @escaping (_ granted:Bool) -> (Void)) {

    // [START register_for_notifications]
    if #available(iOS 10.0, *) {
        let authOptions: UNAuthorizationOptions = [.alert, .badge, .sound]
        UNUserNotificationCenter.current().requestAuthorization(
            options: authOptions,
            completionHandler: {granted, error in

                if granted == true{

                    DispatchQueue.main.async {
                        application.registerForRemoteNotifications()
                    }

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

                }

                block(granted)
        })

    } else {

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

    }

}

然后从您的 EnableNotificationsViewController 调用 AppDelegate 中的方法来请求权限,这样您就知道 iOS 10 及更高版本您将拥有权限的完成 block ,无论是否授予和我让它在完成 block 中返回到您的 View Controller 中,但不适用于 iOS 9 及更低版本,您需要特殊处理:

// MARK: - Actions
@IBAction func notificationButton(_ sender: UIButton) {

    let myApplication = UIApplication.shared.delegate as! AppDelegate
    myApplication.registerAPNSServicesForApplication(UIApplication.shared) { (granted) -> (Void) in

        if #available(iOS 10.0, *) {

            if granted {

            }else {

            }

        }else {

            // will not be returned because iOS 9 has no completion block for granting the permission it will require special way.

        }

    }

}

说实话,我没有配备 iOS 9 的设备来模拟完成 block ,但我认为 iOS 9 及以下版本的用户只有 10% 根据 Apple Analytics for November 2017

应该这样做

关于ios - Firebase iOS 11 在按钮按下后要求用户通知,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47611865/

回复

使用道具 举报

懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关注0

粉丝2

帖子830918

发布主题
阅读排行 更多
广告位

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap