UIRemoteNotificationType 参考
- (BOOL)application:(UIApplication?*)application didFinishLaunchingWithOptions:(NSDictionary?*)launchOptions
?
在這個方法里添加上
?
UIRemoteNotificationType? types =?UIRemoteNotificationTypeSound|UIRemoteNotificationTypeBadge|UIRemoteNotificationTypeAlert;
? ? [[UIApplication?sharedApplication]?registerForRemoteNotificationTypes:types];
這里表明 一共注冊三種類型 badge,alert,和sound
?
會在第一次使用時候提醒用戶是否接受推送,(只會提醒一次),當用戶選擇允許之后會在
?
-(void) application:(UIApplication?*) application didRegisterForRemoteNotificationsWithDeviceToken:(NSData*)deviceToken
這個方法里取得設備的token號,然后發(fā)送給你們的服務器(因為token不是永遠不變的,建議在程序輪詢取一次,存好)
?
?
?
當用戶選擇不允許的時候或者此時使用模擬器的時候會實現(xiàn)該方法
?
-(void) application:(UIApplication?*) application didFailToRegisterForRemoteNotificationsWithError:(NSError*)error
?
?
當用戶正在使用該程序的時候,可以用一個alertview提醒用戶,(主要是為了與自己服務器通信,取得一次最新數(shù)據)
?
-(void) application:(UIApplication?*) application? didReceiveRemoteNotification:(NSDictionary?*)userInfo
{
?
?? ?
? ??//當用戶打開程序時候收到遠程通知后執(zhí)行??
? ?if?(application.applicationState?==?UIApplicationStateActive) { ?
?
? ? ? ?UIAlertView?*alertView = [[UIAlertView?alloc]?initWithTitle:@"新消息提示"??
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?message:[NSString?stringWithFormat:@"\n%@", ?
?? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? [[userInfo?objectForKey:@"aps"]?objectForKey:@"alert"]] ?
?? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?delegate:self??
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?cancelButtonTitle:@"確定"??
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?otherButtonTitles:nil]; ?
?? ? ? ?
?
?? ? ? ?
? ? ? ? [alertView?show]; ?
?
[alertView?release]; ??
? ? ???
?? ? ? ?
? ? } ?
?? ? ? ?
}
在這里與服務器通信-(void) alertView:(UIAlertView?*)alertView clickedButtonAtIndex:(NSInteger)buttonIndex
{
?
}
?
另外:
可以在這個方法里面把icon圖標數(shù)字變?yōu)榱?#xff0c;(這個主要根據軟件需要)
- (void)applicationDidBecomeActive:(UIApplication?*)application{
? ? [[UIApplication?sharedApplication]?setApplicationIconBadgeNumber:0];
??
}
?
?
?
?
?
?
?
?
?
請求和保存設備令牌
您的 iOS 應用程序需要請求用戶許可,在它所安裝的設備上接收推送通知。通常情況下,您可以通過一個簡單的 API 調用在應用程序代理中實現(xiàn)這一點,如清單 1 所示:
清單 1. 請求用戶許可
| [[UIApplication sharedApplication]registerForRemoteNotificationTypes:(UIRemoteNotificationTypeBadge |UIRemoteNotificationTypeSound | UIRemoteNotificationTypeAlert)]; |
如果用戶授予許可,應用程序會自動聯(lián)系 APNs 服務器獲取設備令牌。令牌使 APNs 可以將該特定設備上所安裝的這個特定應用程序識別為一個消息目的地。這個過程是自動的,并且在后臺執(zhí)行。您不需要為它編寫任何代碼。
在 APNs 服務器響應后,應用程序代理中的?didRegisterForRemoteNotificationsWithDeviceToken?方法被調用,并將設備令牌作為一個調用參數(shù)傳遞進來。您必須保存設備令牌并將它上傳到自己的推送通知服務器,如清單 2 所示:
清單 2. 接收一個 ID 并將它上傳到服務器
| - (void)application:(UIApplication*)applicationdidRegisterForRemoteNotificationsWithDeviceToken:(NSData*)deviceToken {NSString *tokenStr = [deviceToken description];NSString *pushToken = [[[[tokenStr stringByReplacingOccurrencesOfString:@"<" withString:@""] stringByReplacingOccurrencesOfString:@">" withString:@""] stringByReplacingOccurrencesOfString:@" " withString:@""] retain];// Save the token to serverNSString *urlStr = [NSString stringWithFormat:@"https://%@/push_token", RINGFULDOMAIN];NSURL *url = [NSURL URLWithString:urlStr];NSMutableURLRequest *req = [NSMutableURLRequest requestWithURL:url];[req setHTTPMethod:@"POST"];[req setValue:@"application/x-www-form-urlencoded" forHTTPHeaderField:@"Content-type"];NSMutableData *postBody = [NSMutableData data];[postBody appendData:[[NSString stringWithFormat:@"username=%@", username] dataUsingEncoding:NSUTF8StringEncoding]];[postBody appendData:[[NSString stringWithFormat:@"&token=%@", pushToken] dataUsingEncoding:NSUTF8StringEncoding]];[req setHTTPBody:postBody];[[NSURLConnection alloc] initWithRequest:req delegate:nil]; } |
在理想情況下,您將令牌與一些標記用戶的信息(如在您的系統(tǒng)中的個人用戶名)相關聯(lián),使您的服務器知道稍后要將消息發(fā)送給誰。(您可以將它想 像為類似于將電話號碼與個人姓名相關聯(lián)。)如果您沒有將令牌與自己的用戶標識信息關聯(lián),您仍然可以將消息發(fā)送到這些設備,但您不能為每個用戶自定義消息, 因為您所擁有的是一個目標設備的字母令牌字符串。
服務器應該將令牌及其相關的標識信息保存在數(shù)據庫中。在大多數(shù)應用程序中,它被保存在用戶配置文件數(shù)據庫中。
回頁首
發(fā)送一個推送消息
要發(fā)送一個推送消息,您的服務器:
APNs 服務器的 Web 服務 API 很復雜。對 Java 開發(fā)人員來說幸運的是,開源 JavaPNS 庫可以使其使用變得更簡單。JavaPNS 和下載和文檔鏈接參見?參考資料。
清單 3 中的代碼顯示了如何使用 JavaPNS 庫向設備發(fā)送類似于短信的消息:
清單 3. 發(fā)送一個推送消息
| String[] devices = {"token1", "token2}; List<PushedNotification> notifications= Push.alert("Hello World!", "keypair.p12", "password", false, devices); |
JavaPNS 庫的主界面方法是在?Push?類中的靜態(tài)方法。APNs 允許您在消息中嵌入各種內容。請參閱 iOS 推送消息指南,獲取所支持的負載類型的完整清單(參見?參考資料)。Push?類為每種類型的消息提供方便的方法,并且它將消息的轉換為 APNs 服務器接受的 JavaScript Object Notation (JSON) 格式。在?清單 3?中,keypair.p12是從 KeyChain Access 導出的 p12 文件,password?是 p12 文件的密碼。devices?陣列是從 iOS 應用程序接收的設備令牌列表。所有這些設備都將收到這個推送消息。在參數(shù)中的?false?值指定該消息應發(fā)送到 APNs 開發(fā)服務器(沙箱),而不是其生產服務器。(回憶一下,您通常為沙箱創(chuàng)建一個 p12 密鑰對,為生產服務器創(chuàng)建一個不同的密鑰對。)
方法調用返回的值是一個?PushedNotification?對象的列表,您可以用它來確定推送交付的狀態(tài),如清單 4 所示:
清單 4. 檢查推送交付的狀態(tài)
| for (PushedNotification notification : notifications) {if (notification.isSuccessful()) {/* Apple accepted the notification and should deliver it */} else {String invalidToken = notification.getDevice().getToken();/* Add code here to remove invalidToken from your database */} } |
如果通知對象告訴您,有某個設備令牌不再處于激活狀態(tài),例如,如果用戶從設備中刪除了該應用程序,或在應用程序設置中禁用了通知,您應該從數(shù)據庫中刪除該令牌,以便您不會再向它發(fā)送消息。
保持最新的活動設備令牌列表的另一種方式,是讓您的服務器應用程序定期檢查 APNs 服務器。清單 5 顯示了如何查詢 APNs 反饋服務,使用 JavaPNS 從 APNs 沙箱接收一個無效設備令牌的列表:
清單 5. 檢查以更新活動的設備令牌
| List<Device> inactiveDevices = Push.feedback("keypair.p12", "password", false); /* remove inactive devices from your own list of devices */ |
不要將資源浪費在將消息發(fā)送到已刪除您的應用程序的設備,或選擇不接收通知的設備,這一點很重要。
回頁首
其他考慮事項
推送通知不能在 iOS 模擬器上進行測試;您必須將應用程序部署到實際設備上對其進行測試。因為用于對消息進行身份驗證的數(shù)字證書被捆綁到應用程序的配置概要文件,您需要使用在 開發(fā)或臨時分發(fā)應用程序中的開發(fā)證書進行測試。在應用程序通過審批并在 App Store 中提供后,您必須切換到生產證書。
此外,重要的是要理解,為大數(shù)據庫中的用戶定制和發(fā)送推送消息是一項資源密集型工作。例如,每 5 秒遍歷一次一個百萬用戶級的數(shù)據庫,以確定 10 個當時需要收到消息的用戶,這成本非常高。服務器端的基礎架構需要精心的設計和規(guī)劃,以支持對大量用戶的頻繁推送通知。相反,一次向一百萬個用戶發(fā)送推送 消息會產生大量的流量,因此通過使用一個線程池可以更好地處理這一場景,而不是阻止一個單獨線程。JavaPNS 庫提供一個簡單的 API,它使用線程池,可以同時將消息推送給大量設備。
回頁首
結束語
推送技術讓您的服務器應用程序繞過電信運營商,并直接通過 Internet 向 iOS 設備的應用程序發(fā)送消息。雖然實現(xiàn)推送通知并非小事(客戶端 SSL 證書對 Apple 服務器的身份驗證需求很復雜),但是來自 Urban Airship 和 JavaPNS 等第三方的幫助可以使發(fā)送通知更加容易。SMS 和 MMS 有自己的位置,并且仍然比推送技術更可靠,但您可以通過實現(xiàn)推送消息使您的 iOS 應用程序更加豐富,提供更多的功能。
轉載于:https://www.cnblogs.com/pjl111/p/4195563.html
總結
以上是生活随笔為你收集整理的UIRemoteNotificationType 参考的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: win7系统怎么获取system权限?
- 下一篇: 《C程序设计语言》读书笔记----习题1