今天有人在潛心俱樂部(divein.club)提問:能否實(shí)現(xiàn)一個(gè)iOS版的手機(jī)應(yīng)用助手漫试,可以在應(yīng)用內(nèi)購買和下載應(yīng)用,而不需要跳轉(zhuǎn)到App Store(問題)秤茅。當(dāng)時(shí)第一反應(yīng)就是要做一個(gè)類似豌豆莢彻秆、360手機(jī)助手之類的應(yīng)用商店,所以直接否定了蛇耀。后來 @souhu 指出用SKStoreProductViewController
可以實(shí)現(xiàn)辩诞,因此在這里總結(jié)和記錄一下。
一纺涤、用法
首先說明一下躁倒,iOS的App Store中曾經(jīng)也充斥著各種《限時(shí)免費(fèi)》、《應(yīng)用大全》之類的洒琢。但是一直以來都沒有安卓這樣強(qiáng)大的應(yīng)用商店:集應(yīng)用發(fā)現(xiàn)秧秉、下載、安裝和卸載管理于一體衰抑。這是由iOS系統(tǒng)強(qiáng)大的 沙盒機(jī)制 決定的象迎,應(yīng)用程序沒有權(quán)限去訪問系統(tǒng)或者其它應(yīng)用(越獄除外,這里指App Store里的普通應(yīng)用程序)呛踊。但是由于App Store的應(yīng)用展示的機(jī)會(huì)非常少砾淌,用戶查找心儀的App很不方便,因此出現(xiàn)了許多以推薦應(yīng)用為生的App谭网,也就是上面提到的各路“限免”應(yīng)用汪厨。為了在推薦應(yīng)用的時(shí)候能夠方便的進(jìn)行安裝,它們普遍利用了iOS打開應(yīng)用鏈接時(shí)自動(dòng)跳轉(zhuǎn)到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)!)
這種做法有個(gè)很大的問題劫乱,就是每次安裝的時(shí)候都脫離的原來的應(yīng)用织中,用戶需要經(jīng)過幾步操作才能回來繼續(xù)查找應(yīng)用。蘋果官方也在考慮如何讓大家更加方便的相互推薦應(yīng)用衷戈、雜志以及進(jìn)行應(yīng)用內(nèi)購買狭吼,從 iOS 6 開始引入了上面所說的SKStoreProductViewController
。這是一個(gè)封裝了應(yīng)用殖妇、雜志等購買頁面的一個(gè)視圖控制器(順便說一下刁笙,起始App Store是一個(gè)WebView封裝的混合應(yīng)用,大部分展示頁面都是HTML實(shí)現(xiàn)的)谦趣, 本質(zhì)上來說還是跳轉(zhuǎn)到了App Store疲吸,只是將它嵌入到了應(yīng)用中,但還是不可能實(shí)現(xiàn)類似安裝那種直接安裝的功能 前鹅。
//Objective-C版摘悴,需要引入頭文件 #import <StoreKit/StoreKit.h>
SKStoreProductViewController *spCtrl = [[SKStoreProductViewController alloc] init];
//有一個(gè)代理方法,在完成/取消購買操作的時(shí)候調(diào)用嫡纠,可以用于返回之前的頁面
spCtrl.delegate = self;
//字典中的數(shù)字是應(yīng)用的Id烦租,也就是上面URL中id1029814614的數(shù)字部分
[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的應(yīng)用助手叉橱、推薦類應(yīng)用基本消失或者改行了≌呷洌《91手機(jī)助手》完全就是套的百度貼吧窃祝;《限時(shí)免費(fèi)》從2014年開始就不能更新了,現(xiàn)在雖然改名為《鮮柚應(yīng)用》踱侣,但也極力隱藏應(yīng)用推薦的身份粪小,一進(jìn)去就是打開論壇頁面。這與蘋果對(duì)這種類似App Store的存在采取打擊政策有關(guān)抡句,蘋果不允許在App Store之外存在其它的應(yīng)用商店探膊,因此需要 防止應(yīng)用在審核的時(shí)候被拒 。
更多iOS開發(fā)精品文章:戴維營技術(shù)博客