Mavericks, SandBoxed, но цель развертывания — 10.8 и выше с использованием 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--------------

person hokkuk    schedule 26.10.2013    source источник


Ответы (2)


Чтобы приложение работало на нескольких версиях ОС:

  • Установите в Base SDK последнюю версию поддерживаемой ОС, в вашем случае 10.9.
  • Установите цель развертывания на самую раннюю ОС, на которой вы хотите запустить свой код.
  • Для всех вызовов, которые не существуют в более ранних версиях ОС, вы должны проверить перед вызовом либо с помощью responsesToSelector: (для методов), либо с помощью проверки с нулевым значением (для функций и статики). Вы можете, если хотите, проверить версию ОС, но более надежно проверить конкретный вызов.

см. также: Как условно использовать новый API Cocoa и Как включить вызовы методов, присутствующих только в одной версии операционной системы, при компиляции для нескольких версий?

person mahal tertin    schedule 28.10.2013
comment
хм, у меня это было раньше, и когда я переключался туда и обратно на baseSDK 10.8, он не компилировался и выдавал ошибку. нет видимого интерфейса для EKEventStore, объявляет селектор и т. д. Я, по-видимому, ошибочно предположил, что если я использую baseSDK 10.9 и приложение, работающее в 10.8, оно также увидит аналогичный сбой или ошибку. Но теперь я вижу, что происходит, спасибо. - person hokkuk; 28.10.2013

Чтобы запросить доступ в 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 ];
}
person mahal tertin    schedule 28.10.2013
comment
это то, что у меня сейчас есть... и оно находится в магазине приложений для Mac, однако в среде 10.9 этот вызов не увеличивает доступ к запросу... поэтому приложение просто выдает ошибки. Так что это нельзя использовать как в 10.8, так и в 10.9; Я считаю, что ваш ответ ниже правильный. Если я предполагаю, что он правильно обрабатывает оператор ---if responses... это я узнаю, когда он будет обновлен в магазине приложений. На самом деле я настроил это так, но ошибочно полагал, что, поскольку я переключался туда и обратно на baseSDK 10.8 и 10.9, это приведет к ошибке на 10.8. Я вижу, что происходит сейчас. - person hokkuk; 28.10.2013
comment
поэтому я рад, что эффективно задал два вопроса, потому что это не дало бы мне толчка в правильном направлении, ответ ниже развеял мой туман. Благодарю. - person hokkuk; 28.10.2013
comment
Я только что обновил код, чтобы показать вам пример, как вы будете проверять наличие responsesToSelector. Надеюсь, поможет. - person mahal tertin; 29.10.2013
comment
Это далеко позади, не уверен, что ты это увидишь, но спасибо за это! Просто спас мою задницу. - person CBanga; 21.06.2014