2017-01-10 227 views
0

我需要更新我们的应用程序以支持iOS 9和iOS 10,所以我的问题是使用UNUserNotificationCenter来执行PushNotifications。iOS 10/9推送通知

所以与iOS 9我们有返回UIUserNotificationSettings结果像

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

与iOS 10我不喜欢的东西

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

调用它,并且通过完成处理得到它的方法。

我的问题:是有一些可能使用getNotificationSettingsWithCompletionHandler返回的价值,而不是说我可以用它为我的alertEnabled方法完成处理?

非常感谢。

更新:

用这种方法它的工作

- (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。现在我可以轻松使用旧的实现。的

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

我用

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