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

60 篇文章 3 订阅
40 篇文章 0 订阅

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

完成~



















  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

苏小败在路上

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值