在卸载或重新安装Mac应用程序

时间:2015-12-04 03:19:54

标签: macos cocoa

对于使用Cocoa / Objective-C编写的Mac应用程序,一个常见的客户支持问题是他们尝试“卸载并重新安装”以期回到干净的状态。但问题是新安装仍在读取上一次安装留下的配置文件和数据库。客户只是遇到了导致他首先卸载的问题。然后我必须引导他通过哪些文件删除以恢复到OK状态和/或向他展示从UI重置的正确方法。

虽然真正的痛点和错误随着时间的推移得到修复,但我想知道 如果可以执行以下任一操作:

  1. MyApp.app移动到垃圾箱时,是否可以运行某些代码来清除应用程序在用户主目录中留下的任何问题?或者清单/ pinfo文件中可以指定某些目录或文件的内容被删除?
  2. OR

    1. 当应用程序启动时,它可以以编程方式检测到它已经“重新安装”,以便它可以为新安装执行必要的清理代码吗?

2 个答案:

答案 0 :(得分:2)

在应用启动时,您可以考虑:

  1. 应用版本号
  2. 应用程序的路径
  3. 应用的inode,即.app目录的inode
  4. 将这些旧值存储在应用程序的首选项/应用程序支持中,与启动时的当前值进行比较。根据启发式方法,您可以决定/猜测应用程序是否已更新(第1个),移动/复制/多个副本(第2个),删除并重新创建(第3个)或其他内容。它不完美,它是可能重新创建的应用具有相同的inode编号,但它的不太可能当然如果它确实改变了你知道它的不同。目录

    HTH

答案 1 :(得分:0)

NSString * appPath = [[NSBundle mainBundle] bundlePath];
NSDictionary * fileAttribs = [[NSFileManager defaultManager]  
    attributesOfItemAtPath:appPath error:nil
];
NSDate * creationDate = [fileAttribs objectForKey:NSFileModificationDate];

NSDate * savedDate = [[NSUserDefaults standardUserDefaults] 
    objectForKey:@"AppBundleFileModificationDate"
];

if (!savedDate) {
    // ... App never ran before ...
} else if (![creationDate isEqual:savedDate]) {
    // ... App did run before, 
    // but bundle has been re-installed or updated ...
} else {
    // ... App did run before and has not 
    // been re-installed or updated ...
}

[[NSUserDefaults standardUserDefaults]
    setObject:creationDate forKey:@"AppBundleFileModificationDate"
];

如何区分重新安装和更新?保存应用版本,如果是更新,则更改,不是,它是重新安装相同版本。

如果用户将应用程序移动到其他目录并从那里启动,则代码将错误地检测到重新安装。如果您还存储appPath并将其进行比较,则可以捕获该情况。

只要用户没有删除应用的偏好设置,您写入NSUserDefaults的内容就会幸免于难。