出于什么样的原因你会希望用户从你的iOS app中进入App Store呢?可能你想用户去App Store 为你的应用评分,也可能你希望用户看到你其他的iOS app。iOS 6引入了SKStoreProductViewController类,可以让用户在不离开当前应用的前提下展示App Store中的其他产品。

Store Kit

SKStoreProductViewController类是Store Kit框架的一部分。SKStoreProductViewController使用起来非常简单,在用实例讲解之前,了解一些基本的知识很有必要。

SKStoreProductViewController类是UIViewController的子类, 如果你对view
controller比较熟悉的话,那SKStoreProductViewController使用起来也非常简单了。当你希望向用户展示App
Store中产品时,你需要:

1.实例化一个SKStoreProductViewController类
2.设置它的delegate
3.把sotre product视图控制器显示给消费者

剩下的就交给操作系统来处理了。需要记住一点的是SKStoreProductViewController只能以模态的方式显示。
SKStoreProductViewControllerDelegate协议定义了一个单独的方法—
productViewControllerDidFinish:,当消费者离开App
Store时会调用这个方法—一般是通过点击左上角画面中的取消按钮。通过给代理发送productViewControllerDidFinish:消
息,操作系统就会把控制权返回到你的程序。下面我来演示一下如何在一个简单的程序中使用SKStoreProductViewController类。

Step 1: Setting Up the Project

我们将要创建的app不是多实用,仅有一个按钮,可以把用户带入App
Store,向用户展示我最近发布的一款简单的天气类app。通过实例我们可以了解不同的部分如何很好地契合在一起,还可以了解如何在项目中使用
SKStoreProductViewController类。

从模版列表中选择一个Single View Application模版,在Xcode中创建一个新的项目(图1)。

将程序的名称设置为app store,然后输入一个company identifier,并将device
family设置为iPhone,最后勾选上Automatic Reference
Counting。剩余的勾选框不要勾选,如图2。“告诉”Xcode你希望保存项目的地方,点击创建按钮。


图1
 

图2

Step 2: Adding the Store Kit Framework

由于SKStoreProductViewController类是Store Kit框架的一部分,所以我们需要将这个Store
Kit框架链接到我们的工程中。在工程导航器中选中工程,然后在target列表中选中target。在画面的顶部,选择Build
Phase选项,然后打开Link Binary With
Libraries。点击‘+’按钮,并在图3中的画面列表中选择StoreKit.framework。这样就可以成功的将Store
Kit框架链接到工程中。

为了使用MTViewController类里的Store Kit框架,我们需要输入框架的头文件,打开MTViewController.h,在顶部添加下边这个引入语法:

1
#import <StoreKit/StoreKit.h>

Step 3: Using the SKStoreProductViewController Class

在视图控制器的viewDidLoad方法中,在下面的代码片段中创建一个新的按钮。按钮的类型是
UIButtonTypeRoundedRect,然后我把这个按钮放在视图控制器view的正中间。同时我还给这个按钮制定了一个title,并添加了
一个target-action——匹配UIControlEventTouchUpInside事件。这意味无论何时,用户点击按钮,view
controller就会收到“open App Store”的信息。

- (void)viewDidLoad {    
     [super viewDidLoad];    
      // Initialize Button    
      UIButton *button = [UIButton buttonWithType:UIButtonTypeRoundedRect];    
      [button setTitle:@"Go to App Store" forState:UIControlStateNormal];    
      [button setFrame:CGRectMake(0.0, 0.0, 200.0, 44.0)];    
      [button setCenter:self.view.center];   
      [self.view addSubview:button];    
      // Add Target-Action Pair    
      [button addTarget:self action:@selector(openAppStore:) forControlEvents:UIControlEventTouchUpInside];
  }

在openAppStore:
方法中,我对SKStoreProductViewController进行了初始化,并将自己设置为它的delegate,然后在给这个实例发送一个
loadProductWithParameters:completionBlock:消息。

loadProductWithParameters:completionBlock:接收两个参数:(1)一个字典:用一个key指定我们想要显示给用的程序的标示符。(2)一个completion block。

