美文网首页Swift
swift 集成极光推送

swift 集成极光推送

作者: 顾不上回头的奔跑者 | 来源:发表于2018-10-11 17:26 被阅读719次

    在极光官网下申请程序。

    image.png

    进行证书配置,证书分开发证书,跟生产证书。用xcode跑到手机上的项目需要开发证书,打包上架的需要生产证书,这个就不多说了相信大家都可以实现。(哎,还是给大家甩个链接吧,谁让我是负责任的人那)https://www.jianshu.com/p/e62810d13df9

    image.png

    cocopoapods集成JPush (没用coco 的小伙伴我就不说了,在我们公司就被乱刀砍死了,赶紧安cocoapods去吧,还愣着干什么)

    在你的Podfile文件下添加

    pod 'JPush'#极光推送
    

    终端中敲下

     pod install --no-repo-update
    

    搞定,这个时候你的pods目录下应该多俩这个


    image.png

    因为这是oc 写的,但我们现在是在拿swift敲代码有木有,这个时候就需要一个叫桥接文件的东西来帮我们搭个桥了。


    image.png

    我的是之前建 好了,没有桥接文件的,你就去添加个oc 文件,系统自动就给你建好桥接文件了


    image.png

    好了,假装你的桥接文件也没有问题啊,桥接文件里写什么?给你们个可以复制粘贴的代码吧

    #import "JPUSHService.h"
    // iOS10注册APNs所需头文件
    #ifdef NSFoundationVersionNumber_iOS_9_x_Max
    #import <UserNotifications/UserNotifications.h>
    #endif
    // 如果需要使用 idfa 功能所需要引入的头文件(可选)
    //#import <AdSupport/AdSupport.h>
    

    哈哈废话一大堆,见谅见谅,就爱撤个犊子。好吧,下面儿是真正的开发代码了啊


    appdelegate 里的 didFinishLaunchingWithOptions 方法里(不要试图用我的appKey了,我这么谨慎的人当然放的假的了,自己去极光官网上自己的项目里拿appKey 了)

            //推送代码
            let entity = JPUSHRegisterEntity()
            entity.types = 1 << 0 | 1 << 1 | 1 << 2
            JPUSHService.register(forRemoteNotificationConfig: entity, delegate: self)
            //需要IDFA 功能,定向投放广告功能
            //let advertisingId = ASIdentifierManager.shared().advertisingIdentifier.uuidString
            JPUSHService.setup(withOption: launchOptions, appKey: "7a84363c8be53oba2c8d1a72", channel: "App Store", apsForProduction: false, advertisingIdentifier: nil)
    

    还支持iOS8.0之前的朋友,再去百度下8.0之前怎么写吧,我这不没适配8.0之前的(都iOS12了还支持8.0 之前的是不是傻,9.0之前的我都不想支持了)哈哈,好吧,主要小弟的项目小,不需要考虑那么多。

    JPUSHRegisterDelegate 代理方法。什么?你问我这些代理方法干啥的。跟你有关系吗,复制粘贴就完了,这孩子,真的是事儿多(哎呀,吓死我了,没暴露我的水平吧。)

    //MARK:--推送代理
    extension AppDelegate : JPUSHRegisterDelegate {
        @available(iOS 10.0, *)
        func jpushNotificationCenter(_ center: UNUserNotificationCenter!, willPresent notification: UNNotification!, withCompletionHandler completionHandler: ((Int) -> Void)!) {
            
            let userInfo = notification.request.content.userInfo
            if notification.request.trigger is UNPushNotificationTrigger {
                JPUSHService.handleRemoteNotification(userInfo)
            }
           // 需要执行这个方法,选择是否提醒用户,有Badge、Sound、Alert三种类型可以选择设置
           completionHandler(Int(UNNotificationPresentationOptions.alert.rawValue))
        }
        
        @available(iOS 10.0, *)
        func jpushNotificationCenter(_ center: UNUserNotificationCenter!, didReceive response: UNNotificationResponse!, withCompletionHandler completionHandler: (() -> Void)!) {
           let userInfo = response.notification.request.content.userInfo
            if response.notification.request.trigger is UNPushNotificationTrigger {
                JPUSHService.handleRemoteNotification(userInfo)
            }
            // 系统要求执行这个方法
            completionHandler()
        }
        
        //点推送进来执行这个方法
        func application(_ application: UIApplication, didReceiveRemoteNotification userInfo: [AnyHashable : Any], fetchCompletionHandler completionHandler: @escaping (UIBackgroundFetchResult) -> Void) {
               JPUSHService.handleRemoteNotification(userInfo)
               completionHandler(UIBackgroundFetchResult.newData)
            
        }
        //系统获取Token
        func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) {
            JPUSHService.registerDeviceToken(deviceToken)
        }
        //获取token 失败
        func application(_ application: UIApplication, didFailToRegisterForRemoteNotificationsWithError error: Error) { //可选
            print("did Fail To Register For Remote Notifications With Error: \(error)")
        }
    }
    

    推送小红角标,程序从后台进入前台的时候我们要消除它

        //后台进前台
        func applicationDidEnterBackground(_ application: UIApplication) {
            //销毁通知红点
            UIApplication.shared.applicationIconBadgeNumber = 0
            JPUSHService.setBadge(0)
            UIApplication.shared.cancelAllLocalNotifications()
        }
    

    到这步就可以进行广播推送了。(傻瓜教程图片三连)

    image.png
    image.png image.png

    收到广播通知了吧,没收到你打死我。(开玩笑啊,实在收不到的话我就不知道咋搞了,您另请高明吧)


    咳咳,下面说说个推吧。如果你是个没集成过极光的小白,请到极光文档下了解下“别名 alias” (标签tag 我就不说了啊,我这儿没用到)

    简单的说,别名就是极光用来标识用户唯一性的东西。我这里用手机号做的别名,当然你也可以有uid ,sid 之类的有唯一性的东西来做别名,跟你们的后台大佬商量好就行了
    上代码

      private func setJPushAlias () {
            let  alias : String = UserDefaults.standard.value(forKey: "phoneN") as! String
            JPUSHService.setAlias(alias, completion: { (iResCode, iAlias, seq) in
                print("alias,\(alias) . completion,\(iResCode),\(iAlias),\(seq)")
            }, seq: 0)
        }
    

    setAlias 告诉极光你的用户别名,当然这是在登录成功时进行的了,那退出登录的时候那,当然要删除了,不然我都没登着账号了还给能给我发通知,你是不是找砍那

      JPUSHService.deleteAlias({ (iResCode, iAlias, seq) in
                        print("退出注销极光别名儿 \(iResCode),\(String(describing: iAlias)),\(seq)")
                    }, seq: 0)
    

    个推操作(就这张图吧,其他跟上面两张图内容一样)

    image.png

    最后说下,生产环境还是开发环境下的后台也要设定一下的,我这后台是PHP的,刚开始他说没有找到设定生产环境,开发环境的方法,当时我就不乐意了对吧。测试推不过来怎么也得有人背锅吧,这个时候你把这段代码甩给他

     //附加选项
            $data['options'] = array(
                "sendno"=>time(),
                "time_to_live"=>$m_time, //保存离线时间的秒数默认为一天
                "apns_production"=>false, //布尔类型   指定 APNS 通知发送环境:0开发环境,1生产环境。或者传递false和true
            );
    
    

    好了,能力一般,水平有限。父老乡亲能容我,不使人间造孽。。。哎呀,走错片场了,溜了溜了

    相关文章

      网友评论

        本文标题:swift 集成极光推送

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