文档章节

iOS应用内购买之应用下载

大茶园丁
 大茶园丁
发布于 2016/01/14 20:24
字数 1024
阅读 73
收藏 0

今天有人在潜心俱乐部(divein.club)提问:能否实现一个iOS版的手机应用助手,可以在应用内购买和下载应用,而不需要跳转到App Store(问题)。当时第一反应就是要做一个类似豌豆荚、360手机助手之类的应用商店,所以直接否定了。后来 @souhu 指出用SKStoreProductViewController可以实现,因此在这里总结和记录一下。

一、用法

首先说明一下,iOS的App Store中曾经也充斥着各种《限时免费》、《应用大全》之类的。但是一直以来都没有安卓这样强大的应用商店:集应用发现、下载、安装和卸载管理于一体。这是由iOS系统强大的 沙盒机制 决定的,应用程序没有权限去访问系统或者其它应用(越狱除外,这里指App Store里的普通应用程序)。但是由于App Store的应用展示的机会非常少,用户查找心仪的App很不方便,因此出现了许多以推荐应用为生的App,也就是上面提到的各路“限免”应用。为了在推荐应用的时候能够方便的进行安装,它们普遍利用了iOS打开应用链接时自动跳转到App Store的功能。

//Objective-C版
NSString *string = [NSString stringWithFormat:@"https://itunes.apple.com/cn/app/asos-zhong-guo/id1029814614?mt=8"];  

[[UIApplication sharedApplication] openURL:[NSURL URLWithString:string]];
//Swift版
let string = "https://itunes.apple.com/cn/app/asos-zhong-guo/id1029814614?mt=8"

UIApplication.sharedApplication().openURL(NSURL(string: string)!)

这种做法有个很大的问题,就是每次安装的时候都脱离的原来的应用,用户需要经过几步操作才能回来继续查找应用。苹果官方也在考虑如何让大家更加方便的相互推荐应用、杂志以及进行应用内购买,从 iOS 6 开始引入了上面所说的SKStoreProductViewController。这是一个封装了应用、杂志等购买页面的一个视图控制器(顺便说一下,起始App Store是一个WebView封装的混合应用,大部分展示页面都是HTML实现的), 本质上来说还是跳转到了App Store,只是将它嵌入到了应用中,但还是不可能实现类似安装那种直接安装的功能

//Objective-C版,需要引入头文件 #import <StoreKit/StoreKit.h>
SKStoreProductViewController *spCtrl = [[SKStoreProductViewController alloc] init];
//有一个代理方法,在完成/取消购买操作的时候调用,可以用于返回之前的页面
spCtrl.delegate = self;
//字典中的数字是应用的Id,也就是上面URL中id1029814614的数字部分
[spCtrl loadProductWithParameters:@{SKStoreProductParameterITunesItemIdentifier:@"805451002"}
completionBlock:^(BOOL result, NSError *error) {
	if (error) {
		NSLog(@"%@", error);
   } else {
                                              
   }
}];
[self presentViewController:spCtrl
                   animated:YES
                 completion:nil];
//Swift版,需要引入模块 import StoreKit
let spCtrl = SKStoreProductViewController()
spCtrl.delegate = self
spCtrl.loadProductWithParameters([SKStoreProductParameterITunesItemIdentifier:"805451002"]) { (result, error) -> Void in
    if result == false {
        print("\(error)")
    }
    else {
        
    }
}
self.presentViewController(spCtrl, animated: true, completion: nil)

代理方法:

//Objective-C版
- (void)productViewControllerDidFinish:(SKStoreProductViewController *)viewController {
    [viewController dismissViewControllerAnimated:YES completion:nil];
}
//Swift版
func productViewControllerDidFinish(viewController: SKStoreProductViewController) {
    viewController.dismissViewControllerAnimated(true, completion: nil)
}

二、注意

