6

में संग्रहीत एपीएनएस टोकन टक्कर, मैं पुश नोटिफिकेशन और स्टोर डिवाइस टोकन का उपयोग करता हूं जैसे कि मुझे लगता है कि हर कोई करता है। सबसे पहले मैं उन्हें एक स्ट्रिंग में मेरे ऐप को बदलने:पोस्टग्रेस

Device.where(:token => device_token, :username => username).first_or_create!(:model => model) 

मैं है एक मान्यता है कि कोई दो टोकन सुनिश्चित करता है:

NSString *deviceTokenString = [[[token description] stringByTrimmingCharactersInSet:[NSCharacterSet characterSetWithCharactersInString:@"<>"]] 
           stringByReplacingOccurrencesOfString:@" " withString:@""]; 

तो मैं उन्हें अपने सर्वर है, जहां एक character varying(255) कॉलम में ActiveRecord भंडार उन्हें डाल , मैं सत्यापन को देखने के लिए शुरू कर दिया है

class Device < ActiveRecord::Base 
    belongs_to :user 
    validates_uniqueness_of :token 
end 

हालांकि: एक ही, जो मुझे समझ में हमेशा ऐसा होना चाहिए रहे हैं टोकन विशिष्टता के लिए त्रुटियों:

ActiveRecord::RecordInvalid: Validation failed: Token has already been taken

psql में मैनुअल क्वेरी पुष्टि की है कि एक डिवाइस किसी दूसरे उपयोगकर्ता के तहत तालिका में एक टोकन पहले से ही के साथ रजिस्टर करने की कोशिश कर रहा है। क्या यह असंभव नहीं माना जाता है? क्या मैं जिस तरह से टकनों को छोटा कर रहा हूं उसे बदल रहा हूं? मैंने प्रत्येक कोड उदाहरण की जांच की, जब समस्या पहली बार हुई थी और हर कोई उस विधि का उपयोग करता है जिसे मैंने पहले कोड नमूने में सूचीबद्ध किया है।

+0

एक एप्लिकेशन बग होने की अधिक संभावना है जहां कुछ साझा राज्य ठीक से साफ़ नहीं किया जाता है। लेकिन यह शायद ही असंभव प्रतीत होता है कि एपीएनएस के पास क्विर्क या अनिर्दिष्ट व्यवहार हो सकते हैं जैसे " समय अवधि के बाद चक्र"। मैं कच्चे आने वाले डेटा को कैप्चर करने का प्रयास करना चाहता हूं और अगली बार जब आप एक डुप्ली देखते हैं, तो देखें कि ग्राहक वास्तव में यह सत्यापित करने के लिए भेजा गया है कि आप क्या चाहते हैं। –

+0

मैं क्लाइंट एंड पर कुछ भी कैप्चर नहीं कर सकता, लेकिन मैंने प्रत्येक डुप्लिकेट के लिए इनपुट सहेजा है और कुछ भी अस्वस्थ नहीं लगता है। वे वास्तव में एक पहचानकर्ता भेज रहे हैं जिसका पहले से ही उपयोग किया जा रहा है। – kevboh

+0

ऐप्पल समर्थन से बात करने का समय मुझे लगता है, फिर, और यहां पर फ़ॉलो करें जब (यदि) आपने कभी भी कुछ सुना है। मेरे द्वारा अपनी सांसो को स्थिर नहीं रखा जा रहा था। –

उत्तर

7

ऐसा हो सकता है कि कोई डिवाइस अलग-अलग उपयोगकर्ता के नीचे तालिका में पहले से टोकन के साथ पंजीकरण करने का प्रयास करता है यदि कोई लॉग आउट करता है और फिर किसी दूसरे खाते से लॉग इन करता है।

मैं एक user उपयोगकर्ता और एक टोकन स्ट्रिंग token (यह सोचते हैं कि केवल एक उपयोगकर्ता एक समय में एक डिवाइस पर में लॉग इन किया जा सकता है) के लिए सर्वर पर निम्न करना होगा:

  1. चेक अगर वहाँ एक Devicetoken_string के लिए।
  2. यदि कोई डिवाइस नहीं है, तो token_string और user के लिए एक बनाएं।
  3. यदि कोई डिवाइस है और इसका उपयोगकर्ता user नहीं है, तो अपने उपयोगकर्ता को user पर अपडेट करें।

इस तरह, पुश नोटिफिकेशन डिवाइस पर लॉग इन किए गए अंतिम उपयोगकर्ता के लिए भेजा जाएगा।

