激情久久久_欧美视频区_成人av免费_不卡视频一二三区_欧美精品在欧美一区二区少妇_欧美一区二区三区的

服務器之家:專注于服務器技術及軟件下載分享
分類導航

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

服務器之家 - 編程語言 - IOS - 詳解IOS開發之實現App消息推送(最新)

詳解IOS開發之實現App消息推送(最新)

2021-02-23 15:16HelloWord杰少 IOS

這篇文章主要介紹了詳解IOS開發之實現App消息推送(最新),具有一定的參考價值,有興趣的可以了解一下。

好久沒有寫過博客啦,今天就由本菜鳥給大家做一個簡單的iosapp消息推送教程吧!一切從0開始,包括xcode6, ios8, 以及蘋果開發者中心最新如何注冊應用,申請證書以及下載配置概要文件,相信很多剛開始接觸ios的人會很想了解一下。(ps:網上看了一下雖然有很多講述推送的好教程,我也是看著一步步學會的,但是這些教程的時間都是去年或者更早時期的,對引導新手來說不是很合適)

第一部分

首先第一步當然是介紹一下蘋果的推送機制(apns)咯(ps:其實每一篇教程都有),先來看一張蘋果官方對其推送做出解釋的概要圖。

詳解IOS開發之實現App消息推送(最新)

provider是給你手機應用發出推送消息的服務器,而apns(apple push notification service)則是蘋果消息推送服務器。你本地的服務器當需要給應用推送一條消息的時候,先要將消息發出到蘋果推送服務器,然后再由蘋果推送服務器將消息發到安裝了該應用的手機。

接下來再看一張解釋圖:

詳解IOS開發之實現App消息推送(最新)

根據上圖的邏輯我來給大家解釋一下:

1.你的ios應用需要去注冊apns消息推送功能。

2.當蘋果apns推送服收到來自你應用的注冊消息就會返回一串device token給你(很重要)

3.將應用收到的device token傳給你本地的push服務器。

4.當你需要為應用推送消息的時候,你本地的推送服務器會將消息,以及device token打包發送到蘋果的apns服

5.apns再將消息推送給目的iphone

第二部分

1.從證書頒發機構頒發證書

打開你mac的鑰匙串訪問: 詳解IOS開發之實現App消息推送(最新)然后點擊鑰匙串訪問

詳解IOS開發之實現App消息推送(最新)

詳解IOS開發之實現App消息推送(最新)

隨后它會彈出一個窗口用戶電子郵件信息就填寫你蘋果開發者賬號的名稱即可(應該是一個郵件名稱),點擊保存到磁盤的選
項,點擊繼續,顯示如下:

詳解IOS開發之實現App消息推送(最新)

點擊存儲,文件名為:certificatesigningrequest.certsigningrequest 隨后將他放在一個文件夾中我們取名push吧!

第三部分

訪問蘋果開發者網址:https://developer.apple.com/

詳解IOS開發之實現App消息推送(最新)

選中membercenter選項,進入登陸頁面,用你的蘋果開發者賬號登陸,過一會網頁就會自動跳轉到下圖。

詳解IOS開發之實現App消息推送(最新)

點擊紅色所選部分內容進行下一步的操作。

詳解IOS開發之實現App消息推送(最新)

選擇certificates選項,設置證書,如圖所示先解釋一下:

詳解IOS開發之實現App消息推送(最新)  

development選項的作用顧名思義就是用來作為開發使用的證書,production選項則是用來發布產品使用的,名稱很陌生是不是,之前的開發者網頁是沒有這一選項的,可能是蘋果把他修改了,用這個名稱更加能讓人理解吧(字面上解釋就是產品么)。兩個選項生成證書的步驟是一樣的,現在我們使用開發者的選項進行證書的制作,步驟如下:選擇development選項:

詳解IOS開發之實現App消息推送(最新)

點擊上面的加號選項,

詳解IOS開發之實現App消息推送(最新)

選擇apns選項(開發么當然是在沙盒環境下了,模擬真實情況),然后continue

詳解IOS開發之實現App消息推送(最新)

這個appid我們在下一部分講如何生成,現在我用的是已經生成好的一個應用id,繼續continue

詳解IOS開發之實現App消息推送(最新)

這邊就要選擇在鑰匙串訪問環節下載下來的certificatesigningrequest.certsigningrequest文件了,選擇并生成:

詳解IOS開發之實現App消息推送(最新)

