oc學習之路----APNS消息推送從證書到代碼(2015年4月26號親試可用)

前言:看這篇博客以前要準備:首先的有一個99刀的我的開發者帳號或者199刀的企業開發者帳號,其次你用的是apns消息推送,(本人以前四處打聽有沒有其餘消息推送的方法:收穫以下:首先若是想作到apns的效果,退出app後還能收到信息,只能用apns,其餘的消息推送,xmpp不能像他同樣,我也沒用過,其次,apns相對來講沒有那麼耗資源)java

最後你要對apns有必定的瞭解。網上不少,我就很少說了。服務器

咳咳!開始app

一 , 首先證書的準備,步驟:iphone

  1  獲取 CertificateSigningRequest.certSigningRequest證書ide

  2 獲取   APPID 工具

  3 獲取 aps_development.cer證書 測試

  4 獲取  *.mobileprovision證書 ui

  5 獲取    *.p12證書 spa

  如何獲取CertificateSigningRequest.certSigningRequest證書.net

    點擊前往實用工具->點擊鑰匙串訪問-> 在證書助理裏面選擇從證書頒發機構請求證書,填寫必要信息->以後存儲便可,建議把全部證書存到一個push文件夾裏面去

      

至此CertificateSigningRequest.certSigningRequest證書獲取完畢,在你的push文件夾會有一個這樣的證書。

獲取APPIDs,在apple delopment登陸你的帳號,這裏直接基本上所有下一步,沒什麼難的 ,注意的地方我都有標誌的

 

 

  至此appids建立完畢

獲取aps_development.cer證書

  

至此你的push文件夾裏面應有這兩個文件

 

獲取  *.mobileprovision證書首先這一步以前你要保證你有一個設備已經註冊了證書,,大概看這篇文章的人都是剛有開發者帳號不就,因此這一步不少人都沒作,致使後面的會出現no  Certificate的錯誤,不能繼續下去,就不能獲取*.mobileprovision,至於怎麼獲取這個證書,基本上與獲取aps_development.cer證書同樣,估計一張圖你們就會明白了

以後真正的獲取*.mobileprovision來了

  

至此*.mobileprovision證書獲取完畢

獲取p12證書,打開push文件,雙擊aps_development.cer,進入鑰匙串選擇含有咱們剛纔建立的appid的證書,右擊導出,

至此準備工做已經徹底搞定。

以後貼代碼

iOS客戶端

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    NSString* str = [UIDevice currentDevice];
    NSLog(@"%@",str);
    // Override point for customization after application launch.
    //判斷是否由遠程消息通知觸發應用程序啓動
    if ([launchOptions objectForKey:UIApplicationLaunchOptionsRemoteNotificationKey]!=nil) {
        //獲取應用程序消息通知標記數(即小紅圈中的數字)
        int badge = [UIApplication sharedApplication].applicationIconBadgeNumber;
        if (badge>0) {
            //若是應用程序消息通知標記數(即小紅圈中的數字)大於0,清除標記。
            badge--;
            //清除標記。清除小紅圈中數字,小紅圈中數字爲0,小紅圈纔會消除。
            [UIApplication sharedApplication].applicationIconBadgeNumber = badge;
        }
    }
    //消息推送註冊
    [[UIApplication sharedApplication] registerForRemoteNotificationTypes:UIRemoteNotificationTypeSound|UIRemoteNotificationTypeAlert|UIRemoteNotificationTypeBadge];
    return YES;
}

