一些項(xiàng)目中可能只需要配置一次的東西吧

本地推送&遠(yuǎn)程推送

1.遠(yuǎn)程推送

  1. 推送通知的分類
    遠(yuǎn)程推送通知
    本地推送通知
  2. 推送通知作用
    可以讓不在前臺(tái)運(yùn)行的App告知用戶App內(nèi)部發(fā)生了什么事情
    新的聊天消息
    物流信息更新
    商品推薦廣告
  3. 推送通知效果
    屏幕頂部顯示一個(gè)橫幅
    應(yīng)用圖標(biāo)角標(biāo)
    播放音效
    鎖屏?xí)r顯示
    屏幕中間彈出一個(gè)提醒框(iOS10取消了此效果)
    用戶可以設(shè)置推送的效果
    用戶未處理的推送通知都會(huì)展示在通知中心
  4. 推送通知的細(xì)節(jié)
    點(diǎn)擊推送通知默認(rèn)會(huì)打開(kāi)發(fā)送推送通知的應(yīng)用
    不管應(yīng)用是打開(kāi)還是關(guān)閉,推送通知都可以如期發(fā)送

2. 遠(yuǎn)程推送原理

image.png

遠(yuǎn)程推送實(shí)現(xiàn)原理
1. 推送消息的送達(dá), 必須經(jīng)過(guò)蘋果的推送服務(wù)器
蘋果推送服務(wù)器類似于快遞公司
2. 為了將消息精準(zhǔn)發(fā)送到設(shè)備, 需要該設(shè)備先去蘋果服務(wù)器注冊(cè), 獲取DeviceToken
DeviceToken類似于地址和電話
3. 獲取DeviceToken及推送消息給設(shè)備的流程

image.png

3.遠(yuǎn)程推送的證書準(zhǔn)備

一.調(diào)試遠(yuǎn)程推送app, 必備條件:
1.真機(jī): 模擬器無(wú)法獲取DeviceToken
2. 推送開(kāi)發(fā)證書 : 讓電腦能調(diào)試某個(gè)app的推送服務(wù)
3. 開(kāi)發(fā)證書 : 讓電腦具備真機(jī)調(diào)試的能力
4. 開(kāi)發(fā)Profile : 記錄某臺(tái)電腦能用某臺(tái)設(shè)備調(diào)試某個(gè)程序
二.發(fā)布具有推送的app, 必備條件
1. 推送發(fā)布證書 : 如果發(fā)布的程序中包含了推送服務(wù),就必須安裝這個(gè)證書
2. 發(fā)布證書 : 讓電腦具備發(fā)布程序的能力
3. 發(fā)布Profile : 記錄某臺(tái)電腦能發(fā)布某個(gè)程序
三.開(kāi)發(fā)推送功能, 需要先配置開(kāi)發(fā)者賬號(hào)
1. 打開(kāi)Xcode的推送服務(wù)
2. 配置推送開(kāi)發(fā)證書和推送發(fā)布證書
Xcode無(wú)法自動(dòng)配置推送證書, 必須手動(dòng)配置

第三方SDK

自己去看文檔.....額.....

2.本地推送

本地推送介紹

什么是本地推送通知
顧名思義珊楼,就是不需要聯(lián)網(wǎng)就能發(fā)出的推送通知(不需要服務(wù)器的支持)
本地推送通知的使用場(chǎng)景
常用來(lái)定時(shí)提醒用戶完成一些任務(wù)疯坤,比如
清理垃圾抹腿、記賬、買衣服秕硝、看電影、玩游戲
如何發(fā)出本地推送通知
1. 通知的授權(quán), 只需一次
2. 創(chuàng)建本地推送通知對(duì)象
3. 設(shè)置相關(guān)屬性: 發(fā)送時(shí)間洲尊、提醒內(nèi)容远豺、聲音等
4. 添加到本地通知調(diào)度池中

