今天有人在潛心俱樂部(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的應用助手、推薦類應用基本消失或者改行了?!?1手機助手》完全就是套的百度貼吧;《限時免費》從2014年開始就不能更新了,現在雖然改名為《鮮柚應用》,但也極力隱藏應用推薦的身份,一進去就是打開論壇頁面。這與蘋果對這種類似App Store的存在采取打擊政策有關,蘋果不允許在App Store之外存在其它的應用商店,因此需要 防止應用在審核的時候被拒 。
更多iOS開發精品文章:戴維營技術博客