Frage

Ist es möglich, den Benutzer zu zwingen, einmal zu aktualisieren gibt es eine neue Version meiner Anwendung im iTunes Store?

Ich arbeite derzeit an einer Anwendung. Allerdings möchte ich das Upgrade zwingen, wenn ich eine neuere Version laden, da das Upgrade mehr Funktionen haben, und ich möchte die vorherige Version verwerfen. Ist dies möglich, standardmäßig mit iPhone oder muß ich meine eigene Implementierung zu schreiben, um die aktuelle Version zu überprüfen und es in den Laden vergleichen?

War es hilfreich?

Lösung

Die einzige Möglichkeit, System behandelt Updates Ihrer Anwendung fordert Nutzer das Update in Standard App Store-Anwendung verfügbar ist.
Auch ist Standalone-Anwendung nicht bewusst verfügbaren Updates so dass Sie benötigen, um Ihre Web-Service zu implementieren, wenn die Anwendung kann prüfen, ob die aktuelle Version gültig ist.
Und ich bin nicht sicher, ob dies mit Apple Regeln auf Anwendungen entspricht, wie (nicht proof-Link obwohl finden) Sie keine Testversionen für eine Anwendung hochladen können.

* EDIT * Diese Antwort ist nicht mehr wahr. Siehe andere upvoted Antworten für aktuelle Wahrheit.

Andere Tipps

ich diese Funktion, indem sie Version von itunes Webservice getan habe und mit der aktuellen Version zu vergleichen .. Im Anschluss an meinem Code

        NSString *version = @"";
        NSURL *url = [NSURL URLWithString:@"http://itunes.apple.com/lookup?id=<Your app ID>"];
        versionRequest = [ASIFormDataRequest requestWithURL:url];
        [versionRequest setRequestMethod:@"GET"];
        [versionRequest setDelegate:self];
        [versionRequest setTimeOutSeconds:150];
        [versionRequest addRequestHeader:@"Content-Type" value:@"application/json"]; 
        [versionRequest startSynchronous];

        //Response string of our REST call
        NSString* jsonResponseString = [versionRequest responseString];

        NSDictionary *loginAuthenticationResponse = [jsonResponseString objectFromJSONString];

        NSArray *configData = [loginAuthenticationResponse valueForKey:@"results"];

        for (id config in configData) 
        {
            version = [config valueForKey:@"version"];
        }
   //Check your version with the version in app store
        if (![version isEqualToString:[itsUserDefaults objectForKey:@"version"]]) 
        {
            ProAlertView *createUserResponseAlert = [[ProAlertView alloc] initWithTitle:@"New Version!!" message: @"A new version of app is available to download" delegate:self cancelButtonTitle:@"Cancel" otherButtonTitles: @"Download", nil];
        [createUserResponseAlert show]; 
        [createUserResponseAlert release];
        }

Und setzen Sie die App-ID in dem itunes Link den Code unten sehen ..

- (void)alertView:(UIAlertView *)actionSheet clickedButtonAtIndex:(NSInteger)buttonIndex {
    // the user clicked one of the OK/Cancel buttons
    if (buttonIndex == 1)
    {
        NSString *iTunesLink = @"itms-apps://phobos.apple.com/WebObjects/MZStore.woa/wa/viewSoftwareUpdate?id=<appid>&mt=8";
        [[UIApplication sharedApplication] openURL:[NSURL URLWithString:iTunesLink]];
    }
}

Hinweis: Sie benötigen JSONKit Rahmen der Arbeit und ASIHttp Rahmen der Arbeit, um die Webservice-Anrufe zu tätigen ..

Sie können erkennen, ob die App ein Update benötigt dann einige benutzerdefinierte Aktion wie Alarm, um die Benutzer ein Update verfügbar ist. Hier ist ein Code-Snippet, das feststellt, dass ein Update verfügbar ist.

-(BOOL) needsUpdate{
    NSDictionary* infoDictionary = [[NSBundle mainBundle] infoDictionary];
    NSString* appID = infoDictionary[@"CFBundleIdentifier"];
    NSURL* url = [NSURL URLWithString:[NSString stringWithFormat:@"http://itunes.apple.com/lookup?bundleId=%@", appID]];
    NSData* data = [NSData dataWithContentsOfURL:url];
    NSDictionary* lookup = [NSJSONSerialization JSONObjectWithData:data options:0 error:nil];

    if ([lookup[@"resultCount"] integerValue] == 1){
        NSString* appStoreVersion = lookup[@"results"][0][@"version"];
        NSString* currentVersion = infoDictionary[@"CFBundleShortVersionString"];
        if (![appStoreVersion isEqualToString:currentVersion]){
            NSLog(@"Need to update [%@ != %@]", appStoreVersion, currentVersion);
            return YES;
        }
    }
    return NO;
}

