- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我遇到的情况是,我的 .dmg 文件将位于包含我的应用程序的可移动存储设备上。当我双击它时,它将安装在我的本地计算机上,并且安装的卷内将是我的 .app (应用程序文件)。现在,我希望我的应用程序在我的 dmg 文件安装到本地计算机上后自动启动。现在我的应用程序还需要有关实际 dmg 文件所在位置的信息,例如其在可移动存储设备上的路径。这是否可能,如果可以,我如何找到挂载该卷的 dmg 文件的路径。
谢谢
最佳答案
在 Mac OS X 中无法自动启动应用程序。存在一些安全原因。唯一可以自动启动的是 .pkg
文件,而且只能通过 Safari AFAIK。
可以确定应用程序所在的 DMG 文件。为此,您必须使用 IOKit。尝试使用 IORegistryExplorer。
这是我第一次尝试使用 IOKit,它是出于其他目的,但仍然应该有帮助。
// hopefully all needed headers
#include <sys/stat.h>
#include <IOKit/IOKitLib.h>
#include <IOKit/IOBSD.h>
#include <CoreFoundation/CoreFoundation.h>
/* First we want to get the major and minor BSD number
* of the DMG that our app is residing on.
*
* char *path is the path of a file that resides on the disk image.
* It is like this: /Volumes/Partition Name/SomeFile
* The simplest method to get such a path is to ask
* NSBundle for the path of the executable.
*/
// look up device number with stat
char *path = "path/to/app";
struct stat stats;
if (stat(path, &stats) != 0) {
return;
}
int bsd_major = major(stats.st_dev);
int bsd_minor = minor(stats.st_dev);
/* Now that we've got the BSD numbers we have to locate the
* IOService that has those numbers. IOKit works with
* CoreFoundation types.
*/
CFTypeRef keys[2] = { CFSTR(kIOBSDMajorKey), CFSTR(kIOBSDMinorKey) };
CFTypeRef values[2];
values[0] = CFNumberCreate(kCFAllocatorDefault, kCFNumberIntType, &bsd_major);
values[1] = CFNumberCreate(kCFAllocatorDefault, kCFNumberIntType, &bsd_minor);
CFDictionaryRef matchingDictionary;
matchingDictionary = CFDictionaryCreate(kCFAllocatorDefault,
&keys, &values,
sizeof(keys) / sizeof(*keys),
&kCFTypeDictionaryKeyCallBacks,
&kCFTypeDictionaryValueCallBacks);
CFRelease(values[0]);
CFRelease(values[1]);
// IOServiceGetMatchingService uses up one reference to the dictionary
io_service_t service = IOServiceGetMatchingService(kIOMasterPortDefault,
matchingDictionary);
if (!service) {
return;
}
/* Now this part is quite different from what I need
* for my application. I'm not sure how this works
* because I'm currently not at my Mac and cannot try it.
*
* You need to go up the IOService chain. It looks like this:
+-o IOHDIXHDDriveOutKernelUserClient
+-o IODiskImageBlockStorageDeviceOutKernel <---- You want to get up here
+-o IOBlockStorageDriver
+-o Apple UDIF read-only compressed (zlib) Media
+-o IOMediaBSDClient
+-o IOApplePartitionScheme
+-o Apple@1
| +-o IOMediaBSDClient
+-o disk image@2 <---- This is the matched IOService!
+-o IOMediaBSDClient
*
* IODiskImage... has a property "Protocol Characteristics" which is a
* dictionary that has the key "Virtual Interface Location Path" which is
* the path to the disk image. There are probably #defines somewhere in
* IOKit for those keys.
*
* This code is NOT tested. It's out of my head and the documentation.
* This goes up 4 times in the hierarchy. Hopefully there aren't more
* than 1 parents.
*/
for (int i = 0; i < 4; i++) {
io_service_t parent;
IORegistryEntryGetParentEntry(service, kIOServicePlane, &parent);
IOObjectRelease(service);
service = parent;
}
/* Getting the property from the IOService is the last step:
*/
CFDictionaryRef characteristics;
characteristics = (CFDictionaryRef)IORegistryEntryCreateCFProperty(service,
CFSTR("Protocol Characteristics"),
kCFAllocatorDefault, 0)
CFStringRef *dmgPath = CFDictionaryGetValue(characteristics,
CFSTR("Virtual Interface Location Path"));
// clean up
IOObjectRelease(service);
CFRetain(dmgPath);
CFRelease(characteristics);
// Use the path
// later
CFRelease(dmgPath);
由于免费桥接支持,大部分工作都可以使用 Foundation 类而不是 CoreFoundation 类来完成。这使得它更容易、更易读。
<小时/>如果 IOBlockStorageDriver 的父 IOService 是 IODiskImageBlockStorageDeviceOutKernel,则上面的示例代码可以正常工作。如果父 IOService 的名称是“AppleDiskImageDevice”,则 IOService 链看起来有点不同:
+-o IOHDIXHDDriveOutKernelUserClient
+-o AppleDiskImageDevice <---- You want to get up here
+-o IOBlockStorageDriver
+-o Apple Disk Image Media <---- This is different
+-o IOMediaBSDClient
+-o IOApplePartitionScheme
+-o Apple@1
| +-o IOMediaBSDClient
+-o disk image@2 <---- This is the matched IOService!
+-o IOMediaBSDClient
在上面的for循环之后,您可以获取如下所示的图像文件路径URL字符串:
CFMutableDictionaryRef properties = nil;
IORegistryEntryCreateCFProperties(service, &properties, kCFAllocatorDefault, kNilOptions);
if (properties) {
CFStringRef url = CFDictionaryGetValue(properties, CFSTR("DiskImageURL"));
CFRelease(properties);
}
IOObjectRelease(service);
关于cocoa + dmg 文件 + 追溯其路径,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1785439/
我目前使用 hdiutil创建我的 DMG。 我使用的命令是 hdiutil create -size xxxg myImage.dmg -fs HFS+.我总是在大小上坐立不安,直到我把它弄得足够近
我想下载当前 Xcode 工具的 .dmg 文件。我试过这些:how download xcode dmg file?和 How to download Xcode DMG or XIP file?
我想为我的 Mac 项目创建 dmg 文件。有人可以告诉我该怎么做吗?这是我的第一个 Mac 项目,我不知道如何继续。我还想为用户提供在启动时运行应用程序的选项。我该怎么做? 谢谢。 附注我还想添加自
我想创建 MAC 安装程序并想知道哪种类型的安装程序适合我的要求? 我的要求是 我有执行以下操作的 bash 脚本 获取硬件 ID 和特定于硬件的一些详细信息 构造 XML 生成 PLIST 从互联网
为 Applications 添加别名很容易。 DMG 中的文件夹,因为它位于 /Applications在每台 Mac 上。但是是否可以为用户的 Documents 添加别名?文件夹,其中 Docu
我见过一些 dmg,它们不仅在下载后安装,而且还复制下载文件夹中的安装程序并在安装程序应用程序中打开安装程序。 我不知道该怎么做? 任何人都可以帮忙吗? 最佳答案 我还没有看到自动打开 dmg 文件,
如何创建我的 Xcode 代码的应用程序文件 (.DMG) 以便我可以分发它? 最佳答案 还检查 DropDMG: http://c-command.com/dropdmg/ 被很多开发者使用,让生活
我正在使用 Xamarin.Mac 编写一个 cocoa 应用程序。我已将文件下载到下载文件夹中。现在我想打开我下载的文件。我怎么做 ?FileStream Open(字符串路径,FileMode 模
我遇到的情况是,我的 .dmg 文件将位于包含我的应用程序的可移动存储设备上。当我双击它时,它将安装在我的本地计算机上,并且安装的卷内将是我的 .app (应用程序文件)。现在,我希望我的应用程序在我
我能够创建 DMG 并安装该应用程序。到目前为止一切顺利。 但我面临的问题是脚本(shell 和 applescripts)创建了一个启用了最大化按钮的窗口。单击最大化按钮会使窗口看起来很丑,因为底部
这个问题已经有答案了: How do I create a nice-looking DMG for Mac OS X using command-line tools? (15 个回答) 已关闭 9
如何在不安装DMG的情况下提取其内容?我想将自动更新系统添加到我的应用程序中。它从网站下载 DMG,然后从中提取新版本的应用程序。 最佳答案 可以使用7-zip提取一些.dmg文件. $ 7z x y
我想为我的应用程序创建一个 DMG 文件。该 DMG 文件必须为我提供以下功能。 1-- 如果我重新启动计算机,那么我的应用程序必须自动启动。 如何在我的 DMG 文件中实现此类功能。 谢谢 苏尼尔·
我有一个应用程序经过签名、公证和装订,然后存档到一个 zip 文件中,该文件用作我的 Sparkle 更新程序的对象。 我还将它分发给新用户的 DMG 图像(并且是我网站上的主要下载)。我可以将经过公
我已经为 Java 应用程序创建了 app 和 dmg。我正在签名并通过协同设计验证 dmg 和应用程序。 codesign -s "mycompany name"myproduct.dmg/mypr
在 Objective C(或 Swift)中,我需要确定挂载的卷是否为磁盘镜像(从 .dmg 文件挂载)。 类似的问题让我找到了 NSURL Volume Property Keys ,但它们似乎都
我正在寻找将安装 .dmg 文件的小型 bash 或 python 脚本。 我们假设 dmg 包含一个或多个必须复制到 /Applications 的 .app 目录,覆盖任何已经存在的目录。 与 *
我想分发一个跨平台应用程序,其可执行文件略有不同,具体取决于下载它的用户。这是通过在可执行文件中的某处放置一个占位符字符串来完成的,该字符串在下载时被替换为用户特定的内容。 必须执行这些字符串替换的网
我正在签署 .dmg包含 .app具有有效的开发者 ID 配置文件。一切都已签名,包括框架。当我运行 codesign -dvvv ,出现正确的证书和satisfies its Designated
macOS中磁盘镜像文件和.app扩展名的具体区别是什么 最佳答案 磁盘镜像文件或 .dmg 是磁盘的副本,虚拟磁盘。在最简单的形式中,磁盘镜像是一个文件,其中包含通常驻留在物理设备(例如硬盘驱动器、
我是一名优秀的程序员,十分优秀!