2012-03-28 12 views
11

Ist es irgendwie möglich, wie unten in der iOS App zu codieren?Überprüfen, ob die iOS-App im App Store verfügbar ist

if(app is live in app store) 
{ 
    //Do something 
} 
else 
{ 
    //Do other thing 
} 

Ich wollte Fälle vermeiden, in denen unser QE/Entwicklerteam eine App zum Testen verwendet. Gibt es eine Möglichkeit zu erkennen, wie App-Code signiert ist (Developer/Adhoc/Distribution)? Selbst wenn es möglich ist, wird es keine Fälle ausschließen, in denen Apple unsere App im Rahmen der Überprüfung zum Testen verwendet. Wir haben viele Downloads unserer Inhalte von Apple aufgenommen, bevor unsere App im App Store online geht.

+1

Warum möchten Sie das tun? Sie können Preprozessor-Makros verwenden, um zwischen Debug- und Release-Builds zu unterscheiden, aber das Apple Review-Team muss dieselbe App wie die Kunden ohne Änderungen verwenden. Sie können einen serverseitigen Test der IP-Adressen verwenden, um sicherzustellen, dass Sie den Prüfern keine Gebühren für den heruntergeladenen Inhalt oder Ähnliches in Rechnung stellen, aber versuchen Sie nicht, sie zu täuschen. –

+0

Ich habe bereits Makros, um Debug- und Release-Builds zu unterscheiden. Aber es ist nicht was ich will. Wir verwenden Testflight, um unsere Apps an Kunden und Tester zu senden. Problem ist, dass, wenn sie irgendeinen Inhalt herunterladen, wir das nicht verfolgen wollen, weil sie nicht tatsächliche Benutzer sind.Eine Lösung (in der Theorie), an die ich gedacht habe, ist, Entscheidungen basierend auf dem Provisioning-Profil "Ad-Hoc/Developer" oder "Distribution" im Code zu treffen. Wie, muss ich herausfinden. Ein weiteres Problem ist der von Apple im Rahmen der Überprüfung heruntergeladene Inhalt. Kann ich das irgendwie erkennen? – msk

+0

Sie können einen Parameter für die Anforderungen zu Ihrem Server hinzufügen, wenn es ein AdHoc-Build ist, und nach diesem Parameter auf dem Server suchen. Wenn Apple die App testet, können Sie die IP-Adresse auf Ihrem Server erkennen. –

Antwort

8

Sie können feststellen, ob Ihre App über den App Store verteilt wurde, indem Sie nach dem Fehlen von embedded.mobileprovision suchen. Diese Datei ist nur in Ad-hoc-Builds enthalten.

So:

if ([[NSBundle mainBundle] pathForResource:@"embedded" 
            ofType:@"mobileprovision"]) { 
    // not from app store (Apple's reviewers seem to hit this path) 
} else { 
    // from app store 
} 

Diese Technik ist von the HockeyApp SDK. Ich persönlich habe Anwendungen im Laden, die diese Technik verwenden, und natürlich gibt es viele Apps, die das HockeyApp SDK enthalten.

Basierend auf einem sofortigen Absturz, den ich versehentlich in einem bestimmten Build meiner Anwendung im "from app store" -Pfad veröffentlicht habe, wird Apples Team dem Pfad "not from app store" folgen. Laß meinen Verlust auf diesem einen Gewinn liegen. :)

+1

Wird dies Apple Tester unterscheiden? Verwenden sie ihre eigene MobileProvision, um Apps zum Testen zu laden, oder haben sie eine spezielle Möglichkeit, sie zu laden? – xdumaine

+0

Gute Frage. Ich kenne die Antwort nicht. Ich hatte Code, der diese von Apple genehmigte Technik verwendet, und als Teil des HockeyApp SDK ist es wahrscheinlich ziemlich weit verbreitet. Wenn Sie also nur neugierig sind, ob es Sie ablehnt, scheint es nicht so. Darüber hinaus…? –

+2

Okay, ich habe jetzt ziemlich starke (wenn auch nicht schlüssige) Beweise dafür, dass das App Review Team von Apple dem Pfad "nicht vom App Store" in diesem Code folgen würde. –

1

