【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 掉了,今天又搜了一下找到了办法。

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

时间: 2024-10-12 03:21:34

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

Barcode Professional for ASP.NET使用教程:如何在HTML支持的DPI范围内显示高清条码

我们知道高质量的条码更能达到我们的目的,然而图像DPI与图像的大小成正比,即DPI越高,图片文件越大. 可能你将600DPI的图片显示在HTML上很容易,然而你会发现图片占满了整个页面,因为大多数的HTML显示分辨率为96DPI.那么今天将分享用Barcode Professional for ASP.NET在HTML支持的DPI范围内显示高清条码.代码仅供参考. 注意:我们使用的是Visual Studio 2005 (Visual Web Developer) ,不过有些VS.NET也可以使

white-space norma nowrap强制同一行内显示所有文本文字,让所有文字内容中一排显示不换行

日常我们为了让文字内容在一行内显示完,哪怕宽度不够也不能换行,我们可以使用white-space样式,但如果遇到了html br强制换行标签,无论是设置white-space与否都会被<br>强制换行. 昨天仿照娜姐做的标题滚动,自己照着那个js也写了一个,结果发现死活就是不滚动,今天早上发现原来还有一段CSS代码没有看到,这个css代码尤为重要. 其中就是有一个属性: white-space:nowrap; 2.white-space参数:normal : 默认处理方式nowrap : 强制

用CSS让字体在一行内显示不换行(收藏)

当一行文字超过DIV或者Table的宽度的时候,浏览器中默认是让它换行显示的,如果不想让他换行要怎么办呢? 用CSS让文字在一行内显示不换行的方法   一般的文字截断(适用于内联与块): .text-overflow{display:block;                     /*内联对象需加*/width:31em;word-break:keep-all;           /* 不换行 */white-space:nowrap;          /* 不换行 */overflo

All about Div内显示滚动桥

Div内显示滚动桥看似是一个简单的前端问题,然而实际会发现还是有挺多需要注意的. 本文尝试对div内显示滚动桥的各种主要实现及一些难题进行研究. 横向滚动桥 横向滚动桥比较简单,无需设置宽度,直接overflow-x:auto就ok. 这里需要注意的是使用white-space:nowrap去避免自动换行,导致横向滚动桥出不来. 如果要确保横向滚动桥显示,关键点是要不自动换行: 使用white-space:nowrap去避免自动换行,否则会导致横向滚动桥出不来. 如果有内部元素,内部元素需要使用

用CSS让字体在一行内显示不换行

青枫 , 2012/07/13 18:08 , css样式设计 , 评论(0) , 阅读(2189) , Via 本站原创 大 | 中 | 小  当一行文字超过DIV或者Table的宽度的时候,浏览器中默认是让它换行显示的,如果不想让他换行要怎么办呢? 用CSS让文字在一行内显示不换行的方法 一般的文字截断(适用于内联与块): .text-overflow{display:block;                     /*内联对象需加*/width:31em;word-break:kee

一个友好的文本框内显示提示语 jquery 插件

插件实现文本框内默认显示提示语,当文本框获得焦点时提示语消失. 如果没有输入或输入为空则失去焦点时提示语再次出现. 同时它的使用非常舒适简单,引入插件及 jquery 后,在原有的文本框内加上样式类(class="prompt-input")以及设置值(value="Your prompt")为提示语就可以了. 像这样: 1 <input class="prompt-input" type="text" value='Y

C#实现在同一窗口内显示多个其它窗口/另一个窗口

一.以对话框的方式显示另一窗口. 在form1内对过按钮点击或其它事件添加以下代码. form2 fm2 = new form2(); fm2.showdialog(); 特点:当fm2打开后form1无法执行其它操作.只有当fm2关闭后才能继续. 关闭窗口为this.close(); 二.在form1内打开form2,form2作为form1的一部份进行显示. private void Form1_Load(object sender, EventArgs e)        {      

iframe 内显示的网页 只显示改网页的某一部分!

使用iframe调用指定网页的特定位置(显示目标网页某区域的我想要的内容) 有些时候我们并不需要显示iframe标签属性src指定的目标网页的所有内容,往往只需要显示某一特定区域.现有两种实现方法提供,但严禁使用此方法用于欺骗.隐瞒目的. 这里用到了Iframe的一些属性,稍微介绍下:        1. marginheight 属性规定框架内容与框架的上方和下方之间的高度,以像素计.        2. maiginweidth 属性规定框架内容与框架的左侧和右侧之间的高度,以像素计.  

css 一行内显示 超出自动隐藏

一般的文字截断(适用于内联与块): Example Source Code [www.mb5u.com].text-overflow {display:block;/*内联对象需加*/width:31em;word-break:keep-all;/* 不换行 */white-space:nowrap;/* 不换行 */overflow:hidden;/* 内容超出宽度时隐藏超出部分的内容 */text-overflow:ellipsis;/* 当对象内文本溢出时显示省略标记(...) :需与ov