2013-10-26 48 views
1

我已經編寫了下面的代碼只是爲了讓它編譯,但這不會工作,因爲我需要有一個10.8的部署目標。小牛,SandBoxed,但使用EKEventStore和日曆訪問到10.8和以上的部署目標

發生的事情是我需要訪問EKEventStore,所以當有人下載​​這個應用程序時,它在10.8中運行正常,但是在10.9中下載的人會得到錯誤,因爲該應用程序沒有對日曆的隱私權限。由於它正在編譯爲10.8,因此它無法訪問方法requestAccessToEntityType:EKEntityTypeEvent ..

怎麼會這樣做呢?

在相關說明中,如何編譯10.9的代碼,其他代碼是10.8,並根據它所在的環境調用這些不同的部分?記住這是針對Mac App Store的,如果這是要走的路,說明一下,就好像你正在和一個不知道該如何開始做的人說話,因爲我沒有。 謝謝。

//------------------check authorization of calendars-------------- 
#if (__MAC_OS_X_VERSION_MIN_REQUIRED >= 1090) || (__IPHONE_OS_VERSION_MIN_REQUIRED) 
    if(!eventStore) eventStore = [[EKEventStore alloc] init]; 
    [eventStore requestAccessToEntityType:EKEntityTypeEvent completion:^(BOOL granted, NSError *error) //.............put this back in... 
    { 
     if (granted) 
     { 
NSLog(@"granted permission to eventstore!"); 
      authorizedEventStore = YES; 
      authorizedCalendar(); 
     } 
     else 
     { 
NSLog(@"Not granted"); 
      authorizedEventStore = NO; 
      notAuthorized(); 
     } 
    }]; 
#else 
NSLog(@"not able to request"); 
    if(!eventStore) eventStore = [[EKEventStore alloc] initWithAccessToEntityTypes:EKEntityMaskEvent]; 
    authorizedEventStore = YES; 
    authorizedCalendar(); 
#endif 
    //------------------end check authorization of calendars-------------- 

回答

2

爲了有幾個OS版本上運行的應用程序:

  • 設置你的基地SDK爲操作系統的最新版本在您的情況下,您支持10.9
  • 將部署目標設置爲您希望代碼啓動的最早的操作系統
  • 對於OS早期版本中不存在的所有調用,您必須在調用之前進行測試,可以使用respondsToSelector :(對於方法)或對nil(對於函數和靜態)進行測試。如果您想要檢查操作系統版本,則可以進行檢查,但檢查特定呼叫會更加穩健。

還看到: How to conditionally use a new Cocoa APIHow do I include calls to methods only present in one operating system version when compiling for multiple versions?

+0

嗯,我曾在之前,當我來回切換到10.8的baseSDK,它不會編譯和顯示錯誤。沒有可見的EKEventStore接口聲明選擇器等......我明顯錯誤地認爲,如果我使用10.9的baseSDK,並且應用程序在10.8中運行,它也會看到類似的崩潰或錯誤。但我明白現在發生了什麼,謝謝。 – hokkuk

2

請在OS X上使用訪問:

EKEventStore *eventStore = nil; 
if ([EKEventStore respondsToSelector:@selector(authorizationStatusForEntityType:)]) { 
    // 10.9 style 
    eventStore = [[EKEventStore alloc] init]; 
    [eventStore requestAccessToEntityType:EKEntityTypeEvent completion:^(BOOL granted, NSError *error) 
    { 
     // your completion 
    }]; 
} else { 
    // 10.8 style 
    eventStore = [[EKEventStore alloc] initWithAccessToEntityTypes:EKEntityMaskEvent ]; 
} 
+0

這是我有效地現在有...它是在Mac應用程序商店,但在10.9的環境中,這個調用不提高「的要求訪問「...所以該應用程序只是產生錯誤。所以這不能用於10.8和10.9;我相信你的回答是正確的。如果我認爲它正確處理---如果響應聲明......我將在應用商店更新時發現它。我確實有這樣的設置,但錯誤地相信,因爲我是來回切換到10.8和10.9 baseSDK,它會在10.8上產生一個錯誤,我看到現在發生了什麼。 – hokkuk

+0

所以我很高興我有效地問了兩個問題,因爲這不會給我正確的方向,下面的答案清除了我的霧。謝謝。 – hokkuk

+0

我剛剛更新了代碼以向您展示如何檢查respondsToSelector的示例。希望能幫助到你。 –