资讯

精准传达 • 有效沟通

从品牌网站建设到网络营销策划,从策略到执行的一站式服务

ios开发问题,iOS问题报告

iOS开发-加载动态库错误,请尝试重新安装软件包

1.证书引起的错误

创新互联建站"三网合一"的企业建站思路。企业可建设拥有电脑版、微信版、手机版的企业网站。实现跨屏营销,产品发布一步更新,电脑网络+移动网络一网打尽,满足企业的营销需求!创新互联建站具备承接各种类型的成都做网站、成都网站制作项目的能力。经过十年的努力的开拓,为不同行业的企事业单位提供了优质的服务,并获得了客户的一致好评。

控制台错误截图

在动态库内容没有问题的情况下,大多是由于没有对动态库签名导致的。iOS 8以后,苹果支持使用自定义的动态库,但不能上架到AppStore。我们的是企业级项目,不上架没关系。

先查看一下你的动态库内容

解决办法:在生成动态库时选择一个Team进行签名即可。

2.Swift版本引起的错误(注意:下图问题不一定是由于swift版本引起的,我遇到的问题就是swift版本引起了下面的问题)

解决方法:把下面的设置为YES

详细说明我的问题:在之前,也就是Xcode7.3,动态库是swift2.3写的。通过loadAndReturnError加载是没有问题的,因为Xcode7.3对应的就是swift2.3。swift3.0是Xcode8才推出来的,所以就没问题。而现在,Xcode升级到的8.2,而swift也升到了3.0;但是,这个动态库还是swift2.3,同时:工程设置里使用的是最新的swift版本,所以就会出现这个问题。

iOS开发中遇到的小问题-----总结

1、统一收键盘的方法

[[[UIApplication sharedApplication] keyWindow] endEditing:YES];

2、提示框

BBAlertView *alert = [[BBAlertView alloc] initWithStyle:BBAlertViewStyleDefault

Title:@"删除订单"

message:@"是否删除订单,"

customView:nil

delegate:self

cancelButtonTitle:L(@"取消")

otherButtonTitles:L(@"确认")];

[alert setCancelBlock:^{

}];

[alert setConfirmBlock:^{

[self orderDidRemovePressDown:tempDic Index:index.section];

}];

[alert show];

3、图片的自适应功能

self.brandImage.contentMode = UIViewContentModeScaleAspectFit;

4、cocoaPods清除缓存问题

$ sudo rm -fr ~/.cocoapods/repos/master

$ pod setup

5、设置显示键盘的样式

textView.keyboardType =UIKeyboardTypeDefault;

//设置键盘右下角为完成(中文输入法下)

textView.returnKeyType=UIReturnKeyDone;

6、输出当前时间

NSDateFormatter * dateFormatter=[[NSDateFormatter alloc]init];

[dateFormatter setDateFormat:@"yyyy-MM-dd HH:mm:ss.SSS"];

NSLog(@"当前毫秒时间1==%@",[dateFormatter stringFromDate:[NSDate date]]);

7、显示两秒然后消失

UILabel * lab=[[UILabel alloc]initWithFrame:CGRectMake(60,Main_Screen_Height-64-49-60, Main_Screen_Width-120, 50)];

lab.backgroundColor=[UIColor grayColor];

ViewRadius(lab, 20);

lab.textAlignment=NSTextAlignmentCenter;

lab.text=@"请先进行实名制验证";

[self.view addSubview:lab];

[UILabel animateWithDuration:2 animations:^{

lab.alpha=0;

}completion:^(BOOL finished) {

[lab removeFromSuperview];

}];

8、设置placeholder属性的大小和颜色

[_phoneFie setValue:[UIColor grayColor] forKeyPath:@"_placeholderLabel.textColor"];

[_phoneFie setValue:[UIFont boldSystemFontOfSize:15] forKeyPath:@"_placeholderLabel.font"];

_phoneFie.returnKeyType=UIReturnKeyDone;

9、设置cell的交互完全不可以使用

//[cellTwo setUserInteractionEnabled:NO];

//设置cell不可以点击,但是上面的子控件可以交互

cellTwo.selectionStyle=UITableViewCellSelectionStyleNone;

10、将textField的placeholder 属性的字体向右边移动5

_field.leftView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 10*Width_375, _field.frame.size.height)];

