का उपयोग कर यह वह जगह है इस सवाल का कोको संस्करण:कोको प्रोटोकॉल हैंडलर 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];
...
}
यहाँ हैंडलर विधि है।
हैंडलर विधि कहा जाता है और पूरा यूआरएल पकड़ा जाता है।
हालांकि, यदि ऐप अभी तक एक ही लिंक नहीं चला रहा है तो ऐप लॉन्च होगा, लेकिन हैंडलर को नहीं बुलाया जाएगा - जो समझ में आता है क्योंकि हैंडलर अभी तक इस कार्यक्रम से बंधे नहीं थे।
यूआरएल में उन तर्क वेबपैड के साथ समन्वय करने के लिए हमारे आवेदन के लिए महत्वपूर्ण हैं। यद्यपि यह क्लिक तब होता है जब हमारा क्लिक पहले से ही चल रहा है जब यह क्लिक होता है, यह अपेक्षा करना उचित है कि कुछ मामलों में यह नहीं होगा।
मैंने पर्यावरण का निरीक्षण करने और आमंत्रण तर्कों को संसाधित करने का प्रयास किया है और मुझे इनमें से किसी एक में यूआरएल दिखाई नहीं देता है।
कोई भी जानता है कि हम इस यूआरएल को भरोसेमंद तरीके से कैसे कैप्चर कर सकते हैं, भले ही ब्राउज़र क्लिक होने पर हमारा एप्लिकेशन पहले से चल रहा न हो?
क्या आपने कभी इसे समझ लिया था? – canhazbits
@canhazbits: हैंडलर को '-प्लिकेशंसविलफिनिश लॉन्चिंग में पंजीकृत करना:' मेरे परीक्षण में काम करता है। क्या यह ऐप सेटअप या कॉन्फ़िगर किया गया है में कुछ असामान्य है? उदाहरण के लिए, क्या यह हो सकता है कि ऐप प्रतिनिधि सेट नहीं है या नहीं, जिस वर्ग को आप सोचते हैं? या ऐप लॉन्च होने के बाद इसे सेट किया जा सकता है? क्या आप एनआईबी-कम ऐप करने की कोशिश कर रहे हैं? यदि आप '-प्लिकेशंसविलफिशिश लॉन्चिंग:' और '-प्लिकेशंसडिडफिनिश लॉन्चिंग:' में लॉग स्टेटमेंट डालते हैं, तो क्या वे दोनों निष्पादित हैं? –
हां, वे दोनों निष्पादित हैं।लेकिन नहीं, 'applicationWillFinishLaunching' में पंजीकरण डालना मेरे लिए काम नहीं करता है। – canhazbits