web-dev-qa-db-fra.com

Comment vérifier que "Autoriser l'accès complet" est activé dans iOS 8?

Dans iOS 8, lorsque vous développez un clavier personnalisé et définissez la propriété RequestsOpenAccess sur YES dans info.plist, il existe un bouton bascule dans Paramètres-> Ajouter un nouveau clavier nommé "Autoriser l'accès complet". Comment le code de clavier personnalisé sait-il que l'utilisateur a activé ou désactivé cette bascule?

37
chenmervyn

MISE À JOUR 08/23/2017 pour la compatibilité iOS 10:

func isOpenAccessGranted() -> Bool{
    UIPasteboard.general.string = "CHECK"
    return UIPasteboard.general.hasStrings
}

iOS 8:

-(BOOL)isOpenAccessGranted{
   return [UIPasteboard generalPasteboard];
}

S'il vous plaît noter que le simulateur vous dira toujours que vous avez accès complet, donc pour que cela fonctionne correctement, vous devez l'exécuter à partir d'un appareil.

33
Julio Bailon

C'est de loin la réponse la plus simple et vous n'avez pas besoin de configurer des groupes d'applications. Il est testé en production sur l'App Store.

+ (BOOL)isOpenAccessGranted
{
    return [UIPasteboard generalPasteboard];
}
15
fisch2

Pour iOS 10 (version bêta 5), ​​ils ont modifié l'API UIPasteboard, mais les éléments suivants ont fonctionné:

let originalString = UIPasteboard.general.string
UIPasteboard.general.string = "TEST"
if UIPasteboard.general.hasStrings
{
    UIPasteboard.general.string = originalString
    hasFullAccess = true
}
else
{
     hasFullAccess = false
}
11
schlaegerz

Je teste cela aujourd'hui sur iOS 10 et obtenir l'accès au presse-papier ne semble pas être suffisant. Dans iOS 10, vous pouvez définir la table de montage sur une var sans accès complet. Voici une solution que j'ai trouvée ...

func checkFullAccess() -> Bool
{
    var hasFullAccess = false
    if #available(iOSApplicationExtension 10.0, *) {
        let pasty = UIPasteboard.general
        if pasty.hasURLs || pasty.hasColors || pasty.hasStrings || pasty.hasImages {
            hasFullAccess = true
        } else {
            pasty.string = "TEST"
            if pasty.hasStrings {
                hasFullAccess = true
                pasty.string = ""
            }
        }
    } else {
        // Fallback on earlier versions
        var clippy : UIPasteboard?
        clippy = UIPasteboard.general
        if clippy != nil {
            hasFullAccess = true
        }
    }
    return hasFullAccess
}

Tester pour voir si le presse-papiers a du contenu renvoie false avec un accès complet désactivé, même s'il y a du contenu sur le presse-papiers. Bien sûr, il pourrait en fait être vide et, après tous ces tests, vous pourrez tenter en toute sécurité de définir quelque chose sur le presse-papiers sans vous soucier de remplacer des éléments déjà présents. Si vous avez un accès et que le presse-papiers a un contenu, le test aurait retourné true. Si vous n'y avez pas accès, vous ne pouvez pas écraser quelque chose qui s'y trouvait.

HTH, Mike

9
Mike

Mise à jour: il n'est pas nécessaire que App Group soit activé, comme d'autres l'ont mentionné, il suffit de vérifier l'accès au presse-papiers:

- (BOOL)isFullAccessGranted
{
    return !![UIPasteboard generalPasteboard];
}

NOTE: Ce qui suit ne fonctionne plus, même si vous avez App Group enabled ...

Pour un clavier personnalisé avec App Group activé, voici un moyen rapide et fiable de tester l'état du commutateur "Allow Full Access":

func isOpenAccessGranted() -> Bool {
    let fm = NSFileManager.defaultManager()
    let containerPath = fm.containerURLForSecurityApplicationGroupIdentifier(
                        "group.com.example")?.path
    var error: NSError?
    fm.contentsOfDirectoryAtPath(containerPath!, error: &error)
    if (error != nil) {
        NSLog("Full Access: Off")
        return false
    }
    NSLog("Full Access: On");
    return true
}
8
timcour

Pour iOS 10 utilisant Swift 2.3 (si vous ne voulez pas convertir vos fichiers en Swift 3.0)

