iOS評分功能

一般我們評分功能在以前iOS 6之前都是給個網址,然後跳轉去讀Device內建的App Store裡
自己App裡評分的頁面,如下

1
2
3
4
[[UIApplication sharedApplication] openURL:
[NSURL URLWithString:[NSString stringWithFormat:
@"itms-apps://ax.itunes.apple.com/WebObjects/MZStore.woa/wa/
viewContentsUserReviews?type=Purple+Software&id=%@",APP_STORE_ID]]];

現在由於iOS 6提供了很多新功能像Social的FrameWork,也在原本的SKStore裡新增了一個新功能,

在app直接經由ModelViewController彈出一個視窗,直接在應用程式中打開app store連結,可以省去離開app的困惱。

方法是在一個國外網站看到的,在此實現一下。

首先我們建一個繼承UIViewController 的Class

然後再H檔中#import <StoreKit/StoreKit.h>

再interface中我們增加一個小菊花,

UIActivityIndicatorView *activityView;

也增加一個Method - (void)AppStoreGrade:(UIViewController *)VC;

然後再M檔中

1
2
3
4
5
6
7
8
9
10
11
- (void)AppStoreGrade:(UIViewController *)VC
{
if ([self respondsToSelector:@selector(openAppStore:)])
{
//設定小菊花
activityView = [[UIActivityIndicatorView alloc] initWithFrame: CGRectMake(150.0f, 144.0f, 40.0f, 40.0f)];
activityView.activityIndicatorViewStyle =UIActivityIndicatorViewStyleWhiteLarge;
[VC.view addSubview:activityView];
[self performSelector:@selector(openAppStore:) withObject:VC];
}
}

建立SKStoreProductViewController的方法如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
SKStoreProductViewController *storeProductVC = [[SKStoreProductViewController alloc]init];
if([activityView isAnimating]){
return;
}
[activityView startAnimating]; //菊花啟動
[storeProductVC setDelegate:rear];
//設定Delegate 你要在那邊呼叫的Class,這邊我實例化了一個叫rear的Class
[storeProductVC loadProductWithParameters:@{SKStoreProductParameterITunesItemIdentifier:APP_STORE_ID}
completionBlock:^(BOOL result, NSError *error) {
[activityView stopAnimating];//停止小菊花
if (error)
NSLog(@"error : %@, UserInfo : %@",error,[error userInfo]);
else
//推出頁面顯示app 位置
[VC presentViewController:storeProductVC animated:YES completion:nil];
}];

以上程式碼足以彈出一個視圖秀出app store你appid的頁面,為什麼要設定小菊花是因為在3G下會有點延遲
所以需中間有個轉轉轉的讓使用者知道程式還在運作中。

在我們需要呼叫的Class H檔中匯入下面ProtocolSKStoreProductViewControllerDelegate

再M檔中 我們可以這樣呼叫

1
2
3
4
GradeViewController *grade = [[GradeViewController alloc]init];
//GradeViewController 就是我們剛寫的Class囉
[grade AppStoreGrade:self];
[grade release];

然後寫一個delegate函數

1
2
3
4
- (void)productViewControllerDidFinish:(SKStoreProductViewController *)viewController
{
[viewController dismissViewControllerAnimated:YES completion:nil];
}

這樣就完成了。

然後我們怎麼要兼容iOS 6以下的設備呢,有人可能會想說用UIdevice 去取iOS版本去判斷,

其實不用那麼麻煩,下一個if就可以了唷。

1
2
3
4
5
6
if (NSStringFromClass([SKStoreProductViewController class]) != nil) {
//支援iOS 6
}else{
//不支援iOS 6
}

寫到這邊,各位應該知道如何兼容了吧,不過我自己覺得這樣寫還是有點缺點,應該是都能寫成一個Class 去呼叫成模組的,然後不是代Controller進去而是帶APPID進去才是好方法呢。

成果如下圖

經過半天的修改,已成功修改成匯入Class 代入APPID就可以呼叫和Dismiss了

程式連結如右 GitHub