iOS Universal Links

什么是Universal Links?

Universal Links 中文名:通用链接,是苹果在推出iOS9的时候推出的新功能,一种能方便的通过传统的HTTP链接来启动App,使用相同的网址打开网站和App。

通过唯一的网址,不需要Schema就可以跳转到界面到App里面,比如说在搜索引擎中搜索到某新闻(比如OO新闻网),点击新闻链接之后,如果iOS设备中安装了(并且支持通用链接)的应用,那么它将自动在App中打开这个页面,如果没有安装则在Safari中直接打开链接(和浏览网站一样)。

如果在服务器上配置Universal Links?

需要在域名根目录创建一个 apple-app-site-association 文件,没有任何扩展名。

文件内容如下:

{
    "applinks": {
        "apps": [],
        "details": [
            {
                "appID": "9JA89QQLNQ.com.apple.wwdc",
                "paths": [ "/wwdc/news/", "/videos/wwdc/2015/*" ]
            },
            {
                "appID": "TeamID.BundleID2",
                "paths": [ "*" ]
            }
        ]
    }
}

appID 必须是TeamID.Bundle Identifier的组合

根据paths键设定允许的列表,或者使用星号来表示任意。

注意:区分大小写。

举例:

* 只要域名符合即可,路径随意。
比如:http://xloli.net

