72 votes

L'installation d'un profil de configuration de l'iPhone - par programmation

Je voudrais expédier un profil de configuration avec mon iPhone l'application et de l'installer si nécessaire.

Rappelez-vous, nous parlons d'un profil de configuration, pas d'un profil de configuration.

Tout d'abord, une telle tâche est possible. Si vous placez une config profil sur une page Web et cliquez sur à partir de Safari, il sera installé. Si vous e-mail d'un profil et cliquez sur la pièce jointe, il faudra installer. "Installé" dans ce cas signifie "L'installation de l'INTERFACE utilisateur est appelée" - mais je ne pouvais même pas en arriver là.

Donc, je travaillais dans la théorie que le lancement d'un profil d'installation consiste à naviguer comme une URL. J'ai ajouté le profil de mon app bundle.

A) tout d'Abord, j'ai essayé [sharedApp openURL] avec l'URL file:// dans mon bundle. Pas une telle chance ne se passe rien.

B) ensuite, j'ai ajouté une page HTML de mon bundle qui a un lien vers le profil, et l'a chargé dans une UIWebView. En cliquant sur le lien ne fait rien. Chargement d'une page identiques à partir d'un serveur Web dans Safari, cependant, fonctionne très bien - le lien est cliquable, le profil de l'installation. J'ai fourni un UIWebViewDelegate, de répondre OUI à chaque demande de navigation - pas de différence.

C) Ensuite, j'ai essayé de charger la même page Web à partir de mon bundle dans Safari (à l'aide de [sharedApp openURL] - rien ne se passe. Je suppose que, Safari ne peut pas voir les fichiers à l'intérieur de mon app bundle.

D) Téléchargement de la page et le profil sur un serveur Web, c'est faisable, mais une douleur au niveau de l'organisation, pour ne pas mentionner une source supplémentaire d'échecs (si pas de couverture 3G? etc.).

Donc ma grande question est: comment puis-je installer un profil par programmation?

Et le peu de questions sont les suivantes: que peut faire un lien non cliquable dans une UIWebView? Est-il possible de charger un fichier:// URL de mon bundle dans Safari? Si non, est-il un emplacement local sur l'iPhone où je peux placer des fichiers et Safari pouvez les trouver?

EDIT sur B): le problème est en quelque sorte dans le fait que nous nous connectons à un profil. Je l'ai renommé .mobileconfig .xml (parce que c'est vraiment XML), modifié le lien. Et le lien a travaillé dans mon UIWebView. Rebaptisée arrière - mêmes trucs. Il semble que si UIWebView est réticent à le faire au niveau de l'application de trucs depuis l'installation du profil ferme l'application. J'ai essayé de dire que c'est OK - par le biais de UIWebViewDelegate - mais qui n'a pas convaincu. Même comportement pour les mailto: Url dans UIWebView.

Pour mailto: Url de la technique courante consiste à les traduire en [openURL] appels, mais qui n'a pas assez de travail pour mon cas, reportez-vous au scénario A.

Pour les tms: Url, cependant, UIWebView fonctionne comme prévu...

EDIT2: essayé d'alimentation de données à l'URL de Safari par [openURL] - ne fonctionne pas, voir ici: iPhone Open DATA: l'Url Dans Safari

EDIT3: trouvé beaucoup d'infos sur la façon Safari ne prend pas en charge les fichiers:// Url. UIWebView, cependant, très bien fait. Aussi, Safari sur le simulateur ouvrir l'amende juste. Le dernier bit est le plus frustrant.


EDIT4: je n'ai jamais trouvé une solution. Au lieu de cela, j'ai mis en place une à deux bits de l'interface Web, où les utilisateurs peuvent commander le profil envoyés par e-mail.

36voto

malinois Points 4239

1) Installer un serveur local comme RoutingHTTPServer

2) Configurer l'en-tête personnalisé :

[httpServer setDefaultHeader:@"Content-Type" value:@"application/x-apple-aspen-config"];

3) Configurer les locaux du chemin de la racine pour le fichier mobileconfig (Documents):

[httpServer setDocumentRoot:[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0]];

4) afin de laisser le temps au serveur web pour envoyer le fichier, ajoutez ceci :

Appdelegate.h

UIBackgroundTaskIdentifier bgTask;

Appdelegate.m
- (void)applicationDidEnterBackground:(UIApplication *)application {
    NSAssert(self->bgTask == UIBackgroundTaskInvalid, nil);
    bgTask = [application beginBackgroundTaskWithExpirationHandler: ^{
        dispatch_async(dispatch_get_main_queue(), ^{
            [application endBackgroundTask:self->bgTask];
            self->bgTask = UIBackgroundTaskInvalid;
        });
    }];
}

5) Dans votre contrôleur, appel safari avec le nom de la mobileconfig stockées dans des Documents :

[[UIApplication sharedApplication] openURL:[NSURL URLWithString: @"http://localhost:12345/MyProfile.mobileconfig"]];

