1热康、項目配置
1.1 導入SDK
1.1.1 CocoaPods導入
# platform :ios, '9.0'
target 'JGPush' do
use_frameworks!
pod 'JPush'
end
1.1.2 手動導入
在極光官網下載最新SDK亮靴,將SDK包解壓宴树,在Xcode中選擇“Add files to 'Your project name'...”藐握,將解壓后的lib子文件夾(包含JPUSHService.h护糖、jpush-ios-x.x.x.a褥芒、jcore-ios-x.x.x.a)添加到你的工程目錄中。
添加Framework嫡良、CFNetwork.framework锰扶、CoreFoundation.framework、CoreTelephony.framework寝受、SystemConfiguration.framework坷牛、CoreGraphics.framework、Foundation.framework很澄、UIKit.framework京闰、Security.framework颜及、libz.tbd (Xcode7以下版本是libz.dylib)、AdSupport.framework (獲取IDFA需要蹂楣;如果不使用IDFA俏站,請不要添加)、UserNotifications.framework (Xcode8及以上)痊土、libresolv.tbd (JPush 2.2.0及以上版本需要, Xcode7以下版本是libresolv.dylib)(注意:
如果集成JPush 3.0.1及以上版本肄扎, 且同時集成極光其他SDK(如:JMessage 3.0.0及以上版本) 1. Cocoapods導入,建議都更新為線上最新版本赁酝,來避免Jcore版本不一致導致的沖突反浓。 2. 手動導入,在工程中只需保留一個最新版本的jcore-ios-x.x.x.a靜態(tài)庫文件赞哗。)
1.2導入SDK所需要依賴的庫雷则,添加Framework
CFNetwork.framework
CoreFoundation.framework
CoreTelephony.framework
SystemConfiguration.framework
CoreGraphics.framework
Foundation.framework
UIKit.framework
Security.framework
Xcode 7需要的是libs.tbd; Xcode 7以下版本是libs.dylib
Adsupport.framework (獲取IDFA需要;如果不使用IDFA肪笋,請不要添加)
UserNotifications.framework (Xcode8及以上)
libresolv.tbd (JPush 2.2.0及以上版本需要)
1.3 其他配置
Build Settings:
如果你的工程需要支持小于7.0的iOS系統(tǒng)月劈,請到Build Settings 關閉 bitCode 選項,否則將無法正常編譯通過藤乙。設置 Search Paths 下的 User Header Search Paths 和 Library Search Paths猜揪,比如SDK文件夾(默認為lib)與工程文件在同一級目錄下,則都設置為"$(SRCROOT)/{靜態(tài)庫所在文件夾名稱}"即可坛梁。####Capabilities:
如使用Xcode8及以上環(huán)境開發(fā)而姐,請開啟Application Target的Capabilities->Push Notifications選項,如圖:
info.plist配置:
在項目的info.plist中添加一個Key:NSAppTransportSecurity划咐,類型為字典類型拴念。然后給它添加一個NSExceptionDomains,類型為字典類型褐缠;把需要的支持的域添加給NSExceptionDomains政鼠。其中jpush.cn作為Key,類型為字典類型队魏。每個域下面需要設置2個屬性:NSIncludesSubdomains公般、NSExceptionAllowsInsecureHTTPLoads。 兩個屬性均為Boolean類型胡桨,值分別為YES官帘、YES。
2昧谊、工程代碼部分
目前極光沒有swift版本刽虹,因此需要建立一個橋接文件,在里面添加如下代碼
#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)
在AppDelegate里添加JPUSHRegisterDelegate代理馅巷,并且實現(xiàn)如下代理方法
@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)
}
// 需要執(zhí)行這個方法膛虫,選擇是否提醒用戶,有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)
}
// 系統(tǒng)要求執(zhí)行這個方法
completionHandler()
}
//點推送進來執(zhí)行這個方法
func application(_ application: UIApplication, didReceiveRemoteNotification userInfo: [AnyHashable : Any], fetchCompletionHandler completionHandler: @escaping (UIBackgroundFetchResult) -> Void) {
JPUSHService.handleRemoteNotification(userInfo)
completionHandler(UIBackgroundFetchResult.newData)
}
//系統(tǒng)獲取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 jpushNotificationCenter(_ center: UNUserNotificationCenter!, openSettingsFor notification: UNNotification?) {
print("hello")
}
推送小紅角標,程序從后臺進入前臺的時候我們要消除它
//后臺進前臺
func applicationDidEnterBackground(_ application: UIApplication) {
//銷毀通知紅點
UIApplication.shared.applicationIconBadgeNumber = 0
JPUSHService.setBadge(0)
UIApplication.shared.cancelAllLocalNotifications()
}