次の方法で共有


モバイル メッセージング開発の概要

最終更新日: 2010年4月14日

適用対象: SharePoint Foundation 2010

このトピックでは、SharePoint Foundation Software Development Kit (SDK) のモバイル メッセージング API を使用して、モバイル メッセージング機能を Microsoft SharePoint Foundation 開発プロジェクトに追加する方法の概要について説明します。この API は、大きく 2 つのわかりやすいグループに分けることができます。1 つは、Office Mobile Service (OMS) 通信プロトコルを使用するショート メッセージ サービス (SMS) メッセージング ("テキスティング" とも呼ばれる) をサポートするグループ、もう 1 つは、他の通信またはメッセージ構造のプロトコルに対する支援の確立を可能にするグループです。ほとんどの開発シナリオにおいて、メッセージの送信者は、特定のユーザーとは対照的な SharePoint Foundation Web アプリケーションです。したがって、SharePoint Foundation 開発では、ソリューションで使用する通信プロトコルをサポートするモバイル メッセージング サービス プロバイダー (MSP) 会社のアカウントが必要です。

Office Mobile Service (OMS) プロトコルは、SMS とマルチメディア メッセージ サービス (MMS) メッセージ構造のプロトコルの実装を提供する通信プロトコルです。OMS では Web サービス アクセス用の SOAP プロトコルが必要です。OMS をサポートする API (以下の「OMS-SMS メッセージング ソリューション」を参照) は、SMS メッセージング向けに設計されています。Microsoft.SharePoint.MobileMessage 名前空間内にあり名前に "MMS" が含まれるすべてのクラスとメンバー、または MMS メッセージングのコンテキスト内でのみ意味のあるすべてのクラスとメンバーは、内部使用のみに限定され、コードから呼び出すことはできません。通信プロトコルとして OMS を使用しないメッセージ ソリューションや、MMS メッセージ用の OMS を使用するメッセージ ソリューションを開発するには、抽象レベルの高い API (以下の「他のプロトコルの開発」を参照) を使用します。

OMS-SMS メッセージング ソリューション

SharePoint Foundation は、すべての OMS Web メソッド呼び出し、およびすべての XML 解析と書き込みを自動で実行する API を提供します。コードでは、使い慣れたオブジェクト指向の構文で API を呼び出すのみです。

Web アプリケーション用の MSP アカウントを作成する

サーバーの全体管理 Web アプリケーションを含む、各 SharePoint Foundation Web アプリケーションで、MSP のアカウントを持つことができます。通常、このアカウントは、ファーム管理者が、サーバーの全体管理アプリケーションの [アプリケーション構成の管理] 部分で設定します。ただし、プログラムを使用してアカウントを作成し、そのアカウントを Web アプリケーションに割り当てることができます。まず、SPMobileMessageServiceProvider パラメーターを必要としない SPMobileMessagingAccount() コンストラクターを呼び出します。次に、UpdateSmsAccount(SPMobileMessagingAccount) メソッドを呼び出して、アカウントを Web アプリケーションに割り当てます。次のスニペットでは、webApp が SPWebApplication オブジェクトへの参照です (このようなオブジェクトへの参照を取得する方法の詳細については、「サイト、Web アプリケーション、およびその他の主要オブジェクトへの参照を取得する」を参照してください)。このスニペットは、ファイルに Microsoft.SharePointSystem.Security の using ステートメントが含まれることを前提とします。UpdateSmsAccount(SPMobileMessagingAccount) の呼び出しは、RunWithElevatedPrivileges(SPSecurity.CodeToRunElevated) メソッドへの任意の委任の一部として渡されます。

SecureString password = new SecureString();
password.AppendChar(‘a’);
password.AppendChar(‘Z’);
password.AppendChar(‘3’);
password.AppendChar(‘&’);

SPMobileMessagingAccount account = new SPMobileMessagingAccount("Contoso Messaging",
                                                                "https://contoso.com/services/mobilemessages",
                                                                 "BobG",
                                                                 password);

SPSecurity.RunWithElevatedPrivileges(delegate() {webApp.UpdateSmsAccount(account);
                                                 webApp.Update();});
Dim password As New SecureString()
        password.AppendChar("a")
        password.AppendChar("z")
        password.AppendChar("3")
        password.AppendChar("&")

        Dim account As New SPMobileMessagingAccount("Contoso Messaging", "https://contoso.com/services/mobilemessages", "BobG", password)


        SPSecurity.RunWithElevatedPrivileges(Sub()
                                                 webApp.UpdateSmsAccount(account)
                                                 webApp.Update()
                                             End Sub)