27voto

xaphod Points 81

La réponse de malinois a fonctionné pour moi, MAIS, je voulais une solution qui revint à l'application automatiquement après que l'utilisateur a installé le mobileconfig.

Il m'a fallu 4 heures, mais ici, c'est la solution, construit sur malinois " l'idée d'avoir un serveur http local: vous HTML de retour de safari qui actualise lui-même; la première fois que le serveur renvoie le mobileconfig, et la deuxième fois qu'il retourne l'url personnalisée-régime pour revenir à votre application. Le UX est ce que je voulais: les appels app safari, safari s'ouvre mobileconfig, lorsque l'utilisateur appuie sur "done" sur mobileconfig, puis safari charges de votre application (sur le schéma d'url).

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    // Override point for customization after application launch.

    _httpServer = [[RoutingHTTPServer alloc] init];
    [_httpServer setPort:8000];                               // TODO: make sure this port isn't already in use

    _firstTime = TRUE;
    [_httpServer handleMethod:@"GET" withPath:@"/start" target:self selector:@selector(handleMobileconfigRootRequest:withResponse:)];
    [_httpServer handleMethod:@"GET" withPath:@"/load" target:self selector:@selector(handleMobileconfigLoadRequest:withResponse:)];

    NSMutableString* path = [NSMutableString stringWithString:[[NSBundle mainBundle] bundlePath]];
    [path appendString:@"/your.mobileconfig"];
    _mobileconfigData = [NSData dataWithContentsOfFile:path];

    [_httpServer start:NULL];

    return YES;
}

- (void)handleMobileconfigRootRequest:(RouteRequest *)request withResponse:(RouteResponse *)response {
    NSLog(@"handleMobileconfigRootRequest");
    [response respondWithString:@"<HTML><HEAD><title>Profile Install</title>\
     </HEAD><script> \
     function load() { window.location.href='http://localhost:8000/load/'; } \
     var int=self.setInterval(function(){load()},400); \
     </script><BODY></BODY></HTML>"];
}

- (void)handleMobileconfigLoadRequest:(RouteRequest *)request withResponse:(RouteResponse *)response {
    if( _firstTime ) {
        NSLog(@"handleMobileconfigLoadRequest, first time");
        _firstTime = FALSE;

        [response setHeader:@"Content-Type" value:@"application/x-apple-aspen-config"];
        [response respondWithData:_mobileconfigData];
    } else {
        NSLog(@"handleMobileconfigLoadRequest, NOT first time");
        [response setStatusCode:302]; // or 301
        [response setHeader:@"Location" value:@"yourapp://custom/scheme"];
    }
}

... et voici le code pour un appel dans ce à partir de l'app (c'est à dire viewcontroller):

[[UIApplication sharedApplication] openURL:[NSURL URLWithString: @"http://localhost:8000/start/"]];

Espérons que cela aide quelqu'un.

4voto

slf Points 15327

Je pense que ce que vous cherchez est "Over the Air "Inscription" à l'aide de la Simple Certificate Enrollment Protocol (SCEP). Jetez un oeil à l' OTA Inscription Guide et le SCEP Charge utile de la section de l' Entreprise Guide de Déploiement.

Selon le Dispositif de Config Aperçu vous n'avez quatre options:

  • Installation de bureau via le port USB
  • E-mail (pièce jointe)
  • Site web (via Safari)
  • Over-the-Air de l'Inscription et de la Distribution

0voto

Jon-Eric Points 7749

Cette page explique comment utiliser des images à partir de votre paquet dans une UIWebView.

Peut-être le même travail pour un profil de configuration.

0voto

smountcastle Points 495

Avez-vous essayé juste avoir l'application de messagerie de l'utilisateur du fichier de configuration profil de la première fois qu'il démarre?

-(IBAction)mailConfigProfile {
 MFMailComposeViewController *email = [[MFMailComposeViewController alloc] init];
 e-mail.mailComposeDelegate = auto;

 [email setSubject:@"Mon Application de Configuration du Profil"];

 NSString *filePath = [[NSBundle mainBundle] pathForResource:@"MyAppConfig" ofType:@"mobileconfig"]; 
 NSData *configData = [NSData dataWithContentsOfFile:filePath]; 
 [email addAttachmentData:configData type mime:@"application/x-apple-aspen-config" nom de fichier:@"MyAppConfig.mobileconfig"];

 NSString *emailBody = @"s'il vous Plaît appuyez sur la pièce jointe pour installer le profil de configuration pour Mon Application.";
 [email setMessageBody:emailBody isHTML:YES];

 [auto presentModalViewController:e-mail animated:YES];
 [email release];
}

Je l'ai fait une IBAction dans le cas où vous souhaitez attacher un bouton permet à l'utilisateur d'envoyer à nouveau à eux-mêmes à tout moment. Notez que je ne peut pas avoir le bon type MIME dans l'exemple ci-dessus, vous devez vérifier que.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X