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?
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.
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];
}
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
}
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
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
}
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)
}
}
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)
}
Solution Swift utile de @ hoiberg42:
func isOpenAccessGranted() -> Bool {
return UIPasteboard.generalPasteboard().isKindOfClass(UIPasteboard)
}
Fonctionne comme un charme!
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)
}
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.
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;
}
}
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!)
}
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
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)
}
}
Aujourd'hui, pour iOS 9.2, vous pouvez vérifier accès ouvert par:
func isOpenAccessGranted() -> Bool {
return UIPasteboard(name: "checkOpenedAccess", create: true) != nil
}