Могу ли я заставить пользователя iPhone обновить приложение? - PullRequest
45 голосов
/ 08 февраля 2010

Можно ли заставить пользователя выполнить обновление, когда в iTunes Store появится новая версия моего приложения?

В настоящее время я работаю над приложением. Однако я хочу принудительно обновлять каждый раз, когда загружаю более новую версию, потому что в обновлении будет больше возможностей, и я хочу отказаться от предыдущей версии. Возможно ли это по умолчанию для iPhone или мне нужно написать собственную реализацию, чтобы проверить текущую версию и сравнить ее с магазином?

Ответы [ 13 ]

36 голосов
/ 24 января 2012

Я сделал эту функцию, получив версию из веб-сервиса itunes и сравнив ее с текущей версией. Ниже приведен мой код

        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];
        }

И поместите идентификатор приложения в ссылку itunes, см. Код ниже.

- (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]];
    }
}

Примечание. Для выполнения вызовов веб-службы требуется работа с фреймом JSONKit и работа с фреймом ASIHttp.

22 голосов
/ 08 августа 2014

Вы можете определить, требуется ли обновлению приложение, а затем предпринять некоторые пользовательские действия, такие как оповещение пользователя, что обновление доступно. Вот фрагмент кода, который обнаруживает, что доступно обновление.

-(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;
}
18 голосов
/ 01 сентября 2010

Если вам абсолютно необходимо, вы можете запустить App Store, чтобы ваши пользователи могли получить последнюю версию оттуда. Я бы рекомендовал сделать это необязательным или, по крайней мере, сначала представить диалог.

// 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]];
11 голосов
/ 12 апреля 2017

Этот вопрос был первоначально опубликован 7 лет назад, и хотя некоторые ответы остаются актуальными, здесь используется более современный подход.

Я рекомендую https://github.com/ArtSabintsev/Siren, который совместим с Swift 3 и может быть установлен с Cocoapods или Carthage.

CocoaPods, поддержка Swift 3:

pod 'Siren'

Карфаген:

github "ArtSabintsev/Siren"

6 голосов
/ 23 апреля 2013

Система принудительного обновления должна быть частью каждого приложения, которое зависит от чего-то внешнего для этого приложения. И Apple, и Google утверждают, что если приложение использует что-то внешнее, то этот внешний API должен жить вечно, никогда не изменяться и т. Д., И т. Д., Но это просто нереально. И если это так, то если сервисы, от которых зависит приложение, могут измениться, то ДОЛЖЕН быть способом для приложения проверить и посмотреть, должно ли оно ограничивать функциональность и предложить пользователю получить последнюю версию или все просто загадочно провалится.

Это может и должно быть что-то, что Apple и Google предоставляют, но им не нужно, чтобы каждое приложение, кроме нескольких игр, создавало это, ТАК ...

Я начал проект с открытым исходным кодом (Apache 2.0) на основе рельсов, чтобы создать решение этой проблемы. Он называется Application- [Ctrl], и он в значительной степени находится в стадии разработки, но вы можете использовать его, и я приветствую вклад любого рода. Если я смогу запустить его в свое свободное время, я предоставлю это всем разработчикам приложений с весьма разумным уровнем бесплатного обслуживания, и, конечно, каждая компания всегда сможет ускорить собственное развертывание.

Это здесь, на GitHub: https://github.com/SlalomDigital/ApplicationCtrl

Внесите свой вклад и помогите мне решить эту проблему навсегда!

6 голосов
/ 08 февраля 2010

Единственный способ, которым система обрабатывает обновления вашего приложения, - это подсказывать пользователю, что обновление доступно в стандартном приложении AppStore.
Кроме того, автономное приложение не знает о доступных обновлениях, поэтому вам необходимо внедрить веб-службу, где приложение может проверить, действительна ли текущая версия.
И я не уверен, что это соответствует правилам Apple для приложений, например, (вы не можете найти пробную ссылку) вы не можете загрузить пробные версии для приложения.

* РЕДАКТИРОВАТЬ * Этот ответ больше не соответствует действительности. См. Другие ответы с голосами за текущую правду.

5 голосов
/ 08 февраля 2010

Нет автоматизированного способа сделать это, вам придется написать что-то вручную.

4 голосов
/ 01 марта 2017

Мое обновление приложения в магазине приложений было отклонено именно по этой причине. Мы добавили функцию для проверки установленной версии на соответствие текущей версии, и если она не поддерживается, мы заставляем их обновить

Apple это отвергла.

Итак, вернемся к доске объявлений!

