您的位置:首页 > 移动开发 > Unity3D

Unity3D-应用内打开AppStore某个应用详情方法(iOS应用内下载、应用内评星)

2017-12-05 14:59 851 查看
本来可以通过Unity的Application.OpenUrl的方式,跳转到AppStore中去评价,但是iOS6以上还有一个方式,可以直接在应用内弹出评价框来

那么我在以前的NativeShare的基础上增加了一个函数,就可以使用了。

之前的代码看这里:Unity3D-调用IOS原生分享的实现  (从来没学过原生或者没做过原生的同学,一定先去看这篇文章!因为是在上一个博客的基础上增加的。)

首先是 .h 文件:

#import <UIKit/UIKit.h>
#import <StoreKit/StoreKit.h>//引入弹框库

@interface GJCSocialShare : NSObject<SKStoreProductViewControllerDelegate>//实现弹框的回调,在取消时会有个回调,必须要加

+ (id) sharedInstance;

- (void) nativeShare:(NSString*)text media: (NSString*) media;
- (void) showStoreProductInApp:(NSString *)appID;//通过传入一个appID,去打开对应的应用详情
- (void) productViewControllerDidFinish:(SKStoreProductViewController *)viewController;//弹框关闭时的回调

@end


里面后面加入注释的,都是新加入的

其次 .mm 文件:

...

- (void)showStoreProductInApp:(NSString *)appID{//方法实现
Class isAllow = NSClassFromString(@"SKStoreProductViewController");
if (isAllow != nil) {
SKStoreProductViewController *storeVC = [[SKStoreProductViewController alloc] init];
[storeVC.view setFrame:CGRectMake(0, 200, 320, 200)];
[storeVC setDelegate:self];
[storeVC loadProductWithParameters:@{SKStoreProductParameterITunesItemIdentifier: appID}
completionBlock:^(BOOL result, NSError *error) {
if (result) {
NSLog(@"show component: true");
UnitySendMessage("GJCNativeShare", "OnOpenAppStoreSuccess", [GJC_DataConvertor NSStringToChar:@"Success"]);
UIViewController *vc =  UnityGetGLViewController();
[vc presentViewController:storeVC animated:YES completion:nil];
}else{
NSLog(@"error:%@",error);
UnitySendMessage("GJCNativeShare", "OnOpenAppStoreFailed", [GJC_DataConvertor NSStringToChar:error.localizedDescription]);
}
}];
}else{
NSLog(@"Not support this controller, use openUrl to AppStore!");
UnitySendMessage("GJCNativeShare", "OnOpenAppStoreSuccessURL", [GJC_DataConvertor NSStringToChar:@"Success on url"]);
//低于iOS6的系统版本没有这个类,不支持这个功能
NSString *string = [NSString stringWithFormat:@"https://itunes.apple.com/WebObjects/MZStore.woa/wa/viewContentsUserReviews?id=%@&pageNumber=0&sortOrdering=2&type=Purple+Software&mt=8",appID];
[[UIApplication sharedApplication] openURL:[NSURL URLWithString:string]];
}
}
//回调
- (void)productViewControllerDidFinish:(SKStoreProductViewController *)viewController {
NSLog(@"show component finished");
UnitySendMessage("GJCNativeShare", "OnOpenAppStoreFinished", [GJC_DataConvertor NSStringToChar:@"Finished"]);
//在代理方法里dismiss这个VC
[viewController dismissViewControllerAnimated:YES completion:nil];
}

...


再次,在 .mm 文件最后加入一个可供Unity端调用的接口

extern "C" {
void _GJC_OpenAppStore(char* appId) {
NSString *appID = [GJC_DataConvertor charToNSString:appId];
[[GJCSocialShare sharedInstance] showStoreProductInApp:appID];
}
}


好了,原生这边就加完了。
接下来看看Unity这边的 .cs 文件,我们也需要增加对应的方法:

