自非晓得大学是呀⑤

前言

多年来iOS10之创新,客户反映了不交推送消息,经测试发现凡是在iOS10的达到,JPush不回调之前设置好之应措施。
(ps:之前是同事负责这个模块的,所以更新JPush
SDK、适配iOS10底沉重落于自身身上叻 lol )

 

起询问

概括地浏览了平整JPush SDK的合法文档,发现极光官方文档也是那个详细的。

图片 1

1、JPush推送机制:

推送大致分两栽
一如既往种植是包裹苹果原生的APNs的推送(以代办形式,简化APNs推送的配备)
另一样种是应用内推送(通过SDK的TCP长连接进行信息推送)。

昨晚描绘的那篇自要好尚且非扣好,真的有点瞎扯淡的痛感,把握不鸣金收兵的地方。今天如果早操,所以六接触半即使起来了,早就想了要是当高校里好休息,但有时候连会受掀起,被打搅,弄到只一两点。

2、JPush SDK的翻新配备:

这里就是无作细述叻。iOS JPush
SDK配置官方文档

 写这些文章也无是突发奇想,而是酝酿了旷日持久,高考后,就想动笔写点东西,想了许多物,但都是些碎片化的记忆,我从认为是心有余而力不足将该串联上的,加上那段时间比较烦躁。

3、消息推送功能:

3.1)远程通知推送,APNs推送通知

3.2)自定义消息推送,应用内部消息推送,只有app处于前台时才见面收的推送,当然极光方面也发生离线消息功能。

3.3)富媒体推送,官方认证是功效只支持安卓端=。=,个人觉得iOS10的Service
Extension也得兑现这作用(自定义消息推送+iOS内部处理)。

3.4)本地通知推送,应用中生一个定时或定点推送,到达某时刻、或者地方,就见面触发iOS的原生本地通知

ps:(如果用打开的当儿,不见面弹有下拉通知框。如果下在后台的时,就会弹出通知框,这个和Lifeline游戏app推送有接触像)。

 分数不是颇好,但原本说好之失杭州平等游也落空了,原因还是家乡有几只青春小伙子死在了异乡,家里人也就不予我出去耍。不清楚为什么,几乎是有的前辈都不以为然我。

4、推送证书配置:

使进行推送调试,苹果开发者证书配置是不可或缺的。极光官方关系配置教程

这里吐槽一下我纠缠了之坑,推送环境关系分点儿栽:

  • 付出环境关系(Development开发证书)
  • 养环境关系(Production发布证书)
    两者都如互相配置好并达到传来极光开发者服务后台,后台认证后可以收到推送。

那问题就是来了,如果我们测试的早晚下企业公布证书(客户测试人员比较多,所以利用企业颁发),appStore上面版本采用的凡正经通告证书,那怎么不是会见现出冲?
(ps:极光开发者后台只能安排一个发表证书)

通过iOS小组内部讨论,提出一个实惠之方案:
再就是提请2单极光开发者账号,分别配备企业宣布证书及业内宣告证书,安卓、后台也欲共同切换账号所运用的AppKey和Master
Secret。
然尽管好缓解此于为难的题材。

思路如下:
(1)iOS、安卓、后台在【测试】的接口环境下,企业宣布证书之账号的AppKey
(2)iOS、安卓、后台在【正式】的接口环境下,正式通告证书的账号的AppKey
(3)三端判断接口环境,同步切换AppKey,这样虽可以推送【app的企业版】和【app
store版】

读者思想:假如自己想以【正式】的接口环境打包企业版,那怎么不是会见并发问题?
(ps:实际上不见面面世这种景象,具体由留作读者琢磨:p)

 我理解自家重新失反抗已经没有其余企图,我无可知违反了上下还去背任何具备亲属。现在合计,为何我当下的策反并无到头,为了自由,难道就是不能够擦一扭曲,或许,我说或者,我委来了转业,那可能是我命中之均等抢劫。

自定义消息推送

由定义信息推送功能跟客户需要比较适合,所以下面展开于定义消息推送的探讨。

  • 推送里面分4种植:广播推送、标签推送、别名推送、 用户分群推送。

咱俩的以使用的比较简单的播放推送(这种推送是所有用户还见面接收这个推送)。经iOS、安卓、后台三单端同事的讨论,总结出一致仿照于可行之铺面里面推送机制、推送接口。推送业务流程如下:

1、客户端或者后台发起推送,按照预约好之规则,调用推送接口
2、客户端收到广播推送,按照规则响应措施处理,作出相应的操作、提示

只要是购物发货流程业务场景,推送例子如下(推送发起者、响应者都以客户端):
1、商家进行发货操作,客户端回调推送接口(发货通知推送规则)
2、用户接受到发货通知,客户端进行判定,如果收货人是眼前用户,则响应推送,弹窗提示。其它用户都无提拔