_field.leftViewMode = UITextFieldViewModeAlways;

11、开新线程使按钮上的时间变化

-(void)startTime{

__block int timeout=60; //倒计时时间

UIButton * btn=(UIButton *)[self.view viewWithTag:1000];

dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);

dispatch_source_t _timer = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0,queue);

dispatch_source_set_timer(_timer,dispatch_walltime(NULL, 0),1.0*NSEC_PER_SEC, 0); //每秒执行

dispatch_source_set_event_handler(_timer, ^{

if(timeout=0){

dispatch_source_cancel(_timer);

dispatch_async(dispatch_get_main_queue(), ^{

[btn setTitle:@"发送验证码" forState:UIControlStateNormal];

btn.enabled = YES;

});

}else{

//  int minutes = timeout / 60;

int miao = timeout % 60;

if (miao==0) {

miao = 60;

}

NSString *strTime = [NSString stringWithFormat:@"%.2d", miao];

dispatch_async(dispatch_get_main_queue(), ^{

[btn setTitle:[NSString stringWithFormat:@"剩余%@秒",strTime] forState:UIControlStateNormal];

btn.enabled = NO;

});

timeout--;

}

});

dispatch_resume(_timer);

}

12、隐藏TableView 中多余的行

UIView * view=[[UIView alloc]initWithFrame:CGRectZero];

[_tabelView setTableFooterView:view];

13、UIView添加背景图片

UIImage * image=[UIImage imageNamed:@"friend750"];

headSeV.layer.contents=(id)image.CGImage;

14、UITableView取消选中状态

[tableView deselectRowAtIndexPath:indexPath animated:YES];// 取消选中

15、带属性的字符串

NSFontAttributeName  字体

NSParagraphStyleAttributeName  段落格式

NSForegroundColorAttributeName  字体颜色

NSBackgroundColorAttributeName  背景颜色

NSStrikethroughStyleAttributeName 删除线格式

NSUnderlineStyleAttributeName      下划线格式

NSStrokeColorAttributeName        删除线颜色

NSStrokeWidthAttributeName 删除线宽度

NSShadowAttributeName  阴影

1.  使用实例

UILabel *testLabel = [[UILabel alloc]initWithFrame:CGRectMake(0, 100, 320, 30)];

testLabel.backgroundColor = [UIColor lightGrayColor];

testLabel.textAlignment = NSTextAlignmentCenter;

NSMutableAttributedString *AttributedStr = [[NSMutableAttributedString alloc]initWithString:@"今天天气不错呀"];

[AttributedStr addAttribute:NSFontAttributeName

value:[UIFont systemFontOfSize:16.0]

range:NSMakeRange(2, 2)];

[AttributedStr addAttribute:NSForegroundColorAttributeName

value:[UIColor redColor]

range:NSMakeRange(2, 2)];

testLabel.attributedText = AttributedStr;

[self.view addSubview:testLabel];

16、加大按钮的点击范围

把UIButton的frame 设置的大一些,然后给UIButton设置一个小些的图片

[tmpBtn setImageEdgeInsets:UIEdgeInsetsMake(5, 5, 5, 5)];

// 注意这里不能用setBackgroundImage

[tmpBtn setImage:[UIImage imageNamed:@"testBtnImage"] forState:UIControlStateNormal];

17、//避免self的强引用

__weak ViewController *weakSelf = self;

18、//类别的创建

command +n ——Objective-C File———(File Type  选择是类别还是扩展)———(Class  选择为哪个控件写类别)

19、修改UITableview 滚动条颜色的方法

self.tableView.indicatorStyle=UIScrollViewIndicatorStyleWhite;

20、利用UIWebView显示pdf文件

webView = [[UIWebView alloc]initWithFrame:CGRectMake(0, 0, 320, 480)];

[webView setDelegate:self];

[webView setScalesPageToFit:YES];

[webViewsetAutoresizingMask:UIViewAutoresizingFlexibleWidth |UIViewAutoresizingFlexibleHeight];

[webView setAllowsInlineMediaPlayback:YES];

[self.view addSubview:webView];

NSString *pdfPath = [[NSBundle mainBundle]pathForResource:@"ojc" ofType:@"pdf"];

NSURL *url = [NSURLfileURLWithPath:pdfPath];

