宁静致远

什么是勇敢?勇敢不是不怕,而是带着恐惧依然前行!


  • Home

  • Archives

使用UITextView富文本做文字点击

Posted on 2018-10-02
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
// 同意
NSString* str = @"注册表示同意《平台服务协议》与《人人交易隐私策略》";
CGSize size = [str boundingRectWithSize:CGSizeMake(MAXFLOAT, MAXFLOAT) options:NSStringDrawingTruncatesLastVisibleLine|NSStringDrawingUsesLineFragmentOrigin|NSStringDrawingUsesFontLeading attributes:@{NSFontAttributeName:[UIFont systemFontOfSize:13]} context:nil].size;
UITextView * textView = [[UITextView alloc]initWithFrame:CGRectMake(AppLeftPadding, CGRectGetMaxY(_registerBtn.frame)+12, size.width, 23)];
textView.text = str;
textView.textColor = IMColorGray;
textView.backgroundColor = [UIColor clearColor];
textView.delegate = self;
textView.editable = NO;
textView.scrollEnabled = NO;
[self.view addSubview:textView];
NSMutableAttributedString *attributedString = [[NSMutableAttributedString alloc]initWithString:str];
[attributedString addAttribute:NSLinkAttributeName
value:@"register://"
range:[[attributedString string] rangeOfString:@"《平台服务协议》"]];
[attributedString addAttribute:NSLinkAttributeName
value:@"privacyPolicy://"
range:[[attributedString string] rangeOfString:@"《人人交易隐私策略》"]];
textView.attributedText = attributedString;
textView.linkTextAttributes = @{ NSForegroundColorAttributeName: IMTintBlueColor, NSUnderlineColorAttributeName: [UIColor clearColor], NSUnderlineStyleAttributeName: @(NSUnderlineStyleSingle)};

//==================================================================

#pragma mark - UITextViewDelegate
- (BOOL)textView:(UITextView *)textView shouldInteractWithURL:(NSURL *)URL inRange:(NSRange)characterRange {
if ([[URL scheme] isEqualToString:@"register"]) {
HYBaseWebViewController * web = [[HYBaseWebViewController alloc]init];
web.baseUrl = @"http://106.14.169.21:8080/caopan-h5page/registagree.html";
web.isforceUseoldWebView = NO;
[self.navigationController pushViewController:web animated:YES];
}else if([[URL scheme] isEqualToString:@"privacyPolicy"]){
HYBaseWebViewController * web = [[HYBaseWebViewController alloc]init];
web.baseUrl = [NSString stringWithFormat:@"%@%@", WebH5Address, @"caopan-h5page/privacypolicy.html"];
web.appendUrl = YES;
[self.navigationController pushViewController:web animated:YES];
}
return YES;
}

效果如图:

实现类似(Home+关机键)截图效果)

Posted on 2018-09-06
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#pragma mark -
#pragma mark - 截图保存按钮事件
- (void)rightButtonAction:(id)sender{
//获取当前窗口对象
UIImage * image = [self getNormalImage:self.view.window];
UIImageWriteToSavedPhotosAlbum(image, self, nil, nil);
[MBProgressHUD showSuccess:@"截图成功" toView:self.view];
}

- (UIImage *)getNormalImage:(UIView *)view{
//保存原图
UIGraphicsBeginImageContextWithOptions(CGSizeMake(SCREEN_WIDTH, SCREEN_HEIGHT), NO, 0.0);
CGContextRef context = UIGraphicsGetCurrentContext();
[view.layer renderInContext:context];
UIImage * image = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
return image;
}

Xcode9.3之后使用Instruments 调试 Core Animation

Posted on 2018-09-06
以前一直在项目结束后会有使用Instruments进行一些优化,但是这次升级Xcode9.3之后发现我在Instruments 找不到调试 Core Animation的debug option了,这里备注一下!
9.2之前debug option的位置位于右下角

9.3debug option 直接在Xcode中

使用Appium进行iOS的真机自动化测试

Posted on 2018-09-06

安装类库

Homebrew

