我使用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
答案 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。