2017-09-15 13 views
0

ホストアプリケーションをパラメータで開くには、自分のアプリケーション拡張が必要です。私はカスタムURLUIApplication.sharedで開きます。複数のパラメータを持つ関数のセレクタ

今すぐ。私の最後のビルドは、テストフライトでメッセージ"Need test for export compliance"またはそのようなもので拒否されました(iTunes接続は英語で実行したくありません)。だから、がBuild SettingsNOに設定されていると考えられます。

フラグをYESに設定すると、UIApplication.sharedの使用が無効になります。

// Get "UIApplication" class name through ASCII Character codes. 
NSString *className = [[NSString alloc] initWithData:[NSData dataWithBytes:(unsigned char []){0x55, 0x49, 0x41, 0x70, 0x70, 0x6C, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6F, 0x6E} length:13] encoding:NSASCIIStringEncoding]; 
if (NSClassFromString(className)) 
{ 
    // A different way to call [UIApplication sharedApplication] 
    id object = [NSClassFromString(className) performSelector: @selector(sharedApplication)]; 
    // These lines invoke selector with 3 arguements 
    SEL selector = @selector(openURL:options:completionHandler:); 
    id (*method)(id, SEL, id, id, id) = (void *)[object methodForSelector: selector]; 
    method(object, selector, myURL, nil, nil); 
    // Close extension 
    [self.extensionContext completeRequestReturningItems: @[] completionHandler: nil]; 
} 

は、あなたが見ることができるように、これはObjective-Cですが、私もそれを行う必要があります。だから私は(残念ながら、レコードを見つけることができません)私はいくつかの時間前にここで見つける古い方法を使うことにしましたSwifty

let codes = [CUnsignedChar](arrayLiteral: 0x55, 0x49, 0x41, 0x70, 0x70, 0x6C, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6F, 0x6E) 
let className = String(data: Data(bytes: UnsafeRawPointer(codes), count: 13), encoding: String.Encoding.ascii) ?? "" 
if NSClassFromString(className) != nil 
{ 
    let object = NSClassFromString(className)?.shared() 
    let sel = #selector(_:options:completionHandler:) 
    let meth = object?.method(for: sel) 
    ... 

問題がsel(予想表現)である:私はこだわっているところ だからここにあります。私はここに参照しようとしている方法は、このこと

#selector(open(_:options:completionHandler:)) 

は、私はそのようなメソッドを持っていないで、このコードを実装していますビューコントローラいるので(未解決の識別子を使用)のいずれかを動作しません

open(_:options:completionHandler:) 

です。

質問:後でmethオブジェクトで使用するいくつかのパラメータを持つ名前のないセレクタ参照を作成するにはどうすればよいですか?ありがとう。

+0

...私は 'meth'は変数の良い名前だとは思わない。 – the4kman

+0

@ the4kman後でテキストを再構成します。コードが機能しない場合、変数の名前は関係ありません。 –

答えて

1

Stringを使用してSelectorのインスタンスを宣言できるNSSelectorFromStringメソッドを使用できます。

私は完全なソースコードを持っていませんが、いくつかの調整で、以下の作業をする必要があります:メソッドの

NSSelectorFromString("open(_:options:completionHandler:)") 

詳しいドキュメントはhere可能です。

+0

ありがとうございます。 'NSClassFromString(className)?. shared()'は、 'UIApplication'には' shared() 'メソッドがなくクラスclass' shared'を持っているので、望ましくないクラスオブジェクトを返します。たぶんあなたは未知のクラスの変数にどのようにアクセスできるのか知っていますか? –

+0

'let object =(NSClassFromString(className)as UIApplication)?. shared()'はどうですか? – jbouaziz

+0

'スタティックメンバ 'shared'は 'UIApplication'型のインスタンスでは使用できません。 –

関連する問題