NSURLRequest *request = [NSURLRequestrequestWithURL:url

cachePolicy:NSURLRequestUseProtocolCachePolicy

timeoutInterval:5];

[webView loadRequest:request];

21、将plist文件中的数据赋给数组

NSString *thePath = [[NSBundle mainBundle]pathForResource:@"States" ofType:@"plist"];

NSArray *array = [NSArrayarrayWithContentsOfFile:thePath];

22、隐藏状态栏

[[UIApplication shareApplication]setStatusBarHidden: YES animated:NO];

23、给navigation  Bar  设置title颜色

UIColor *whiteColor = [UIColor whiteColor];

NSDictionary *dic = [NSDictionary dictionaryWithObject:whiteColor forKey:NSForegroundColorAttributeName];

[self.navigationController.navigationBar setTitleTextAttributes:dic];

24、使用AirDrop 进行分享

NSArray *array = @[@"test1", @"test2"];

UIActivityViewController *activityVC = [[UIActivityViewController alloc] initWithActivityItems:array applicationActivities:nil];

[self presentViewController:activityVC animated:YES

completion:^{

NSLog(@"Air");

}];

25、把tableview里面Cell的小对勾的颜色改成别的颜色

_mTableView.tintColor = [UIColor redColor];

26、UITableView去掉分割线

_tableView.separatorStyle = NO;

27、正则判断手机号码地址格式

- (BOOL)isMobileNumber:(NSString *)mobileNum {

//    电信号段:133/153/180/181/189/177

//    联通号段:130/131/132/155/156/185/186/145/176

//    移动号段:134/135/136/137/138/139/150/151/152/157/158/159/182/183/184/187/188/147/178

//    虚拟运营商:170

NSString *MOBILE = @"^1(3[0-9]|4[57]|5[0-35-9]|8[0-9]|7[06-8])\\d{8}$";

NSPredicate *regextestmobile = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", MOBILE];

return [regextestmobile evaluateWithObject:mobileNum];

}

28、控制交易密码位数