點擊下載,得到aps_development .cer,保存到push文件中去。

第四部分

新建一個appid,選擇網頁上的appids,然后點擊右上角的 “加號”

詳解IOS開發之實現App消息推送(最新)

app的取名只要按照蘋果要求的就可以了

 詳解IOS開發之實現App消息推送(最新)

然后bundleid是比較重要的,在提交審核以及測試(蘋果的testflight)和付費環節都需要用到,也只需按照蘋果要求來寫就好了。

 詳解IOS開發之實現App消息推送(最新)

接下來就是對你的應用需要使用蘋果的哪些服務進行選擇就行了,例如廣告,游戲中心,推送,付費等等情況。

詳解IOS開發之實現App消息推送(最新)

最后選擇“submit”選項,在下一個界面中選擇“done”選項,這樣我們設置appid的步驟我們就完成了。

第五部分:生成provisioning profiles

這個配置概要文件分為兩種,一種是為開發使用的,還有一種則是為發布到appstore上面。

詳解IOS開發之實現App消息推送(最新)

創建發布版的provisioningprofile與開發版的流程相同,點擊development然后點擊右上角的加號

詳解IOS開發之實現App消息推送(最新)

會進入選擇何種配置概要文件的界面:

 詳解IOS開發之實現App消息推送(最新)

我們現在時測試,所以選擇“ios app development”的選項,在下面的distribution發布選項中有兩個選擇,“app store”以及
“ad hoc”,你可以根據下面的描述選擇你發布所需的選項。點擊continue進入下一步。

詳解IOS開發之實現App消息推送(最新)

選擇你上一步創建的appid,點擊continue 進行下一步

詳解IOS開發之實現App消息推送(最新)

選擇你的開發者賬號,continue進行下一步

詳解IOS開發之實現App消息推送(最新)

在這一步上選擇你的設備(你只有在這一步上勾選了你的設備,你才能在設備上用這個簽名進行調試)。關于如何將你的設備號添加進去也是非常簡單的,選擇左側的"devices",然后點擊右上角的加號,在隨后出來的頁面上添加你設備的uuid(在xcode中可以查看到)以及name( 可以隨便取,自己看的懂就行)然后register一下,照著流程走到最后一步就完成了。
好咱們繼續回到上面的provisioning profile配置環節,當你選好了你的設備后點擊“continue”進入下一頁,

詳解IOS開發之實現App消息推送(最新)

輸入一個文件名(最好是起的能看懂是干嘛的,當然也可以隨便起),點擊“generate”進入下一個頁面,在這個頁面中就會有一個下載按鈕讓你下載這個文件,我們把它下載下來放在push文件夾中。

第六部分

好了,前期的準備工作都已經做完了,現在讓我們開始推送吧!(吼吼)

首先雙擊我們生成的 “aps_development .cer” 文件,進入鑰匙串訪問,找到我們的專用秘鑰(根據在第二部分中從證書機構頒發證書操作中填寫的常用名)

 詳解IOS開發之實現App消息推送(最新)

我在第二部分填寫的是“silicon”,由于換了一臺mac之前安裝的沒有了,之前沒有截圖,所以隨便找了個圖給大家看一下,憑大家的聰明才智應該不難理解吧。

然后右擊導出,會彈出如下所示的圖。

 詳解IOS開發之實現App消息推送(最新)

將他存儲到push文件夾中,命名為“push.p12”,在這一步中導出會讓你輸入密碼并驗證,你可以自定義一個密碼,例如abc123
現在push文件夾中應該有幾個文件“aps_development .cer” ,"push.p12",“certificatesigningrequest.certsigningrequest”以及剛才下下來的配置概要文件。

接下來我們打開終端將他們生成.pem文件

1.把aps_development .cer文件生成.pcm文件,cd到push文件夾下

 詳解IOS開發之實現App消息推送(最新)

2.把push.p12文件生成為.pem文件

詳解IOS開發之實現App消息推送(最新)

上邊輸入的密碼則是你導出證書所設的密碼,即abc123.接著還會讓你輸入.pem文件的密碼,還是使用abc123好了,防止混淆。這樣我們在push文件夾中就又得到了兩個文件,pushchatcert.pem和pushchatkey.pem。

3.把pushchatcert.pem和pushchatkey.pem合并為一個pem文件,

詳解IOS開發之實現App消息推送(最新)