iOS10本地推送實(shí)現(xiàn)

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    
    /*
     1. 通知的授權(quán), 只需一次
     2. 創(chuàng)建本地推送通知對(duì)象
     3. 設(shè)置相關(guān)屬性: 發(fā)送時(shí)間、提醒內(nèi)容坞嘀、聲音等
     4. 添加到本地通知調(diào)度池中
     */
    
    // 一. 通知的授權(quán), 只需一次 (不需要配置plist)
    //1. 創(chuàng)建用戶通知中心
    UNUserNotificationCenter *center = [UNUserNotificationCenter currentNotificationCenter];
    
    //2. 進(jìn)行授權(quán)(遠(yuǎn)程/本地通用)
    [center requestAuthorizationWithOptions:(UNAuthorizationOptionBadge | UNAuthorizationOptionSound | UNAuthorizationOptionAlert) completionHandler:^(BOOL granted, NSError * _Nullable error) {
        if (granted) {
            NSLog(@"授權(quán)成功");
        } else {
            NSLog(@"error: %@", error);
        }
    }];
    
    //3. 設(shè)置代理
    center.delegate = self;
    
    return YES;
}
- (IBAction)sendLocalNotificationClick:(id)sender {
    
    //本地推送和遠(yuǎn)程推送邏輯是類似的. 只不過(guò)將設(shè)置數(shù)據(jù)的部分放到了本地
    
    //1. 設(shè)置通知的內(nèi)容, 必須使用 UNNotificationContent 的可變子類
    UNMutableNotificationContent *content = [UNMutableNotificationContent new];
    
    //設(shè)置附件
    NSURL *url = [NSURL fileURLWithPath:[[NSBundle mainBundle] pathForResource:@"icon" ofType:@"png"]];
    UNNotificationAttachment *attachment = [UNNotificationAttachment attachmentWithIdentifier:@"attachment" URL:url options:nil error:nil];
    
    content.attachments = @[attachment];
    
    //設(shè)置提醒文字
    content.title = @"你好";
    content.subtitle = @"呵呵";
    content.body = @"女神: 去洗澡";
    
    //設(shè)置角標(biāo)
    content.badge = @([UIApplication sharedApplication].applicationIconBadgeNumber + 1);
    
    //設(shè)置聲音
    content.sound = [UNNotificationSound soundNamed:@"8360.mp3"];
    
    //設(shè)置用于傳值的字典
    content.userInfo = @{@"url" : @"https://www.baidu.com"};
    
    
    //2. 設(shè)置觸發(fā)的時(shí)間 --> 使用子類設(shè)置
    //如果設(shè)置重復(fù), 間隔至少1分鐘
//    UNTimeIntervalNotificationTrigger *trigger = [UNTimeIntervalNotificationTrigger triggerWithTimeInterval:3 repeats:NO];
    
    NSDateComponents *dateComponents = [NSDateComponents new];
    dateComponents.hour = 16;
    dateComponents.minute = 22;
    
    UNCalendarNotificationTrigger *trigger = [UNCalendarNotificationTrigger triggerWithDateMatchingComponents:dateComponents repeats:YES];
    
    
    //3. 創(chuàng)建通知請(qǐng)求
    UNNotificationRequest *request = [UNNotificationRequest requestWithIdentifier:@"notifi1" content:content trigger:trigger];
    
    //4. 添加到本地通知調(diào)度池中 --> iOS10添加本地通知到通知中心
    UNUserNotificationCenter *center = [UNUserNotificationCenter currentNotificationCenter];
    [center addNotificationRequest:request withCompletionHandler:nil];
    
}

3.接收iOS10本地推送的值

//只能在前臺(tái)運(yùn)行時(shí)被調(diào)用 --> 可以獲取通知的值, 還可以設(shè)置前臺(tái)運(yùn)行時(shí)是否要顯示通知
- (void)userNotificationCenter:(UNUserNotificationCenter *)center willPresentNotification:(UNNotification *)notification withCompletionHandler:(void (^)(UNNotificationPresentationOptions options))completionHandler __IOS_AVAILABLE(10.0) __TVOS_AVAILABLE(10.0) __WATCHOS_AVAILABLE(3.0) {
    
    //可以獲取用戶的userInfo信息, 具體的邏輯處理將來(lái)看公司的需求
    NSLog(@"notification: %@", notification.request.content.userInfo);
    
    //這個(gè)設(shè)置通知呈現(xiàn)的樣式, 是iOS10增加的
    completionHandler(UNNotificationPresentationOptionAlert | UNNotificationPresentationOptionSound);
    
}

//前臺(tái)/后臺(tái)/退出, 都可以調(diào)用此方法
//點(diǎn)擊了通知之后會(huì)調(diào)用
- (void)userNotificationCenter:(UNUserNotificationCenter *)center didReceiveNotificationResponse:(UNNotificationResponse *)response withCompletionHandler:(void(^)())completionHandler __IOS_AVAILABLE(10.0) __WATCHOS_AVAILABLE(3.0) __TVOS_PROHIBITED {
    //可以獲取用戶的userInfo信息, 具體的邏輯處理將來(lái)看公司的需求
    NSLog(@"notification: %@", response.notification.request.content.userInfo);
    
    UISwitch *s = [UISwitch new];
    s.frame = CGRectMake(30, 300, 0, 0);
    [self.window addSubview:s];
    
    //蘋果要求調(diào)用
    completionHandler();
}

iOS8的實(shí)現(xiàn)...

過(guò)期了就算了....

傳感器

指紋識(shí)別

5S開(kāi)始才有的指紋識(shí)別, 目前絕大部分的設(shè)備都可以支持
iOS8的時(shí)候蘋果開(kāi)放了指紋識(shí)別的API
需要LocalAuthentication框架

