iOS应用更新通知

33

iOS 应用更新机制是如何工作的?如何告知用户应用在 Appstore 上已经更新了?我是否需要在代码中编写功能来显示更新的弹出窗口,或者由 Appstore 处理以向用户显示应用已更新的通知?苹果有没有提供相关的文档说明?


你指的是哪个“更新弹出框”?通常情况下,iOS会在App Store应用中提供更新,并显示一个通知标记,表示有多少个应用程序需要更新。 - Greg Hewgill
苹果公司有提供相关文档吗? - Prerna chavan
2
不。唯一通知用户更新的方法,就是在您的应用程序获得新版本批准后手动通过APNS发送某种类型的通知。 - CodaFi
但是当设备与Appstore同步时,设备上的应用程序会显示一个徽章,表示有可用的应用程序更新。 - Prerna chavan
你所看到的行为是特定于该应用程序的,而不是标准iOS行为的一部分。 - Greg Hewgill
APNS可以工作,或者您可以有一个服务向服务器请求最新版本并将其与运行版本进行比较(可以访问https://dev59.com/aHRB5IYBdhLWcg3w9Lvn上的答案)。 - Ege Akpinar
3个回答

29
  1. 苹果提供了一个现有的API,可以从App Store获取您的应用程序的最新信息:http://itunes.apple.com/jp/lookup/?id=app_id

例如: http://itunes.apple.com/jp/lookup/?id=1005582646

美国应用程序的示例:http://itunes.apple.com/lookup/?id=myAppIDNumberFromTheAppStore

请注意,这与App Store Connect API是分开的。如果您使用它,您需要在发出请求之前生成一个令牌。请先查阅API文档,否则您将收到空结果的响应。

https://developer.apple.com/documentation/appstoreconnectapi

https://developer.apple.com/documentation/appstoreconnectapi/generating_tokens_for_api_requests

iTunes API的响应中有一个"version"字段,它位于"results"字段内部。它包含了App Store上最新版本的版本号。

AppDelegate->didFinishLaunchingWithOptions中,你可以调用上述API。

  1. 获取用户设备上当前版本的方法:

Obj-C。

NSString *currentAppVersion = [[[NSBundle mainBundle]
    infoDictionary] objectForKey:@"CFBundleShortVersionString"];

Swift (4.2)

var currentAppVersion = Bundle.main.infoDictionary?["CFBundleShortVersionString"] as? String

现在,您可以比较版本号1和2,当App Store上有更新的应用程序时向用户显示警报或通知。


如何进行测试? - sasi kumar
请分享所有应用商店API的链接。 - Ammaiappan

29

您可以使用Harpy模块:当App Store上有新版本可用时,此模块会触发一个UIAlertView。

Harpy已被弃用。Siren从Harpy中移植而来,由相同的开发者维护SirenHarpy。截至2018年12月,为了使用更好的Siren,已经弃用了Harpy。


2
我在一个应用程序中使用它,我对它感到满意。 - MartinMoizard
1
如何在提交应用到苹果商店之前测试Harpy? - Ganesh G
5
请将您的应用程序在Xcode中的版本更改为低于App Store中的版本。如果App Store中是1.0.2版本,则将您的应用程序版本更改为1.0.1并构建+运行您的应用程序。如果出现警报,则说明它有效。现在,您可以将版本更改回在发布应用程序之前的任何版本。 - ArtSabintsev
2
使用Siren来实现Harpy的Swift版本,同一开发者。 - kareem

1
你可以在这里找到解决方案。将此函数编写在你的主页视图控制器中。
func viewDidLoad()
{
    DispatchQueue.global().async {
        do {
            let update = try self.isUpdateAvailable()
            DispatchQueue.main.async {
                if update{
                    self.popupUpdateDialogue();
                    //you can show a popup to notify the user
                }
            }
        } catch {
            print(error)
        }
    }
}

func isUpdateAvailable() throws -> Bool {
    guard let info = Bundle.main.infoDictionary,
          let currentVersion = info["CFBundleShortVersionString"] as? String,
          let identifier = info["CFBundleIdentifier"] as? String,
          let url = URL(string: "http://itunes.apple.com/lookup?bundleId=\(identifier)") else {
        throw VersionError.invalidBundleInfo
    }
    let data = try Data(contentsOf: url)
    guard let json = try JSONSerialization.jsonObject(with: data, options: [.allowFragments]) as? [String: Any] else {
        throw VersionError.invalidResponse
    }
    if let result = (json["results"] as? [Any])?.first as? [String: Any], let version = result["version"] as? String {
        appStoreVersion = version
        return version != currentVersion
    }
    throw VersionError.invalidResponse
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接