iOS 訊息推送原理及實現總結

來源:互聯網
上載者:User

標籤:

在實現訊息推送之前先提及幾個於推送相關概念,如:

1、 Provider:就是為指定IOS裝置應用程式提供Push的伺服器,(如果IOS裝置的應用程式是用戶端的話,那麼Provider可以理解為服務端[訊息的發起者]);
2、 APNS:Apple Push Notification Service[蘋果訊息推送伺服器];
3、 iPhone:用來接收APNS下發下來的訊息;
4、 Client App:IOS裝置上的應用程式,用來接收iphone傳遞APNS下發的訊息到制定的一個用戶端 app[訊息的最終響應者];
可以分為三個階段:
階段一:Provider[服務端]把要發送的訊息,目的IOS裝置標識打包,發送給APNS;
階段二:APNS在自身的登入Push服務的IOS裝置列表中,尋找有相應標識的IOS裝置,並將訊息發送到IOS裝置;
階段三:IOS裝置把發送的訊息傳遞給對應的應用程式,並且按照設定彈出Push通知。
具體過程,如:

1、 [Client App]註冊訊息推送;
2、 [Client App]跟[APNS Service]要deviceToken, Client App接收deviceToken;
3、 [Client App]將deviceToken發送給[Provider]Push服務端程式;
4、 當Push服務端程式滿足發送訊息條件了,[Provider]向[APNS Service]發送訊息;
5、 [APNS Service]將訊息發送給[Client App].

二、訊息推送實現:

1、 產生*.certSigningRequest檔案,步驟如下:
[MacBookà應用程式à工具 + 生產力à鑰匙串訪問à認證助手à從認證機構求認證?à認證資訊(使用者電子郵箱地址{填寫您的郵箱,如:[email protected]},常用名稱{任意,如:PushDemo},請求是:{單選,選擇‘儲存到磁碟’})à繼續à儲存],這時會在您指定的地方產生你指定的檔案,預設為CertificateSigningRequest.certSigningRequest檔案,這裡命名為:PushDemo.certSigningRequest.在此*.certSigningRequest已經產生,具體操作步驟如下面兩張圖所示。

如果產生成功,則會在[鑰匙串訪問|登入|密鑰]欄目中列出與*.certSigningRequest關聯的密鑰,這裡是PushDemo,如所示:

2、 建立一個App ID(在蘋果開發人員帳號中配置)
(1) 登入iOS Dev Center,登入成功後,點擊(iOS Provisioning Portal對應連結),如所示:

(2) 建立New App ID[App IDsàManageàNew App ID]( Description{填寫您對此App ID 的描述,如:iShop},Bundle Seed ID(App ID Prefix){選擇綁定App ID首碼,如:預設選擇Generate New},Bundle Identifier(App ID Suffix){填寫綁定App ID尾碼,如:com.yourcorp.iShop}),如所示:

這樣就會產生下面這條記錄,如所示:

(3) 配置上一步中產生的App ID,讓其支援訊息推送[點擊2-6中的Configureà選中Enable for Apple Push Notification serviceà點擊Configure],如所示:

(4) Generate a Certificate Signing Request(產生部署請求認證)[點擊中的2ConfigureàContinueà步驟1產生的*certSigningRequest檔案(這裡是iShop. certSigningRequest)à Generateà產生完成後將其下載下來,命名為:aps_developer_identity.cer],雙擊aps_developer_identity.cer認證{將認證與密鑰關聯,並將認證匯入到MacBook中},如所示:

(5) 建立Development Provisioning Profiles[開發許可設定檔](Provisioning| Development|New Profile),具體操作流程如所示:

點擊中Submit,產生Development Provisioning Profiles[開發許可設定檔],這裡是:iShopDevprofile.mobileprovision如所示:

下載此開發許可認證(用於聯機調試)。
總結,到現在為止,我們已經產生:A:*.certSigningRequest檔案(在步驟(4)中使用,用於產生認證B)、B: aps_developer_identity.cer認證(在Provider[Push伺服器]服務端應用使用)、C:*..mobileprovision開發許可設定檔(在Client App用戶端應用聯機調試使用)。

至此,訊息推送的配置已經全部完成,接下來的工作就是編寫Provider[Push伺服器]服務端應用和Client App用戶端應用的程式。

 

三、Provider服務端的實現

 