//前提: 判斷設(shè)備/判斷版本
    
    //1. 創(chuàng)建本地驗(yàn)證上下文對(duì)象
    LAContext *context = [LAContext new];
    
    //2. 判斷指紋識(shí)別是否可用d
    //Evaluate: 執(zhí)行 Policy: 策略 Biometrics: 生物識(shí)別
    if (![context canEvaluatePolicy:LAPolicyDeviceOwnerAuthenticationWithBiometrics error:nil]) {
        NSLog(@"指紋識(shí)別不可用");
        return;
    }
    
    //3. 如果可用就調(diào)用
    [context evaluatePolicy:LAPolicyDeviceOwnerAuthenticationWithBiometrics localizedReason:@"請(qǐng)?jiān)试S訪問(wèn)" reply:^(BOOL success, NSError * _Nullable error) {
        if (success) {
            NSLog(@"指紋識(shí)別成功");
            //打開(kāi)對(duì)應(yīng)的功能操作
        } else {
            NSLog(@"error: %@", error);
        }
    }];

注意1:更新UI放主線程
注意2:需要判斷error.code 用戶取消和驗(yàn)證失敗的邏輯可能不一樣

距離傳感器

- (void)viewDidLoad {
    [super viewDidLoad];
    
    //1. 打開(kāi)距離傳感器
    //proximity: 接近 Monitoring: 檢測(cè)
    [UIDevice currentDevice].proximityMonitoringEnabled = YES;
    
    //2. 添加通知來(lái)獲取值
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(deviceProximityStateDidChangeNotification) name:UIDeviceProximityStateDidChangeNotification object:nil];
}


//3. 添加通知來(lái)獲取值
- (void)deviceProximityStateDidChangeNotification {
    if ([UIDevice currentDevice].proximityState) {
        NSLog(@"逗比靠近了");
    } else {
        NSLog(@"逗比被嚇跑了");
    }
}

運(yùn)動(dòng)管理器

1.加速計(jì)

//0. 創(chuàng)建運(yùn)動(dòng)管理器
    _motionMgr = [CMMotionManager new];

    //一. 加速計(jì) accelerometer --Push
    //1. 判斷加速計(jì)是否可用
    if (![_motionMgr isAccelerometerAvailable]) {
        return NSLog(@"加速計(jì)不可用");
    }

    //2. 設(shè)置更新間隔  
    _motionMgr.accelerometerUpdateInterval = 1;

    //3. 開(kāi)始統(tǒng)計(jì)數(shù)據(jù)
    [_motionMgr startAccelerometerUpdatesToQueue:[NSOperationQueue mainQueue] withHandler:^(CMAccelerometerData * _Nullable accelerometerData, NSError * _Nullable error) {

        //加速計(jì)數(shù)據(jù)
        //哪個(gè)軸的方向, 指向了地面, 那么這個(gè)軸方向的數(shù)據(jù), 就會(huì)被加速計(jì)統(tǒng)計(jì)
        //數(shù)據(jù)在1和-1之間
        //加速計(jì)是檢測(cè)力在某個(gè)方向上有作用. 如果速度越快, 值越大
        CMAcceleration acceleration = accelerometerData.acceleration;
        NSLog(@"x: %f, y: %f, z:%f", acceleration.x, acceleration.y, acceleration.z);

    }];
//一. 加速計(jì) accelerometer --Pull --> 主動(dòng)獲取數(shù)據(jù), 當(dāng)需要的時(shí)候再去獲取
    //1. 判斷加速計(jì)是否可用
    if (![_motionMgr isAccelerometerAvailable]) {
        return NSLog(@"加速計(jì)不可用");
    }

    //2. 開(kāi)始統(tǒng)計(jì)數(shù)據(jù)
    [_motionMgr startAccelerometerUpdates];

2.陀螺儀 --> 將加速計(jì)的Accelerometer替換成Gyro即可

3.磁力計(jì) --> 磁力計(jì) Magnetometer : 檢測(cè)磁場(chǎng)變化

搖一搖

//開(kāi)始搖動(dòng)
- (void)motionBegan:(UIEventSubtype)motion withEvent:(UIEvent *)event {
    NSLog(@"開(kāi)始搖動(dòng)");
}

//搖動(dòng)結(jié)束
- (void)motionEnded:(UIEventSubtype)motion withEvent:(UIEvent *)event {
    NSLog(@"搖動(dòng)結(jié)束");
}

//搖動(dòng)取消
- (void)motionCancelled:(UIEventSubtype)motion withEvent:(UIEvent *)event {
    NSLog(@"搖動(dòng)取消");
}

計(jì)步器

