2012-04-13 13 views
15

Uygulamamda push bildirimleri ayarlanmış. application:didRegisterForRemoteNotificationsWithDeviceToken: yönteminde APNS'den aldığım aygıtın sanal alandan veya geliştirme ortamından gelip gelmediğini belirlemeye çalışıyorum. Hangi ortamın belirteci başlattığını ayırt edebilirsem sunucumu push bildirimi gönderecek çevreye bildirebilirim.Uygulamanın APNS sanal alanı veya üretim ortamı ile iletişim kurup kurmadığını belirleyin

Bunu belirlemek için DEBUG makrosunu kullanmayı denedim, ancak bununla garip bir davranış gördüm ve% 100 doğru olması için ona güvenmeyin.

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

İdeal olarak, ben kodunda (değer Geliştirme veya Üretim), ama bu bile mümkün olup olmadığını emin değilim aps-environment hak incelemek mümkün olurdu.

Uygulamanızın APNS sanal alanı veya üretim ortamları ile iletişim kurup kurmadığını belirlemenin doğru yolu nedir? Sunucunun bunu ilk sırada bilmesi gerektiğini düşünüyorum. Bu varsayım yanlış ise lütfen beni düzeltin.

Düzenlenmiş: Apple'ın Provider Communication with APNS dokümanındaki belgeleri, kum havuzu ve üretim ile iletişim arasındaki farkı açıklamaktadır. Ancak, dokümantasyon belirteci (iOS istemci uygulamasından) kaydetme ve sunucuyla iletişim kurma ile tutarlı olma konusunda bilgi vermez. O yapı yapılandırma eşleşti ettiyseniz yapı yapılandırması çalışabilir belirlerken, aynı zamanda yanlış olabilir -

cevap

14

okumak ve gömülü hazırlık profilini kontrol edebilirsiniz. provizyon dosyasını kontrol etmektir

@ tcurdt en cevapta belirtildiği üzere
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

Kütüphane biraz modası geçmiş olsa da, "aps- environment' ("get-task-allow" ile "aps-environment" ifadesini değiştirin ve @tcurdt örneğiyle değiştirin ve bir bool olarak karşılaştırma) –

+0

@AlbertBori lütfen neyle ilgili bir sorunla karşılaşır mısınız modası geçmiş? – tcurdt

+0

Elbette! İşte git: https://github.com/tcurdt/TCMobileProvision/issues/1 –

4
  1. APNS ortamı Kod işareti kimliğini (iyi sonrası here) uyan kod işareti Yetkiler göre belirlenir Eşleşmeyen bir yetkilendirme ile. > "Diğer - senin yetkileri (çalışmalıdır size zor olmaya DEBUG bulursanız, sen altında kendi bağlayıcı işareti ekleyebilir "Apple LLVM ..." belirlemek için bir araç olarak DEBUG kullanarak, akılda tutulması

  2. C Bayrakları" -> " örneğin, daha sonra -DDEBUGGING ekleyip ayıklama") kullanın:

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

+0

Yanıt için teşekkürler, @Wiz. Yapılandırma plist dosyasında bir boolean kullanarak bitti. Bahsettiğiniz tek yakalama, bu yapılandırma ayarının proje dosyasındaki kod imzalama kimliğiyle eşleşmesidir. İstenmeyen ama mevcut en iyi çözüm. – goldierox

+0

Anlaşmalı. Apple, mevcut yetkinin ne olduğunu size bildirmek için kolayca API sağlayabilirdi - daha sonra üretiminizi ayarlayabilir veya sandboxed token'larını sanal alan sunucunuza yönlendirebilirsiniz ... –

0

, tek güvenli yolu sandbox'ı kullanılıp kullanılmayacağını belirlemek için ya da olmasın:

https://github.com/tcurdt/TCMobileProvision

Bu benim işim.

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 yüklemek için, Podfile bu ekleyin::

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

phatmann, Swift kodu için teşekkürler. Sandbox'un bir boolean durumunu kontrol etmek için bir nedeniniz varsa ve üretimde doğru bir şekilde geri dönmüyorsanız merak ediyorum. Ne buldum eğer xCode yerel bir yapı çalıştırıyorsam, 'mobileprovision' yüklemeye çalışırken başarısız olur, bu yanlış bir geri dönüşü neden olur (bu, sandbox içinde DEĞİLDİR). Ancak, mobileprovision dosyasını başarıyla yükleyen ve Sandbox oluşturma işleminin doğru olduğunu gösteren bir korumalı Arşiv dosyası oluşturursam. Bu durumda, başarılı bir şekilde "üretim" bulmayı test etmek gerekli görünmektedir. – KeithB

+0

@KeithB en iyi yaklaşımın bir sandığı 'sandbox',' production' ve 'unspecified' ile döndürmek gibi görünebilir. Kodu uygun şekilde düzenlemek için çekinmeyin. – phatmann

4

Bu kesmek ancak biz' Swift 3

ile XCode 8 çalışan İşte Swift kodu kullanarak, TCMobileProvision olduğunu Temel olarak embedded.mobileprovision dosyasını açıp, bir dizeye dönüştürerek, uygulamanın geliştirmenin aps-ortamını kullandığını gösteren bir dize olup olmadığını kontrol edin.

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 
}