2019-07-25 11:34:08 W2i0l1l5y 阅读数 198
  • iOS开发-全面解析iOS蓝牙BLE4.0开发

    只要你会OC基础,会写HelloWorld,你就可以实现iOS的蓝牙通信功能,实现蓝牙小项目也不在话下,作者会带领大家详细分析BLE4.0原理,通过分析xcode使用的蓝牙API,让学者能够得心应手的实现蓝牙BLE4.0的开发

    3673 人正在学习 去看看 许英俊

本人机器提示语如下:
/Assets.xcassets:-1: Failed to find a suitable device for the type IBSimDeviceTypeiPad2x (com.apple.dt.Xcode.IBSimDeviceType.iPad-2x) with runtime iOS 12.4 (12.4 - 16G73) - com.apple.CoreSimulator.SimRuntime.iOS-12-4

处理办法:
 1. 打开本地文件目录  ~/Library/Developer/CoreSimulator/Profiles/Runtimes folder 清空
 2. 重启 Xcode,cmd + shift +k 多clean几遍
 3. 运行Xcode

此时可能会出现 xib文件布局错乱的情况,而且是全部xib都出了问题,查看xib页面,没有具体的爆红提示。此时关闭Xcode 重启,如果无效,再关机重启电脑------>重启Xcode-------->clean------>运行。问题消失。

2019-09-11 11:28:12 shifang07 阅读数 135
  • iOS开发-全面解析iOS蓝牙BLE4.0开发

    只要你会OC基础,会写HelloWorld,你就可以实现iOS的蓝牙通信功能,实现蓝牙小项目也不在话下,作者会带领大家详细分析BLE4.0原理,通过分析xcode使用的蓝牙API,让学者能够得心应手的实现蓝牙BLE4.0的开发

    3673 人正在学习 去看看 许英俊

1.下面通过一个实例来体会一下MVVM架构模式,下面是该工程的一级目录如下,每层之间的交互是用Block的形式来实现的

在这里插入图片描述

工程目录说明:

1.Request:文件夹下存储网络请求的类,下面会给出具体的实现

2.Config:就是工程的配置文件

3.Resource:就是工程的资源文件,下面有图片资源和Storyboard文件资源

4.Tools是:工具文件类,存放工具类,比如数据正则匹配等。

5.Vender:存放第三方类库

6.Model:这个就不多说了

7.ViewController:存放ViewController类资源文件,也就是View层

8.ViewModel:存放各种业务逻辑和网络请求

2.详解Request:Request负责网络请求的东西,具体如下:

在这里插入图片描述
NetRequestClass是存放网络请求的代码,本工程用的AF,因为本工程只是一个Demo,所以就只封装了监测网络状态,GET请求,POST请求方法,根据现实需要,还可以封装上传下载等类方法。

NetRequestClass.h中的代码如下:

//
  //  NetRequestClass.h
  //  MVVMTest
  //
  //  Created by 李泽鲁 on 15/1/6.
  //  Copyright (c) 2015年 李泽鲁. All rights reserved.
  //
 
 #import <Foundation/Foundation.h>
 
 @interface NetRequestClass : NSObject
 
 #pragma 监测网络的可链接性
 + (BOOL) netWorkReachabilityWithURLString:(NSString *) strUrl;
 
 #pragma POST请求
 + (void) NetRequestPOSTWithRequestURL: (NSString *) requestURLString
                         WithParameter: (NSDictionary *) parameter
                  WithReturnValeuBlock: (ReturnValueBlock) block
                    WithErrorCodeBlock: (ErrorCodeBlock) errorBlock
                      WithFailureBlock: (FailureBlock) failureBlock;
 
 #pragma GET请求
 + (void) NetRequestGETWithRequestURL: (NSString *) requestURLString
                         WithParameter: (NSDictionary *) parameter
                 WithReturnValeuBlock: (ReturnValueBlock) block
                   WithErrorCodeBlock: (ErrorCodeBlock) errorBlock
                     WithFailureBlock: (FailureBlock) failureBlock;
 
 @end

NetRequestClass.m中的代码如下:

