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

来源:互联网 发布:红圈软件 编辑:程序博客网 时间:2024/05/19 16:33

本来可以通过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---#endifpublic 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();}

完成~



















原创粉丝点击