/news/id/* 路径必须是 “/news/id/” + 后面任意
比如:http://xloli.net/news/id/12345

/news/ 路径必须是 “/news/”
比如:http://xloli.net/news/

再次提醒,apple-app-site-association必须在根目录。

Web服务器必须支持HTTPS,客户端只支持HTTPS协议访问,并且不支持任何重定向。

App处理Universal Links

点击项目设置中的Capabilities,将AssociatedDomains打开为ON(同时还需要在开发者网站中AppID中也要打开)。

在下面Domains中添加域名,格式如下:

applinks:domain.com

举例:

applinks:xloli.net
applinks:www.xloli.net

当设置完毕之后,当你第一次启动App的时候会从指定的路径自动下载文件。

https://domain.com/apple-app-site-association

最后需要在AppDelegate中实现自己的逻辑,比如根据URL的规则进行指定的跳转。

func application(application: UIApplication, continueUserActivity userActivity: NSUserActivity, restorationHandler: ([AnyObject]?) -> Void) -> Bool {
        if let url = userActivity.webpageURL {
            print(url)
            // 根据URL 书写自己必要的逻辑代码
        }
        return true // true 将会打开App, false 不会打开App。
}

CentOS 6 下OpenSSL升级到OpenSSL 1.0.1g

下载并安装OpenSSL 1.0.1g

左边的# 意思是需要root权限,实际输入命令请不要输入。

# cd /usr/src
# wget https://www.openssl.org/source/openssl-1.0.1g.tar.gz -O openssl-1.0.1g.tar.gz
# tar -zxf openssl-1.0.1g.tar.gz
# cd openssl-1.0.1g
# ./config
# make
# make install

替换系统的OpenSSL:

# rm /usr/bin/openssl
# ln -s /usr/local/ssl/bin/openssl /usr/bin/openssl
# openssl version
显示:OpenSSL 1.0.1g 7 Apr 2014

升级完成!

iOS 跳转到系统App的方法

使用 UIApplication.sharedApplication().openURL 方法可以跳转到系统的App中。

跳转到程序 自身的设定可以使用以下方法:

 Swift

UIApplication.sharedApplication().openURL(NSURL(string: UIApplicationOpenSettingsURLString))

Objc

[[UIApplication sharedApplication] openURL:[NSURL URLWithString:UIApplicationOpenSettingsURLString]];

参考:

About —> prefs:root=General&path=About

Accessibility —> prefs:root=General&path=ACCESSIBILITY

Airplane Mode On —> prefs:root=AIRPLANE_MODE

Auto-Lock —> prefs:root=General&path=AUTOLOCK

Brightness —> prefs:root=Brightness

Bluetooth —> prefs:root=General&path=Bluetooth

Date & Time —> prefs:root=General&path=DATE_AND_TIME

FaceTime —> prefs:root=FACETIME

General —> prefs:root=General

Keyboard —> prefs:root=General&path=Keyboard

iCloud —> prefs:root=CASTLE

iCloud Storage & Backup —> prefs:root=CASTLE&path=STORAGE_AND_BACKUP

International —> prefs:root=General&path=INTERNATIONAL

Location Services —> prefs:root=LOCATION_SERVICES

Music —> prefs:root=MUSIC

Music Equalizer —> prefs:root=MUSIC&path=EQ

Music Volume Limit —> prefs:root=MUSIC&path=VolumeLimit

Network —> prefs:root=General&path=Network

Nike + iPod —> prefs:root=NIKE_PLUS_IPOD

Notes —> prefs:root=NOTES

Notification —> prefs:root=NOTIFICATIONS_ID

Phone —> prefs:root=Phone

Photos —> prefs:root=Photos

Profile —> prefs:root=General&path=ManagedConfigurationList

Reset —> prefs:root=General&path=Reset

Safari —> prefs:root=Safari

Siri —> prefs:root=General&path=Assistant

Sounds —> prefs:root=Sounds

Software Update —> prefs:root=General&path=SOFTWARE_UPDATE_LINK

Store —> prefs:root=STORE

Twitter —> prefs:root=TWITTER

Usage —> prefs:root=General&path=USAGE

VPN —> prefs:root=General&path=Network/VPN

Wallpaper —> prefs:root=Wallpaper

Wi-Fi —> prefs:root=WIFI

Android Studio 手动启用 AIDL

通常使用新建-ADIL会自动的创建相关的配置,不过在手动更名的方式下可能无法自动创建配置,这个时候需要修改项目中的build.gradle文件。

在build.gradle文件中android节点里添加以下的代码就可以了。

    sourceSets{

        main{

            aidl.srcDir \’src/main/java\’

        }

    }

中间的aidl.srcDir 后面的路径要填写实际的目录(不用到Package)。

RelativeLayout常用属性介绍

第一类:属性值为true或false

android:layout_centerHrizontal 水平居中

android:layout_centerVertical 垂直居中

android:layout_centerInparent 相对于父元素完全居中

android:layout_alignParentBottom 贴紧父元素的下边缘

android:layout_alignParentLeft 贴紧父元素的左边缘

android:layout_alignParentRight 贴紧父元素的右边缘

android:layout_alignParentTop 贴紧父元素的上边缘

android:layout_alignWithParentIfMissing 如果对应的兄弟元素找不到的话就以父元素做参照物

(更多…)

RxSwift 入门 - 第一部分

Observables

Observables是一个事件流的对象,通过以下的函数可以生成一个事件流。

  • empty
  • just
  • of
  • toObservable
  • create
  • error
  • deffered

通过subscribe方法可以监听订阅流中的数据,在闭包中进行必要的逻辑编程。

热信号vs冷信号

信号分两种,热信号在它创建的时候就开始推送事件,这意味着如果后面有订阅者来的时候,就可能会错过一些事件。而冷信号则不会,只有在它被订阅的时候,它才会发送事件,这可以保证后面即使有订阅者中途加入的时候也能收到完整的事件序列。

(更多…)

Fusion Drive 组建

一、       Fusion Drive 介绍

在 Apple Store 在线商店作为可配置选件提供的 Fusion Drive 是一个突破性概念,它将传统硬盘存储容量大的特点与闪存高性能的特点融合在一起。iMac 配置 Fusion Drive 之后,在执行磁盘密集型任务时,例如启动系统、启动 app 以及导入照片时,将运行地更加快速、更加高效。这是因为频繁使用的项目存储在速度更快的闪存中,不常访问的项目则存储在硬盘中。文件传输在后台进行,你甚至丝毫察觉不到。随着系统逐渐了解你的工作方式,Fusion Drive 可以为你带来更出色的 Mac 使用体验,而你不必费心做任何事。目前,Apple 可提供 1TB 和 3TB 两种容量的 Fusion Drive 供用户选择。

(更多…)

Xcode真机调试could not find developer disk image解决方法

在使用Xcode进行真机调试的时候,由于真机系统过高或者过低,Xcode中没有匹配的配置文件,会出现【could not find developer disk image】的错误,通常更新最新版本的Xcode可以解决问题,如果不想更新,可以从官网下载最新的Xcode或者Xcode beta (如果测试机为 beta版系统) 下载最新的dmg文件,在下面的文件夹中寻找需要的配置文件夹。

(更多…)

无需SHSH!iPhone4S系统降级IOS6.1.3 !

就在昨天日常的逛论坛,无意间发现了iPhone4s系统可以被降级到6.1.3,正好手上有一个可以用以降级的机器,于是乎开始着手起来,此次降级操作需要有一定计算机操作经验,以下是我记录的操作流程。

以下操作限定OSX操作系统Linux操作系统请研究odysseusOTA中的README文件。Windows目前暂不支持: )

为了保证降级一次成功,建议重新刷最新的可越狱系统,使用恢复模式进行刷机。 (更多…)

解决Xcode6模拟器消失的问题

最近公司重新安装了一下xcode6,发现以前所使用的iPhone模拟器全部消失了,只剩下一个自己的真机在上面,通过网上查询资料找到了解决办法。

依次打开“Xcode->Window->Devices”,点击位于左下角的“+”按钮,新增常使用的设备即可,不常使用的设备也可以在选中后,点击“-”移除。

不知道是什么时候才出现的这个问题,之前一直使用xcode6 beta没有遇到问题。

iOS判断推送权限开关是否打开

根据 [[UIApplication sharedApplication] enabledRemoteNotificationTypes] 的返回值来进行判断,该返回值是一个枚举值,如下:

typedef enum {
UIRemoteNotificationTypeNone = 0,
UIRemoteNotificationTypeBadge = 1 << 0,
UIRemoteNotificationTypeSound = 1 << 1,
UIRemoteNotificationTypeAlert = 1 << 2,
UIRemoteNotificationTypeNewsstandContentAvailability = 1 << 3,
} UIRemoteNotificationType;

如果是 UIRemoteNotificationTypeNone ,则可以认为推送开关没有打开,反之亦然。

不过在iOS8中苹果对其做出了调整,需要使用下面的代码进行判断:

if (is_ios_8) {
UIUserNotificationSettings *mySet = [[UIApplication sharedApplication] currentUserNotificationSettings];
mySet.types; // <– 这里是一个枚举值
}

枚举值有如下:

typedef NS_OPTIONS(NSUInteger, UIUserNotificationType) {
UIUserNotificationTypeNone = 0, // the application may not present any UI upon a notification being received
UIUserNotificationTypeBadge = 1 << 0, // the application may badge its icon upon a notification being received
UIUserNotificationTypeSound = 1 << 1, // the application may play a sound upon a notification being received
UIUserNotificationTypeAlert = 1 << 2, // the application may display an alert upon a notification being received
} NS_ENUM_AVAILABLE_IOS(8_0);

使用linux sendmail发送邮件

sendmail是linux/unix系统下用来发送邮件的客户端。sendmail使用SMTP协议将邮件发送到目的SMTP服务器。其工作流程大概如下:
首先要说一下DNS的MX记录:SMTP服务器基于DNS中的MX(mail exchange)记录来路由电子邮件,MX记录注册了域名和相关的SMTP中继主机,属于该域的电子邮件都应向该主机发送。

(1)Sendmail 请求DNS给出主机sh.abc.com的CNAME 记录,如有,假若CNAME(别名记录)到shmail.abc.com,则再次请求shmail.abc.com的CNAME记录,直到没有为止。
(2)假定被CNAME到shmail.abc.com,然后sendmail请求@abc.com 域的DNS给出shmail.abc.com的MX记录(邮件路由及记录),shmail MX 5 shmail.abc.com 10 shmail2.abc.com。
(3)Sendmail组合请求DNS给出shmail.abc.com的A记录(主机名(或域名)对应的IP地址记录),即IP地址,若返回值为10.0.0.4(假设值)。
(4)Sendmail与10.0.0.4连接,传送这封给user@sh.abc.com 的信到1.2.3.4 这台服务器的SMTP后台程序。

1. 构造邮件
在使用sendmail发送邮件之前,首先需要按邮件格式构造一封邮件。包括邮件头,邮件消息体。邮件格式在RFC5322:internet message format(http://tools.ietf.org/html/rfc5322)中有详细说明。

From: Lolita Demo <example@xloli.com>
Sender: Lolita Demo <example@xloli.com>
To: Zmsky <example@xloli.net>
Subject: Hello World!

This is a message just to say hello.
So, “Hello”.

2. 使用sendmail发送邮件

将邮件构造好之后,保存到一个本地文件,如/data/mail_content。然后调用sendmail发送,发送时指定接收邮箱地址:

cat /data/mail_content | sendmail example@xloli.net

 

3. 发送HTML格式的邮件

如果要发送html格式的邮件, 就是说,邮件的消息体为一个html文件,需要在邮件头中指定 content-type为 text/html。如果不指定,默认情况下,content-type为text/plain,即普通文本。

From: Lolita Demo <example@xloli.com>
Sender: Lolita Demo <example@xloli.com>
To: Zmsky <example@xloli.net>
Content-type: text/html
Subject: Hello World!

<div style=”border:solid 1px #1D448C;”>
<h1>This is a message just to say hello.</h1>
<p>So, “Hello”.</p>
</div>

佳能EOS 650D 更换顶盖修复热靴和距离感应器

购买佳能EOS650D单反相机有很长一段时间了,最近购买了品色的TTL闪光灯X650c,使用下来还是挺不错的,不过后面发现总是过曝或者欠爆,以为闪光灯出了问题,仔细研究一番发现,是TTL信息似乎没有传输过去,后面垫了张纸忍忍过去了。

可是接下来距离传感器莫名其妙的坏掉了,开机之后屏幕马上黑屏,只有按Q键或者电子取景器模式才能用屏幕,后面拆机后发现无法解决,于是乎装回去,然后无意间翻设置,找到一个叫做自动关闭屏幕的设置,关闭之后主界面不会自动黑屏了,不过连凑上去也不会黑,虽说没啥问题了,但是还是感觉不太方便。 (更多…)

TOTOLINK A2004NS 路由器最新固件升级方法

Totolink 是韩国 iptime 在中国的子品牌,A2004NS 算得上是一款性价比很好的无线路由器,拥有千兆WAN和千兆LAN,还有 USB 2.0 接口。

目前中文版的最新固件版本是 8.84,不知道为什么国外版本已经9.26了,国内一直没有动静。
不过中英文固件不能混用,直接刷韩国IPTIME官网的固件会出错,需要要先升级过度固件 a2004ns_en_8_92_mod.bin
升级成功之后再升级官网的最新固件(英文版)a2004ns_en_9_26.bin,固件版本已升级到 9.26 (截止2014年9月12日)
升级固件后,路由器管理界面变成英文(英文有障碍的请慎重),所有设置都在,无需重新设置。新固件改进了稳定性(必须的,不然还出什么新固件),部分功能有变化,自然也有新功能登场。

(更多…)

MySQL数据库”mysql SQL Error:1146,SQLState:42S02 “解决方法

项目在开发的时候在Mac平台下开发的,开发完了之后在LINUX环境上部署好之后,运行时MySQL数据库报错,提示为某个表不存在之类的错误信息,后来修改了MySQL的配置文件将大小写敏感去掉,问题解决。
这个问题的根源在于,在 MySQL 中,数据库和表其实就是数据目录下的目录和文件,因而,操作系统的敏感性决定数据库和表命名的大小写敏感。这就意味着数据库和表名在 Windows 中是大小写不敏感的,而在大多数类型的 Unix/Linux 系统中是大小写敏感的。

(更多…)