這裡記錄下iOS訊息推送實現的全過程
首先,申請秘鑰。
<喎?http://www.bkjia.com/kf/ware/vc/" target="_blank" class="keylink">vcD4KPHA+1q668734yOtodHRwczovL2RldmVsb3Blci5hcHBsZS5jb20vv6q3otXfo6y1sci7xOO1w9PQsKGjoaOho6GjoaOhPC9wPgo8cD6147v31eLA7zwvcD4KPHA+PGltZyBzcmM9"http://www.2cto.com/uploadfile/Collfiles/20140416/2014041609101140.png" alt="\">
下面實現建立推送認證
接:
:
第一步完:
為認證添加推送功能:
點擊之後的效果:
點擊之後
到現在我們已經有倆個認證了,aps_development.cer 和CertificateSigningRequest.certSigningRequest。
下面的步驟比較關鍵。我們需要把機器中的之前的認證清理乾淨,如果不清理乾淨的畫會出現如下錯誤:
Error Domain=NSCocoaErrorDomain Code=3000 "未找到應用程式的“aps-environment”的權利字串" UserInfo=0x17007d6c0 {NSLocalizedDescription=未找到應用程式的“aps-environment”的權利字串}
這個錯誤大概的意思就是認證不匹配的意思。
清理之後,我們點擊
將推送認證添加進去。
之後我們匯出一個可以供伺服器端使用的。
以下代碼來著網上的活雷鋒貢獻。
下面附上用戶端代碼:
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions{ // Override point for customization after application launch. NSString* str = [UIDevice currentDevice]; 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;}-(void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken{ NSString* token = [NSString stringWithFormat:@"%@",deviceToken]; NSLog(@"%@",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 *)applicationdidReceiveRemoteNotification:(NSDictionary *)userInfo{ //在此處理接收到的訊息。 NSLog(@"Receive remote notification : %@",userInfo);}
下面附上伺服器端代碼:
import org.apache.log4j.Logger;import org.apache.log4j.PropertyConfigurator;import javapns.*;import javapns.back.PushNotificationManager;import javapns.back.SSLConnectionHelper;import javapns.data.Device;import javapns.data.PayLoad;public class PushDemo {public static void main(String[] args) throws Exception { try { //從用戶端擷取的deviceToken,在此為了測試簡單,寫固定的一個測試裝置標識。 String deviceToken = "9f8e0099 1e72c4ab ca835ec3 994e93d9 a09ce215 62d91bb3 6e929a33 02c29456"; System.out.println("Push Start deviceToken:" + deviceToken); //定義訊息模式 PayLoad payLoad = new PayLoad(); payLoad.addAlert("this is test!"); payLoad.addBadge(1);//訊息推送標記數,小紅圈中顯示的數字。 payLoad.addSound("default"); //註冊deviceToken PushNotificationManager pushManager = PushNotificationManager.getInstance(); pushManager.addDevice("iPhone", deviceToken); //串連APNS String host = "gateway.sandbox.push.apple.com"; //String host = "gateway.push.apple.com"; int port = 2195; String certificatePath = "/Users/tokou/Desktop/PushDemo.p12";//前面產生的用於JAVA後台串連APNS服務的*.p12檔案位置 String certificatePassword = "123";//p12檔案密碼。 pushManager.initializeConnection(host, port, certificatePath, certificatePassword, SSLConnectionHelper.KEYSTORE_TYPE_PKCS12); //發送推送 Device client = pushManager.getDevice("iPhone"); System.out.println("推送訊息: " + client.getToken()+"\n"+payLoad.toString() +" "); pushManager.sendNotification(client, payLoad); //停止串連APNS pushManager.stopConnection(); //刪除deviceToken pushManager.removeDevice("iPhone"); System.out.println("Push End"); } catch (Exception ex) { ex.printStackTrace(); }}}