4

アプリにプッシュ通知を複数回送信しようとしましたが、役に立ちませんでした。私は多くのチュートリアルに従い、すべてのステップに従いました。APNSサーバーから正常なメッセージを受信して​​いますが、デバイスにメッセージが届きません。正常に到着した開発証明書を使用して送信をテストし、適切な本番証明書を生成して、phpスクリプトで使用しています。以下にコードを投稿します。私が間違っていることを見つけたら教えてください。何なのかわからない…

どんな助けでも大歓迎です。

<?php
$link=mysqli_connect('****','****','****','***');
if(mysqli_connect_errno())
{
    header('HTTP/1.1 400');
    header('Content-type: text/html');
    echo 'Connection Error: %s\n',mysqli_connect_error();
    exit;
}
echo "Connected to Database<br />";
echo "Querying Database<br />";
switch ($_REQUEST['App'])
{
    case "O2":
        $query="SELECT Token FROM O2CalculatorPushTokens";
        break;
    case "LZA":
        $query="SELECT Token FROM LZAPushTokens";
        break;
    case "MorseCode":
        $query="SELECT Token FROM MorseCodePushTokens";
        break;
    default:
        echo "Unknown App.";    
        exit;
}
$result=mysqli_query($link,$query);
echo mysqli_num_rows($result)."<br />";
if ($result==false)
{
    echo "No tokens to send to.";
}
else
{
    //Set SSL context
    $ctx = stream_context_create();
    echo "Loading SSL Certificate...<br>";
    switch($_REQUEST['App'])
    {
        case "O2":
            stream_context_set_option($ctx, 'ssl', 'local_cert', 'SSL/O2CalculatorProductionSSL.pem');
            break;
        case "LZA":
            stream_context_set_option($ctx, 'ssl', 'local_cert', 'SSL/LandingZoneAssistantProductionSSL.pem');
            break;
        case "MorseCode":
            stream_context_set_option($ctx, 'ssl', 'local_cert', 'SSL/MorseCodeProductionSSL.pem');
            break;
        default:
            exit;
    }   
    echo "Unlocking SSL Certificate...<br><br>";
    stream_context_set_option($ctx, 'ssl', 'passphrase', '****');

    //Open a connection to the APNS server
    echo "Connecting to APNS server...<br>";
    $fp = stream_socket_client('ssl://gateway.push.apple.com:2195', $err, $errstr, 60, STREAM_CLIENT_CONNECT|STREAM_CLIENT_PERSISTENT, $ctx);
    if(!$fp) exit("Failed to connect: $err $errstr<br><br>");
    else echo "Connected to APNS!<br />";

    //Create the payload body
    echo "Creating message...<br>";
    $body['aps'] = array('alert' => $_REQUEST['PushMessageTextArea']);
    echo $body."<br>";

    //Encode the payload as JSON
    echo "Encoding message...<br>";
    $payload = json_encode($body);
    echo $payload."<br>";

    while($row=mysqli_fetch_assoc($result))
    {
        //Build the binary notification
        echo "Sending message to ".$row['Token']."<br>";
        $msg = chr(0).pack('n',32).pack('H*',$row['Token']).pack('n',strlen($payload)).$payload;
        //Send it to the server
        $PushResult = fwrite($fp, $msg, strlen($msg));
        if (!$PushResult) echo "Message not delivered! <br />";
        else echo "Message successfully delivered! <br />";
    };

    //Close connection to the server
    echo "Closing APNS connection...<br><br>";
    fclose($fp);
    mysqli_free_result($result);
}
mysqli_close($link);

そして私のiPhoneスクリプト...

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

