8

Appleプッシュ通知をiPhoneクライアントアプリに送信するJavaプログラムを実装しようとしています...次のライブラリが見つかりました:Java APNs

プロバイダーコード:

私のアプリで使用する次のコードを(Javapnsから)作成しました:

try {
    PayLoad payLoad = new PayLoad();

    payLoad.addAlert("My alert message");
    payLoad.addBadge(45);
    payLoad.addSound("default");

    PushNotificationManager pushManager = PushNotificationManager.getInstance();
    pushManager.addDevice("iPhone", "f4201f5d8278fe39545349d0868a24a3b60ed732");
    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("Lambo");

    // Send Push
    log.warn("Sending push notification...");
    PushNotificationManager.getInstance().sendNotification(client, payLoad);
 }
 catch (Exception e) {
    throw new ApnsPushNotificationException("Unable to send push " + e);
 }

このアプリを実行すると(Log4jステートメントからわかるように)、発生する例外はありません。

  WARN  [MyCode] Initializing connectiong with APNS...
  WARN  [MyCode] Sending push notification...

しかし、私のクライアントアプリは通知を受け取りません!

IDPP登録プロセス:

また、iPhone Developer Program Portal(IDPP)で次のことを行いました。

  • APNSベースのSSL証明書とキーを作成しました

  • プロビジョニングプロファイルを作成してインストールしました

  • サーバーにSSL証明書とキーをインストールしました。

Appleプッシュ通知サービスガイドを数回読んで、いくつかのことに気づきました。

(1)15ページに、デバイストークンがデバイスUDIDと同じではないと記載されています(現在、PushNotificationManager.addDevice()メソッド内の2番目のパラメーターとして誤って渡しています(上記を参照))。

17ページには、次のように記載されています。

「APNは、一意のデバイス証明書に含まれる情報を使用してデバイストークンを生成します。デバイストークンにはデバイスの識別子が含まれます。次に、トークンキーを使用してデバイストークンを暗号化し、デバイスに返します。デバイスは、デバイストークンをデバイスに返します。アプリケーションをNSDataオブジェクトとして要求します。次に、アプリケーションはデバイストークンをバイナリ形式または16進形式でプロバイダーに配信する必要があります。」

iPhoneOSクライアントの実装

(2)33〜34ページを読んだ後、アプリをAPNに登録するためのObjective-Cコードが含まれていないことに気付きました。

Objective-C開発者ではないので、デバイスコードを回復できるのはここですか、それとも証明書から取得する必要がありますか?

デバイストークンはどこで入手できますか(申し訳ありませんが、他の誰かがObjective-Cクライアントアプリを作成し、私はJava開発者です)?

質問:

(1)デバイストークンとモバイルクライアントコードの登録をどこで取得できるかわからないことを除いて、私が見落としたり見逃したりしていないことは他にありますか?

(2)Javapnsライブラリを正しい方法で使用していますか?

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

4

6 に答える 6

18

恥ずべき自己宣伝として、私はjava-apns図書館を使うことを勧めます。コードは次のようになります。

ApnsService service =
     APNS.newService()
     .withCert("/etc/Certificates.p12", "password")
     .withSandboxDestination() // or .withProductionDestination()
     .build();

String payload =
    APNS.newPayload()
    .alertBody("My alert message")
    .badge(45)
    .sound("default")
    .build();

String deviceToken = "f4201f5d8278fe39545349d0868a24a3b60ed732";

log.warn("Sending push notification...");
service.push(deviceToken, payload);
于 2009-11-25T21:42:07.750 に答える
8

ちょっとしたヒントですが、受け取ったトークンをjavapnsへの登録に適した形式に変換するために、このコードでうまくいきます。

- (NSString *)convertTokenToDeviceID:(NSData *)token {
NSMutableString *deviceID = [NSMutableString string];

// iterate through the bytes and convert to hex
unsigned char *ptr = (unsigned char *)[token bytes];

for (NSInteger i=0; i < 32; ++i) {
    [deviceID appendString:[NSString stringWithFormat:@"%02x", ptr[i]]];
}

return deviceID;

}

于 2009-10-09T14:19:54.170 に答える
2

これを試しましたが、通知を送信するときにハングし続けましたが、何も送信されません。

この問題は、次の機能に起因します。

         public void sendNotification(Device device, PayLoad payload) 

bufferedreaderにNULLがあるようです

           BufferedReader in = 
           new BufferedReader(new InputStreamReader(this.socket.getInputStream() ) );

したがって、コードのこの部分がヒットすると、無限のループでハングします。

  logger.debug( "In: [" + in.readLine() + "]" );

この出力は[null]です

したがって、その直後にループが実行されます。

      while ( ! this.socket.isInputShutdown() ) {
          while( in.ready() ) {
              logger.debug("ready now");
              logger.debug(in.readLine());
              System.out.println( this.socket.getInputStream().read() );
          }
      }

コードは最初のwhileループに入り、BufferedReaderの準備が整うのを待ち、ただ待ち続けます.....あなたがぶら下がっている広告

于 2011-07-25T00:00:19.310 に答える
1
  1. あなたのJavaコードはしっかりしているように見えます!ただし、を介して接続を閉じることを忘れないでくださいPushNotificationManager.closeConnection()。自分の後でクリーンアップすることが重要です。

    補足として、デバイス「iPhone」を追加しているが、後で「Lambo」を照会していることに気付きました。これはバグを示しています。

  2. コードに示されているデバイストークンが正しくありません。デバイストークンは、現在32ビットの長さの値であり、64文字に16進されます。通知を無効なトークンにプッシュすると、サーバーがサイレントに失敗していると思います。

  3. デバイストークンを取得する唯一の方法は、アプリ自体からです。プッシュ通知ガイドが示唆しているように、iPhoneアプリは起動時に通知を登録する必要があります。でapplication:didRegisterForRemoteNotificationsWithDeviceToken:、iPhoneはデバイストークンをJavaプロバイダーサーバーに送信する必要があります。(デバッグの目的でNSLog、デバイストークンだけを使用して使用できます。実行間で変更されることはありません)。

    デバイストークンを受信するために、Javaプロバイダーサーバーにサーバーを作成することをお勧めします。ServerSocketiPhoneとそのデバイストークン(および必要な追加情報)から接続を受信するようにを設定し、データベースにトークンを挿入します。

于 2009-08-31T14:14:40.743 に答える
0

トークンがないようです

pushManager.addDevice("iPhone", "f4201f5d8278fe39545349d0868a24a3b60ed732");

IDとトークンのチェックを行います:

https://github.com/o-sam-o/javapns/blob/master/src/javapns/notification/PushNotificationManager.java#L501

トークンを取得する唯一の方法は、iPhoneアプリからです。有効なトークンは次のようになります。1d2d6f34c5028bcac50df5f91992c912 ce7deae8 3bbe7da5 447f6a68 cfecdc0e

于 2009-08-31T05:03:27.153 に答える
0

JavaPNSは最近2.0に更新され、リリース日までに報告されたすべての問題が修正されました。これにより、説明している問題が修正され、ライブラリの使用がこれまでよりもはるかに簡単になります(1行のコードで通知をプッシュできるようになりました)。

于 2011-10-10T22:29:20.547 に答える