3

次の2つの問題があります。

最初の問題:

同じデバイスを使用している 2 人の顧客を登録する必要があるため、2 人の顧客は同じ登録 ID を持っています。

サーバー側からこれらの顧客の両方にオファーを送信すると、表示される通知はログインしている顧客によって異なります。

例 (画像を参照):

ここに画像の説明を入力 ここに画像の説明を入力 私のアプリケーションには、顧客ログインフォームがあります。このフォームでは、ユーザーがgnanavelログインした場合、アプリは他のオファーではなく、彼のオファーのみを受信する必要があります。

同様に、ユーザーがjeyaログインした場合、アプリは他のユーザーのオファーではなく、そのユーザーのオファーのみを受信する必要があります。

現在、アプリは両方のオファーを受け取っています。

編集:

データベースにログイン ステータス フィールドを作成しました。顧客がデバイスにログインした場合、自分のオファーの通知だけを受け取ったことを意味します。他のオファーを取得できませんでした。うまく機能しています。

オファーボタンをクリックしながら条件を確認しました:

 $getregid = mysqli_query($con,"select * from pim_customers where customer_id='$customer_id' and gcm_regid='$regId' and loginstatus='Y'");

これらの状態は、最初の問題が解決したことを意味すると書きましたが、別の問題が発生しました。

もう一つの問題は、

管理者が何らかのオファーを入力すると、顧客はログインしているときにのみデバイスで通知を受信する必要があります。それ以外の場合、通知は受信されません。この部分はうまく機能しています。

問題は、顧客が長時間ログアウトしていて、その間に管理者がさらにオファーを入力したことです。

顧客が 2 日後にアプリにログインすると、保留中のメッセージがすべて受信されます。保留中のメッセージを取得するにはどうすればよいですか?

管理者側は、顧客がログアウトしたときにデータベースでログインステータスが「N」であることを意味するオファーを入力します。これらの条件を実行して通知を受け取るにはどうすればよいですか。

 $getregid = mysqli_query($con,"select * from pim_customers where customer_id='$customer_id' and gcm_regid='$regId' and loginstatus='Y'");

これは、オファーボタンをクリックしたときに実行されるサーバー側のコードです。

if (isset($_GET["regId"]) && isset($_GET["customer_id"]) && isset($_GET["message"])) {
  $regId = $_GET["regId"];
  $message = $_GET["message"];
  $customer_id = $_GET["customer_id"];
  include_once './GCM.php';
  $getregid = mysqli_query($con,"select * from pim_customers where customer_id='$customer_id' and gcm_regid='$regId' and loginstatus='Y'");
  $count1=mysqli_num_rows($getregid);
  while($row = mysqli_fetch_array($getregid))
  {
    $id=$row['customer_id'];
  }
  if (mysqli_num_rows($getregid) > 0) {
    $query = mysqli_query($con,"select count(offer) as count from pim_productdeal where customer_id='$id' and offer!=''");
    $count = mysqli_fetch_array($query);
    $msg = $count['count'];
    $gcm = new GCM();
    $registatoin_ids = array($regId);
    $message = array("price" => $msg." "."The offers received");
    $result = $gcm->send_notification($registatoin_ids, $customer_id, $message);
    echo $result;
  }
}

これは私のAndroid側のコードです:

public class GCMIntentService extends GCMBaseIntentService {

  private static final String TAG = "GCMIntentService";
  String regId;

  public GCMIntentService() {
    super(SENDER_ID);
  }

  @Override
  protected void onRegistered(Context context, String registrationId) {
    ServerUtilities.register(context, RegisterActivity.first_name, RegisterActivity.last_name, RegisterActivity.email, RegisterActivity.password, registrationId);
  }

  @Override
  protected void onUnregistered(Context context, String registrationId) {
    Log.i(TAG, "Device unregistered");
    displayMessage(context, getString(R.string.gcm_unregistered));
    ServerUtilities.unregister(context, registrationId);
  }

  @Override
  protected void onMessage(Context context, Intent intent) {
    Log.i(TAG, "Received message");
    GCMRegistrar.checkDevice(this);
    GCMRegistrar.checkManifest(this);
    regId = GCMRegistrar.getRegistrationId(this);
    String message = intent.getExtras().getString("price");
    displayMessage(context, message);
    if(Constants.response != null) {
      generateNotification(context,message);
    }
  }

  @Override
  protected void onDeletedMessages(Context context, int total) {
    Log.i(TAG, "Received deleted messages notification");
    String message = getString(R.string.gcm_deleted, total);
    displayMessage(context, message);
    // notifies user
    generateNotification(context,message);
  }

  @Override
  public void onError(Context context, String errorId) {
    Log.i(TAG, "Received error: " + errorId);
    displayMessage(context, getString(R.string.gcm_error, errorId));
  }

