欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

iOS推送的那些事

 更新時間:2016年02月04日 11:36:17   作者:super_danny  
關(guān)于iOS推送的那些事,你知道多少?本文帶著大家一起了解iOS推送,感興趣的小伙伴們可以參考一下

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

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

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

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

- (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得到消息內(nèi)容

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

2)、程序在前臺運(yùn)行,接收到消息不會有消息提示(提示框或橫幅)。當(dāng)程序運(yùn)行在后臺,接收到消息會有消息提示,點擊消息后進(jìn)入程序,AppDelegate的didReceiveRemoteNotification函數(shù)會被調(diào)用,消息做為此函數(shù)的參數(shù)傳入

- (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 中加入一段自定義提示音文件。然后當(dāng)通知到達(dá)時可以指定播放這個文件。必須為以下幾種數(shù)據(jù)格式:

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

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

{
  "aps" : {"alert" : "This is the alert text", "badge" : 1, "sound" :"default" },

  "server" : {"serverId" : 1, "name" : "Server name"}
}

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

<?php
// devicetoken
 $deviceToken = '你的deviceToken';
// 私鑰密碼,生成pem的時候輸入的
$passphrase = '123456';
// 定制推送內(nèi)容,有一點的格式要求,詳情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(
 //這里需要特別注意,一個是開發(fā)推送的沙箱環(huán)境,一個是發(fā)布推送的正式環(huán)境,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);
?>

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

superdanny@SuperDannydeMacBook-Pro$ php push.php 

結(jié)果為

Connected to APNS
Message successfully delivered

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

以上就是關(guān)于IOS推送的那些事,希望對大家的學(xué)習(xí)有所幫助。

相關(guān)文章

  • iOS中各種UI控件屬性設(shè)置示例代碼

    iOS中各種UI控件屬性設(shè)置示例代碼

    這篇文章主要給大家介紹了關(guān)于iOS中各種UI控件屬性設(shè)置的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-08-08
  • IOS微信搖一搖聲音無法播放的解決辦法

    IOS微信搖一搖聲音無法播放的解決辦法

    這篇文章主要為大家詳細(xì)介紹了IOS微信搖一搖聲音無法播放的解決辦法,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-05-05
  • 簡單講解Objective-C的基本特性及其內(nèi)存管理方式

    簡單講解Objective-C的基本特性及其內(nèi)存管理方式

    這篇文章主要介紹了簡單講解Objective-C的基本特性及其內(nèi)存管理方式,雖然Swift語言出現(xiàn)后iOS和Mac OS應(yīng)用開發(fā)方面Objective-C正在成為過去時,但現(xiàn)有諸多項目仍然在使用,需要的朋友可以參考下
    2016-01-01
  • iOS數(shù)據(jù)持久化UserDefaults封裝器使用詳解

    iOS數(shù)據(jù)持久化UserDefaults封裝器使用詳解

    這篇文章主要為大家介紹了iOS數(shù)據(jù)持久化UserDefaults封裝器使用詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-02-02
  • 詳解iOS項目基本框架搭建

    詳解iOS項目基本框架搭建

    本篇文章給讀者們詳細(xì)分析了iOS項目基本框架搭建的過程的注意點,對此有需要的朋友學(xué)習(xí)參考下。
    2018-02-02
  • ios開發(fā) try-catch引起的野指針問題排查

    ios開發(fā) try-catch引起的野指針問題排查

    這篇文章主要為大家介紹了ios開發(fā) try-catch引起的野指針問題排查,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-09-09
  • IOS 開發(fā)之對象為空的判斷(nil、null)詳解

    IOS 開發(fā)之對象為空的判斷(nil、null)詳解

    這篇文章主要介紹了IOS 開發(fā)之對象為空的判斷(nil、null)詳解的相關(guān)資料,需要的朋友可以參考下
    2017-02-02
  • iOS 捕獲程序崩潰日志

    iOS 捕獲程序崩潰日志

    我們常常會遇到iPhone手機(jī)或者iPad平板上運(yùn)行APP崩潰的問題,有時候打開某個APP,卻一下子“閃退”了。對于開發(fā)者來說,這個絕對是頭疼的問題。那么如何獲取到iOS設(shè)備崩潰日志呢?這個提供一些簡單的方法,共開發(fā)者與用戶溝通使用。
    2015-06-06
  • iOS開發(fā)項目- 基于WebSocket的聊天通訊(1)

    iOS開發(fā)項目- 基于WebSocket的聊天通訊(1)

    這篇文章主要介紹了iOS開發(fā)項目- 基于WebSocket的聊天通訊,WebSocket是web通信方式的一種,有需要的可以了解一下。
    2016-11-11
  • 詳解iOS應(yīng)用開發(fā)中Core Data數(shù)據(jù)存儲的使用

    詳解iOS應(yīng)用開發(fā)中Core Data數(shù)據(jù)存儲的使用

    這篇文章主要介紹了iOS應(yīng)用開發(fā)中Core Data數(shù)據(jù)存儲的使用,Core Data可以看作是一個內(nèi)嵌型數(shù)據(jù)庫SQLite的iOS專用版本,需要的朋友可以參考下
    2016-02-02

最新評論