亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 系統 > iOS > 正文

iOS推送的那些事

2020-07-26 03:28:21
字體:
來源:轉載
供稿:網友

直接切入主題,講講如何模擬推送以及處理推送消息。在進入主題之前,我先說幾個關鍵流程:
1、建Push SSL Certification(推送證書)
2、OS客戶端注冊Push功能并獲得DeviceToken
3、用Provider向APNS發送Push消息
4、OS客戶端接收處理由APNS發來的消息
推送流程圖:

Provider:就是為指定iOS設備應用程序提供Push的服務器。如果iOS設備的應用程序是客戶端的話,那么Provider可以理解為服務端(推送消息的發起者)
APNs:Apple Push Notification Service(蘋果消息推送服務器)
Devices:iOS設備,用來接收APNs下發下來的消息
Client App:iOS設備上的應用程序,用來接收APNs下發的消息到指定的一個客戶端app(消息的最終響應者)
1、取Device token
App 必須要向 APNs 請求注冊以實現推送功能,在請求成功后,APNs 會返回一個設備的標識符即 DeviceToken 給 App,服務器在推送通知的時候需要指定推送通知目的設備的 DeviceToken。在 iOS 8 以及之后,注冊推送服務主要分為四個步驟:

  • 使用 registerUserNotificationSettings:注冊應用程序想要支持的推送類型
  • 通過調用 registerForRemoteNotifications方法向 APNs 注冊推送功能
  • 請求成功時,系統會在應用程序委托方法中返回 DeviceToken,請求失敗時,也會在對應的委托方法中給出請求失敗的原因。
  • 將 DeviceToken 上傳到服務器,服務器在推送時使用。

上述第一個步驟注冊的 API 是 iOS 8 新增的,因此在 iOS 7,前兩個步驟需更改為 iOS 7 中的 API。
DeviceToken 有可能會更改,因此需要在程序每次啟動時都去注冊并且上傳到你的服務器端。

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions{ if ([application respondsToSelector:@selector(registerUserNotificationSettings:)]) {  NSLog(@"Requesting permission for push notifications..."); // iOS 8  UIUserNotificationSettings *settings = [UIUserNotificationSettings settingsForTypes:   UIUserNotificationTypeAlert | UIUserNotificationTypeBadge |   UIUserNotificationTypeSound categories:nil];  [UIApplication.sharedApplication registerUserNotificationSettings:settings]; } else {  NSLog(@"Registering device for push notifications..."); // iOS 7 and earlier  [UIApplication.sharedApplication registerForRemoteNotificationTypes:   UIRemoteNotificationTypeAlert | UIRemoteNotificationTypeBadge |   UIRemoteNotificationTypeSound]; } return YES;}- (void)application:(UIApplication *)application didRegisterUserNotificationSettings:(UIUserNotificationSettings *)settings{ NSLog(@"Registering device for push notifications..."); // iOS 8 [application registerForRemoteNotifications];}- (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)token{ NSLog(@"Registration successful, bundle identifier: %@, mode: %@, device token: %@",  [NSBundle.mainBundle bundleIdentifier], [self modeString], token);}- (void)application:(UIApplication *)application didFailToRegisterForRemoteNotificationsWithError:(NSError *)error{ NSLog(@"Failed to register: %@", error);}- (void)application:(UIApplication *)application handleActionWithIdentifier:(NSString *)identifier forRemoteNotification:(NSDictionary *)notification completionHandler:(void(^)())completionHandler{ NSLog(@"Received push notification: %@, identifier: %@", notification, identifier); // iOS 8 completionHandler();}- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)notification{ NSLog(@"Received push notification: %@", notification); // iOS 7 and earlier}- (NSString *)modeString{#if DEBUG return @"Development (sandbox)";#else return @"Production";#endif}

2、處理推送消息
1)、程序未啟動,用戶接收到消息。需要在AppDelegate中的didFinishLaunchingWithOptions得到消息內容

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { //... NSDictionary *payload = [launchOptions objectForKey:UIApplicationLaunchOptionsRemoteNotificationKey]; if (payload) {  //... } //...}

2)、程序在前臺運行,接收到消息不會有消息提示(提示框或橫幅)。當程序運行在后臺,接收到消息會有消息提示,點擊消息后進入程序,AppDelegate的didReceiveRemoteNotification函數會被調用,消息做為此函數的參數傳入

- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)payload { NSLog(@"remote notification: %@",[payload description]); NSString* alertStr = nil;   NSDictionary *apsInfo = [payload objectForKey:@"aps"];  NSObject *alert = [apsInfo objectForKey:@"alert"];  if ([alert isKindOfClass:[NSString class]])  {    alertStr = (NSString*)alert;  }  else if ([alert isKindOfClass:[NSDictionary class]])  {    NSDictionary* alertDict = (NSDictionary*)alert;    alertStr = [alertDict objectForKey:@"body"];  }   application.applicationIconBadgeNumber = [[apsInfo objectForKey:@"badge"] integerValue];   if ([application applicationState] == UIApplicationStateActive && alertStr != nil)  {  UIAlertView* alertView = [[UIAlertView alloc] initWithTitle:@"Pushed Message" message:alertStr delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil];  [alertView show];  }}

