【Swift】 应用内显示 AppStore 某个应用的详情

前言

  应用内跳转到 AppStore 的文章很多,一般都是用 SKStoreProductViewController 来实现的,不知道有没有在意一个问题:打开很慢!!怎么忍?!

 

声明 
欢迎转载,但请保留文章原始出处:) 
博客园:http://www.cnblogs.com
农民伯伯: http://over140.cnblogs.com

 

正文

  一般网上的文章的代码:

    func openAppStore(url: String){
        if let number = url.rangeOfString("[0-9]{9}", options: NSStringCompareOptions.RegularExpressionSearch) {
            let appId = url.substringWithRange(number)
            let productView = SKStoreProductViewController()
            productView.delegate = self
            productView.loadProductWithParameters([SKStoreProductParameterITunesItemIdentifier : appId], completionBlock: { [weak self](result: Bool, error: NSError?) -> Void in
                if result {
                    self?.presentViewController(productView, animated: true, completion: nil)
                } else {
                    self?.openAppUrl(url)
                }
            })
        } else {
            openAppUrl(url)
        }
    }

    private func openAppUrl(url: String) {
        let nativeURL = url.stringByReplacingOccurrencesOfString("https:", withString: "itms-apps:")
        if UIApplication.sharedApplication().canOpenURL(NSURL(string:nativeURL)!) {
            UIApplication.sharedApplication().openURL(NSURL(string:url)!)
        }
    }

    func productViewControllerDidFinish(viewController: SKStoreProductViewController) {
        viewController.dismissViewControllerAnimated(true, completion: nil)
    }

    实现的效果很好,就是很慢,点击按钮调用 openAppStore 要很久才能显示出界面,就算加一个转圈效果也很差。原因是因为要去  linkmaker.itunes.apple.com 根据 identifier 查找链接,仔细看代码我们会发现 presentViewController 是在查找到结果才被调用,其实我们可以不用让界面现出来,虽然时间是一样的,但是用户体验会很好,修改后代码如下:

    func openAppStore(url: String){
        if let number = url.rangeOfString("[0-9]{9}", options: NSStringCompareOptions.RegularExpressionSearch) {
            let appId = url.substringWithRange(number)
            let productView = SKStoreProductViewController()
            productView.delegate = self
            productView.loadProductWithParameters([SKStoreProductParameterITunesItemIdentifier : appId], completionBlock: { [weak self](result: Bool, error: NSError?) -> Void in
                if !result {
                    productView.dismissViewControllerAnimated(true, completion: nil)
                    self?.openAppUrl(url)
                }
            })
            self.presentViewController(productView, animated: true, completion: nil)
        } else {
            openAppUrl(url)
        }
    }

    private func openAppUrl(url: String) {
        let nativeURL = url.stringByReplacingOccurrencesOfString("https:", withString: "itms-apps:")
        if UIApplication.sharedApplication().canOpenURL(NSURL(string:nativeURL)!) {
            UIApplication.sharedApplication().openURL(NSURL(string:url)!)
        }
    }

    func productViewControllerDidFinish(viewController: SKStoreProductViewController) {
        viewController.dismissViewControllerAnimated(true, completion: nil)
    }

    代码说明:

      不等 loadProductWithParameters 返回直接 presentViewController ,解析失败再尝试用 openURL 的方式打开。

 

  参考:

    http://stackoverflow.com/questions/17871920/odd-behavior-with-skstoreproductviewcontroller

 

结束

  很早之前写过这个功能,由于用户体验不好代码直接被 revert 掉了,今天又搜了一下找到了办法。

转载:http://www.cnblogs.com/over140/p/4923740.html

时间: 2024-08-31 08:27:21

【Swift】 应用内显示 AppStore 某个应用的详情的相关文章

IOS 应用内显示 AppStore 某个应用的详情_IOS