  @Override
  protected boolean onRecoverableError(Context context, String errorId) {
    // log message
    Log.i(TAG, "Received recoverable error: " + errorId);
    displayMessage(context, getString(R.string.gcm_recoverable_error,
            errorId));
    return super.onRecoverableError(context, errorId);
  }

  private static void generateNotification(Context context,String message) {
    int icon = R.drawable.icon;
    long when = System.currentTimeMillis();
    NotificationManager notificationManager = (NotificationManager)
            context.getSystemService(Context.NOTIFICATION_SERVICE);
    Notification notification = new Notification(icon, message, when);

    String title = context.getString(R.string.app_name);

    Intent notificationIntent = new Intent(context, MyDealProducts.class);
    notificationIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP |
            Intent.FLAG_ACTIVITY_SINGLE_TOP);
    PendingIntent intent =
            PendingIntent.getActivity(context, 0, notificationIntent, 0);
    notification.setLatestEventInfo(context, title, message, intent);
    notification.flags |= Notification.FLAG_AUTO_CANCEL;
    notification.defaults |= Notification.DEFAULT_SOUND;
    notification.defaults |= Notification.DEFAULT_VIBRATE;
    notificationManager.notify(0, notification);      
  }
}
4

3 に答える 3

5

質問が分かりやすいように編集しました。私はあなたの意味を変えなかったことを願っています。もしそうなら、私は謝罪し、私を訂正するようにあなたに頼みます.

今私の答えのために:

  1. サーバーは、現在どのユーザーがどのデバイスにログインしているかを認識している必要があります。ログインしたユーザーのテーブルをサーバーで維持する必要があります。ログインしたユーザーごとに、そのユーザーがログインしているデバイスの識別子が保持されます。そのためには、サーバーにリクエストを送信する必要があります。ユーザーがログインまたはログアウトするたびに。要求には、ユーザー ID とデバイス ID が含まれている必要があります。デバイス ID には、登録 ID を使用するか、サーバーが生成する他の ID を使用できます (サーバーで登録 ID よりも短い ID を生成すると、より効率的に使用できるようになります。登録 ID をデバイス ID にマップするテーブルを維持する必要があります)。

  2. 管理者が新しいオファーを作成してユーザーに割り当てると、ユーザーがログインしている場合にのみ GCM 通知がアプリに送信されます。で、ログインしているユーザーのそのデバイスに通知を 1 つだけ送信します。誰もログインしていない場合、通知は送信されません。新しいオファーを DB に保存し、そのうちの 1 つがログインするまで待ちます。

  3. GCM メッセージがデバイスに到着したとき、メッセージが現在ログインしているユーザーに宛てられている必要があります。これは、メッセージが送信された後に 1 人のユーザーがログアウトし、デバイスに到着する前に別のユーザーがログインしている可能性があるためです。そのためには、GCM メッセージにユーザー ID を追加フィールドとして含める必要があります。現在ログインしているユーザーと一致しないユーザー ID を持つメッセージがデバイスに到着した場合、そのメッセージを破棄し、通知を表示しません。

  4. ユーザーがログインすると、サーバーはリクエストを受け取ります (#1 を参照)。このリクエストの応答で、サーバーは、ユーザーがサーバーの DB に持っているすべてのオファーをデバイスに返す必要があります。

  5. デバイスが長期間非アクティブである間に送信されたメッセージについては、デバイスが再びアクティブになったときに、GCM から古いメッセージが送信される可能性があります (GCM によってまだ破棄されていない場合)。これらのメッセージが現在ログインしているユーザーのものでない場合は、それらを破棄します (#3 を参照)。それらが現在ログインしているユーザーに属している場合は、それらを表示する必要があります。

  6. PHP についてはわかりませんが、サーバーのコードについての私の限られた理解から、ユーザーが持っているオファーの数を含む GCM メッセージをデバイスに送信しているようです。おそらく、送信するすべてのメッセージに同じ collapse_key を使用する必要があります。これにより、デバイスがオフラインのときにサーバーから複数のメッセージが送信された場合、デバイスが再びアクティブになったときに、そのうちの 1 つだけがデバイスに送信されます。保留中のメッセージに含まれているのが利用可能なオファーの数だけである場合は、すべての保留中のメッセージを取得する必要はありません。

于 2013-08-29T03:56:04.993 に答える
0

サーバーからプッシュ通知を送信するときは、それにNotification_idフィールドを追加します。モバイルでローカル データベース ( SQLite ) を使用して、ユーザーに表示された通知 ID を管理します。

アプリの起動時にすべての通知の最新リストを取得するには、Web サーバーへの呼び出しを実装する必要があります。サーバーからの通知 ID をローカルの通知 ID と照合できるようにします。次に、ID がデータベースにない特定の通知の詳細を取得できます。

于 2013-08-26T09:24:36.900 に答える