应用程序准备“内购”

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

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

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

请注意,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 类file:///pathtoyourapplication/Library/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 文档中的文件系统基础知识

Page last updated: 2013-06-28