一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務(wù)器之家:專注于服務(wù)器技術(shù)及軟件下載分享
分類導(dǎo)航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術(shù)|正則表達(dá)式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務(wù)器之家 - 編程語言 - IOS - 詳解iOS本地推送與遠(yuǎn)程推送

詳解iOS本地推送與遠(yuǎn)程推送

2021-01-28 16:14任偉 IOS

這篇文章主要為大家詳細(xì)介紹了iOS本地推送與遠(yuǎn)程推送,具有一定的參考價值,感興趣的小伙伴們可以參考一下

一、簡介

分為本地推送遠(yuǎn)程推送2種。可以在應(yīng)用沒有打開甚至手機(jī)鎖屏情況下給用戶以提示。它們都需要注冊,注冊后系統(tǒng)會彈出提示框(如下圖)提示用戶是否同意,如果同意則正常使用;如果用戶不同意則下次打開程序也不會彈出該提示框,需要用戶到設(shè)置里面設(shè)置。一共有三種提示類型:

uiusernotificationtypebadge:應(yīng)用圖標(biāo)右上角的信息提示

uiusernotificationtypesound:播放提示音

uiusernotificationtypealert:提示框

詳解iOS本地推送與遠(yuǎn)程推送

二、本地推送

1 注冊與處理

代碼如下:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
/// 一般在在啟動時注冊通知,程序被殺死,點(diǎn)擊通知后調(diào)用此程序
- (bool)application:(uiapplication *)application didfinishlaunchingwithoptions:(nsdictionary *)launchoptions {
 if ([[uidevice currentdevice].systemversion floatvalue] >= 8.0) { // ios8
 uiusernotificationsettings *setting = [uiusernotificationsettings settingsfortypes:uiusernotificationtypebadge | uiusernotificationtypealert | uiusernotificationtypesound categories:nil];
 [application registerusernotificationsettings:setting];
 }
 
 if (launchoptions[uiapplicationlaunchoptionslocalnotificationkey]) {
 // 這里添加處理代碼
 }
 return yes;
}
/// 程序沒有被殺死(處于前臺或后臺),點(diǎn)擊通知后會調(diào)用此程序
- (void)application:(uiapplication *)application didreceivelocalnotification:(uilocalnotification *)notification {
 // 這里添加處理代碼
}

可以看到,處理代碼有兩個方法,一個是

- (void)application:(uiapplication *)application didreceivelocalnotification:(uilocalnotification *)notification;
另一個是
- (bool)application:(uiapplication *)application didfinishlaunchingwithoptions:(nsdictionary *)launchoptions;

如果程序沒有被殺死,即處于前臺或者后臺,那么調(diào)用前者;如果程序被殺死,則調(diào)用后者。

2 發(fā)送通知

代碼如下

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
- (ibaction)addlocalnotification {
 // 1.創(chuàng)建一個本地通知
 uilocalnotification *localnote = [[uilocalnotification alloc] init];
 
 // 1.1.設(shè)置通知發(fā)出的時間
 localnote.firedate = [nsdate datewithtimeintervalsincenow:5];
 
 // 1.2.設(shè)置通知內(nèi)容
 localnote.alertbody = @"這是一個推送這是一個推送";
 
 // 1.3.設(shè)置鎖屏?xí)r,字體下方顯示的一個文字
 localnote.alertaction = @"趕緊!!!!!";
 localnote.hasaction = yes;
 
 // 1.4.設(shè)置啟動圖片(通過通知打開的)
 localnote.alertlaunchimage = @"../documents/img_0024.jpg";
 
 // 1.5.設(shè)置通過到來的聲音
 localnote.soundname = uilocalnotificationdefaultsoundname;
 
 // 1.6.設(shè)置應(yīng)用圖標(biāo)左上角顯示的數(shù)字
 localnote.applicationiconbadgenumber = 999;
 
 // 1.7.設(shè)置一些額外的信息
 localnote.userinfo = @{@"qq" : @"704711253", @"msg" : @"success"};
 
 // 2.執(zhí)行通知
 [[uiapplication sharedapplication] schedulelocalnotification:localnote];
}

效果如下:

詳解iOS本地推送與遠(yuǎn)程推送

3 取消通知

// 取消所有本地通知
[application cancelalllocalnotifications];

三、遠(yuǎn)程推送

與android上我們自己實現(xiàn)的推送服務(wù)不一樣,apple對設(shè)備的控制非常嚴(yán)格,消息推送的流程必須要經(jīng)過apns(apple push notification service).