Web アプリケーションに MSP のアカウントを割り当てたら、コードで、OutboundSmsServiceAccount プロパティを Web アプリケーションのアカウント オブジェクトへの参照として使用できます。

Web サービス オブジェクトを作成する

SPMobileMessagingAccount がある場合、コードでそのオブジェクトを使用して、SMS メッセージ送信用のメソッドを含む SPMobileMessageWebService オブジェクトを作成できます。固定された SPMobileMessagingAccount オブジェクトへの参照を取得するたびに、その参照が null でなく、その IsValidAccount() プロパティが true になっていることを常に検証することをお勧めします。次のスニペットは Web サービス オブジェクトの作成方法を示しています。webApp が SPWebApplication オブジェクトへの参照です。

SPMobileMessagingAccount account = webApp.OutboundSmsServiceAccount;
if (account == null || !account.IsValidAccount())
{
    throw new SPException("The account passed in is invalid.");
}
else
{
    SPMobileMessageWebService messagingWebService = new SPMobileMessageWebService(account);
}
Dim account As SPMobileMessagingAccount = webApp.OutboundSmsServiceAccount
If account Is Nothing OrElse (Not account.IsValidAccount()) Then
    Throw New SPException("The account passed in is invalid.")
Else
    Dim messagingWebService As New SPMobileMessageWebService(account)
End If

モバイル メッセージを構築して送信する

メッセージの構築と送信を行うには、次の 2 つの重要なタスクを実行します。

メッセージを構築する

SPMobileMessageWebService オブジェクトでは、コードで、オブジェクトのメソッドをプロキシとして使用し、サービスの OMS Web メソッドを呼び出すことができます。最も重要なメソッドは、SendMessage(String) メソッドです。ただし、コードでは、このメソッドを呼び出す前にメッセージを構築する必要があります。これを行う方法は 3 つあります。

  • コードで、静的 BuildSmsMessage(SPMobileMessagingAccount, String, String) メソッドを呼び出し、そのメソッドに、送信者のアカウント、受信者、メッセージのテキストなどのパラメーターを渡します。これは最も簡単な方法ですが、最も柔軟性の低い方法です。

  • コードで、SetTextContent() のオーバーロードの 1 つを呼び出すことができます。これを行うには、まず、SPMobileMessageSmsBuilder を構築し、AddRecipient(String) メソッドを使用して受信者を追加します。次に、メッセージを、SetTextContent() が作成する SPMobileSmsMessage オブジェクトから、OMS プロトコルの適切なメッセージ XML に変換します。ただし、このメッセージ構築方法では、複数の受信者を追加するための 2 つのオプションが提供されます。また、サービス プロバイダーによって課せられている子ページ数の下限よりも低い下限を設定できます (ContentParts)。メッセージ テキストが、サービスによって課せられている文字制限を越える場合、メッセージはこの子ページ数の下限に分割されます。

  • コードで、メッセージング構築トランザクションを作成できます。このトランザクションは次の要素で構成されます。

    1. StartTextMessage() の呼び出し

    2. AddChunk(String) の 1 つ以上の呼び出し

    3. EndTextMessage() のオーバーロードの 1 つの呼び出し

    このメッセージ構築方法では、前の方法のようにすべてのオプションとそのすべての組み合わせが提供されますが、メッセージを複数ページに分割する方法が厳密に制御できるようになると共に、ページ番号の追加など、他のオプションも提供されます。

使用する方法に関係なく、メッセージの文字数がサービス プロバイダーの制限を越える場合、メッセージ構築アルゴリズムによって、メッセージは複数のメッセージに分割されます。このとき、メッセージはテキストの "チャンク" で分割されます。テキストのチャンクとは、可能な限り 1 つのメッセージ内に同時に含める必要のある文字の連続です。この方法を使用すると、親メッセージを等しく任意に分割する場合よりも、結果の一連のメッセージが整然としてわかりやすくなります。特定のチャンク自身が文字制限を越えた場合、そのチャンク自身が分割されます。メッセージをチャンクに分割する方法をコードで制御できるのは、この 3 番目のメッセージ構築方法のみです。次のスニペットは 3 番目の方法を示しています。この例については、次の点に注意してください。

  • account は SPMobileMessagingAccount オブジェクトへの参照です。

  • AddRecipient(String) の呼び出しは 1 回のみですが、これを複数回呼び出して、同じメッセージを、MSP による制限まで複数の受信者に送信できます。

  • SplitLongMessage は、以下の次のコード ブロックで定義されています。

  • message は、メッセージを含む String オブジェクトです。

  • メッセージ構築トランザクションが完了すると、SPMobileMessageSmsBuilder オブジェクトの Message プロパティにメッセージが保持されます。