//Register for push notifications
[[UIApplication sharedApplication] registerForRemoteNotificationTypes:(UIRemoteNotificationTypeAlert)];
return YES;
}
- (void)application:(UIApplication*)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData*)deviceToken
{
if (![[NSUserDefaults standardUserDefaults] boolForKey:@"registeredForPush"])
{
    //Remove spaces and brackets from deviceToken
    NSString* token  = [deviceToken description];
    token = [token stringByTrimmingCharactersInSet:[NSCharacterSet characterSetWithCharactersInString:@"<>"]];
    token = [token stringByReplacingOccurrencesOfString:@" " withString:@""];

    NSMutableString *params = [[NSMutableString alloc] initWithFormat:@"Token="];
    [params appendString:token];
    NSMutableURLRequest *request = [[NSMutableURLRequest alloc] initWithURL:[NSURL URLWithString:@"http://www.bluelineapps.net/****.php"] cachePolicy:NSURLRequestReloadIgnoringCacheData timeoutInterval:100.0];
    [request setHTTPMethod:@"POST"];
    [request setHTTPBody:[params dataUsingEncoding:NSUTF8StringEncoding]];
    NSURLConnection *connection = [[NSURLConnection alloc] initWithRequest:request delegate:self];
    if (connection)
    {
    //Show alert
    UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Thank you!" message:@"Thank you for registering for updates. Please rate this app in the AppStore after you've had some time to use it. Feedback is welcome and can be sent using the 'Feedback' tab below. Enjoy!" delegate:self cancelButtonTitle:@"Ok" otherButtonTitles:nil, nil];
    [alert dismissWithClickedButtonIndex:0 animated:TRUE];
    [alert show];
    }
    else
    {
        //Show Error
        UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Registration error!" message:@"Failed to register for updates. Please try again later in your 'Settings' app. Sorry for the inconvenience." delegate:self cancelButtonTitle:@"Ok" otherButtonTitles:nil, nil];
        [alert dismissWithClickedButtonIndex:0 animated:TRUE];
        [alert show];
    }
    [[NSUserDefaults standardUserDefaults] setBool:TRUE forKey:@"registeredForPush"];
    [[NSUserDefaults standardUserDefaults] synchronize];
}
}

- (void)application:(UIApplication*)application didFailToRegisterForRemoteNotificationsWithError:(NSError*)error
{
NSLog(@"Failed to get token, error: %@", error);
}

- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo
{
UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Landing Zone Assistant" message:[userInfo valueForKeyPath:@"alert"] delegate:self cancelButtonTitle:@"Ok" otherButtonTitles:nil, nil];
[alert show];
}

@end

アップデート:

さて、すべてのモバイルプロビジョニングプロファイル、すべての証明書、すべての.pemファイル、すべてを削除し、開発と本番の両方のすべての証明書、キー、アクセス許可、およびプロファイルを再生成した後も、私の問題はまだ残っています...

サンドボックスゲートウェイを使用してデバイスのバージョンをデバッグするためのメッセージを送信しました。成功しました。メインのアップルゲートウェイを使用して、テストデバイスのアドホックバージョンのリリースバージョンにメッセージを送信しましたが、失敗しました。

何か案は?

APNSサービスからエラーメッセージは表示されませんが、すべて成功しています。ビルドエラーはありません。真新しい最新の証明書...


アップデート:

私はここでアップルテクニカルサポートからこの記事を見つけ、すべての手順を実行し、すべてをチェックしました。私が知る限り、すべてがチェックアウトされています。私の本番ビルドには、必要に応じて本番のaps_environmentが含まれています。

また、.pemファイルを生成するためのこの方法を見つけましたが、これは以前の試みとは少し異なっていたので、これを試しましたが、それでも機能しません。私のコードは、問題が他の場所にあるように見えるので、上記と同じですが、スキャン中に誰かが何かを見た場合は、私に知らせてください。これを機能させたいだけです。

私はこの質問に喜んで報奨金を出しますが、私はそれについて十分な評判がどこにもありません、そして私は彼らの質問で他の人を助けることによっていくつかを得ようとしています。


アップデート:

検索中に、「本番環境のデバイストークンと開発(サンドボックス)環境のデバイストークンは同じ値ではないことに注意してください」という行が含まれているAppleの別のドキュメントを見つけました。だから私は別の質問があると思います。

deviceTokenは、開発モードと本番モードで異なりますか?


アップデート:

私はこれが長くなっていることを知っていますが、私はこの問題を自己解決するために私が取ったステップを示しようとしています。

このEntrustCA証明書がドキュメントに表示され続けます。これを使用してAPNSゲートウェイとの接続を確認しましたが、プッシュメッセージの送信中に接続で使用していません。これは、これまでに見た例のいずれも使用を示していないためです。これは必須ですか?必要な場合、どのように使用しますか?


アップデート:

PhoneGapを使用してアプリを再開発し、追加のオーディエンスにリーチすることにしたので、今はこれを閉じます。皆さんの助けに感謝します。

4

1 に答える 1

-1

コードを見る前に、本番プロビジョニング プロファイルを開き、次のエントリがあることを再確認してください。

    <key>ProvisionsAllDevices</key><true/>

デバイスは開発プロファイルに登録されていると推測しているため、そこでは機能するが製品では機能しないという事実から、問題はプロファイル自体にあると思われます。任意のデバイスをプロビジョニングできるプロビジョニング プロファイルを作成するには、Apple の Enterprise Developer アカウントが必要です。

于 2012-12-15T06:23:40.580 に答える