Wenn Sie unbedingt müssen, können Sie die App Store starten, damit Ihre Benutzer die neueste Version von dort bekommen. Ich würde empfehlen, diese optional zu machen oder zumindest zunächst einen Dialog zu präsentieren.

// iTunesLink should be your applications link
NSString *iTunesLink = @"http://phobos.apple.com/WebObjects/MZStore.woa/wa/viewSoftware?id=284417350&mt=8";


[[UIApplication sharedApplication] openURL:[NSURL URLWithString:iTunesLink]];

Diese Frage wurde ursprünglich 7 Jahre geschrieben vor und während einige der Antworten relevant bleiben, hier ist ein mehr up-to-date-Ansatz.

Ich empfehle https://github.com/ArtSabintsev/Siren die 3 kompatibel Swift ist und installiert werden, mit Cocoapods oder Karthago.

CocoaPods, Swift 3-Unterstützung:

pod 'Siren'

Karthago:

github "ArtSabintsev/Siren"

Ein System für Zwangs Upgrades sollte Teil jeder Anwendung, die eine Abhängigkeit auf etwas außerhalb dieser Anwendung hat. Sowohl Apple und Google behaupten, dass, wenn eine App nutzt etwas Äußerliches dann, dass externe API für immer leben sollte, sich nie ändern, etc., etc., aber das ist einfach unrealistisch. Und wenn das der Fall ist, wenn die Dienste, die die App auf hängt dann ändern können, da muss ein Weg sein, für die App zu überprüfen und sehen, ob es Funktionalität einschränken sollte und den Benutzer auffordern, die neueste Version zu erhalten oder die Dinge einfach auf mysteriöse Weise versagen.

Das könnte und sollte etwas sein, dass Apple und Google liefern, aber sie tun nicht so jede App außerhalb von ein paar Spiele braucht diese zu bauen, SO ...

Ich habe ein Rails-basierten Open-Source (Apache 2.0) Projekt zu erstellen, eine Lösung für dieses Problem beginnt. Es Application- [Strg] genannt, und es ist sehr viel ein work in progress, aber Sie sind willkommen, es zu benutzen, und ich begrüße Beiträge jeglicher Art. Wenn ich dies und laufe in meiner Freizeit bekommen kann ich dies für alle App-Entwickler mit einigem sehr vernünftigen Maße an kostenlosen Service bieten werden und natürlich jedes Unternehmen immer in der Lage sein, seinen eigenen Einsatz spin up.

Es ist hier auf GitHub: https://github.com/SlalomDigital/ApplicationCtrl

Mitwirken und mir helfen, dieses Problem zu lösen für gut!

Es gibt keine automatisierte Möglichkeit, es zu tun, würden Sie etwas manuell schreiben.

Ihr Unternehmen / Design-Plan sollte nie die Phrase enthalten „um den Benutzer zwingen“. Menschen wütend, wenn man sie etwas machen tun. Stellen Sie sich ein Benutzer in Eile, die nur Ihre nette kleine App eines Morgens öffnet sich entdecken Sie ihn zwingen zu aktualisieren, bevor er die App verwenden können, was er braucht. Stellen Sie sich vor ihm in der Wildnis ragten hat das Edge verwendet zum Download bereit. Er wird nicht glücklich sein.

Wenn Sie diesen Plan zu folgen lange genug dabei, Dein Upgrades wird unweigerlich einen spürbaren Fehler einführen. Wenn Sie die Benutzer zwingen, eine Buggy-Version zu verwenden rebellieren sie werden.

Ich habe durch Erfahrung konditioniert erschaudern, wenn ich eine neue Version der Software finden Sie unter „Weitere Funktionen“ verwendet, um zu beschreiben, weil dies unweigerlich Funktion aufblasen bedeutet. Designer neigen dazu, Pfropfen mehr und mehr Funktionen auf Apps zu halten, bis eine App alles tut. Dies ist besonders gefährlich, auf einer Plattform wie dem iPhone, wo eine App tun macht schnell zu viele Dinge überwältigt die Schnittstelle und die Reaktionsfähigkeit der App.

