一旦iTunes Store中有我的应用程序的新版本,是否可以强制用户升级?
我目前正在申请一个申请.但是,我想在上传新版本时强制升级,因为升级会有更多功能,我想放弃以前的版本.这是默认使用iPhone的可能吗?还是我必须编写自己的实现来检查当前版本并将其与商店进行比较?
我通过从itunes webservice获取版本并与当前版本进行比较来完成此功能.以下是我的代码
NSString *version = @""; NSURL *url = [NSURL URLWithString:@"http://itunes.apple.com/lookup?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=&mt=8"; [[UIApplication sharedApplication] openURL:[NSURL URLWithString:iTunesLink]]; } }
注意:您需要JSONKit框架工作和ASIHttp框架工作来进行Web服务调用.
您可以检测应用程序是否需要更新,然后执行一些自定义操作,例如提醒用户更新可用.以下是检测到更新可用的代码段.
-(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或Carthage一起安装.
CocoaPods,Swift 3支持:
pod 'Siren'
迦太基:
github "ArtSabintsev/Siren"
系统处理应用程序更新的唯一方法是提示用户该更新在标准AppStore应用程序中可用。
另外,独立应用程序不知道可用的更新,因此您需要实现Web服务,应用程序可以在其中检查当前版本是否有效。
而且我不确定这是否符合Apple关于应用程序的规则,例如(虽然找不到证明链接)您不能上载应用程序的试用版。
*编辑* 此答案不再正确。有关当前的真相,请参见其他获批的答案。
用于强制升级的系统应该是每个应用程序的一部分,这些应用程序依赖于该应用程序外部的某些内容.苹果和谷歌都声称,如果一个应用程序使用外部的东西,那么外部API应该永远存在,永远不会改变,等等,但这是不切实际的.如果是这种情况,如果应用程序所依赖的服务可能会发生变化,那么必须有一种方法让应用程序检查并查看它是否应该限制功能并提示用户获取最新版本,否则事情就会神秘地失败.
这可能也应该是苹果和谷歌提供的东西,但他们并不是这样,除了几个游戏之外的每个应用程序都需要构建这个,所以......
我已经开始了一个基于rails的开源(Apache 2.0)项目来创建这个问题的解决方案.它被称为Application- [Ctrl],它正在进行中,但欢迎您使用它,我欢迎任何形式的贡献.如果我可以在业余时间启动并运行,我会向所有应用程序开发人员提供一些非常合理的免费服务,当然每家公司都能够自行部署它.
它在GitHub上:https://github.com/SlalomDigital/ApplicationCtrl
贡献并帮助我解决这个问题!
没有自动的方法,您必须手动编写一些内容。
您的业务/设计计划中绝不能包含“强迫用户”一词。人们让你做某事时会生气。想象一下一个有急的用户一天早晨打开您漂亮的小应用程序,却发现您在强迫他升级之前,他才可以使用该应用程序满足他的需求。想象一下,他不得不使用Edge下载而无所适从。他不会幸福的。
如果您遵守此计划的时间足够长,那么其中一项升级将不可避免地引入一个明显的错误。如果您强迫用户使用越野车版本,他们会反叛。
每当我看到用来描述软件新版本的“更多功能”时,我都会受经验的束缚,因为这不可避免地意味着功能膨胀。设计师倾向于将越来越多的功能嫁接到应用程序上,直到一个应用程序完成所有工作为止。在像iPhone这样的平台上,这特别危险,在该平台上,使一个应用程序执行很多事情会迅速淹没该应用程序的界面和响应能力。
Edit01:我的评论这里用户支付升级费用后如何更新应用程序也可能与您的计划有关。如果您的升级设计使Apple脱离了收入循环,那么它就是一个入门者。
更新:
只是基于以下评论进行澄清:是的,有时您确实需要要求用户升级。但是,这与从一开始就设计应用程序以强迫用户在开发人员每次发布新版本时进行升级都大不相同。
这种设计旨在简化开发人员的生活,而不是简化用户的生活。每次用户不得不花时间升级以获得他们不希望甚至不想得到的好处时,您就从客户那里获取了时间和资源。将开发人员的时间和精力转移给用户的设计是糟糕的设计,因为人们最终为了自己的利益而购买软件。当您减少收益时,就会降低软件的最终获利能力。
因此,除非是绝对的技术必要性,否则任何设计人员都不应设计强迫用户执行用户不希望做的事情的软件。这当然是一个经验法则,但这是一个很好的法则。
正是由于这个原因,我对App Store的应用更新刚刚被拒绝。我们添加了一项功能,可根据当前版本检查已安装的版本,如果它不是受支持的版本,则会强制其进行更新。
苹果对此表示拒绝。
回到设计板!