public class GJCNativeShare : MonoBehaviour {
#if UNITY_IPHONE && !UNITY_EDITOR

[DllImport ("__Internal")]
private static extern void _GJC_OpenAppStore(string appID);//---add---
#endif

public delegate void OnNativeEvent(string msg);

public OnNativeEvent onOpenAppStore = null;

//---add---
private void OnNativeShareCancel(string result){
// Debug.Log("cancel: " + result);
if (onShareCancel != null){
onShareCancel(result);
}
}
//加载完毕开始展示界面 //---add---
private void OnOpenAppStoreSuccess(string result){
Debug.Log("Success: " + result);
if (onOpenAppStore != null){
onOpenAppStore("Success");
}
}
//界面关闭,无论是取消还是其他操作 //---add---
private void OnOpenAppStoreFinished(string result){
Debug.Log("Finished: " + result);
if (onOpenAppStore != null){
onOpenAppStore("Finished");
}
}
//如果iOS版本不支持,则自动跳转到 AppStore 中展示,返回 //---add---
private void OnOpenAppStoreSuccessURL(string result){
Debug.Log("Success: " + result);
if (onOpenAppStore != null){
onOpenAppStore("Success on url");
}
}
//加载失败,出现问题 //---add---
private void OnOpenAppStoreFailed(string result){
Debug.Log("Failed: " + result);
if (onOpenAppStore != null){
onOpenAppStore("Failed");
}
}
}


然后是怎么在任意一个脚本里面加入调用的方法:

public class Main : MonoBehaviour {
void Start()
{
GJCNativeShare.Instance.onOpenAppStore = OnNativeEvent;
}
public void OnOpenAppStore(){
GJCNativeShare.Instance.OpenAppStore("1251737937");
}
void OnNativeEvent(string msg){
Debug.Log("OnNativeEvent: " + msg);
//--- your code
}
}


打开效果,就如同你在AppStore中点击一个应用弹出的框是一模一样的。

我是使用的以前上线的应用打开的,可以展示出来。

另外,需要注意的地方是,在Unity端,可以选中原生的 .h 或 .mm 文件,从右边框里面把 StoreKit.frameword 勾上,像这样:



那个Social 勾上,是以为只用了原生分享组件,我在原来的基础上添加的功能,所以也要勾上。

2017.12.5新补充:

在网上看到了一个新的方式,需要iOS10.3+以上,虽然这个方式受到Apple的限制,但是还是值得使用的,主要是用户的体验流程比较好,直接弹出来一个评星框,点了就关闭就好了,先看看这个的效果图:



当然,我选了星星之后,提交按钮时灰色的,说是需要上线之后才可以点击。

根据官方的文档说明,这个最好是在某个时机去调用,因为有可能显示不出来,所以一般在游戏进行到一个比较好的阶段,去申请一下比较合适。

然后看代码:(添加的地方,同上文一样,只是多了一个函数而已,这个没有回调,也没有结果)

.h

- (void) showAppStoreReview;


.mm 这里我加了一些判断,是否支持,或者是否可以显示之类的。

- (void) showAppStoreReview{
Class isAllow = NSClassFromString(@"SKStoreReviewController");
if (isAllow != nil) {
if([SKStoreReviewController respondsToSelector:@selector(requestReview)]) {
//防止键盘遮挡
[[UIApplication sharedApplication].keyWindow endEditing:YES];
[SKStoreReviewController requestReview];
UnitySendMessage("GJCNativeShare", "OnShowReviewSuccess", [GJC_DataConvertor NSStringToChar:@"Success"]);
}else{
UnitySendMessage("GJCNativeShare", "OnShowReviewReject", [GJC_DataConvertor NSStringToChar:@"Reject"]);
}
}else{
UnitySendMessage("GJCNativeShare", "OnShowReviewFailed", [GJC_DataConvertor NSStringToChar:@"Failed"]);
}
}


.mm 后面添加Unity接口

extern "C" {
void _GJC_ShowAppStoreReview() {
[[GJCSocialShare sharedInstance] showAppStoreReview];
}
}


.cs

[DllImport ("__Internal")]
private static extern void _GJC_ShowAppStoreReview();//---add---


/// <summary>
/// iOS 10.3+ 以上可以使用,直接弹出一个评星框,无参数,是否能显示也不知道,这些都用AppStore控制的
/// 我们只需要控制它在什么时机显示
/// </summary>
public void ShowAppStoreReview(){
Debug.Log("Native Open AppStore");
#if UNITY_IPHONE && !UNITY_EDITOR
_GJC_ShowAppStoreReview();
#endif
}

//弹框成功
private void OnShowReviewSuccess(string result){
Debug.Log("Success: " + result);
if (onShowReview != null){
onShowReview("Success");
}
}
//弹框失败
private void OnShowReviewFailed(string result){
Debug.Log("Failed: " + result);
if (onShowReview != null){
onShowReview("Failed");
}
}
//其他原因被拒绝?
private void OnShowReviewReject(string result){
Debug.Log("Reject: " + result);
if (onShowReview != null){
onShowReview("Reject");
}
}


在其他 .cs 文件调用

public void OnShowAppReview(){
GJCNativeShare.Instance.ShowAppStoreReview();
}


完成~
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息