IOS開發(fā)apns推送的總結(jié)


在簡單項目中,有使用到apns推送服務(wù)伐坏,許多文章有涉及到卻沒有講清楚怔匣。最近做福路通項目,有使用到桦沉,做一個總結(jié)。

推送步驟為注冊推送金闽,接收推送進(jìn)行處理纯露,推送的類型分為1.程序運(yùn)行時推送 2.程序未運(yùn)行時推送。

1.注冊推送代芜,分為IOS8.0以下埠褪,IOS8.0以上IOS10.0以下,IOS10.0以上版本挤庇;在didRegisterForRemoteNotificationsWithDeviceToken方法中獲取到deviceToken

1.程序運(yùn)行時推送钞速,又分為IOS7.0以下,IOS7.0以上IOS10.0以下嫡秕,IOS10.0以上版本

2.程序未運(yùn)行推送渴语,在appdelegate中進(jìn)行didFinishLaunchingWithOptions方法中進(jìn)行處理


1.注冊推送

在didFinishLaunchingWithOptions中注冊

[self registerRemoteNotification];

注冊方法:


#pragma mark 推送->注冊

- (void)registerRemoteNotification

{

#ifdef __IPHONE_8_0

if([SYSTEM_VERSION floatValue]>=10.0){

//iOS10特有

UNUserNotificationCenter *center = [UNUserNotificationCenter currentNotificationCenter];

// 必須寫代理,不然無法監(jiān)聽通知的接收與點(diǎn)擊

center.delegate = self;

[center requestAuthorizationWithOptions:(UNAuthorizationOptionAlert | UNAuthorizationOptionBadge | UNAuthorizationOptionSound) completionHandler:^(BOOL granted, NSError * _Nullable error) {

if (granted) {

// 點(diǎn)擊允許

NSLog(@"注冊成功");

} else {

// 點(diǎn)擊不允許

NSLog(@"注冊失敗");

}

}];

[center getNotificationSettingsWithCompletionHandler:^(UNNotificationSettings * _Nonnull settings) {

NSLog(@"========%@",settings);

}];

}

else if ([SYSTEM_VERSION floatValue] >= 8.0) {

UIUserNotificationSettings *uns = [UIUserNotificationSettings settingsForTypes:(UIUserNotificationTypeAlert|UIUserNotificationTypeBadge|UIUserNotificationTypeSound) categories:nil];

//? ? ? ? [[UIApplication sharedApplication] registerForRemoteNotifications];

[[UIApplication sharedApplication] registerUserNotificationSettings:uns];

} else {

UIRemoteNotificationType apn_type = (UIRemoteNotificationType)(UIRemoteNotificationTypeAlert|UIRemoteNotificationTypeSound|UIRemoteNotificationTypeBadge);

[[UIApplication sharedApplication] registerForRemoteNotificationTypes:apn_type];

}

// 注冊獲得device Token

[[UIApplication sharedApplication] registerForRemoteNotifications];

#else

UIRemoteNotificationType apn_type = (UIRemoteNotificationType)(UIRemoteNotificationTypeAlert|UIRemoteNotificationTypeSound|UIRemoteNotificationTypeBadge);

[[UIApplication sharedApplication] registerForRemoteNotificationTypes:apn_type];

#endif

[[UIApplication sharedApplication] cancelAllLocalNotifications];

[UIApplication sharedApplication].applicationIconBadgeNumber = 0;

}

獲取deviceToken

- (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken {

_cid = [NSString stringWithFormat:@"%@", deviceToken];

//獲取終端設(shè)備標(biāo)識昆咽,這個標(biāo)識需要通過接口發(fā)送到服務(wù)器端驾凶,服務(wù)器端推送消息到APNS時需要知道終端的標(biāo)識,APNS通過注冊的終端標(biāo)識找到終端設(shè)備掷酗。

NSLog(@"My token is:%@", _cid);

}

2. 推送接收和點(diǎn)擊跳轉(zhuǎn)

//處理收到的消息推送->iOS版本7.0后

- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult result))completionHandler{

//在此處理接收到的消息调违。

NSLog(@"Receive remote notification : %@",userInfo);

//當(dāng)APP在前臺運(yùn)行時

if( [UIApplication sharedApplication].applicationState == UIApplicationStateActive)

{

//前臺無法顯示遠(yuǎn)程推送,所以添加了本地推送

[self addLocalNotification:userInfo];

}

//當(dāng)APP在后臺運(yùn)行時泻轰,當(dāng)有通知欄消息時

else if ([UIApplication sharedApplication].applicationState == UIApplicationStateInactive)

{

NSLog(@"通知后臺測試");

[self jumpToBillInfo:userInfo];

}

else{

}

}

// iOS 10收到通知->前臺