#pragma 代理方法token    NSString
-(void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken{
//    獲取終端設備的標誌,這個標誌須要經過結構發送到服務器端,服務器端推送消息到APNS時須要知道的終端的標誌,APNS經過標誌的終端標誌來找到終端
    NSString *token = [NSString stringWithFormat:@"%@",deviceToken];
    NSLog(@"token ======= %@",token);
}

-(void)application:(UIApplication *)application didFailToRegisterForRemoteNotificationsWithError:(NSError *)error{
    NSString *error_str = [NSString stringWithFormat: @"%@", error];   
    NSLog(@"Failed to get token, error:%@", error_str);   
}

-(void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo{
    //在此處理接收到的消息。
    NSLog(@"Receive remote notification : %@",userInfo);
}

這裏要添加一個地方,三個代理方法,

在application didFinishLaunchingWithOptions:添加代碼
添加三個代理方法
java服務端
import javapns.devices.Device;
import javapns.devices.implementations.basic.BasicDevice;
import javapns.notification.AppleNotificationServerBasicImpl;
import javapns.notification.PushNotificationManager;
import javapns.notification.PushNotificationPayload;
import javapns.notification.PushedNotification;
import org.junit.Test;

public class PushDemo {
//    方法一
    public static void main(String[] args)throws Exception{
//        String deviceToken = "d4b3c5f3d497554f56f6f9791872666ae06e3b4e7abad6f4792dcd030007db91";
        String deviceToken = "42b74bacb28414c856505e2e6d70fe7940540a8c8fa4c728b3338c9ec1575367";
        String alert = "誒~你慘了~隨時給你發垃圾信息~{{{(>_<)}}}~";//push的內容
        int badge = 3;//圖標小紅圈的數值
        String sound = "default";//鈴音

        List<String> tokens = new ArrayList<String>();
        tokens.add(deviceToken);
        String certificatePath = "/Users/etund/Desktop/push/證書.p12";
        String certificatePassword = "123456";//此處注意導出的證書密碼不能爲空由於空密碼會報錯
        boolean sendCount = true;

        try
        {
            PushNotificationPayload payLoad = new PushNotificationPayload();
            payLoad.addAlert(alert); // 消息內容
            payLoad.addBadge(badge); // iphone應用圖標上小紅圈上的數值
            // payLoad.addCustomAlertBody("噢嘿嘿~捏嘻嘻~哇咔咔咔~");

            if (!StringUtils.isBlank(sound))
            {
                payLoad.addSound(sound);//鈴音
            }
            PushNotificationManager pushManager = new PushNotificationManager();
            //true:表示的是產品發佈推送服務 false:表示的是產品測試推送服務
            pushManager.initializeConnection(new AppleNotificationServerBasicImpl(certificatePath, certificatePassword, false));
            List<PushedNotification> notifications = new ArrayList<PushedNotification>();
            // 發送push消息
            if (sendCount)
            {
                Device device = new BasicDevice();
                device.setToken(tokens.get(0));
                PushedNotification notification = pushManager.sendNotification(device, payLoad, true);
                notifications.add(notification);
            }
            else
            {
                List<Device> device = new ArrayList<Device>();
                for (String token : tokens)
                {
                    device.add(new BasicDevice(token));
                }
                notifications = pushManager.sendNotifications(payLoad, device);
            }
            List<PushedNotification> failedNotifications = PushedNotification.findFailedNotifications(notifications);
            List<PushedNotification> successfulNotifications = PushedNotification.findSuccessfulNotifications(notifications);
            int failed = failedNotifications.size();
            int successful = successfulNotifications.size();
            System.out.println(failedNotifications);
            System.out.println(successfulNotifications);
            pushManager.stopConnection();
        }
        catch (Exception e)
        {
            e.printStackTrace();
        }
    }

//    方法二
    @Test
    public void test2() {
        /**APNS推送須要的證書、密碼、和設備的Token**/
        String  p12Path = "/Users/etund/Desktop/push/證書.p12";
        String  password = "123456";
        String  pushToken = "42b74bacb28414c856505e2e6d70fe7940540a8c8fa4c728b3338c9ec1575367";

        try {
            /**設置參數,發送數據**/
            ApnsService service = APNS.newService().withCert(p12Path,password).withSandboxDestination().build();
            String payload = APNS.newPayload().alertBody("hello,www.mbaike.net").badge(1).sound("default").build();
            service.push(pushToken, payload);
            System.out.println("推送信息已發送!");
        } catch (Exception e) {
            System.out.println("出錯了:"+e.getMessage());
        }
    }
}

至於java服務的jar包

至此服務端和客戶端已經所有能夠運行
最後看看運行效果
手機端

 

好了,結束!

所有原創,轉載請說明出處。

相關文章
相關標籤/搜索