如果没有安装过Homebrew,先安装 [ homebrew ]

npm

如果没有安装npm,请移步 [ node.js和npm安装 ]

安装依赖库

brew install libimobiledevice –HEAD
sudo npm install -g ios-deploy –unsafe-perm=true `

如果执行sudo npm install -g ios-deploy --unsafe-perm=true报错,执行sudo xcode-select --switch/Applications/Xcode.app/Contents/Developer/

如果没有安装 libimobiledevice,会导致Appium无法连接到iOS的设备,所以必须要安装,如果要在iOS10+的系统上使用appium,则需要安装ios-deploy
appium-doctor 安装

npm install appium-doctor -g

安装后执行appium-doctor –ios指令,可以查看与iOS相关配置是否完整,下图是全部配置都成功,如果出现有一项不正确在执行一次就可以,或者直接跳过

appium-doctor –ios

更新Appium中的WebDriverAgent
  • 到WebDriverAgent下载最新版本的WebDriverAgent
  • cd 进入下载后的WebDriverAgent文件
  • 执行 ./Scripts/bootstrap.sh
  • 直接用Xcode打开WebDriverAgent.xcodepro文件
  • 配置WebDriverAgentLib和WebDriverAgentRunner的证书
  • 连接并选择自己的iOS设备,然后按Cmd+U,或是点击Product->Test
  • 运行成功时,在Xcode控制台应该可以打印出一个Ip地址和端口号
  • 在网址上输入http://192.168.2.101:8100/status,如果网页显示了一些json格式的数据,说明运行成功。
  • 进入到Appium中的WebDriverAgent目录,目录路径如下/Applications/Appium.app/Contents/Resources/app/node_modules/appium/node_modules/appium-xcuitest-driver/
  • 将自己下载并编译后的WebDriverAgent替换Appium原有的WebDriverAgent

在Appium-Desktop下载传送门中下载最新版本的Appium-Desktop
  • 运行Appium-Desktop
  • 开启start server
  • 点击start new session并且在Desired Capabilities 中输入相关的参数后点击Start Session
  • 运行成功后,会弹出一个控制界面,在该界面中可以控制手机上正在运行的程序
利用Appium-Python-Client进行iOS的自动化测试
  • 安装python

    brew install python

  • 下载python-client
    git clone https://github.com/appium/python-client.git
    cd python-client
    python setup.py install

  • 在git上下载测试文件appiumSimpleDemo
开始自动化测试
  • 打开下载后的appiumSimpleDemo文件,打开appiumSimpleDemo.xcodepro程序,配置下TARGET的签名
  • 在appiumSimpleDemo的根目录执行编译指令,编译出一个app文件xcodebuild -sdk iphoneos -target appiumSimpleDemo -configuration Release,编译成功后app文件的地址会打印在命令行中

  • 配置python文件

    打开appiumSimpleDemo中的appiumSimpleDemo.py文件,将,修改setup中的几个参数,将app的路径,设备的相关信息修改成当前连接设备的信息。

如果执行 appiumSimpleDemo.py 报错 File”/usr/local/Cellar/python@2/2.7.15/Frameworks/Python.framework/Versions 请升级python版本,如果你是iOS开发人员,请谨慎,升级python有可能是Xcode无法打包参考文稿

参考链接

https://www.jianshu.com/p/ae8846736dba
https://github.com/zhshijie/appiumSimpleDemo
https://github.com/appium/appium-desktop/releases/tag/v1.2.0-beta.1
https://www.liaoxuefeng.com/wiki/001434446689867b27157e896e74d51a89c25cc8b43bdb3000/00143450141843488beddae2a1044cab5acb5125baf0882000
https://blog.csdn.net/iosswift/article/details/48765993

关于iOS订阅型内购开发

Posted on 2018-09-06

由于公司项目里面有一个类似购买一个时期的产品,原本使用消耗式内购来做,但是被苹果审核拒绝了,苹果建议(要求)使用订阅式内购来做这个,于是就来研究一下

1.第一步添加内购产品

首先还是添加内购产品,但是这次添加的就不是消耗型项目了,而是添加订阅型项目,添加的订阅型项目是可以分为不同的组,比如组A里面包含订阅一周的产品(10元),包含订阅一月的产品(20元);组B里面包含订阅一周的产品(15元),包含订阅一月的产品(30元);不同组的产品是相互直接没有影响的,可以同时存在多个(比如我购买了A组的产品1,B组的产品1);但是相同组的产品是只能同时存在一个;


点击创建之后会出现下图

点击下一步之后会出现是否创建分组,我图片中已经显示创建处理订阅组A,订阅组A,这里就不在截图显示了

2.第2步添加沙盒测试帐号

点击+添加沙盒测试帐号,沙盒帐号的作用就是你在iPhone 手机上登录这个测试帐号来测试你的内购项目可以不用真正花钱

3.第3步添加共享密钥

4.第4步编写代码

我是直接使用git上的一个三方库YQInAppPurchaseTool,只是在其基础上稍作改动,只是修改了一下方法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
#pragma mark 验证购买凭据
/**
* 验证购买凭据
*
* @param ProductID 商品ID
*/
- (void)verifyPruchaseWithID:(NSString *)ProductID
{
// 验证凭据,获取到苹果返回的交易凭据
// appStoreReceiptURL iOS7.0增加的,购买交易完成后,会将凭据存放在该地址
NSURL *receiptURL = [[NSBundle mainBundle] appStoreReceiptURL];
// 从沙盒中获取到购买凭据
NSData *receiptData = [NSData dataWithContentsOfURL:receiptURL];
// 发送网络POST请求,对购买凭据进行验证
//In the test environment, use https://sandbox.itunes.apple.com/verifyReceipt
//In the real environment, use https://buy.itunes.apple.com/verifyReceipt
// Create a POST request with the receipt data.
NSURL *url = [NSURL URLWithString:checkURL];

NSLog(@"checkURL:%@",checkURL);

// 国内访问苹果服务器比较慢,timeoutInterval需要长一点
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:20.0f];

request.HTTPMethod = @"POST";

// 在网络中传输数据,大多情况下是传输的字符串而不是二进制数据
// 传输的是BASE64编码的字符串
/**
BASE64 常用的编码方案,通常用于数据传输,以及加密算法的基础算法,传输过程中能够保证数据传输的稳定性
BASE64是可以编码和解码的
*/
NSString *encodeStr = [receiptData base64EncodedStringWithOptions:NSDataBase64EncodingEndLineWithLineFeed];
NSString *payload = [NSString stringWithFormat:@"{\"receipt-data\" : \"%@\", \"exclude-old-transactions\" : \"true\", \"password\" : \"1f0aae19eb7f344a818216af37d3c3f456\"}", encodeStr];
NSData *payloadData = [payload dataUsingEncoding:NSUTF8StringEncoding];

request.HTTPBody = payloadData;

// 提交验证请求,并获得官方的验证JSON结果
NSData *result = [NSURLConnection sendSynchronousRequest:request returningResponse:nil error:nil];

// 官方验证结果为空
if (result == nil) {
//NSLog(@"验证失败");
//验证失败,通知代理
[self.delegate IAPToolCheckFailedWithProductID:ProductID
andInfo:result];
return;
}

NSDictionary *dict = [NSJSONSerialization JSONObjectWithData:result
options:NSJSONReadingAllowFragments error:nil];

//NSLog(@"RecivedVerifyPruchaseDict:%@", dict);

if (dict != nil) {
// 验证成功,通知代理
// bundle_id&application_version&product_id&transaction_id
[self.delegate IAPToolBoughtProductSuccessedWithProductID:ProductID
andInfo:dict];
}else{
//验证失败,通知代理
[self.delegate IAPToolCheckFailedWithProductID:ProductID
andInfo:result];
}
}

上面代码里面的变量payload里面的password就是第三步生成的共享密钥

5.第5步就是数据传送给后台了

在把收据传给苹果验证,验证结束后苹果会把当前项目的开始时间,到期时间都返回给你,当然你可以可以直接把验证放在后台
验证返回的字段大致有一下:
latest_receipt 最新凭证
latest_receipt_info 最新凭证详情(可能会有多个,因为是不同组的产品,产品id是不同的)
expires_date 到期时间
expires_date_ms 到期时间毫秒
expires_date_pst 到期时间(太平洋的时间)
is_in_intro_offer_period 是否是在试用期
original_purchase_date 最初的购买时间
original_purchase_date_ms 最初的购买时间毫秒
original_purchase_date_pst 最初的购买时间(太平洋的时间)
product_id 产品id
purchase_date 最新的购买时间
purchase_date_ms 最新的购买时间毫秒
purchase_date_pst 最新的购买时间(太平洋的时间)

以上就是这次订阅内购的实践,过程里面还会遇到很多坑,比如消耗型内购起名字和简介不能出现货币的名称(比如人民币),AppStore 审核的时候链接改为正式链接,其实苹果审核的时候也是需要测试链接,只有当上线了才能使用正式链接,这个地方后台注意一下,如果是指定的错误码是21007(此收据来自测试环境,但已发送到生产环境进行验证。而是将其发送到测试环境。)或者是21008 (此收据来自生产环境,但已发送到测试环境进行验证。而是将其发送到生产环境。)后台更换一下验证路径;漏单处理等其它的内购问题就不在一一说了;

参考链接:

苹果官网内购文档
收据验证编码文档
iOS订阅型内购要点

如何使用Hexo搭建自己的博客站点

Posted on 2018-09-05

今天下午在家学习HTML的时候,着急没有练手的demo,突然想到自己以前看到别人的博客感觉像是自己用HTML写的,我也可以写一个,于是就去搜索了解了一下,就发现了使用Hexo配合GitHub搭建自己的博客。Let’s go~

Github Pages

Github Pages则是github上的一项功能,可以放置网页文件到指定文件夹,然后给你一个专属域名用于展示一些项目,现在大多用来开发制作个人博客网站

1.创建Github帐号

Github官网填写相应的注册信息就可以完成注册了

2.点击进入Github Pages

然后跟着一步一步走,完成后就可以在浏览器打开了
http://username.github.io
了。下面这个图片就是我建好的仓库了可以点击 https://yuanjiashuai.github.io 进入我的博客;

3.安装Node和Hexo

安装完成后测试安装状态

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24

$ node -v
v8.11.3

$ npm -v
5.6.0

$ hexo -v
hexo-cli: 1.1.0
os: Darwin 17.7.0 darwin x64
http_parser: 2.8.0
node: 8.11.3
v8: 6.2.414.54
uv: 1.19.1
zlib: 1.2.11
ares: 1.10.1-DEV
modules: 57
nghttp2: 1.32.0
napi: 3
openssl: 1.0.2o
icu: 60.1
unicode: 10.0
cldr: 32.0
tz: 2017c
4.开始建站

安装Hexo完成之后,就可以使用hexo建立所需的文件了

1
2
3
$ cd <folder>
$ hexo init
$ npm install

命令执行完成之后,建立的文件夹目录大致如下,其中_config.yml主要配置themes文件夹(主题)的个性定义,比如头像,昵称,简介以及编码格式,你要上传的Github地址等

source文件夹中有个posts文件夹,这个文件夹存放的主要是你的博客文章和一下资源文件

这样Hexo会在该文件夹创建本地博客所需的一切资源。这样本地博客就搭建好了,输入以下命令:

1
$hexo s --debug

hexo s –debug命令和hexo -s 功能是一样的,只是加上–debug会多出一些调试信息

5.同步博客到Github

现在你已经可以在本机查看你的博客了,但是要想让别人通过网络可以查看你的博客,还需要一步,那就是将你的博客发布到github仓库。在terminal终端,将当前目录切换到你的本地博客目录,执行以下命令:

1
npm install hexo-deployer-git --save

安装完成之后,打开本地博客目录的_config.yml文件,编辑其中的deploy节点:

1
2
3
4
deploy:
type: git
repo: https://yuanjiashuai.github.io.git
branch: master

注意:字段前需加空格,hexo有严格的格式规范。而且Hexo里面的Markdown语法也是一样,字段前面需要加空格

保存配置之后,你可以不着急传到仓库,先刷新本地博客,看是否还是原样,如有问题可以看到terminal终端上的错误信息,然后检查没问题为止。

确认无误之后,在本地博客目录执行以下命令:

1
2
3
hexo clean // clean本地项目,防止缓存
hexo g // 全拼是:hexo generate,可以简写成 hexo g; 根据你编辑的md格式的博客,生成静态网页
hexo d // 全拼是:hexo deploy,可以简写成 hexo d; 将本地博客发布到github

如果执行 hexo d 命令报错 ERROR Deployer not found: git,此时执行下列命令即可,然后在执行 hexo d

1
npm install --save hexo-deployer-git

这个时候就可以在地址栏输入 username.github.io 就可以访问你的博客了,别人也可以通过这个地址访问你的博客

6.主题配置

Hexo主题非常多,可以选择不同的主题 本文选 Anatole为主题风格

  • 首先切换到Themes文件夹下
  • Anatole主题下载地址 然后克隆下来放在Themes文件夹下
  • 修改_config.yml 里面的 theme字段的值为anatole 即可
  • 修改一些其他的个性化配置(下面的是我的配置)
  • 如果想要修改主题的个性配置,需要修改主题里面的_config.yml 文件,修改方法大致相同

7.添加评论

因为各种原因,我选择了Valine作为,我的评论框,首先在Valine注册帐号,并且创建一个应用,这个时候会有一个key和Id,如下图
,打开themes文件夹里面的anatole主题文件夹里面的_config.yml(这个地方修改原来的名字_confiy_simple.yml)把key和id填入如下图

这个时候再去看本地的博客就会发现已经有了评论框了

注意:如果提交评论不能提交打开comments.pug文件是一个链接网址有错误。更新就可

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
if theme.valine.enable == true
#vcomment
script(src='//cdn1.lncld.net/static/js/3.0.4/av-min.js')
//****************修改下面这句
script(src='//cdn.jsdelivr.net/gh/xcss/valine@v1.1.7/dist/Valine.min.js')
//****************修改上面这句
script.
var notify = '#{ theme.valine.notify }' == true ? true : false;
var verify = '#{ theme.valine.verify }' == true ? true : false;
var GUEST_INFO = ['nick','mail','link'];
var guest_info = '#{ theme.valine.guest_info }'.split(',').filter(function(item){
return GUEST_INFO.indexOf(item) > -1
});
guest_info = guest_info.length == 0 ? GUEST_INFO :guest_info;
window.valine = new Valine({
el:'#vcomment',
notify:notify,
verify:verify,
appId:'#{theme.valine.appid}',
appKey:'#{theme.valine.appkey}',
placeholder:'#{theme.valine.placeholder}',
avatar:'#{theme.valine.avatar}',
guest_info:guest_info,
pageSize:'#{theme.valine.pageSize}'
})
参考文档

Mac搭建Hexo博客流程记录

valine无法提交问题解决方法

HEXO博客轻松更换主题外观

Valine – 一款极简的评论系统

hexo d后 ERROR Deployer not found: git

为你的Hexo加上评论系统-Valine

hexo的next主题个性化教程:打造炫酷网站

解决打包上传一直停留在Authenticating with the iTunes Store问题

Posted on 2018-09-05

转载记录http://blog.csdn.net/whjay520/article/details/71158757

1
2
3
cd ~ 
mv .itmstransporter/ .old_itmstransporter/ 
"/Applications/Xcode.app/Contents/Applications/Application Loader.app/Contents/itms/bin/iTMSTransporter"

YuanJiaShuai

什么是勇敢?勇敢不是不怕,而是带着恐惧依然前行!

7 posts
© 2018 YuanJiaShuai
Powered by Hexo
|
Theme — NexT.Muse v5.1.4