切实优化方案吧是于召开拓展(如竹签推送、别名推送、 用户分群推送)。

 所以高考后除去同学家参加谢师宴,就是待在家里看电视,家里说是为了我念,所以一直不请电脑,我们都懂原因是呀,但以此词我家比较快:穷。

talk is cheap,show me the code

当自身看齐AppDelegate.m文件的那么一刻,整个人且不好了,推送、支付、分享、其它第三正值sdk的运操作,都堆放在AppDelegate里面叻
LOL。

故此,我萌生写一个jpush工具类的想法。go!

  • 继续封装:生成一个接近,继承给AppDelegate,重写父类的法门。(ps:每次导入这个工具类都用更改AppDelegate的父类,略麻烦,所以pass掉叻)

  • 项目封装:生成一个类作用为(AppDelegate),头文件开放初始化、响应操作的api(这种可能比较协调一点,下面就是贴类别的code)

AppDelegate+Jpush.h

#import "AppDelegate.h"
#import "JPUSHService.h"
#import <UserNotifications/UserNotifications.h>

//此类别是为了拓展jpush sdk的api,封装出来使用,简化原本appDelegate的代码

@interface AppDelegate (Jpush)<JPUSHRegisterDelegate>

//初始化jpush
-(void)setupJpush:(nullable NSDictionary *)launchOptions;

@end

AppDelegate+Jpush.m

#import"AppDelegate+Jpush.h"

#define jpush_appKey_inHouse @"xxxxxxxxxx"
#define jpush_channel_inHouse @"Enterprise"
#define jpush_appKey @"xxxxxxxxxx"
#define jpush_channel_AppStore @"App Store"
#define hostUrl @"http://www.test.com/"

@implementationAppDelegate (Jpush)

@implementation AppDelegate (Jpush)

-(void)setupJpush:(nullable NSDictionary *)launchOptions
{
    NSNotificationCenter *defaultCenter = [NSNotificationCenter defaultCenter];
    [defaultCenter addObserver:self selector:@selector(networkDidReceiveMessage:) name:kJPFNetworkDidReceiveMessageNotification object:nil];


    //    NSString *advertisingId = [[[ASIdentifierManager sharedManager] advertisingIdentifier] UUIDString];
    //Required

    if ([[UIDevice currentDevice].systemVersion floatValue] >= 10.0) {
        JPUSHRegisterEntity * entity = [[JPUSHRegisterEntity alloc] init];
        entity.types = UNAuthorizationOptionAlert|UNAuthorizationOptionBadge|UNAuthorizationOptionSound;
        [JPUSHService registerForRemoteNotificationConfig:entity delegate:self];
    }
    else if ([[UIDevice currentDevice].systemVersion floatValue] >= 8.0) {
        //可以添加自定义categories
        [JPUSHService registerForRemoteNotificationTypes:(UIUserNotificationTypeBadge |
                                                          UIUserNotificationTypeSound |
                                                          UIUserNotificationTypeAlert)
                                              categories:nil];
    }
    else {
        //categories 必须为nil
        [JPUSHService registerForRemoteNotificationTypes:(UIRemoteNotificationTypeBadge |
                                                          UIRemoteNotificationTypeSound |
                                                          UIRemoteNotificationTypeAlert)
                                              categories:nil];
    }




    //Required
    // init Push(2.1.5版本的SDK新增的注册方法,改成可上报IDFA,如果没有使用IDFA直接传nil  )
    // 如需继续使用pushConfig.plist文件声明appKey等配置内容,请依旧使用[JPUSHService setupWithOption:launchOptions]方式初始化。
    BOOL isTestHost=![hostUrl isEqualToString:@"http://www.test.com/"];
    [JPUSHService setupWithOption:launchOptions appKey:isTestHost?jpush_appKey_inHouse:jpush_appKey
                          channel:nil
                 apsForProduction:YES
            advertisingIdentifier:nil];


}

