アプリにプッシュ通知を複数回送信しようとしましたが、役に立ちませんでした。私は多くのチュートリアルに従い、すべてのステップに従いました。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を使用してアプリを再開発し、追加のオーディエンスにリーチすることにしたので、今はこれを閉じます。皆さんの助けに感謝します。