高新技術(shù):短信 & 郵件 & 撥打電話 & 驗(yàn)證碼 & 程序跳轉(zhuǎn) & 靜態(tài)庫(kù) & 通知 & 上架

真機(jī)測(cè)試錄制屏幕
OSX QuickTime Player -> 文件 ->屏幕錄制

*iOS 9.0開(kāi)放免費(fèi)真機(jī)測(cè)試 *

OS X-code步驟:
1. AppID:注冊(cè)iCloud
2. 設(shè)備
3. 添加AppID到Xcode
4. 連接手機(jī)到mac上
5. Target - General - Team(Fix Issue)
6. Target - Build Settings - 搜索(code signing ->Debug 修改)
7. 選擇設(shè)備
8. 運(yùn)行程序

手機(jī):
設(shè)置 - 通用 - 設(shè)備管理(描述文件)

1. 短信

方式一 功能少-> 不能指定發(fā)短信的那內(nèi)容 不能回到原來(lái)的應(yīng)用

- (IBAction)sendMessage:(UIButton *)sender {
  NSURL *url = [NSURL URLWithString:@"sms://xxx xxxx xxxx"];
  [[UIApplication sharedApplication]openURL:url];
}

方式二 功能多 -> 指定內(nèi)容 多個(gè)發(fā)送對(duì)象 返回

頭文件   #import <MessageUI/MessageUI.h>
遵守協(xié)議 <MFMessageComposeViewControllerDelegate> 

-> 點(diǎn)擊觸發(fā):

- (IBAction)sendMessage:(UIButton *)sender {
    [self showMessageView:@[@"xxx xxxx xxxx"] title:@"msg title" body:@"測(cè)試發(fā)短信"];
   
}

-> 調(diào)用方法

-(void)showMessageView:(NSArray *)phones title:(NSString *)title body:(NSString *)body{
    if ([MFMessageComposeViewController canSendText]) {
        MFMessageComposeViewController *msgController = [MFMessageComposeViewController new];
        //設(shè)置接收人 內(nèi)容 標(biāo)題
        msgController.recipients = phones;
        msgController.body = body;
        msgController.title = title;
        //設(shè)置代理*********代理
        msgController.messageComposeDelegate = self;
        msgController.navigationBar.tintColor = [UIColor redColor];
        [self presentViewController:msgController animated:YES completion:nil];
    }else{
        NSLog(@"該設(shè)備不能發(fā)短信");
    }
}

-> 實(shí)現(xiàn)協(xié)議* #pragma mark - MFMessageComposeViewControllerDelegate*

-(void)messageComposeViewController:(MFMessageComposeViewController *)controller didFinishWithResult:(MessageComposeResult)result{
    switch (result) {
        case MessageComposeResultSent:
            NSLog(@"發(fā)送成功");
            break;
        case MessageComposeResultFailed:
            NSLog(@"發(fā)送失敗");
        case MessageComposeResultCancelled:
            NSLog(@"取消發(fā)送");
        default:
            break;
    }
}

2. 郵件

幾乎和發(fā)短信相同 要在icloud中打開(kāi)郵件并設(shè)置賬號(hào)

頭文件   #import <MessageUI/MessageUI.h>
遵守協(xié)議 <MFMailComposeViewControllerDelegate> 

->點(diǎn)擊觸發(fā)

** 發(fā)郵件*
- (IBAction)sendMail:(UIButton *)sender {
    if ([MFMailComposeViewController canSendMail]) {
        MFMailComposeViewController *mailCon = [MFMailComposeViewController new];
        [mailCon setSubject:@"我的周報(bào)"];
        [mailCon setToRecipients:@[@"guoaj@tedu.cn"]];
        
        /** 抄送*/
        // [mailCon setCcRecipients:<#(nullable NSArray<NSString *> *)#>];
        /** 密送*/
        // [mailCon setBccRecipients:<#(nullable NSArray<NSString *> *)#>];
        
        [mailCon setMessageBody:@"這是我的周報(bào)<font color = \"red\" size = 6>周報(bào)的內(nèi)容:今天是周三 </font> 請(qǐng)查閱" isHTML:YES];/* ----> no 直接發(fā)文本*/
        /** 附件*/
        UIImage *image = [UIImage imageNamed:@"pic"];
        NSData *imageData = UIImagePNGRepresentation(image);
        [mailCon addAttachmentData:imageData mimeType:@"image/png" fileName:@"abc.png"];
        
        //設(shè)置代理
        mailCon.mailComposeDelegate = self;
               
        [self presentViewController:mailCon animated:YES completion:nil];
    }else{
        NSLog(@"不能發(fā)郵件");
    }
}

