Unity3D-应用内打开AppStore某个应用详情方法(iOS应用内下载、应用内评星)
2017-12-05 14:59
851 查看
本来可以通过Unity的Application.OpenUrl的方式,跳转到AppStore中去评价,但是iOS6以上还有一个方式,可以直接在应用内弹出评价框来
那么我在以前的NativeShare的基础上增加了一个函数,就可以使用了。
之前的代码看这里:Unity3D-调用IOS原生分享的实现 (从来没学过原生或者没做过原生的同学,一定先去看这篇文章!因为是在上一个博客的基础上增加的。)
首先是 .h 文件:
里面后面加入注释的,都是新加入的
其次 .mm 文件:
再次,在 .mm 文件最后加入一个可供Unity端调用的接口
好了,原生这边就加完了。
接下来看看Unity这边的 .cs 文件,我们也需要增加对应的方法:
然后是怎么在任意一个脚本里面加入调用的方法:
打开效果,就如同你在AppStore中点击一个应用弹出的框是一模一样的。
我是使用的以前上线的应用打开的,可以展示出来。
另外,需要注意的地方是,在Unity端,可以选中原生的 .h 或 .mm 文件,从右边框里面把 StoreKit.frameword 勾上,像这样:
![](https://oscdn.geek-share.com/Uploads/Images/Content/201909/09/365f4d0fa24ecbbe9a684524129c6dbd)
那个Social 勾上,是以为只用了原生分享组件,我在原来的基础上添加的功能,所以也要勾上。
2017.12.5新补充:
在网上看到了一个新的方式,需要iOS10.3+以上,虽然这个方式受到Apple的限制,但是还是值得使用的,主要是用户的体验流程比较好,直接弹出来一个评星框,点了就关闭就好了,先看看这个的效果图:
![](https://oscdn.geek-share.com/Uploads/Images/Content/201909/09/ba9a756e760433c6d4d7e344dd274acf)
当然,我选了星星之后,提交按钮时灰色的,说是需要上线之后才可以点击。
根据官方的文档说明,这个最好是在某个时机去调用,因为有可能显示不出来,所以一般在游戏进行到一个比较好的阶段,去申请一下比较合适。
然后看代码:(添加的地方,同上文一样,只是多了一个函数而已,这个没有回调,也没有结果)
.h
.mm 这里我加了一些判断,是否支持,或者是否可以显示之类的。
.mm 后面添加Unity接口
.cs
在其他 .cs 文件调用
完成~
那么我在以前的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(); }
完成~
相关文章推荐
- IOS学习之—— APPStore无法打开或者无法正常下载APP 的解决方法
- IOS跳转到AppStore应用详情页面方法
- iOS通过链接,应用内打开APP或者跳转APPStore对应下载
- 在UC浏览器打开链接唤醒app,假设没有安装该app,则跳转到appstore下载该应用
- 在 iOS 应用中直接跳转到 AppStore 的方法
- ios - 跳转到AppStore某个应用详情页面
- 在 iOS 应用中直接跳转到 AppStore 的方法
- iOS应用中打开 手电筒/闪光灯 的方法
- IOS6.0 应用内直接下载程序 不需跳转AppStore
- win8 应用商店。 app下载的音乐和视频软件能打开,不能正常播放 解决方法
- iOS开发中打开本地应用、打开appStore应用、给app评分功能实现
- 移动开发经验分享1:IOS应用文件下载及打开
- IOS6.0 应用内直接下载程序 不需跳转AppStore
- 在 iOS 应用中直接跳转到 AppStore 的方法
- 在 iOS 应用中直接跳转到 AppStore 的方法
- app上传新版本后用户从appStore下载打开应用就闪退
- IOS应用直接 跳转AppStore 的方法 IOS7以上
- iOS应用上传AppStore验证UUID不过的解决方法
- 在 iOS 应用中直接跳转到 AppStore 的方法