- (void)userNotificationCenter:(UNUserNotificationCenter *)center willPresentNotification:(UNNotification *)notification withCompletionHandler:(void (^)(UNNotificationPresentationOptions options))completionHandler{

NSDictionary * userInfo = notification.request.content.userInfo;

if([notification.request.trigger isKindOfClass:[UNPushNotificationTrigger class]]) {

NSLog(@"iOS10 前臺收到遠(yuǎn)程通知:");

}

else {

// 判斷為本地通知

NSLog(@"iOS10 前臺收到本地通知:{\\\\nbody:%@技肩,\\\\ntitle:%@,\\\\nsubtitle:%@,\\\\nbadge:%@,\\\\nsound:%@浮声,\\\\nuserInfo:%@\\\\n}",body,title,subtitle,badge,sound,userInfo);

}

completionHandler(UNNotificationPresentationOptionBadge|UNNotificationPresentationOptionSound|UNNotificationPresentationOptionAlert); // 需要執(zhí)行這個方法虚婿,選擇是否提醒用戶殖告,有Badge、Sound雳锋、Alert三種類型可以設(shè)置

}

// iOS 10通知的點(diǎn)擊事件->前臺黄绩、后臺

- (void)userNotificationCenter:(UNUserNotificationCenter *)center didReceiveNotificationResponse:(UNNotificationResponse *)response withCompletionHandler:(void(^)())completionHandler{

NSDictionary * userInfo = response.notification.request.content.userInfo;

UNNotificationRequest *request = response.notification.request; // 收到推送的請求

UNNotificationContent *content = request.content; // 收到推送的消息內(nèi)容

NSNumber *badge = content.badge;? // 推送消息的角標(biāo)

NSString *body = content.body;? ? // 推送消息體

UNNotificationSound *sound = content.sound;? // 推送消息的聲音

NSString *subtitle = content.subtitle;? // 推送消息的副標(biāo)題

NSString *title = content.title;? // 推送消息的標(biāo)題

if([response.notification.request.trigger isKindOfClass:[UNPushNotificationTrigger class]]) {

NSLog(@"iOS10 收到遠(yuǎn)程通知:");

[self jumpToBillInfo:userInfo];

}

else {

// 判斷為本地通知

NSLog(@"iOS10 收到本地通知:{\\\\nbody:%@,\\\\ntitle:%@,\\\\nsubtitle:%@,\\\\nbadge:%@玷过,\\\\nsound:%@爽丹,\\\\nuserInfo:%@\\\\n}",body,title,subtitle,badge,sound,userInfo);

[self jumpToBillInfo:userInfo];

}

completionHandler();? // 系統(tǒng)要求執(zhí)行這個方法

}


3.發(fā)送本地通知

//發(fā)布本地通知

-(void)addLocalNotification:(NSDictionary*)userInfo{

//定義本地通知對象

UILocalNotification *notification=[[UILocalNotification alloc]init];

//設(shè)置調(diào)用時間

notification.fireDate=[NSDate dateWithTimeIntervalSinceNow:5];//通知觸發(fā)的時間,10s以后

//? ? notification.repeatInterval=2;//通知重復(fù)次數(shù)

notification.repeatCalendar=[NSCalendar currentCalendar];//當(dāng)前日歷辛蚊,使用前最好設(shè)置時區(qū)等信息以便能夠自動同步時間

//設(shè)置通知屬性

notification.alertBody=[[userInfo objectForKey:@"aps"] objectForKey:@"alert"]; //通知主體

notification.applicationIconBadgeNumber=1;//應(yīng)用程序圖標(biāo)右上角顯示的消息數(shù)

notification.alertAction=@"打開應(yīng)用"; //待機(jī)界面的滑動動作提示

notification.alertLaunchImage=@"Default";//通過點(diǎn)擊通知打開應(yīng)用時的啟動圖片,這里使用程序啟動圖片

notification.soundName=UILocalNotificationDefaultSoundName;//收到通知時播放的聲音粤蝎,默認(rèn)消息聲音

//? ? notification.soundName=@"msg.caf";//通知聲音(需要真機(jī)才能聽到聲音)

//設(shè)置用戶信息

notification.userInfo=userInfo;//綁定到通知上的其他附加信息

//調(diào)用通知

[[UIApplication sharedApplication] scheduleLocalNotification:notification];

}


4.app未打開時,在didFinishLaunchingWithOptions中寫入:[self jumpViewController:launchOptions];

/**

當(dāng)APP沒有打開時袋马,跳轉(zhuǎn)

@param dic

*/

-(void)jumpViewController:(NSDictionary *)dic{

NSDictionary *remoteNotification = [dic objectForKey:UIApplicationLaunchOptionsRemoteNotificationKey];

if(remoteNotification){

_isLaunchedByNotification = YES;

[self jumpToBillInfo:remoteNotification];

}

}

5.點(diǎn)擊通知跳轉(zhuǎn)ViewController

//跳轉(zhuǎn)到BillInfoController頁面

