强制用户在 iOS 中以编程方式更新应用程序

Posted

技术标签:

【中文标题】强制用户在 iOS 中以编程方式更新应用程序【英文标题】:Force user to update the app programmatically in iOS 【发布时间】:2017-08-19 05:04:15 【问题描述】:

在我的 ios 应用中,我启用了强制应用更新功能。是这样的。

如果有严重的错误修复。在服务器中,我们正在设置新的发布版本。在启动画面中,我正在检查当前的应用程序版本,如果它低于服务版本,则会显示一条消息以更新应用程序。

我放了两个按钮“立即更新”、“稍后更新”

我有 2 个问题

    如果我现在点击。应用程序应该使用 UPDATE 按钮在应用商店中打开我的应用程序。目前我使用链接“http://appstore.com/mycompanynamepvtltd” 这会打开我公司应用程序的列表,但它有按钮 OPEN,而不是 UPDATE,即使我的应用程序有新的更新。更新页面的网址是什么?

    如果他单击“稍后更新”按钮,是否可以以编程方式关闭应用程序?这是否会导致我的应用在应用商店中被拒绝?

请帮我解决这两个问题

【问题讨论】:

在我看来,关闭应用程序的按钮并不是真正的“稍后”。如果我点击“稍后”,我希望该应用程序能够继续运行 如果用户没有安装强制更新版本,我想停止让用户使用该应用程序。最好的做法是什么?@Paulw11 不要以编程方式关闭应用程序。 Apple 可以拒绝该应用程序。它发生在我身上。更好的方法是不允许用户使用该应用程序。保留更新按钮。用户要么去应用商店,要么自行关闭应用。 @Amit 谢谢,你知道我应该使用什么链接来访问我在应用商店中的应用吗? 请查看此论坛:forums.developer.apple.com/thread/52767。它发生在很多人身上。在我的项目中,我将用户重定向到我们从应用商店下载应用的网站页面。这样,如果用户在应用商店中没有获得更新按钮,至少用户可以在 safari 中使用该网站。 【参考方案1】:

第 2 点:如果您不希望用户稍后更新,您应该只允许强制更新作为选项。以编程方式关闭应用程序不是正确的选择。

第 1 点:您可以为此目的使用一个好的库。

在 Swift 中的用法: Library

func applicationDidBecomeActive(application: UIApplication) 
    /* Perform daily (.daily) or weekly (.weekly) checks for new version of your app.
    Useful if user returns to your app from the background after extended period of time.
     Place in applicationDidBecomeActive(_:)*/

    Siren.shared.checkVersion(checkType: .daily)

在 Objective-C 中的使用: Library

-(void)applicationDidBecomeActive:(UIApplication *)application 
    // Perform daily check for new version of your app
    [[Harpy sharedInstance] checkVersionDaily];

它是如何工作的:它使用查找 api 返回应用程序详细信息,如 link,包括版本并进行比较。

例如,通过调用https://itunes.apple.com/lookup?id=284910350,通过 iTunes ID 查找 Yelp Software 应用程序

欲了解更多信息,请访问link

【讨论】:

这如何检查我的应用版本并重定向用户进行更新?【参考方案2】:

不要以编程方式关闭应用程序。 Apple 可以拒绝该应用程序。更好的方法是不允许用户使用该应用程序。保留更新按钮。用户要么去应用商店,要么自行关闭应用。

根据 Apple 的规定,您的应用不应自行终止。由于用户没有点击 Home 按钮,任何返回到 Home 屏幕的操作都会给用户留下您的应用程序崩溃的印象。这是令人困惑的非标准行为,应该避免。

请查看此论坛:

https://forums.developer.apple.com/thread/52767。

这发生在很多人身上。在我的项目中,我将用户重定向到我们从应用商店下载应用的网站页面。这样,如果用户在应用商店中没有得到更新按钮,至少用户可以在 safari 中使用该网站。

【讨论】:

【参考方案3】:

具体回答您的问题:

    使用此 URL 在应用商店中直接打开您的应用: https://apps.apple.com/app/id########## 其中########## 是您应用的 10 位数字 ID。您可以在 App Store Connect 的 App Information 部分下找到该 ID。它被称为“Apple ID”。 如果我的应用程序变得过时以至于不能再对从服务器接收的数据采取行动,我实际上已经在我的应用程序中内置了终止功能(我的应用程序是一个需要连接到我的 Web 服务的信息应用程序)。经过几年的十几次更新后,我的应用程序并没有因为具有此功能而被拒绝,尽管该功能从未被调用过。我将切换到静态消息而不是终止应用,只是为了安全起见,以免将来的更新被拒绝。

我发现审稿过程至少有些主观,不同的审稿人可能会关注不同的事情,而拒绝以前被多次忽视的事情。

【讨论】:

【参考方案4】:

使用appgrades.io。让您的应用专注于提供业务价值,并让第 3 方解决方案发挥作用。使用 appgrades,一旦 SDK 集成,您就可以创建自定义视图/警报,以显示您的旧版本用户,要求他们更新他们的应用程序。您可以自定义限制视图/警报中的所有内容,使其显示为您应用的一部分。

【讨论】:

注意:这是一项付费服务​​。【参考方案5】:
    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/lookupbundleId=\(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)
 



  func checkAppVersion(controller: UIViewController)

let appVersion = ForceUpdateAppVersion.shared.appUpdateAvailable()

if appVersion.0 
    alertController(controller: controller, title: "New Update", message: "New version \(appVersion.1 ?? "") is available")
  



  func  alertController(controller:UIViewController,title: String,message: String)
   let alertController = UIAlertController(title: title, message: message, preferredStyle: .alert)
alertController.addAction(UIAlertAction(title: "Update", style: .default, handler:  alert in
    
    guard let url = URL(string: "itms-apps://itunes.apple.com/app/ewap/id1536714073") else  return 
    if #available(iOS 10.0, *) 
        UIApplication.shared.open(url, options: [:], completionHandler: nil)
     else 
        UIApplication.shared.openURL(url)
    
))
DispatchQueue.main.async 
    controller.present(alertController, animated: true)

【讨论】:

以上是关于强制用户在 iOS 中以编程方式更新应用程序的主要内容,如果未能解决你的问题,请参考以下文章

如何在 iOS 中以编程方式将 sqlite 文件保存在本地文件夹或 nsbundle 中?

在 iOS 中以编程方式生成视图

如何在 Windows 中以编程方式强制重启/重新加载 Playback 设备?

如何在 iOS 应用程序中以编程方式检测 SwiftUI 的使用情况

在 ios 中以编程方式获取墙纸

如何在 iOS 中以编程方式禁用/启用睡眠模式?