2012-02-04 152 views
4

我只想向特定用戶發送推送通知。推送通知中的設備令牌

從我在蘋果文檔中經歷的。 用於推送通知註冊的代碼是這個

- (void)applicationDidFinishLaunching:(UIApplication *)app { 
    // other setup tasks here.... 
    [[UIApplication sharedApplication] registerForRemoteNotificationTypes:(UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeSound)]; 
} 

// Delegation methods 
- (void)application:(UIApplication *)app didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)devToken { 
    const void *devTokenBytes = [devToken bytes]; 
    self.registered = YES; 
    [self sendProviderDeviceToken:devTokenBytes]; // custom method 
} 

- (void)application:(UIApplication *)app didFailToRegisterForRemoteNotificationsWithError:(NSError *)err { 
    NSLog(@"Error in registration. Error: %@", err); 
} 

appdidRegisterForRemoteNotif ..我只看到DEVTOKEN字節創建併發送至server..but我將如何識別哪個設備令牌屬於哪個用戶的方法。所以如果我的設備名稱是Shubhank的iPhone。我怎樣才能發送我的iPhone是這個信息,這是我的設備令牌。

回答

6

通常,您不會在委託方法本身更新服務器上的apns令牌。您保存它並稍後在識別用戶時進行更新。

你可以這樣來做:

- (void)application:(UIApplication *)app didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)devToken { 

const unsigned *tokenBytes = [deviceToken bytes]; 
NSString *hexToken = [NSString stringWithFormat:@"%08x%08x%08x%08x%08x%08x%08x%08x", 
         ntohl(tokenBytes[0]), ntohl(tokenBytes[1]), ntohl(tokenBytes[2]), 
         ntohl(tokenBytes[3]), ntohl(tokenBytes[4]), ntohl(tokenBytes[5]), 
         ntohl(tokenBytes[6]), ntohl(tokenBytes[7])]; 
[[MyModel sharedModel] setApnsToken:hexToken]; 

} 

這個保存的APNS的模型對象(爲MyModel)令牌。後來當你有​​你的用戶標識(通過登錄/註冊或任何方法)

,你可以調用此方法

[self sendProvidedDeviceToken: [[MyModel sharedModel] apnsToken] forUserWithId: userId]; //Custom method 

已經鏈接與用戶的設備令牌這種方式。希望這可以幫助!

+0

非常感謝,做解決我在找什麼......但我現在有重要的問題..每次應用程序啓動時,更改標記字節更改.. – Shubhank 2012-02-04 15:23:45

+0

儘管並非總是如此,令牌將更改,但它是始終建議您每次應用程序啓動時更新該令牌。 請注意/接受答案,如果它幫助你。 – 2012-02-04 15:25:39

+0

我會...但我想知道。這是現在令我困惑..可以說設備令牌是相同的..然後設備將重新註冊在我的服務器..所以我必須開發一個機制,覆蓋的作品? ..或者如果令牌更改..那麼我會對舊設備名稱做什麼? – Shubhank 2012-02-04 15:29:16

1

您需要將您需要的任何信息發送到您自己的推送服務。

但重要一點:推送令牌不是設備令牌(UDID)。推送令牌對於每個請求它們的應用程序都是唯一的,並且可以並且確實會發生變化。如果您還想獲取設備名稱,則可以致電[[UIDevice currentDevice] name],並將其發佈到您用於存儲推送令牌的任何內容。

+0

讓我說我想讓用戶爲他的設備輸入一個特定的名字,所以我提出了一個他寫ABC的文本字段。但我相信appdidRegisterForRemoteNotif已經被調用,直到這發生..所以我可以再次註冊推送通知? – Shubhank 2012-02-04 15:14:09

+0

否 - 您需要掛上推送令牌,然後在收到設備名稱後,再將設備名稱發送到後端服務。 – lxt 2012-02-04 15:16:22

+0

[[UIApplication sharedApplication] registerForRemoteNotificationTypes:(UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeSound)]; 這是應用程序啓動時調用..所以我相信idRegisterForRemoteNotificati也將被調用之前,我可以顯示我的用戶的文本字段....所以我相信你說我可以稍後調用[自sendProvider:Userinput] ..但服務器將如何知道這個名字是爲這個devTokenBytes – Shubhank 2012-02-04 15:21:28

2

您需要在註冊自定義方法時發送設備名稱。代碼應該如下所示。您可以發送適合您的上下文的任何信息,如應用程序使用某種用戶名時的用戶名。由您決定哪些信息發送到您的服務器,從而在令牌和設備之間建立連接。

// Delegation methods 
- (void)application:(UIApplication *)app didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)devToken { 
    const void *devTokenBytes = [devToken bytes]; 
    self.registered = YES; 
    [self sendProviderDeviceToken:devTokenBytes deviceName:[[UIDevice currentDevice] name]]; // custom method 
} 
+0

可以說我想讓用戶輸入他的設備的特定名稱,所以我提出了一個文本字段,他在哪裏寫ABC。但我相信appdidRegisterForRemoteNotif已經被調用,直到這發生..所以我可以再次註冊推送通知? – Shubhank 2012-02-04 15:14:20

+2

最好在註冊設備之前等待用戶輸入名稱。在我目前的應用程序中,我等待註冊,直到用戶登錄。沒有什麼要求您在啓動時註冊。 – 2012-02-04 15:16:21

+0

[[UIApplication sharedApplication] registerForRemoteNotificationTypes:(UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeSound)]; 這是應用程序啓動時調用..所以我相信idRegisterForRemoteNotificati也將被調用之前,我可以顯示我的用戶的文本字段....所以我相信你說我可以稍後調用[自sendProvider:Userinput] ..但是服務器將如何知道這個名字是來自這個devTokenBytes – Shubhank 2012-02-04 15:21:09