-(void)jumpToBillInfo:(NSDictionary*)userInfo{

//讀取userNO和loginToken

NSString *userNO = [NSUserDefaultsUtils readUserDataWithKey:KEY_USERNO];

NSString *loginToken = [NSUserDefaultsUtils readUserDataWithKey:KEY_LOGIN_TOKEN];

if(![FormatUtils isNull:userNO]&&![FormatUtils isNull:loginToken]&&userInfo)

{

BillInfoController *_viewController =? [[BillInfoController alloc]init];

_viewController.extras = @{@"platformNo":[userInfo objectForKey:@"PLNO"],@"ordType":[userInfo objectForKey:@"ORDTYPE"]};

UIViewController *result = nil;

UIWindow * window = [[UIApplication sharedApplication] keyWindow];

//app默認(rèn)windowLevel是UIWindowLevelNormal初澎,如果不是,找到UIWindowLevelNormal的

if (window.windowLevel != UIWindowLevelNormal)

{

NSArray *windows = [[UIApplication sharedApplication] windows];

for(UIWindow * tmpWin in windows)

{

if (tmpWin.windowLevel == UIWindowLevelNormal)

{

window = tmpWin;

break;

}

}

}

id? nextResponder = nil;

UIViewController *appRootVC=window.rootViewController;

//? ? 如果是present上來的appRootVC.presentedViewController 不為nil

if (appRootVC.presentedViewController) {

nextResponder = appRootVC.presentedViewController;

}else{

UIView *frontView = [[window subviews] objectAtIndex:0];

nextResponder = [frontView nextResponder];

}

if ([nextResponder isKindOfClass:[UITabBarController class]]){

UITabBarController * tabbar = (UITabBarController *)nextResponder;

UINavigationController * nav = (UINavigationController *)tabbar.viewControllers[tabbar.selectedIndex];

//? ? ? ? UINavigationController * nav = tabbar.selectedViewController ; 上下兩種寫法都行

result=nav.childViewControllers.lastObject;

}else if ([nextResponder isKindOfClass:[UINavigationController class]]){

UIViewController * nav = (UIViewController *)nextResponder;

result = nav.childViewControllers.lastObject;

}else{

result = nextResponder;

}

[result.navigationController pushViewController:_viewController animated:YES];

//刪除所有的通知

[[UIApplication sharedApplication] cancelAllLocalNotifications];

}

}

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末虑凛,一起剝皮案震驚了整個濱河市碑宴,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌桑谍,老刑警劉巖延柠,帶你破解...
    沈念sama閱讀 221,198評論 6 514
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異锣披,居然都是意外死亡贞间,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,334評論 3 398
  • 文/潘曉璐 我一進(jìn)店門雹仿,熙熙樓的掌柜王于貴愁眉苦臉地迎上來增热,“玉大人,你說我怎么就攤上這事胧辽【穑” “怎么了?”我有些...
    開封第一講書人閱讀 167,643評論 0 360
  • 文/不壞的土叔 我叫張陵票顾,是天一觀的道長础浮。 經(jīng)常有香客問我,道長奠骄,這世上最難降的妖魔是什么豆同? 我笑而不...
    開封第一講書人閱讀 59,495評論 1 296
  • 正文 為了忘掉前任,我火速辦了婚禮含鳞,結(jié)果婚禮上影锈,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好鸭廷,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,502評論 6 397
  • 文/花漫 我一把揭開白布枣抱。 她就那樣靜靜地躺著,像睡著了一般辆床。 火紅的嫁衣襯著肌膚如雪佳晶。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,156評論 1 308
  • 那天讼载,我揣著相機(jī)與錄音轿秧,去河邊找鬼。 笑死咨堤,一個胖子當(dāng)著我的面吹牛菇篡,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播一喘,決...
    沈念sama閱讀 40,743評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼驱还,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了凸克?” 一聲冷哼從身側(cè)響起议蟆,我...
    開封第一講書人閱讀 39,659評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎触徐,沒想到半個月后咪鲜,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,200評論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡撞鹉,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,282評論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了颖侄。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片鸟雏。...
    茶點(diǎn)故事閱讀 40,424評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖览祖,靈堂內(nèi)的尸體忽然破棺而出孝鹊,到底是詐尸還是另有隱情,我是刑警寧澤展蒂,帶...
    沈念sama閱讀 36,107評論 5 349
  • 正文 年R本政府宣布又活,位于F島的核電站,受9級特大地震影響锰悼,放射性物質(zhì)發(fā)生泄漏柳骄。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,789評論 3 333
  • 文/蒙蒙 一箕般、第九天 我趴在偏房一處隱蔽的房頂上張望耐薯。 院中可真熱鬧,春花似錦、人聲如沸曲初。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,264評論 0 23
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽臼婆。三九已至抒痒,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間颁褂,已是汗流浹背故响。 一陣腳步聲響...
    開封第一講書人閱讀 33,390評論 1 271
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留痢虹,地道東北人被去。 一個月前我還...
    沈念sama閱讀 48,798評論 3 376
  • 正文 我出身青樓,卻偏偏與公主長得像奖唯,于是被迫代替她去往敵國和親惨缆。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,435評論 2 359

推薦閱讀更多精彩內(nèi)容