SPMobileMessageSmsBuilder smsBuilder = new SPMobileMessageSmsBuilder(account);
smsBuilder.AddRecipient(mobile_telephone_number);

// Begin the message building transaction
smsBuilder.StartTextMessage();

// Add the message text, split as needed into chunks.
List<StringBuilder> messageParts = SplitLongMessage(message)
foreach (StringBuilder chunk in messageParts)
{
    smsBuilder.AddChunk(chunk.ToString());
}

// Finish the transaction
smsBuilder.EndTextMessage();

// At this point, the smsBuilder.Message property holds the message as an SPMobileSmsMessage object.
Dim smsBuilder As New SPMobileMessageSmsBuilder(account)
smsBuilder.AddRecipient(mobile_telephone_number)

' Begin the message building transaction
smsBuilder.StartTextMessage()

' Add the message text, split as needed into chunks.
Dim messageParts As List(Of StringBuilder) = SplitLongMessage(message)
For Each chunk As StringBuilder In messageParts
    smsBuilder.AddChunk(chunk.ToString())
Next

' Finish the transaction
smsBuilder.EndTextMessage()

' At this point, the smsBuilder.Message property holds the message as an SPMobileSmsMessage object

SplitLongMessage メソッドは、連結された SMS メッセージ ("長い SMS メッセージ" と呼ばれることもある) のチャンクごとに、メッセージのチャンクが 133 (シングルバイト) 文字の SMS 制限を超えないようにする単純なアルゴリズムを実装します。さらに、このメソッドでは、分割が常に空白文字の位置で行われるため、分割されたメッセージ間で単語が分割されることはありません。メッセージ内にシングルバイト以外の文字が含まれる場合があることを前提とするモバイル メッセージング ソリューションでは、さらに複雑なアルゴリズムが必要です。

public static List<StringBuilder> SplitLongMessage(String message)
{
    // Split the original message at white space.
    String[] words = message.Split(null);

    List<StringBuilder> chunks = new List<StringBuilder>();
    StringBuilder latestChunk = new StringBuilder(132);

    // Reconstruct the message in chunks of up to 133 characters.
    foreach (String word in words)
    {
        if (word.Length + latestChunk.Length <= 132) //Not 133 because a space will be added
        {
            latestChunk.Append(word + " "); // Add back the white space
        }
        else
        {
            // Add a copy of the chunk to the list
            chunks.Add(new StringBuilder(latestChunk.ToString()));

            // Empty out latest chunk so the next one can be started
            latestChunk.Remove(0, latestChunk.Length);

            // The word that exceeded the limit becomes the first word of the next chunk
            latestChunk.Append(word + " ");
        }
    }

    // Add the last short chunk
    if (latestChunk.Length > 0)
    {
        chunks.Add(latestChunk);
    }

    return chunks;
}
Public Shared Function SplitLongMessage(ByVal message As String) As List(Of StringBuilder)
    ' Split the original message at white space.
    Dim words() As String = message.Split(Nothing)

    Dim chunks As New List(Of StringBuilder)()
    Dim latestChunk As New StringBuilder(132)

    ' Reconstruct the message in chunks of up to 133 characters.
    For Each word As String In words
        If word.Length + latestChunk.Length <= 132 Then 'Not 133 because a space will be added
            latestChunk.Append(word & " ") ' Add back the white space
        Else
            ' Add a copy of the chunk to the list
            chunks.Add(New StringBuilder(latestChunk.ToString()))

            ' Empty out latest chunk so the next one can be started
            latestChunk.Remove(0, latestChunk.Length)

            ' The word that exceeded the limit becomes the first word of the next chunk
            latestChunk.Append(word & " ")
        End If
    Next word

    ' Add the last short chunk
    If latestChunk.Length > 0 Then
        chunks.Add(latestChunk)
    End If

    Return chunks
End Function