前言 应用内跳转到 AppStore 的文章很多,一般都是用 SKStoreProductViewController 来实现的,不知道有没有在意一个问题:打开很慢!!怎么忍?!  正文 一般网上的文章的代码: func openAppStore(url: String){ if let number = url.rangeOfString("[0-9]{9}", options: NSStringCompareOptions.RegularExpressionSearch) { le

如何在Word 2013文档窗口内显示文字自动换行

在Word2013文档中,通过启用"文档窗口内显示文字自动换行"功能,可以在大纲视图下改变文档窗口大小时使文字自动换行,从而使Word文档窗口能够完整显示整行内容(类似于记事本中的"自动换行"效果),操作步骤如下所述: 第1步,打开Word2013文档窗口,依次单击"文件"→"选项"按钮,如图2013072514所示. 图2013072514 单击"文件"按钮 第2步,打开"Word选项"

Word 2007的文档窗口内显示文字自动换行功能

在Word2007文档中,通过启用"文档窗口内显示文字自动换行"功能,可以在大纲视图下改变文档窗口大小时使文字自动换行,从而使Word文档窗口能够完整显示整行内容(类似于记事本中的"自动换行"效果),操作步骤如下所述: 第1步,打开Word2007文档窗口,依次单击"Office按钮"→"Word选项"按钮,如图2012040422所示. 图2012040422 单击"Word选项"按钮 第2步,打开&qu

js-如何实现在某个固定区域内显示浮动效果啊

问题描述 如何实现在某个固定区域内显示浮动效果啊 我想实现的是,在一个大的div内放两个小div,左右排版,右侧是固定的,左侧是随着右侧的内容向下走实现浮动效果,但是不能超出最外面的那个大的div,如何实现比较简单,求指教 解决方案 div{ width:100%;height:100%; /*重要属性*/ position:relative; overflow:hidden;} leftDiv{width:30%;/*重要属性*/ position:absolute; left:0; top:

unity3d-Unity3D c# 脚本 的成员变量如何实现在控制面板内显示element 列表

问题描述 Unity3D c# 脚本 的成员变量如何实现在控制面板内显示element 列表 感觉不好表述,就是在显示物品的属性的时候可以设置size然后显示出插入的elements数的

方法-MVC的一个问题:如何从本地数据库读取内容在页面内显示

问题描述 MVC的一个问题:如何从本地数据库读取内容在页面内显示 小弟现在开始学习MVC,现在用database first的方法去实施,连接上了本地数据库之后,要怎么写控制器和上下文类来让数据在页面内显示呢? 解决方案 配置并新建servlet控制器,用来处理业务逻辑,控制器负责调用持久化层,持久化层负责对数据库进行查询操作等,持久层也就是dao类,servlet里得到数据之后进行转发到指定的页面,在页面你可以用EL表达式进行显示, 解决方案二: http://www.asp.net/mvc/

C++ 如何实现在指定区域内显示滚动字幕

问题描述 C++ 如何实现在指定区域内显示滚动字幕 C++ 如何实现在指定区域内显示滚动字幕 有什么好的方法吗? 我用DrawTextW只能实现从右到左滚动,然后左边消失的时候就不知道怎么弄了! 求各位指点下

ios-iOS swift 一个页面显示两个tableview,怎么解决

问题描述 iOS swift 一个页面显示两个tableview,怎么解决 如何在一个viewcontroller 上显示两个tableview,点击上面的tableview可以更新下面的tableview值,该如何实现呢?用swift实现 解决方案 这个应该很好处理啊 首先创建两个 tableView 然后设置 frame,让一个在上面,一个在下面,这个你应该可以做到 然后就是 delegate 和 dataSource 的问题,两个都指向 self,那回调的时候如何区分 可以这样判断 if

我的QQ栏内显示QQ图标是以JList实现的 可在JList内不能显示JIF图片,我编段动画代码进去,图标还是不能动,总之无法实现QQ图标跳动 那位大虾帮帮

问题描述 我的QQ栏内显示QQ图标是以JList实现的可在JList内不能显示JIF图片,我编段动画代码进去,图标还是不能动,总之无法实现QQ图标跳动那位大虾帮帮 解决方案 解决方案二:动画的话,用Timer控制一个重绘的方法把图片画在两个不同的位置就"跳动"了哦