返回介绍

应用程序准备“内购”

发布于 2021-06-19 18:03:20 字数 3947 浏览 1033 评论 0 收藏 0

本章的目标并不是讨论如何将您的游戏与 Apple "StoreKit" API 集成。而是假设您已经通过本地代码插件与 "StoreKit" 集成。

Apple "StoreKit" 文档定义了四种可以通过“内购”过程销售的产品

  • 内容 (Content)
  • 功能 (Functionality)
  • 服务 (Services)
  • 认购 (Subscriptions)

本章仅讲述第一例,主要侧重于可下载内容的概念。资源包是可下载内容的理想选择,包括两种情况:

  • 如何导出在 iOS 上使用的资源包
  • 如何在 iOS 上下载和缓存资源包

请注意,AssetBundles 是一项仅适用于专业版的功能。(基础版)iOS 附加组件的用户将无法在游戏代码中使用资源包。

导出资源供 iOS 使用

可下载内容拥有独立工程是不错的想法,可以让主应用程序自带的内容和稍后下载的内容之间有更好的分离。

请注意:任何包含可下载内容的游戏脚本必须存在于主要可执行文件中。(iOS 所有游戏脚本的所有调用都将提前编译成机械臂组件并包含在 XCode 工程中。)

  1. 在工程视图内创建编辑器 (Editor) 文件夹。
  2. 在此处创建 ExportBundle.js 脚本,并写入以下代码:
    @MenuItem ("Assets/Build AssetBundle From Selection - Track dependencies")
    static function ExportBundle(){
    
            var str : String = EditorUtility.SaveFilePanel("Save Bundle...", Application.dataPath, Selection.activeObject.name, "assetbundle");
            if (str.Length != 0){
                 BuildPipeline.BuildAssetBundle(Selection.activeObject, Selection.objects, str, BuildAssetBundleOptions.CompleteAssets, BuildTarget.iPhone);
            }
    }
    
  3. 设计必须作为预设下载的对象。
  4. 选择一个需要输出的预设,点击鼠标右键。

    如果正确地完成了开始两个步骤,就可以看见 Build AssetBundle From Selection - Track dependencies 内容菜单项。
  5. 如果想要包含该资源使用的所有内容,选中此菜单项。
  6. 此时将显示保存对话框,输入想要的资源包文件名称。将自动添加.assetbundle 扩展名。Unity iOS 运行时间仅接受使用相同版本的 Unity 编辑器构建的资源包作为最终应用程序。参阅 BuildPipeline.BuildAssetBundle,了解更多详细信息。

在 iOS 上下载资源包

注意:Apple 可能更改允许您写入数据的文件夹位置。始终检查 Apple 文件以确认您的应用程序符合要求。以下是 2013 年年初正确的建议:

  1. 资源包可以通过使用 WWW 类下载和加载,并实例化一个主资源。建议使用LoadFromCacheOrDownload 方法下载资源包。以下代码示例显示了如何进行这一操作:
    	var download : WWW;
    
    	var url = "http://somehost/somepath/someassetbundle.assetbundle";
    
    	download = WWW.LoadFromCacheOrDownload (url, 0);
    
    	yield download;
    
    	assetBundle = download.assetBundle;
    
    	if (assetBundle != null) {
    		// Alternatively you can also load an asset by name (assetBundle.Load("my asset name"))
    		var go : Object = assetBundle.mainAsset;
    
    		if (go != null)
    			instanced = Instantiate(go);
    		else
    			Debug.Log("Couldn't load resource");	
    	} else {
    		Debug.Log("Couldn't load resource");	
    	}
    

    下载的资源包文件将保存在 iOS 应用程序沙盒的库 (Library) 文件夹中,并设置有无备份 (No Backup) 标记。这意味着 OS 不会意外删除这些文件,且这些文件不会备份到 iCloud。将缓存大小限制保持较低水平是不错的想法。这可以防止您的应用程序占用所有的设备磁盘空间。
  2. 如果需要对缓存文件进行细粒度控制,可以通过 新 WWW(url) 使用定期 WWW 下载,然后使用 .NET 文件 API 将下载的文件保存到磁盘。可以将需要的文件保存至 Application.temporaryCachePath(库 (Library)/类 (Caches),由 OS 清理)文件夹或者 Application.persistentDataPath(文件,不会由 OS 清理)文件夹。请务必通过 iPhone.SetNoBackupFlag 在这些文件上设置无备份标记,防止其备份至 iCloud。注意:未设置此标记可能导致应用程序提交至 App Store 时被拒绝。如需在将来重新使用这些文件,通过 WWW 类和 savedassetbundle.assetbundle 加载即可。示例缓存代码如下:
    	// Code designed for caching on iPhone, cachedAssetBundle path must be different when running in Editor
    	// See code snippet above for getting the path to your Library/Caches folder
    	private var cachedAssetBundle : String = Application.temporaryCachePath + "/savedassetbundle.assetbundle"; 
    	var cache = new System.IO.FileStream(cachedAssetBundle, System.IO.FileMode.Create);
    	cache.Write(download.bytes, 0, download.bytes.Length);
    	cache.Close();
            iPhone.SetNoBackupFlag(cachedAssetBundle);
    	Debug.Log("Cache saved: " + cachedAssetBundle);
    
注意:如果启用了文件共享,可以从文件 (Documents) 文件夹测试读取文件。在 Info.plist 文件设置 UIFileSharingEnabled 为 true,您将可以从 iTunes 访问文件 (Documents) 文件夹。注意,文件 (Documents) 内容已缓存至 iCloud,因此这不是保存已发布程序资源包的位置。查阅 Apple iOS 文档中的文件系统基础知识

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文