【问题标题】:iOS 10 / 9 Push NotificationsiOS 10 / 9 推送通知
【发布时间】:2017-05-24 16:32:57
【问题描述】:

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

所以在 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);
    }];
}

调用它并通过完成处理程序获取它。

我的问题:是否有可能使用 getNotificationSettingsWithCompletionHandlerreturn 值而不是完成处理程序,我可以将它用于我的 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;
}

但也许有更好的解决方案

【问题讨论】:

    标签: ios push-notification ios9 ios10


    【解决方案1】:

    所以,经过一周的测试,它对我来说效果很好。

    针对我的具体问题,我创建了一个自定义类。

    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
    

    我使用了与 UIUserNotificationType 相同的 NS_ENUM。现在我可以轻松使用旧的实现了。

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

    我用

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-01-22
      • 2017-02-12
      • 2017-01-23
      • 2017-01-22
      • 1970-01-01
      相关资源
      最近更新 更多