• 【转】iOS消息推送实现过程记录


    客户端代码:链接地址

    服务器代码:链接地址  链接地址

    这里记录下iOS消息推送实现的全过程

    首先,申请秘钥。

    之后进入链接地址开发者,当然你得有啊!!!!!

    点击这里

    如图:

    下面实现创建推送证书(和开发证书不一样)

    接上图:

    下图:

    第一步完:

    为证书添加推送功能:

    点击之后的效果:

    点击之后

    到现在我们已经有俩个证书了,aps_development.cer 和CertificateSigningRequest.certSigningRequest。

    下面的步骤比较关键。我们需要把机器中的之前的证书清理干净,如果不清理干净的画会出现如下错误:

    Error Domain=NSCocoaErrorDomain Code=3000 "未找到应用程序的“aps-environment”的权利字符串" UserInfo=0x17007d6c0 {NSLocalizedDescription=未找到应用程序的“aps-environment”的权利字符串}

    这个错误大概的意思就是证书不匹配的意思。

    清理之后,我们点击

    将推送证书添加进去。

    Capabilities中打开Push Notifications 开关
    在XCode7中这里的开关不打开,推送也是可以正常使用的,但是在XCode8中,这里的开关必须要打开,不然会报错:

    Error Domain=NSCocoaErrorDomain Code=3000 "未找到应用程序的“aps-environment”的授权字符串" UserInfo={NSLocalizedDescription=未找到应用程序的“aps-environment”的授权字符串}

    之后我们导出一个可以供服务器端使用的。

    以下代码来着网上的活雷锋贡献。

    下面附上客户端代码:  

    - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
    {
        // Override point for customization after application launch.
        
        
        NSString* str = [UIDevice currentDevice];
        
        if ([launchOptions objectForKey:UIApplicationLaunchOptionsRemoteNotificationKey] != nil) {
            //获取应用程序消息通知标记数(即小红圈中的数字)
            int badge = [UIApplication sharedApplication].applicationIconBadgeNumber;
            if (badge>0) {
                //如果应用程序消息通知标记数(即小红圈中的数字)大于0,清除标记。
                badge--;
                //清除标记。清除小红圈中数字,小红圈中数字为0,小红圈才会消除。
                [UIApplication sharedApplication].applicationIconBadgeNumber = badge;
            }
        }
        //消息推送注册
        [[UIApplication sharedApplication] registerForRemoteNotificationTypes:UIRemoteNotificationTypeSound|UIRemoteNotificationTypeAlert|UIRemoteNotificationTypeBadge];
        
            return YES;
    }
    
    -(void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken
    {
        NSString* token = [NSString stringWithFormat:@"%@",deviceToken];
        NSLog(@"%@",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);
    }

    下面附上服务器端代码:

    import org.apache.log4j.Logger;
    import org.apache.log4j.PropertyConfigurator;
    
    import javapns.*;
    import javapns.back.PushNotificationManager;
    import javapns.back.SSLConnectionHelper;
    import javapns.data.Device;
    import javapns.data.PayLoad;
    
    public class PushDemo {
    
        public static void main(String[] args) throws Exception {
    
             try
                {
                    //从客户端获取的deviceToken,在此为了测试简单,写固定的一个测试设备标识。
                   String deviceToken = "9f8e0099 1e72c4ab ca835ec3 994e93d9 a09ce215 62d91bb3 6e929a33 02c29456";
                   
                    System.out.println("Push Start deviceToken:" + deviceToken);
                    //定义消息模式
                    PayLoad payLoad = new PayLoad();
                    payLoad.addAlert("this is test!");
                    payLoad.addBadge(1);//消息推送标记数,小红圈中显示的数字。
                    payLoad.addSound("default");
                    //注册deviceToken
                    PushNotificationManager pushManager = PushNotificationManager.getInstance();
                    pushManager.addDevice("iPhone", deviceToken);
                    //连接APNS
                    String host = "gateway.sandbox.push.apple.com";
                    //String host = "gateway.push.apple.com";
                    int port = 2195;
                    String certificatePath = "/Users/tokou/Desktop/PushDemo.p12";//前面生成的用于JAVA后台连接APNS服务的*.p12文件位置
                    String certificatePassword = "123";//p12文件密码。
                    pushManager.initializeConnection(host, port, certificatePath, certificatePassword, SSLConnectionHelper.KEYSTORE_TYPE_PKCS12);
                    //发送推送
                    Device client = pushManager.getDevice("iPhone");
                    System.out.println("推送消息: " + client.getToken()+"
    "+payLoad.toString() +" ");
                    pushManager.sendNotification(client, payLoad);
                    //停止连接APNS
                    pushManager.stopConnection();
                    //删除deviceToken
                    pushManager.removeDevice("iPhone");
                    System.out.println("Push End");
                }
                catch (Exception ex)
                {
                    ex.printStackTrace();
                }
    
        }
    }

    原文地址:http://www.aiuxian.com/article/p-1327006.html

     
  • 相关阅读:
    好用的视频播放器
    如何屏蔽weGame今日推荐窗口
    存一个大佬的地图编辑器
    过渡页面,加载进度
    Lua中正弦,余弦函数的使用
    如何替换loadingBar的底图
    使用精灵帧缓存替换纹理
    setTexture和loadTexture之间的区别
    我胡汉三又回来了
    python中单斜杆和双斜杠的区别
  • 原文地址:https://www.cnblogs.com/cslunatic/p/6412287.html
Copyright © 2020-2023  润新知