//
   //  NetRequestClass.m
   //  MVVMTest
   //
   //  Created by 李泽鲁 on 15/1/6.
   //  Copyright (c) 2015年 李泽鲁. All rights reserved.
   //
 
   #import "NetRequestClass.h"
 
  @interface NetRequestClass ()
 
  @end
 
  @implementation NetRequestClass
  #pragma 监测网络的可链接性
  + (BOOL) netWorkReachabilityWithURLString:(NSString *) strUrl
  {
      __block BOOL netState = NO;
 
      NSURL *baseURL = [NSURL URLWithString:strUrl];
 
      AFHTTPRequestOperationManager *manager = [[AFHTTPRequestOperationManager alloc] initWithBaseURL:baseURL];
 
      NSOperationQueue *operationQueue = manager.operationQueue;
 
      [manager.reachabilityManager setReachabilityStatusChangeBlock:^(AFNetworkReachabilityStatus status) {
          switch (status) {
              case AFNetworkReachabilityStatusReachableViaWWAN:
              case AFNetworkReachabilityStatusReachableViaWiFi:
                  [operationQueue setSuspended:NO];
                  netState = YES;
                  break;
              case AFNetworkReachabilityStatusNotReachable:
                  netState = NO;
              default:
                  [operationQueue setSuspended:YES];
                  break;
          }
      }];
 
      [manager.reachabilityManager startMonitoring];
 
      return netState;
  }
 
  /***************************************
   在这做判断如果有dic里有errorCode
   调用errorBlock(dic)
   没有errorCode则调用block(dic
   ******************************/
 
  #pragma --mark GET请求方式
  + (void) NetRequestGETWithRequestURL: (NSString *) requestURLString
                         WithParameter: (NSDictionary *) parameter
                  WithReturnValeuBlock: (ReturnValueBlock) block
                    WithErrorCodeBlock: (ErrorCodeBlock) errorBlock
                      WithFailureBlock: (FailureBlock) failureBlock
  {
      AFHTTPRequestOperationManager *manager = [[AFHTTPRequestOperationManager alloc] init];
 
      AFHTTPRequestOperation *op = [manager GET:requestURLString parameters:parameter success:^(AFHTTPRequestOperation *operation, id responseObject) {
          NSDictionary *dic = [NSJSONSerialization JSONObjectWithData:responseObject options:NSJSONReadingAllowFragments error:nil];
          DDLog(@"%@", dic);
 
          block(dic);
 
      } failure:^(AFHTTPRequestOperation *operation, NSError *error) {
          failureBlock();
      }];
 
      op.responseSerializer = [AFHTTPResponseSerializer serializer];
 
      [op start];
 
  }
 
  #pragma --mark POST请求方式
 
  + (void) NetRequestPOSTWithRequestURL: (NSString *) requestURLString
                          WithParameter: (NSDictionary *) parameter
                   WithReturnValeuBlock: (ReturnValueBlock) block
                     WithErrorCodeBlock: (ErrorCodeBlock) errorBlock
                       WithFailureBlock: (FailureBlock) failureBlock
  {
      AFHTTPRequestOperationManager *manager = [[AFHTTPRequestOperationManager alloc] init];
 
      AFHTTPRequestOperation *op = [manager POST:requestURLString parameters:parameter success:^(AFHTTPRequestOperation *operation, id responseObject) {
          NSDictionary *dic = [NSJSONSerialization JSONObjectWithData:responseObject options:NSJSONReadingAllowFragments error:nil];
 
          DDLog(@"%@", dic);
 
          block(dic);
          /***************************************
           在这做判断如果有dic里有errorCode
           调用errorBlock(dic)
           没有errorCode则调用block(dic
          ******************************/
 
     } failure:^(AFHTTPRequestOperation *operation, NSError *error) {
         failureBlock();
     }];
 
     op.responseSerializer = [AFHTTPResponseSerializer serializer];
 
     [op start];
 
 }
 
 @end

3.详解Config:创建pch文件,和Config.h文件

