2012-04-13 25 views
15

के साथ संचार कर रहा है या नहीं, मेरे पास मेरे ऐप में पुश सूचनाएं स्थापित हैं। मैं यह निर्धारित करने की कोशिश कर रहा हूं कि application:didRegisterForRemoteNotificationsWithDeviceToken: विधि में एपीएनएस से प्राप्त डिवाइस टोकन सैंडबॉक्स या विकास पर्यावरण से आया है या नहीं। यदि मैं अलग-अलग वातावरण को टोकन आरंभ करने में अंतर कर सकता हूं, तो मैं अपने सर्वर को पुश अधिसूचना भेजने के लिए किस माहौल को बता सकता हूं।यह निर्धारित करें कि ऐप एपीएनएस सैंडबॉक्स या उत्पादन पर्यावरण

मैंने इसे निर्धारित करने के लिए DEBUG मैक्रो का उपयोग करने का प्रयास किया है, लेकिन मैंने इसके साथ कुछ अजीब व्यवहार देखा है और इसे 100% सही होने पर भरोसा नहीं है।

#ifdef DEBUG 
BOOL isProd = YES; 
#else 
BOOL isProd = NO; 
#endif 

आदर्श रूप में, मैं aps-environment पात्रता की जांच के लिए सक्षम होगा कोड में (मूल्य विकास या उत्पादन है), लेकिन मुझे यकीन है कि अगर यह भी संभव है नहीं कर रहा हूँ।

यह निर्धारित करने का सही तरीका क्या है कि आपका ऐप एपीएनएस सैंडबॉक्स या उत्पादन वातावरण से संचार कर रहा है या नहीं? मुझे लगता है कि सर्वर को इसे पहले स्थान पर जानना होगा। अगर यह धारणा गलत है तो कृपया मुझे सही करें।

संपादित: Provider Communication with APNS पर एप्पल के प्रलेखन सैंडबॉक्स और उत्पादन के साथ संवाद स्थापित के बीच अंतर का विवरण है। हालांकि, दस्तावेज टोकन को पंजीकृत करने के साथ संगत होने के बारे में जानकारी नहीं देता है (आईओएस क्लाइंट ऐप से) और सर्वर से संचार कर रहा है। अगर आपको लगता है कि निर्माण विन्यास मिलान कर लेते हैं, जबकि की पहचान अपने निर्माण विन्यास काम कर सकते हैं, यह भी गलत हो सकता है -

उत्तर

14

आप पढ़ सकते हैं और एम्बेडेड प्रावधान प्रोफाइल देख सकते हैं।

NSString *mobileprovisionPath = [[[NSBundle mainBundle] bundlePath] 
     stringByAppendingPathComponent:@"embedded.mobileprovision"]; 
TCMobileProvision *mobileprovision = [[TCMobileProvision alloc] initWithData:[NSData dataWithContentsOfFile:mobileprovisionPath]]; 
NSDictionary *entitlements = mobileprovision.dict[@"Entitlements"]; 
NSString *apsEnvironment = entitlements[@"aps-environment"]; 
BOOL production = entitlements && apsEnvironment && [apsEnvironment isEqualToString:@"production"]; 
+0