在push文件夾中又多了一個ck.pem文件,以上我們把需要使用的文件都準備好了

接下來就要測試一下啦,是不是很激動~

為了測試證書工作的狀況,我們可以使用“telnet gateway.sandbox.push.apple.com 2195”來檢測一下,如果顯示下圖則表示成功了。

 詳解IOS開發之實現App消息推送(最新)

然后,我們使用我們生成的證書和私鑰來設置一個安全的鏈接去鏈接蘋果服務器

在終端輸入如下命令:openssl s_client -connect gateway.sandbox.push.apple.com:2195 -cert pushchatcert.pem -key pushchatkey.pem

需要輸入密碼(abc123 我們剛才所設置的)。

然后他會返回一系列的數據,這里我就粘貼一部分啦:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
connected(00000003)
depth=1 /c=us/o=entrust, inc./ou=www.entrust.net/rpa is incorporated by reference/ou=(c) 2009 entrust, inc./cn=entrust certification authority - l1c
verify error:num=20:unable to get local issuer certificate
verify return:0
---
certificate chain
。。。。。(省略)
。。。。。(省略)
。。。。。(省略)
  start time: 1416389389
  timeout  : 300 (sec)
  verify return code: 0 (ok)
---

測試就到這里啦。。。

第七部分

1.建立推送項目

?
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
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
//
// appdelegate.m
// testpushnotifiy
//
// created by silicon on 14-10-30.
// copyright (c) 2014年 silicon. all rights reserved.
//
 
#import "appdelegate.h"
 
@implementation appdelegate
@synthesize mainview = _mainview;
 
- (bool)application:(uiapplication *)application didfinishlaunchingwithoptions:(nsdictionary *)launchoptions
{
  if ([application respondstoselector:@selector(isregisteredforremotenotifications)])
  {
    //ios8
    //創建uiusernotificationsettings,并設置消息的顯示類類型
    uiusernotificationsettings *notisettings = [uiusernotificationsettings settingsfortypes:(uiusernotificationtypebadge | uiusernotificationtypealert | uiremotenotificationtypesound) categories:nil];
     
    [application registerusernotificationsettings:notisettings];
     
  } else{ // ios7
    [application registerforremotenotificationtypes:(uiremotenotificationtypebadge                    |uiremotenotificationtypesound                   |uiremotenotificationtypealert)];
  }
   
  self.window = [[uiwindow alloc] initwithframe:[[uiscreen mainscreen] bounds]];
  // override point for customization after application launch.
  self.window.backgroundcolor = [uicolor whitecolor];
  [self.window makekeyandvisible];
   
  self.mainview = [[mainviewcontroller alloc] initwithnibname:@"mainviewcontroller" bundle:nil];
  self.window.rootviewcontroller = self.mainview;
  return yes;
}
 
- (void)application:(uiapplication *)application didregisterforremotenotificationswithdevicetoken:(nsdata *)ptoken{
  nslog(@"---token--%@", ptoken);
}
 
- (void)application:(uiapplication *)application didreceiveremotenotification:(nsdictionary *)userinfo{
   
  nslog(@"userinfo == %@",userinfo);
  nsstring *message = [[userinfo objectforkey:@"aps"]objectforkey:@"alert"];
   
  uialertview *alert = [[uialertview alloc] initwithtitle:@"提示" message:message delegate:self cancelbuttontitle:@"取消" otherbuttontitles:@"確定", nil nil];
   
  [alert show];
}
 
- (void)application:(uiapplication *)application didfailtoregisterforremotenotificationswitherror:(nserror *)error{
 
  nslog(@"regist fail%@",error);
}
 
- (void)applicationwillresignactive:(uiapplication *)application
{
  // sent when the application is about to move from active to inactive state. this can occur for certain types of temporary interruptions (such as an incoming phone call or sms message) or when the user quits the application and it begins the transition to the background state.
  // use this method to pause ongoing tasks, disable timers, and throttle down opengl es frame rates. games should use this method to pause the game.
}
 
- (void)applicationdidenterbackground:(uiapplication *)application
{
  // use this method to release shared resources, save user data, invalidate timers, and store enough application state information to restore your application to its current state in case it is terminated later. 
  // if your application supports background execution, this method is called instead of applicationwillterminate: when the user quits.
}
 
- (void)applicationwillenterforeground:(uiapplication *)application
{
  // called as part of the transition from the background to the inactive state; here you can undo many of the changes made on entering the background.
}
 