//
  //  Config.h
  //  MVVMTest
  //
  //  Created by 李泽鲁 on 15/1/6.
  //  Copyright (c) 2015年 李泽鲁. All rights reserved.
 //
 
  #ifndef MVVMTest_Config_h
 #define MVVMTest_Config_h
 
 //定义返回请求数据的block类型
 typedef void (^ReturnValueBlock) (id returnValue);
 typedef void (^ErrorCodeBlock) (id errorCode);
 typedef void (^FailureBlock)();
 typedef void (^NetWorkBlock)(BOOL netConnetState);
 
 #define DDLog(xx, ...)  NSLog(@"%s(%d): " xx, __PRETTY_FUNCTION__, __LINE__, ##__VA_ARGS__)
 
 //accessToken
 #define ACCESSTOKEN @"你自己的access_token"
 
 //请求公共微博的网络接口
 #define REQUESTPUBLICURL @"https://api.weibo.com/2/statuses/public_timeline.json"
 
 #define SOURCE @"source"
 #define TOKEN @"access_token"
 #define COUNT @"count"
 
 #define STATUSES @"statuses"
 #define CREATETIME @"created_at"
 #define WEIBOID @"id"
 #define WEIBOTEXT @"text"
 #define USER @"user"
 #define UID @"id"
 #define HEADIMAGEURL @"profile_image_url"
 #define USERNAME @"screen_name"
 
 #endif

4.详解Model:本工程用的是请求公共微博接口我们需要在页面上现实用户的头像,用户名,发布日期,博文,已经隐式的用户ID和微博ID,文件目录结构如下:在这里插入图片描述

PublicModel中的内容如下:

//
  //  PublicModel.h
  //  MVVMTest
 //
  //  Created by 李泽鲁 on 15/1/8.
  //  Copyright (c) 2015年 李泽鲁. All rights reserved.
  //
 
  #import <Foundation/Foundation.h>
 
 @interface PublicModel : NSObject
 @property (strong, nonatomic) NSString *userId;
 @property (strong, nonatomic) NSString *weiboId;
 @property (strong, nonatomic) NSString *userName;
 @property (strong, nonatomic) NSURL *imageUrl;
 @property (strong, nonatomic) NSString *date;
 @property (strong, nonatomic) NSString *text;
 
 @end

4.详解ViewModel层,本层是最为重要的一层,下面是本层的详细截图,ViewModeClass是所有ViewMode的父类,其中存储着共同部分在这里插入图片描述

ViewModelClass.h中的内容如下:

//
  //  ViewModelClass.h
  //  MVVMTest
  //
 //  Created by 李泽鲁 on 15/1/8.
  //  Copyright (c) 2015年 李泽鲁. All rights reserved.
  //
 
 #import "ViewModelClass.h"
 @implementation ViewModelClass
 @interface ViewModelClass : NSObject
 
 @property (strong, nonatomic) ReturnValueBlock returnBlock;
 @property (strong, nonatomic) ErrorCodeBlock errorBlock;
 @property (strong, nonatomic) FailureBlock failureBlock;
 
 //获取网络的链接状态
 -(void) netWorkStateWithNetConnectBlock: (NetWorkBlock) netConnectBlock WithURlStr: (NSString *) strURl;
 
 // 传入交互的Block块
 -(void) setBlockWithReturnBlock: (ReturnValueBlock) returnBlock
                  WithErrorBlock: (ErrorCodeBlock) errorBlock
                WithFailureBlock: (FailureBlock) failureBlock;
 @end

ViewModelClass.m中的内容如下:

//
  //  ViewModelClass.m
  //  MVVMTest
  //
  //  Created by 李泽鲁 on 15/1/8.
  //  Copyright (c) 2015年 李泽鲁. All rights reserved.
  //
 
  #import "ViewModelClass.h"
 @implementation ViewModelClass
 
 #pragma 获取网络可到达状态
 -(void) netWorkStateWithNetConnectBlock: (NetWorkBlock) netConnectBlock WithURlStr: (NSString *) strURl;
 {
     BOOL netState = [NetRequestClass netWorkReachabilityWithURLString:strURl];
     netConnectBlock(netState);
 }
 
 #pragma 接收穿过来的block
 -(void) setBlockWithReturnBlock: (ReturnValueBlock) returnBlock
                  WithErrorBlock: (ErrorCodeBlock) errorBlock
                WithFailureBlock: (FailureBlock) failureBlock
 {
     _returnBlock = returnBlock;
     _errorBlock = errorBlock;
     _failureBlock = failureBlock;
 }
 
 @end

