2017-01-10 9 views
0

Мне нужно обновить приложение от нас для поддержки iOS 9 и iOS 10, поэтому моя проблема заключается в использовании UNUserNotificationCenter для PushNotifications.iOS 10/9 Push-уведомления

Так с прошивкой 9 у нас есть метод, который возвращает результат UIUserNotificationSettings как

- (BOOL)alertEnabled { 
    UIUserNotificationSettings *theSettings = [[UIApplication sharedApplication] currentUserNotificationSettings]; 
    return [theSettings types] & UIUserNotificationTypeAlert; 
} 

С прошивкой 10 я сделал что-то вроде

- (void)userNotificationsAuthorization :(void (^)(BOOL alertIsActive))completion { 
    [[UNUserNotificationCenter currentNotificationCenter] getNotificationSettingsWithCompletionHandler:^(UNNotificationSettings * _Nonnull settings) { 
     completion(settings.alertSetting == UNNotificationSettingEnabled); 
    }]; 
} 

вызова его и получить его с помощью обработчика завершения.

Моего вопроса: Есть ли какая-то возможность использовать getNotificationSettingsWithCompletionHandler и возвращения значению вместо обработчика завершения, что я могу использовать его в мою alertEnabled метода?

Большое спасибо.

Update:

При таком подходе он работает

- (BOOL)alertIsEnabled { 
    __block BOOL alertIsActive = NO; 

    if (SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(@"10.0")) { 
     dispatch_semaphore_t sem = dispatch_semaphore_create(0); 

     [[UNUserNotificationCenter currentNotificationCenter] getNotificationSettingsWithCompletionHandler:^(UNNotificationSettings * _Nonnull settings) { 
      alertIsActive = settings.alertSetting == UNNotificationSettingEnabled; 
      dispatch_semaphore_signal(sem); 
     }]; 

     dispatch_semaphore_wait(sem, DISPATCH_TIME_FOREVER); 
    } 
    else { 
     UIUserNotificationSettings *theSettings = [[UIApplication sharedApplication] currentUserNotificationSettings]; 
     alertIsActive = [theSettings types] & UIUserNotificationTypeAlert;  
    } 
    return alertIsActive; 
} 

, но может быть, есть лучшее решение

ответ

0

Итак, после недели испытаний, он работает хорошо для меня.

Для моей конкретной проблемы я создал пользовательский класс.

SpecicPush.h

#import <UIKit/UIKit.h> 

typedef NS_ENUM(NSInteger , PushNotificationType) { 
    PushNotificationTypeNone = 0,  // the application may not present any UI upon a notification being received 
    PushNotificationTypeBadge = 1 << 0, // the application may badge its icon upon a notification being received 
    PushNotificationTypeSound = 1 << 1, // the application may play a sound upon a notification being received 
    PushNotificationTypeAlert = 1 << 2, // the application may display an alert upon a notification being received 
}; 

@interface SpecificPush : NSObject 

@property (nonatomic, readonly) PushNotificationType currentNotificationSettings; 

+ (SpecificPush *)sharedInstance; 
- (PushNotificationType)types; 

@end 

SpecificPush.m

#import "SpecificPush.h" 
#import <UserNotifications/UserNotifications.h> 

@interface SpecificPush() 
@property (nonatomic) PushNotificationType currentNotificationSettings; 
@end 

@implementation SpecificPush 

#pragma mark - Init 

static SpecificPush *instance = nil; 
+ (SpecificPush *)sharedInstance 
{ 
    @synchronized (self) 
    { 
     if (instance == nil) 
     { 
      [SpecificPush new]; 
     } 
    } 
    return instance; 
} 

- (instancetype)init 
{ 
    NSAssert(!instance, @"WARNING - Instance of SpecifishPush already exists"); 
    self = [super init]; 
    if (self) 
    { 
     self.currentNotificationSettings = PushNotificationTypeNone; 
    } 

    instance = self; 
    return self; 
} 

- (PushNotificationType)types 
{ 
    if (IS_IOS10) 
    { 
     dispatch_semaphore_t semaphore = dispatch_semaphore_create(0); 

     [[UNUserNotificationCenter currentNotificationCenter] getNotificationSettingsWithCompletionHandler:^(UNNotificationSettings *settings) { 
      if ((settings.soundSetting == UNNotificationSettingDisabled) && (settings.alertSetting == UNNotificationSettingDisabled) && (settings.soundSetting == UNNotificationSettingDisabled)) 
      { 
       self.currentNotificationSettings = PushNotificationTypeNone; 
      } 
      if (settings.badgeSetting == UNNotificationSettingEnabled) 
      { 
       self.currentNotificationSettings = PushNotificationTypeBadge; 
      } 
      if (settings.soundSetting == UNNotificationSettingEnabled) 
      { 
       self.currentNotificationSettings = PushNotificationTypeSound; 
      } 

      if (settings.alertStyle == UNNotificationSettingEnabled) 
      { 
       self.currentNotificationSettings = PushNotificationTypeAlert; 
      } 

      dispatch_semaphore_signal(semaphore); 

     }]; 

     dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER); 
     dispatch_release(semaphore); 
    } 
    else 
    { 
     UIUserNotificationSettings *settings = [[UIApplication sharedApplication] currentUserNotificationSettings]; 

     if (settings.types == UIUserNotificationTypeNone) 
     { 
      self.currentNotificationSettings = PushNotificationTypeNone; 
     } 
     if (settings.types & UIUserNotificationTypeBadge) 
     { 
      self.currentNotificationSettings = PushNotificationTypeBadge; 
     } 
     if (settings.types & UIUserNotificationTypeSound) 
     { 
      self.currentNotificationSettings = PushNotificationTypeSound; 
     } 
     if (settings.types & UIUserNotificationTypeAlert) 
     { 
      self.currentNotificationSettings = PushNotificationTypeAlert; 
     } 
    } 

    return self.currentNotificationSettings; 
} 
@end 

Я использовал тот же NS_ENUM как UIUserNotificationType. Теперь я могу легко использовать старую реализацию. Insted из

- (BOOL)alertEnabled { 
    UIUserNotificationSettings *theSettings = [[UIApplication sharedApplication] currentUserNotificationSettings]; 
    return [theSettings types] & UIUserNotificationTypeAlert; 
} 

Я использую

- (BOOL)alertEnabled { 
    return [[SpecificPush sharedInstance] types] & PushNotificationTypeAlert; 
}