62

私のアプリケーションの新しいバージョンが iTunes Store で利用可能になったら、ユーザーにアップグレードを強制することはできますか?

私は現在、アプリケーションに取り組んでいます。ただし、新しいバージョンをアップロードするたびに強制的にアップグレードしたいと考えています。アップグレードにはより多くの機能があり、以前のバージョンを破棄したいからです。これは iPhone のデフォルトで可能ですか、それとも現在のバージョンを確認してストアと比較するために独自の実装を作成する必要がありますか?

4

16 に答える 16

38

itunes Webサービスからバージョンを取得し、現在のバージョンと比較することで、この機能を実行しました。以下は私のコードです。

        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リンクにアプリIDを入れてください。以下のコードを参照してください。

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

注:Webサービス呼び出しを行うには、JSONKitフレーム作業とASIHttpフレーム作業が必要です。

于 2012-01-24T14:11:54.570 に答える
22

アプリの更新が必要かどうかを検出し、更新が利用可能であることをユーザーに警告するなどのカスタム アクションを実行できます。更新が利用可能であることを検出するコード スニペットを次に示します。

-(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;
}
于 2014-08-08T18:34:56.750 に答える
17

どうしても必要な場合は、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]];
于 2010-08-31T20:14:36.953 に答える
15

この質問はもともと7年前に投稿されたもので、回答の一部は依然として関連していますが、より最新のアプローチがあります.

Swift 3 と互換性があり、Cocoapods または Carthage でインストールできるhttps://github.com/ArtSabintsev/Sirenをお勧めします。

CocoaPods、Swift 3 のサポート:

pod 'Siren'

カルタゴ:

github "ArtSabintsev/Siren"

于 2017-04-12T11:21:57.437 に答える
8

それを自動化する方法はありません。手動で何かを書く必要があります。

于 2010-02-08T12:18:18.183 に答える
8

システムがアプリケーションの更新を処理する唯一の方法は、標準の AppStore アプリケーションで更新が利用可能であることをユーザーに確認することです。
また、スタンドアロン アプリケーションは利用可能な更新を認識しないため、アプリケーションが現在のバージョンが有効かどうかを確認できる Web サービスを実装する必要があります。
また、これがアプリケーションに関する Apple の規則に準拠しているかどうかはわかりません (ただし、証明リンクは見つかりません)、アプリケーションの試用版をアップロードすることはできません。

*編集* この答えはもはや真実ではありません。現在の真実については、他の支持された回答を参照してください。

于 2010-02-08T12:20:58.207 に答える
8

強制アップグレードのシステムは、そのアプリケーションの外部に依存するすべてのアプリケーションの一部である必要があります。Apple も Google も、アプリが外部のものを使用する場合、その外部 API は永久に存続し、変更されることはないと主張していますが、それは単に非現実的です。その場合、アプリが依存するサービスが変更される可能性がある場合、アプリが機能を制限し、ユーザーに最新バージョンを取得するように促す必要があるかどうかを確認する方法が必要です

これは、Apple と Google が提供するものである可能性があり、そうあるべきですが、いくつかのゲーム以外のすべてのアプリがこれを構築する必要があるわけではありません。

この問題の解決策を作成するために、Rails ベースのオープンソース (Apache 2.0) プロジェクトを開始しました。これは Application-[Ctrl] と呼ばれ、開発中の作業ですが、使用することは大歓迎です。また、あらゆる種類の貢献を歓迎します。空き時間にこれを起動して実行できる場合は、すべてのアプリ開発者に非常に妥当なレベルの無料サービスを提供します。もちろん、すべての企業は常に独自の展開をスピンアップできます.

GitHub にあります: https://github.com/SlalomDigital/ApplicationCtrl

貢献して、この問題を完全に解決するのを手伝ってください!

于 2013-04-22T22:59:22.110 に答える
4

ビジネス/設計計画には、「ユーザーに強制する」というフレーズを含めるべきではありません。何かをやらせると人は怒ります。ある朝、気の利いた小さなアプリを急いで開いたユーザーが、アプリを必要な用途に使用する前にアップグレードを強制していることに気付いたと想像してください。Edge を使用してダウンロードしなければならない荒野で立ち往生していると想像してください。彼は幸せではないでしょう。

この計画に十分長く従っていると、アップグレードの 1 つによって必ず目立つバグが発生します。バグのあるバージョンの使用をユーザーに強制すると、ユーザーは反抗します。

ソフトウェアの新しいバージョンを説明するために「より多くの機能」が使用されているのを見るたびに、私は経験によってうんざりするように条件付けられてきました。これは必然的に機能の肥大化を意味するからです。デザイナーは、1 つのアプリですべてが完了するまで、アプリにますます多くの機能を移植し続ける傾向があります。これは、iPhone のようなプラットフォームでは特に危険です。1 つのアプリに多くのことを実行させると、アプリのインターフェイスと応答性が急速に圧倒されます。

Edit01: 私のコメントはこちらユーザーがアップグレードの支払いを行った後にアプリケーションを更新する方法もあなたの計画に関連している可能性があります。アップグレードの設計によって Apple が収益ループから切り離された場合、それはスターターではありません。

