2

iOS デバイス向けの MDM ソリューションに取り組んでいます。

Web サイトを介して MDM ペイロードを使用してプロファイルをインストールすることは既に可能であり、PushMagic、deviceToken およびその他の値を含む iOS デバイスから送信された PUT 要求も既に受信しています。

次の説明を使用して COMPANY.pem SSL 証明書を作成しました: http://www.softhinker.com/in-the-news/iosmdmvendorcsrsigning

ライブラリ push-sharp でプッシュ通知を送信しようとしました: https://github.com/Redth/PushSharp

これらのコマンドでMDM.p12ファイルビルドを使用していました

openssl pkcs12 -export -in ./COMPANY.pem -inkey ./customerPrivateKey.pem -certfile ./CertificateSigningRequest.certSigningRequest -out MDM.p12

この通知を送信するプログラムはエラーをスローせず、正常に終了します。しかし、デバイスでプッシュ通知を受信したり、フィードバック サービスから何も受信したりしていません。

また、sandbox-server と production-server も使用しようとしたことにも言及する必要があります。

push-sharp ライブラリを使用したコードは次のとおりです。

    using System;
using System.Collections.Generic;
using System.Collections.Specialized;
using System.IO;
using System.Linq;
using System.Text;
using PushSharp;
using PushSharp.Apple;