-> 實(shí)現(xiàn)協(xié)議*# pragma mark - MFMailComposeViewControllerDelegate *


-(void)messageComposeViewController:(MFMessageComposeViewController *)controller didFinishWithResult:(MessageComposeResult)result{
    switch (result) {
        case MessageComposeResultSent:
            NSLog(@"發(fā)送成功");
            break;
        case MessageComposeResultFailed:
            NSLog(@"發(fā)送失敗");
        case MessageComposeResultCancelled:
            NSLog(@"取消發(fā)送");
        default:
            break;
    }
    [self dismissViewControllerAnimated:YES completion:nil];
}

3. 打電話

方式一:直接撥出

 NSURL *url = [NSURL URLWithString:@"tel://xxx xxxx xxxx"];
 [[UIApplication sharedApplication]openURL:url];

方式二:會(huì)給用戶(hù)一個(gè)選擇,用于黑蘋(píng)果設(shè)備,但這種方式上線可能遭到拒絕

 NSURL *url = [NSURL URLWithString:@"telprompt://xxx xxxx xxxx"];
 [[UIApplication sharedApplication]openURL:url];

方式三:有選擇機(jī)會(huì)

@interface ViewController ()
{
    UIWebView *_webView;
}

@implementation ViewController
 if (_webView == nil) {
        _webView = [[UIWebView alloc]initWithFrame:CGRectZero];
    } 
    NSURL *url = [NSURL URLWithString:@"tel://xxx xxxx xxxx"];
    NSURLRequest *request = [NSURLRequest requestWithURL:url];     
 [_webView loadRequest:request];

4. 短信驗(yàn)證碼@網(wǎng)址

  • 1 mob.com注冊(cè)賬號(hào),激活
  • 2 登錄賬號(hào)
    鼠標(biāo)放在右上角的頭像 -> 出現(xiàn)進(jìn)入后臺(tái)
  • 3 找到對(duì)應(yīng)的模塊 新建應(yīng)用
    獲取appkey和appsecret
  • 4 按照官方文檔 實(shí)現(xiàn)短信驗(yàn)證
#import "AppDelegate.h"
#import <SMS_SDK/SMSSDK.h>
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    [SMSSDK registerApp:MOBAPPKEY withSecret:MOBAPPSECRECT];
    return YES;
}
 #import "ViewController.h"
 #import <SMS_SDK/SMSSDK.h>
 
**獲取驗(yàn)證碼**
- (IBAction)getMsgCode:(UIButton *)sender {
    [SMSSDK getVerificationCodeByMethod:SMSGetCodeMethodSMS phoneNumber:@"xxxxxx" zone:@"86" customIdentifier:nil result:^(NSError *error) {
        if (error) {
            NSLog(@"獲取驗(yàn)證碼失敗,%@",error);
        }else{
            NSLog(@"獲取驗(yàn)證碼失敗");
        }
    }];
}

**驗(yàn)證**
- (IBAction)validMsgCode:(UIButton *)sender {
    [SMSSDK commitVerificationCode:self.msgCodeField.text phoneNumber:@"xxxxxx" zone:@"86" result:^(NSError *error) {
        if (error) {
            NSLog(@"驗(yàn)證失敗");
        }else
        {
            NSLog(@"驗(yàn)證成功");
        }
    }];
}

5. 應(yīng)用程序間跳轉(zhuǎn)

  • 1 建立一個(gè)程序叫MyApp 建立另一個(gè)應(yīng)用程序叫YourApp
  • 2 在YourApp增加標(biāo)識(shí) Target -> Info -> URL Types ->增加 ->URLSchemes (YourApp)
  • 3在MyAPP設(shè)置白名單(IOS9之后的要求)Target -> Info -> LSApplicationQueriesSchemes(Array) ->增加(YourApp)
