Rendre un calendrier SharePoint 2010 consultable pour iPhone/iPad ou autre smartphone/tablet

Pendant vos projets SharePoint, vos utilisateurs vont ont certainement fait part qu’ils souhaitaient synchroniser un calendrier spécifique et particulièrement important avec leur iPhone ou leur iPad (que ce soit en interne ou en extérieur). Néanmoins, L’iPhone ne sait pas le faire pas naturellement : rien de plus simple qu’une publication au format iCalendar pour palier au problème !

Pour faire face à cette situation, direction Visual Studio 2010 (avec Nuget installé) ou 2012 (mieux !) :

  1. Créez un nouveau projet SharePoint vide
  2. Ajoutez le package DDay.iCal à votre projet (que vous pouvez trouver ici :http://nuget.org/packages/DDay.iCal) qui va nous permettre de générer simplement la sortie iCal
  3. Créez un fichier handler .ashx et copier (en l’adaptant à votre environnement) suivant :

<%@ Assembly Name= »Microsoft.SharePoint, Version=14.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c » %>
<%@ Assembly Name= »Contoso.iCal, Version=1.0.0.0, Culture=neutral, PublicKeyToken=5d957034fc68cb87″ %>
<%@ WebHandler Language= »C# » Class= »Consoto.iCalPublisher.Agenda » %>

using System;
using System.Collections;
using System.Collections.Generic;
using System.Text;
using System.Web;
using Noumea.iCal;
using Microsoft.SharePoint;

namespace Contoso.iCalPublisher
{
    public class Agenda : IHttpHandler
    {
        public bool IsReusable
        {
            get { return false; }
        }

        public void ProcessRequest(HttpContext context)
        {
            iCalCalendar cal = new iCalCalendar();

            using (SPSite site = new SPSite(« http://demo.contoso.nc/managers/ »))
            {
                using (SPWeb web = site.RootWeb)
                {
                    // Récupération du calendrier à publier en iCal
                    SPList calManager = web.Lists.TryGetList(« Agenda Managers »);
                    if (calManager != null)
                    {
                        // Filtrage par rapport à un type de contenu et ne récupère que les 15 derniers jours d’évènements antérieurs à la date du jour
                        SPQuery query = new SPQuery();
                        query.Query = string.Concat(
                                « <Where><And><Eq><FieldRef Name=’ContentType’/><Value Type=’Text’>Evènement Manager</Value></Eq><Geq><FieldRef Name=’EndDate’ /><Value Type=’DateTime’><Today OffsetDays=’-15′ /></Value></Geq></And></Where> »);
                        SPListItemCollection listItems = calManager.GetItems(query);
                        // On exporte tous les évènements récupérés en iCal
                        foreach (SPListItem item in listItems)
                        {
                            iCalEvent evt = new iCalEvent();
                            evt.DateBegin = DateTime.Parse(item[« EventDate »].ToString());
                            evt.DateEnd = DateTime.Parse(item[« EndDate »].ToString());
                            evt.Description = item[« Title »].ToString();
                            evt.Location = item[« Location »] != null ? item[« Location »].ToString() : «  »;
                            cal.Events.Add(evt);
                        }
                    }
                }
            }

            byte[] arrBytData = cal.Serialize();
            context.Response.Clear();
            context.Response.ContentType = « text/plain »;
            // Pour éviter le cache
            context.Response.AppendHeader(« Pragma », « no-cache »);
            context.Response.AppendHeader(« Expires », « Sat, 05 Jul 2010 05:00:00 GMT »);
            context.Response.AppendHeader(« Content-Disposition », « attachment; filename=CalendrierManager.ics »);
            context.Response.AppendHeader(« Content-Length », arrBytData.Length.ToString());
            context.Response.ContentType = « text/calendar »;
            context.Response.BinaryWrite(arrBytData);
            context.Response.Flush();
            context.Response.End();
            context.Response.Close();
        }
    }
}

That’s all folks ! Bien évidemment la sécurité fonctionne à merveille (authentification requise).

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.