namespace PushSharp.Sample
{
    class Program
    {
        static void Main(string[] args)
        {

            //Create our service    
            PushService push = new PushService();

            //Wire up the events
            push.Events.OnDeviceSubscriptionExpired += new Common.ChannelEvents.DeviceSubscriptionExpired(Events_OnDeviceSubscriptionExpired);
            push.Events.OnDeviceSubscriptionIdChanged += new Common.ChannelEvents.DeviceSubscriptionIdChanged(Events_OnDeviceSubscriptionIdChanged);
            push.Events.OnChannelException += new Common.ChannelEvents.ChannelExceptionDelegate(Events_OnChannelException);
            push.Events.OnNotificationSendFailure += new Common.ChannelEvents.NotificationSendFailureDelegate(Events_OnNotificationSendFailure);
            push.Events.OnNotificationSent += new Common.ChannelEvents.NotificationSentDelegate(Events_OnNotificationSent);

            //Configure and start Apple APNS
            // IMPORTANT: Make sure you use the right Push certificate.  Apple allows you to generate one for connecting to Sandbox,
            //   and one for connecting to Production.  You must use the right one, to match the provisioning profile you build your
            //   app with!
            //var appleCert = File.ReadAllBytes("C:\\TEMP\\apns-mdm.p12");
            var appleCert = File.ReadAllBytes(@".\MDM.p12");

            //IMPORTANT: If you are using a Development provisioning Profile, you must use the Sandbox push notification server 
            //  (so you would leave the first arg in the ctor of ApplePushChannelSettings as 'false')
            //  If you are using an AdHoc or AppStore provisioning profile, you must use the Production push notification server
            //  (so you would change the first arg in the ctor of ApplePushChannelSettings to 'true')
            push.StartApplePushService(new ApplePushChannelSettings(true, appleCert, "PWD"));


            //String p12File = @".\apns-mdm.p12";
            //String p12Password = "PWD";
            String pushMagicString = "00454668-00B2-4122-A1DC-72ACD64E6AFB";
            //String deviceToken = "27asObngxvVNb3RvRMs3XVaEWC1DNa3TjFE12stKsig=";


            //Configure and start Android GCM
            //IMPORTANT: The SENDER_ID is your Google API Console App Project ID.
            //  Be sure to get the right Project ID from your Google APIs Console.  It's not the named project ID that appears in the Overview,
            //  but instead the numeric project id in the url: eg: https://code.google.com/apis/console/?pli=1#project:785671162406:overview
            //  where 785671162406 is the project id, which is the SENDER_ID to use!
            //push.StartGoogleCloudMessagingPushService(new GcmPushChannelSettings("785671162406", "AIzaSyC2PZNXQDVaUpZGmtsF_Vp8tHtIABVjazI", "com.pushsharp.test"));

            //Configure and start Windows Phone Notifications
            //push.StartWindowsPhonePushService(new WindowsPhone.WindowsPhonePushChannelSettings());

            //Fluent construction of a Windows Phone Toast notification
            //push.QueueNotification(NotificationFactory.WindowsPhone().Toast()
            //.ForEndpointUri(new Uri("http://sn1.notify.live.net/throttledthirdparty/01.00/AAFCoNoCXidwRpn5NOxvwSxPAgAAAAADAgAAAAQUZm52OkJCMjg1QTg1QkZDMkUxREQ"))
            //.ForOSVersion(WindowsPhone.WindowsPhoneDeviceOSVersion.MangoSevenPointFive)
            //.WithBatchingInterval(WindowsPhone.BatchingInterval.Immediate)
            //.WithNavigatePath("/MainPage.xaml")
            //.WithText1("PushSharp")
            //.WithText2("This is a Toast"));

            //Fluent construction of an iOS notification
            //IMPORTANT: For iOS you MUST MUST MUST use your own DeviceToken here that gets generated within your iOS app itself when the Application Delegate
            //  for registered for remote notifications is called, and the device token is passed back to you
            String test = "3d 58 64 4d 90 d3 18 09 22 5c 50 d2 12 16 b5 67 71 1e be 5c 13 6e 41 3c 3e 81 b5 52 30 68 09 a5";
            test = test.Replace(" ", string.Empty);
            Console.WriteLine("Device Token length is: " + test.Length);
            Console.WriteLine("DeviceToken is: " + test);
            Console.WriteLine("PushMagic is: " + pushMagicString);

            DateTime dayAfterTomorrow = DateTime.Now.AddDays(2);
            Console.WriteLine("Expiry date is: " + dayAfterTomorrow.ToString());

            push.QueueNotification(NotificationFactory.Apple()
                .ForDeviceToken(test).WithExpiry(dayAfterTomorrow).WithCustomItem("mdm", pushMagicString));


            //push.Events.RaiseNotificationSent(NotificationFactory.Apple()
            //    .ForDeviceToken(hex).WithCustomItem("mdm", pushMagicString));


            //Fluent construction of an Android GCM Notification
            //push.QueueNotification(NotificationFactory.AndroidGcm()
            //    .ForDeviceRegistrationId("APA91bG7J-cZjkURrqi58cEd5ain6hzi4i06T0zg9eM2kQAprV-fslFiq60hnBUVlnJPlPV-4K7X39aHIe55of8fJugEuYMyAZSUbmDyima5ZTC7hn4euQ0Yflj2wMeTxnyMOZPuwTLuYNiJ6EREeI9qJuJZH9Zu9g")
            //    .WithCollapseKey("NONE")
            //    .WithJson("{\"alert\":\"Alert Text!\",\"badge\":\"7\"}"));

            Console.WriteLine("Waiting for Queue to Finish...");

            //Stop and wait for the queues to drains
            push.StopAllServices(true);

            Console.WriteLine("Queue Finished, press return to exit...");
            Console.ReadLine();
        }

        static void Events_OnDeviceSubscriptionIdChanged(Common.PlatformType platform, string oldDeviceInfo, string newDeviceInfo)
        {
            //Currently this event will only ever happen for Android GCM
            Console.WriteLine("Device Registration Changed:  Old-> " + oldDeviceInfo + "  New-> " + newDeviceInfo);
        }

        static void Events_OnNotificationSent(Common.Notification notification)
        {
            Console.WriteLine("Sent: " + notification.Platform.ToString() + " -> " + notification.ToString());
        }

        static void Events_OnNotificationSendFailure(Common.Notification notification, Exception notificationFailureException)
        {
            Console.WriteLine("Failure: " + notification.Platform.ToString() + " -> " + notificationFailureException.Message + " -> " + notification.ToString());
        }