Edit01: Mein Kommentar hier wie eine Anwendung zu aktualisieren, nachdem Benutzer für Upgrade- bezahlen könnte auch auf Ihre Pläne relevant sein. Wenn Ihr Upgrade-Design schneidet Apple-out der Einnahmen Schleife, seine ein Rohrkrepierer.

Update:

Nur um zu klären, basierend auf einen Kommentar unten: Ja, manchmal müssen Sie Benutzer benötigen ein Upgrade. Das ist jedoch sehr verschieden von Gestaltung die App von Anfang an , um Benutzer zu zwingen, jedes Mal, den Entwickler zu aktualisieren eine neue Version.

Ein solches Design soll das Leben des Entwicklers einfach und nicht die des Benutzers machen. Jedes Mal, wenn ein Benutzer hat Zeit Upgrade für einen Nutzen verbringen sie nicht fragen und vielleicht nicht wollen, haben Sie Zeit und Ressourcen vom Kunden übernommen. Design, die Zeit und Mühe vom Entwickler für den Benutzer Offload sind schlechte Designs, weil die Menschen letztlich Software zu ihrem eigenen Vorteile zu kaufen. Wenn Sie diesen Nutzen verringern, verringern Sie die ultimative Rentabilität Software.

So sollte kein Designer Software entwickeln, die die Benutzer zwingt, etwas, was der Benutzer tun möchte nicht, es sei denn es eine absolute technische Notwendigkeit. Das ist natürlich eine Daumenregel, aber es ist ein sehr guter.

Meine App-Update im App Store wurde nur genau aus diesem Grund abgelehnt. Wir haben eine Funktion, um die installierte Version gegen die aktuelle Version zu überprüfen und, wenn es nicht eine unterstützte Version ist, wir zwingen sie zu aktualisieren.

Apple-lehnte dies.

Also zurück zum Design Bord!

Die anderen Antworten zeigen, dass man die erzwungene Aktualisierung Funktionalität selbst implementieren muss. Es ist wirklich eine Schande, ich wünschte, es nicht so war. Mein allererstes Update auf eine iOS-Anwendung ist auf morgen veröffentlicht werden, und zum Glück es wird nicht Problem sein, da wir nur Änderungen an der App vorgenommen haben. Allerdings, wenn wir schließlich die Struktur unserer Web Service ändern, wäre es wirklich sinnvoll sein, der Lage sein, Änderungen zu erzwingen, so dass unser Server muss nicht jede einzelne App-Version zu unterstützen.

Es gibt eine Alternative jedoch gezwungen Updates, die in diesem Thread unerwähnt zu sein scheint. Sie könnten jeden Webservice Aufruf haben, die Daten anhängen, ein Schema zu den Daten erzeugt, was sagt die App wie diese Daten sollten in Ihrer App deserialised werden. Dies ermöglicht Ihnen, die Struktur von Daten von GET-Anfragen erzeugt zu ändern, ohne Deserialisation in der App zu brechen. Natürlich setzt dies voraus, dass der Dolmetscher, die Sie schreiben, wird sich nicht ändern, aber das eine etwas vernünftige Annahme ist zu machen, wenn es ausgereift ist.

Post-Anfragen könnten "schema-fied" durch Interaktion sein. Damit meine ich, dass vor jeder Post-Anfrage Sie machen, fragen Sie nach, wie die auf den neuesten Stand webservice nennen. Sie bearbeiten die Anweisungen einen angeschlossenen Schema für die Verwendung und dann machen Sie den eigentlichen Aufruf der Webservice. Im Wesentlichen bedeutet dies, dass jede Post-Anforderung 2-Anfragen erfordert, aber das kann in Ordnung sein.

Doch egal, ob Sie erzwungene Aktualisierung oder Schema Interpretation implementieren die Funktionalität in der App von Tag zu sein hat 1, wenn es im App Store trifft. Ansonsten sind Sie in dem gleichen Schlamassel. All diese Komplexität wäre unnötig, wenn Apple für uns Entwickler Aktualisierung gezwungen implementiert. Schema Interpretation wäre immer noch eine Usability-Verbesserung, wenn gezwungen Aktualisierung obwohl existiert. Aber es nervt mich ein wenig, dass Apple haben die Aktualisierung nicht gezwungen, weil zumindest mit ihm konnte man die eigene anti-Pause Aktualisierung Maßnahmen nach der App veröffentlicht wurde einzuführen.

