推送

作者: weyan | 来源:发表于2020-03-07 16:18 被阅读0次

一、推送

1.本地推送

(1)iOS8.0+

--------------------------AppDelegate----------------------------
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
        print(#function)
        //本地推送请求授权
        registerAuthor()
        // 当app退出时,点击本地通知启动app,判断是否点击本地通知启动的,从而获取本地通知
        if launchOptions != nil {
            let localNotice = launchOptions![UIApplicationLaunchOptionsKey.localNotification]
            print(localNotice!)
        }
        
        return true
    }
    
    /**
     *  推送通知发送权限:
     *  如果是iOS8.0以前, 直接通过以下代码就可以发送
     *  如果是iOS8.0之后, 需要主动的向用户请求授权
     */
    func registerAuthor() {
        
        if #available(iOS 8.0, *){
            
            let types = (UIUserNotificationType.badge.rawValue | UIUserNotificationType.sound.rawValue | UIUserNotificationType.alert.rawValue)
            let settings = UIUserNotificationSettings(types: UIUserNotificationType(rawValue: types), categories: nil)
            UIApplication.shared.registerUserNotificationSettings(settings)
        }
    }
        
        // 接收到本地通知, 并且满足以下条件时调用
        // 1. APP 在前台 (不会弹框)
        // 2. APP 在后台, 点击推送进入前台
        // 3. APP 锁屏, 点击推送进入前台
        // 注意: App退出时, 不调用此方法
        func application(_ application: UIApplication, didReceive:UILocalNotification ){
            print("接收本地通知")
            if application.applicationState == .active{
                print("app当前处于前台状态")
            }else if application.applicationState == .inactive{
                print("app从后台进入前台状态")
            }
        }
------------------------------ViewController.Swift-------------------------------
import UIKit

class ViewController: UIViewController {
    
    @IBAction func sendNotification(_ sender: UIButton) {
        // 1. 创建一个本地通知
        let localNotice = UILocalNotification()
        
        // 1.1 设置通知必选项
        // 1.1.1 设置通知发送时间
        localNotice.fireDate = NSDate(timeIntervalSinceNow: 5) as Date
        localNotice.timeZone = NSTimeZone.default
        // 1.1.2 设置通知内容
        localNotice.alertBody = "王二小在山边吃草"
        
        // 1.2 设置通知附加选项
        // 1.2.1 设置通知重复周期(间隔至少1分钟)
        //        localNotice.repeatInterval = NSCalendarUnit.Minute
        
        // 1.2.2 设置滑动文字(锁屏界面上的"滑动来" + alertAction内容)
        localNotice.alertAction = "决定"
        localNotice.hasAction = true
        
        // 1.2.3 设置启动图片
        localNotice.alertLaunchImage = nil
        
        // 1.2.4 设置通知标题
        if #available(iOS 8.2, *) {
            localNotice.alertTitle = "斗地主"
        }
        
        // 1.2.5 设置通知提示音
        localNotice.soundName = "buyao.wav"
        
        // 1.2.6 设置提示图标
        localNotice.applicationIconBadgeNumber = 1
        
        // 1.2.7 设置附加信息(用于数据传递)
        localNotice.userInfo = ["name": "shunzi", "age": 10]
        
        
        // 1.3 设置附加选项
        if #available(iOS 8.0, *) {
            localNotice.category = "select"
        } else {
            // Fallback on earlier versions
        }
        
        // 2. 发送一个本地通知
        // 立即发送
        // UIApplication.sharedApplication().presentLocalNotificationNow(localNotice)
        
        // 根据计划时间, 计划发送一个通知
        UIApplication.shared.scheduleLocalNotification(localNotice)
    }
    
    @IBAction func cancelNotification(_ sender: UIButton) {
        //取消所有本地通知
        UIApplication.shared.cancelAllLocalNotifications()
        //取消某一个本地通知
//        UIApplication.shared.cancelLocalNotification(<#T##notification: UILocalNotification##UILocalNotification#>)
    }
    
    @IBAction func lookNotification(_ sender: UIButton) {
        let localNotis =  UIApplication.shared.scheduledLocalNotifications
        print(localNotis!)
    }
    
}