func isOpenAccessGranted() -> Bool {
    if #available(iOSApplicationExtension 10.0, *) {

    let originalString = UIPasteboard.generalPasteboard().string
    UIPasteboard.generalPasteboard().string = "Test"

    if UIPasteboard.generalPasteboard().hasStrings {
            UIPasteboard.generalPasteboard().string = originalString
            return true
        } else {
            return false
        }
    } else {
        return UIPasteboard.generalPasteboard().isKindOfClass(UIPasteboard)
    }
}
5
iOS_Mouse

Ce code fonctionne pour moi, ainsi que sur les groupes d'applications: https://developer.Apple.com/library/ios/documentation/IDEs/Conceptual/AppDistributionGuide/AddingCapabilities/AddingCapabilities.html#//Apple_ref/doc/uid/ TP40012582-CH26-SW61

Peut-être que cela fonctionnera aussi sans les groupes d'applications.

Et j'ai utilisé ce code:

if(isOpenAccessGranted()){ 
            NSLog("FULL ACCESS ON")                
        }
        else{
            NSLog("FULL ACCESS OFF")               
        }
}

func isOpenAccessGranted() -> Bool {
        return UIPasteboard.generalPasteboard().isKindOfClass(UIPasteboard)
}
2
Tejinder

Solution Swift utile de @ hoiberg42:

func isOpenAccessGranted() -> Bool {
    return UIPasteboard.generalPasteboard().isKindOfClass(UIPasteboard)
}

Fonctionne comme un charme!

2
imike

iOS 11 ne nécessite plus de piratage.

  override var hasFullAccess: Bool {
    if #available(iOS 11.0, *) {
      return super.hasFullAccess// super is UIInputViewController.
    }
    if #available(iOS 10.0, *) {
      let original: String? = UIPasteboard.general.string
      UIPasteboard.general.string = " "
      let val: Bool = UIPasteboard.general.hasStrings
      if let str = original {
        UIPasteboard.general.string = str
      }
      return val
    }
    return UIPasteboard.general.isKind(of: UIPasteboard.self)
  }
1
Mitsuaki Ishimoto

Une solution rapide

 if let test = UIPasteboard.generalPasteboard() as? UIPasteboard{
        NSLog("Full Access: On")
        return true
    }else{
        NSLog("Full Access: Off")
        return false
    }

à l'intérieur de la fonction ci-dessus bien sûr.

0
theSiberman

Pour ceux d'entre vous qui utilisent iOS 10 et Objective-C, cela fonctionnera comme prévu.

- (BOOL)hasFullAccess
{
    UIPasteboard *pasteboard = [UIPasteboard generalPasteboard];
    NSString *originalString = pasteboard.string;
    pasteboard.string = @"TEST";
    if (pasteboard.hasStrings) {
        pasteboard.string = originalString;
        return YES;
    } else {
        return NO;
    }
}
0
Josh

Les applications avec un groupe d'applications peuvent utiliser:

 func isOpenAccessGranted() -> Bool {
    let fm = NSFileManager.defaultManager()
    let containerPath = fm.containerURLForSecurityApplicationGroupIdentifier(
        AppGroup)?.path
    return fm.isWritableFileAtPath(containerPath!)
}
0
Ankish Jain

juste utiliser 

    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0),     
^{
    AudioServicesPlaySystemSound(1104);
    });

le tirck est, lorsque l'accès complet est activé, le son sera joué, sinon, car son appel est dans le fil de fond ne bloquera pas le fil principal

0
user3180187

iOS11 et au-dessus est facile. 

solution iOS10: Cochez tous les types de copies, si l'un d'entre eux est disponible, vous avez un accès complet sinon.

- Swift 4.2--

override var hasFullAccess: Bool
{
    if #available(iOS 11.0, *){
        return super.hasFullAccess// super is UIInputViewController.
    }

    if #available(iOSApplicationExtension 10.0, *){
        if UIPasteboard.general.hasStrings{
            return  true
        }
        else if UIPasteboard.general.hasURLs{
            return true
        }
        else if UIPasteboard.general.hasColors{
            return true
        }
        else if UIPasteboard.general.hasImages{
            return true
        }
        else  // In case the pasteboard is blank
        {
            UIPasteboard.general.string = ""

            if UIPasteboard.general.hasStrings{
                return  true
            }else{
                return  false
            }
        }
    } else{
        // before iOS10
        return UIPasteboard.general.isKind(of: UIPasteboard.self)
    }
}
0
Ahmet Akkök

Aujourd'hui, pour iOS 9.2, vous pouvez vérifier accès ouvert par:

func isOpenAccessGranted() -> Bool {
    return UIPasteboard(name: "checkOpenedAccess", create: true) != nil
}
0
dimpiax