Ich sah eine ähnliche Situation in meiner App. Zumindest glaube ich das, ich bin mir nicht sicher, ob ich deine Frage vollkommen verstehe.

In meiner App habe ich Benutzer mit Konten Inhalt erstellen. Ich möchte nicht, dass Entwicklerinhalte (oder Inhalte von Apple-Mitarbeitern) den öffentlichen Inhalt verschmutzen. Ich habe ein "Test" -Bit in der Benutzerdatenstruktur, das eingeschaltet wird und Testinhalt für die Öffentlichkeit nicht sichtbar ist. Ich habe mich noch nicht im App Store angemeldet, aber ich muss mit Apple zusammenarbeiten, um sicherzustellen, dass bei diesen Konten das Test-Bit aktiviert ist.

Wenn das nicht Ihr Ziel ist, na dann nichts! : -)

+0

Können Sie erarbeiten, was Sie Apple fragen? Was meinst du mit "Test" Bit? Wie setzt jemand es zurück? – msk

+0

Auf meinem Server habe ich eine Benutzerdatenstruktur, die Dinge wie Login, Passwort, E-Mail enthält. Es hat auch einen booleschen Namen namens "test". Wenn der Boolesche Wert ON ist, verhält sich meine Anwendung anders. Ich habe es über eine API auf meinen Server eingestellt. Wenn ich mich beim Apple Store bewerbe, muss ich mit ihnen arbeiten, um sicherzustellen, dass das Testbit auf ON steht. –

+0

Ahhh, ich sehe deinen Kommentar oben. Ja, Sie können ein spezielles Konto für TestFlight- und Apple-Benutzer haben. Es beantwortet Ihre Frage nicht, aber es löst Ihr Problem. –

3

auf iOS 7 und höher, können Sie auch in der Lage sein zu überprüfen: die Arbeit mit XCode mehr

if ([NSData dataWithContentsOfURL:[NSBundle mainBundle].appStoreReceiptURL] != nil) { 
    // Downloaded from App Store 
} else { 
    // Not downloaded from App Store 
} 
+0

Wird es auch für kostenlose Apps funktionieren? Ich denke, [NSBundle mainBundle] .appStoreReceiptURL wird in diesem Fall null sein, oder? – msk

+0

Ich habe dies nicht getestet (die Zeit, um dies zu einer App hinzuzufügen, es genehmigt zu bekommen, und irgendwie die Daten extrahieren ist ziemlich signifikant). Aber wie ich es verstehe, eine kostenlose App zählt als "Kauf", nur eine, die kostenlos für den Verbraucher geschieht. –

0

Swift

func isAppStoreBuild() -> Bool { 

    if NSBundle.mainBundle().appStoreReceiptURL != nil { 
     if let _ = NSData(contentsOfURL: NSBundle.mainBundle().appStoreReceiptURL!) { 
      return true 
     } 
    } 
    return false 
} 
2

Dies ist nicht 7, Ich würde vorschlagen, zu verwenden Sie die neue HockeyApp Abhilfe https://github.com/bitstadium/HockeySDK-iOS/blob/6b727733a5a93847b4a7ff8a734692dbe4e3a979/Classes/BITHockeyHelper.m Hier ist eine vereinfachte Version:

+ (BOOL)isAppStoreBuild 
{ 
#ifdef DEBUG 
    return NO; 
#else 
    return ([UIApplication isTestFlightBuild] == NO); 
#endif 
} 

+ (BOOL)isTestFlightBuild 
{ 
#ifdef DEBUG 
    return NO; 
#else 
    NSURL *appStoreReceiptURL = NSBundle.mainBundle.appStoreReceiptURL; 
    NSString *appStoreReceiptLastComponent = appStoreReceiptURL.lastPathComponent; 
    BOOL isSandboxReceipt = [appStoreReceiptLastComponent isEqualToString:@"sandboxReceipt"]; 

    return isSandboxReceipt; 
#endif 
} 
0

Für die Swift-Version:

private static let isTestFlight = NSBundle.mainBundle().appStoreReceiptURL?.lastPathComponent == "sandboxReceipt" 

This complete answer erklärt aufwendiger, wie Sie es nutzen könnten.