我有一个可可应用程序,我想在其中接受从mail.app拖动到应用程序主窗口中的电子邮件。我的应用程式中有DidFinishLaunching:
[_window registerForDraggedTypes:
[NSArray arrayWithObjects:
NSFilenamesPboardType,
(NSString *)kPasteboardTypeFileURLPromise, nil]]; //kUTTypeData
[_window setDelegate:(id) self];
效果很好,我可以在performDragOperation中使用以下方式接收文档:
NSArray * files = [sender namesOfPromisedFilesDroppedAtDestination:url];
但是,这只能让我一拖一地拖动电子邮件。如果我标记了几封电子邮件,则一切正常,直到我删除为止,然后什么也没有发生。 performDragOperation甚至没有被调用。
我试图将kUTTypeData添加到registerForDraggedTypes ...,然后调用performDragOperation ...,但是随后我不能使用namesOfPromisedFilesDroppedAtDestination:url,因为它返回nil指针。
当我将kUTTypeData包含在寄存器中时...我将其包含在performDragOperation中以查看拖动的类型:
pboard = [sender draggingPasteboard];
NSLog(@"perform drag entered, %@", [pboard types]);
结果如下:
2013-07-25 15:09:50.771 BO2ICAL[1672:303] perform drag entered, (
"dyn.ah62d4rv4gu8y4zvanr41a3pwfz30n25wqz4ca5pfsr30c35feb4he2pssrxgn6vasbu1g7dfqm10c6xeeb4hw6df",
"MV Super-secret message transfer pasteboard type",
"dyn.ah62d4rv4gu8zg7puqz3c465fqr3gn7bakf41k55rqf4g86vasbu1g7dfqm10c6xeeb4hw6df",
"Super-secret Automator pasteboard type"
)
单个电子邮件的列表为:
2013-07-25 15:14:30.096 BO2ICAL [1672:303]执行输入的拖动,(
“ dyn.ah62d4rv4gu8y4zvanr41a3pwfz30n25wqz4ca5pfsr30c35feb4he2pssrxgn6vasbu1g7dfqm10c6xeeb4hw6df”,
“ MV超级秘密消息传输粘贴板类型”,
“ dyn.ah62d4rv4gu8zg7puqz3c465fqr3gn7bakf41k55rqf4g86vasbu1g7dfqm10c6xeeb4hw6df”,
“超级秘密Automator粘贴板类型”,
“ dyn.ah62d4rv4gu8yc6durvwwa3xmrvw1gkdusm1044pxqyuha2pxsvw0e55bsmwca7d3sbwu”
“ Apple文件承诺粘贴板类型”,
“ public.url”,
“ CorePasteboardFlavorType 0x75726C20”,
“ dyn.ah62d4rv4gu8yc6durvwwaznwmuuha2pxsvw0e55bsmwca7d3sbwu”,
“ Apple URL粘贴板类型”,
“ public.url-name”,
“ CorePasteboardFlavorType 0x75726C6E”,
“ com.apple.pasteboard.promised-file-content-type”,
“ com.apple.pasteboard.promised-file-url”,
“ dyn.ah62d4rv4gu8y6y4usm1044pxqzb085xyqz1hk64uqm10c6xenv61a3k”,
NSPromiseContentsPboardType
)
有没有人有任何建议如何正确执行此操作以接受多封电子邮件?
最佳答案
我找到了解决方案。我发现以“ kUTTypeData”模式提供的数据为我提供了足够的数据,可以直接从mail.app邮箱中获取文件。
在mbox文件夹中,有一个包含长序列的数字和破折号的文件夹,在邮箱层次结构中的任何位置都没有此名称的踪迹,但是由于该名称仅包含此文件夹和info.plist文件,因此我使用此功能来抓取该名称:更新:由于该文件夹有时包含子邮箱,而该子邮箱的名称可能更长,因此实施了regexp检查...
-(NSString*)FindCodedFolderInMailbox:(NSString*)mailboxpath {
NSString *uuid_regexp = @"[A-F0-9]{8}-[A-F0-9]{4}-[A-F0-9]{4}-[A-F0-9]{4}-[A-F0-9]{12}";
NSPredicate *uuid_test = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", uuid_regexp];
NSFileManager *fileManager = [NSFileManager defaultManager];
NSArray *fileList = [fileManager contentsOfDirectoryAtPath:mailboxpath error:nil];
for (NSString * file in fileList) {
if ([uuid_test evaluateWithObject: file]){
return file;
}
}
return nil;
}
然后,在我发现没有“ NSPromiseContentsPboardType”的部分,而是“超级机密自动粘贴板类型”,我写了以下部分(我打算删除一些NSLog条目,但这里是:
} else if ( [[pboard types] containsObject:@"Super-secret Automator pasteboard type"] ) {
NSFileManager *fileManager = [NSFileManager defaultManager];
// Create the URL for the destination folder and ensure it exists.
NSURL *applicationFilesDirectory = [self applicationFilesDirectory];
NSURL *url = [applicationFilesDirectory URLByAppendingPathComponent:@"documents"];
BOOL isDir;
if (!([fileManager fileExistsAtPath:[url path] isDirectory:&isDir] && isDir)) {
NSError * error = nil;
[ fileManager createDirectoryAtURL:url withIntermediateDirectories: YES attributes:nil error:&error];
if (error) {
[[NSApplication sharedApplication] presentError:error];
}
}
BOOL ok = false;
// locate the mailbox path....
NSString *mailboxpath = [pboard stringForType:@"MV Super-secret message transfer pasteboard type"];
NSLog(@"Mailboxpath: %@", mailboxpath);
NSString * codedFolder = [self FindCodedFolderInMailbox:mailboxpath];
if (codedFolder) {
NSString * codedpath = [NSString stringWithFormat:@"file://%@/%@/Data", mailboxpath, codedFolder];
NSURL * mb1 = [NSURL URLWithString:codedpath];
NSLog(@"Directory:%@", mb1);
NSArray *msgArray = [pboard propertyListForType:@"Super-secret Automator pasteboard type"];
if (msgArray) {
for (NSDictionary *msg in msgArray) {
// Locate the message....
NSNumber * msgID = [msg valueForKey:@"id"];
NSLog(@"Melding(%@):%@", msgID, msg);
NSString * filename = [NSString stringWithFormat:@"%@.emlx", msgID];
// second and first letter of id
NSString * idSec = [[msgID stringValue]substringWithRange:(NSRange){1, 1}];
NSString * idFirst = [[msgID stringValue]substringWithRange:(NSRange){0, 1}];
NSString * subpath = [NSString stringWithFormat:@"%@/%@/Messages/%@",idSec, idFirst, filename];
NSURL * thisFilePath = [mb1 URLByAppendingPathComponent:subpath];
if ([fileManager fileExistsAtPath:[thisFilePath path]]) {
NSURL *destpath = [url URLByAppendingPathComponent:filename];
NSError * error = nil;
[fileManager copyItemAtURL:thisFilePath toURL:destpath error:&error];
if (error) {
[[NSApplication sharedApplication]presentError:error];
} else {
[self ParseEmlMessageforPath:[destpath path] filename:filename];
}
}
}
}
}
现在我们开始.... :-)
关于objective-c - 将电子邮件从mail.app拖放到NSWindow对象中,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/17859184/