2015-04-19 24 views
13

Xin chào chúng tôi đang làm việc trên một ứng dụng android trong đó GCM đóng vai trò rất quan trọng trong việc như mục đích tiếp thị, đẩy một số thông tin quan trọng cho người sử dụng, vvlà gì ID lý do GCM không có sẵn trong một số trường hợp trong android

Nó làm việc tốt trong 60-70% trường hợp nhưng khác 30-40% nó không hoạt động. Vì vậy, phần còn lại của người dùng không bao giờ nhận được bất kỳ thông báo nào chỉ hữu ích cho họ.

Đây là lý do khiến chúng tôi mất người dùng hàng ngày. Dưới đây là mã của tôi để có được ID đăng ký của GCM.

String msg = ""; 
int exceptionOccurRetry = 0; 
while (exceptionOccurRetry < 5) { 
    try { 
     if (gcm == null) { 
      gcm = GoogleCloudMessaging.getInstance(context); 
     } 
     int retry = 0; 
     while (retry < 5 && regid.length() == 0) { 
      regid = gcm.register(SENDER_ID); 

      ++retry; 
     } 

     msg = "Device registered, registration ID=" + regid; 

     if (!regid.equals("")) { 
      // You should send the registration ID to your 
      // server 
      // over HTTP, so it 
      // can use GCM/HTTP or CCS to send messages to your 
      // app. 
      sendRegistrationIdToBackend(); 
     } 
     break; 
    } catch (IOException ex) { 
     msg = "Error :" + ex.getMessage(); 
     exceptionOccurRetry++; 
    } 
} 

Chúng tôi đang tìm kiếm những lý do khiến ID GCM không khả dụng đối với một số người dùng.

Chúng tôi chỉ biết một lý do là nếu thiết bị của người dùng không cài đặt Dịch vụ của Google Play trên điện thoại của người dùng thì nó không hoạt động.

Chúng tôi đang tìm kiếm một số lý do khác để giải quyết vấn đề này.

+0

Xin chào Williams, cậu đang làm việc tại Telegram sứ giả? –

+1

Người dùng GCM ID có thể thay đổi, nếu họ thay đổi, bạn phải bắt kịp! –

+0

Có, chúng tôi đã cập nhật GCM nếu tất cả người dùng. Tôi có nghĩa là khi tôi cố gắng gọi phương thức đăng ký thì đôi khi có thể không nhận được ID. Tôi muốn biết lý do tại sao nó là như vậy –

Trả lời

1

Thành viên nhóm của chúng tôi đang cố gắng gửi thông báo, nếu không thành công, họ chờ khoảng 60 mili giây hoặc giây (tôi không chắc chắn) để thông báo đẩy này được gửi lại, nếu nó vẫn không hoạt động, họ chờ gấp đôi thời điểm đó, và vân vân ...

và bạn có để đánh giá phản hồi từ google, có một chuỗi lỗi dưới:

std::string error = response["results"][0]["error"].asString();

nào cung cấp cho bạn thông tin nếu một người sử dụng tài khoản nào có được chuyển đến, nếu bạn có thể sử dụng:

Json::Value newRegistrationId = response["results"][0]["registration_id"];

để lấy ID mới.

1

nếu gcm id là null cố gắng để bắt đầu một nhiệm vụ nền và nhận được id.check mã dưới đây

private void registerInBackground() { 
     new AsyncTask() { 
      @Override 
      protected String doInBackground(Object[] params) { 
       String msg = ""; 
       try { 
        if (gcm == null) { 
         gcm = GoogleCloudMessaging.getInstance(context); 
        } 
        regid = gcm.register(SENDER_ID); 
        msg = "Device registered, registration ID=" + regid; 


        sendRegistrationIdToBackend(); 


        // Persist the regID - no need to register again. 
        storeRegistrationId(context, regid); 
       } catch (IOException ex) { 
        msg = "Error :" + ex.getMessage(); 


       } 
       return msg; 
      } 

      @Override 
      protected void onPostExecute(Object msg) { 
//    mDisplay.append(msg + "\n"); 

      } 
     }.execute(null, null, null); 
    } 
2

Một trong những lý do phổ biến nhất khiến nó không phải là có sẵn được rằng người dùng không có google dịch vụ chơi được cài đặt hoặc đang sử dụng trình chặn.

Bạn cũng nên lưu ý rằng bạn nên làm mới id GCM nếu phiên bản ứng dụng của bạn đã thay đổi. Bạn nên lưu id thiết bị duy nhất thành SharedPreferences và luôn kiểm tra xem nó có giống nhau hay không, nếu không bạn nên bắt đầu lại quá trình đăng ký.

Bạn cũng nên làm mới id theo thời gian.

1
Check if app was updated; if so, it must clear the registration ID since the existing registration ID is not guaranteed to work with the new app version. 

Khi phiên bản ứng dụng thay đổi, id đăng ký cũng thay đổi. vì vậy bạn nên lưu id đăng ký cuối cùng thành kích thước phụ trợ. Có lẽ vấn đề của bạn là điều này.

1

Nếu câu hỏi của bạn tập trung vào đăng ký id, bạn có thể bỏ qua câu trả lời của tôi .. Xin lỗi câu trả lời của tôi có thể là câu trả lời sai cho câu hỏi của bạn.

