6
  • Chúng tôi đang triển khai Hệ thống thông báo đẩy cho iOS & Android bằng cách sử dụng Trung tâm thông báo Azure.Thông báo đẩy trùng lặp bằng cách sử dụng thông báo đẩy của Azure

  • Đăng ký ứng dụng mỗi lần trong khi khởi chạy ứng dụng. Các thiết bị được đăng ký để thông báo đẩy với các thẻ được xác định bởi appname_userid. Ví dụ: Android_1122 trong đó 1122 là id người dùng duy nhất. Tương tự trong một thiết bị iPhone sẽ là iPhone_1122. Người dùng có thể có nhiều thiết bị, trong đó thông báo đẩy sẽ được phân phối tới tất cả các thiết bị có cùng một thẻ.

  • Tuy nhiên, có một vấn đề mà chúng tôi đang gặp phải khi gửi thông báo đẩy trùng lặp cho một vài người dùng. Mỗi khi người dùng gỡ cài đặt & cài đặt lại ứng dụng, mã thông báo mới sẽ được trả lại. Vì vậy, đối với thẻ đã cho đó, nhiều đăng ký được thực hiện dẫn đến các lần đẩy trùng lặp được phân phối tới cùng một thiết bị.

  • Cũng đã trải qua các liên kết tương tự như bên dưới. Nhưng, không hoàn toàn rõ ràng về những gì chính xác có nghĩa là bằng cách sử dụng API tạo đăng ký REST API trả về một RegistrationId mà không thực sự tạo một đăng ký. azure notification hubs - app uninstall

  • Vui lòng cung cấp một số cách để tránh đăng ký trùng lặp cho cùng một thiết bị.

Dưới đây là mã chúng tôi đang sử dụng để đăng ký.

iOS Devices

NSString *mobileServicesURL = @"Endpoint=sb://mobilepushnotificationhub.servicebus.windows.net/;SharedAccessKeyName=DefaultListenSharedAccessSignature;SharedAccessKey=XXXXXXXXXXXXXXXXX="; 

SBNotificationHub *hub = [[SBNotificationHub alloc] initWithConnectionString:mobileServicesURL notificationHubPath:@"notificationhubname"]; 

[hub registerNativeWithDeviceToken:token tags:[NSSet setWithObjects:[NSString stringWithFormat:@"iphoneapp_%@", [self getUserID]], nil] completion:^(NSError* error) { 
    completion(error); 
}]; 

Thiết bị Android

private void gcmPush() { 
    NotificationsManager.handleNotifications(this, SENDER_ID, MyHandler.class); 

    gcm = GoogleCloudMessaging.getInstance(this); 

    String connectionString = "Endpoint=sb://mobilepushnotificationhub.servicebus.windows.net/;SharedAccessKeyName=DefaultListenSharedAccessSignature;SharedAccessKey=XXXXXXXXXXXXXXXXXXXXXXXXXXXX="; 

    hub = new NotificationHub("notificationhubname", connectionString, this); 

    registerWithNotificationHubs(); 

    // completed Code 
} 

// Added Method 
@SuppressWarnings("unchecked") 
private void registerWithNotificationHubs() { 
    new AsyncTask() { 
     @Override 
     protected Object doInBackground(Object... params) { 
      try { 
       String regid = gcm.register(SENDER_ID); 

       Log.e("regid RECEIVED ", regid); 
       hub.register(regid, "androidapp_" + WhatsOnIndiaConstant.USERId); 

       WhatsOnIndiaConstant.notificationHub = hub; 
       WhatsOnIndiaConstant.gcmHub = gcm; 

      } catch (Exception ee) { 
       Log.e("Exception ", ee.getMessage().toString()); 
       return ee; 
      } 
      return null; 
     } 
    }.execute(null, null, null); 
} 

Trả lời

3

Mỗi khi gỡ bỏ cài đặt sử dụng & tái cài đặt các ứng dụng, một thẻ mới là trả lại. Vì vậy, đối với thẻ đã cho, nhiều đăng ký được thực hiện dẫn đến các lần đẩy trùng lặp được phân phối tới cùng một thiết bị.

Theo như tôi hiểu, chỉ có một làm việc thiết bị thẻ tại một thời điểm cho Apple Push Notification Service (xem thêm here), do đó bạn sẽ không có một vấn đề với nhiều thẻ thiết bị có giá trị trong một thiết bị theo iOS, nhưng bạn có thể có nhiều đăng ký Azure Notification Hub cho một mã thông báo thiết bị. Để tránh điều này, bạn phải kiểm tra xem đã có đăng ký cho thiết bị bê tông token và nếu như vậy, tái sử dụng và làm sạch chúng:

ASP.NET WebAPI-Backend example:

// POST api/register 
// This creates a registration id 
public async Task<string> Post(string handle = null) 
{ 
    // make sure there are no existing registrations for this push handle (used for iOS and Android) 
    string newRegistrationId = null; 

    if (handle != null) 
    { 
     var registrations = await hub.GetRegistrationsByChannelAsync(handle, 100); 

     foreach (RegistrationDescription registration in registrations) 
     { 
      if (newRegistrationId == null) 
      { 
       newRegistrationId = registration.RegistrationId; 
      } 
      else 
      { 
       await hub.DeleteRegistrationAsync(registration); 
      } 
     } 
    } 

    if (newRegistrationId == null) newRegistrationId = await hub.CreateRegistrationIdAsync(); 

    return newRegistrationId; 
} 

Với Google Cloud Messaging, có vẻ như bạn có thể có nhiều ID đăng ký GCM hoạt động, vì vậy bạn phải chăm sóc điều này. GCM có cái gì gọi là "Canonical IDs":

Nếu một lỗi trong ứng dụng gây nên nhiều đăng ký cho cùng một thiết bị , nó có thể được khó khăn để hòa giải nhà nước và bạn có thể kết thúc với điệp trùng lặp.

GCM cung cấp cơ sở được gọi là "ID đăng ký kinh điển" để dễ dàng khôi phục từ những tình huống này. ID đăng ký kinh điển được xác định là ID của lần đăng ký cuối cùng do ứng dụng của bạn yêu cầu. Đây là ID mà máy chủ sẽ sử dụng khi gửi tin nhắn tới thiết bị.

Nếu sau này bạn cố gắng để gửi một tin nhắn bằng cách sử dụng khác nhau đăng ký ID, GCM sẽ xử lý yêu cầu như thường lệ, nhưng nó sẽ bao gồm các ID đăng ký kinh điển trong lĩnh vực registration_id của phản ứng . Đảm bảo thay thế ID đăng ký được lưu trữ trong máy chủ của bạn bằng ID chính tắc này, vì cuối cùng ID bạn đang sử dụng sẽ ngừng hoạt động.

+0

Tuyệt vời - bạn đã thực hiện một ngày của tôi. Không biết rằng GCM sử dụng nhiều thiết bị hoạt độngTokens! Bây giờ dịch vụ đẩy của tôi hoạt động! – Freddy