3月 11

swift 代码生成导航条

swift开始学习使用代码做UI。记录导航条生成。

    // 加载导航条
    func setupPageNav(){
        let topNav:UINavigationBar=UINavigationBar()
        let topNavIemt:UINavigationItem=UINavigationItem()
        topNavIemt.title="单条设置"
        //添加右侧按键
        topNavIemt.rightBarButtonItem=UIBarButtonItem(title:"返回", style:.Plain,target:self, action:"backPage")
        topNav.tintColor = UIColor.blueColor()
        //画个矩形框
        topNav.frame = CGRectMake(0, 0,self.view.frame.width,64)
        topNav.pushNavigationItem(topNavIemt, animated: true)
        self.view.addSubview(topNav)
    }
2月 26

iPhone 手机控制linux服务器,swift2语言使用pickerview控件源码

之前的写的“iPhone 手机控制linux服务器程序源码”(http://www.simonzhang.net/?p=2861 )。开启时间使用textfidld,太麻烦了。就保留常用的几个时间即可。所以改为使用pickerview控件。控制没有使用故事板,直接代码控制位置。源码如下,其他部分使用之前的代码。iphone6调试正常。

//
//  door.swift
//  mydoor
//
//  Created by zhangzimeng on 16/1/6.
//  Copyright © 2016年 com. All rights reserved.
//

import UIKit
import Alamofire
import Crypto

class ViewController: UIViewController,UIPickerViewDataSource,UIPickerViewDelegate {
    var timePicker:UIPickerView!
    var buildString = ["3秒", "30分钟" , "1小时", "2小时", "3小时", "4小时"]
    var buildInt = ["3", "1800" , "7200", "7200", "10800", "14400"]
    let kk = "09999999999999"
    let url = "http://www.simonzhang.net/door?"
    
    @IBAction func dangdang(sender: AnyObject) {
        // 获取要开发的时间
        let row:Int = self.timePicker.selectedRowInComponent(0)
        let getSec=buildInt[row]
        // 获取当前两位小时和分
        let Hour:NSDate = NSDate()
        let Min:NSDate = NSDate()
        let dateForm=NSDateFormatter()
        dateForm.dateFormat="HH"
        let getHour=dateForm.stringFromDate(Hour)
        dateForm.dateFormat="mm"
        let getMin=dateForm.stringFromDate(Min)
        // 拼接要加密的穿
        let ss=kk+getHour+getMin
        let authMd5 = ss.MD5
        // 拼接要访问的字符串
        let doorUrl = url+"se="+getSec+"&au="+authMd5!
        // 开始访问
        var returnText = ""
        Alamofire.request(.GET, doorUrl)
            .responseString{ openStatus in
                if openStatus.result.value == "成功"{
                    returnText="成功"
                }else{
                    returnText="失败"
                }
                UIAlertView(title: "敲门结果", message: returnText,
                    delegate: nil, cancelButtonTitle: "确定").show()
        }
    }
    
    override func viewDidLoad() {
        super.viewDidLoad()
        timePicker=UIPickerView()
        // 定义位置
        self.timePicker.frame = CGRectMake(120, 100, 150, 200)
        // 绑定数据
        self.timePicker.delegate=self
        self.timePicker.dataSource=self
        //设置选择框的默认值
        timePicker.selectRow(3,inComponent:0,animated:true)
        //添加到界面中
        self.view.addSubview(timePicker)
    }
    
    //设置选择框的列数为1列,继承于UIPickerViewDataSource协议
    func numberOfComponentsInPickerView(pickerView: UIPickerView) -> Int {
        return 1
    }
    
    // 返回要显示文字的列表
    func pickerView(pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int {
        if (pickerView.tag == 1){
            return buildString.count
        }else{
            return buildString.count
        }
    }
    
    // 返回显示内容
    func pickerView(pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? {
        if (pickerView.tag == 1){
            return "\(buildString[row])"
        }else{
            return "\(buildString[row])"
        }
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }
}

2月 23

swift2 使用webview禁止拖动和缩放等操作

class部分声明实例变量
@IBOutlet weak var web: UIWebView!

//故事版加载后处理
override func viewDidAppear(animated: Bool) {
    // 禁止浏览器拖动
    web.scrollView.bounces=false
    // 禁止缩放
    web.scrollView.bouncesZoom=false
    // 网页内容可以自动适应屏幕
    web.scalesPageToFit=true
    //获取浏览器大小
    let point:CGSize=web.scrollView.contentSize
    // 可以识别页面里面的信息,如果电话,邮件等
    //web.dataDetectorTypes=UIDataDetectorTypes.All
    // 获取 UIWebView 的 UIScrollView 属性 大小
    //let webScroll = web.scrollView
    // 设置 UIWebView 接收的数据是否可以通过手势来调整页面内容大小
    web.scalesPageToFit = true
    // 设置 UIWebView 内是否可以回放媒体
    web.allowsInlineMediaPlayback = false
    // 设置 UIWebView 中的 HTML5 视频是否自动播放
    web.mediaPlaybackRequiresUserAction = true
    // 设置 UIWebView 是否可以使用 Air 播放
    web.mediaPlaybackAllowsAirPlay = false
    // 设置 UIWebView 是否使用同步加载(默认是False)
    //web.suppressesIncrementalRendering = false
    // 设置 UIWebView 在点击视图或者元素时是否显示键盘(默认是True)
    web.keyboardDisplayRequiresUserAction = true
    // 设置 UIWebView 的分页模式
    //web.paginationMode = UIWebPaginationMode.RightToLeft
    // 设置 UIWebView 的分页打破模式
    //web.paginationBreakingMode = UIWebPaginationBreakingMode.Column
    // 设置 UIWebView 的分页长度
    //web.pageLength = 400
    // 设置 UIWebView 每个分页之间的宽度
    //web.gapBetweenPages = 100
}
1月 12

iPhone 手机控制linux服务器程序源码

  将远程连接SSH和数据库MySQL开放到外网很危险。
即使密码和KEY管理后都很安全了,但是还会有不少的扫描程序来扫描浪费资源。
但是我没有机器做跳板机或代理,也没有多余的IP和资源做VPN。
所以直接用防火墙把相应服务的端口对外网服务屏蔽,然后用个隐蔽的端口做中转。
中转服务需要就开放,不需要就关闭。这个服务当然也可以不用haproxy,直接关闭或打开防火墙。
也可以用这个服务管理其它的服务器上其它程序的启停。开始着手处理。

  服务端为Linux服务器(centos7),python2.7+tornado开发。客户端用swift2开发跑在iphone6上。

haprox安装后,跳转主要配置部分。
frontend ssh
bind x.x.x.x:20000
default_backend nat_ssh

backend nat_ssh
mode tcp
option tcpka
balance roundrobin
option httpchk
server ssh 192.168.1.222:22

服务端代码需要注意的部分:
服务端存放在/program/www/mydoor下。
文件myDoorServer.py的类MyDoorHandler中使用os.popen调用系统命令,绝对路径需要确认。Listen端口自行修改。
如:
line = “cd /program/www/mydoor;/usr/bin/python mydoor.py %s %s &” % (_se, _au)

文件mydoor.py中的kk为验证使用,自行修改,但是需要与swift中的kk值对应。执行命令的绝对路径需要根据系统确认。
要管理服务的命令,修改后就可以管理不同的应用。
使用“python myDoorServer.py &”启动服务。

客户端比较简单,修改kk值后,直接编译到手机上。需要的第三方的库,Alamofire和Crypto。
启动程序,输入开放时间,点击“敲”。实验成功。
mydoor20160107

服务端源码
iPhone客户端源码