iPhone 사용자에게 강제로 애플리케이션을 업그레이드하도록 할 수 있나요?

StackOverflow https://stackoverflow.com/questions/2221436

  •  19-09-2019
  •  | 
  •  

문제

iTunes Store에 내 응용 프로그램의 새 버전이 있으면 사용자에게 강제로 업그레이드하도록 할 수 있습니까?

나는 현재 응용 프로그램을 작성 중입니다.하지만 새로운 버전을 업로드할 때마다 강제로 업그레이드하고 싶은데, 업그레이드하면 더 많은 기능이 추가되고 이전 버전은 폐기하고 싶기 때문입니다.iPhone에서 기본적으로 이것이 가능합니까? 아니면 현재 버전을 확인하고 스토어와 비교하기 위해 직접 구현을 작성해야 합니까?

도움이 되었습니까?

해결책

시스템이 응용 프로그램의 업데이트를 처리하는 유일한 방법은 표준 AppStore 애플리케이션에서 업데이트를 사용할 수 있다고 사용자에게 프롬프트하는 것입니다.
또한 독립형 애플리케이션은 사용 가능한 업데이트를 알지 못하므로 응용 프로그램에서 현재 버전이 유효한지 확인할 수있는 웹 서비스를 구현해야합니다.
그리고 이것이 응용 프로그램에 대한 Apple 규칙을 준수하는지 확실하지 않습니다 (증거 링크를 찾을 수 없음) 응용 프로그램의 시험판을 업로드 할 수는 없습니다.

* 편집하다 *이 대답은 더 이상 사실이 아닙니다. 현재의 진실에 대한 다른 Upvoted 답변을 참조하십시오.

다른 팁

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

앱 ID를 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]];
    }
}

참고 : WebService를 호출하려면 JSONKIT 프레임 작업 및 ASIHTTP 프레임 작업이 필요합니다.

앱에 업데이트가 필요한지 감지 한 다음 사용자에게 업데이트를 사용할 수있는 것과 같은 사용자 정의 조치를 취할 수 있습니다. 다음은 업데이트를 사용할 수 있음을 감지하는 코드 스 니펫입니다.

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

절대적으로 필요한 경우, 사용자가 최신 버전을 얻을 수 있도록 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]];

이 질문은 원래 7 년 전에 게시되었으며 일부 답변은 관련성이 높지만 여기에보다 최신 접근 방식이 있습니다.

추천합니다 https://github.com/artsabintsev/siren Swift 3 호환성이며 코코아포 또는 카르타고와 함께 설치할 수 있습니다.

Cocoapods, Swift 3 지원 :

pod 'Siren'

카르타고 :

github "ArtSabintsev/Siren"

강제 업그레이드를위한 시스템 ~해야 한다 해당 응용 프로그램 외부에 의존하는 모든 애플리케이션의 일부가 되십시오. Apple과 Google은 앱이 외부에서 무언가를 사용한다면 외부 API가 영원히 살거나 절대 변하지 않아야한다고 주장하지만 그것은 단순히 비현실적입니다. 그리고 그 경우 앱이 의존하는 서비스가 변경 될 수 있다면 거기에 해야 하다 앱이 기능을 제한 해야하는지 확인하고 확인하고 사용자가 최신 버전을 얻도록 프롬프트하는 방법이되거나 사물이 단순히 신비롭게 실패하게됩니다.

이것은 Apple과 Google이 제공하는 것이 될 수 있지만 몇 가지 게임 이외의 모든 앱이이를 구축 해야하는 것은 아닙니다.

이 문제에 대한 솔루션을 만들기 위해 Rails 기반 오픈 소스 (Apache 2.0) 프로젝트를 시작했습니다. 이를 Application- [CTRL]이라고하며, 진행중인 작업이지만 사용하는 것이 좋습니다. 모든 종류의 기여를 환영합니다. 여가 시간에 이것을 확보하고 실행할 수 있다면 모든 앱 개발자에게 매우 합리적인 수준의 무료 서비스를 제공 할 수 있으며 물론 모든 회사는 항상 자체 배포를 회전시킬 수 있습니다.

여기 Github에 있습니다. https://github.com/slalomdigital/applicationctrl

기여 하고이 문제를 잘 해결하도록 도와주세요!

자동화 된 방법이 없으므로 수동으로 무언가를 써야합니다.

비즈니스/디자인 계획에는 "사용자에게 강제"라는 문구가 포함되어야합니다. 사람들은 당신이 무언가를 할 때 화를냅니다. 어느 날 아침에 당신의 멋진 작은 앱을 엽니다는 서둘러 사용자가 당신이 그가 필요한 것에 앱을 사용하기 전에 업그레이드를 강요한다는 것을 알게된다고 상상해보십시오. 그가 다운로드하기 위해 Edge를 사용해야하는 야생에 갇혀 있다고 상상해보십시오. 그는 행복하지 않을 것입니다.

이 계획을 오랫동안 따르면 업그레이드 중 하나가 필연적으로 눈에 띄는 버그를 도입합니다. 사용자가 버기 버전을 사용하도록 강요하면 반역됩니다.

나는 새로운 버전의 소프트웨어를 설명하는 데 사용되는 "더 많은 기능"을 볼 때마다 충돌하는 경험에 의해 조절되었습니다. 왜냐하면 이것은 필연적으로 기능이 부풀어 오르기 때문입니다. 디자이너는 하나의 앱이 모든 것을 수행 할 때까지 점점 더 많은 기능을 앱에 계속 접목하는 경향이 있습니다. 이것은 아이폰과 같은 플랫폼에서 특히 위험합니다. 하나의 앱이 많은 일을하는 것이 앱의 인터페이스와 응답 성을 빠르게 압도합니다.