- (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken
{
    /// Required - 注册 DeviceToken
    [JPUSHService registerDeviceToken:deviceToken];
}

-(void)application:(UIApplication *)application didFailToRegisterForRemoteNotificationsWithError:(nonnull NSError *)error
{
    NSLog(@"did Fail To Register For Remote Notifications With Error: %@", error);
}

#pragma mark- JPUSHRegisterDelegate

#pragma mark- JPUSHRegisterDelegate

// iOS 10 Support
- (void)jpushNotificationCenter:(UNUserNotificationCenter *)center willPresentNotification:(UNNotification *)notification withCompletionHandler:(void (^)(NSInteger))completionHandler {
    // Required
    NSDictionary * userInfo = notification.request.content.userInfo;
    if([notification.request.trigger isKindOfClass:[UNPushNotificationTrigger class]]) {
        [JPUSHService handleRemoteNotification:userInfo];
    }
    completionHandler(UNNotificationPresentationOptionAlert); // 需要执行这个方法,选择是否提醒用户,有Badge、Sound、Alert三种类型可以选择设置
}

// iOS 10 Support
- (void)jpushNotificationCenter:(UNUserNotificationCenter *)center didReceiveNotificationResponse:(UNNotificationResponse *)response withCompletionHandler:(void (^)())completionHandler {
    // Required
    NSDictionary * userInfo = response.notification.request.content.userInfo;
    if([response.notification.request.trigger isKindOfClass:[UNPushNotificationTrigger class]]) {
        [JPUSHService handleRemoteNotification:userInfo];
    }
    completionHandler();  // 系统要求执行这个方法
}

- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler {

    // Required, iOS 7 Support
    [JPUSHService handleRemoteNotification:userInfo];
    completionHandler(UIBackgroundFetchResultNewData);
}

- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo {

    // Required,For systems with less than or equal to iOS6
    [JPUSHService handleRemoteNotification:userInfo];
}

-(void)application:(UIApplication *)application didRegisterUserNotificationSettings:(nonnull UIUserNotificationSettings *)notificationSettings
{
    [application registerForRemoteNotifications];
}
- (void)networkDidReceiveMessage:(NSNotification *)notification {
    //jpush回调响应方法
    NSDictionary * userInfo = [notification userInfo];
    NSString *content = userInfo[@"content"];
    NSLog(@"%@",content);

    UIAlertView*alterView=[[UIAlertView alloc] initWithTitle:@"" message:content delegate:self cancelButtonTitle:@"取消" otherButtonTitles:@"确定", nil];
    [alterView show];
}
-(void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex{

}

@end

调用方法:
在AppDelegate导入AppDelegate+Jpush.h

#import "AppDelegate.h"
#import "AppDelegate+Jpush.h"

@implementation AppDelegate

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    //初始化jpush工具类
    [self setupJpush:launchOptions];
    return YES;
}

jpush iOS10勿回调响应措施的因由是:
急需贯彻jpushiOS10之代办方,iOS先回调

-(void)jpushNotificationCenter:(UNUserNotificationCenter *)center willPresentNotification:(UNNotification *)notification withCompletionHandler:(void(^)(NSInteger options))completionHandler;

以斯方法吃而进行iOS10初特点Service
Extension,如果非新鲜处理,则当这个方中调用iOS9响应的jpush方法

完结,撒花:D

 但人是一样种很奇怪之动物,每个人对于气愤的反响都不同,我记忆上独夏天本身是地处相同栽低沉甚至憋的氛围下度过的。但那时自己或将由归置到了气象的峰上,异乡人的持有者公默尔索开下首先枪,他的案由也只是炎炎烈日。

 早上即使径直给同班开心说我和某某处目标了,我也不过是乐,不告知。已经好老了,上同样不成有人这么开始自己玩笑。还记得初中为是这般个情况,那时的亲善特别自卑,她蛮精彩,我还是不敢同她差不多说几词话,中考后我以校友的激励下,打电话给它表白,结束了。高中后,发现她底秉性不像她的外部一样美妙。呵呵,所幸。

 晚上底选项修课,没有想到死有整个寝室还来上课了,我本想坐中的职位的,但其造成了摆手,我虽要边上的同学为自己进来,好挤好挤。热得自身破下了羽绒服,搭在书包上,而书包就以自我腿上。

 上课上课,突然给同台数学题打断了,我没去听课,题没开下,心倒分散了森,前排一小兄弟在为此计算机看lol春季赛。我也随后他看玩了IG打之如出一辙集市,似乎是落败了。

 晚上同等挺伙人在我们寝室玩玩自了UNO,我之凳子被专占了,洗了同样生堆衣服后,便因于几上之所以电脑看了一样聚集韩剧。看韩剧是自基友养成的。

 基友的性很好,但本身来对无停歇它底地方,因为恋爱的来头,我老是考虑前人多或多或少,而将基友忽视了。与其说忽视,不如说无视,重色轻友完美刻画了当时的自身。

 不晓得何时起,我本着她底相信超出了其他人,我莫不得以跟它们提到东西,但本身少呢有友好之心腹,不是无克说话,而是不甘于被对方多许多没法。相互理解,是自与它交长存的来头。

 人生中能做真的好友并无多,异性的挚友或更少还少。有些时候,我们还是以人家之流年里担纲路人,或许会震起一滩涟漪,可之后也,平静而镜,走后无论痕迹罢了。

 我愿再次多认识有人口,了解有自我没有经历过的故事,我可相信我能够重复相见你,以同等种不同的地位。

 晚安,各位。

 

 

相关文章

发表评论

电子邮件地址不会被公开。 必填项已用*标注

*
*
Website