极光推送在Objective-C项目下很容易集成,在基于Swift语言的项目就需要桥接来处理了,下面记录一下集成流程: (环境说明: XCode8.3.2,Swift3.0,iOS10)

1. 下载极光的开发SDK:

2. 项目增加JPush的开发库:

3. 在项目根目录的二级目录增加Swift调用OC的桥接文件,文件名一般为<项目名>-Bridging-Header.h,如果在Swift项目新建OC的文件会提示创建,这里是手动拉入文件的,因此按此一般约定创建一个就行,然后添加入项目工程:

4. 在项目的target里配置"Object-C Bridging Header"的引用路径:

5. 添加极光推送必要的framework:

-> CFNetwork.framwwork

-> CoreFoundation.framwwork

-> CoreTelephony.framwwork

-> SystemConfiguration.framwwork

-> CoreGraphics.framwwork

-> Foundation.framwwork

-> UIKit.framwwork

-> Security.framwwork

-> libz.tbd

-> AdSupport.framwwork(根据是否需要使用IDFA进行添加)

-> UserNotifications.framwwork(XCode8及以上需要)

-> libresolv.tbd(极光2.2.0以上需要,这里使用3.0.5的版本,因此需要添加)

添加完后如下:

6. 在桥接文件添加极光头文件的引用,其他OC文件也是类似import即可:

Build一下,没问题,继续下一步。

7. 在苹果开发者网站,生成针对该APP的开发和生产APNS证书,然后下载下来进行安装,安装后导出"*.p12"文件,用于上传到极光后台管理端,如下:

8. XCode配置:

对于XCode8以上,需要在项目target打开推送开关:

在配置"info.plit"支持http传输,ios虽然默认只支持https传输,但是还有很多传输是http的,现在设置让其支持jpush的:

9. 在AppDelegate.swift添加逻辑处理:

func application(_ application: UIApplication,didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
        // Override point for customization after application launch.
        application.statusBarStyle = UIStatusBarStyle.lightContent
        
        let navigationBarappearance = UINavigationBar.appearance()
        navigationBarappearance.isTranslucent = false
        navigationBarappearance.barTintColor = UIColor(hex: 0x25b6ed)
        navigationBarappearance.tintColor = UIColor.white
        navigationBarappearance.titleTextAttributes = [NSForegroundColorAttributeName:UIColor.white]
        
        registJPushRemoteNotification(launchOptions: (launchOptions==nil) ? [:] : launchOptions!)
        
        return true
    }

    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.
    }

    func applicationWillTerminate(_ application: UIApplication) {
        // Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:.
    }
    
    // MARK: APNS callback
    func application(_ application: UIApplication,didRegisterForRemoteNotificationsWithDevicetoken devicetoken: Data) {
        JPUSHService.registerDevicetoken(devicetoken)
    }
    
    func application(_ application: UIApplication,didFailToRegisterForRemoteNotificationsWithError error: Error) {
        print("[Error] Fail to register for remote notification with error: %@",error)
    }
    
    func application(_ application: UIApplication,didReceiveRemoteNotification userInfo: [AnyHashable : Any],fetchCompletionHandler completionHandler: @escaping (UIBackgroundFetchResult) -> Void) {
        print("[JPUSH Remote Noti receive]-> %@",userInfo)
    }
    
    // MARK: Delegate -> JPUSHRegisterDelegate
    func jpushNotificationCenter(_ center: UNUserNotificationCenter!,didReceive response: UNNotificationResponse!,withCompletionHandler completionHandler: (() -> Void)!) {
        // iOS 10 Supported
        let userInfo = response.notification.request.content.userInfo
        if (response.notification.request.trigger?.isKind(of: UNPushNotificationTrigger.self))! {
            JPUSHService.handleRemoteNotification(userInfo)
        }
        completionHandler()
    }
    
    func jpushNotificationCenter(_ center: UNUserNotificationCenter!,willPresent notification: UNNotification!,withCompletionHandler completionHandler: ((Int) -> Void)!) {
        // iOS 10 Supported
        let userInfo = notification.request.content.userInfo
        if (notification.request.trigger?.isKind(of: UNPushNotificationTrigger.self))! {
            JPUSHService.handleRemoteNotification(userInfo)
        }
        completionHandler(Int(UNNotificationPresentationoptions.alert.rawValue))
    }
    

    // MARK: Private
    
    func registJPushRemoteNotification(launchOptions: [UIApplicationLaunchOptionsKey: Any]) {
        let jpushEntity = JPUSHRegisterEntity()
        jpushEntity.types = Int(JPAuthorizationoptions.alert.rawValue) + Int(JPAuthorizationoptions.badge.rawValue) + Int(JPAuthorizationoptions.sound.rawValue)
        //if Float(UIDevice.current.systemVersion)! >= Float(8.0) {
        //    // can definde a custom categories
        //}
        JPUSHService.register(forRemoteNotificationConfig: jpushEntity,delegate: self)
        JPUSHService.setup(withOption: (launchOptions==nil) ? [:] : launchOptions,appKey: JPUSH_APPKEY,channel: "APP Store",apsForProduction: false) // true - distribution  false - development
    }