Tôi chỉ muốn hiển thị ở đó có thể có một số yếu tố khác ảnh hưởng đến việc gửi thư.

  1. Bạn có gửi tất cả tin nhắn chỉ cho một người nhận không?

    Một trong những tính năng hữu ích nhất trong GCM là hỗ trợ tối đa 1.000 người nhận cho một thư. http://developer.android.com/training/cloudsync/gcm.html#

    Đôi khi PHP của chúng tôi cũng mất nhắn gửi đến thiết bị đăng ký ...

  2. Thông điệp phải ít hơn 4K (làm GCM của bạn có chứa Hình?)

  3. Bạn có thể đã đọc ..

    Thực hiện GCM Client trên Android

    http://developer.android.com/google/gcm/client.html

+1

Tôi nghĩ rằng bạn có câu trả lời hay nhưng vấn đề của anh ấy là anh ta không thể lấy được ID người dùng và máy chủ của anh ấy không biết ID của tất cả người dùng của anh ấy. Nếu người dùng không thể gửi tới máy chủ ID của họ thì không quan trọng nếu máy chủ gửi thông báo xấu. – eloibm

1

Đó là đoạn mã bên trong một AsyncTask nếu không muốn nói rằng có thể là lỗi của bạn trong phiên bản nhất định (không nhớ được) đăng ký gcm cho NetworkOnMainThreadException đối với một số lý do, họ cập nhật mà sau này nhưng tôi đã rằng cùng một vấn đề một số thời gian trước đây, đây là đoạn mã tôi đã sử dụng hy vọng nó giúp bạn ra ngoài:

private void performRegisterGCM(){ 
    //Check for GCM availability 
    if(checkPlayServices(this)){ 
     // If this check succeeds, proceed with normal processing. 
     // Otherwise, prompt user to get valid Play Services APK. 
     gcm = GoogleCloudMessaging.getInstance(this); 
     String regId = mPreferences.getGcmRegistrationId(); 
     if (regId.isEmpty()){ 
      RegisterGCM(); 
     }else{ 
      log.d("regId: "+regId); 
     } 
    } else { 
     // Status is a random integer 
     GooglePlayServicesUtil.getErrorDialog(status, this, RQS_GooglePlayServices).show(); 
    } 
} 

public static boolean checkPlayServices(Activity mActivity){ 
    int resultCode = GooglePlayServicesUtil.isGooglePlayServicesAvailable(mActivity); 
    return resultCode == ConnectionResult.SUCCESS 
} 

private void RegisterGCM(){ 
    new AsyncTask<Void,Void,String>() { 
     @Override 
     protected String doInBackground(Void... params) { 
      String regid = ""; 
      try{ 
       if (gcm == null) { 
        gcm = GoogleCloudMessaging.getInstance(mContext); 
       } 
       regid = gcm.register(Util.SENDER_ID); 
      }catch(Exception e){ 
       log.e(e.getMessage()); 
      } 
      return regid; 
     } 

     @Override 
     protected void onPostExecute(String s) { 
      super.onPostExecute(s); 
      mPreferences.setGcmRegistrationId(s); 
      //TODO send regid to server with all the other info 
      sendGCMIDtoBackend(s); 
     } 
    }.execute(null, null, null); 
} 

Lưu ý rằng checkPlayServices cũng đã cho tôi rất nhiều vấn đề tôi đã có nó như thế này:

public static boolean checkPlayServices(Activity mActivity){ 
    int resultCode = GooglePlayServicesUtil.isGooglePlayServicesAvailable(mActivity); 
    if(resultCode!= ConnectionResult.SUCCESS) { 
     if (GooglePlayServicesUtil.isUserRecoverableError(resultCode)){ 
      GooglePlayServicesUtil.getErrorDialog(
        resultCode, 
        mActivity, 
        PLAY_SERVICES_RESOLUTION_REQUEST 
      ).show(); 
     } else{ 
      log.d("DEVICE NOT SUPPORTED"); 
      exit(true); 
     } 
     return false; 
    } 
    return true; 
} 

Sau đó thay đổi nó như bạn có thể thấy trong đoạn mã đầu tiên, bởi vì vì một số lý do khi nó rơi vào isUserRecoverableError (kết quả) nó mang lại rất nhiều đau đầu ... Mọi thứ ở đây là từ một dự án làm việc thực tế và các đoạn mã đã thu được tronghttp://developer.android.com/google/gcm/client.htmlvà sửa đổi để làm việc một cách chính xác. Hy vọng điều này sẽ giúp bạn ra ngoài, Good Luck ...

+0

Mã của tôi được thực hiện trong 'AsycTask' –

+0

sau đó nó nên được những thứ dịch vụ chơi thử dòng này của mã của tôi 'GooglePlayServicesUtil.getErrorDialog (trạng thái, này, RQS_GooglePlayServices) .show(); ' – Eefret

1

Làm thế nào về phụ trợ? Nếu bạn xóa ID khỏi cơ sở dữ liệu của máy chủ, người dùng sẽ không bao giờ nhận được thông báo trừ khi bạn cập nhật phiên bản ứng dụng?

Các vấn đề liên quan