2

我使用 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

(远程文件已经是正确的格式)

有什么办法可以使这项工作?提前致谢。


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

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
4

2 回答 2

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

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

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(),那应该可以解决问题。

最后,值得在这里做一些调试打印。如果你认为你有 aWebArchive-[WebArchive data]返回 a NSData,你可以很容易地测试它:

print webArchive
print webArchive.data()
于 2012-11-07T23:50:12.673 回答
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。

于 2012-11-13T21:40:52.563 回答