SPMobileSmsMessage オブジェクト (SPMobileMessageBuilder.Message プロパティ内で参照される) の構築に SetTextContent() の呼び出しを使用するか、またはメッセージ構築トランザクションを使用するかに関係なく、コードで、そのオブジェクトを適切な OMS 形式のメッセージ XML に変換する必要があります。これを行うには、GetMessageXml() メソッドを呼び出します。ただし、BuildSmsMessage(SPMobileMessagingAccount, String, String) メソッドの呼び出しを使用してメッセージを構築する場合、この追加の XML 書き込み手順は必要ありません。このメソッドがメッセージ XML を返すためです。

String messageXml = smsBuilder.GetMessageXml();
Dim messageXml As String = smsBuilder.GetMessageXml()

メッセージを送信する

メッセージは、完全な OMS 準拠のメッセージ XML を SPMobileMessageWebService オブジェクトの SendMessage(String) メソッドに渡すことで送信されます。このオブジェクトの作成方法の詳細については、上記の「Web サービス オブジェクトを作成する」を参照してください。次のスニペットでは、messagingWebService が SPMobileMessageWebService オブジェクトで、messageXml が完全な OMS 準拠のメッセージです。

SPMobileMessageDeliveryReport report = messagingWebService.SendMessage(messageXml);
Dim report As SPMobileMessageDeliveryReport = messagingWebService.SendMessage(messageXml)

SendMessage(String) によって返されるレポートには、メッセージが正常に送信されたかどうか、また、そうでない場合は失敗した原因に関する情報が含まれます。レポートを処理するコードを組み込み、成功メッセージの記録と失敗への対応を行うことをお勧めします。レポートの構成の詳細については、「SPMobileMessageDeliveryReport」を参照してください。

メッセージのバッチを送信する

ソリューションでバッチ送信を使用する場合、バッチジョブ間で作成されたメッセージを、バッチが送信されたときにフラッシュ可能な何かしらのキュー構造に格納する必要があります (例: List<T><SPMobileSmsMessage>)。バッチ ジョブでは、まず、各メッセージ オブジェクトの追加先の SPMobileMessageBatchPackage オブジェクトを作成します。次に、パッケージを BatchSendMessages(SPMobileMessageBatchPackage) メソッドに渡します。

次のスニペットでは、messageCollection が List<T><SPMobileSmsMessage> オブジェクトで、messagingWebService が SPMobileMessageWebService オブジェクトです。このオブジェクトの作成方法の詳細については、上記の「Web サービス オブジェクトを作成する」を参照してください。

SPMobileMessageBatchPackage package = new SPMobileMessageBatchPackage();

foreach (SPMobileSmsMessage message in messageCollection)
{
    package.AddMessage(message);
}

List<SPMobileMessageDeliveryReport> reports = messagingWebService.BatchSendMessages(package);
Dim package As New SPMobileMessageBatchPackage()

For Each message As SPMobileSmsMessage In messageCollection
    package.AddMessage(message)
Next message

Dim reports As List(Of SPMobileMessageDeliveryReport) = messagingWebService.BatchSendMessages(package)

パッケージ内の SPMobileSmsMessage オブジェクトを OMS 準拠の XML メッセージに明示的に変換する必要はありません。パッケージは、バッチ ジョブ XML 全体をその Xml プロパティに返します。この XML が、BatchSendMessages(SPMobileMessageBatchPackage) メソッドによってメッセージング Web サービスに送信されます。

BatchSendMessages(SPMobileMessageBatchPackage) メソッドによって返されるレポートのリストを処理するコードを組み込み、成功メッセージの記録と失敗への対応を行うことをお勧めします。

他の Web サービス メソッド

SPMobileMessageWebService クラスには他に 2 つのメソッドが含まれます。GetUserInfo(String)GetServiceInfo() です。これらはそれぞれ OMS Web メソッド GetUserInfoGetServiceInfo のプロキシとして機能します。

他のプロトコルの開発

Microsoft では、Microsoft.SharePoint.MobileMessage 内のいずれかのクラスを派生して、OMS プロトコルを使用しないモバイル メッセージング ソリューションを作成することがサポートされません。ソリューションを、OMS を使用しない MSP で動作する場合、SharePoint Foundation モバイル メッセージング API と、別のプロトコルを使用する MSP との間で中間層として機能する Web サービスを作成することを検討してください。このサービスを使用して、SharePoint Foundation からの OMS プロトコル メッセージを受け入れて、そのメッセージを、別のプロトコルを使用する MSP に適したメッセージに変換します。