NSURL *url = [NSURL URLWithString:@"YourApp://"];
   UIApplication *app = [UIApplication sharedApplication];
   if ([app canOpenURL:url]) {
       [app openURL:url];
   }else{
       NSLog(@"打開(kāi)應(yīng)用程序失敗");
   }

跳轉(zhuǎn)到其他應(yīng)用,例如:微博懂更、微信等...找到相應(yīng)地scheme和設(shè)置白名單

NSURL *url = [NSURL URLWithString:@"sinaweibo://"];
    UIApplication *app = [UIApplication sharedApplication];
    if ([app canOpenURL:url]) {
        [app openURL:url];
    }else{
        NSLog(@"無(wú)法跳轉(zhuǎn)到微博");
    }

進(jìn)階:攔截參數(shù) -> 從MyApp跳轉(zhuǎn)到Y(jié)ourApp 二級(jí)頁(yè)面- Page2

  • MyApp配置
- (IBAction)gotoYourApp:(UIButton *)sender {
    NSURL *url = [NSURL URLWithString:@"YourApp://aaa?backScheme=MyApp"];
    UIApplication *app = [UIApplication sharedApplication];
    if ([app canOpenURL:url]) {
        [app openURL:url];
    }else{
        NSLog(@"打開(kāi)應(yīng)用程序失敗");
    }
}

- (IBAction)gotoYourAppP2:(UIButton *)sender {
    NSURL *url = [NSURL URLWithString:@"YourApp://bbb?backScheme=MyApp"];
    UIApplication *app = [UIApplication sharedApplication];
    if ([app canOpenURL:url]) {
        [app openURL:url];
    }else{
        NSLog(@"打開(kāi)應(yīng)用程序P2失敗");
    }
}
  • YourApp配置
 #import Appdelegate