一般情況下如果一個程序退到后臺就不能運(yùn)行代碼(audio、voip等等可以在后臺運(yùn)行),或者程序退出后,那么它就和對應(yīng)應(yīng)用的后臺服務(wù)器斷開了鏈接,就收不到服務(wù)器發(fā)送的信息了,但是每臺設(shè)備只要聯(lián)網(wǎng)就會和蘋果的apns服務(wù)器建立一個長連接(persistent ip connection),這樣只要通過蘋果的apns服務(wù)器,我們自己的服務(wù)器就可以間接的和設(shè)備保持連接了,示意圖如下:

詳解iOS本地推送與遠(yuǎn)程推送

使用步驟:

1 勾選backgroud modes -> remote notifications,主要是ios7之后,蘋果支持后臺運(yùn)行,如果這里打開后,當(dāng)接收到遠(yuǎn)程推送后,程序在后臺也可以做一些處理,如下圖所示:

詳解iOS本地推送與遠(yuǎn)程推送

2 遠(yuǎn)程推送的注冊與本地推送不同,ios8.0前后也不同,代碼見下面。

另外,在第一次使用推送時,可能會有這樣的疑問:didfinishlaunchingwithoptions會在每次打開程序時被調(diào)用,那是不是每次都會調(diào)用注冊函數(shù),每次都會彈窗詢問用戶"是否允許推送通知"?其實這個窗口只會在第一次打開程序時彈出一次,無論用戶允許或不允許蘋果會記住用戶的選擇,注冊函數(shù)調(diào)用多次對用戶也沒什么影響

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
- (bool)application:(uiapplication *)application didfinishlaunchingwithoptions:(nsdictionary *)launchoptions {
 // ios8之后和之前應(yīng)區(qū)別對待
 if ([[uidevice currentdevice].systemversion floatvalue] >= 8.0) {
 uiusernotificationsettings *settings = [uiusernotificationsettings settingsfortypes:uiusernotificationtypebadge | uiusernotificationtypealert | uiusernotificationtypesound categories:nil];
 [[uiapplication sharedapplication] registerusernotificationsettings:settings];
 } else {
 [application registerforremotenotificationtypes:uiremotenotificationtypealert | uiremotenotificationtypebadge | uiusernotificationtypesound];
 }
 
 return yes;
}
/// 這個函數(shù)存在的意義在于:當(dāng)用戶在設(shè)置中關(guān)閉了通知時,程序啟動時會調(diào)用此函數(shù),我們可以獲取用戶的設(shè)置
- (void)application:(uiapplication *)application didregisterusernotificationsettings:(uiusernotificationsettings *)notificationsettings {
 [application registerforremotenotifications];
}

3 如果注冊失敗,比如沒有證書等等,會調(diào)用:

?
1
2
3
4
/// 注冊失敗調(diào)用
- (void)application:(uiapplication *)application didfailtoregisterforremotenotificationswitherror:(nserror *)error {
 nslog(@"遠(yuǎn)程通知注冊失?。?@",error);
}

4 獲取devicetoken

如果用戶同意,蘋果會根據(jù)應(yīng)用的 bundleid 和 手機(jī)udid 生成 devicetoken,然后調(diào)用 application 的 didregister 方法返回 devicetoken,程序應(yīng)該把 devicetoken 發(fā)給應(yīng)用的服務(wù)器,服務(wù)器有義務(wù)將其存儲(如果允許多點(diǎn)登錄,可能存多個 devicetoken)。devicetoken也是會變的: ”if the user restores backup data to a new device or computer, or reinstalls the operating system, the device token changes“,因此應(yīng)每次都發(fā)給服務(wù)器(provider)

?
1
2
3
4
/// 用戶同意后,會調(diào)用此程序,獲取系統(tǒng)的devicetoken,應(yīng)把devicetoken傳給服務(wù)器保存,此函數(shù)會在程序每次啟動時調(diào)用(前提是用戶允許通知)
- (void)application:(uiapplication *)application didregisterforremotenotificationswithdevicetoken:(nsdata *)devicetoken {
 nslog(@"devicetoken = %@",devicetoken);
}

5 用戶點(diǎn)擊了通知

默認(rèn)會打開程序。處理代碼有三個函數(shù),分ios7之前之后和程序是否處于后臺

5.1 ios7及其之之后

此函數(shù)無論是程序被殺死還是處于后臺,只要用戶點(diǎn)擊了通知,都會被調(diào)用,因此如果是ios7,則不必在didfinishlaunchingwithoptions中做處理,只在下面函數(shù)做處理即可,此時應(yīng)避免在didfinishlaunchingwithoptions函數(shù)中也做重復(fù)處理。

?
1
2
3
- (void)application:(uiapplication *)application didreceiveremotenotification:(nsdictionary *)userinfo fetchcompletionhandler:(void (^)(uibackgroundfetchresult))completionhandler {
 // userinfo
}

