【问题标题】:System() command not working when enabling app sandboxing启用应用程序沙盒时 System() 命令不起作用
【发布时间】:2012-07-02 09:41:39
【问题描述】:

Apple 现在要求对所有未来的应用程序进行沙盒处理,因此我按照说明对应用程序进行沙盒处理。构建成功,但随后我的 system(rm -rf ~/.Trash/*) 命令停止工作。没啥事儿。我在这里感到困惑的是为什么此系统命令不适用于 App Sandboxing/Entitlements。这是我的权利设置:

权利:检查

应用沙盒:已选中

这是我当前的代码:

- (void)viewDidLoad {
[self emptyTrash];
}

- (void)emptyTrash {
system(rm -rf ~/.Trash/*);
}

感谢您的帮助!

【问题讨论】:

  • 您确定清空用户的垃圾箱是您应该做的事情吗?一方面,我很高兴沙盒阻止你这样做!
  • 我不是 100% 确定的(所以我只是在评论中说),但如果我没记错的话,在沙盒模式下,~ 不会解析为 /Users/username/,但是到 ~/Library/Application Data 中的某个文件夹或类似的东西...再次查看 Sandboxing 上的文档。
  • 为什么要使用system()来删除目录?

标签: xcode cocoa system entitlements sandbox


【解决方案1】:

看看documentation

在 POSIX 层之上的 Mac OS X 路径查找 API,返回路径 相对于容器而不是相对于用户的家 目录。如果您的应用在沙箱之前访问 用户的实际主目录 (~) 并且您正在使用 Cocoa 或 Core 基础 API,然后,在您启用沙盒后,您的路径查找 代码会自动使用您应用的容器。

你可以使用

struct passwd *getpwuid(uid_t uid);
struct passwd {
char    *pw_name;       /* user name */
char    *pw_passwd;     /* encrypted password */
uid_t   pw_uid;         /* user uid */
gid_t   pw_gid;         /* user gid */
__darwin_time_t pw_change;      /* password change time */
char    *pw_class;      /* user access class */
char    *pw_gecos;      /* Honeywell login info */
char    *pw_dir;        /* home directory */
char    *pw_shell;      /* default shell */
__darwin_time_t pw_expire;      /* account expiration */
}

 #include <pwd.h>
 #include <sys/types.h>
 char *HomeDirectory = getpwuid(getuid())->pw_dir;
 NSLog(@"%s", HomeDirectory);
 system([[NSString stringWithFormat:@"rm -rf %s/.Trash/",HomeDirectory] UTF8String]);

【讨论】:

  • 非常感谢!工作一种享受!
猜你喜欢
  • 1970-01-01
  • 2012-11-13
  • 1970-01-01
  • 1970-01-01
  • 2018-12-15
  • 1970-01-01
  • 2022-12-21
  • 2013-10-31
  • 1970-01-01
相关资源
最近更新 更多