【问题标题】:Handling NSPerformService error处理 NSPerformService 错误
【发布时间】:2012-05-09 14:41:25
【问题描述】:

我正在使用以下代码通过 Twitter.app 发送推文:

NSPerformService(@"Tweet", [NSPasteboard generalPasteboard]);

如果用户没有 twitter.app,我该如何处理以下错误以显示自定义消息?

我试过 try catch 但它不起作用。 谢谢

【问题讨论】:

    标签: objective-c xcode macos twitter


    【解决方案1】:

    您尝试获取[NSApp servicesMenu] 并在调用它之前搜索它以查看该名称的服务是否存在。


    更新示例:

    NSUInteger itemIndex = [[[NSApp servicesMenu] itemArray] indexOfObjectPassingTest:^(id obj, NSUInteger idx, BOOL *stop){
        return [[(NSMenuItem*)obj title] isEqualToString:@"Tweet"];
    }];
    if (itemIndex != NSNotFound)
        NSPerformService(@"Tweet", [NSPasteboard generalPasteboard]);
    

    更新 2:

    以上是针对一般情况的,在本地化和服务菜单更新时存在问题。对于已知应用提供的服务的特定情况,您可以使用-[NSWorkspace absolutePathForAppBundleWithIdentifier:] 检查该应用是否存在,以查看系统上是否存在具有已知捆绑 ID 的应用。

    【讨论】:

    • 你能给我举个例子吗?
    • Eee... 这不是一个愉快的方式。本地化是菜单项标题的一个因素,但不是服务名称。
    • 您可以尝试记录项目的标题。顺便说一句,服务菜单似乎在被下拉之前没有填充。
    • 我认为如果 Twitter 没有运行,“Tweet”服务将可用。它会启动它。也就是说,您可以使用 -[NSWorkspace absolutePathForAppBundleWithIdentifier:] 按捆绑 ID 查找应用,以确定它是否在系统上。
    • 乐于助人。更新了我的答案,尽管您通过NSWorkspace 检查捆绑 ID 获得了大部分功劳。
    猜你喜欢
    • 1970-01-01
    • 2016-08-18
    • 2012-06-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-31
    相关资源
    最近更新 更多