(2)设置附加行为选项

/**
     *  推送通知发送权限:
     *  如果是iOS8.0以前, 直接通过以下代码就可以发送
     *  如果是iOS8.0之后, 需要主动的向用户请求授权
     */
    func registerAuthor() {
        
        if #available(iOS 8.0, *){
            //1.创建一个操作选项组
            let category: UIMutableUserNotificationCategory = UIMutableUserNotificationCategory()
            //1.1每一组的标识
            category.identifier = "select"
            //1.2设置组的操作行为
            
            //1.2.1设置一个行为
            let action1: UIMutableUserNotificationAction = UIMutableUserNotificationAction()
            //行为的标识,区别用户点击的是哪一个行为
            action1.identifier = "shunzi"
            //行为名称
            action1.title = "顺子"
            
            //设置行为执行的环境
            //Foreground 意味着用户点击了这个按钮,就会进入前台,执行对应的行为
            //Background 意味着用户点击了这个按钮,在后台,就可以执行对应的行为
            action1.activationMode = .foreground
            
            //设置是否需要必须解锁才能使用
            //如果activationMode设置是前台,则这个属性会被忽略
            action1.isAuthenticationRequired = true
            
            //设置是否是一个破坏性行为(通过一些颜色,来标识这个按钮,惊醒用户)
            action1.isDestructive = true;
            //修改行为的样式
            if #available(iOS 9.0, *) {
                action1.behavior = .textInput
                //设置行为参数
                action1.parameters = [UIUserNotificationTextInputActionButtonTitleKey: "压死"]
            }
            
            //1.2.2 设置另一个行为
            let action2: UIMutableUserNotificationAction = UIMutableUserNotificationAction()
            //行为的标识,区别用户点击的是哪一个行为
            action2.identifier = "wangzha"
            //行为名称
            action2.title = "王炸"
            
            //设置行为执行的环境
            //Foreground 意味着用户点击了这个按钮,就会进入前台,执行对应的行为
            //Background 意味着用户点击了这个按钮,在后台,就可以执行对应的行为
            action2.activationMode = .background
            
            //设置是否需要必须解锁才能使用
            //如果activationMode设置是前台,则这个属性会被忽略
            action2.isAuthenticationRequired = true
            
            //设置是否是一个破坏性行为(通过一些颜色,来标识这个按钮,惊醒用户)
            action2.isDestructive = true;
            
            //1.3 行为组
            let actions:[UIUserNotificationAction] = [action1,action2]
            //Default 默认只能添加4个行为
            //Minal 默认只能添加2个行为
            category.setActions(actions, for: UIUserNotificationActionContext.default)
            
            //2.创建一个操作选项组集合
            let categoriesSet: Set<UIUserNotificationCategory> = [category]
            //3.设置请求的权限是什么
            let types = (UIUserNotificationType.badge.rawValue | UIUserNotificationType.sound.rawValue | UIUserNotificationType.alert.rawValue)
            let settings: UIUserNotificationSettings = UIUserNotificationSettings(types: UIUserNotificationType(rawValue: types), categories: categoriesSet)
            UIApplication.shared.registerUserNotificationSettings(settings)
        }
    }
    
    //iOS8.0+
    func application(_ application: UIApplication, handleActionWithIdentifier identifier: String?, for notification: UILocalNotification, completionHandler: @escaping () -> Void) {
        print("iOS8.0+")
        completionHandler()
    }
    //iOS9.0+
    func application(_ application: UIApplication, handleActionWithIdentifier identifier: String?, for notification: UILocalNotification, withResponseInfo responseInfo: [AnyHashable : Any], completionHandler: @escaping () -> Void) {
        if identifier == "shunzi" {
            let str: String = responseInfo[UIUserNotificationActionResponseTypedTextKey] as! String
            print("使用顺子"+str+"压死")
        }else if identifier == "wangzha"{
            print("炸死")
        }
        completionHandler()
    }

2.远程推送

相关文章

网友评论

      本文标题:推送

      本文链接:https://www.haomeiwen.com/subject/pimbgqtx.html