当App store请求结束时会调用这个completion block。在完成的block中,我们要核实是否有错误遗漏,并把store product 视图控制器展示给用户。

请记住,即使用户没有离开你的程序,操作系统仍然会在内部进行与App store的连接。由于在请求App
Store过程中,会需要稍微长的一段时间,也就是说,最好在请求还没有返回响应时给用户显示一个风火轮。一旦请求完成(成功或者不成功),已经完成的
block将会允许我们解除activity indicator。

- (void)openAppStore:(id)sender {    
     // Initialize Product View Controller    
     SKStoreProductViewController *storeProductViewController = [[SKStoreProductViewController alloc] init];    
     // Configure View Controller    
     [storeProductViewController setDelegate:self];   
     [storeProductViewController loadProductWithParameters:@{SKStoreProductParameterITunesItemIdentifier : @"594467299"}

completionBlock:^(BOOL result, NSError *error) {        
         if (error) {            
              NSLog(@"Error %@ with User Info %@.", error, [error userInfo]);        
         } else {            
             // Present Store Product View Controller            
             [self presentViewController:storeProductViewController animated:YES completion:nil];       
         }    
      }];
  }

注意:你可以在iTunes Connect找到app的唯一识别符,App Store中的每个app都有一个唯一识别符/Apple ID,注意你需要将在参数字典中以字符串的形式传递apple id。

在生成和运行程序之前,我们需要MTViewController类通过实现productViewControllerDidFinish:方法
以遵循SKStoreProductViewControllerDelegate协议。我们可以通过告诉编译器“MTViewController类符
合SKStoreProductViewController授权协议”来更新view controller的接口文件,看下边:

#import <UIKit/UIKit.h>
#import <StoreKit/StoreKit.h>
@interface MTViewController : UIViewController <SKStoreProductViewControllerDelegate>
@end

在view
controller的执行文件中执行productViewControllerDidFinish:方法(如下所示),注意一点,当调用
loadProductWithParameters:completionBlock: 方法时,sotre product view
controller将以模态方式显示。当用户打算离开App Store时我们负责解除(隐藏)sotre product view
controller。

- (void)productViewControllerDidFinish:(SKStoreProductViewController *)viewController {    
     [self dismissViewControllerAnimated:YES completion:nil];
 }

Step 4: Build and Run

虽然苹果表示SKStoreProductViewController类可以向用户展示其他app,但这是一种理想的在用户不离开当前app的情况下,让用户去App Store评分的方法。


 

Conclusion

SKStoreProductViewController类添加至Store Kit框架是一个不错的进步,我已经在我的新应用中充分利用了这个优势,希望对你会有所帮助。

[ios2]OS 6 SDK: 在应用内展示App Store【转】的更多相关文章

  1. 实现微信浏览器内打开App Store链接(已被和谐,失效了)

    微信浏览器是不支持打开App Store 页面的,不知道微信为什么这么做.比如你页面写 <a href=”http://itunes.apple.com/us/app/id399608199″& ...

  2. 实现微信浏览器内打开App Store链接

    http://www.ildsea.com/1781.html 微信浏览器是不支持打开App Store 页面的,不知道微信为什么这么做.比如你页面写 <a href=”http://itune ...

  3. [转]实现微信浏览器内打开App Store链接

    微信浏览器是不支持打开App Store 页面的,不知道微信为什么这么做.比如你页面写 <a href=”http://itunes.apple.com/us/app/id399608199″& ...

  4. CAD调试时抛出“正试图在 os 加载程序锁内执行托管代码。不要尝试在 DllMain 或映像初始化函数内运行托管代码”异常的解决方法

    这些天重装了电脑Win10系统,安装了CAD2012和VS2012,准备进行软件开发.在调试程序的时候,CAD没有进入界面就抛出 “正试图在 os 加载程序锁内执行托管代码.不要尝试在 DllMain ...

  5. 正尝试在 OS 加载程序锁内执行托管代码。不要尝试在 DllMain 或映像初始化函数内运行托管代码,这样...

    出错提示: 正尝试在 OS 加载程序锁内执行托管代码.不要尝试在 DllMain 或映像初始化函数内运行托管代码,这样做会导致应用程序挂起. 原因分析: .NET2.0中增加了42种非常强大的调试助手 ...

  6. 检测到 LoaderLock:DLL"XXXX"正试图在OS加载程序锁内执行

    解决方法: ctrl+D+E或alt+ctl+e或使用菜单调试——>异常——>异常窗口——>Managed Debugging Assistants——>去掉LoaderLoc ...

  7. 正试图在 os 加载程序锁内执行托管代码。不要尝试在 DllMain 或映像初始化函数内运行托管代码

    来自:http://www.cnblogs.com/lcxu2/archive/2011/01/16/2004016.html 正试图在 os 加载程序锁内执行托管代码.不要尝试在 DllMain 或 ...

  8. 在AE二次开发中出“正试图在 OS 加载程序锁内执行托管代码。不要尝试在 DllMain 或映像初始化函数内运行托管代码,这样做会导致应用程序挂起。”异常解决方案

    今天的一个项目总用到了AE的开发组件,也就是ESRI公司提供的一系列的开发包(组件)都是以dll(动态链接库的形式)然后今天在调试的时候却出现了“正试图在 OS 加载程序锁内执行托管代码.不要尝试在 ...

  9. 正试图在 os 加载程序锁内执行托管代码

    正试图在 os 加载程序锁内执行托管代码.不要尝试在 DllMain 或映像初始化函数内运行托管代码... 当我在窗体初始化的时候,调用了一个外部的dill时,它就不知什么原因的 抛出一个“正试图在 ...

