Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/114.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
“检测”;“允许通知”;iOS8是否打开/关闭_Ios_Uilocalnotification_Ios8 - Fatal编程技术网

“检测”;“允许通知”;iOS8是否打开/关闭

“检测”;“允许通知”;iOS8是否打开/关闭,ios,uilocalnotification,ios8,Ios,Uilocalnotification,Ios8,我正在尝试在iOS 8中检测应用程序的本地通知设置 对于UIUserNotificationSettings,当我打开所有徽章、声音和警报时,它返回我7 在设置中,我关闭“允许通知”,应用程序仍然返回我7的UIUserNotificationSettings(徽章、声音和警报打开)。是否有办法检测“允许通知打开/关闭” 您可以使用以下代码检查用户集是否启用或禁用推送通知 启用或禁用Iphone推送通知 UIRemoteNotificationType types = [[UIApplicatio

我正在尝试在iOS 8中检测应用程序的本地通知设置

对于
UIUserNotificationSettings
,当我打开所有徽章、声音和警报时,它返回我7

在设置中,我关闭“允许通知”,应用程序仍然返回我7的UIUserNotificationSettings(徽章、声音和警报打开)。是否有办法检测“允许
通知
打开/关闭”


您可以使用以下代码检查用户集是否启用或禁用推送通知

启用或禁用Iphone推送通知

UIRemoteNotificationType types = [[UIApplication sharedApplication] enabledRemoteNotificationTypes];
if (types == UIRemoteNotificationTypeNone) 
  // Yes it is..

希望,这将对您有所帮助。

方法
enabledRemoteNotificationTypes
自iOS8以来已被弃用

要检查iOS8中的远程通知状态,可以调用

[[UIApplication sharedApplication] isRegisteredForRemoteNotifications];

如果用户在设置中禁用通知,它将返回否。在
isRegisteredForRemoteNotifications上

或者,您可以检索所有当前通知设置:

[[UIApplication sharedApplication] currentUserNotificationSettings];

currentUserNotificationSettings

上,这应该在您的应用程序第一次启动时起作用,用户将获得一个对话框,要检查用户是否拒绝或允许通知,请使用:

-(void)application:(UIApplication *)application didRegisterUserNotificationSettings:   (UIUserNotificationSettings *)notificationSettings
{
    if (notificationSettings.types) {
        NSLog(@"user allowed notifications");
        [[UIApplication sharedApplication] registerForRemoteNotifications];
    }else{
        NSLog(@"user did not allow notifications");
        // show alert here
    }
}
在连续发射时,使用:

[[UIApplication sharedApplication] isRegisteredForRemoteNotifications];

使用
.isRegisteredForRemoteNotifications()
不起作用(尽管它应该起作用)。但是,当通知被禁用或其中一种类型不存在时,以下代码不起作用

func notificationsAreOk() -> Bool {
    let wishedTypes = UIUserNotificationType.Badge |
        UIUserNotificationType.Alert |
        UIUserNotificationType.Sound;
    let application = UIApplication.sharedApplication()
    let settings = application.currentUserNotificationSettings()
    if settings == nil {
        return false
    }
    if settings.types != wishedTypes {
        return false
    }
    return true
}

编辑:在某些测试之后,当通知被禁用时,系统并不总是工作。我正在考虑发送测试通知,以了解它们何时工作。

您可以控制
UIApplication.sharedApplication().currentUserNotificationSettings()的哈希值。


如果答案/评论放错了地方,我对此表示歉意。我对iOS编程非常陌生,以前从未发布过stack overflow。我认为这实际上应该是一个评论,但如果没有50分,我是不允许的。我也很抱歉,如果解释有点简陋,但又有点新:)

我还希望测试用户是否在初始请求后更改了我的应用程序允许/要求的通知。在试图破解苹果的文档(苹果的作者要么比我聪明得多,要么文档故意晦涩难懂)并做了一些测试之后,我测试了

[[UIApplication sharedApplication] currentUserNotificationSettings].hash.
我相信这会返回一个三位的散列值,其中第1位用于横幅通知,第2位用于声音通知,第3位用于警报通知

所以

如果“设置”应用程序中的“允许通知”已关闭,则也会显示0。
希望这有帮助。

Swift 3+

let isRegisteredForLocalNotifications = UIApplication.shared.currentUserNotificationSettings?.types.contains(UIUserNotificationType.alert) ?? false
Swift 2.3

let isRegisteredForLocalNotifications = UIApplication.sharedApplication().currentUserNotificationSettings()?.types.contains(UIUserNotificationType.Alert) ?? false

要检查iOS8和iOS9中的远程通知状态,请调用:

// Obj-C
[[UIApplication sharedApplication] isRegisteredForRemoteNotifications]; 
// Swift
UIApplication.sharedApplication().isRegisteredForRemoteNotifications
// Obj-C
[[UIApplication sharedApplication] currentUserNotificationSettings];
// Swift
UIApplication.sharedApplication().currentUserNotificationSettings()   
如果您的应用程序可以接收远程通知,则返回
true
。然而,接收远程通知并不意味着它也将向用户显示这些通知

请求
registerforremotentifications()
几乎在所有情况下都会成功,并且会调用AppDelegate的
didRegisterforremotentificationswithDeviceToken
,从而为您提供设备令牌。然后,应用程序可以接收未向用户显示的静默远程通知。例如,当收到此类通知时,您可以在应用程序中触发后台进程。 看

要不仅接收而且向您请求权限的用户显示远程通知,请执行以下操作:

// Swift
let notificatonSettings = UIUserNotificationSettings(forTypes: [.Badge, .Alert, .Sound], categories: nil)
UIApplication.sharedApplication().registerUserNotificationSettings(notificatonSettings)
这将向用户显示一个对话框,用户可以在其中允许或拒绝您的请求。不管他们的决定如何,该应用程序仍然能够接收远程通知

如果用户允许,将调用AppDelegate的
DidRegisterForRemotionTificationsWithDeviceToken

要检查用户是否允许或拒绝了您的请求,或事实上在稍后的iOS设置中更改了通知权限,请调用:

// Obj-C
[[UIApplication sharedApplication] isRegisteredForRemoteNotifications]; 
// Swift
UIApplication.sharedApplication().isRegisteredForRemoteNotifications
// Obj-C
[[UIApplication sharedApplication] currentUserNotificationSettings];
// Swift
UIApplication.sharedApplication().currentUserNotificationSettings()   

对我有用

Swift 2

在AppDelegate中:

func application(application: UIApplication, didRegisterUserNotificationSettings notificationSettings: UIUserNotificationSettings) {

    if (notificationSettings.types == .None){ // User did NOT allowed notifications


    }else{ // User did allowed notifications


    }

}
从任何其他ViewController:

    if UIApplication.sharedApplication().currentUserNotificationSettings()!.types.contains(.None){

    }else{

    }

看看这个。代码经过了尝试和测试

- (BOOL)isUserNotificationAllowed {
    UIUserNotificationType types = [[UIApplication sharedApplication] currentUserNotificationSettings].types;
    if(types & UIUserNotificationTypeBadge || types & UIUserNotificationTypeSound || types & UIUserNotificationTypeAlert){
        return YES;
    }
    else {
        return NO;
    }
}

谢谢你的回答。但这无法判断用户是否已选择打开/关闭“允许通知”。在我的情况下,它总是返回UIRemoteNotificationTypeNone.enabledRemoteNotificationTypes是不推荐的,因为IOS8我认为这是不对的。。。我的测试表明,如果用户启用了“允许通知”,但将警报类型设置为“无”,并且在通知中禁用了“声音”,则“isRegisteredForRemoteNotifications”将返回false。当应用程序仅使用本地通知时,isRegisteredForRemoteNotifications似乎始终为否…@Ponf我认为您的描述有点不正确。您说“[[UIApplication sharedApplication]isRegisteredForRemoteNotifications];如果用户在设置中禁用通知,它将返回NO”,但文档中说“此方法仅反映在您调用registerForRemoteNotifications方法时开始的远程注册过程的成功完成”。这意味着,如果用户在提示时允许通知,然后进入设置并禁用它们,isRegisteredForRemoteNotifications仍将返回trueHi@Ponf,这是我的想法,但遗憾的是,它没有反映用户允许通知后在设置中所做的更改,然后进入设置并禁用它们。我已经对此进行了测试,并在isRegisteredForRemoteNotifications中获得了true,尽管设置被禁用。同意@JonathonHorsman,尽管在设置中关闭了它,但对我来说返回true。您找到解决方案了吗?什么是7?你想出了随机幻数吗?@Andy:7是UIUserNotificationType的原始值,如果你将徽章、声音和警报结合起来。@mathz是的,我明白了,我想知道为什么OP会用数字而不是枚举来寻找麻烦。如果我接受通知,我在iOS 8(iPhone 4S)上也有同样的问题
    if UIApplication.sharedApplication().currentUserNotificationSettings()!.types.contains(.None){

    }else{

    }
- (BOOL)isUserNotificationAllowed {
    UIUserNotificationType types = [[UIApplication sharedApplication] currentUserNotificationSettings].types;
    if(types & UIUserNotificationTypeBadge || types & UIUserNotificationTypeSound || types & UIUserNotificationTypeAlert){
        return YES;
    }
    else {
        return NO;
    }
}