Hallo für jedermann in der Zukunft fand ich dieses Tutorial, das mir jemand helfen sollte, es hat mir geholfen.

http: / /codewithchris.com/tutorial-how-to-implement-in-app-update-functionality-in-your-iphoneipad-app/

Edit (Ihr Code etwas ähnliches sehen, was unten):

// Try to get version 
NSString *versionNumber = [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleVersion"];

NSURL *updateUrl = [NSURL URLWithString:@"http://yourdomain.com/yourupdatefile.xml"];
NSURLRequest *urlRequest = [NSURLRequest requestWithURL:updateUrl
                                            cachePolicy:NSURLCacheStorageNotAllowed
                                        timeoutInterval:20.0];
NSURLResponse *response = nil;
NSError *error = nil;
NSData *data = [NSURLConnection sendSynchronousRequest:urlRequest
                                     returningResponse:&response
                                                 error:&error];
// Check no error, then parse data
if (error == nil)
{
    // Parse response into a dictionary
    NSPropertyListFormat format;
    NSString *errorStr = nil;
    NSDictionary *dictionary = [NSPropertyListSerialization propertyListFromData:data
                                                                mutabilityOption:NSPropertyListImmutable
                                                                          format:&format
                                                                errorDescription:&errorStr];        
    if (errorStr == nil)
    {
        @try {

            // Try to see if the current app version exists in the update xml
            NSString *itunesUrl = [dictionary objectForKey:versionNumber];

            if (itunesUrl)
            {
                // Show dialog to ask user to update!
            }
            else {
                // Version not in XML
            }
        } @catch (NSException *e) {
            // Error with retrieving the key
        }
    }
    else {
        // Error with parsing data into dictionary
    }
}

jedoch auf die weitere Forschung Ich habe dies eine großartige Lösung für erwiesen, wenn Sie nicht mit einem Server.

-(BOOL) needsUpdate{
    NSDictionary* infoDictionary = [[NSBundle mainBundle] infoDictionary];
    NSString* appID = infoDictionary[@"CFBundleIdentifier"];
    NSURL* url = [NSURL URLWithString:[NSString stringWithFormat:@"http://itunes.apple.com/lookup?bundleId=%@", appID]];
    NSData* data = [NSData dataWithContentsOfURL:url];
    NSDictionary* lookup = [NSJSONSerialization JSONObjectWithData:data options:0 error:nil];

    if ([lookup[@"resultCount"] integerValue] == 1){
        NSString* appStoreVersion = lookup[@"results"][0][@"version"];
        NSString* currentVersion = infoDictionary[@"CFBundleShortVersionString"];
        if (![appStoreVersion isEqualToString:currentVersion]){
            NSLog(@"Need to update [%@ != %@]", appStoreVersion, currentVersion);
            return YES;
        }
    }
    return NO;
}

In der:

if (![appStoreVersion isEqualToString:currentVersion]){
                NSLog(@"Need to update [%@ != %@]", appStoreVersion, currentVersion);
                return YES;
            }

Der Teil des Codes Sie einstellen, was Sie tun wollen, wenn es nicht gleich ist, das ist, wo Sie den Benutzer zum App Store senden, um die neueste Version herunterzuladen.

Sie können unter URL verwenden, um die Informationen von jeder App zu bekommen Sie müssen nur wissen Ihre Apple-ID Ihrer Anwendung.

Sie können diese Apple ID im itunesconnect.com bekommen> App> App Informationsseite

GET: http://itunes.apple.com/lookup?id=

Natürlich gibt es keine Möglichkeit. Der Benutzer sollte die Entscheidung treffen, wenn er will eine neuere Version der Anwendung oder nicht zum Download bereit.

Der App Store wird angezeigt, wenn es Versionen arenew, so dass ich glaube auch nicht, dass Apple dies zulassen. Auch weiß ich nicht, wie Sie dies tun würde? Man könnte es über eine Internetverbindung überprüfen, aber das ist nicht die Art und Weise von Apple mag, und so werden Sie keine Chance, dies zu tun.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top