2017-01-10 229 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的