發(fā)布新版本時需要注意的問題:
1.XCODE工程修改版本號。
2.打包后领跛,替換服務(wù)器中IPA文件肺魁。
3.修改ios_update.php文件,里面的版本號隔节,更新內(nèi)容鹅经。
4.修改push.php中推送的內(nèi)容寂呛。
推送需要準(zhǔn)備的東西:
開發(fā)P12 、 開發(fā)推送證書
推送P12 瘾晃、發(fā)布推送證書
開發(fā)推送證書的命令
需要的兩個文件aps_development.cer贷痪、Push.p12
1.openssl x509 -in aps_development.cer -inform der -out PushChatCert.pem
2.openssl pkcs12 -nocerts -out PushChatKey.pem -in Push.p12
3.cat PushChatCert.pem PushChatKey.pem > ck.pem
4、telnet gateway.sandbox.push.apple.com 2195
5. openssl s_client -connect gateway.sandbox.push.apple.com:2195 -cert PushChatCert.pem -key PushChatKey.pem
發(fā)布推送證書的命令
需要的兩個文件 aps_production.cer 蹦误、Push.p12(和開發(fā)的不同)
openssl x509 -in aps_production.cer -inform der -out PushChatCert.pem
openssl pkcs12 -nocerts -out PushChatKey.pem -in Push.p12
cat PushChatCert.pem PushChatKey.pem > ck.pem
telnet gateway.push.apple.com 2195
openssl s_client -connect gateway.push.apple.com:2195 -cert PushChatCert.pem -key PushChatKey.pem
推送IOS端代碼
#pragma mark - 推送設(shè)置 // Register for Push Notitications, if running iOS 8
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
if ([application respondsToSelector:@selector(registerUserNotificationSettings:)]) {
UIUserNotificationType userNotificationTypes = (UIUserNotificationTypeAlert | UIUserNotificationTypeBadge | UIUserNotificationTypeSound);
UIUserNotificationSettings *settings = [UIUserNotificationSettings settingsForTypes:userNotificationTypes categories:nil];
[[UIApplication sharedApplication] registerUserNotificationSettings:settings];
[application registerForRemoteNotifications];
} else {
// Register for Push Notifications before iOS 8
[application registerForRemoteNotificationTypes:(UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeAlert | UIRemoteNotificationTypeSound)];
}
}
-(void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken{
NSString* newToken = [[[NSString stringWithFormat:@"%@",deviceToken]
stringByTrimmingCharactersInSet:[NSCharacterSet characterSetWithCharactersInString:@"<>"]] stringByReplacingOccurrencesOfString:@" " withString:@""];
NSLog(@"nsdata:%@\n 字符串token: %@",deviceToken, newToken);// 獲取device token
// 上傳devicetoken
[_netUtils requestContentWithUrl:DEVICE_TOKEN para:@{@"appleID": newToken} withSuccessBlock:^(id returnData) {
NSLog(@"%@",returnData);
} withFailureBlock:^(NSError *error) {
NSLog(@"%@",error);
}];
}
-(void)application:(UIApplication *)application didFailToRegisterForRemoteNotificationsWithError:(NSError *)error{
NSLog(@"RegistFail%@",error);
}
-(void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo{
// 處理推送消息
NSLog(@"收到推送消息:%@",[[userInfo objectForKey:@"aps"] objectForKey:@"alert"]);
if (application.applicationIconBadgeNumber > 0) {
application.applicationIconBadgeNumber = 0;
}
}
IOS端檢查更新代碼
-(void)getUpdate:(updateBlock)completonBlock // 檢查更新
{
__unsafe_unretained NetUtils *netUtil = self;// 防止循環(huán)應(yīng)用
[netUtil GetContentWithUrl:UPDATE_URL withSuccessBlock:^(id returnData) {
if ([returnData[@"verCode"] isEqualToString:kVersion_Coding]) {
// 不用更新
}
else{
// 提示更新
UIAlertView *testView = [[UIAlertView alloc] bk_initWithTitle:@"有新版本" message:returnData[@"content"]];
[testView bk_addButtonWithTitle:@"取消" handler:^{
}];
[testView bk_addButtonWithTitle:@"更新" handler:^{
[[UIApplication sharedApplication] openURL:[NSURL URLWithString:IPAURL]];
}];
[testView show];
}
} withFailureBlock:^(NSError *error) {
//NSLog(@"%@",error);
}];
}
服務(wù)器端代碼:
db.php
<?php
class DB{
public $link;
public $error_state;
function __construct(){
$dbname = 'rUCqINjvmzQMBxMhDzeb';
$host = 'sqld.duapp.com';
$port = 4050;
$user = 'vcoDM9nG8wswSdMTHj7YYsvV';//用戶名(api key)
$pwd = 'OrpEsFYYu8nTC3VONGTjQGUjEu3y0EQU';//密碼(secret key)
$this->link = @mysql_connect("{$host}:{$port}",$user,$pwd,true);
if(!$this->link) {
die("Connect Server Failed: " . mysql_error());
}
/*連接成功后立即調(diào)用mysql_select_db()選中需要連接的數(shù)據(jù)庫*/
if(!mysql_select_db($dbname,$this->link)) {
die("Select Database Failed: " . mysql_error($this->link));
}
mysql_query("SET NAMES 'UTF8'");
}
public function db_insert($sql)
{
$ret = mysql_query($sql,$this->link);
if(!$ret){
$this->error_state = 1;
}
return $ret;
}
public function db_select($sql)
{
return db_insert($sql);
}
public function db_delete($sql)
{
return db_insert($sql);
}
//查詢后返回數(shù)組
public function db_array($sql)
{
$arr = mysql_query($sql,$this->link);
$result = array();
while ($arrTemp = @mysql_fetch_assoc($arr)) {
$result[] = $arrTemp ;
}
return $result;
}
// 關(guān)閉連接數(shù)據(jù)庫
public function closeDB()
{
mysql_close($this->link);
}
//事物處理
//開始事物
public function db_start_substance()
{
mysql_query("BEGIN" ,$this->link);
$this->error_state = 0;
}
//提交事物/回滾事物
public function db_commit_substance()
{
if($this->error_state == 1){
mysql_query("ROLLBACK",$this->link);
}else{
mysql_query("COMMIT",$this->link);
}
return $this->error_state;
}
}
?>
存儲IOS設(shè)備的device token
<?php
// 查重
require_once "db.php";
$appleID = $_REQUEST['appleID'];
if($appleID==""){
exit("kongkong");
}
$db_obj = new DB();
$sqlApple = "select * from appleDevice where appleID = '$appleID'";
$sqlResult = $db_obj->db_array($sqlApple);
if($sqlResult){
exit("exit");
}else{
$sql = "insert into appleDevice (appleID) values ('$appleID') ";
$result = $db_obj->db_insert($sql);
if($result){
$arr = array('result' => 'success' );
echo json_encode($arr);
}else{
$arr = array('result' => 'fail' );
echo json_encode($arr);
}
}
?>
檢查更新代碼
<?php
// http://weixin.jsptz.com/map/app/ipa/location.ipa
// ipa下載地址
$arr = array('verName'=>'app','verCode'=>'1.0.10','content'=>'活動詳情展示劫拢。');
echo json_encode($arr);
?>
發(fā)布推送的代碼
<?php
// 發(fā)布地址:gateway.push.apple.com:2195
// 測試通過
require_once "db.php";
$db_obj = new DB();
$sql = "select appleID from appleDevice ";
$result = $db_obj->db_array($sql);
$countArray = count($result);
$passphrase = 'zhaojian';
$message = '生產(chǎn)-推送-測試!';
$ctx = stream_context_create();
stream_context_set_option($ctx, 'ssl', 'local_cert', 'ck.pem');
stream_context_set_option($ctx, 'ssl', 'passphrase', $passphrase);
$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" . PHP_EOL);
echo 'Connected to APNS' . PHP_EOL;
$body['aps'] = array(
'alert' => $message,
'sound' => 'default'
);
$payload = json_encode($body);
for($i = 0; $i < $countArray; $i++)
{
$deviceToken = $result[$i]['appleID'];
$msg = chr(0) . pack('n', 32) . pack('H*', $deviceToken) . pack('n', strlen($payload)) . $payload;
$result1 = fwrite($fp, $msg, strlen($msg));
if (!$result1){
echo $deviceToken . 'Message not delivered' . PHP_EOL;
}
else
{
echo $deviceToken . 'Message successfully delivered' . PHP_EOL;
}
}
fclose($fp);
?>
服務(wù)端下載地址代碼down.html
<script type="text/javascript">
/*
* 智能機(jī)瀏覽器版本信息:
*
*/
var browser = {
versions: function() {
var u = navigator.userAgent, app = navigator.appVersion;
return {//移動終端瀏覽器版本信息
trident: u.indexOf('Trident') > -1, //IE內(nèi)核
presto: u.indexOf('Presto') > -1, //opera內(nèi)核
webKit: u.indexOf('AppleWebKit') > -1, //蘋果强胰、谷歌內(nèi)核
gecko: u.indexOf('Gecko') > -1 && u.indexOf('KHTML') == -1, //火狐內(nèi)核
mobile: !!u.match(/AppleWebKit.*Mobile.*/) || !!u.match(/AppleWebKit/), //是否為移動終端
ios: !!u.match(/\(i[^;]+;( U;)? CPU.+Mac OS X/), //ios終端
android: u.indexOf('Android') > -1 || u.indexOf('Linux') > -1, //android終端或者uc瀏覽器
iPhone: u.indexOf('iPhone') > -1 || u.indexOf('Mac') > -1, //是否為iPhone或者QQHD瀏覽器
iPad: u.indexOf('iPad') > -1, //是否iPad
webApp: u.indexOf('Safari') == -1 //是否web應(yīng)該程序舱沧,沒有頭部與底部
};
}(),
language: (navigator.browserLanguage || navigator.language).toLowerCase()
}
if (browser.versions.ios || browser.versions.iPhone || browser.versions.iPad) {
//window.location='itms-services://?action=download-manifest&url=http://zhangshangxindai.duapp.com/app/ipa/Loan.php';
window.location="itms-services://?action=download-manifest&url=https://zhangshangxindai.duapp.com/Travel/ios_app/Travel.plist";
}
else if (browser.versions.android) {
window.location="http://zhangshangxindai.duapp.com/app/apk/zhangshangxindai.apk";
}
</script>
down.html指向plist的地址,plist指向ipa的地址偶洋。
plist需要放在支持https的服務(wù)器上熟吏,down.html、ipa可以放在http/https上
參考:
http://blog.csdn.net/IOS_CaoMuJieBing/article/details/18043557
http://blog.csdn.net/showhilllee/article/details/8631734