edit01 : 여기 내 의견 사용자가 업그레이드 비용을 지불 한 후 응용 프로그램 업데이트 방법 계획과 관련이있을 수도 있습니다. 업그레이드 디자인이 수익 루프에서 Apple을 절단하면 별이 아닌 것입니다.

업데이트:

아래의 의견을 바탕으로 명확히하기 위해 : 예, 때로는 사용자가 업그레이드 해야하는 경우가 있습니다. 그러나 그것은 매우 다릅니다 설계출발점에서 개발자가 새 버전을 출시 할 때마다 사용자가 업그레이드하도록 강요합니다.

이러한 디자인은 개발자의 삶을 쉽게 사용자가 아닌 쉽게 만들기위한 것입니다. 사용자가 요청하지 않았고 원하지 않는 혜택을 위해 업그레이드하는 데 시간을 소비해야 할 때마다 고객으로부터 시간과 리소스를 가져갔습니다. 사람들이 궁극적으로 자신의 이익을 위해 소프트웨어를 구매하기 때문에 개발자의 시간과 노력을 오프로드하는 시간과 노력은 나쁜 디자인입니다. 그 혜택을 줄이면 소프트웨어 궁극적 인 수익성이 줄어 듭니다.

따라서 어떤 디자이너도 사용자가 절대적인 기술적 필요성이 아니라면 사용자가 원하는 작업을 수행하도록 강요하는 소프트웨어를 설계해서는 안됩니다. 이것은 물론 경험의 규칙이지만 아주 좋은 것입니다.

App Store에 대한 앱 업데이트는 이러한 이유로 정확히 거부되었습니다. 현재 릴리스에 대해 설치된 버전을 확인하는 기능을 추가했으며 지원되는 버전이 아닌 경우 업데이트를 강요합니다.

애플은 이것을 거부했다.

그래서 디자인 보드로 돌아갑니다!

다른 답변은 강제 업데이트 기능을 직접 구현해야 함을 나타냅니다.정말 안타깝지만 그렇지 않았으면 좋겠습니다.iOS 애플리케이션에 대한 첫 번째 업데이트는 내일 출시 될 예정이며 다행히도 앱 만 변경 했으므로 문제가되지 않습니다.그러나 WebServices의 구조를 결국 변경하면 서버가 각 앱 버전을 지원할 필요가 없도록 업데이트를 강요 할 수있는 것이 정말 유용 할 것입니다.

하지만 강제 업데이트에 대한 대안이 있는데, 이 스레드에서는 언급되지 않은 것 같습니다.데이터를 생성하는 모든 웹 서비스 호출을 데이터에 첨부하여 데이터에 스키마를 첨부 할 수 있습니다. 이는 앱에서 해당 데이터가 앱에서 어떻게 변하는지를 알려줍니다.이를 통해 앱에서 역직렬화를 중단하지 않고도 get-request로 생성된 데이터의 구조를 변경할 수 있습니다.물론 이것은 여러분이 작성한 인터프리터가 자체적으로 변경되지 않을 것이라고 가정하지만, 이는 인터프리터가 성숙되었을 때 적용할 수 있는 다소 합리적인 가정입니다.

게시물 요청은 상호작용을 통해 "스키마화"될 수 있습니다.즉, 모든 사후 요청 전에 최신 웹 서비스를 호출하는 방법에 대한 지침을 요청한다는 의미입니다.첨부된 스키마를 사용하여 지침을 처리한 다음 웹 서비스를 실제로 호출합니다.본질적으로 이는 모든 게시물 요청에 2개의 요청이 필요하다는 것을 의미하지만 괜찮을 수 있습니다.

그러나 강제 업데이트나 스키마 해석을 구현하더라도 앱이 App Store에 출시되는 첫날부터 해당 기능이 앱에 있어야 합니다.그렇지 않으면 당신도 같은 혼란에 빠지게 됩니다.Apple이 개발자를 위해 강제 업데이트를 구현했다면 이러한 모든 복잡성은 불필요할 것입니다.강제 업데이트가 존재하는 경우 스키마 해석은 여전히 ​​유용성이 향상됩니다.하지만 Apple이 강제 업데이트를 하지 않는다는 점이 조금 아쉽습니다. 적어도 이를 통해 앱이 출시된 후 자체 중단 방지 업데이트 조치를 도입할 수 있기 때문입니다.

안녕하세요, 미래에 누군가를 위해 누군가를 도울 수있는이 튜토리얼을 찾았습니다.

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

코드의 일부는 동일하지 않은 경우하고 싶은 일을 설정합니다. 이곳은 사용자를 App Store로 보내 최신 버전을 다운로드합니다.

아래 URL을 사용하여 앱의 Apple ID를 알고있는 앱의 정보를 얻을 수 있습니다.

이 Apple ID를 얻을 수 있습니다 itunesconnect.com> 앱> 앱 정보 페이지

가져 오기: http://itunes.apple.com/lookup?id=

물론 방법은 없습니다. 사용자는 최신 버전의 응용 프로그램을 다운로드하려는 경우 결정을 내려야합니다.

AppStore는 경기장 버전이 있으면 표시되므로 Apple이이를 허용한다고 생각하지 않습니다. 또한 나는 당신이 어떻게 이것을할지 모르겠습니까? 인터넷 연결을 통해 확인할 수는 있지만 Apple이 좋아하는 방식이 아니므로이를 수행 할 기회가 없습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top