- (void)applicationdidbecomeactive:(uiapplication *)application
{
  // restart any tasks that were paused (or not yet started) while the application was inactive. if the application was previously in the background, optionally refresh the user interface.
}
 
- (void)applicationwillterminate:(uiapplication *)application
{
  // called when the application is about to terminate. save data if appropriate. see also applicationdidenterbackground:.
}
 
@end

在appdelegate.m中加入以上代碼,

?
1
2
3
4
5
6
7
8
9
10
11
if ([application respondstoselector:@selector(isregisteredforremotenotifications)])
  {
    //ios8
    //創建uiusernotificationsettings,并設置消息的顯示類類型
    uiusernotificationsettings *notisettings = [uiusernotificationsettings settingsfortypes:(uiusernotificationtypebadge | uiusernotificationtypealert | uiremotenotificationtypesound) categories:nil];
     
    [application registerusernotificationsettings:notisettings];
     
  } else{ // ios7
    [application registerforremotenotificationtypes:(uiremotenotificationtypebadge                    |uiremotenotificationtypesound                   |uiremotenotificationtypealert)];
  }

由于ios8的推送跟ios7及以下的不一樣,所以需要加判斷來注冊消息推送。

函數:

?
1
2
3
- (void)application:(uiapplication *)application didregisterforremotenotificationswithdevicetoken:(nsdata *)ptoken{
  nslog(@"---token--%@", ptoken);
}

會接收來自蘋果服務器給你返回的devicetoken,然后你需要將它添加到你本地的推送服務器上。(很重要,決定你的設備能不能接收到推送消息)。

?
1
2
3
4
5
6
7
8
9
- (void)application:(uiapplication *)application didreceiveremotenotification:(nsdictionary *)userinfo{
   
  nslog(@"userinfo == %@",userinfo);
  nsstring *message = [[userinfo objectforkey:@"aps"]objectforkey:@"alert"];
   
  uialertview *alert = [[uialertview alloc] initwithtitle:@"提示" message:message delegate:self cancelbuttontitle:@"取消" otherbuttontitles:@"確定", nil nil];
   
  [alert show];
}

這個函數則是當設備接收到來自蘋果推送服務器的消息時觸發的,用來顯示推送消息。

?
1
2
3
4
- (void)application:(uiapplication *)application didfailtoregisterforremotenotificationswitherror:(nserror *)error{
 
  nslog(@"regist fail%@",error);
}

當注冊失敗時,觸發此函數。

2.php服務端

將simplepush.php這個推送腳本也放在push文件夾中

?
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
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
<?php
 
// ??????????devicetoken???????????????
$devicetoken = 'c95f661371b085e2517b4c12cc76293522775e5fd9bb1dea17dd80fe85583b41';
 
// put your private key's passphrase here:
$passphrase = 'abc123';
 
// put your alert message here:
$message = 'my first push test!';
 
////////////////////////////////////////////////////////////////////////////////
 
$ctx = stream_context_create();
stream_context_set_option($ctx, 'ssl', 'local_cert', 'ck.pem');
stream_context_set_option($ctx, 'ssl', 'passphrase', $passphrase);
 
// open a connection to the apns server
//??????????
 //$fp = stream_socket_client(?ssl://gateway.push.apple.com:2195?, $err, $errstr, 60, //stream_client_connect, $ctx);
