2

ComposeBackEndのsetSignature:メソッドをスウィズすることで、リモートサーバーから取得したカスタム署名を設定するPythonを使用してMail.appプラグインを作成しました。以下のクラスダンプに従って、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

誰かがこれを実行しようとしている場合に備えて、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 :(たとえばwebFrameをグローバル変数として設定し、メインウィンドウの読み込みをサブクラス化する)の前にURLリクエストを呼び出す必要があります。そうしないと、時間内に読み込まれません。空のWebArchiveが表示されます。

于 2012-11-13T21:40:52.563 に答える
0

しかし、setWebArchive: (NSData オブジェクトを受け取る必要があります) を使用して HTML 署名を設定しようとすると、次のエラーが発生します。

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()、問題は解決するはずです。

最後に、ここでデバッグ出力を少し行う価値があります。WebArchiveを取得してを-[WebArchive data]返すと思われる場合はNSData、非常に簡単にテストできます。

print webArchive
print webArchive.data()
于 2012-11-07T23:50:12.673 に答える