-(BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation{
    ***獲取
    NSLog(@"%@",url.absoluteString);

    ***獲取導(dǎo)航控制
    UINavigationController *navi = (UINavigationController *)self.window.rootViewController;
    ViewController *mainVc = (ViewController *)navi.topViewController;
    NSString *urlString = url.absoluteString;
    NSRange range = [urlString rangeOfString:@"backScheme="];
    
    if (range.length > 0) {
        NSInteger fromInteger = range.location + range.length;
        NSString *backStr = [urlString substringFromIndex:fromInteger];
        mainVc.backScheme = backStr;
        NSLog(@"backStr:%@",backStr);/*****打印結(jié)果:`MyApp`
    }
    
    ***開(kāi)始跳轉(zhuǎn)到P2
    if ([urlString hasPrefix:@"YourApp://bbb"]) {
        [mainVc performSegueWithIdentifier:@"page2Segie" sender:nil];
    }
    return YES;
}

```
```
#import "ViewController.h"
- (IBAction)gotoMyApp:(UIButton *)sender {
//    NSURL *url = [NSURL URLWithString:@"MyApp://"];
    NSURL *url = [NSURL URLWithString:[NSString stringWithFormat:@"%@://",self.backScheme]];
    UIApplication *app = [UIApplication sharedApplication];
    if ([app canOpenURL:url]) {
        [app openURL:url];
    }else{
        NSLog(@"打開(kāi)應(yīng)用程序失敗");
    }
}
```

>以下為APP跳轉(zhuǎn)的三種方法

**方法一:已經(jīng)拋棄**

```
-(BOOL)application:(UIApplication *)application handleOpenURL:(NSURL *)url
```

**方法二:ios9剛過(guò)時(shí) 目前使用(為了防止IOS版本不足)**

```
-(BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation{
    NSLog(@"%@",url.absoluteString);
    return YES;
}
```

**方法三:ios9之后出現(xiàn)**

```
-(BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary<NSString *,id> *)options{
    
}
```

# 6. 靜態(tài)庫(kù)
>概念:在我們的應(yīng)用中由一些共用的代碼,需要反復(fù)使用,并且希望隱藏代碼具體的實(shí)現(xiàn)就可以把這部分代碼做成靜態(tài)庫(kù).如果不提供源代碼叫閉源庫(kù),如果提供的是源代碼叫開(kāi)源庫(kù)

- 1 如何制作靜態(tài)庫(kù)?
```
    framework(可能是靜態(tài) 也可能是動(dòng)態(tài)) - (增加頭文件:Target -> BuildPhases ->CopyFiles)
```
- 2 如何使用靜態(tài)庫(kù)
    1. 真機(jī)使用真機(jī)庫(kù)  2. 模擬器使用模擬器庫(kù)

終端合成兩個(gè)文件
 ```
lipo -create/路徑/Debug-iphoneos/libStaticLibrary.a /路徑/Debug-iphonesimulator/libStaticLibrary.a -output/目標(biāo)地址/libStaticLibraryFile.a
```
合成完成了岗仑,就可以使用了。把.h文件和合成的.a文件放入你的工程中炬称。

# 7. 推送
>概述:不在前臺(tái)的應(yīng)用通知,如果程序內(nèi)部發(fā)生了一些用戶(hù)感興趣的,推送通知可以告知用戶(hù)發(fā)生了哪些事情伞广。通知是一種消息機(jī)制拣帽。分為本地推送和遠(yuǎn)程推送通知。

四種形式:APP激活狀態(tài)(前臺(tái)or后臺(tái))     APP徹底關(guān)閉(通知進(jìn)入or圖標(biāo)進(jìn)入)

#####推送通知的表現(xiàn)形式
- 1 頂部橫幅 
- 2 中間提醒 (`其中頂部視圖和中間視圖只能二選一`)
- 3 鎖屏提示
- 4 圖標(biāo)數(shù)字
- 5 通知中心(從上向下滑動(dòng)屏幕)

#####特點(diǎn)
-  APP關(guān)閉時(shí),可以接收并顯示通知
-  APP打開(kāi),并處于后臺(tái).可以接收并顯示通知
-  APP打開(kāi)并處于前臺(tái),不會(huì)接收通知且不會(huì)顯示通知
-  點(diǎn)擊通知后,默認(rèn)會(huì)自動(dòng)打開(kāi)發(fā)出通知的APP

##1. 本地通知
  >概述:不需要連接互聯(lián)網(wǎng),就可以發(fā)出的通知,不需要服務(wù)器的支持嚼锄。本地通知是本地應(yīng)用程序發(fā)出的,它是基于時(shí)間行為的一種通知减拭。例如:鬧鐘定時(shí)、待辦事項(xiàng)提醒区丑、內(nèi)存清理提醒

`注意`:iOS8.0 以后需要申請(qǐng)用戶(hù)同意
```
獲取用戶(hù)設(shè)備系統(tǒng)版本:[UIDevice currentDevice].systemVersion.floatValue
```

**本地通知使用步驟:**

1. 創(chuàng)建一個(gè)本地通知UILocalNotification
```
#import "AppDelegate.h"
UIUserNotificationSettings *settings = [UIUserNotificationSettings settingsForTypes:UIUserNotificationTypeAlert | UIUserNotificationTypeSound | UIUserNotificationTypeBadge categories:nil];
        [[UIApplication sharedApplication]registerUserNotificationSettings:settings];
```
2. 設(shè)置本地通知(啟動(dòng)時(shí)間 內(nèi)容 主題 聲音 圖標(biāo)數(shù)字)
3. 配置自定義的參數(shù)userInfo(`非必須`)
4. 調(diào)度通知(scheduleLocalNotification計(jì)劃執(zhí)行 or 馬上執(zhí)行)

_本地通知屬性介紹:_

```
觸發(fā)時(shí)間  @property(nullable, nonatomic,copy) NSDate *fireDate;  
顯示內(nèi)容  @property(nullable, nonatomic,copy) NSString *alertBody;
通知標(biāo)題  @property(nullable, nonatomic,copy) NSString *alertTitle;
聲音提示  @property(nullable, nonatomic,copy) NSString *soundName;
圖標(biāo)數(shù)字  @property(nullable, nonatomic,assign) NSInteger applicationIconBadgeNumber;
鎖屏?xí)r    @property(nullable, nonatomic,copy) NSString *alertAction;
通知間隔  @property(nullable, nonatomic,assign) NSCalendarUnit  *repeatCanlendar;
點(diǎn)擊通知顯示圖片 @property(nullable, nonatomic,copy) NSString *alertLaunchImage;
傳參數(shù)    @property(nullable, nonatomic,copy) NSDictionary *userInfo;  ->userInfo[@"username"] = @"xxx"  -> localNoti.userInfo = userInfo;;
```

###本地通知的接收
##### App沒(méi)有徹底關(guān)閉的時(shí)候(在前臺(tái)或者后臺(tái)),執(zhí)行以下方法

```
#import "AppDelegate.h"
-(void)application:(UIApplication *)application didReceiveLocalNotification:(UILocalNotification *)notification{
    **判斷APP是否處于前臺(tái)**
    if (application.applicationState == UIApplicationStateActive) {
        NSLog(@"通知來(lái)了");
    }else{
        NSLog(@"進(jìn)入查看");
        NSLog(@"接收到本地通知");
        NSLog(@"%@",notification.userInfo[@"username"]);
    }
}
```
#####App徹底關(guān)閉,執(zhí)行以下方法
**判斷程序是通過(guò)點(diǎn)擊圖片進(jìn)入 還是 通過(guò)點(diǎn)擊通知進(jìn)入**
- launchOptions 非空  證明是點(diǎn)擊通知進(jìn)入的
     ->通過(guò)key:UIApplicationLaunchOptionsLocalNoticifationKey取得通知對(duì)象
- launchOptions 是空 則使用點(diǎn)擊圖標(biāo)進(jìn)入的

```
#import "AppDelegate.h"
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    if (launchOptions) {
        label.text = [NSString stringWithFormat:@"點(diǎn)擊通知進(jìn)入:%@",launchOptions[UIApplicationLaunchOptionsLocalNotificationKey]];
     }else
         {
  label.text = @"圖標(biāo)啟動(dòng) 進(jìn)入主界面";
         }
}
```

**取消通知**

```
取消某個(gè)通知 [[UIApplication sharedApplication]cancelLocalNotification:<#(nonnull UILocalNotification *)#>];
全部通知移除 [[UIApplication sharedApplication]cancelAllLocalNotifications];
```

##2. 遠(yuǎn)程通知
>需要聯(lián)網(wǎng)并且需要服務(wù)器的支持,在聯(lián)網(wǎng)狀態(tài)下,所有的Apple設(shè)備都會(huì)和Apple的服務(wù)器保持長(zhǎng)連接拧粪。
長(zhǎng)連接的作用:時(shí)間校準(zhǔn)、系統(tǒng)升級(jí)沧侥、查找我的iphone可霎、傳輸速度快

1. APNS(Apple Push Notification Service)流程
 - 1  -App 向IOS注冊(cè)遠(yuǎn)程推送請(qǐng)求,iOS就會(huì)發(fā)送請(qǐng)求到APNS服務(wù)器
 - 2  -APNS 返回device_token (設(shè)備標(biāo)識(shí)+App標(biāo)識(shí)),最終交給App
 - 3  -App 將device_token交給 企業(yè)的PUSH服務(wù)器程序
 - 4  -當(dāng)企業(yè)服務(wù)器認(rèn)為需要推送某些消息時(shí),就會(huì)發(fā)請(qǐng)求到APNS
 - 5  -APNS根據(jù)企業(yè)PUSH服務(wù)器的請(qǐng)求推送通知到對(duì)應(yīng)的App

2. 申請(qǐng)證書(shū)[Apple開(kāi)發(fā)者中心](https://developer.apple.com)
創(chuàng)建證書(shū)過(guò)程中需要CSR(Certificate Signing Request)文件
       準(zhǔn)備:創(chuàng)建CSR文件: LaunchPad - 其他 - 鑰匙串 - 我的證書(shū) - 證書(shū)助理 - 從證書(shū)頒發(fā)機(jī)構(gòu)請(qǐng)求證書(shū)
例子@[1](http://www.reibang.com/p/585291fd9226) @[2](http://www.reibang.com/p/e59bca4a1ac3)
實(shí)現(xiàn)推送通知流程:
 - 1.登錄開(kāi)發(fā)者中心,點(diǎn)擊推送證書(shū)功能
 - 2.由于一個(gè)開(kāi)發(fā)者賬號(hào)只能在一個(gè)機(jī)器上使用,需要廢除原來(lái)注冊(cè)的賬號(hào),重新注冊(cè)。Certificate->All->Developer -> iOS App revoke
 - 3.上傳生成的CSR文件-> 下載證書(shū)(1)
 `注意:留意OSX的WWDR根證書(shū)是否已經(jīng)過(guò)期,如果過(guò)期,需要到Apple開(kāi)發(fā)者中心下載并重新安裝` 
 - 4.生成配置AppIDs推送證書(shū),到Apple開(kāi)發(fā)者網(wǎng)站申請(qǐng)一個(gè)應(yīng)用的標(biāo)識(shí)(也叫套裝id)
步驟:Identifiers->AppIDs->"+"->填寫(xiě)App描述->填寫(xiě)B(tài)undleID->勾選需要服務(wù)(Push Notifications)(2)
 - 5.添加了App ID后,利用AppID創(chuàng)建開(kāi)發(fā)階段推送證書(shū)Certificate -> Development  -> "+" -> 選擇"Apple Push Notification Server" SSL -> 選擇這個(gè)推送證書(shū)所對(duì)應(yīng)的App ID -> CSR文件上傳以及下載
 - 6.申請(qǐng)發(fā)布證書(shū)
 - 7.添加測(cè)試設(shè)備:Device (在X-code 的windon中可以查看真機(jī)ID)-> 結(jié)合真機(jī)+應(yīng)用ID 生成證書(shū)

##3.[極光推送](https://www.jpush.cn)
 - 1 注冊(cè)賬號(hào)
 - 2 獲取APPKEY APPSECRET使用從Apple獲得的兩個(gè)證書(shū)`(產(chǎn)品證書(shū)&推送證書(shū))`,在鑰匙串中導(dǎo)出 ".p12" 類(lèi)型證書(shū)
 - 3 按照官方sdk文檔配置 導(dǎo)入lib 導(dǎo)入依賴(lài)的框架 設(shè)施PushConfig.plish 拷貝相應(yīng)代碼到APPDelegate.h中
  - 3.1 導(dǎo)入SDK開(kāi)發(fā)文件,將解壓后的lib子文件夾(包含APService.h正什、libPushSDK.a)添加到你的工程目錄中)
  - 3.2 導(dǎo)入框架
```
CFNetwork.framework
CoreFoundation.framework
CoreTelephony.framework
SystemConfiguration.framework
CoreGraphics.framework 
Foundation.framework
UIKit.framework
Security.framework
libz.dylib
```

  - 3.3 創(chuàng)建并配置PushConfig.plist文件
        在工程中創(chuàng)建一個(gè)新的PropertyList文件,并將其命名為PushConfig.plist,填入Portal為你的應(yīng)用提供的APP_KEY等參數(shù)

    ```
    "APS_FOR_PRODUCTION = "0"; 
    "CHANNEL" = "Publish channel";
    "APP_KEY" = "AppKey copied from JPush Portal application";
    ```
  - 3.4 代碼轉(zhuǎn)移

##8. 產(chǎn)品上架
  - 1 [在開(kāi)發(fā)者網(wǎng)站](https://developer.apple.com)申請(qǐng)一個(gè)App id(套裝id)
  - 2 修改bundleid和注冊(cè)的id一致
  - 3 登錄 [iTunes Connect](https://itunesconnect.apple.com) ->我的APP -> 新建APP工程(提交Appid)
  - 4 打包產(chǎn)品:通用設(shè)備或者真機(jī) ->Product ->Archive
  - 5 返回 [iTunes Connect](https://itunesconnect.apple.com) 填寫(xiě)應(yīng)用信息

移動(dòng)開(kāi)發(fā)過(guò)程:
1.了解需要實(shí)現(xiàn)功能,什么類(lèi)型 2.產(chǎn)品經(jīng)理估價(jià) 工期評(píng)估 3.簽訂合同 4. 形成效果圖UI/UE (客戶(hù)確認(rèn)) 5.正式研發(fā)階段

移動(dòng)應(yīng)用開(kāi)發(fā)步驟:
    1. 規(guī)劃UI  2. 設(shè)計(jì)數(shù)據(jù)操作與存儲(chǔ) 3. 跳轉(zhuǎn)多頁(yè)面實(shí)現(xiàn) 4. 實(shí)現(xiàn)功能 5. 完善特性與細(xì)節(jié) 6. 移動(dòng)應(yīng)用程序測(cè)試 7. 打包簽名發(fā)布
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末啥纸,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子婴氮,更是在濱河造成了極大的恐慌斯棒,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,743評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件主经,死亡現(xiàn)場(chǎng)離奇詭異荣暮,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)罩驻,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,296評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門(mén)穗酥,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人惠遏,你說(shuō)我怎么就攤上這事砾跃。” “怎么了节吮?”我有些...
    開(kāi)封第一講書(shū)人閱讀 157,285評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵抽高,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我透绩,道長(zhǎng)翘骂,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,485評(píng)論 1 283
  • 正文 為了忘掉前任帚豪,我火速辦了婚禮碳竟,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘狸臣。我一直安慰自己莹桅,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,581評(píng)論 6 386
  • 文/花漫 我一把揭開(kāi)白布烛亦。 她就那樣靜靜地躺著诈泼,像睡著了一般。 火紅的嫁衣襯著肌膚如雪此洲。 梳的紋絲不亂的頭發(fā)上厂汗,一...
    開(kāi)封第一講書(shū)人閱讀 49,821評(píng)論 1 290
  • 那天,我揣著相機(jī)與錄音呜师,去河邊找鬼娶桦。 笑死,一個(gè)胖子當(dāng)著我的面吹牛汁汗,可吹牛的內(nèi)容都是我干的衷畦。 我是一名探鬼主播,決...
    沈念sama閱讀 38,960評(píng)論 3 408
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼知牌,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼祈争!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起角寸,我...
    開(kāi)封第一講書(shū)人閱讀 37,719評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤菩混,失蹤者是張志新(化名)和其女友劉穎忿墅,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體沮峡,經(jīng)...
    沈念sama閱讀 44,186評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡疚脐,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,516評(píng)論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了邢疙。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片棍弄。...
    茶點(diǎn)故事閱讀 38,650評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖疟游,靈堂內(nèi)的尸體忽然破棺而出呼畸,到底是詐尸還是另有隱情,我是刑警寧澤颁虐,帶...
    沈念sama閱讀 34,329評(píng)論 4 330
  • 正文 年R本政府宣布蛮原,位于F島的核電站,受9級(jí)特大地震影響聪廉,放射性物質(zhì)發(fā)生泄漏瞬痘。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,936評(píng)論 3 313
  • 文/蒙蒙 一板熊、第九天 我趴在偏房一處隱蔽的房頂上張望框全。 院中可真熱鬧,春花似錦干签、人聲如沸津辩。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,757評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)喘沿。三九已至,卻和暖如春竭贩,著一層夾襖步出監(jiān)牢的瞬間蚜印,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,991評(píng)論 1 266
  • 我被黑心中介騙來(lái)泰國(guó)打工留量, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留窄赋,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,370評(píng)論 2 360
  • 正文 我出身青樓楼熄,卻偏偏與公主長(zhǎng)得像忆绰,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子可岂,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,527評(píng)論 2 349

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

  • 概述 在多數(shù)移動(dòng)應(yīng)用中任何時(shí)候都只能有一個(gè)應(yīng)用程序處于活躍狀態(tài)错敢,如果其他應(yīng)用此刻發(fā)生了一些用戶(hù)感興趣的那么通過(guò)通知...
    莫離_焱閱讀 6,498評(píng)論 1 8
  • “推送通知?喔缕粹,不稚茅!”纸淮。是的,這就是我被叫去實(shí)現(xiàn)一個(gè) iOS 應(yīng)用中的推送通知功能時(shí)峰锁,腦海中閃過(guò)的第一念頭萎馅,而且我...
    王小賓閱讀 2,741評(píng)論 0 2
  • 作者:Gabriel Theodoropoulos双戳,原文鏈接虹蒋,原文日期:2016-01-27譯者:bestswif...
    梁杰_numbbbbb閱讀 1,245評(píng)論 1 14
  • 來(lái)源:崔江濤的博客 概述在多數(shù)移動(dòng)應(yīng)用中任何時(shí)候都只能有一個(gè)應(yīng)用程序處于活躍狀態(tài),如果其他應(yīng)用此刻發(fā)生了一些用戶(hù)感...
    李棲桐閱讀 922評(píng)論 0 0
  • 對(duì)床的舍友剛剛和男友大吵了一架飒货,整個(gè)宿舍尷尬的有點(diǎn)過(guò)分魄衅。宋歌起身倒了杯熱水,遞給這個(gè)滿(mǎn)面梨花的姑娘塘辅。也許在這個(gè)時(shí)候...
    林之初閱讀 569評(píng)論 0 1