2016-07-08 27 views
0

プッシュ通知の場合、私はC#サービスを使用しています。iOSプッシュ通知が機能しない

通知はサーバー側で送信されますが、プッシュ通知はデバイスに送信されません。

下記のサーバーサイドコードとiosコードを追加してください。

ありがとうございます。

IOSコード:

if ([UIApplication instancesRespondToSelector:@selector(registerUserNotificationSettings:)]){ 
     [application registerUserNotificationSettings:[UIUserNotificationSettings settingsForTypes:UIUserNotificationTypeAlert|UIUserNotificationTypeBadge|UIUserNotificationTypeSound categories:nil]]; 

    } 
-(void)registerRemoteNotifications:(UIApplication *)application { 
    if ([application respondsToSelector:@selector(registerUserNotificationSettings:)]) 
    { 
     UIUserNotificationType userNotificationTypes = (UIUserNotificationTypeAlert | UIUserNotificationTypeBadge | UIUserNotificationTypeSound); 
     UIUserNotificationSettings *settings = [UIUserNotificationSettings settingsForTypes:userNotificationTypes categories:nil]; 
     [application registerUserNotificationSettings:settings]; 
     [application registerForRemoteNotifications]; 
    } 
} 
(void)application:(UIApplication*)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData*)deviceToken { 
    NSString *devToken = [[[[deviceToken description] 
          stringByReplacingOccurrencesOfString:@"<"withString:@""] 
          stringByReplacingOccurrencesOfString:@">" withString:@""] 
          stringByReplacingOccurrencesOfString: @" " withString: @""]; 

    [[NSUserDefaults standardUserDefaults] setObject:devToken forKey:kRIDeviceToken]; 
    [[NSUserDefaults standardUserDefaults] synchronize]; 
} 
(void)application:(UIApplication*)application didFailToRegisterForRemoteNotificationsWithError:(NSError*)error 
{ 
    [[NSUserDefaults standardUserDefaults] setObject:@"" forKey:kRIDeviceToken]; 
    [[NSUserDefaults standardUserDefaults] synchronize]; 
} 

サーバー側のコード(C#の):

int port = 2195; 
       String hostname = "gateway.push.apple.com"; 
       String certificatePath = System.Web.Hosting.HostingEnvironment.MapPath("~/ios/pushNotificationCert.p12"); 
       X509Certificate2 clientCertificate = new X509Certificate2(System.IO.File.ReadAllBytes(certificatePath), "xxxxxxx"); 
       X509Certificate2Collection certificatesCollection = new X509Certificate2Collection(clientCertificate); 

       TcpClient client = new TcpClient(hostname, port); 
       SslStream sslStream = new SslStream(client.GetStream(), false, new RemoteCertificateValidationCallback(ValidateServerCertificate), null); 

       try 
       { 
        sslStream.AuthenticateAsClient(hostname, certificatesCollection, SslProtocols.Tls, false); 
        MemoryStream memoryStream = new MemoryStream(); 
        BinaryWriter writer = new BinaryWriter(memoryStream); 
        writer.Write((byte)0); 
        writer.Write((byte)0); 
        writer.Write((byte)32); 

        writer.Write(HexStringToByteArray(notificationId.ToUpper())); 
        String payload = "{\"aps\":{\"alert\":\"" + "Hi,This Is a Sample Push Notification For IPhone.." + "\",\"badge\":1,\"sound\":\"default\"}}"; 
        writer.Write((byte)0); 
        writer.Write((byte)payload.Length); 
        byte[] b1 = System.Text.Encoding.UTF8.GetBytes(payload); 
        writer.Write(b1); 
        writer.Flush(); 
        byte[] array = memoryStream.ToArray(); 
        sslStream.Write(array); 
        sslStream.Flush(); 
        client.Close(); 
       } 
       catch (System.Security.Authentication.AuthenticationException ex) 
       { 
        client.Close(); 
       } 

答えて

0

あなたはアップルの本番サーバーへのあなたのプッシュを送っています。生産と開発の2つのサーバー(サンドボックスとも呼ばれます)があります。 しかし、ほとんどの場合開発モードでアプリを実行しており、開発アプリとプロダクションサーバーは互換性がありません。サンドボックスサーバーを使用するように変更します。

関連する問題