ios推送状况百出,不同原理,浪费时间

来源:互联网 发布:淘宝帐号被冻结 编辑:程序博客网 时间:2024/04/30 03:20

话说这两天决定不用三方库来做推送。其实理论上还是挺简单的,实际操作却状况百出,浪费我两天时间,我只能给跪了。现在小小记录下。

这里有两个帖子,是我参照着做证书用的,个人感觉写的挺好,将贴在文章末端。

现在我先总结下,做关于推送的证书吧。

一、首先你得要一个苹果开发者证书,这个不用多说。它位置在开发者中心的Certificates栏目下,文件类型是iOS Development。这是开发应用的基础。其次在这里小小补充下,可以到本地的keychain access去找到这个开发者证书,右键导出为.p12文件,然后就可以把这个证书导入到别的电脑上使用了~么么哒

二、先设置AppID,然后应用的证书Certificates(包括开发版和发布版)与AppID中的详细情况的设置是可以并行的,只需要确保相应的证书和AppID的Bundle ID相同就是了。推荐使用com.companyName.productName的格式。

在这里注意一下,如果是要给App做推送功能的话,生成App ID后需要去设置下Push Notifications这个选项,它又有两个子选项,开发模式和发布模式。两者设置方式相同。现在讲其中一个就行了。在设置Push Notifications的时候,需要生成另一个证书,也就是CSR文件,具体生成方法跟着苹果官网的来就是了,超级简单,只是需要注意点,这个证书生成后注意保存,因为后期还会用。这是每一个应用的一套证书里的根基。现在po一张配置好了Push功能的开发模式,但是没有配置发布模式的样子:

在上载CSR文件后,会有一个新的证书生成,下载后双击安装就行了。这个下载的文件默认名字aps_development.cer,跟Certificates里面的证书其实是一样的。不用特意去保存,因为这个文件以后需要的话随时上网站下载就是了。

如果之前没有配置pushNotifications,直接去生成证书:在生成证书的时候,选择之前生成好的AppID,然后上载刚刚用到的CSR文件。然后网站生成新的开发(或发布)证书。如果AppID里之前设置过了APNs功能(远程通知),那么该开发证书格式为APNs Development iOS。下载后到keychain Access中将其导出为.p12文件就可以交给服务器端兄台来开发推送功能了。

三、生成Profile说明文件,Provisioning Profiles去新建,选择对应的App ID,选择开发者,选择可参与调试的设备,搞定。


然后呢然后呢,重点来了!!!

这些设置都没有问题,为毛我的demo总是各种报错?

我这里总结几点:

1.想要拿deviceToken,一定要真机,模拟机不能用于测试。

2.如果证书设置出现问题(主要是Bundle ID 不匹配),是拿不到devicetoken的。这时候就自己检查下是哪一步出了问题吧。或者毛了,就重做一遍所有证书呗,嘿嘿。

3.第一次开启测试模式的时候,一定一定一定要联网!我就是在这里吃了大亏了。整整浪费了两天啊!!!一切就绪,didRegisterForRemoteNotificationsWithDeviceToken   didFailToRegisterForRemoteNotificationsWithError却都不鸟我,根本不运行。一开始我还以为是自己的获取代码写出了问题,结果认真比对检查,甚至请朋友帮我检查我的代码,一点问题都没有。再去检查证书吧,还是一点问题都没有,甚至证书来回做了好多遍,Demo也开了好几个,都无效。还上网又找了好多个教程,跟我做的没区别呀!各种难受啊!要等着快点做完了好过年啊!最后的最后,我上网找到了问题所在:我每次安装这Demo的时候,设备都没联网!因为公司网络太烂,用的人又多,我就没给设备联网,结果耗费我好多时间精力,差点想砸电脑了!

事实的真相是:

 在第一次调用registerForRemoteNotificationTypes方法时没有联网,则既不会调用didRegisterForRemoteNotificationsWithDeviceToken,也不会调用didFailToRegisterForRemoteNotificationsWithError
*在第一次调用registerForRemoteNotificationTypes注册成功后,之后即使没有联网,再调用registerForRemoteNotificationTypes时都会以最上一次的device token作为参数回调didRegisterForRemoteNotificationsWithDeviceToken方法。

第一次打开程序没有网络连接,这两个代理方法肯定不会执行

新建工程,测试,搞定。

呵呵呵...


顺便贴下我的代码吧:


#define IOS8_OR_LATER [UIDevice currentDevice].systemVersion.floatValue>= 8.0

在didFinishLaunchingWithOptions里面写
    [self registerRemoteNotifications];
    然后呢:

#pragma mark - Register Remote Notifications-(void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken{    NSString *strDeviceToken = [[deviceToken description]stringByTrimmingCharactersInSet:[NSCharacterSet characterSetWithCharactersInString:@"<>"]];        NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];    [userDefaults removeObjectForKey:@"deviceToken"];    [userDefaults setObject:strDeviceToken forKey:@"deviceToken"];        NSLog(@"My token is: %@", [userDefaults objectForKey:@"deviceToken"]);} -(void)application:(UIApplication *)application didFailToRegisterForRemoteNotificationsWithError:(NSError *)error{    NSLog(@"error = %@",error);}-(void)application:(UIApplication *)application didRegisterUserNotificationSettings:(UIUserNotificationSettings *)notificationSettings{    NSLog(@"到此一游");    [[UIApplication sharedApplication]registerForRemoteNotifications];}-(void)registerRemoteNotifications{    if (![[UIApplication sharedApplication]isRegisteredForRemoteNotifications]) {                NSLog(@"还没有注册哦");        if(IOS8_OR_LATER)        {            UIUserNotificationSettings *settings = [UIUserNotificationSettings settingsForTypes:UIUserNotificationTypeBadge|UIUserNotificationTypeSound|UIUserNotificationTypeAlert categories:nil];            [[UIApplication sharedApplication] registerUserNotificationSettings:settings];        }        else        {            [[UIApplication sharedApplication]  registerForRemoteNotificationTypes:UIRemoteNotificationTypeBadge|UIRemoteNotificationTypeAlert|UIRemoteNotificationTypeSound];        }    }else{        NSLog(@"已经注册了哦");    }}

然后呢,再贴几个我参考过的链接哇:

http://blog.csdn.net/ios_che/article/details/7428413

http://www.cnblogs.com/kenshincui/p/4168532.html#pushNotification

https://blog.serverdensity.com/how-to-renew-your-apple-push-notification-push-ssl-certificate/

http://www.dozer.cc/2013/06/ios-certificates-and-push-notifications-certificates/

http://www.51testing.com/html/46/249846-857789.html

0 0
原创粉丝点击