-(BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string{

if (textField.text.length =6){

[MBProgressHUD showMessage:@"密码为6位" afterDelay:1.8];

return NO;

}

return YES;

}

29、判断是不是空

if ([real_name isKindOfClass:[NSNull class]] ) {

return NO;}

30、点击号码拨打电话

[[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"tel://400966220"]];

31、控制UITabbar的选择哪一个

[self.tabBarController setSelectedIndex:1];

32、获取当前App的版本号

NSDictionary *infoDictionary = [[NSBundle mainBundle] infoDictionary];

CFShow(infoDictionary);

// app名称

NSString *app_Name = [infoDictionary objectForKey:@"CFBundleDisplayName"];

// app版本

NSString *app_Version = [infoDictionary objectForKey:@"CFBundleShortVersionString"];

// app build版本

NSString *app_build = [infoDictionary objectForKey:@"CFBundleVersion"];

33、苹果app权限NSPhotoLibraryUsageDescriptionApp需要您的同意,才能访问相册NSCameraUsageDescriptionApp需要您的同意,才能访问相机NSMicrophoneUsageDescriptionApp需要您的同意,才能访问麦克风NSLocationUsageDescriptionApp需要您的同意,才能访问位置NSLocationWhenInUseUsageDescriptionApp需要您的同意,才能在使用期间访问位置NSLocationAlwaysUsageDescriptionApp需要您的同意,才能始终访问位置NSCalendarsUsageDescriptionApp需要您的同意,才能访问日历NSRemindersUsageDescriptionApp需要您的同意,才能访问提醒事项NSMotionUsageDescriptionApp需要您的同意,才能访问运动与健身NSHealthUpdateUsageDescriptionApp需要您的同意,才能访问健康更新NSHealthShareUsageDescriptionApp需要您的同意,才能访问健康分享NSBluetoothPeripheralUsageDescriptionApp需要您的同意,才能访问蓝牙NSAppleMusicUsageDescriptionApp需要您的同意,才能访问媒体资料库

34、控件设置边框

_describText.layer.borderColor = [[UIColor colorWithRed:215.0 / 255.0 green:215.0 / 255.0 blue:215.0 / 255.0 alpha:1] CGColor];

_describText.layer.borderWidth = 1.0;

_describText.layer.cornerRadius = 4.0;

_describText.clipsToBounds = YES;

35、//隐藏电池条的方法

-(BOOL)prefersStatusBarHidden{

return YES;

}

36、延时操作

[NSThread sleepForTimeInterval:2];

方法二:

[self performSelector:@selector(delayMethod) withObject:nil afterDelay:1.5];

37、系统风火轮:

[UIApplication sharedApplication].networkActivityIndicatorVisible = NO; //隐藏

38、//didSelectRowAtIndexPath:方法里面找到当前的Cell

AssessMentCell * cell = [tableView cellForRowAtIndexPath:indexPath];

39、navigation上返回按钮的颜色以及返回按钮后面文字去掉

//返回按钮后边文字去掉

[[UIBarButtonItem appearance] setBackButtonTitlePositionAdjustment:UIOffsetMake(0, -60)

forBarMetrics:UIBarMetricsDefault];

//设置左上角返回按钮的颜色

self.navigationController.navigationBar.tintColor = UIColorFromRGB(0x666666);

40、lineBreakMode //设置文字过长时的显示格式

label.lineBreakMode = NSLineBreakByCharWrapping;以字符为显示单位显

示,后面部分省略不显示。

label.lineBreakMode = NSLineBreakByClipping;剪切与文本宽度相同的内

容长度,后半部分被删除。

label.lineBreakMode = NSLineBreakByTruncatingHead;前面部分文字

以……方式省略,显示尾部文字内容。

label.lineBreakMode = NSLineBreakByTruncatingMiddle;中间的内容

以……方式省略,显示头尾的文字内容。

label.lineBreakMode = NSLineBreakByTruncatingTail;结尾部分的内容

以……方式省略,显示头的文字内容。

label.lineBreakMode = NSLineBreakByWordWrapping;以单词为显示单位显

示,后面部分省略不显示。

iOS 开发问题总结 PAC Fetch failed with cached error [NSURLErrorDomain:-1004]

1.PAC Fetch failed with cached error [NSURLErrorDomain:-1004]

在开发过程中遇到了上诉错误,找了很久的原因,刚开始以为是第三方网络框架的原因,排除第三方网络框架的原因之后又检查了缓存原因.最后发现都不是,是系统设置了自动代理导致的,解决办法就是关闭系统自动代理,关闭之后就不会再报这个错误了.再百度上没有这个问题的记载,最后在谷歌找到答案,特地记录一下.

解决方法:

系统偏好设置--网络--高级--代理--关闭自动代理

iOS开发常见问题

如果 xcode 中配置文件安装比较多,有些用不到了,可以到下面路径进行删除.

~/Library/MobileDevice/Provisioning Profiles

1 直接剪切

通过打印 tabBar 的子 view, 我们发现黑线的 y 值是-0.5;

这种方法虽然直接,对于去除 navi 的黑线也是有效的.但是本人不推荐这么去做.如果你的应用里没有突出的当然是可以的.

2 删除黑线

和删除 navi 的差不多,不过不用进行二次遍历.

当然这种删除方式,适合自定义的 tabBar, 如果是使用tabbarController 的属性的话,就不适用了.因为在tabbarController里我们拿不到 tabBar 的 subViews. 通过打印,会发现是空数组.这时我们可以使用KVC 使用自定义的 tabBar 去替换系统属性.

后台返回的经常会见到(null), 那么null是什么鬼, 改怎么处理.使用.通过测试,我们可以看出来下面的结果.

由上面得出以下结论.

1.nil, 表示的是空指针,指向的对象是空,地址是0x0, 打印返回的结果是(null).

2.[NSNull null],表示一个对象是空值,是有内存地址的.打印结果是null.

3.对于字符串来讲一个空字符串和字符串是空是两种概念.如 str 和str2,两种写法. 如果有时候不确定返回的字符串是@""还是 nil, 最好使用 [str isEqualToString:@""] || str.length == 0 这种判断方式. str 只使用** [str isEqualToString:@""] ** 是无效的.

在某个功能中,后台返回的是字符串,但是要显示在不同的label 中,才注意到了这个方法.

由于现在的请求是 HTTP,运行时报以下信息内容

App Transport Security has blocked a cleartext HTTP (http://) resource load since it is insecure. Temporary exceptions can be configured via your app's Info.plist file.

这时候需要在info.plist中添加一个字段.

通过打印webView 的 subViews 发现, webView 的子 View 中有个 _UIWebViewScrollView 的成员变量, 所以进行猜测.

注意到了 webView 有一个scrollView 的属性,那么更简单的做法是:

只需要给 tableView 的 tableFooterView 添加一个空的 View 即可

有一个属性 background ,在习惯性找backgroundImage 的时候,有时忽略了这个属性.

有时候需要替换字符串里的字符.

在实际应用中需要获取设备的信息.系统给了一个类UIDevice, 可以用来获取一些基本信息.

如果要获取具体的设备型号,比如要给专门的机型推送一些服务的话.那个就得拿到设备的类型.

通过拿到产品类型我们可以进而判断出机型. 下面是网上总结出来的

由于创建项目时,项目名称包含中文会,Bundle Identifier 中会直接使用-代替中文.所以项目名称一般会使用英文,实在不行要使用拼音.这样的话,安装到手机中的名称要显示自己想要的名称的话.

需要在** info.plist ** 中添加一项.** Bundle display name **.

对应的 Value 就是安装app 后,显示的名称.

由于现在是Retina 屏幕,使用 CATextLayer时,设置完字体后显示会模糊.

下面看一下映射关系.

非Retina:1 Point = 1 x 1 Pixel

Retina:1 Point = 2 x 2 Pixel

由于 Retina 屏一个 Point 映射4个(2 * 2) Pixel,所以 scale为2.

所以这时牵扯到一个属性:contentsScale

有两种方案:

方案一 : 使用带属性的字符串,这种方法简单明了.

方案二 : 设置navigationItem.titleView. 给titleView赋值一个 label, 这样子的话修改起来都是常规做法.

iOS SDK框架开发中的那些坑

    最近业务需求需要开发一个SDK集成到友方App中,于是就有了本文中的这些经验(掉坑-爬坑-掉下一个坑)。

    这个其实不涉及技术问题,但是也需要谨慎,因为我们的SDK属于一个比较完整的业务模块,所以依赖的第三方库还是挺多的,其中就用到了高德地图,(开始我们就用的通用版本,结果友方用的是另一个版本,结果为了能够集成成功,后期不得不更改高德地图版本),所以建议如果是这种明确合作方的SDK这种框架还是需要提前沟通好。

    PS:忍不住吐槽一下,高德地图整出一大堆乱七八糟的框架目的是个啥呢,又不能互相兼容,开发者还不知道选择哪个合适。

    原生App开发,资源文件最多的无非是图片,在平时项目开发中一般会放到asset文件夹中,但是在SDK中,需要创建.bundle文件(建议与项目同名)对资源文件进行管理。

    该方法在项目中使用举例:

    简单来说,在生成模拟器.framework中与生成真机.framework时,都存在arm64架构,网上提供的通过后期命令行删除某个arm64的方式始终无法解决该问题。此时需要配置如图选项,大概意思是在模拟器生成的.framework的框架不再添加arm64,后期将模拟器库与真机库合并,各个架构模式就都存在了。

模拟器包与真机包合并命令行

制作远程私有库的教程有很多,此处就不展开来仔细说明了。 iOS开发: 配置CocoaPods远程私有仓库 重点说一下针对非开源的.framework框架,如何去配置spec

设置自己的非开源SDK

设置项目SDK相关的资源文件夹(bundle)

当自己开发的SDK中包含类目文件时,编译就会有提示找不到,此时需要在设置页other_laflags添加'-objc',但是在SDK中无法设置,只能写在spec文件。

当调用pod lib lint --verbose --use-libraries时报了如下错误:

Ld .../Build/Intermediates.noindex/App.build/Release-iphonesimulator/App.build/Objects-normal/arm64/Binary/App normal arm64

解决方案:

    经历了整个SDK的完整开发流程,一步步排除问题,最终达到了最终结果。在此感谢一起解决问题的同事--卞老板。


网页名称:ios开发问题,iOS问题报告
当前URL:http://cdkjz.cn/article/hogocp.html
多年建站经验

多一份参考,总有益处

联系快上网,免费获得专属《策划方案》及报价

咨询相关问题或预约面谈,可以通过以下方式与我们联系

业务热线:400-028-6601 / 大客户专线   成都:13518219792   座机:028-86922220