ios3.3(ios335)
ios3.3怎么降回之前的
IOS设备一旦升级IOS系统就无法降级了,因为:
1、IOS采用推荐升级、强制保持最新的升级策略,一旦升级就再无可能降级。
2、强制保持最新系统版本是为了防止低版本中存在的漏洞对用户造成信息泄露。
3、苹果自IOS7推出ID锁,禁止降级是为了防止有人偷盗手机通过降级的方法重新使用手机,以此降低iPhone被盗率。
电信流魔王卡 6g国内流量每月19元 需要可以登录电信网厅办理:
iOS隐私政策
我们极度重视您的用户隐私。您在使用我们的服务时,我们可能会收集和使用您的相关信息。我们希望通过本《隐私政策》向您说明,在使用我们的服务时,我们如何收集、使用、储存和分享这些信息,以及我们为您提供的访问、更新、控制和保护这些信息的方式。本《隐私政策》与您所使用的服务息息相关,希望您仔细阅读,在需要时,按照本《隐私政策》的指引,作出您认为适当的选择。本《隐私政策》中涉及的相关技术词汇,我们尽量以简明扼要的表述,并提供进一步说明的链接,以便您的理解。
您使用或继续使用我们的服务,即意味着同意我们按照本《隐私政策》收集、使用、储存和分享您的相关信息。
本《隐私政策》将帮助您了解以下内容:
第一章 我们可能收集的您的信息
第二章 我们可能如何使用收集的信息
第三章 我们可能分享的您的信息
第四章 您可能分享的信息
第五章 我们将如何保护您的信息
第六章 未成年人信息的保护
第七章 本隐私政策的适用范围
第八章 本隐私政策的变更
第九章 投诉及建议
第一章 我们可能收集的您的信息
1. 我们可能获取的您的信息
1.1 日志信息,指您使用我们的服务时,系统可能通过cookies或其他方式自动采集的技术信息,包括:
1.1.1 设备或软件信息,例如您的移动设备或用于接入我们服务的其他程序所提供的配置信息、您的IP地址和移动设备所用的版本和设备识别码;
1.1.2 在使用我们服务时搜索或浏览的信息,例如您在使用我们服务时浏览或要求提供的其他信息和内容详情;
1.1.3 您通过我们的服务分享的内容所包含的信息(元数据),例如拍摄或上传的共享照片或录像的日期、时间或地点等。
1.1.4 为了增加游戏体验以及玩家对游戏的参与感,我们会收集并分享游戏玩家的战力信息、等级信息、装备信息、宠物信息、坐骑信息等。并且以排行榜的方式在游戏中进行展示。当部分玩家上述信息不足以靠前展示时,我们并不会收集并分享这部分玩家的上述信息。
1.2 位置信息,指您开启设备定位功能并使用我们基于位置提供的相关服务时,收集的有关您位置的信息,包括:
1.2.1您通过具有定位功能的移动设备使用我们的服务时,通过GPS或WiFi等方式收集的您的地理位置信息;
1.2.2您或其他用户提供的包含您所处地理位置的实时信息,例如您提供的账户信息中包含的您所在地区信息,您或其他人上传的显示您当前或曾经所处地理位置的共享信息,您或其他人共享的照片包含的地理标记信息;
1.2.3您可以通过关闭定位功能,停止对您的地理位置信息的收集。
2. 您提供的信息
2.1您通过我们的服务向其他方提供的共享信息,以及您使用我们的服务时所储存的信息;
2.2其他方分享的您的信息;
2.3其他方使用我们的服务时所提供有关您的共享信息。
第二章 我们可能如何使用收集的信息
1. 我们可能将在向您提供服务的过程之中所收集的信息用作下列用途:
1.1向您提供服务;
1.2在我们提供服务时,用于身份验证、客户服务、安全防范、诈骗监测、存档和备份用途,1.3确保我们向您提供的产品和服务的安全性;
1.4帮助我们设计新服务,改善我们现有服务;
1.5使我们更加了解您如何接入和使用我们的服务,从而针对性地回应您的个性化需求,例如语言设定、位置设定、个性化的帮助服务和指示,或对您和其他用户作出其他方面的回应;
1.6向您提供与您更加相关的广告以替代普遍投放的广告;
1.7评估我们服务中的广告和其他促销及推广活动的效果,并加以改善;
1.8软件认证或管理软件升级;
1.9让您参与有关我们产品和服务的调查。
1.10为了让您有更好的体验、改善我们的服务或您同意的其他用途,在符合相关法律法规的前提下,我们可能将通过某一项服务所收集的信息,以汇集信息或者个性化的方式,用于我们的其他服务。例如,在您使用我们的一项服务时所收集的信息,可能在另一服务中用于向您提供特定内容,或向您展示与您相关的、非普遍推送的信息。如果我们在相关服务中提供了相应选项,您也可以授权我们将该服务所提供和储存的信息用于我们的其他服务。
第三章 我们可能分享的您的信息
1.除以下情形外,未经您同意,我们以及我们的关联公司不会分享您的个人信息:
1.1我们以及我们的关联公司,可能将您的个人信息与我们的关联公司、合作伙伴分享(他们可能并非位于您所在的法域),用作下列用途:
1.1.1向您提供我们的服务;
1.1.2实现”我们可能如何使用收集的信息”部分所述目的;
1.1.3履行我们在本《隐私政策》中的义务和行使我们的权利;
1.1.4理解、维护和改善我们的服务。
2.如我们或我们的关联公司分享您的个人信息,我们将努力确保在使用您的个人信息时遵守本《隐私政策》及我们要求其遵守的其他适当的保密和安全措施。
3.我们或我们的关联公司还可能为以下需要而保留、保存或披露您的个人信息:
3.1由于部分当地法律法规要求而必须保留的信息;
3.2遵守法院命令或其他法律程序的规定而必须保留,或披露的信息;
3.3遵守相关政府机关的要求而必须保留,或披露的信息;
3.4为遵守适用的法律法规、维护社会公共利益,或保护我们的客户、我们或我们的集团公司、其他用户或雇员的人身和财产安全或合法权益所合理必需的用途。
第四章 您可能分享的信息
1. 您可通过使用我们服务分享信息
1.1我们的多项服务,可让您不仅与自己的社交网络,也与使用该服务的所有用户公开分享您的相关信息,例如,您在我们的服务中所上传或发布的信息(包括您公开的个人信息、您建立的名单)、您对其他人上传或发布的信息作出的回应,以及包括与这些信息有关的位置数据和日志信息。使用我们服务的其他用户也有可能分享与您有关的信息(包括位置数据和日志信息)。特别是,我们的社交媒体服务,是专为使您与世界各地的用户共享信息而设计,您可以使共享信息实时、广泛地传递。只要您不删除共享信息,有关信息会一直留存在公共领域。
1.2请您谨慎考虑通过我们的服务上传、发布和交流的信息内容。在一些情况下,您可通过我们某些服务的隐私设定来控制有权浏览您共享信息的用户范围。如要求从我们的服务中删除您的相关信息,请通过该等特别服务条款提供的方式操作。
2. 您分享的敏感个人信息
2.1某些个人信息因其特殊性可能被认为是敏感个人信息,例如您的种族、宗教、个人健康和医疗信息等。相比其他个人信息,敏感个人信息受到更加严格的保护。
2.2请注意,您在使用我们的服务时所提供、上传或发布的内容和信息(例如有关您社交活动的照片等信息),可能会泄露您的敏感个人信息。您需要谨慎地考虑,是否在使用我们的服务时披露相关敏感个人信息。
2.3您同意按本《隐私政策》所述的目的和方式来处理您的敏感个人信息。
第五章 我们将如何保护您的信息
1. 我们将尽一切可能采取适当的技术手段,保证您可以访问、更新和更正自己的注册信息或使用我们的服务时提供的其他个人信息。在访问、更新、更正和删除前述信息时,我们可能会要求您进行身份验证,以保障账户安全。
2. 我们使用各种安全技术和程序,以防信息的丢失、不当使用、未经授权阅览或披露。例如,在某些服务中,我们将利用加密技术(例如SSL)来保护您提供的个人信息。但请您理解,由于技术的限制以及可能存在的各种恶意手段,在互联网行业,即便竭尽所能加强安全措施,也不可能始终保证信息百分之百的安全。您需要了解,您接入我们的服务所用的系统和通讯网络,有可能因我们可控范围外的因素而出现问题。
3. 我们仅在本《隐私政策》所述目的所必需的期间和法律法规要求的时限内保留您的个人信息。
第六章 未成年人信息的保护
1. 我们非常重视对未成年人信息的保护。如果您是未满18周岁的未成年人,您的监护人需要仔细阅读本《隐私政策》并同意或授权您同意依照本《隐私政策》使用我们产品及/或服务。如果您是未满14周岁的未成年人,您的监护人需要仔细阅读本《隐私政策》并明示同意您依照本《隐私政策》使用我们产品及/或服务。
2. 如果您/您的监护人不同意本《隐私政策》的任何内容,您应该立即停止使用我们产品及/或服务。
第七章 本隐私政策的适用范围
1.除某些特定服务外,我们所有的服务均适用本《隐私政策》。这些特定服务将适用特定的隐私政策。针对某些特定服务的特定隐私政策,将更具体地说明我们在该等服务中如何使用您的信息。该特定服务的隐私政策构成本《隐私政策》的一部分。如相关特定服务的隐私政策与本《隐私政策》有不一致之处,适用该特定服务的隐私政策。
2.请您注意,本《隐私政策》不适用于以下情况:
通过在我们服务中进行广告服务的其他公司或机构所收集的信息.
第八章 本隐私政策的变更
1.如我们产品及/或服务发生以下变化,我们可能对本《隐私政策》进行相应的修订:
1.1 我们产品及/或服务所涉业务功能发生变更,导致处理个人信息的目的、类型、使用方式发生变更;
1.2您参与个人信息处理方面的权利及其行使方式发生重大变化;
1.3我们负责处理您的个人信息安全的部门的联络方式及投诉渠道发生变更;
1.4发生其他可能影响用户个人信息安全或影响用户隐私权利的变更等。
2.我们将在修订生效前通过在主页上显著位置提示或向您发送电子邮件或以其他方式通知您。未经您的明确同意,我们不会削减您基于本《隐私政策》所享有的权利。如该等修订造成您在本《隐私政策》下权利的实质减少,而您继续使用我们的服务,即表示同意受经修订的本《隐私政策》的约束。
3.如无特殊说明,修订后的《隐私政策》自公布之日起生效。
第九章 投诉及建议
如您对本《隐私政策》或相关事宜有任何问题,或者对我们服务有什么建议,请直接与我们联系反馈
iOS 苹果审核违反2.5.2,3.3.2
这是因为你的项目中含有JS-Patch,大部分都是因为使用了高德地图!
附上解决连接: ;sa=a825e49fddf2cf9bc14ed957b192774b
Ipad更新ios3.3后出现页面按下主屏幕键,然后进入后要求继续设置,但是
个人意见,希望采纳:这里所有进程屏幕都是黑的,听声音。1.用USB线将iPhone连接上电脑,然后你将会听见电脑已连接成功的提示声音。2.现在请先将iPhone关机,然后你将会听见电脑未连接成功的提示声音。3.请同时按住开关机键和home键,持续到第10秒的时候,请立即松开开关键,并继续保持按住home键。4.这个时候iTunes会自动启动,并提示你进行恢复模式(iPhone会一直保持黑屏状态)。那么你就可以按住键盘上的shift键,点击“恢复”,选择相应的固件进行恢复。 希望对你有所帮助
iOS 蓝牙
1. iOS中开发蓝牙常用的系统库是CoreBluetooth/CoreBluetooth.h。
2.蓝牙外设必需为4.0及以上(2.0需要MFI认证),否则无法进行开发,蓝牙4.0设施由于低耗电,所以也叫做BLE。
3. CoreBluetooth框架的核心其实是俩东西
? ? 3.1 Peripheral
? ? 3.2?Central
4. 服务和特征(service characteristic):简而言之,外部蓝牙中它有若干个服务service(服务你能了解为蓝牙所拥有的可以力),而每个服务service下拥有若干个特征characteristic(特征你能了解为解释这个服务的属性)。
5. Descriptor(形容)使用来形容characteristic变量的属性。例如,一个descriptor能规定一个可读的形容,或者者一个characteristic变量可接受的范围,或者者一个characteristic变量特定的单位。
? ? ?3.1 创建一个CBCentralManager实例来进行蓝牙管理;
? ? ?3.2 搜索扫描外围设备;
?????3.3 连接外围设备;
? ? ?3.4 获得外围设备的服务;
? ? ?3.5 获得服务的特征;
? ? ?3.6 从外围设备读取数据;
? ? ?3.7 给外围设备发送(写入)数据。
?4.1 初始化
dispatch_queue_t centralQueue = dispatch_queue_create(“centralQueue",DISPATCH_QUEUE_SERIAL);
NSDictionary *dic = @{CBCentralManagerOptionRestoreIdentifierKey : restoreIdentifier};
self.centralManager = [[CBCentralManager alloc] initWithDelegate:self queue:centralQueue options:dic];
CBCentralManagerOptionRestoreIdentifierKey对应的是一个唯一标识的字符串,用于蓝牙进程被杀掉恢复连接时使用
4.2 扫描
/*
?*扫描设备
?*/
- ( void )scanForDevices:(NSError**)error
{
? ? if (CBCentralManagerStatePoweredOn == self .centralManager.state) {
? ? ? ? //取回已连接的service设备
? ? ? ? NSArray* retrievedPeripherals = [ self .centralManagerretrieveConnectedPeripheralsWithServices:@[ self .serviceUUID]];
? ? ? ? for (CBPeripheral* peripheral in retrievedPeripherals){
? ? ? ? ? ? //NSLog(@"retrieved peripheral:%@", peripheral);
? ? ? ? ? ? [ self .delegateclient: self didDiscoverDevice:peripheral.identifier];
? ? ? ? }
? ? ? ? //启动扫描
? ? ? ? if ( self .advertisementUUID) {
? ? ? ? ? ? [ self .centralManager scanForPeripheralsWithServices:@[ self .advertisementUUID ] options:@{ CBCentralManagerScanOptionAllowDuplicatesKey:@YES }];
? ? ? ? } else {
? ? ? ? ? ? [ self .centralManager scanForPeripheralsWithServices: nil options:@{ CBCentralManagerScanOptionAllowDuplicatesKey:@YES }];
//? ? ? ? ? ? [self.centralManager scanForPeripheralsWithServices:nil options:nil];
? ? ? ? }
? ? } else {
? ? ? ? if (error != NULL ) {
? ? ? ? ? ? *error = [NSErrorerrorWithDomain:HCErrorDomaincode:(SRVClientErrorUnknown+ self .centralManager.state)userInfo: nil ];
? ? ? ? ? ? NSLog(@"[NSError errorWithDomain:HCErrorDomain code:(SRVClientErrorUnknown + self.centralManager.state) userInfo:nil];");
? ? ? ? }
? ? }
}
4.3 发现外围设备
- ( void )centralManager:(CBCentralManager*)centraldidDiscoverPeripheral:(CBPeripheral*)peripheraladvertisementData:(NSDictionary*)advertisementDataRSSI:(NSNumber*)RSSI {
? ? NSString*peripheralName = peripheral.name;
? ? if (peripheralName == nil || peripheralName.length==0) {
? ? ? ? return ;
? ? }
? ? if ([peripheralNameisEqualToString:SRV_CLIENT_DEV_NAME] || [peripheralNameisEqualToString:SRV_CLIENT_DFU_NAME]) {
? ?}
}
4.4 连接外围设备
//蓝牙连接成功回调
- ( void )centralManager:(CBCentralManager*)centraldidConnectPeripheral:(CBPeripheral*)peripheral {
? ? [ self .centralManager stopScan];
? ? peripheral.delegate= self ;
? ? self .commandNo=0;
? ? NSLog(@"[D] CentralManager Discover services.");
? ? NSLog(@"%@", self .peripheral);
? ? self .peripheral.delegate= self ;
? ? [ self .peripheral discoverServices:@[ self .serviceUUID]];
? ? NSLog(@"%@", self .serviceUUID);
? ? //定时获取RSSI
? ? if ( self .needReadRSSI) {
? ? ? ? [ self readPeripheralRSSI];
? ? ? ? if (! self .rssiTimer) {
? ? ? ? ? ? self .rssiTimer = [NSTimer scheduledTimerWithTimeInterval:5.0
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? target: self
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? selector: @selector (readPeripheralRSSI)
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? userInfo: nil
?? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? repeats: YES ];
? ? ? ? }
? ? }
}
#pragma?mark?连接外设——失败
-?(void)centralManager:(CBCentralManager?*)central?didFailToConnectPeripheral:(CBPeripheral?*)peripheral?error:(NSError?*)error{
????NSLog(@"%@",?error);
}
#pragma?mark?取消与外设的连接回调
-?(void)centralManager:(CBCentralManager?*)central?didDisconnectPeripheral:(CBPeripheral?*)peripheral?error:(NSError?*)error{
????NSLog(@"%@",?peripheral);
}
4.5?获得外围设备的服务
//发现服务的回调
- ( void )peripheral:(CBPeripheral*)peripheraldidDiscoverServices:(NSError*)error
{
? ? NSLog(@"%@---didDiscoverServices",peripheral);
? ? if (error){
? ? ? ? NSLog(@"[E] peripheral didDiscoverServices error: %@", error.localizedDescription);
? ? ? ? [ self cancelConnection];
? ? ? ? return ;
? ? }
? ? for (CBService* service in peripheral.services){
? ? ? ? NSLog(@"[D] Discover characteristics. For service = %@", service);
? ? ? ? [peripheraldiscoverCharacteristics: nil forService:service];
? ? }
}
//发现特征的回调
- ( void )peripheral:(CBPeripheral *)peripheral didDiscoverCharacteristicsForService:(CBService *)service error:(NSError *)error
{
? ? if (error){
? ? ? ? NSLog(@"[E] peripheral didDiscoverCharacteristicsForService error: %@", error.localizedDescription);
? ? ? ? [ self cancelConnection];
? ? ? ? return ;
? ? }
? ? NSLog(@"[D] peripheral DiscoverCharacteristics = %@", service.characteristics);
? ? //订阅特征
? ? for (CBCharacteristic*characteristic in service.characteristics){
? ? ? ? if (characteristic.properties (CBCharacteristicPropertyNotify|CBCharacteristicPropertyIndicate)){
? ? ? ? ? ? if (!characteristic.isNotifying) {
? ? ? ? ? ? ? ? if ([ self .ignoreCharacteristicUUIDscontainsObject:characteristic.UUID]) {
? ? ? ? ? ? ? ? ? ? continue ;
? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? NSLog(@"[D] Enable notify value. For characteristic = %@", characteristic);
? ? ? ? ? ? ? ? //d订阅特性当数据频繁改变时用 setNotifyValue 不频繁时用readValueForCharacteristic
? ? ? ? ? ? ? ? [peripheralsetNotifyValue: YES forCharacteristic:characteristic];
? ? ? ? ? ? }
? ? ? ? }
? ? }
}
// 订阅后的callback
- ( void )peripheral:(CBPeripheral *)peripheral didUpdateNotificationStateForCharacteristic:(CBCharacteristic *)characteristic error:(NSError *)error
{
? ? if (error){
? ? ? ? NSLog(@"[E] peripheral didUpdateNotificationStateForCharacteristic error: %@", error.localizedDescription);
? ? ? ? [ self cancelConnection];
? ? ? ? return ;
? ? }
? ? if ([ self isAllCharacteristicNotificationEnabled]){
? ? ? ? NSLog(@"订阅成功");
? ? ? ?//authorizeRequest 授权认证
? ? ? ? [ self .delegate clientDidPrepareForOperation: self ];
? ? }
//? ? [self.delegate clientDidPrepareForOperation:self];
}
4.6?从外围设备读取数据
// peripheral主动发数据,包括写命令后主动返回的状态 读数据的回调
- ( void )peripheral:(CBPeripheral*)peripheraldidUpdateValueForCharacteristic:(CBCharacteristic*)characteristicerror:(NSError*)error
{
? ? if (error) {
? ? ? ? NSLog(@"[E] peripheral didUpdateValueForCharacteristic error: %@ %@", error.localizedDescription,characteristic);
? ? ? ? [ self cancelConnection];
? ? ? ? [ self cleanupOperationUnexpectedly];
? ? ? ? return ;
? ? }
? ? NSLog(@"%@",peripheral);
? ? NSLog(@"%@",characteristic);
? ? [ self .delegate client: self didUpdateValueForCharacteristic:characteristic.UUID value:characteristic.value];
? ? if ([characteristic.UUIDisEqual: self .ctrlptUUID]) {
? ? ? ? ? ? if (CTRLPTProgressWaitResp == self .ctrlptProgress) {
? ? ? ? ? }
? ? }
?}
4.7?给外围设备发送(写入)数据
- ( BOOL )performOperationSegment:(CBCharacteristic*)characteristic
{
? ? ? ?? BOOL isLastSegment;
? ? ? ? uint8_tsegment[20];
? ? ? ? uint16_tindex =0;
? ? ? ? uint16_tsegLength;
? ? ? ? NSIntegerforwardLength = self .forwardFlow.length;
? ? ? ? if ((forwardLength - self .forwardOffset) (20- index)) {
? ? ? ? ? ? isLastSegment = NO ;
? ? ? ? ? ? segLength = (20- index);
? ? ? ? } else {
? ? ? ? ? ? isLastSegment = YES ;
? ? ? ? ? ? segLength = (forwardLength - self .forwardOffset);
? ? ? ? }
? ? ? ? memcpy(segment[index], self .forwardFlow.bytes[ self .forwardOffset], segLength);
? ? ? ? self .forwardOffset+= segLength;
? ? ? ? index += segLength;
? ? ? ? NSData*writeData = [NSDatadataWithBytes:segmentlength:index];
? ? ? ? NSLog(@"[D] Write value = %@. For characteristic = %@", writeData, characteristic);
? ? ? ? [ self .peripheral writeValue:writeData forCharacteristic:characteristic type:CBCharacteristicWriteWithResponse];//对于操控类蓝牙,数据写入要求非常快,其中writeWithSponce写入消耗的时间是writeWithoutSponce的2.3倍,因此尽量改写成writeWithoutSponce来提升写入速率
? ? ? ?? return isLastSegment;
?}
//是否写入成功的回调
- ( void )peripheral:(CBPeripheral*)peripheraldidWriteValueForCharacteristic:(CBCharacteristic*)characteristicerror:(NSError*)error
{
? ? if (error) {
? ? ? ? NSLog(@"[E] peripheral didWriteValueForCharacteristic error: %@", error);
? ? ? ? [ self cancelConnection];
? ? ? ? [ self cleanupOperationUnexpectedly];
? ? ? ? return ;
? ? }
? ? NSLog(@"写入成功----%@",characteristic);
? ? if ([characteristic.UUIDisEqual: self .ctrlptUUID]) {
? ? ? ? if (CTRLPTProgressWritting == self .ctrlptProgress) {
? ? ? ? ? ? if ([ self performOperationSegment:characteristic]) {
? ? ? ? ? ? ? ? self .ctrlptProgress = CTRLPTProgressWaitResp;
? ? ? ? ? ? ? ? self .backwardFlow.length=0;
? ? ? ? ? ? ? ? self .backwardOffset=0;
? ? ? ? ? ? }
? ? ? ? }
? ? }
}
4.8 如何解析蓝牙数据
//判断是否第一个包,若是,取出包长度
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? if (0== self .backwardOffset length =2) {
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? uint16_tcommandLength;
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? [characteristicDatagetBytes:commandLengthlength: sizeof (commandLength)];
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? offset += sizeof (commandLength);
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? self .backwardLength= commandLength;
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? [ self .backwardFlowappendData:[characteristicDatasubdataWithRange:NSMakeRange(offset, length - offset)]];
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? } else {
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? [ self .backwardFlowappendData:characteristicData];
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? }