//?????????????appstore??????
$fp = stream_socket_client(
'ssl://gateway.sandbox.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;
 
// create the payload body
$body['aps'] = array(
'alert' => $message,
'sound' => 'default'
);
 
// encode the payload as json
$payload = json_encode($body);
 
// build the binary notification
$msg = chr(0) . pack('n', 32) . pack('h*', $devicetoken) . pack('n', strlen($payload)) . $payload;
 
// send it to the server
$result = fwrite($fp, $msg, strlen($msg));
 
if (!$result)
echo 'message not delivered' . php_eol;
else
echo 'message successfully delivered' . php_eol;
 
// close the connection to the server
fclose($fp);
?>

devicetoken填寫你接收到的token,passphrase則填寫你的ck.pem設置的密碼。

此刻就是見證奇跡的時候了,使用終端進入到push文件夾,在終端輸入 php simplepush.php

詳解IOS開發之實現App消息推送(最新)

若顯示以上提示則表示推送成功了。附上一張成功圖。

詳解IOS開發之實現App消息推送(最新)

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持服務器之家。

原文鏈接:http://blog.csdn.net/shenjie12345678/article/details/41120637

延伸 · 閱讀

精彩推薦
  • IOSiOS實現控制屏幕常亮不變暗的方法示例

    iOS實現控制屏幕常亮不變暗的方法示例

    最近在工作中遇到了要將iOS屏幕保持常亮的需求,所以下面這篇文章主要給大家介紹了關于利用iOS如何實現控制屏幕常亮不變暗的方法,文中給出了詳細的...

    隨風13332021-04-02
  • IOSiOS開發之視圖切換

    iOS開發之視圖切換

    在iOS開發中視圖的切換是很頻繁的,獨立的視圖應用在實際開發過程中并不常見,除非你的應用足夠簡單。在iOS開發中常用的視圖切換有三種,今天我們將...

    執著丶執念5282021-01-16
  • IOSiOS開發技巧之狀態欄字體顏色的設置方法

    iOS開發技巧之狀態欄字體顏色的設置方法

    有時候我們需要根據不同的背景修改狀態欄字體的顏色,下面這篇文章主要給大家介紹了關于iOS開發技巧之狀態欄字體顏色的設置方法,文中通過示例代碼...

    夢想家-mxj8922021-05-10
  • IOSiOS中UILabel實現長按復制功能實例代碼

    iOS中UILabel實現長按復制功能實例代碼

    在iOS開發過程中,有時候會用到UILabel展示的內容,那么就設計到點擊UILabel復制它上面展示的內容的功能,也就是Label長按復制功能,下面這篇文章主要給大...

    devilx12792021-04-02
  • IOS詳解iOS中多個網絡請求的同步問題總結

    詳解iOS中多個網絡請求的同步問題總結

    這篇文章主要介紹了詳解iOS中多個網絡請求的同步問題總結,小編覺得挺不錯的,現在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧...

    liang199111312021-03-15
  • IOSiOS中滑動控制屏幕亮度和系統音量(附加AVAudioPlayer基本用法和Masonry簡單使用)

    iOS中滑動控制屏幕亮度和系統音量(附加AVAudioPlayer基本用法和

    這篇文章主要介紹了iOS中滑動控制屏幕亮度和系統音量(附加AVAudioPlayer基本用法和Masonry簡單使用)的相關資料,需要的朋友可以參考下...

    CodingFire13652021-02-26
  • IOSiOS自定義UICollectionViewFlowLayout實現圖片瀏覽效果

    iOS自定義UICollectionViewFlowLayout實現圖片瀏覽效果

    這篇文章主要介紹了iOS自定義UICollectionViewFlowLayout實現圖片瀏覽效果的相關資料,需要的朋友可以參考下...

    jiangamh8882021-01-11
  • IOSiOS中MD5加密算法的介紹和使用

    iOS中MD5加密算法的介紹和使用

    MD5加密是最常用的加密方法之一,是從一段字符串中通過相應特征生成一段32位的數字字母混合碼。對輸入信息生成唯一的128位散列值(32個字符)。這篇文...

    LYSNote5432021-02-04
主站蜘蛛池模板: 国产亚洲精品久久久久久久 | 欧美激情视频一区二区免费 | 欧美日韩亚洲成人 | 一级α片免费看刺激高潮视频 | 午夜视频久久 | 免费观看黄色一级视频 | 激情小说另类 | 久久久久久久国产视频 | av噜噜在线 | 久久久久久久久久久影视 | 九九精品影院 | 一级毛片播放 | 久久久久久久国产a∨ | 成人国产精品一区二区毛片在线 | 欧美亚洲综合网 | 激情小说另类 | 欧美毛片 | 日本精品免费观看 | 午夜亚洲视频 | 91成人久久 | 久久久www成人免费毛片 | 久久精品国产亚洲7777 | 91精品福利视频 | 羞羞视频免费入口网站 | 老司机免费福利午夜入口ae58 | 一级黄色影片在线观看 | 国产日产精品一区四区介绍 | 综合精品久久 | 毛片免费视频观看 | 国产三级在线视频观看 | 午夜影院在线免费观看 | 国内精品一级毛片免费看 | 精品一区二区三区免费爱 | 一区二区免费看 | 国产精品麻豆一区二区三区 | 国产高清一区 | 久久久久久久.comav | 久久国产精品免费视频 | 国产精品.com| www.成人在线视频 | 中文字幕亚洲视频 |