2013-08-16 32 views
3

我有這樣的情況我登錄到應用程序,然後我發送設備令牌到服務器,我得到推送通知。如果消費者從應用程序註銷,然後我發送請求到服務器,然後我沒有得到推送通知。如果用戶在登錄後卸載應用程序,那麼我無法向服務器發送請求以停止推送通知,然後再次安裝應用程序,但是我沒有自動登錄,然後自動獲取推送通知。在沒有登錄的情況下新安裝應用程序後禁用推送通知

所以我的問題是,如何阻止推送通知,當用戶沒有登錄到應用

回答

0

我喜歡這種情況...檢查我的邏輯。

重要的是,當應用程序卸載時,其數據庫也會消失。 這是訣竅。

==>你必須保持從1 開始參考號碼每次(你可以將它硬編碼的,只需要更新) 使用這個參考號碼與您

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 
{ 
//get value from database,increment by 1 
//sync with server 
} 

各實時應用程序開始使用時,您還必須增加參考編號。 也需要跟蹤服務器端的這個參考號碼。

第二種情況(比如,你面臨的問題)是當應用程序被重新安裝。 所有數據庫就會自動消失==>這是招

當您下一次使用參考號碼從數據庫中它會是1.

現在將它與服務器端進行比較。

即應用程序後重新安裝得到您的參考號碼將小於目前第二方案後保持一個即(1 當前<保持@server參考號) 這是要知道服務器的條件,程序重新安裝和需求等待認證。

使服務器在用戶登錄前不允許通知當前設備,成功登錄後更新所有數據庫並允許服務器發送通知。

+0

這是有點混淆我我無法理解解決方案 – Vishnu

+0

什麼讓你困惑? – preetam

+0

插入虛擬表格,即包含參考號碼的固定值爲1,並且每次讀取它並更新爲+1,同時在didRegisterForRemoteNotificationsWithDeviceToken中啓動應用程序:方法 – preetam

1

通過在設備上本地存儲一些數據,您可以識別首次啓動應用程序的時間(第一次安裝後或卸載並重新安裝後)(例如,您可以存儲設備令牌)。

當應用程序第一次啓動時,將設備令牌發送到服務器的請求中,該請求將清除引用該設備令牌的任何數據庫條目(與用戶註銷時發送到服務器的相同請求)。這樣,您的服務器將不會向該設備令牌發送推送通知,直到用戶登錄。

用戶下一次登錄到應用程序時,將設備令牌&用戶標識發送到您的服務器的啓動請求中使用該設備令牌爲該用戶發送推送通知。

+0

登錄後我在哪裏註冊推送通知或didfinish啓動應用程序 – Vishnu

+0

這並不重要。如果您選擇在登錄後註冊,則didRegisterForRemoteNotificationsWithDeviceToken會將帶有用戶標識的設備標記發送到您的服務器。如果您選擇在didFinishLaunch中註冊,則didRegisterForRemoteNotificationsWithDeviceToken會將設備令牌本地存儲在您的應用程序中,並且在用戶登錄後,您將具有用戶ID的設備令牌發送到您的服務器。 – Eran

+0

實際上我也在做同樣的事情,但是,我的問題是用戶登錄並且沒有註銷用戶可能會卸載應用程序,在這種情況下我無法向服務器發送請求。所以,服務器不斷髮送通知,然後我沒有得到任何通知,因爲該應用程序沒有安裝。現在再次重新安裝服務器不斷髮送通知在這種情況下,我收到的通知沒有日誌記錄,所以現在我想停止通知,直到日誌 – Vishnu

2

有點晚了,但它可能有助於某人。

我在我的一個項目遇到了類似的情況:

問題

  1. 首先運行來獲得設備令牌
  2. 用戶登錄和應用程序與服務器
  3. 註冊設備令牌
  4. 用戶卸載應用程序而不退出,因此服務器仍然認爲這是積極的
  5. 用戶重新安裝應用程序,並仍收到推送通知,即使日在又

ey're不會記錄在我的應用我註冊並要求在應用程序委託的設備令牌:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions{ 
     .. 
     [[UIApplication sharedApplication] registerForRemoteNotificationTypes: 
     (UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeSound | UIRemoteNotificationTypeAlert)]; 
     .. 
} 

而且一旦應答從蘋果公司獲得:

- (void)application:(UIApplication*)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData*)token{ 
     //Get trimmed device token 
     NSString *deviceToken = [[token description] stringByTrimmingCharactersInSet:[NSCharacterSet characterSetWithCharactersInString:@"<>"]]; 
     deviceToken = [deviceToken stringByReplacingOccurrencesOfString:@" " withString:@""]; 

     //Store the device token in the user defaults 
     NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults]; 
     [userDefaults setObject:deviceToken forKey:@"dToken"]; 
     [userDefaults synchronize]; 
} 

這或多或少是我見過的典型方式。

現在,當用戶登錄時,該裝置令牌被髮送到服務器,並從用戶內容區域的主視圖控制器註冊。通過訪問該視圖控制器中的用戶默認值來檢索設備標記。但問題是,如果用戶永遠不會登錄到用戶內容區域,該通知將仍然存在,因爲設備從未註冊在服務器先前卸載的結果,同時仍然登錄。

解決方案

有幾個方法在其他的答案中提到解決這個問題。但是我並不想修改我的服務器,並有註冊設備的主要結構,肚裏是這樣的:

  • 當用戶首次登錄在:認證用戶,並在同一時間註冊通過設備令牌。
  • 當用戶註銷:註銷設備令牌給該用戶。
  • 只要有一個設備令牌在DB存在:停用該廣告除用戶當前登錄的所有用戶

鑑於用戶內容區域必須具有設備令牌登錄的用戶,從我做起。通過請求設備令牌didFinishLaunchingWithOptions像我一樣了。

現在,當回答是收到didRegisterForRemoteNotificationsWithDeviceToken我做了以下內容:

我檢查,如果用戶的內容視圖控制器還尚未達到,即用戶從未登錄,並禁用通知。

在用戶內容視圖控制器我做到以下幾點:

- (void)viewDidLoad{ 
    .. 
    //Set logged-in so the notifications continue to be received 
    if(![[NSUserDefaults standardUserDefaults] objectForKey:@"loggedIn"]){ 
     [[NSUserDefaults standardUserDefaults] setValue:@"done" forKey:@"loggedIn"]; 
     [[NSUserDefaults standardUserDefaults] synchronize]; 

     //Register for notifications (again) 
     [[UIApplication sharedApplication] registerForRemoteNotificationTypes: 
     (UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeSound | UIRemoteNotificationTypeAlert)]; 
    } 

    //Send user authentication and device token (retrieved from the user defaults) to server 
    .. 
} 

現在,只要在設備令牌用戶首次登錄,因爲它已經被蘋果公司取回被髮送到服務器,並註冊,沒有任何延遲。通知也會被禁用,直到用戶登錄並因此解決了主要問題。

該方法確保用戶內容區域視圖控制器永遠不會在沒有設備令牌保存在用戶默認值的情況下加載,因此允許我繼續使用同一方法來驗證用戶身份並一次傳遞設備令牌。

相關問題