PublicWeiboViewModel.h中的内容如下:

//
  //  PublicWeiboViewModel.h
  //  MVVMTest
  //
  //  Created by 李泽鲁 on 15/1/8.
  //  Copyright (c) 2015年 李泽鲁. All rights reserved.
  //
 
  #import "ViewModelClass.h"
  #import "PublicModel.h"
 
 @interface PublicWeiboViewModel : ViewModelClass
 //获取围脖列表
 -(void) fetchPublicWeiBo;
 
 //跳转到微博详情页
 -(void) weiboDetailWithPublicModel: (PublicModel *) publicModel WithViewController: (UIViewController *)superController;
 @end

PublicWeiboViewModel.m中的内容如下:

//
   //  PublicWeiboViewModel.m
   //  MVVMTest
   //
  //  Created by 李泽鲁 on 15/1/8.
   //  Copyright (c) 2015年 李泽鲁. All rights reserved.
   //
 
   #import "PublicWeiboViewModel.h"
  #import "PublicDetailViewController.h"
 
  @implementation PublicWeiboViewModel
 
  //获取公共微博
  -(void) fetchPublicWeiBo
 {
      NSDictionary *parameter = @{TOKEN: ACCESSTOKEN,
                                 COUNT: @"100"
                                  };
      [NetRequestClass NetRequestGETWithRequestURL:REQUESTPUBLICURL WithParameter:parameter WithReturnValeuBlock:^(id returnValue) {
 
          DDLog(@"%@", returnValue);
          [self fetchValueSuccessWithDic:returnValue];
 
      } WithErrorCodeBlock:^(id errorCode) {
          DDLog(@"%@", errorCode);
          [self errorCodeWithDic:errorCode];
 
      } WithFailureBlock:^{
          [self netFailure];
         DDLog(@"网络异常");
 
      }];
 
  }
 
  #pragma 获取到正确的数据,对正确的数据进行处理
  -(void)fetchValueSuccessWithDic: (NSDictionary *) returnValue
  {
      //对从后台获取的数据进行处理,然后传给ViewController层进行显示
 
      NSArray *statuses = returnValue[STATUSES];
      NSMutableArray *publicModelArray = [[NSMutableArray alloc] initWithCapacity:statuses.count];
 
      for (int i = 0; i ) {
          PublicModel *publicModel = [[PublicModel alloc] init];
 
          //设置时间
          NSDateFormatter *iosDateFormater=[[NSDateFormatter alloc]init];
          iosDateFormater.dateFormat=@"EEE MMM d HH:mm:ss Z yyyy";
 
          //必须设置,否则无法解析
          iosDateFormater.locale=[[NSLocale alloc]initWithLocaleIdentifier:@"en_US"];
          NSDate *date=[iosDateFormater dateFromString:statuses[i][CREATETIME]];
 
          //目的格式
          NSDateFormatter *resultFormatter=[[NSDateFormatter alloc]init];
          [resultFormatter setDateFormat:@"MM月dd日 HH:mm"];
 
          publicModel.date = [resultFormatter stringFromDate:date];
          publicModel.userName = statuses[i][USER][USERNAME];
          publicModel.text = statuses[i][WEIBOTEXT];
          publicModel.imageUrl = [NSURL URLWithString:statuses[i][USER][HEADIMAGEURL]];
          publicModel.userId = statuses[i][USER][UID];
          publicModel.weiboId = statuses[i][WEIBOID];
 
          [publicModelArray addObject:publicModel];
 
      }
 
      self.returnBlock(publicModelArray);
  }
 
  #pragma 对ErrorCode进行处理
  -(void) errorCodeWithDic: (NSDictionary *) errorDic
  {
      self.errorBlock(errorDic);
  }
 
  #pragma 对网路异常进行处理
  -(void) netFailure
  {
      self.failureBlock();
  }
 
  #pragma 跳转到详情页面,如需网路请求的,可在此方法中添加相应的网络请求
  -(void) weiboDetailWithPublicModel: (PublicModel *) publicModel WithViewController:(UIViewController *)superController
  {
      DDLog(@"%@,%@,%@",publicModel.userId,publicModel.weiboId,publicModel.text);
      UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Main" bundle:[NSBundle mainBundle]];
      PublicDetailViewController *detailController = [storyboard instantiateViewControllerWithIdentifier:@"PublicDetailViewController"];
      detailController.publicModel = publicModel;
      [superController.navigationController pushViewController:detailController animated:YES];
 
  }
 
 @end

