macos - 您如何制作仅在有限时间内有效的 cocoa 演示应用程序?

标签 macos cocoa

我使用了很多 cocoa 演示应用程序,它们在 3 天或一个月左右后停止工作。他们是怎么做到的?最好的方法是什么?另外,有什么限制?

最佳答案

(免责声明:我以前从未制作过试用版,只是阅读了该主题并使用了其中的一堆。)

限制都来自这样一个事实,即用户系统上的任何内容,用户都可以修改。所以:

  • 聪明的小气鬼可能会更改您的应用程序的可执行文件,以排除或以其他方式挫败您所做的任何检查。
  • 你必须在某处存储使用的时间(或者,更懒惰但不是用户友好的,他们开始使用你的应用程序的日期)。无论您将它存储在何处,用户都必须能够更改它(因为您的应用程序作为他们运行),这意味着如果他们找到它,他们可以重置时钟。
  • 如果您在沙箱中运行,这是不可能的,除非您将上述时间跟踪数据存储在用户默认值或钥匙串(keychain)中,其中任何一个都可能显而易见,或者请求临时异常(exception)权利以在任何地方写入文件系统。限时试用无论如何都不能在 App Store 中进行,但是如果 future 版本的 Mac OS X 需要 App Store 或沙盒,您的时间限制将被打破,我们只能希望它不会阻止用户完全使用您的应用程序。
  • 还有处理付款的问题。一种方法是在 App Store 中销售应用程序,无需任何试用执行代码,然后自己分发一个单独的构建版本,该版本始终强制执行时间限制。如果您自己处理付款,则需要在用户系统上存储用户许可的记录,并且您需要检查该许可。然后,这很容易受到同样的问题的影响:用户可能会伪造许可证或“借用”(例如,从warez 站点下载)其他人的许可证。

  • 当然,好处是用户有一些时间可以免费试用该应用程序而不必掏钱,所以在这段时间结束时(如果您的应用程序很好并且满足了他们的需求),他们'会更有可能购买。

    在试用期结束时,您可以选择会发生什么:
  • 将用户完全锁定在应用程序之外。
  • 切出特征。橡子就是这样做的。
  • 让他们打开文档,但不能保存或打印。 (您可以阻止屏幕截图,但祝您在处理错误报告时好运。)
  • 让他们保存或(如果适用)打印,但以某种方式降低部分或全部文档的质量。对于视觉创作,例如图像,水印可能会起作用。对于音频,您可以将采样率限制为令人不快的值,例如 20 kHz 或更低。 (这里有一个案例,您可以始终无损地处理自己的专有格式,并且只会将导出降级为常见格式,例如 TIFF、JFIF 或 AIFF。)Fission 就是这样做的。
  • 只是唠叨他们。 (可与以上任意组合。)
  • 唠叨他们并延迟用户关闭它的能力。您甚至可以在用户不付费的时间越长的情况下增加延迟。

  • 试用期的一个很好的替代方案是拥有一个单独的“免费”版本,功能较少(或带有广告)。这在两个 App Store 中尤为常见。

    另一个考虑因素是试用期是使用天数还是首次使用后的天数。后者更容易实现,因为您只需记录第一次使用的日期并进行减法。前者更加人性化,因为它不会因为用户启动应用程序、玩了 5 分钟并在 31 天后返回进行真正的试用而惩罚用户。

    您还可以对启动次数实现限制。实现就像首次使用后的几天一样简单,但不会惩罚只玩一次应用程序。

    有些用户就是不会付费。一些用户几乎会做任何事情来不付钱。

    所以你需要取得平衡。您需要提供基本的难度级别,以便最懒惰的小气鬼不能简单地defaults write com.example.yourapp DaysSinceFirstUse -int 0并永远使用您的应用程序,同时不要让您的应用程序过于繁琐(少付钱)以至于他们没有尝试。

    所以以下是一些不要做的事情:
  • 尝试在其许可证上的用户姓名(在购买时输入)与其帐户或地址簿中的姓名之间强制执行平等。写任何名字有十几种不同的方式,有些人有多个名字(通过婚姻、别名、合法的更名、多种语言、星际迷航粉丝等),所以这个或类似的东西是一个虚假的检查会激怒更多的合法用户而不是阻止盗版。
  • 扣留用户的数据。请参阅我上面关于您始终无损处理的专有格式的优点的观点。如果您在试用期间总是降低输出,请在应用程序启动时的“这是试用版”对话框中明确说明这一点。
  • 需要互联网连接。不是每个人都有一个(可以连接到任意服务器),也不是每个人都拥有一个。向游戏行业学习:不要疏远您的用户。
  • 安装在后台运行和/或与您的应用程序位于不同位置的任何类型的版权执法软件。用户会因此而恨你。

  • 至于怎么做,这是我推荐的:
  • 实现“实际使用天数”检查。这可以是一个卖点。当一项试验明确说它使用这种检查时,我的心很暖和。
  • 我会说在几个小时内存储它。启动时,从存储位置获取当前小时数。添加两个小时并将其写回(因此用户无法强制退出您的应用程序以解决此问题)。退出时,将自启动以来的实际小时数添加到最初读取的数字并将修改后的数字写回。
  • 将其存储在应用程序支持中的不可见文件中。对其进行加密(同样,您想打败随意​​的盗版),但不要浪费太多时间进行防弹。请记住,您的应用程序必须包含所有内容以对其进行加密(以跟踪)和解密(以执行检查),因此无论您做什么,一个足够坚定(并受过教育)的小气鬼都可以打破这一点。
  • 启动时,从存储位置获取当前小时数并测试它是否超过限制。 (如果您接受我的立即添加两个小时的建议,请在针对限制进行测试后执行此操作。)30 天是 30×24=720 小时。如果超过限制,请制定您的试用期措施。
  • 如果您自己销售软件,请对许可证文件使用对称公钥加密。我认为 AquaticPrime 可以做到这一点。您使用您的私钥加密许可证,并在应用程序中分发公钥,该应用程序使用公钥解密和检查许可证。几乎牢不可破。您可以使用他们在购买时提供的电子邮件地址通过电子邮件向客户发送许可证文件。 (告诉他们他们将通过电子邮件收到许可证,这样他们就不会输入虚构的地址。)
  • 如果您这样做,请确保在试用结束之前和结束之后都测试输入许可证。
  • 仅在没有许可证时才进行试用检查。
  • 如果您可以在 App Store 中销售您的应用程序,我建议您这样做。如果您还想自己分发试用版,请在没有许可代码的情况下进行,这样试用检查就会无条件地进行。当然,App Store 版本不需要(也不得有)试用检查。
  • Watch this. (注意:它早于 Apple 的两个 App Store。)
  • 关于macos - 您如何制作仅在有限时间内有效的 cocoa 演示应用程序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7730916/

    相关文章:

    ios - 使用 PheripheralManager/CBCentralManager 将 macbook 变成 iBeacon 后找不到

    R M1 构建不会编译包

    python - 如何使用python创建新文件

    objective-c - 基于 View 的 NSTableView,使行高依赖于内容

    c++ - 如何检查应用程序在 OS X 下的位置?

    Java 应用程序在终端 shell 中运行?

    ios - 检查 NSUnderlineStyle BitMask 的值

    cocoa - 在 OSX 10.5 下绑定(bind)到 Apple 键盘上的媒体键

    cocoa - 获取 ABPerson 属性的标签名称

    objective-c - OS X NSDatePicker - 如何将日历设置为今天