डिवाइस पर हेक्स स्ट्रिंग में NSData को बदलने के अपने तरीके के बारे में, आपको -[NSData description] पर भरोसा नहीं करना चाहिए। बेहतर यह प्रोग्राम के रूप में करते हैं (में टाइप, परीक्षण नहीं):

- (NSString *)hexStringForData:(NSData *)data 
{ 
    NSUInteger length = data.length; 
    const char *bytes = data.bytes; 
    NSMutableString *result = [NSMutableString stringWithCapacity:length * 2]; 
    for (int i = 0; i < length; i++) { 
     [result appendFormat:@"%02x", bytes[i] & 0xff]; 
    } 
    return [result copy]; 
} 
1

मैं इस पर अनुमान लगाऊंगा, लेकिन यह अनुमान लगाने के लिए इसे ले लें।

जब आईओएस डिवाइस बैकअप से बहाल किए जाते हैं, या जब वे नए उपकरणों पर "पुनर्स्थापित" होते हैं, तो कहें, कोई आईफोन 4 से आईफोन 5 में अपग्रेड कर रहा है, या जब कोई अपना आईफोन अपनी पत्नी को देता है या इसे eBay पर बेचता है, आपको डुप्लीकेट/अनावश्यक/भ्रमित डिवाइस डेटा मिलेगा। मैंने निश्चित रूप से ऐसा देखा है, लेकिन खासकर एपीएनएस टोकन के साथ नहीं।

यहाँ APNS docs इसके बारे में कहना है:

डिवाइस टोकन का अनुरोध करने और प्रदाता के लिए इसे पारित हर समय आपके आवेदन की शुरूआत करके, आप उस प्रदाता वर्तमान है सुनिश्चित करने में मदद डिवाइस के लिए टोकन। यदि कोई उपयोगकर्ता डिवाइस या कंप्यूटर पर बैकअप को पुनर्स्थापित करता है, जो कि (उदाहरण के लिए, उपयोगकर्ता डेटा को किसी नए डिवाइस या कंप्यूटर पर माइग्रेट करता है) के लिए बनाया गया था, तो वह या उसे कम से कम एक बार एप्लिकेशन लॉन्च करना होगा इसके लिए सूचनाएं फिर से प्राप्त करें। यदि उपयोगकर्ता बैकअप डेटा को किसी नए डिवाइस या कंप्यूटर पर पुनर्स्थापित करता है, या ऑपरेटिंग सिस्टम को पुनर्स्थापित करता है, तो डिवाइस टोकन परिवर्तन। इसके अलावा, डिवाइस टोकन को कैश न करें और इसे अपने प्रदाता को दें; जब भी आपको इसकी आवश्यकता हो तब सिस्टम से हमेशा टोकन प्राप्त करें। यदि आपका आवेदन पहले पंजीकृत है, तो पंजीकरण करने के लिए कॉल करें फ़ोरमोटोटोटेशन प्रकार: ऑपरेटिंग सिस्टम में परिणाम अतिरिक्त ओवरहेड के बिना तुरंत प्रतिनिधि को डिवाइस टोकन पास कर रहा है।

तो, मैं अपने कोड में नहीं देख रहा हूँ, लेकिन यह संभावना है कि अपने "नकल" टोकन हर बार, कैशिंग किसी तरह का है, और डिवाइस बहाली दर्ज की नहीं के कुछ संयोजन के साथ क्या करना है।

0

यह समझना महत्वपूर्ण है क्या होता है जब एक युक्ति रजिस्टरों महत्वपूर्ण है। यह निम्न पर अपने सर्वर एक पोस्ट भेजता है:

/passkit/v1/devices/<deviceID>/registrations/<typeID>/<serial#> 

और JSON पेलोड के भीतर push_token है। deviceID और push_token दोनों में क्या मायने रखता है। जहां तक ​​ऐप्पल का संबंध है, आप एप्पल के सिस्टम के माध्यम से push_token के साथ डिवाइस के साथ संवाद करते हैं और कुछ भी नहीं।

deviceID के लिए, यह वास्तविक भौतिक डिवाइस है जिसका उपयोग किया जाता है। तथ्य यह है कि डिवाइस कई बार पंजीकरण करना चाहता है अप्रासंगिक है, और आपके कोड को नवीनतम पंजीकरण प्रयास के आधार पर आपके डीबी में push_token को अपडेट करना चाहिए। यह इसके बारे में।