6.ViewController层的目录结构如下:

在这里插入图片描述

运行的最终效果:

在这里插入图片描述

7.完整目录结构,页面间的业务逻辑,和网络的请求数据是放在ViewModel层的,当然了这也不是绝对的,要灵活把握。

在这里插入图片描述

DEMO的:GitHub下载地址:https://github.com/lizelu/MVVM

转载

https://www.cnblogs.com/yulang314/p/5104064.html

2017-10-02 00:00:00 olsQ93038o99S 阅读数 295
  • iOS开发-全面解析iOS蓝牙BLE4.0开发

    只要你会OC基础,会写HelloWorld,你就可以实现iOS的蓝牙通信功能,实现蓝牙小项目也不在话下,作者会带领大家详细分析BLE4.0原理,通过分析xcode使用的蓝牙API,让学者能够得心应手的实现蓝牙BLE4.0的开发

    3673 人正在学习 去看看 许英俊
2016-02-25 11:56:12 LXL_815520 阅读数 3777
  • iOS开发-全面解析iOS蓝牙BLE4.0开发

    只要你会OC基础,会写HelloWorld,你就可以实现iOS的蓝牙通信功能,实现蓝牙小项目也不在话下,作者会带领大家详细分析BLE4.0原理,通过分析xcode使用的蓝牙API,让学者能够得心应手的实现蓝牙BLE4.0的开发

    3673 人正在学习 去看看 许英俊

iOS证书(.p12)和描述文件(.mobileprovision)申请


第一部分:关于证书和描述文件

iOS有两种证书和描述文件:

证书类型 使用场景
开发(Development)证书和描述文件 用于开发测试,在HBuilder中打包后可在真机环境通过Safari调试
发布(Distribution)证书和描述文件 用于提交Appstore,在HBuilder中打包后可使用Application Loader提交到Appstore审核发布

所需环境

  • 必需要有苹果开发者账号,并且加入了“iOS Developer Program”

  • Mac OS 10.9以上系统(如果已经申请p12证书则不需要)


登录iOS Dev Center

打开网站 https://developer.apple.com/ios/download/
使用苹果开发者账号登录iOS Dev Center:

登录成功后在页面右侧选择“Certificates, Identifiers & Profiles”:
在“Certificates, Identifiers & Profiles”页面的“iOS Apps”栏中任选一项,如“Certificates”:
打开“iOS Certificates”页面,可以看到所有已经申请的证书及描述文件:

.申请苹果App ID

(如果已经申请,可跳过此节)
在“iOS Certificates”页面“Identifiers"下选择“App IDs",可查看到已申请的所有App ID,点击右上角的加号可创建新“App ID”:

打开“Register iOS App ID”页面,在“App ID Description”栏下的“Name”项中输入名称(如“HBuilderApp”),Name叫做什么不重要,主要的目的是为了让你便于识别自己创建AppID:
在“Explicit App ID”栏下的“Bundle ID”项中输入App ID(使用反向域名格式字符串,如“io.dcloud.HBuilderApp”):
注意:HBuilder中App云端打包界面的AppID栏需要输入此值
在“App Services”栏下选择应用要使用到的服务(如需要使用到消息推送功能,则选择“VPN Configuration & Control”):
设置完成后选择“Continue”,弹出确认页面:
确认后选择“Submit”提交,再次确认就可以在“App IDs"页面看到刚创建的App ID:

.生成证书请求文件

不管是申请开发(Development)证书还是发布(Distribution)证书,都需要使用证书请求(.certSigningRequest)文件,证书请求文件需在Mac OS上使用“Keychain Access”工具生成。
在“Spltlight Search”中搜索“Keychain”并打开“Keychain Access”工具:

