Mik*_*ver 5 url macos custom-url osx-mavericks
我在任何OSX浏览器中创建了一个从自定义URL启动的应用程序.通过向应用程序的plist添加标准CFBundleURLName条目,这可以正常工作.
我的应用程序通过解析自定义URL上的一些参数然后对它们做出反应来阅读.
例如,使用自定义网址:
foobar://param1/param2/param3
在浏览器中单击上面的URL时,OSX会启动我的应用程序并将实际的自定义URL本身作为应用程序的第一个参数传递.因此,在应用程序中,我可以读取第一个arg并获取打开应用程序的URL,并解析它我需要的参数.
这在OSX 10.5-10.8中运行良好,但在10.9 Mavericks中它的工作方式略有不同.即,如果应用程序尚未运行,它仍会启动应用程序,但不会将自定义URL作为第一个参数传递 - 因此应用程序认为它刚刚由用户手动启动(例如从启动板选择)而不是直接从一个浏览器.
奇怪的是,如果应用程序已经打开,那么单击自定义URL会将url字符串发送到应用程序作为第一个参数,应用程序中的功能按预期发生.
我已经使用我的应用程序的新旧版本在10.6-> 10.9上测试了这一点,并且都表现出相同的行为.在10.9 Mavericks之前的版本首次发布时都可以正常工作,但是在10.9中,他们没有将url作为第一个arg传递,但是在第二次单击已经运行时工作.
如果有人能对此有所了解,我将非常感激.
您在哪里设置 URL 处理程序?它需要尽早发生。如果您当前有它applicationDidFinishLaunching,请尝试将其移至applicationWillFinishLaunching.
例如,以下内容对我有用,即使在我在 Safari 中打开 URL 之前应用程序尚未运行,也会在启动时记录 URL。当我将 WillFinishLaunching 更改为 DidFinishLaunching 时,我完全看到了您所描述的行为。
@implementation AppDelegate
- (void)applicationWillFinishLaunching:(NSNotification *)notification
{
NSAppleEventManager *appleEventManager = [NSAppleEventManager sharedAppleEventManager];
[appleEventManager setEventHandler:self andSelector:@selector(handleGetURLEvent:withReplyEvent:) forEventClass:kInternetEventClass andEventID:kAEGetURL];
}
- (void)handleGetURLEvent:(NSAppleEventDescriptor *)event withReplyEvent:(NSAppleEventDescriptor *)replyEvent
{
NSAppleEventDescriptor *obj = [event descriptorForKeyword:keyDirectObject];
DescType type = [obj descriptorType];
if (type == typeChar) {
NSData *data = [obj data];
if (data) {
NSString *urlString = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
NSURL *url = [NSURL URLWithString:urlString];
NSLog(@"url: %@", url);
}
}
}
@end
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
520 次 |
| 最近记录: |