6

這是我之前在StackOverflow上的posting的後續操作。使用Java和REST發送Apple推送通知時出現問題

更好地開始一個新的職位(因爲我比以前做了更多的進步),而不是在以前的線程上附加一個新的問題。

正在使用谷歌代碼的Javapns庫發送通過一個基於REST的Web服務的蘋果推送通知......

這裏是我已完成的步驟:

iPhone開發者計劃門戶網站( IDPP)

(1)創建了基於App ID和APNS的SSL證書和密鑰。

(2)創建並安裝配置文件。

(3)在服務器上安裝SSL證書和密鑰。

(4)設置我的iPhone應用程序以註冊遠程通知。

的XCode

能夠獲得我的設備令牌,當我構建和部署我的應用程序到我的設備。

只要我的iPhone應用程序部署完成,對話框就出現在我的iPhone上,表明我的應用程序想要發送推送通知,並且還要求允許它們。

當我通過Log4J語句調用我的Web服務時,我能夠看到基於REST的Web服務確實被調用,但我從未在我的iPhone應用程序上收到推送通知!

ApnsManager類

public class ApnsManager { 

    /** APNs Server Host **/ 
    private static final String HOST = "gateway.sandbox.push.apple.com"; 

    /** APNs Port */ 
    private static final int PORT = 2195; 

    public void sendNotification(String deviceToken) 
    throws Exception { 
     try { 
      PayLoad payLoad = new PayLoad(); 
      payLoad.addAlert("My alert message"); 
      payLoad.addBadge(45); 
      payLoad.addSound("default"); 

      PushNotificationManager pushManager = 
       PushNotificationManager.getInstance(); 

      pushManager.addDevice("iPhone", deviceToken); 

      log.warn("Initializing connectiong with APNS..."); 

      // Connect to APNs 
      pushManager.initializeConnection(HOST, PORT, 
      "/etc/Certificates.p12", "password", 
      SSLConnectionHelper.KEYSTORE_TYPE_PKCS12); 

      Device client = pushManager.getDevice("iPhone"); 

      // Send Push 
      log.warn("Sending push notification..."); 
      pushManager.sendNotification(client, payLoad); 
      pushManager.stopConnection(); 
     } 
     catch (Exception e) { 
      e.printStackTrace("Unable to send push "); 
     } 
    } 
} 

RESTful Web服務

@Path(ApnService.URL) 
@Produces({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML }) 
public class ApnService { 
    public static final String URL = "/apns"; 

    @GET 
    @Path("send") 
    @Consumes({MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML}) 
    public String send() throws JSONException, IOException { 
     String msg = ""; 

     try { 
      log.debug("Inside ApnService.send() method."); 
      log.debug("Sending notification to device"); 
      ApnManager.sendNotification("32b3bf28520b977ab8eec50b482 
      25e14d07cd78 adb69949379609e40401d2d1de00000000738518e5c 
      000000003850978c38509778000000000000000000398fe12800398f 
      e2e0398fe1040000"); 
     } catch(Exception e) { 
       e.printStackTrace(); 
       msg = "fail"; 
     } 
     msg = "success"; 

     StringWriter sw = new StringWriter(); 
     JsonFactory f = new JsonFactory(); 
     JsonGenerator g = f.createJsonGenerator(sw); 

     g.writeStartObject(); 
     g.writeStringField("status", msg); 
     g.writeEndObject(); 
     g.close(); 

     return sw.toString(); 
    } 
} 

現在,當我在我的應用程序部署到我的應用程序服務器,並打開了一個REST客戶端並鍵入:

http:// localhost:8080/myapp/apns/send

其餘客戶端返回此:

HTTP/1.1 200 OK

以下日誌信息輸出到我的控制檯:

01:47:51,985 WARN [ApnsManager] Initializing connectiong with APNS... 
01:47:52,318 WARN [ApnsManager] Sending push notification... 

MyAppDelegate.m

- (void) applicationDidFinishLaunching : 
    (UIApplication*) application 
{ 
    NSLog(@"LAUNCH"); 

    // Configure REST engine 
    RESTAPI* api = [RESTAPI getInstance]; 
    [api setNetworkAddress:kLocalAddress port:kDefaultPort]; 

    UIRemoteNotificationType notificationTypes 
    = UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeSound; 
    if ([[UIApplication sharedApplication] enabledRemoteNotificationTypes] 
     != notificationTypes) { 
     NSLog(@"Registering for remote notifications..."); 
     [[UIApplication sharedApplication] 
     registerForRemoteNotificationTypes:notificationTypes]; 
    } else { 
     NSLog(@"Already registered for remote notifications..."); 
     // Uncomment this if you want to unregister 
     // NSLog(@"Unregistering for remote notifications..."); 
     // [[UIApplication sharedApplication] unregisterForRemoteNotifications]; 
    } 

mainWindow = [[[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds] retain]; 
toolsNav = [[[ToolsNav alloc] init] retain]; 

[mainWindow addSubview:toolsNav.view]; 
[mainWindow makeKeyAndVisible]; 
} 

但是,我沒有收到我的應用程序(駐留在我的iPhone上)的推送通知!

我真的難住在這一點上...

我可能會做錯什麼? :(

它是與我建立了我的RESTful Web服務的方式有問題(對不起,我是新手休息)?

會很感激,如果有人可以幫助我這個...

感謝您在百忙之中閱讀本文時...

+0

令牌字符串包含一個空格。當你在這裏複製代碼時引入了它嗎?嘗試刪除它。 – notnoop 2009-09-03 15:55:48

+0

嗨,Saeed ...是的,當我複製代碼(並重新設置了代碼以使其更具視覺效果)時,引入了令牌字符串的空間。在我的實際代碼中沒有空間。我仍然卡住,所以我會很感激,如果有人可以幫助我這一點。我有一點小小的跑步,當我運行Web服務時,它詢問我是否希望連接到端口2195併發送推送通知。它只是不會出現在我的iPhone的應用程序。有什麼我做錯了嗎?它是REST代碼嗎? – 2009-09-04 09:53:49

+0

您還應該包含您已實施的UIApplicationDelegate的「處理遠程通知」方法的代碼。 – bpapa 2009-09-04 13:47:35

回答

5

發現的解決方案!生成的設備標識字符串似乎太長。

我NSData的十六進制代碼是印刷錯誤的令牌(應該是64字符,它是155個字符之前)。

解決方案

- (NSString *)hexadecimalDescription 
{ 
    NSMutableString *string = [NSMutableString stringWithCapacity:[self length] * 2]; 
    const uint8_t *bytes = [self bytes]; 

    for (int i = 0; i < [self length]; i++) 
     [string appendFormat:@"%02x", (uint32_t)bytes[i]]; 

    return [[string copy] autorelease]; 
} 

現在,我收到我的設備的通知! :)

快樂編程給所有!