注:當(dāng)在第一步打開后臺運(yùn)行后,用戶不點(diǎn)擊通知,也可以執(zhí)行:

?
1
- (void)application:(uiapplication*)application didreceiveremotenotification:(nsdictionary*)userinfo fetchcompletionhandler:(void(^)(uibackgroundfetchresult))completionhandler

5.2 ios7之前

當(dāng)用戶點(diǎn)擊通知后,如果程序被殺死則會調(diào)用下面第一個函數(shù),如果程序處于后臺會調(diào)用下面第二個函數(shù),因此下面兩個函數(shù)應(yīng)搭配使用

?
1
2
3
4
5
6
7
8
9
10
11
12
- (bool)application:(uiapplication *)application didfinishlaunchingwithoptions:(nsdictionary *)launchoptions {
 // 獲取遠(yuǎn)程推送消息
 nsdictionary *userinfo = launchoptions[uiapplicationlaunchoptionsremotenotificationkey];
 if (userinfo) {
 // 有推送的消息,處理推送的消息
 }
 return yes;
}
/// ios3之后才有,只有在程序處于后臺時,用戶點(diǎn)擊了通知后才會被調(diào)用,應(yīng)搭配didfinishlaunchingwithoptions使用
- (void)application:(uiapplication *)application didreceiveremotenotification:(nsdictionary *)userinfo {
 // userinfo
}

在實際編程時,如果想兼容ios7以前,三個函數(shù)可同時使用,都列出來,系統(tǒng)會自動選擇合適的調(diào)用。

6 總結(jié)下函數(shù)的調(diào)用:

首次安裝后啟動:

didregisterforremotenotificationswithdevicetoken 被調(diào)用

系統(tǒng)詢問用戶是否同意接收 notifications

不管用戶選擇同意或拒絕,didregisterusernotificationsettings 被調(diào)用

應(yīng)用非首次啟動時:

如果 notifications 處于拒絕狀態(tài):didregisterusernotificationsettings 被調(diào)用

如果 notifications 處于允許狀態(tài)

didregisterforremotenotificationswithdevicetoken 被調(diào)用

didregisterusernotificationsettings 被調(diào)用

應(yīng)用運(yùn)行過程中用戶修改 notifications 設(shè)置:

從拒絕變?yōu)樵试S:didregisterforremotenotificationswithdevicetoken 被調(diào)用

從允許變?yōu)榫芙^:什么也不發(fā)生

7 服務(wù)端推送的格式

?
1
2
3
4
5
6
7
8
9
{
 "aps" : {   // 必須有
 "alert" : "string",
 "body" : "string",
 "badge" : number,
 "sound" : "string"
 },
 "notiid" : 20150821, // 自定義key值
}

8 推送的大小限制

遠(yuǎn)程通知負(fù)載的大小根據(jù)服務(wù)器使用的api不同而不同。當(dāng)使用http/2 provider api時,負(fù)載最大為4kb;當(dāng)使用legacy binary interface時,負(fù)載最大為2kb。當(dāng)負(fù)載大小超過規(guī)定的負(fù)載大小時,apns會拒絕發(fā)送此通知。

9 整體如下圖所示(以微信推送為例):

詳解iOS本地推送與遠(yuǎn)程推送

10 最后,還需要申請證書,這里不再詳述-_-

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持服務(wù)器之家。

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 日本在线一区二区 | 天使萌痴汉在线中文字幕 | 垫底辣妹免费观看完整版 | 国产综合成色在线视频 | 国自产精品手机在线视频 | 欧美色精品天天在线观看视频 | 黑人又大又硬又粗再深一点 | 出轨同学会免费观看 | 日本高清视频在线观看 | 91九色国产porny| 风间由美在线播放 | 天天天天天天天操 | 成全动漫视频在线观看 | 精品欧美一区二区在线观看欧美熟 | 久久r视频| 成人男女网免费 | 国产91素人搭讪系列天堂 | 无码乱人伦一区二区亚洲一 | 三级视频中文字幕 | 香蕉久久网 | 精品91一区二区三区 | 天作谜案免费完整版在线观看 | 日本一区二区三区久久精品 | 国产精品久久久久久岛国 | ova巨公主催眠1在线观看 | 成人免费观看网欧美片 | 亚洲精品第二页 | 亚洲 欧美 国产 日韩 字幕 | 456老汉gay | 香港三级血恋3 | 成人在线观看网站 | 国内精品久久久久影院网站 | 校花被拖到野外伦小说 | 精品99视频| 91精品啪在线观看国产日本 | 国产一二区视频 | 久久精品嫩草影院免费看 | 欧美亚洲第一页 | 91传媒制片厂制作传媒破解版 | 大伊香蕉在线精品不卡视频 | 日本在线www |