osx - os更新方法 - mac重灌失敗




以編程方式從我的應用程序啟動Mac Calendar.app(並選擇特定的日期)? (3)

我想在我的Mac應用程序中包含一個按鈕,按下後,它將啟動用戶的默認日曆應用程序。 我希望將日曆打開到某個特定的日期。

這是用於OS X Mountain Lion的。

有一個一般的方法來做到這一點?

編輯 :FWIW,這是我現在正在做的事情:

- (IBAction)launchCalendarApp:(id)sender
{
    [[NSWorkspace sharedWorkspace] launchApplication:@"/Applications/Calendar.app"];
}

我知道硬編碼這樣的路徑是一個壞主意,這就是為什麼我問這個問題。

更新 :這是我最終做的:

- (IBAction)launchCalendarApp:(id)sender
{
    NSWorkspace *sharedWorkspace = [NSWorkspace sharedWorkspace];
    NSString *iCalPath = [sharedWorkspace absolutePathForAppBundleWithIdentifier:@"com.apple.iCal"];
    BOOL didLaunch = [sharedWorkspace launchApplication:iCalPath];
    if (didLaunch == NO) {
        NSString *message = NSLocalizedString(@"The Calendar application could not be found.", @"Alert box message when we fail to launch the Calendar application");
        NSAlert *alert = [NSAlert alertWithMessageText:message defaultButton:nil alternateButton:nil otherButton:nil informativeTextWithFormat:@""];
        [alert setAlertStyle:NSCriticalAlertStyle];
        [alert runModal];
    }
}

聽起來好像所有可能的方法都是變通方法,直到開發出更好的API。 我的解決方案與周杰倫的建議相似。 我使用包標識符來獲取路徑,因為我覺得它不那麼脆弱。 即使他們(或用戶)決定重命名應用程序,蘋果公司也不可能在將來改變軟件包ID。 不幸的是,這種方法沒有讓我到一個特定的日期。 當我有更多的時間時,我會進一步調查其他一些建議(使用ical://等)。

更新2 :下面的NSGod有一個了不起的答案,也打開日曆到一個特定的日期,只要你的應用程序不是沙盒。


您可以嘗試使用EventKit創建所需日期和時間的EKCalendarItem實例,打開事件,然後立即將其刪除。 如果時間適當的話,它甚至可能不明顯地閃爍用戶日曆的開/關。

這是另一個kludge,但直到NSWorkspace有一個-openDate:方法,kludges是唯一的辦法。


注意:當您更新所使用的內容時,我仍然在研究這個問題,但是我會添加這個FWIW。

使用應用程序的包標識符通常是一種更強大的方法來引用應用程序,然後單獨使用該名稱,因為用戶可以在OS X中移動或重命名應用程序,但是它們不能輕易更改包標識符。 而且,即使蘋果公司將iCal.app重命名為Calendar.app, CFBundleIdentifier仍然是com.apple.iCal

if (![[NSWorkspace sharedWorkspace]
                launchAppWithBundleIdentifier:@"com.apple.iCal"
                                      options:NSWorkspaceLaunchDefault
               additionalEventParamDescriptor:nil
                             launchIdentifier:NULL]) {
    NSLog(@"launching Calendar.app failed!");
}

即使您的應用程序是沙盒,以上代碼也可以正常工作。 您可能會嘗試創建一個自定義的NSAppleEventDescriptor ,它將指定與以下AppleScript代碼類似的東西,但是由於沙盒的原因,它可能會被拒絕:

view calendar at date "Sunday, April 8, 2012 4:28:43 PM"

如果您的應用程序不需要沙盒,那麼使用Scripting Bridge會更容易,使用該方法可以選擇特定的NSDate

使用ScriptingBridge的示例項目: OpenCalendar.zip

在那個項目中,我使用下面的代碼:

SBCalendarApplication *calendarApp = [SBApplication
              applicationWithBundleIdentifier:@"com.apple.iCal"];
[calendarApp viewCalendarAt:[self.datePicker dateValue]];

這將啟動Calendar.app/iCal.app並將日曆更改為指定的日期。