requestAccessToEntity iOS6 - para Trás compatibilidade EKEventStore
-
11-12-2019 - |
Pergunta
a seguir iOS6 eventKit e as novas configurações de privacidade, estou usando o seguinte código, que funciona perfeitamente bem no iOS6 dispositivos.
Ainda assim, eu gostaria que o mesmo código para trabalhar também para dispositivos com o iOS 5.x e não desejo escrever um "o mesmo código duas vezes - Parece errado.
Qualquer pessoa pode participar solução elegante ?
EKEventStore *eventStore = [[EKEventStore alloc] init];
[eventStore requestAccessToEntityType:EKEntityTypeEvent completion:^(BOOL granted, NSError *error) {
// some code
}];
Solução
Eu estou usando este:
void (^addEventBlock)();
addEventBlock = ^
{
NSLog(@"Hi!");
};
EKEventStore *eventStore = [[UpdateManager sharedUpdateManager] eventStore];
if ([eventStore respondsToSelector:@selector(requestAccessToEntityType:completion:)])
{
[eventStore requestAccessToEntityType:EKEntityTypeEvent completion:^(BOOL granted, NSError *error)
{
if (granted)
{
addEventBlock();
}
else
{
NSLog(@"Not granted");
}
}];
}
else
{
addEventBlock();
}
Eu acho que deve reduzir a duplicação de código.
Outras dicas
Se você exibir o evento em um modalviewcontroller com um EKEventEditViewController, iOS mostrar-lhe automaticamente um modo de exibição dizendo o que fazer se a permissão for negada.Então, eu faço isso:
Em viewDidLoad:
eventStore = [[EKEventStore alloc] init];
No método usado para adicionar o evento:
if ([eventStore respondsToSelector:@selector(requestAccessToEntityType:completion:)])
{
__block typeof (self) weakSelf = self; // replace __block with __weak if you are using ARC
[eventStore requestAccessToEntityType:EKEntityTypeEvent completion:^(BOOL granted, NSError *error)
{
if (granted)
{
[weakSelf performSelectorOnMainThread:@selector(addEventToCalendar) withObject:nil waitUntilDone:YES];
}
else
{
NSLog(@"Not granted");
}
}];
}
else
{
[self addEventToCalendar];
}
Eu tenho um EventUtil.m arquivo com
+(void)proxyForIOS6EventKitToCallFunction:(SEL)function WithViewController:(UIViewController*)viewController {
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Warc-performSelector-leaks"
AppDelegate *app = (AppDelegate*)[[UIApplication sharedApplication] delegate];
if([app.eventStore respondsToSelector:@selector(requestAccessToEntityType:completion:)]) {
// For iOS 6
MBProgressHUD *hud = [MBProgressHUD showHUDAddedTo:viewController.view animated:YES];
hud.labelText = @"";
//invoke requestAccessToEntityType...
[app.eventStore requestAccessToEntityType:EKEntityTypeEvent completion:^(BOOL granted, NSError *error) {
//Handle the response here…
//Note: If you prompt the user, make sure to call the main thread
if (granted == YES) {
dispatch_async(dispatch_get_main_queue(), ^{
[viewController performSelector:function];
});
}
}];
}
else {
[viewController performSelector:function];
}
#pragma clang diagnostic pop
}
E no controlador de visualização que eu quero para acessar o calendário de eu importar o EventUtil.h arquivo e chamar a esta função:
[EventUtil proxyForIOS6EventKitToCallFunction:@selector(displayModifyCalendarAlertView) WithViewController:self];
displayModifyCalendarAlertView é a função a chamar-se o calendário de permissão é dada (ou iOS6 ou iOS < 6).