Apple Mail.app使用插件设置HTML签名

时间:2012-11-07 22:21:43

标签: python objective-c cocoa

我使用Python创建了一个Mail.app插件,通过在ComposeBackEnd中调用setSignature:方法来设置从远程服务器提取的自定义签名。根据下面的类转储,我可以使用setSignatureContents设置纯文本签名:这是有用的。

@interface Signature : NSObject <NSCopying>
{
    NSString *_uniqueId;
    NSString *_name;
    NSData *_webArchiveData;
    BOOL _isRich;
    BOOL _isSavedAsRich;
    BOOL _isDirty;
    MFSyncedFile *_syncedFile;
}

- (id)syncedFile;
- (id)signaturePath;
- (unsigned long long)hash;
- (BOOL)isEqual:(id)arg1;
- (BOOL)isRich;
- (void)setIsRich:(BOOL)arg1;
- (void)setWebArchive:(id)arg1;
- (id)webArchive;
- (id)webArchiveData;
.....
- (void)setSignatureContents:(id)arg1;
- (id)signatureContents;
- (void)setSignatureName:(id)arg1;
- (id)signatureName;

@end

但是,当我尝试使用setWebArchive设置HTML签名时:(应该使用NSData对象):

signature.setWebArchive_(NSData.dataWithContentsOfURL_(NSURL.URLWithString_('http://...')))

我收到以下错误:

11/7/12 11:07:38.858 AM Mail[8820]: -[NSConcreteData data]: unrecognized selector sent to instance 0x7ffc2386bc00

(远程文件格式正确)

有没有办法让这项工作?提前谢谢。


编辑 - 试过这个(返回应该响应-[data]的WebArchive对象):

wds = WebDataSource.alloc().initWithRequest_(NSURLRequest.requestWithURL_(NSURL.URLWithString_('http://...')))
        webarchive = wds.webArchive
        signature.setWebArchive_(webarchive)

结果:

11/7/12 3:26:59.173 PM Mail[16814]: An uncaught exception was raised
11/7/12 3:26:59.173 PM Mail[16814]: Class OC_PythonObject: no such selector: data

2 个答案:

答案 0 :(得分:0)

  

但是,当我尝试使用setWebArchive设置HTML签名时:(应该使用NSData对象)...我收到以下错误:

11/7/12 11:07:38.858 AM Mail[8820]: -[NSConcreteData data]: unrecognized selector

此错误告诉您-[setWebArchive:]正在尝试呼叫-[data]对象上的NSData。由于-[NSData data]不存在,因此会出现无法识别的选择器异常。

显然它不需要NSData,它会通过返回-[data]来响应NSData

  

编辑 - 试过这个(返回WebArchive对象,它应该响应 - [data]):

wds = WebDataSource.alloc().initWithRequest_(NSURLRequest.requestWithURL_(NSURL.URLWithString_('http://...')))
webarchive = wds.webArchive
signature.setWebArchive_(webarchive)

等待......你没有为这个显示类转储,但是另一个类有一个方法-[webArchive],而不是正确的webArchive。所以,如果它们完全一致,那么这个也可能有一个方法,而不是一个属性。

如果是这样,这意味着wds.webArchive将不会是一个WebArchive对象,它将成为一个包装器对象,它大致代表一个Python绑定方法的ObjC等价物。在那件事上调用-[data]几乎肯定会失败。

11/7/12 3:26:59.173 PM Mail[16814]: Class OC_PythonObject: no such selector: data

如果您只是将其更改为wds.webArchive(),则可以解决问题。

最后,在这里做一些调试打印是值得的。如果您认为自己有WebArchive-[WebArchive data]返回NSData,则可以非常轻松地进行测试:

print webArchive
print webArchive.data()

答案 1 :(得分:0)

如果有人想要这样做,这里是创建和设置Web存档的解决方案(您需要添加WebKit框架):

WebView *webView = [[WebView alloc] init];
WebFrame *webFrame = [webView mainFrame];

NSURLRequest *urlRequest = [NSURLRequest requestWithURL:[NSURL URLWithString:@"http://..."]];
[webFrame loadRequest:urlRequest];

-

WebDataSource *webDataSource = webFrame.dataSource;
WebArchive *webArchive = webDataSource.webArchive;
[signature setWebArchive:webArchive];

转换为PyObjC语法后,上面的代码适用于最新版本的Mail。它不可能是本地文件,因为10.8上的Gatekeeper限制它,你必须在setSignature之前调用URL请求:(将webFrame设置为全局变量并将子窗口加载为子类例如)否则它将无法及时加载你会得到一个空的WebArchive。