4 голосов
/ 01 августа 2015

Другие ответы указывают на то, что необходимо самостоятельно реализовать функцию принудительного обновления. Это действительно позор, я бы хотел, чтобы это было не так. Мое самое первое обновление для iOS-приложения должно быть выпущено завтра, и к счастью это не будет проблемой, поскольку мы только внесли изменения в приложение. Однако когда мы в конечном итоге изменим структуру наших веб-сервисов, было бы очень полезно иметь возможность принудительного обновления, чтобы наш сервер не поддерживал каждую версию приложения.

Однако существует альтернатива принудительным обновлениям, которая, кажется, не упоминается в этой теме. Вы могли бы иметь каждый вызов веб-службы, который производит данные, присоединить схему к данным, который сообщает приложению, как эти данные должны быть десериализованы в вашем приложении. Это позволяет изменять структуру данных, создаваемых запросами get, не нарушая десериализацию в приложении. Конечно, это предполагает, что интерпретатор, который вы пишете, сам по себе не изменится, но это несколько разумное предположение, которое нужно сделать, когда он повзрослеет.

Запросы на отправку могут быть "обработаны схемой" посредством взаимодействия. Под этим я подразумеваю, что перед каждым пост-запросом вы запрашиваете инструкции о том, как позвонить в актуальный веб-сервис. Вы обрабатываете инструкции, используя для этого прикрепленную схему, а затем делаете фактический вызов веб-службы. По сути это означает, что на каждый почтовый запрос требуется 2 запроса, но это может быть нормально.

Однако, независимо от того, реализуете ли вы принудительное обновление или интерпретацию схемы, функциональность должна присутствовать в приложении с первого дня, когда оно попадает в App Store. В противном случае вы в том же беспорядке. Вся эта сложность была бы ненужной, если бы Apple внедрила принудительное обновление для нас, разработчиков. Интерпретация схемы все равно будет улучшением юзабилити, если существует принудительное обновление. Но меня немного беспокоит, что у Apple нет принудительного обновления, потому что, по крайней мере, с его помощью можно было бы внедрить собственные меры по обновлению после прерывания после выпуска приложения.

4 голосов
/ 08 февраля 2010

Ваш бизнес / дизайн-план никогда не должен содержать фразу «заставить пользователя». Люди злятся, когда ты заставляешь их что-то делать. Представьте себе спешащего пользователя, который однажды утром открывает ваше изящное маленькое приложение и обнаруживает, что вы заставляете его обновиться, прежде чем он сможет использовать приложение для своих нужд. Представьте, что он застрял в дебрях, используя Edge для загрузки. Он не будет счастлив.

Если вы будете следовать этому плану достаточно долго, одно из ваших обновлений неизбежно приведет к заметной ошибке. Если вы заставите пользователей использовать версию с ошибками, они будут бунтовать.

Опыт заставил меня сжиматься всякий раз, когда я вижу «больше возможностей», используемых для описания новой версии программного обеспечения, потому что это неизбежно означает раздувание функций. Дизайнеры, как правило, продолжают внедрять все больше и больше функций в приложения, пока одно приложение не сделает все. Это особенно опасно на такой платформе, как iPhone, когда создание одного приложения для многих вещей быстро перевешивает интерфейс и отзывчивость приложения.

Edit01: Мой комментарий здесь Как обновить приложение после того, как пользователи заплатят за обновление также может иметь отношение к вашим планам. Если ваш дизайн апгрейда исключает Apple из цикла получения дохода, это не является началом.

Обновление:

Просто чтобы уточнить на основе комментария ниже: Да, иногда вам нужно требовать обновления пользователей. Однако это сильно отличается от проектирования приложения с самого начала , чтобы заставить пользователей обновляться каждый раз, когда разработчик выпускает новую версию ,

Такой дизайн предназначен для облегчения жизни разработчика, а не пользователя. Каждый раз, когда пользователю приходится тратить время на обновление для получения выгоды, которую он не просил и, возможно, не хочет, вы тратите время и ресурсы у клиента. Дизайн, который тратит время и усилия от разработчика на пользователя, является плохим дизайном, потому что люди в конечном итоге покупают программное обеспечение для своей выгоды. Когда вы уменьшаете эту выгоду, вы уменьшаете максимальную прибыльность программного обеспечения.

Таким образом, ни один дизайнер не должен разрабатывать программное обеспечение, которое заставляет пользователей делать то, что пользователь не желает, если это не является абсолютной технической необходимостью. Это, конечно, эмпирическое правило, но оно очень хорошее.

...