刚开始作推送的时候原本觉得APNs证书就是主证书里加了个容许推送而已,事实证实我仍是太天真了。ios
首先是建立Provisioning Profile文件时选择证书列表时是不能选择APNs证书的,并且在XCode里Code Signing也是不能选择的。
APNs证书实际上是只表示了有推送功能,主证书仍是必不可少的。因此如今只是又添加了两个证书,其余的是不用变的,因此如今就有4个证书了。做为一个有轻微强迫症的人,建立完APNs证书就顺手把主证书删了,在这里让我折腾了很久。web
+ (void)setupWithOption:(NSDictionary *)launchingOption
appKey:(NSString *)appKey
channel:(NSString *)channel
apsForProduction:(BOOL)isProduction;
前两个就没必要说了。
channel 发布渠道。我刚开始也不知道要怎么填,iOS?App Store?Publish channel?其实这只是一个标识而已,不会有什么具体影响。并且是可选的,因此填nil也是不要紧的。
isProduction 是否生产环境。看起来颇有用的一个参数,但实际发现YES或NO是没区别的,在框架里边应该是另有判断。但还必须得填,因此在生产和开发环境之间切换时是不必必定要改这个参数的。api
以前的教程文档是没有这个的,下载的Demo里也没有。可是项目里确定是要有这个的。bash
别名 alias
为安装了应用程序的用户,取个别名来标识。之后给该用户 Push 消息时,就能够用此别名来指定。每一个用户只能指定一个别名。app
标签 tag
为安装了应用程序的用户,打上标签。其目的主要是方便开发者根据标签,来批量下发 Push 消息。可为每一个用户打多个标签。框架
+ (void) setTags:(NSSet *)tags alias:(NSString *)alias fetchCompletionHandle:(void (^)(int iResCode, NSSet *iTags, NSString *iAlias))completionHandler;
call back结果能够忽略,但最好判断一下, 返回值为 0 才设置成功,才能够向目标推送。我通常是有block就不会用其余的,但使用block时须要注意循环引用问题。fetch
- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult result))completionHandler
是在iOS7以后的方法,因此以前的方法能够不用了。ui
- (void)applicationWillEnterForeground:(UIApplication *)application
applicationWillEnterForegroun是在didReceiveRemoteNotification以后运行的,因此在这个方法里想处数据是不行的。而后[application setApplicationIconBadgeNumber:0];
是偶尔会抽风一下的,因此最好这样写:spa
[application setApplicationIconBadgeNumber: 1];
[application setApplicationIconBadgeNumber:0];
固然,不要忘了[application cancelAllLocalNotifications];
code
还有,关于跳转到特定页面的问题。反正我是没找到如何在AppDelegate里找到当前的页面,因此只能用self.window.rootViewController
了。返回的话直接self.view.window.rootViewController = vc;
吧。
记得用application.applicationState == UIApplicationStateActive
判断一下应用处于的状态。若是用户正在运行应用,或许还有更好的,但我就是弹一个UIAlertView。