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");}}
public void OnShowAppReview(){GJCNativeShare.Instance.ShowAppStoreReview();}
完成~
- Unity3D-应用内打开AppStore某个应用详情方法(iOS应用内下载、应用内评星)
- IOS开发-在应用内打开AppStore
- IOS开发-在应用内打开AppStore
- iOS 6.0 应用内显示APPStore 下载
- iOS应用内打开App Store应用详情界面
- iOS应用内打开App Store应用详情界面
- iOS—应用内打开App Store应用详情界面
- iOS应用内打开App Store应用详情界面
- iOS应用内打开App Store应用详情界面
- iOS应用内打开App Store应用详情界面
- iOS应用内打开App Store应用详情界面
- iOS应用内跳转appstore
- iOS 应用内跳转APPStore
- iOS 应用内下载
- iOS通过链接,应用内打开APP或者跳转APPStore对应下载
- ios - 跳转到AppStore某个应用详情页面
- ios在应用内大概AppStore应用内容页
- 应用内跳转APPStore评论以及应用的方法
- Elasticsearch与Solr 选型
- 虚幻4材质实例化笔记
- 常见问题总结
- PyTorch学习总结(一)——查看模型中间结果
- 快速回忆SQL
- Unity3D-应用内打开AppStore某个应用详情方法(iOS应用内下载、应用内评星)
- 【Android学习】线程和线程池
- Spring的IOC
- C#学习笔记之——数据类型
- tomcat catalina.out日志使用log4j按天分割
- iOS动画-基础动画
- IBM苏中:怎样利用深度学习、增强学习等方法提高信息处理效率
- java annoation
- SCardTransmit 返回 SCARD_W_RESET_CARD