        static void Events_OnChannelException(Exception exception)
        {
            Console.WriteLine("Channel Exception: " + exception.ToString());
        }

        static void Events_OnDeviceSubscriptionExpired(Common.PlatformType platform, string deviceInfo)
        {
            Console.WriteLine("Device Subscription Expired: " + platform.ToString() + " -> " + deviceInfo);
        }
    }
}

受信した deviceToken は、この Web サイト ( http://home.paulschou.net/tools/xlate/ ) を使用 して base64 から HEX にエンコードしました。

また、iOS デバイスで APS/PC Logging プロファイルを使用して、IPCU が提供するデバッグ コンソールからより多くの出力を取得しています。

4

6 に答える 6

3

apsプッシュ通知サービスに送信されるメッセージには、キーが含まれていてはなりません。メッセージには、キーPushMagicの値として文字列のみを含める必要があります。mdmたとえば、 として定義した値を使用するpushMagicStringと、プッシュ通知サービスへのメッセージは次のようになります。

{"mdm":"00454668-00B2-4122-A1DC-72ACD64E6AFB"}

あなたが使用している push-sharp ライブラリは使用していません。ただし、コードを簡単に調べたところ、AppleNotificationPayload.ToJsonメソッドは常にapsメッセージにキーを追加しているようです。114行目をコメントアウトしてから試してみることをお勧めします。ToJson行をコメントアウトしたメソッドを次に示します。

    public string ToJson()
    {
        JObject json = new JObject();

        JObject aps = new JObject();

        if (!this.Alert.IsEmpty)
        {
            if (!string.IsNullOrEmpty(this.Alert.Body)
                && string.IsNullOrEmpty(this.Alert.LocalizedKey)
                && string.IsNullOrEmpty(this.Alert.ActionLocalizedKey)
                && (this.Alert.LocalizedArgs == null || this.Alert.LocalizedArgs.Count <= 0)
                && !this.HideActionButton)
            {
                aps["alert"] = new JValue(this.Alert.Body);
            }
            else
            {
                JObject jsonAlert = new JObject();

                if (!string.IsNullOrEmpty(this.Alert.LocalizedKey))
                    jsonAlert["loc-key"] = new JValue(this.Alert.LocalizedKey);

                if (this.Alert.LocalizedArgs != null && this.Alert.LocalizedArgs.Count > 0)
                    jsonAlert["loc-args"] = new JArray(this.Alert.LocalizedArgs.ToArray());

                if (!string.IsNullOrEmpty(this.Alert.Body))
                    jsonAlert["body"] = new JValue(this.Alert.Body);

                if (this.HideActionButton)
                    jsonAlert["action-loc-key"] = new JValue((string)null);
                else if (!string.IsNullOrEmpty(this.Alert.ActionLocalizedKey))
                    jsonAlert["action-loc-key"] = new JValue(this.Alert.ActionLocalizedKey);

                aps["alert"] = jsonAlert;
            }
        }

        if (this.Badge.HasValue)
            aps["badge"] = new JValue(this.Badge.Value);

        if (!string.IsNullOrEmpty(this.Sound))
            aps["sound"] = new JValue(this.Sound);

        if (this.ContentAvailable.HasValue)
            aps["content-available"] = new JValue(this.ContentAvailable.Value);

        //json["aps"] = aps;

        foreach (string key in this.CustomItems.Keys)
        {
            if (this.CustomItems[key].Length == 1)
                json[key] = new JValue(this.CustomItems[key][0]);
            else if (this.CustomItems[key].Length > 1)
                json[key] = new JArray(this.CustomItems[key]);
        }

        string rawString = json.ToString(Newtonsoft.Json.Formatting.None, null);

        StringBuilder encodedString = new StringBuilder();
        foreach (char c in rawString)
        {
            if ((int)c < 32 || (int)c > 127)
                encodedString.Append("\\u" + String.Format("{0:x4}", Convert.ToUInt32(c)));
            else
                encodedString.Append(c);
        }
        return rawString;// encodedString.ToString();
    }
于 2012-08-02T15:37:42.190 に答える
2

MDM登録中に、配信するMDMペイロード(PayloadType = com.apple.mdm)に正しいトピックがあることを確認しましたか?

つまり、appleからダウンロードしたAPNプッシュ証明書には、CN=com.apple.mgmt.external。[GUID]のようなものが表示されます。これは、MDM登録中にIOSデバイスに配信される値と同じである必要があります。

メッセージのアップロード中にAPNがエラーを出さない場合、またはフィードバックサービスがデバイスが利用できないことを示すdeviceIDを返さない場合は、デバイスに正しく配信されることを意味します。次のフェーズは、IOSデバイスがこのトピックを介してAPNメッセージをリッスンするように設定されているかどうかを確認することです。

デバイスをXCodeまたはIPCUに接続してみることができます。コンソールログには、APNが合意されたトピックを使用してこのメ​​ッセージを正常に配信できたかどうかを示すログが含まれます。

APNのトラブルシューティングに関する記事もあり ますhttp://developer.apple.com/library/ios/#technotes/tn2265/_index.html

上記の記事にはダウンロード可能なプロファイルがあり、追加の詳細ログのためにデバイスにロードできます。

于 2012-08-22T17:28:01.450 に答える
0

Push Sharp を使用して iOS MDM プッシュ通知を送信できない

この答えはうまくいきます

var pushService = new PushService();
// attach event listeners

// override the production/development auto-detection as it doesn't
// work for MDM certificates
var cert = null; // load your push client certificate
var channel = new ApplePushChannelSettings(true, cert, true);
pushService.StartApplePushService(channel);

// create and send the notification
var notification = NotificationFactory
    .Apple()
    .ForDeviceToken("your-device-token-received-from-checkin")
    .WithExpiry(DateTime.UtcNow.AddDays(1))
    .WithCustomItem("mdm", "your-push-magic-received-in-checkin");
pushService.QueueNotification(notification);
于 2013-03-27T07:23:32.897 に答える
0

「aps」キーは ios によって無視されます。スクリーンショットのログを見ることができます。「aps」を無視し、clearpasscode コマンドを正常に実行します。

于 2012-09-06T04:00:49.807 に答える
0

私も同じプロセスとコマンドに従いました。「MessageType:TokenUpdate」から受け取ったdeviceTokenにコメントしたことが、コードで気づいたことの1つ

//String deviceToken = "27asObngxvVNb3RvRMs3XVaEWC1DNa3TjFE12stKsig=";

そして、プッシュ通知を送信するために、次の変数「test」をデバイス トークンとして使用しています。

String test = "3d 58 64 4d 90 d3 18 09 22 5c 50 d2 12 16 b5 67 71 1e be 5c 13 6e 41 3c 3e 81 b5 52 30 68 09 a5";
test = test.Replace(" ", string.Empty);

「MessageType:TokenUpdate」のデバイス トークンを使用すると、pushsharp でエラーが発生する

APNS NotificationFailureException -> 8 : 無効なトークン

編集:

byte[]16 進文字列に変換する必要があると考えました。同じために次の方法を使用します。

public static string ByteArrayToString(byte[] ba) 
{ 
    StringBuilder hex = new StringBuilder(ba.Length * 2); 
    foreach (byte b in ba) 
        hex.AppendFormat("{0:x2}", b); 

    return hex.ToString(); 
}
于 2014-09-24T09:04:33.013 に答える
0

Push-sharp ライブラリは、アプリケーション通知用に設計されているようです。MDM 通知で機能させるには、関数 AppleNotificationPayload.ToJson の 114 行目を次のように修正します。

if (aps.HasValues == true)
{
    json["aps"] = aps;
}

この修正により、「aps」キーがアプリケーション通知にのみ含まれるようになります。また、ライブラリは MDM 通知とアプリケーション通知の両方に使用できます。

于 2012-08-22T16:49:33.917 に答える