Подтвердить что ты не робот

Могу ли я заставить пользователя iPhone обновить приложение?

Возможно ли заставить пользователя обновиться после появления новой версии моего приложения в магазине iTunes?

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

4b9b3361

Ответ 1

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

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

Ответ 2

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

        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.

Ответ 3

Если вам абсолютно необходимо, вы можете запустить 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]];

Ответ 4

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

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

Ответ 5

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

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

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

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

Update:

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

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

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

Ответ 6

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

Ответ 7

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

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

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

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

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

Ответ 8

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

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

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

pod 'Siren'

Карфаген:

github "ArtSabintsev/Siren"

Ответ 9

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

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

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

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

Ответ 10

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

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

Итак, вернитесь к дизайну!

Ответ 11

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

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

Изменить (ваш код будет выглядеть примерно так, как показано ниже):

// 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
    }
}

Однако после дальнейших исследований я нашел, что это отличное решение, если вы не используете сервер.

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

В:

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

Порция кода, который вы устанавливаете, что вы хотите сделать, если он не равен, здесь вы отправляете пользователя в хранилище приложений для загрузки последней версии.

Ответ 12

Вы можете использовать нижеприведенный URL для получения информации о любом приложении Вы просто знаете свой Apple ID своего приложения.

Вы можете получить этот Apple ID на странице сведений о приложении itunesconnect.com > ваше приложение >

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

Ответ 13

Конечно, нет способа. Пользователь должен принять решение, хочет ли он загрузить новую версию вашего приложения или нет.

AppStore покажет, существуют ли новые версии, поэтому я также не думаю, что Apple это разрешит. Также я не знаю, как вы это сделаете? Вы можете проверить это через интернет-соединение, но это не так, как нравится Apple, и поэтому у вас не будет возможности это сделать.