iOS推送消息

    最近公司的項目中, 從產品設計上來說, 推送這部分的功能作的仍是很不合理的.
服務器

    在當前的項目中, 用戶的不少操做都依賴推送消息來完成, 經過推送消息來觸發一些事件, 而後app作一些操做, 可是有個很嚴重的問題就是, 服務器發送的推送消息, 並不能100%的被用戶收到, 就算用戶收到了推送消息, 咱們的程序也並不必定可以收到並處理這條推送消息, 這就使得app一些重要的操做沒法被觸發, 致使用戶體驗會很很差. 
併發

    推送消息在一個app中的地位. 我認爲推送在app中的地位是不能過重要的, 由於並非100%可以被收到並處理的. 推送適合作的是, 好比推送一條新的公告, 給用戶推送新的產品, 或者給用戶推薦什麼東西, 推送最多隻能起到一個提醒的做用, 並不適合依賴推送去完成一些重要的功能
app

    對於對推送消息的處理, 我是這麼作的, 在AppDelegate中的代理方法中接收推送消息, 而後以通知的方式向推送消息的處理類發送一個定向的通知. 在Appdelegate中, 在建立應用的時候, 先建立一個推送消息的處理類, 並持有這個類. 在推送消息初始化時候添加推送消息的監聽通知, dealloc中移除通知, 在接收到通知後, 對通知消息作相應的判斷, 並做不一樣的處理.
less

- (instancetype)init
{
    if (self = [super init]) {
        [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(handleRemoteNotification:) name:@"LittleBeeRemoteNotification" object:nil];
    }
    return self;
}

- (void)handleRemoteNotification:(NSNotification *)noti
{
    NSLog(@"noti = %@", noti);
    NSDictionary *userInfo = noti.userInfo;
    NSString *type = [userInfo objectForKey:@"type"];
    
    UIApplicationState applicationState = [UIApplication sharedApplication].applicationState;
    
    if ([type isEqualToString:@"ac01"]) {
        //若是是從後臺進入的, 則直接打開公告頁面
        if (applicationState == UIApplicationStateInactive) {
            [self openNoticeWithNoticeId:[userInfo objectForKey:@"id"]];
        }
        else if (applicationState == UIApplicationStateActive){
            [[NSNotificationCenter defaultCenter] postNotificationName:@"niticeApplicationStateActive" object:nil];
        }
    }
    else if ([type isEqualToString:@"ac02"]){
        [self requestOrderDetailsWithOrderId:[userInfo objectForKey:@"id"] operationType:@"ac02"];
    }
    else if ([type isEqualToString:@"ac03"]){
        [self requestOrderDetailsWithOrderId:[userInfo objectForKey:@"id"] operationType:@"ac03"];
    }
    else if ([type isEqualToString:@"ac04"]){
        
    }
    else if ([type isEqualToString:@"ac05"]){
        
    }
}

經過AppDelegate拿到當前正在展現的navipost

AppDelegate *appDelegate = [[UIApplication sharedApplication] delegate];
UINavigationController *navi = [appDelegate.tabbar selectedViewController];

AppDelegate中的代理方法中收到通知消息併發送通知fetch

- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo {
    NSLog(@"application:didReceiveRemoteNotification:");
    // Required,For systems with less than or equal to iOS6
    [JPUSHService handleRemoteNotification:userInfo];
    [[NSNotificationCenter defaultCenter] postNotificationName:@"LittleBeeRemoteNotification" object:_pushMshHandle userInfo:userInfo];
}

- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler {
    
    NSLog(@"application:didReceiveRemoteNotification:fetchCompletionHandler:");
    // IOS 7 Support Required
    [JPUSHService handleRemoteNotification:userInfo];
    completionHandler(UIBackgroundFetchResultNewData);
    
    [[NSNotificationCenter defaultCenter] postNotificationName:@"LittleBeeRemoteNotification" object:_pushMshHandle userInfo:userInfo];
}
相關文章
相關標籤/搜索