アップデート:

以下のコメントに基づいて明確にするために: はい、ユーザーにアップグレードを要求する必要がある場合があります。ただし、それは、開発者が新しいバージョンをリリースするたびにユーザーにアップグレードを強制するように最初からアプリを設計することとは大きく異なります。

このような設計は、ユーザーではなく開発者の生活を楽にすることを目的としています。ユーザーが求めていない、またはおそらく望んでいないメリットのためにアップグレードに時間を費やさなければならないたびに、あなたは顧客から時間とリソースを奪っています。開発者からユーザーに時間と労力をオフロードする設計は悪い設計です。人々は最終的に自分の利益のためにソフトウェアを購入するからです。その利益を減らすと、ソフトウェアの最終的な収益性が低下します。

したがって、絶対的な技術的必要性がない限り、設計者は、ユーザーが望んでいないことをユーザーに強制するようなソフトウェアを設計すべきではありません。これはもちろん経験則ですが、非常に優れたルールです。

于 2010-02-08T13:14:51.530 に答える
4

他の回答は、強制更新機能を自分で実装する必要があることを示しています。本当に残念です、そうでなかったらいいのにと思います。iOS アプリケーションへの私の最初のアップデートは明日リリースされる予定ですが、アプリに変更を加えただけなので、幸いなことに問題はありません。ただし、最終的に Web サービスの構造を変更する場合、サーバーがすべてのアプリ バージョンをサポートする必要がないように、更新を強制できると非常に便利です。

ただし、このスレッドでは言及されていないように見える、強制更新の代替手段があります。データを生成するすべての Web サービス呼び出しにスキーマをデータにアタッチして、アプリでそのデータを逆シリアル化する方法をアプリに伝えることができます。これにより、アプリで逆シリアル化を中断することなく、get-request によって生成されたデータの構造を変更できます。もちろん、これはあなたが書いたインタプリタ自体は変更されないことを前提としていますが、それが成熟したときに行うのはある程度合理的な仮定です。

投稿リクエストは、対話を通じて「スキーマ化」できます。これは、ポストリクエストを行う前に、最新の Web サービスを呼び出す方法についての指示を求めることを意味します。そのために添付されたスキーマを使用して命令を処理してから、Web サービスを実際に呼び出します。基本的に、これはすべての投稿リクエストに 2 つのリクエストが必要であることを意味しますが、それでも問題ありません。

ただし、強制更新またはスキーマ解釈を実装する場合でも、App Store にヒットした初日から機能がアプリに存在する必要があります。そうでなければ、あなたは同じ混乱に陥っています。Apple が私たち開発者のために強制的な更新を実装した場合、このような複雑さはすべて不要になります。ただし、強制更新が存在する場合でも、スキーマの解釈は使いやすさの向上につながります。しかし、Apple がアップデートを強制していないのは少し気になる。

于 2015-08-01T16:04:57.260 に答える
1
func appUpdateAvailable() -> (Bool,String?) {
        
        guard let info = Bundle.main.infoDictionary,
              let identifier = info["CFBundleIdentifier"] as? String else {
            return (false,nil)
        }
        
//        let storeInfoURL: String = "http://itunes.apple.com/lookup?bundleId=\(identifier)&country=IN"
        let storeInfoURL:String = "https://itunes.apple.com/in/lookup?bundleId=\(identifier)"
        var upgradeAvailable = false
        var versionAvailable = ""
        // Get the main bundle of the app so that we can determine the app's version number
        let bundle = Bundle.main
        if let infoDictionary = bundle.infoDictionary {
            // The URL for this app on the iTunes store uses the Apple ID for the  This never changes, so it is a constant
            let urlOnAppStore = NSURL(string: storeInfoURL)
            if let dataInJSON = NSData(contentsOf: urlOnAppStore! as URL) {
                // Try to deserialize the JSON that we got
                if let dict: NSDictionary = try? JSONSerialization.jsonObject(with: dataInJSON as Data, options: JSONSerialization.ReadingOptions.allowFragments) as! [String: AnyObject] as NSDictionary? {
                    if let results:NSArray = dict["results"] as? NSArray {
                        if let version = (results[0] as! [String:Any])["version"] as? String {
                            // Get the version number of the current version installed on device
                            if let currentVersion = infoDictionary["CFBundleShortVersionString"] as? String {
                                // Check if they are the same. If not, an upgrade is available.
                                print("\(version)")
                                if version != currentVersion {
                                    upgradeAvailable = true
                                    versionAvailable = version
                                }
                            }
                        }
                    }
                }
            }
        }
        return (upgradeAvailable,versionAvailable)
    }
于 2021-08-16T11:20:17.810 に答える
-16

もちろん仕方がない。アプリケーションの新しいバージョンをダウンロードするかどうかは、ユーザーが決定する必要があります。

新しいバージョンがあれば AppStore に表示されるので、Apple もこれを許可しないと思います。また、あなたがこれをどのように行うのかわかりませんか?インターネット接続を介して確認することもできますが、それは Apple が好む方法ではないため、これを行う機会はありません。

于 2010-02-08T12:37:19.220 に答える