博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

APNS服务使用备忘

Posted on 2013-06-07 00:30  三块石头  阅读(2479)  评论(0)    收藏  举报

最近想使用下APNS(Apple Push Notification Service),期间遇到了不少问题,其中不乏经典的"Code=3000 "未找到应用程序的“aps-environment”的权利字符串""错误。其实解决这类型问题很简单,只要严格按照操作步骤来,就可以解决。由于网上提供的资料较多,我只说下主要步骤,这些步骤有先后顺序,请务必遵守。

  1. 设备注册,即输入设备UUID,将设备注册到苹果服务器上
  2. 创建App Id,类似于com.example.flyingzl这样的标识
  3. 创建APNS推送证书,主要用于推送服务,最终可以下载证书
  4. 创建IOS Development 开发证书,主要用于证书签名,最终可以下载证书
  5. 创建Profile文件,选择要支持的设备,最终可以下载到profile文件。

 

第5步一定要是最后的,否则会出现"Code=3000"错误。经过步骤,你应该得到2个证书文件以及1个profile文件,将2个证书文件导入,在"Organizer"中选择mac上连接的设备,然后把profile添加进去即可。

接下来就是在AppDelegate文件中增加如下代码了:

 

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    // Override point for customization after application launch.
    [[UIApplication sharedApplication] registerForRemoteNotificationTypes:
     UIRemoteNotificationTypeSound|UIRemoteNotificationTypeAlert|UIRemoteNotificationTypeBadge];
    return YES;
}


#pragma mark Push Notification
- (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken {
    NSString *token = [NSString stringWithFormat:@"%@", deviceToken];
    //获取终端设备标识,这个标识需要通过接口发送到服务器端,服务器端推送消息到APNS时需要知道终端的标识,APNS通过注册的终端标识找到终端设备。
    NSLog(@"My token is:%@", token);
    
}
- (void)application:(UIApplication *)application didFailToRegisterForRemoteNotificationsWithError:(NSError *)error {
    NSString *error_str = [NSString stringWithFormat: @"%@", error];
    NSLog(@"Failed to get token, error:%@", error_str);
}

- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo
{
    //在此处理接收到的消息。
    NSLog(@"Receive remote notification : %@",userInfo);
}

didFinishedLaunchingWithOptions这个方法已经自动生成了,只需要把里面的代码加进去即可。

接下来的三个方法分别是:如果注册成功则获取device token,注册失败打印错误消息,获取收到的消息。注意记录下获得到的deviceToken,我们通过java往苹果服务器发送消息时会用到。如果一切都OK,启动成功后你可以看到如下消息:

2013-06-07 00:19:19.616 maf[1069:707] My token is:<13b11050 a3fc064b 3692e25c 0fbd3b77 4b39ecb0 c55a51ff 4fb1373e 004577a0>
2013-06-07 00:19:20.343 maf[1069:707] Receive remote notification : {
    aps =     {
        alert = "\U4f60\U597d\U4e48";
        badge = 2;
    };
}

 

接下来是通过java往苹果服务器发送信息,我们选择javapns,测试代码如下所示:

package com.neusoft.maf;

import javapns.Push;
import javapns.communication.exceptions.CommunicationException;
import javapns.communication.exceptions.KeystoreException;
import javapns.notification.PushedNotification;
import javapns.notification.PushedNotifications;

public class APNDemo {
    
    private final static String DEVICE_TOKEN ="13b11050a3fc064b3692e25c0fbd3b774b39ecb0c55a51ff4fb1373e004577a0";

    /**
     * @param args
     */
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        
        try {
            
             PushedNotifications pns = Push.combined("你好么", 1,null, "apns.p12", "password", false, DEVICE_TOKEN);
//            PushedNotifications pns = Push.alert("hi", "apns.p12", "password", false, DEVICE_TOKEN);
             for(PushedNotification pn: pns){
                 
                 System.out.println(pn.toString());
                 System.out.println("是否成功: " + pn.isSuccessful());
             }

        } catch (CommunicationException e) {
            e.printStackTrace();
        } catch (KeystoreException e) {
            e.printStackTrace();
        }
    }

}

注意下代码中的DEVICE_TOKEN,就是我们在iOS程序中获得到的。代码中也用了一个"apns.p12"文件,这个文件是我们手动生成的,可以到mac的证书管理中找到类似"Apple Development IOS Push Services:com.example.flyingzl"类似的证书,然后点右键→导出,输入密码就OK,这个密码就是我们在java程序中用到的密码。一切OK后,我们就可以在iOS设备上看到效果了。比如上面的代码,会在应用上设置一个为1的Bage,然后还有提示信息,截图如下所示:

 

提示:如果你没有接受到推送消息,建议检查下网络。有些公司对网络端口进行了封锁,请确保如下端口已经开启:

gateway.push.apple.com(production server) 上的TCP 2195、2196、5223端口

gateway.sandbox.push.apple.com(development server) 上的TCP 2195、2196、5223端口

更详细的请参考苹果官方端口帮助:http://support.apple.com/kb/ts1629