3、義通知提示音
你可以在 App 的 Bundle 中加入一段自定義提示音文件。然后當通知到達時可以指定播放這個文件。必須為以下幾種數據格式:

  • Linear PCM
  • MA4(IMA/ADPCM)
  • μLaw
  • aLaw

你可以將它們打包為aiff、wav或caf文件。自定義的聲音文件時間必須小于 30秒,如果超過了這個時間,將被系統聲音代替。
4、Payload
Payload 是通知的一部分,每一條推送通知都包含一個 Payload。它包含了系統提醒用戶通知到達的方式,還可以添加自定義的數據。即通知主要傳遞的數據為 Payload。
Payload 本身為 JSON 格式的字符串,它內部必須要包含一個鍵為 aps 的字典。aps 中可以包含以下字段中的一個或多個:
alert:其內容可以為字符串或者字典,如果是字符串,那么將會在通知中顯示這條內容
badge:其值為數字,表示當通知到達設備時,應用的角標變為多少。如果沒有使用這個字段,那么應用的角標將不會改變。設置為 0 時,會清除應用的角標。
sound:指定通知展現時伴隨的提醒音文件名。如果找不到指定的文件或者值為 default,那么默認的系統音將會被使用。如果為空,那么將沒有聲音。
content-available:此字段為 iOS 7 silent remote notification 使用。不使用此功能時無需包含此字段。
如果需要添加自定義的字段,就讓服務器的小伙伴們跟aps同一層級添加一個數組(以Json為例):

{  "aps" : {"alert" : "This is the alert text", "badge" : 1, "sound" :"default" },  "server" : {"serverId" : 1, "name" : "Server name"}}

這樣收到的 Payload 里面會多一個 server 的字段。
5、模擬推送
現在常用的后臺server中,一般將推送證書以及推送證書的私鑰導出p12交給后臺人員即可。
生成PHP需要的Pem證書
6、PHP有點調皮,還需要轉換成pem
準備:
1)、蘋果服務器證書端設置正確!打包證書、描述文件正確??!
2)、下載推送證書(cer格式),導入keyChain,保證私鑰存在,不存在去找創建這個證書的電腦要一份過來。
3)、從鑰匙庫導出的~~根證書~~(推送證書)私鑰(p12格式)
第三步根證書的私鑰這里是一個坑!因為一個App的推送證書的創建可以和根證書創建的電腦不同,也就是keyChain產生的certSigningRequest不一樣,所以私鑰也是不一樣的,在這里生成Pem時,注意要使用推送證書的私鑰!
操作過程:
A.把推送證書(.cer)轉換為.pem文件,執行命令:
openssl x509 -in 推送證書.cer -inform der -out 推送證書.pem
B.把推送證書導出的私鑰(.p12)文件轉化為.pem文件:
openssl pkcs12 -nocerts -out 推送證書私鑰.pem -in 推送證書私鑰.p12 
C.對生成的這兩個pem文件再生成一個pem文件,來把證書和私鑰整合到一個文件里:
cat 推送證書.pem 推送證書私鑰.pem >PHPPush.pem
然后把這個PHPPush.pem給后臺基友們,就可以下班啦。
當然測試推送也比較麻煩,需要模擬真實的推送環境,一般需要后臺提供幫助,但是遇到一些后臺同事,他們有強烈地信仰著鄙視鏈的話,很鄙視iOS,心里早就稱呼你“死前段”多年了,還那么多事……
所以關于調試推送,這里有兩種方式實現自推!不麻煩別人。
模擬推送:通過終端推送

