一般我們評分功能在以前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]; [storeProductVC loadProductWithParameters:@{SKStoreProductParameterITunesItemIdentifier:APP_STORE_ID} completionBlock:^(BOOL result, NSError *error) { [activityView stopAnimating]; if (error) NSLog(@"error : %@, UserInfo : %@",error,[error userInfo]); else [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) { }else{ }
|
寫到這邊,各位應該知道如何兼容了吧,不過我自己覺得這樣寫還是有點缺點,應該是都能寫成一個Class 去呼叫成模組的,然後不是代Controller進去而是帶APPID進去才是好方法呢。
成果如下圖
經過半天的修改,已成功修改成匯入Class 代入APPID就可以呼叫和Dismiss了
程式連結如右 GitHub