6

これは、 StackOverflowへの以前の投稿のフォローアップです。

以前のスレッドに新しい質問を追加するよりも、(以前よりも進歩したので)新しい投稿を開始する方が良いと考えました。

Google CodeのJavapnsライブラリを使用して、RESTベースのWebサービスを介してAppleプッシュ通知を送信しています...

これが私が完了したステップです:

iPhone開発者プログラムポータル(IDPP)

(1)アプリ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サービスのセットアップ方法に問題がありますか(RESTの初心者です)?

誰かがこれで私を助けてくれるなら本当に感謝します...

これをお読みいただきありがとうございます...

4

1 に答える 1

5

解決策を発見しました!生成されたデバイストークン文字列が長すぎるようです。

NSDataから16進コードへの変換で、間違ったトークンが出力されていました(155文字になる前は64文字である必要があります)。

解決策

- (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];
}

これで、デバイスで通知を受信して​​います。:)

みんなにハッピープログラミング!

于 2009-09-04T21:50:42.297 に答える