<?php// devicetoken $deviceToken = '你的deviceToken';// 私鑰密碼,生成pem的時候輸入的$passphrase = '123456';// 定制推送內容,有一點的格式要求,詳情Apple文檔$message = array( 'body'=>'你收到一個新訂單');$body['aps'] = array( 'alert' => $message, 'sound' => 'default', 'badge' => 100, );$body['type']=3;$body['msg_type']=4;$body['title']='新訂單提醒';$body['msg']='你收到一個新消息';$ctx = stream_context_create();stream_context_set_option($ctx, 'ssl', 'local_cert', 'push.pem');//記得把生成的push.pem放在和這個php文件同一個目錄stream_context_set_option($ctx, 'ssl', 'passphrase', $passphrase);$fp = stream_socket_client( //這里需要特別注意,一個是開發推送的沙箱環境,一個是發布推送的正式環境,deviceToken是不通用的 'ssl://gateway.sandbox.push.apple.com:2195', $err, //'ssl://gateway.push.apple.com:2195', $err, $errstr, 60, STREAM_CLIENT_CONNECT|STREAM_CLIENT_PERSISTENT, $ctx);if (!$fp) exit("Failed to connect: $err $errstr" . PHP_EOL);echo 'Connected to APNS' . PHP_EOL;$payload = json_encode($body);$msg = chr(0) . pack('n', 32) . pack('H*', $deviceToken) . pack('n', strlen($payload)) . $payload;$result = fwrite($fp, $msg, strlen($msg));if (!$result) echo 'Message not delivered' . PHP_EOL;else echo 'Message successfully delivered' . PHP_EOL;fclose($fp);?>

將上面的代碼復制,保存成push.php
然后根據上面生成PHP需要的Pem證書的步驟生成push.pem
兩個文件放在同一目錄
執行下面的命令

superdanny@SuperDannydeMacBook-Pro$ php push.php 

結果為

Connected to APNSMessage successfully delivered

本文已被整理到了《iOS推送教程》,歡迎大家學習閱讀。