10. 测试: 因为模拟器不支持获取远程推送,因此必须采用真机测试。

运行后发现如下错误:

缺少配置,增加即可:

另外,launchOptions在用户启动是是空,由其他应用调起则有值,这里的Optional Value需要做判空处理,修改一下运行后日志如下,说明极光配置成功:

极光控制台发送一条信息看看(这里没有设置tag,因此所有APPkey一样的都会收到通知,后面再配置tag了)

点击发送,XCode的日志如下:

OK了,后面再根据需要完善其他逻辑即可。

Swift项目集成极光推送SDK的更多相关文章

  1. 适用于iOS和路线的Google Maps SDK

    解决方法库中有一些东西不在文档中,所以如果你正在寻找一个功能,那么值得下载SDK并查看标题.然而,在当前版本1.0.2中,我没有看到任何路由–搜索路线或绘制路线.目前,您唯一的选择可能是使用其他GoogleApi来查找路径,然后正如Lee所说,使用折线绘制它们.

  2. openURL崩溃:iOS 9中可能存在Facebook SDK错误

    也许Facebook的SDK在这个特例上有错误?解决方法我找到了答案看起来它只是一个发布模式问题.通过启用Xcode运行发布版本,我能够调试我的问题.它是由参数sourceApplication引起的,在发布模式下显然需要解包.不知道为什么,但至少我得到它的工作.

  3. 使用最新的Flurry SDK和ios4重新启动应用程序

    我真的希望这对我来说只是一个愚蠢的错误.我很高兴使用Flurry但这样的事情会导致我的应用被拒绝.解决方法我写了关于这个的Flurry,他们很快回到我身边,他们会调查这个.大约一个星期后,他们回信并表示他们已经在v2.6中修复了它,现在可用了.我似乎无法重现这个问题.不是说我很棒或者什么,但我还是单枪匹马地解决了这个问题.

  4. ios – Interface Builder无法确定“Main.storyboard”的类型.这可能是由于缺少SDK

    解决方法这没有你想象的那么复杂.该错误是因为您在Main.storyboard的源代码上输错了一些内容,例如我不小心在Main.storyboard的第一个打开标记之前放了一个“”.1)你必须做的是删除Main.storyboard2)转到垃圾箱,将Main.storyboard移动到桌面,用任何文本编辑器打开并修复代码;然后“全选”和“复制”.3)在Xcode上,创建一个全新的Main.storyboard,然后按右键单击文件并选择OpenAs–>源代码,然后粘贴您在剪贴板上的固定代码.4)右键单击文件

  5. ios – 无法识别的选择器发送到实例NSTimer Swift

    解决方法让updateTime成为一个类方法.如果它是在一个纯粹的Swift类中,你需要在@objc前面说明该方法的声明,如:

  6. iOS:安装Google移动广告SDK的错误说明?

    为什么我必须在此版本中安装Firebase/Core?

  7. 如何使用iOS SDK保存LinkedIn访问令牌?

    我在我的iOS应用程序中使用LinkedIn.我想保存访问令牌以供将来使用.令牌属于非属性类型,无法直接保存在NSUserDefaults中.我尝试使用NSKeyedArchiver,但我得到了输出:令牌中的文本即将到来,但值将为空.代码段1:我也尝试像这样保存,但结果是一样的:代码段2:我的编码或访问令牌有什么问题需要一些特殊技术来保存吗?请建议.解决方法这就是我拯救的方式.它对我有用.希望它有所帮助以这种方式使用保存的responseBody我希望这次我很清楚

  8. 在ios上使用来自框架的boost :: filesysystem路径

    我一直在使用Boost作为PeteGoodliffe脚本构建的框架已有一段时间了.效果很好.最近我遇到了一个问题,可以通过将以下代码放入另一个全新的XCode项目中的视图控制器的viewDidLoad中来重现:当路径对象被销毁时会导致EXC_BAD_ACCESS.有没有其他人遇到这个问题?

  9. ios8 – iOS 8上的ptrace

    我试图在ptrace上调用一个像thisptrace一样的函数;但是当我尝试使用#include导入它时,Xcode会给我一个错误’sys/ptrace.h’文件找不到.我错过了什么,我是否需要导入一个库,或者这在iOS上根本不可用?

  10. ios – 具有较低基础sdk的应用程序如何工作?

    在XCode中,我可以指定BaseSDK.我想知道幕后工作是怎么做的?如果我正在运行应用程序,例如,在具有iOS7且我的基础SDK是iOS6的设备上,那么应用程序为何具有旧的“外观和感觉”?XCode是否编译了较旧的SDK并将其包含在我的应用程序中,或者新版本的iOS是否附带较旧的库/SDK?

