2013-04-25 8 views
12

का उपयोग कर यह वह जगह है इस सवाल का कोको संस्करण:कोको प्रोटोकॉल हैंडलर NSAppleEventManager और kInternetEventClass/kAEGetURL

AEInstallEventHandler handler not being called on startup

यहाँ मेरी Info.plist प्रोटोकॉल पंजीकरण है:

... 
    <key>CFBundleURLTypes</key> 
    <array> 
     <dict> 
      <key>CFBundleURLName</key> 
      <string>My Protocol</string> 
      <key>CFBundleURLIconFile</key> 
      <string>myicon</string> 
      <key>CFBundleTypeRole</key> 
      <string>Viewer</string> 
      <key>CFBundleURLSchemes</key> 
      <array> 
       <string>myapp</string> 
      </array> 
     </dict> 
    </array> 

यहाँ है जहाँ मैं सेट है kInternetEventClass/kAEGetURL ईवेंट को सुनने के लिए विधि जब ब्राउज़र लिंक "myapp: // unused /? a = 123 & b = 456":

लिंक के साथ क्लिक किया गया है

- (void)getURL:(NSAppleEventDescriptor *)event withReplyEvent:(NSAppleEventDescriptor *)reply 
{ 
    [[[event paramDescriptorForKeyword:keyDirectObject] stringValue] writeToFile:@"/testbed/complete_url.txt" atomically:YES]; 
} 

यहाँ परीक्षण वेब लिंक है::

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"> 
<html lang="en"> 
<head> 
</head> 
<body> 
    <a href="myapp://open/?a=123&b=456">Open My App</a> 
</body> 
</html> 

यह सब अच्छा काम करता है, तो आवेदन पहले से ही चल रहा है

- (void)applicationDidFinishLaunching:(NSNotification *)notification 
{ 
    [[NSAppleEventManager sharedAppleEventManager] setEventHandler:self andSelector:@selector(getURL:withReplyEvent:) forEventClass:kInternetEventClass andEventID:kAEGetURL]; 
    ... 
} 

यहाँ हैंडलर विधि है।

हैंडलर विधि कहा जाता है और पूरा यूआरएल पकड़ा जाता है।

हालांकि, यदि ऐप अभी तक एक ही लिंक नहीं चला रहा है तो ऐप लॉन्च होगा, लेकिन हैंडलर को नहीं बुलाया जाएगा - जो समझ में आता है क्योंकि हैंडलर अभी तक इस कार्यक्रम से बंधे नहीं थे।

यूआरएल में उन तर्क वेबपैड के साथ समन्वय करने के लिए हमारे आवेदन के लिए महत्वपूर्ण हैं। यद्यपि यह क्लिक तब होता है जब हमारा क्लिक पहले से ही चल रहा है जब यह क्लिक होता है, यह अपेक्षा करना उचित है कि कुछ मामलों में यह नहीं होगा।

मैंने पर्यावरण का निरीक्षण करने और आमंत्रण तर्कों को संसाधित करने का प्रयास किया है और मुझे इनमें से किसी एक में यूआरएल दिखाई नहीं देता है।

कोई भी जानता है कि हम इस यूआरएल को भरोसेमंद तरीके से कैसे कैप्चर कर सकते हैं, भले ही ब्राउज़र क्लिक होने पर हमारा एप्लिकेशन पहले से चल रहा न हो?

+0

क्या आपने कभी इसे समझ लिया था? – canhazbits

+0

@canhazbits: हैंडलर को '-प्लिकेशंसविलफिनिश लॉन्चिंग में पंजीकृत करना:' मेरे परीक्षण में काम करता है। क्या यह ऐप सेटअप या कॉन्फ़िगर किया गया है में कुछ असामान्य है? उदाहरण के लिए, क्या यह हो सकता है कि ऐप प्रतिनिधि सेट नहीं है या नहीं, जिस वर्ग को आप सोचते हैं? या ऐप लॉन्च होने के बाद इसे सेट किया जा सकता है? क्या आप एनआईबी-कम ऐप करने की कोशिश कर रहे हैं? यदि आप '-प्लिकेशंसविलफिशिश लॉन्चिंग:' और '-प्लिकेशंसडिडफिनिश लॉन्चिंग:' में लॉग स्टेटमेंट डालते हैं, तो क्या वे दोनों निष्पादित हैं? –

+0

हां, वे दोनों निष्पादित हैं।लेकिन नहीं, 'applicationWillFinishLaunching' में पंजीकरण डालना मेरे लिए काम नहीं करता है। – canhazbits

उत्तर

1

मुझे बस इस सटीक समस्या का सामना करना पड़ा। मुझे नहीं पता कि यह उचित समाधान है या नहीं, लेकिन आप ऐप प्रतिनिधि के init -method में इवेंट हैंडलर पंजीकृत कर सकते हैं। हालांकि नोट करने के लिए

// in AppDelegate.m 

- (id)init 
{ 
    self = [super init]; 

    if (self) { 
    [[NSAppleEventManager sharedAppleEventManager] setEventHandler:self andSelector:@selector(handleURLEvent:withReplyEvent:) forEventClass:kInternetEventClass andEventID:kAEGetURL]; 
    } 

    return self; 
} 

एक बात यह है कि handleURLEvent:withReplyEvent मिलता है इससे पहले किapplicationDidFinishLaunching:बुलाया एप्लिकेशन एक यूआरएल योजना द्वारा शुरू किया गया है।

+0

मैंने एप्लिकेशन में कोशिश की है WillFinishLaunching, applicationDidFinishLaunching और init विधि, लेकिन कुछ भी काम नहीं किया। क्या कोई अन्य समाधान है? यह मेरे लिए बहुत उपयोगी होगा। अग्रिम में धन्यवाद। – boopathy

3

एप्पल के SimpleScriptingPlugin नमूना applicationWillFinishLaunching: में हैंडलर, जो संभवत: init का उपयोग करने से क्लीनर है पंजीकृत करता है। (और मिक्कर की तरह, हैंडलर को applicationDidFinishLaunching: से पहले बुलाया जाता है।)

+0

मैंने एप्लिकेशन में कोशिश की है WillFinishLaunching, applicationDidFinishLaunching और init विधि, लेकिन कुछ भी काम नहीं किया। क्या कोई अन्य समाधान है? यह मेरे लिए बहुत उपयोगी होगा। अग्रिम में धन्यवाद। – boopathy

संबंधित मुद्दे