打开菜单“Keychain Access”->“Certificate Assistant”,选择“Request a Certificate From a Certificate Authority...”:
打开创建请求证书页面,在页面中输入用户邮件地址(User Email Address)(不是特别的重要)、证书名称(Common Name),请求类型(Request is)选择保存到磁盘(Saved to disk):
点击“Continue”后弹出保存路径:
点击“Save”后保存证书请求文件,成功提示:
保存文件名称为“CertificateSigningRequest.certSigningRequest”,后面申请开发(Development)证书和发布(Production)证书时用到。

.申请开发(Development)证书和描述文件

开发(Development)证书用于测试环境下使用,可以直接安装到手机上(不用提交到Appstore),但一个描述文件最多只能绑定100台设备(因此通过这种证书正式发布应用是行不通的)。

1>申请开发(Development)证书

在“Certificates, Identifiers & Profiles”页面“Certificates"下选择“Development",可查看到已申请的所有开发(Development)证书,点击右上角的加号可创建新证书:

打开“Add iOS Certificate”页面,在“Development”栏下选中“iOS App Development”:
在页面底部选择“Continue”:
打开确认证书请求页面,点击“Continue”继续:

打开证书生成页面,点击“Choose File...”选择“生成证书请求文件”章节生成的“CertificateSigningRequest.certSigningRequest”文件,点击“Generate”生成cer证书成功:
生成证书成功后打开证书下载页面,选择“Download”下载保存证书(ios_development.cer):
双击保存到本地的ios_development.cer文件导入到“Keychain Access”:
导入成功后,可以在证书列表中显示:
选中导入的证书,右键选择“Export "Developer" ...”:
打开证书保存页面,输入文件名、选择路径后点击“Save”:
打开设置证书密码页面,输入密码及确认密码后点击“OK”:
打开访问“Keychain Access”密码页面,输入Mac OS管理员密码,点击“Allow”,保存开发(Development)证书(如“HBuilderCert.p12”)。

2>添加调试设备

开发描述文件必须绑定设备,所以在申请开发描述文件之前,先添加调试的设备。
(如果已经添加设备,可跳过此节)
在“Certificates, Identifiers & Profiles”页面“Devices”下选择“All",可查看到已添加的所有设备信息,点击右上角的加号可添加新设备:

打开“Registering a New Device or Multiple Devices”页面,输入设备名称和UDID:
将设备连接到电脑,启动iTunes,点击次区域可切换显示设备的UDID,右键选择复制
输入完成后,点击“Continue”继续,确认输入信息:
点击“Register”,完成添加。

3>申请开发(Development)描述文件

在“Certificates, Identifiers & Profiles”页面“Provisioning Profiles”下选择“Development",可查看到已申请的所有开发(Development)描述文件,点击右上角的加号可创建新描述文件:

打开“Add iOS Provisioning Profile”页面,在“Development”栏下选中“iOS App Development”:
点击“Continue”按钮,打开“App ID”选择页面,选择要使用的“App ID”(如之前创建的“io.dcloud.HBuildApp”),点击“Continue”:
打开“Select certificates”页面,选择前面创建的开发证书:
点击“Continue”,打开选择调试设备页面,选择用于调试安装的设备(最多100太设备):
点击“Continue”,输入描述文件的名称(如“HBuilderProfile”):
点击“Generage”,生成描述文件成功:
点击“Download”下载保存开发描述文件(如HBuilderProfile.mobileprovision)。

.申请发布(Distribution)证书和描述文件

发布(Production)证书用于正式发布环境下使用,用于提交到Appstore审核发布。

1>申请发布(Production)证书

在“Certificates, Identifiers & Profiles”页面“Certificates"Production",可查看到已申请的所有发布(Production)证书,点击右上角的加号可创建新证书:

打开“Add iOS Certificate”页面,在“Production”栏下选中“App Store and Ad Hoc”:

在页面底部选择“Continue”:
打开确认证书请求页面,点击“Continue”继续:
打开证书生成页面,先点击“Choose File...”选择“生成证书请求文件”章节生成的“CertificateSigningRequest.certSigningRequest”文件,再点击“Generate”生成cer证书:
生成证书成功后打开证书下载页面,选择“Download”下载保存证书(ios_production.cer):
双击保存到本地的ios_production.cer文件导入到“Keychain Access”:
导入成功后,可以在证书列表中显示:
选中导入的证书,右键选择“Export "Developer" ...”:

打开证书保存页面,输入文件名、选择路径后点击“Save”:
打开设置证书密码页面,输入密码及确认密码后点击“OK”:
打开访问“Keychain Access”密码页面,输入Mac OS管理员密码,点击“Allow”,保存开发(Production)证书(如“HBuilderCert.p12”)。

2>申请发布(Distribution)描述文件

在“Certificates, Identifiers & Profiles”页面“Provisioning Profiles”下选择“Distribution",可查看到已申请的所有发布(Distribution)描述文件,点击右上角的加号可创建新描述文件:

打开“Add iOS Provisioning Profile”页面,在“Development”栏下选中“iOS App Development”:
点击“Continue”按钮,打开“App ID”选择页面,选择要使用的“App ID”(如之前创建的“io.dcloud.HBuildApp”),点击“Continue”:
打开“Select certificates”页面,选择前面创建的发布证书:
点击“Continue”,输入描述文件的名称(如“HBuilderProfileDistribution”):
点击“Generage”,生成描述文件成功:
点击“Download”下载保存开发描述文件(如HBuilderProfileDistribution.mobileprovision)。

第二部分:关于p12文件

1>为什么要导出.p12文件

当我们用大于三个mac设备开发应用时,想要申请新的证书,如果在我们的证书里,包含了3个发布证书,2个开发证书,可以发现再也申请不了开发证书和发布证 书了(一般在我们的证书界面中应该只有一个开发证书,一个发布证书,没必要生成那么多的证书,证书一般在过期之后才会重新添加。)

如图:


这时候,再点击“+”时,就会发现点击不了开发和发布证书,也就是添加不了开发证书和发布证书了:


2>有两个解决不能添加证书的办法。

第一种方法——“revoke”(不推荐):

将以前的证书“revoke”掉,

然后重新生成一个新的证书。

这种方法是可以的,但是会造成相应Provisioning Profiles失效,这是小问题。但是又要重新申请证书甚至描述文件很浪费时间,所以不提倡这种做法

 

第二种方法——“.p12”(推荐):

我们的每一个证书都可以生成一个.p12文件,这个文件是一个加密的文件,只要知道其密码,就可以供给所有的mac设备使用,使设备不需要在苹果开发者网站重新申请开发和发布证书,就能使用。

注意:一般.p12文件是给与别人使用的,本机必须已经有一个带秘钥的证书才可以生成.p12文件,如图:

 