随机推荐

  1. 大endian和little endian

    大endian和little endian      一般Intel处理器或X86平台是小端 ,只是有点老了摩托罗拉的处理器将采用大端,掌握一下小端序.     小端序一般指低地址存低字节.高地址存高 ...

  2. 显示linux开机时间的脚本

    最初的讨论是linux吧吧友@九十钩圈凯_ 发布的主题贴<加到自启动可以看开机时间的玩意> 并给出显示开机秒数的shell语句 [shell] [ $_UTED = 0 ] || noti ...

  3. leetcode第五题--Longest Palindromic Substring

    Problem:Given a string S, find the longest palindromic substring in S. You may assume that the maxim ...

  4. nginx+lua+redis高并发应用建设

    ngx_lua将lua嵌nginx,让nginx运行lua脚本.高并发,非堵塞过程中的各种请求. url要求nginxserver,然后lua查询redis,返回json数据. 一.安装lua-ngi ...

  5. 读书笔记—CLR via C#同步构造28-29章节

    前言 这本书这几年零零散散读过两三遍了,作为经典书籍,应该重复读反复读,既然我现在开始写博了,我也准备把以前觉得经典的好书重读细读一遍,并且将笔记整理到博客中,好记性不如烂笔头,同时也在写的过程中也可 ...

  6. SQL Server查看表结构及视图,适合开发者使用,简单易用

    SELECT * FROM INFORMATION_SCHEMA.TABLES SELECT * FROM INFORMATION_SCHEMA.COLUMNS 查看执行结果

  7. 十款最佳Node.js MVC框架

    十款最佳Node.js MVC框架摘要:Node.js是JavaScript中最为流行的框架之一,易于创建可扩展的Web应用.本文分享十款最佳的JavaScript框架. Node.js是JavaSc ...

  8. Role Object(角色对象)

    Role Object(角色对象) 索引 意图 结构 参与者 适用性 效果 相关模式 实现 实现方式(一):Role Object 的示例实现. 意图 通过明确地附加角色对象到目标对象中,以使对象可以 ...

  9. 史上最全的Matlab资源电子书教程和视频下载合集【超级推荐】

    收藏吧,网上搜集的,费了老大劲了,推荐给有需要的人,^_^.   MATLAB课件2007北京交通大学.zip 4.87 MB   A Guide to MATLAB for Beginners an ...

  10. SublimeText编辑器替代notepad++了

    可以考虑使用SublimeText编辑器替代notepad++了   内容目录: 插件安装配置 配置打包下载 大概是去年吧,这款编辑器神一般的出现在我面前,经过我小心翼翼的试用后发现并不是那么太顺手, ...