लाइब्रेरी थोड़ी पुरानी है, लेकिन यह 'एपीएस- पर्यावरण' (@tcurdt के उदाहरण में '" एपीएस-पर्यावरण "के साथ' "get-task-allow" 'को प्रतिस्थापित करें, और इसे बूल के रूप में तुलना न करें) –

+0

@AlbertBori क्या आप कृपया इस पर कोई समस्या दर्ज कर सकते हैं रगड़ा हुआ? – tcurdt

+0

निश्चित बात! यहां आप यहां जाएं: https://github.com/tcurdt/TCMobileProvision/issues/1 –

4
  1. APNS पर्यावरण कोड हस्ताक्षर अपने कोड पर हस्ताक्षर पहचान (अच्छा पोस्ट here) मिलान पात्रता के अनुसार निर्धारित किया जाता है एक गलत मिलान योग्य हकदारता के साथ।

  2. ध्यान में रखते हुए, अपने अधिकारों को निर्धारित करने के लिए DEBUG का उपयोग करना चाहिए (यदि आपको DEBUG मुश्किल हो, तो आप "Apple LLVM ..." के अंतर्गत अपना स्वयं का लिंकर ध्वज जोड़ सकते हैं -> अन्य सी झंडे "->" डीबग ") उदाहरण के लिए, -DDEBUGGING जोड़ने और फिर उपयोग करें:

#ifdef DEBUGGING BOOL isProd = YES; #else BOOL isProd = NO; #endif

+0

प्रतिक्रिया के लिए धन्यवाद, @Wiz। मैं विन्यास plist फ़ाइल में एक बुलियन का उपयोग कर समाप्त हो गया। जैसा कि आपने बताया है, एकमात्र पकड़ यह है कि इस कॉन्फ़िगरेशन सेटिंग को कोड हस्ताक्षर पहचान से मेल खाना है, जो प्रोजेक्ट फ़ाइल में है। यह अवांछनीय है लेकिन उपलब्ध सर्वोत्तम समाधान है। – goldierox

+0

सहमत हुए। ऐप्पल आसानी से आपको यह बताने के लिए एपीआई प्रदान कर सकता है कि वर्तमान एंटाइटेलमेंट क्या है - फिर आप उत्पादन को सेट कर सकते हैं, या सैंडबॉक्स वाले टोकन को अपने सैंडबॉक्स सर्वर पर रूट कर सकते हैं ... –

0

@ tcurdt के जवाब में उल्लेख किया है, केवल सुरक्षित तरीका निर्धारित करने के लिए सैंडबॉक्स उपयोग करने के लिए है या नहीं प्रावधानीकरण फ़ाइल की जाँच करने के लिए है:

https://github.com/tcurdt/TCMobileProvision

यह मैं क्या कर रहा है।

func isAPNSandbox() -> Bool { 
    if let mobileProvisionURL = NSBundle.mainBundle().URLForResource("embedded", withExtension: "mobileprovision"), 
    let mobileProvisionData = NSData(contentsOfURL: mobileProvisionURL), 
    let mobileProvision = TCMobileProvision(data: mobileProvisionData) { 
     if let entitlements = mobileProvision.dict["Entitlements"], 
     let apsEnvironment = entitlements["aps-environment"] as? String 
     where apsEnvironment == "development" { 
      return true 
     } 
    } 

    return false 
} 

TCMobileProvision स्थापित करने के लिए अपने Podfile से जोड़ें::

pod 'TCMobileProvision', :git => 'https://github.com/tcurdt/TCMobileProvision.git' 
+0

फ़ैटमैन, स्विफ्ट कोड के लिए धन्यवाद। मुझे उत्सुकता है कि अगर आपके पास सैंडबॉक्स की बुलियन स्थिति जांचने का कोई कारण था और उत्पादन पर सही नहीं है? मुझे जो मिला वह यह था कि यदि मैं xCode से स्थानीय निर्माण चला रहा हूं तो यह 'मोबाइलप्रोविजन' लोड करने का प्रयास करते समय विफल रहता है, जो झूठी वापसी का कारण बनता है (यह दर्शाता है कि यह सैंडबॉक्स में नहीं है)। हालांकि, अगर मैं एक सैंडबॉक्स प्रावधान संग्रह फ़ाइल बनाता हूं जो सफलतापूर्वक मोबाइलप्रोविजन फ़ाइल लोड करता है और यह सही ढंग से इंगित करता है कि यह एक सैंडबॉक्स निर्माण है। यह मामला सफलतापूर्वक "उत्पादन" खोजने के लिए परीक्षण करना आवश्यक लगता है। – KeithB

+0

@KeithB सबसे अच्छा दृष्टिकोण जैसा लगता है कि 'सैंडबॉक्स', 'उत्पादन' और' निर्दिष्ट नहीं 'के साथ एक enum वापस करने के लिए हो सकता है। कोड को उचित रूप से संपादित करने के लिए स्वतंत्र महसूस करें। – phatmann

4

यह एक हैक है, लेकिन XCode 8 पर अपनी कार्यशील Swift 3

हम 'के साथ यहाँ का उपयोग कर TCMobileProvision स्विफ्ट कोड है, मूल रूप से embedded.mobileprovision फ़ाइल को खोलकर, इसे एक स्ट्रिंग में परिवर्तित कर रहा है, फिर एक स्ट्रिंग की जांच कर रहा है जो इंगित करेगा कि ऐप विकास एपीएस-पर्यावरण का उपयोग कर रहा है।

func isDevelopmentEnvironment() -> Bool { 
    guard let filePath = Bundle.main.path(forResource: "embedded", ofType:"mobileprovision") else { 
     return false 
    } 
    do { 
     let url = URL(fileURLWithPath: filePath) 
     let data = try Data(contentsOf: url) 
     guard let string = String(data: data, encoding: .ascii) else { 
      return false 
     } 
     if string.contains("<key>aps-environment</key>\n\t\t<string>development</string>") { 
      return true 
     } 
    } catch {} 
    return false 
} 
संबंधित मुद्दे