打开钥匙串,选择我们需要的证书,右击,选择“导出“iPhone Distribition:```”:

为.p12文件填一个名字,点击存储:

 

填一个“密码”,“验证”和密码相同:


点击好,在桌面上就形成了一个.p12文件了:


在别人的电脑上要成功安装,须具备两个文件:

  • 该证书导出的“.p12”文件。

  • 苹果开发者中的与“证书”对应的“描述文件”

如果需要用于开发的,那么需要这两个文件:

.p12文件本身就是一个加密的证书,所以用这两个文件就可以让其他mac设备使用了:

 

拿到这两个文件后,依次双击“证书”,“.p12“文件(需要输入密码,密码就是当时生成.p12时设定的密码,),作用是加入钥匙串中,使我们的电脑具备开发的证明,”描述文件“(作用是置于xcode中,让xcode知道我们开发的合法性),添加完后就可以使用了。




2014-10-26 17:02:00 weixin_30721077 阅读数 2
  • iOS开发-全面解析iOS蓝牙BLE4.0开发

    只要你会OC基础,会写HelloWorld,你就可以实现iOS的蓝牙通信功能,实现蓝牙小项目也不在话下,作者会带领大家详细分析BLE4.0原理,通过分析xcode使用的蓝牙API,让学者能够得心应手的实现蓝牙BLE4.0的开发

    3673 人正在学习 去看看 许英俊

电话号码正则表达式(支持手机号码,3-4位区号,7-8位直播号码,1-4位分机号) ((\d{11})|^((\d{7,8})|(\d{4}|\d{3})-(\d{7,8})|(\d{4}|\d{3})-(\d{7,8})-(\d{4}|\d{3}|\d{2}|\d{1})|(\d{7,8})-(\d{4}|\d{3}|\d{2}|\d{1}))$)

 
匹配格式:
11位手机号码
3-4位区号,7-8位直播号码,1-4位分机号
如:12345678901、1234-12345678-1234
 
 
 
 
 
 
 
"^\d+$"  //非负整数(正整数 + 0) 
"^[0-9]*[1-9][0-9]*$"  //正整数 
"^((-\d+)|(0+))$"  //非正整数(负整数 + 0) 
"^-[0-9]*[1-9][0-9]*$"  //负整数 
"^-?\d+$"    //整数 
"^\d+(\.\d+)?$"  //非负浮点数(正浮点数 + 0) 
"^(([0-9]+\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\.[0-9]+)|([0-9]*[1-9][0-9]*))$"  //正浮点数 
"^((-\d+(\.\d+)?)|(0+(\.0+)?))$"  //非正浮点数(负浮点数 + 0) 
"^(-(([0-9]+\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\.[0-9]+)|([0-9]*[1-9][0-9]*)))$"  //负浮点
数 
"^(-?\d+)(\.\d+)?$"  //浮点数 
"^[A-Za-z]+$"  //由26个英文字母组成的字符串 
"^[A-Z]+$"  //由26个英文字母的大写组成的字符串 
"^[a-z]+$"  //由26个英文字母的小写组成的字符串 
"^[A-Za-z0-9]+$"  //由数字和26个英文字母组成的字符串 
"^\w+$"  //由数字、26个英文字母或者下划线组成的字符串 
"^[\w-]+(\.[\w-]+)*@[\w-]+(\.[\w-]+)+$"    //email地址 
"^[a-zA-z]+://(\w+(-\w+)*)(\.(\w+(-\w+)*))*(\?\S*)?$"  //url 
/^13\d{9}$/gi手机号正则表达式
 
 
public static bool IsValidMobileNo(string MobileNo)
  {
   const string regPattern = @"^(130|131|132|133|134|135|136|137|138|139)\d{8}$";
   return Regex.IsMatch(MobileNo, regPattern);
  }
 
 
正则表达式--验证手机号码:1[3|5|7|8|][0-9]{9}
实现手机号前带86或是+86的情况:^((\+86)|(86))?(13)\d{9}$
电话号码与手机号码同时验证:(^(\d{3,4}-)?\d{7,8})$|(13[0-9]{9}) 
提取信息中的网络链接:(h|H)(r|R)(e|E)(f|F)  *=  *('|")?(\w|\\|\/|\.)+('|"|  *|>)?  
提取信息中的邮件地址:\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*  
提取信息中的图片链接:(s|S)(r|R)(c|C)  *=  *('|")?(\w|\\|\/|\.)+('|"|  *|>)?
提取信息中的IP地址:(\d+)\.(\d+)\.(\d+)\.(\d+)    
提取信息中的中国手机号码:(86)*0*13\d{9}    
提取信息中的中国固定电话号码:(\(\d{3,4}\)|\d{3,4}-|\s)?\d{8}    
提取信息中的中国电话号码(包括移动和固定电话):(\(\d{3,4}\)|\d{3,4}-|\s)?\d{7,14}    
提取信息中的中国邮政编码:[1-9]{1}(\d+){5}    
提取信息中的中国身份证号码:\d{18}|\d{15}    
提取信息中的整数:\d+    
提取信息中的浮点数(即小数):(-?\d*)\.?\d+    
提取信息中的任何数字  :(-?\d*)(\.\d+)?  
提取信息中的中文字符串:[\u4e00-\u9fa5]*    
提取信息中的双字节字符串  (汉字):[^\x00-\xff]*

转载于:https://www.cnblogs.com/Dylan-Alice/p/4052171.html

iOS的match函数

阅读数 18

ios 正则表达式

阅读数 303

没有更多推荐了,返回首页