目前在App Store的应用助手、推荐类应用基本消失或者改行了。《91手机助手》完全就是套的百度贴吧;《限时免费》从2014年开始就不能更新了,现在虽然改名为《鲜柚应用》,但也极力隐藏应用推荐的身份,一进去就是打开论坛页面。这与苹果对这种类似App Store的存在采取打击政策有关,苹果不允许在App Store之外存在其它的应用商店,因此需要 防止应用在审核的时候被拒

更多iOS开发精品文章:戴维营技术博客

© 著作权归作者所有

大茶园丁
粉丝 57
博文 15
码字总数 21159
作品 0
长沙
私信 提问
苹果 App Store 申请和管理相关知识

app store为开发者提供四种类型的申请: 个人ios开发者计划$99/年 公司ios开发者计划$99/年 企业ios开发者计划$299/年 高校ios开发者计划免费 在这里主要介绍一下公司ios开发者计划,只有利用...

鉴客
2012/01/09
50.8K
4
UDID是什么 如何获取iOS设备UDID-之udid获取篇

UDID是什么? UDID 是由子母和数字组成的40个字符串的序号,用来区别每一个唯一的iOS设备,包括 iPhones, iPads, 以及 iPod touches,这些编码看起来是随机的,实际上是跟硬件设备特点相联系...

qiyu123
2016/01/29
2.1K
0
Xamarin iOS开发实战1.1.3Xamarin版本

Xamarin iOS开发实战1.1.3Xamarin版本 Xamarin提供了免费版和付费版。免费版本包含Xamarin Studio服务。付费版本分为普通版299美元/年、商业版999美元/年和企业版1899美元/年。开发者可以根据...

大学霸
2014/12/17
312
0
iOS程序员面试,绝对会遇到这些问题!

常见问题 你昨天/这周学习了什么? 你为什么热衷于软件开发? 你对哪一种控制系统比较熟悉? 是否参与过GitHub项目? 是否参与过GitHub或其他同类型网站的iOS开源项目? 请描述一下你的iOS应...

iOS开发_小迷糊
05/22
0
0
开发者各应用平台生存现状:iOS成本最高

 6月27日消息,据国外媒体报道,调查显示,iOS应用开发成本远高于Android应用,而Windows Phone则是开发者参与意愿最高的平台。市场分析公司Vision Mobile数据对全球1500名移动应用开发者进...

junwong
2012/06/28
670
2

没有更多内容

加载失败,请刷新页面

加载更多

Spark sql的批处理物理计划BatchScanExec

BatchScanExec是batch类的物理计划,对应的逻辑计划是DataSourceV2Relation,是Datasource。 它的入参是Scan类,Scan类有两个重要方法,一个获取分区列表信息;另一个方法获取读取器工厂。 ...

守望者之父
29分钟前
10
0
for循环与while循环

循环结构三要素 a. 初始值 b. 循环条件 c. 改变条件 for循环 声明格式 for(表达式1;表达式2;表达式3){ 循环体语句 } 表达式1:用来循环的变量初始值。(开始值) 表达式2:用来判断循环的条件。...

Lenat
35分钟前
11
0
进程描述符和内存描述符、进程栈、线程栈、内核栈

进程描述符 task_struct 线程创建的时候,加上了 CLONE_VM 标记,这样 线程的内存描述符 将直接指向 父进程的内存描述符。 内存描述符mm_struct 进程栈:stack 线程栈:使用mmap系统调用分配...

SibylY
36分钟前
12
0
Mybatis之TypeHandler

mybatis-3.4.6.release. TypeHandler在mybatis中是个重要的组件,对statement设置参数还是从Resultset中取值,都会用到它。 List-1 public interface TypeHandler<T> { void setParame......

克虏伯
47分钟前
11
0
js—String的一些方法

<!DOCTYPE html><html><head> <meta charset="UTF-8"> <title></title> <script type="text/javascript"> var str="Hello boy" /** * 在底......

zhengzhixiang
今天
11
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部