在這裡只是簡單講述Provider服務端(JAVA實現)步驟如下:

(1) 製作Provider服務端所需要的*.p12檔案:
在上面的實現的(4) 部分的圖所展示的密鑰、認證,我們並沒有使用到它,那麼為什麼要展示出來呢,猜猜是為什嗎?為製作*.p12檔案?哈哈,您猜對了,下面我們就利用它來製作*.p12檔案,步驟:([MacBookà應用程式à工具 + 生產力à鑰匙串訪問[鑰匙串:登入,種類:認證]à選擇剛剛產生的認證(Apple Development IOS Services:*******)à菜單à檔案à匯出項目…à[儲存為:任意檔案名稱(如:iPush),檔案格式:預設(個人資訊交換(.p12))]à輸入密碼以進行匯出[密碼:任意,驗證:與密碼同一]à輸入MACBook登入密碼à允許à最終產生。

關鍵步驟如:

 

(2) 編寫Client App用戶端的關鍵代碼,如下:

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
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    self.window = [[[UIWindow alloc] initWithFrame:[[UIScreen mainScreen]bounds]] autorelease];
    self.window.backgroundColor = [UIColor whiteColor];
    [self.window makeKeyAndVisible];
    //訊息推送支援的類型
    UIRemoteNotificationType types =
    (UIRemoteNotificationTypeBadge
     |UIRemoteNotificationTypeSound
     |UIRemoteNotificationTypeAlert);
    //註冊訊息推送
    [[UIApplication sharedApplication]registerForRemoteNotificationTypes:types]; 
    return YES;
}
 
//擷取DeviceToken成功
- (void)application:(UIApplication *)application
didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken
{
    NSLog(@"DeviceToken: {%@}",deviceToken);
    //這裡進行的操作,是將Device Token發送到服務端
}
 
//註冊訊息推送失敗
- (void)application:(UIApplication *)application
didFailToRegisterForRemoteNotificationsWithError:(NSError *)error
{
    NSLog(@"Register Remote Notifications error:{%@}",[errorlocalizedDescription]);
}
 
//處理收到的訊息推送
- (void)application:(UIApplication *)application
didReceiveRemoteNotification:(NSDictionary *)userInfo
{
    NSLog(@"Receive remote notification : %@",userInfo);
    UIAlertView *alert =
    [[UIAlertView alloc] initWithTitle:@"溫馨提示"
                               message:@"推送成功!"
                              delegate:nil
                     cancelButtonTitle:@"確定"
                     otherButtonTitles:nil];
    [alert show];
    [alert release];
}

(3)編寫Provider服務端關鍵代碼,如下:

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
import javapns.back.PushNotificationManager;
import javapns.back.SSLConnectionHelper;
import javapns.data.Device;
import javapns.data.PayLoad;
 
public class MainSend
{
    public static void main(String[] args) throws Exception
    {
        try
        {
            //從用戶端擷取的deviceToken
            String deviceToken = "3a20764942e9cb4c4f6249274f12891946bed26131b686b8aa95322faff0ad46";
            System.out.println("Push Start deviceToken:" + deviceToken);
            //定義訊息模式
            PayLoad payLoad = new PayLoad();
            payLoad.addAlert("訊息推送測試!");
            payLoad.addBadge(4);
            payLoad.addSound("default");
            //註冊deviceToken
            PushNotificationManager pushManager = PushNotificationManager.getInstance();
            pushManager.addDevice("iPhone", deviceToken);
            //串連APNS
            String host = "gateway.sandbox.push.apple.com";
            int port = 2195;
            String path = "/Users/iMilo/Work.localized/iShop/project/service/iPush/";
            String certificatePath = (path + "src/ipush/iPush.p12");
            //certificatePath 步驟一中產生的*.p12檔案位置
            String certificatePassword = "Love24mm";
            pushManager.initializeConnection(host, port, certificatePath, certificatePassword, SSLConnectionHelper.KEYSTORE_TYPE_PKCS12);
            //發送推送
            Device client = pushManager.getDevice("iPhone");
            pushManager.sendNotification(client, payLoad);
            //停止串連APNS
            pushManager.stopConnection();
            //刪除deviceToken
            pushManager.removeDevice("iPhone");
            System.out.println("Push End");
        }
        catch (Exception ex)
        {
            ex.printStackTrace();
        }
    }
}

iOS 訊息推送原理及實現總結

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.