14

こんにちは、最近、最初のエンタープライズ アプリを開発しました。「社内」オプションを使用して配布証明書を作成しています。クライアントはまだアプリを使用していません。しかし、彼はすぐにそれを使用します。そんな中、質問を受けました。彼はアプリを使用し、将来、私たちの側からアプリに更新がある場合は、クライアントにも彼の側で更新してもらいたいと考えています。今のように、私は自分の iPhone にアプリをインストールしています。XYZ アプリが更新されたという通知を AppStore から受け取りました。だから私はアップデートをインストールします。クライアントがアプリを使用していて、そこにデータを保存している場合 (私たちのアプリはコアデータを使用し、クライアントがデバイスにデータを保存できるように構築しました)、インストールする更新を彼に送信したいと考えています。更新しますが、既存のクライアント データは消去しません。それは可能ですか?どうすればいいですか?私は現在、アプリをインストールするために無線インストールを使用しています。.ipa および .plist ファイルが存在する安全なサーバーがあり、ダウンロード HTML ページがあります。クライアントがリンクをクリックすると、アプリがインストールされます。さらに情報が必要な場合はお知らせください。ありがとう。

4

5 に答える 5

27

はい、可能です。エンタープライズアプリケーションをデプロイするときは、アプリケーションに関するメタデータを含むplistが必要です。このメタデータには、更新の確認に使用できるバージョン番号が含まれています。

BOOL updateAvailable = NO;
NSDictionary *updateDictionary = [NSDictionary dictionaryWithContentsOfURL:
                                  [NSURL URLWithString:@"http://www.example.com/pathToPlist"]];

if(updateDictionary)
{
    NSArray *items = [updateDictionary objectForKey:@"items"];
    NSDictionary *itemDict = [items lastObject];

    NSDictionary *metaData = [itemDict objectForKey:@"metadata"];
    NSString *newversion = [metaData valueForKey:@"bundle-version"];
    NSString *currentversion = [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleVersion"];

    updateAvailable = [newversion compare:currentversion options:NSNumericSearch] == NSOrderedDescending;
}

アップデートが利用可能であることを検出したら、ユーザーをダウンロードURLに移動します

itms-services://?action=download-manifest&url=<url-path-to-plist>

また、既存のバージョンの上にインストールされ、すべてのデータがそのまま残り、自動移行をセットアップして変更を加えると、CoreDataデータベースがアップグレードされます。

于 2012-12-04T20:20:32.367 に答える
6

素晴らしい反応をしてくれたジョーに感謝します。これは、swift に翻訳された拡張バージョンです。viewDidLoadメインのView Controllerの中に入れることができます

let plistUrl = "https://example.com/example.plist"
let installationUrl = "itms-services://?action=download-manifest&amp;url=https://example.com/example.plist"


override func viewDidLoad() {
    super.viewDidLoad()

    //Check for the updates        
    checkForUpdates()
}

func checkForUpdates() {
    let qualityOfServiceClass = QOS_CLASS_BACKGROUND
    let backgroundQueue = dispatch_get_global_queue(qualityOfServiceClass, 0)
    dispatch_async(backgroundQueue, {
        let updateDictionary = NSDictionary(contentsOfURL: NSURL(string: self.plistUrl)!)!

        let items = updateDictionary["items"]
        let itemDict = items?.lastObject as! NSDictionary
        let metaData = itemDict["metadata"] as! NSDictionary
        let serverVersion = metaData["bundle-version"] as! String
        let localVersion = NSBundle.mainBundle().infoDictionary!["CFBundleVersion"] as! String
        let updateAvailable = serverVersion.compare(localVersion, options: .NumericSearch) == .OrderedDescending;

        if updateAvailable {
            self.showUpdateDialog(serverVersion)
        }
    })
}

func showUpdateDialog(serverVersion: String) {
    dispatch_async(dispatch_get_main_queue(), { () -> Void in
        let alertController = UIAlertController(title: "New version of Example available!", message:
            "Example \(serverVersion) has been released. Would you like to download it now?", preferredStyle: UIAlertControllerStyle.Alert)
        alertController.addAction(UIAlertAction(title: "Not now", style: .Cancel,handler: nil))
        alertController.addAction(UIAlertAction(title: "Update", style: .Default, handler: { (UIAlertAction) in
            UIApplication.sharedApplication().openURL(NSURL(string: self.installationUrl)!)
        }))

        self.presentViewController(alertController, animated: true, completion: nil)
    })
}
于 2016-04-01T23:37:14.730 に答える
1

元の配布と同じ方法で更新を配布するだけです。ユーザーは以前のバージョンのデータを保持します。

于 2012-12-04T20:17:58.967 に答える