随机推荐

  1. Swift UITextField,UITextView,UISegmentedControl,UISwitch

    下面我们通过一个demo来简单的实现下这些控件的功能.首先,我们拖将这几个控件拖到storyboard,并关联上相应的属性和动作.如图:关联上属性和动作后,看看实现的代码:

  2. swift UISlider,UIStepper

    我们用两个label来显示slider和stepper的值.再用张图片来显示改变stepper值的效果.首先,这三个控件需要全局变量声明如下然后,我们对所有的控件做个简单的布局:最后,当slider的值改变时,我们用一个label来显示值的变化,同样,用另一个label来显示stepper值的变化,并改变图片的大小:实现效果如下:

  3. preferredFontForTextStyle字体设置之更改

    即:

  4. Swift没有异常处理,遇到功能性错误怎么办?

    本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请发送邮件至dio@foxmail.com举报,一经查实,本站将立刻删除。

  5. 字典实战和UIKit初探

    ios中数组和字典的应用Applicationschedule类别子项类别名称优先级数据包contactsentertainment接触UIKit学习用Swift调用CocoaTouchimportUIKitletcolors=[]varbackView=UIView(frame:CGRectMake(0.0,0.0,320.0,CGFloat(colors.count*50)))backView

  6. swift语言IOS8开发战记21 Core Data2

    上一话中我们简单地介绍了一些coredata的基本知识,这一话我们通过编程来实现coredata的使用。还记得我们在coredata中定义的那个Model么,上面这段代码会加载这个Model。定义完方法之后,我们对coredata的准备都已经完成了。最后强调一点,coredata并不是数据库,它只是一个框架,协助我们进行数据库操作,它并不关心我们把数据存到哪里。

  7. swift语言IOS8开发战记22 Core Data3

    上一话我们定义了与coredata有关的变量和方法,做足了准备工作,这一话我们来试试能不能成功。首先打开上一话中生成的Info类,在其中引用头文件的地方添加一个@objc,不然后面会报错,我也不知道为什么。

  8. swift实战小程序1天气预报

    在有一定swift基础的情况下,让我们来做一些小程序练练手,今天来试试做一个简单地天气预报。然后在btnpressed方法中依旧增加loadWeather方法.在loadWeather方法中加上信息的显示语句:运行一下看看效果,如图:虽然显示出来了,但是我们的text是可编辑状态的,在storyboard中勾选Editable,再次运行:大功告成,而且现在每次单击按钮,就会重新请求天气情况,大家也来试试吧。

  9. 【iOS学习01】swift ? and !  的学习

    如果不初始化就会报错。

  10. swift语言IOS8开发战记23 Core Data4

    接着我们需要把我们的Rest类变成一个被coredata管理的类,点开Rest类,作如下修改:关键字@NSManaged的作用是与实体中对应的属性通信,BinaryData对应的类型是NSData,CoreData没有布尔属性,只能用0和1来区分。进行如下操作,输入类名:建立好之后因为我们之前写的代码有些地方并不适用于coredata,所以编译器会报错,现在来一一解决。

返回
顶部