移动和使用托管的 In App Purchase 托管内容

Posted

技术标签:

【中文标题】移动和使用托管的 In App Purchase 托管内容【英文标题】:Moving and using hosted In App Purchase hosted content 【发布时间】:2014-07-09 06:04:15 【问题描述】:

我知道我正在下载托管的应用内购买。 它将托管的 In App Purchase 内容下载到 Cache 目录,但由于我需要托管 In App Purchase 内容才能永久保存,我需要将其移动到 Documents 目录。

一旦它在那里,我就需要实际访问内容。

我正在使用

    NSURL *url = download.contentURL;
    NSError *error = nil;
    NSArray *properties = [NSArray arrayWithObjects: NSURLLocalizedNameKey,
                           NSURLCreationDateKey, NSURLLocalizedTypeDescriptionKey, nil];

    NSArray *zipContentsArray = [[NSFileManager defaultManager]
                      contentsOfDirectoryAtURL:url
                      includingPropertiesForKeys:properties
                      options:(NSDirectoryEnumerationSkipsHiddenFiles)
                      error:&error];

显示缓存中的输出

The download's contentURL is
file:///private/var/mobile/Applications/**/Library/Caches/***.zip/

zipContentsArray = (
    "file:///private/var/mobile/Applications/***/Library/Caches/***.zip/ContentInfo.plist",
    "file:///private/var/mobile/Applications/***/Library/Caches/***.zip/Contents/",
    "file:///private/var/mobile/Applications/**/Library/Caches/***.zip/META-INF/"
)

我将如何访问内容(即使是在 Caches 文件夹中 - 我假设无论其位置如何,这都是相同的过程)?

令人抓狂的是,Apple 提供的有关整个过程的文档很少,因此我们会非常欢迎任何帮助。

【问题讨论】:

“它把它下载到缓存目录”:什么是“它”?这似乎是一个关于递归移动目录的问题;对吗? @***foe "it" 是托管的应用内购买内容 - 我想问题是两部分:首先,如何将下载的内容从 Caches 目录移动到 Documents 目录。其次,我有后如何使用。 Caches 目录只有在用户卸载应用(或者您提供了清除缓存的界面)时才会被删除。你有什么理由不想把它放在那里?此外,用户可以看到文档目录,因此您可能根本不希望这样做。 @remus IAP 的标准是什么——比如游戏关卡或音频?在 Apple 的文档中,他们说“下载完成后,您的应用程序负责将其移动到适当的位置。”这意味着它应该被移动。它还说“对于如果设备用完磁盘空间(然后由您的应用程序重新下载)可以删除的内容,请将文件保留在 Caches 目录中。否则,将文件移动到 Documents 文件夹并设置标志将它们从用户备份中排除。”如果设备空间不足,缓存将被删除。 是的,这是一个公平的观点。你可能想把它保存在文档中。 【参考方案1】:

我目前也遇到了同样的问题,但我也许可以让您更进一步。您有权将您的内容从缓存中移出,这在 Apple IAP 指南中有说明。 我正在尝试下载非消耗性 IAP 的内容并将其内容移动到正确的路径。 我已经设法将下载的内容放到 iphone 缓存中,但现在需要将此内容传递到正确的路径。

我使用了来自http://xinsight.ca/blog/iap-content-download-in-ios6/ 的一些代码,这似乎是我需要的;但是我不确定我需要为我的应用程序包声明哪条路径。从代码来看,这似乎与'MyConfig'有关

- (void) processDownload:(SKDownload*)download;

// convert url to string, suitable for NSFileManager
NSString *path = [download.contentURL path];

// files are in Contents directory
path = [path stringByAppendingPathComponent:@"Contents"];

NSFileManager *fileManager = [NSFileManager defaultManager];
NSError *error = nil;
NSArray *files = [fileManager contentsOfDirectoryAtPath:path error:&error];
NSString *dir = [MyConfig downloadableContentPathForProductId:download.contentIdentifier]; // not written yet

for (NSString *file in files) 
    NSString *fullPathSrc = [path stringByAppendingPathComponent:file];
    NSString *fullPathDst = [dir stringByAppendingPathComponent:file];

    // not allowed to overwrite files - remove destination file
    [fileManager removeItemAtPath:fullPathDst error:NULL];

    if ([fileManager moveItemAtPath:fullPathSrc toPath:fullPathDst error:&error] == NO) 
        NSLog(@"Error: unable to move item: %@", error);
    

有人可以对此进行补充,以便我们都能取得一些进展吗?

【讨论】:

只是添加到上面; Apple IAP 编程指南指出“文件保存在未设置备份标志的缓存目录中。下载完成后,您的应用程序负责将它们移动到适当的位置。对于在设备空间不足时可以删除的内容。 .. 将文件留在缓存目录中。否则将它们移动到 Documents 文件夹并设置标志以将它们从用户备份中排除。”所以我想我们需要正确的 Documents 目录路径。

以上是关于移动和使用托管的 In App Purchase 托管内容的主要内容,如果未能解决你的问题,请参考以下文章

In App Purchase Android : 购买已购买的产品时 Google Play 没有响应

About In-App Purchase - 关于应用程序内购买

Android In-App Purchase 离线检查买家

Flutter:如何在 in_app_purchase 中调用 Apple pay bottom sheet?

Xcode 12 In App Purchase Implementation - SKProductsRequestDelegate 没有被调用

从 App 内获取 iOS In-App-Purchase 产品的产品参考名称