//1. 判斷計(jì)步器是否可用
    if (![CMPedometer isStepCountingAvailable]) {
        NSLog(@"計(jì)步功能不可用");
        return ;
    };
    
    //2. 創(chuàng)建計(jì)步器 --> iOS8出現(xiàn)的,
    _pedomter = [CMPedometer new];
    
    //3. 開(kāi)始計(jì)步 --> 從當(dāng)前時(shí)間開(kāi)始統(tǒng)計(jì)
    [_pedomter startPedometerUpdatesFromDate:[NSDate date] withHandler:^(CMPedometerData * _Nullable pedometerData, NSError * _Nullable error) {
        
        [self performSelectorOnMainThread:@selector(updateUI:) withObject:pedometerData.numberOfSteps waitUntilDone:YES];
    }];
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末躯护,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子姆吭,更是在濱河造成了極大的恐慌榛做,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,324評(píng)論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件内狸,死亡現(xiàn)場(chǎng)離奇詭異检眯,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)昆淡,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,356評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門锰瘸,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人昂灵,你說(shuō)我怎么就攤上這事避凝。” “怎么了眨补?”我有些...
    開(kāi)封第一講書人閱讀 162,328評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵管削,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我撑螺,道長(zhǎng)含思,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書人閱讀 58,147評(píng)論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮含潘,結(jié)果婚禮上饲做,老公的妹妹穿的比我還像新娘。我一直安慰自己遏弱,他們只是感情好盆均,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,160評(píng)論 6 388
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著漱逸,像睡著了一般泪姨。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上虹脯,一...
    開(kāi)封第一講書人閱讀 51,115評(píng)論 1 296
  • 那天驴娃,我揣著相機(jī)與錄音,去河邊找鬼循集。 笑死唇敞,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的咒彤。 我是一名探鬼主播疆柔,決...
    沈念sama閱讀 40,025評(píng)論 3 417
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼镶柱!你這毒婦竟也來(lái)了旷档?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書人閱讀 38,867評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤歇拆,失蹤者是張志新(化名)和其女友劉穎鞋屈,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體故觅,經(jīng)...
    沈念sama閱讀 45,307評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡厂庇,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,528評(píng)論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了输吏。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片权旷。...
    茶點(diǎn)故事閱讀 39,688評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖贯溅,靈堂內(nèi)的尸體忽然破棺而出拄氯,到底是詐尸還是另有隱情,我是刑警寧澤它浅,帶...
    沈念sama閱讀 35,409評(píng)論 5 343
  • 正文 年R本政府宣布译柏,位于F島的核電站,受9級(jí)特大地震影響姐霍,放射性物質(zhì)發(fā)生泄漏艇纺。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,001評(píng)論 3 325
  • 文/蒙蒙 一邮弹、第九天 我趴在偏房一處隱蔽的房頂上張望黔衡。 院中可真熱鬧,春花似錦腌乡、人聲如沸盟劫。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 31,657評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)侣签。三九已至,卻和暖如春急迂,著一層夾襖步出監(jiān)牢的瞬間影所,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 32,811評(píng)論 1 268
  • 我被黑心中介騙來(lái)泰國(guó)打工僚碎, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留猴娩,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,685評(píng)論 2 368
  • 正文 我出身青樓勺阐,卻偏偏與公主長(zhǎng)得像卷中,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子渊抽,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,573評(píng)論 2 353

推薦閱讀更多精彩內(nèi)容

  • 因?yàn)橐Y(jié)局swift3.0中引用snapKit的問(wèn)題,看到一篇介紹Xcode8,swift3變化的文章,覺(jué)得很詳細(xì)...
    uniapp閱讀 4,414評(píng)論 0 12
  • 網(wǎng)上介紹iOS Push的文章有很多蟆豫,但是大部分都總結(jié)得非常零散,加上之前也一直沒(méi)好好總結(jié)過(guò)懒闷,對(duì)某些地方也不求甚解...
    紙簡(jiǎn)書生閱讀 2,846評(píng)論 1 29
  • 轉(zhuǎn)載自:iOS10里的通知與推送 原文 通知和推送是一種東西么十减? iOS 10通知 推送 圖1為通知,圖2為推送也...
    路漫漫其修遠(yuǎn)兮Wzt閱讀 941評(píng)論 0 1
  • 夏天就這樣悄然而至愤估,被困在春天里的飛蟲帮辟,它們的羽翼一下子變得豐盈起來(lái)。然而灵疮,春天的燕子卻早已漸行漸遠(yuǎn)织阅,曾留下滿地的...
    龍金川閱讀 146評(píng)論 0 1
  • 深藍(lán)色的清晨背景 有光閃過(guò) 幾聲隆隆的響聲 喚醒夜的沉默 窗外有雨飄落 幾家燈火之光 陸續(xù)亮了 九月的心事 在清晨...
    光輝_798e閱讀 97評(píng)論 0 0