以上就是關于IOS推送的那些事,希望對大家的學習有所幫助。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲欧美福利视频| 国产精品无码专区在线观看| 国产精品国模在线| 97在线精品国自产拍中文| 成人深夜直播免费观看| 精品一区二区亚洲| 欧美日韩亚洲天堂| 91在线视频九色| 国产精品久久久久久久美男| 国产精品久久久久久久久久三级| 大胆欧美人体视频| 九九九热精品免费视频观看网站| 国产香蕉一区二区三区在线视频| 精品国产乱码久久久久久天美| 国产婷婷色综合av蜜臀av| 欧美激情小视频| 久精品免费视频| 亚洲精品国偷自产在线99热| 91精品国产色综合| 久久成人人人人精品欧| 亚洲久久久久久久久久久| 欧美日韩午夜视频在线观看| 国语自产精品视频在线看一大j8| 国产日韩欧美日韩大片| 日韩成人在线免费观看| 日本精品视频在线播放| 久久成人国产精品| 亚洲专区在线视频| 欧美国产亚洲视频| 2019中文字幕全在线观看| 久久久久久久久久亚洲| 国产欧美在线观看| 亚洲第一网站男人都懂| 国产成人午夜视频网址| 国产精品高精视频免费| 久久精品视频导航| 久久久精品免费视频| 亚洲第一区在线观看| 狠狠操狠狠色综合网| 久久免费视频网站| 影音先锋欧美在线资源| 中文字幕欧美精品日韩中文字幕| 黄色成人在线播放| 欧美专区第一页| 91精品国产成人www| 国产精品老牛影院在线观看| 日韩av免费在线播放| 欧美在线播放视频| 欧美成人性生活| 亚洲成人黄色网| 日韩乱码在线视频| 国产视频久久网| 国产日韩精品视频| 欧美高清视频在线| 成人免费在线网址| 欧美在线视频免费观看| 亚洲www永久成人夜色| 国产一区二区三区免费视频| 欧美制服第一页| 国产91对白在线播放| 欧美激情综合色| 久久久久久久一区二区三区| 午夜精品一区二区三区在线视| 精品久久久中文| 中文字幕无线精品亚洲乱码一区| 久久久噜噜噜久久中文字免| 九九久久久久久久久激情| 日韩av片永久免费网站| 久久精品2019中文字幕| 成人免费视频网址| 亚洲男人天堂九九视频| 亚洲精品白浆高清久久久久久| 97在线视频免费看| 最新国产成人av网站网址麻豆| 国产精品激情自拍| 欧美色图在线视频| 日韩精品在线观| 国产成+人+综合+亚洲欧美丁香花| 欧美怡红院视频一区二区三区| 国产精品狼人色视频一区| 国产国语videosex另类| 亚洲欧美成人在线| 日本久久精品视频| 国产99久久精品一区二区永久免费| 尤物yw午夜国产精品视频| 国产精品视频26uuu| 欧美综合激情网| 永久免费精品影视网站| 欧美一级电影免费在线观看| 在线观看免费高清视频97| 亚洲黄色在线看| 欧美激情性做爰免费视频| 在线亚洲午夜片av大片| 超在线视频97| 亚洲美女精品成人在线视频| 精品亚洲一区二区| 国产精品大片wwwwww| 欧美大秀在线观看| 中文字幕欧美专区| 亚洲国产成人精品久久久国产成人一区| 中文一区二区视频| 久久精品视频在线播放| 国产成人精品一区二区三区| 亚洲免费精彩视频| 美女性感视频久久久| 久久视频在线观看免费| 国产精品xxx视频| 亚洲深夜福利在线| 97精品在线观看| 狠狠操狠狠色综合网| 国产精品一区二区三| 欧美激情久久久久| 国产99久久精品一区二区 夜夜躁日日躁| 国产精品美女主播在线观看纯欲| 久久久久久久久久久免费精品| 国产综合久久久久久| 精品少妇一区二区30p| 国产精品一区二区女厕厕| 欧美www在线| 久久成人人人人精品欧| 在线国产精品播放| 精品无人区乱码1区2区3区在线| 亚洲天天在线日亚洲洲精| 国产精品一二三在线| 日韩欧中文字幕| 成人黄色av免费在线观看| 亚洲福利在线观看| 91av在线视频观看| 国产精品a久久久久久| 一区二区三区国产视频| 日韩av中文字幕在线免费观看| 欧美一级大片视频| 欧洲s码亚洲m码精品一区| 91成人在线视频| 亚洲色图综合网| 亚洲欧美在线x视频| 国产91热爆ts人妖在线| 日韩精品中文字幕在线观看| 日韩av资源在线播放| 国内精品国产三级国产在线专| 亚洲国产精品福利| 欧美精品激情在线| www.午夜精品| 国产精品美女无圣光视频| 国产美女直播视频一区| 亚洲精品电影在线观看| 国产丝袜一区二区三区免费视频| 国产精品一区二区三区久久| 国产欧美va欧美va香蕉在线| 成人有码在线视频| 国产精品免费一区豆花| 久久久久久国产精品美女| 欧美怡春院一区二区三区| 91性高湖久久久久久久久_久久99| 成人h猎奇视频网站| 亚洲国产天堂久久综合网| 北条麻妃久久精品| 欧美色播在线播放| 91久久在线观看| 91精品在线影院| 中文字幕亚洲在线| 在线看福利67194| 亚洲视频精品在线| 日韩精品视频免费|