2011-06-22 09:51:00 lfhfut 阅读数 6723

原创文章,转载请注明: 转载自All-iPad.net 本文链接地址: Unity + Xcode3.2.6 + iOS SDK4.3的问题终于得到解决

6月15号,来自于Unity官方博客的一条消息,Unity + Xcode3.2.6 + iOS SDK4.3的问题终于得到解决了!这个困扰了无数Unity开发者,也包括我的问题,最终还是在论坛热心观众“susantio” and “ratrodstudio”的帮助之下,不是Unity,也不是Apple,多少还是让人有些失望。

虽然Unity官方再次强调“because all the troubles were happening after application gets post-processed for AppStore on Apple’s side”,可这仍然是相当的不作为。要知道,受影响的开发者有多少!

 

好了,Unity3.4即将发布,这个BUG修复已经集成到了这个新版本里,如果你等不及的话,也可以按照官方提供的方法先尝试一下,我没有试过,不过应该不会再有问题了。

 

Instructions how to add this flag to your release build when using Xcode 3.2.6 (SDK 4.3):

1. Open your project in Xcode.
2. In the Xcode menu select Project->Edit Active Target.
3. In the Configuration drop down select “Release”.
4. In the Search field type “linker”.
5. Find the field named “Other Linker Flags” and double click on it.

Xcode3_config

6. Click “+” and add “-all_load”.

Xcode3_linkerflags

7. Clean all targets.

Instructions how to add this flag to your release build when using Xcode 4/4.0.2 (SDK 4.3):

1. Open your project in Xcode.
2. In the Project Navigator click on your project.
3. On the next pane select “Unity-iPhone” under TARGETS.
4. On the next pane select “Build Settings”.
5. In the Search field type “linker”.
6. Find the field named “Other Linker Flags” and double click on “Release” configuration near it.

Xcode4_config

7. Click “+” and add “-all_load”.

Xcode4_linkerflags

8. Clean all targets.
9. Make a distribution build by clicking “Product”->”Build For”->”Build For Archiving” (Note:don’t use Product->Build, because it will make “debug” build by default and won’t include “-all_load” flag).

 

原创文章,转载请注明: 转载自All-iPad.net

本文链接地址: Unity + Xcode3.2.6 + iOS SDK4.3的问题终于得到解决

2019-09-02 11:28:25 kyl282889543 阅读数 61

1. iOS SQLite.swift 简介

  • 之前使用SQLite苹果官方框架的痛点

之前在Swift下使用SQLite很是麻烦(当然OC下也是挺麻烦的),苹果官方文档中,要使用原生的SQLite,要先导入framwork,然后建一个.h文件,还要做一次Swift与C语言的桥接(SQLite是基于C语言的),使用的时候还要写SQL语句,反正就是很麻烦,需要写很多胶水代码。

  • Swift下的SQLite.swift就是为了解决上面痛点而产生的。不过只支持swift4.0以上版本。

2. iOS SQLite.swift 安装

  • 这里只介绍pod安装:
pod 'SQLite.swift', '~> 0.11.4'

3. iOS SQLite.swift 使用

3.1 导入

  • 在要使用SQLite的地方导入头文件,当然一般会将数据库操作封装到一个类中import SQLite

3.2 创建/连接数据库

  • 比如在iOS下,要在Document文件夹下创建一个名为db.sqlite3的数据库,并且要连接数据库。
//获取doc路径
let path = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true).first!
//如果不存在的话,创建一个名为db.sqlite3的数据库,并且连接数据库
let db = try Connection("\(path)/db.sqlite3")
  • 如果你把一个数据库应用程序(例如,复制数据库文件到你的Xcode项目并将其添加到你的应用程序的target),你可以建立一个只读连接。
let path = Bundle.main.pathForResource("db", ofType: "sqlite3")
let db = try Connection(path, readonly: true)
  • 如果省略路径,sqlite.swift将提供一个内存数据库。
//创建一个内存数据库
let db = try Connection() 
  • 有时候多个数据库连接使用同一个数据库的时候,可能会出现线程安全的问题,这时候访问数据库可能会出错,这时候就有类似于网络访问超时的机制,如果为单个数据库维护多个连接,可以设置超时时间(以秒为单位)以及繁忙处理程序。
db.busyTimeout = 5

db.busyHandler({ tries in
    if tries >= 3 {
        return false
    }
    return true
})

3.3 Expression基本表达式

  • Swift和SQLite数据类型的对照图

Swift和SQLite数据类型的对照图

  • 表达式是与类型(内置或自定义)、原始SQL和(可选)值绑定到该SQL的通用结构。通常,您只需显式地创建表达式来描述列,通常每列只有一次。
let id = Expression<Int64>("id")
let email = Expression<String>("email")
let balance = Expression<Double>("balance")
let verified = Expression<Bool>("verified")
  • 以上表达式分别表示表的字段,第一个字段名是id,类型是Int64,第二个字段名是email,类型是String…以此类推,以上创建的是不为空的,要创建可以为空的字段,可以这样创建:let name = Expression<String?>("name")

3.4 创建表

  • 声明一个Table常量
let users = Table("users")
  • 使用上文表达式创建的字段,如果表不存在,就创建表
try db.run(users.create(ifNotExists: true) { t in     // CREATE TABLE "users" (
    t.column(id, primaryKey: true) //     "id" INTEGER PRIMARY KEY NOT NULL,
    t.column(email, unique: true)  //     "email" TEXT UNIQUE NOT NULL,
    t.column(name)                 //     "name" TEXT
}) 
  • 我们也可以对字段进行约束。设置字段为主键/自增/唯一/检查/设置默认值/校对/设置外键等等
t.column(id, primaryKey: true)
// "id" INTEGER PRIMARY KEY NOT NULL

t.column(id, primaryKey: .autoincrement)
// "id" INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL

t.column(email, unique: true)
// "email" TEXT UNIQUE NOT NULL

t.column(email, check: email.like("%@%"))
// "email" TEXT NOT NULL CHECK ("email" LIKE '%@%')

t.column(name, defaultValue: "Anonymous")
// "name" TEXT DEFAULT 'Anonymous'

t.column(email, collate: .nocase)
// "email" TEXT NOT NULL COLLATE "NOCASE"
t.column(name, collate: .rtrim)
// "name" TEXT COLLATE "RTRIM"

t.column(user_id, references: users, id)
// "user_id" INTEGER REFERENCES "users" ("id")
  • 表之间的约束
//不像上面的字段约束,它支持所有的数据库类型,升序和降序命令,和复合(多字段)键。
 t.primaryKey(email.asc, name)
// PRIMARY KEY("email" ASC, "name")

//不像上面的字段约束,它支持复合(多字段)键。
t.unique(local, domain)
// UNIQUE("local", "domain")

t.check(balance >= 0)
// CHECK ("balance" >= 0.0)

//可以使用过滤器运算符和函数轻松地构造布尔表达式。
t.check(balance >= 0)
// CHECK ("balance" >= 0.0)

//和上面的引用约束不同的是,它支持SQLite的全部类型,比如更新、删除操作以及复合(多字段)键。
t.foreignKey(user_id, references: users, id, delete: .setNull)
// FOREIGN KEY("user_id") REFERENCES "users"("id") ON DELETE SET NULL

3.5 增,删,改,查

3.5.1 插入操作(增)

  • 通过insert()方法进行插入操作,操作成功会返回一个类型为Int64的ROWID
try db.run(users.insert(email <- "alice@mac.com", name <- "Alice"))
// INSERT INTO "users" ("email", "name") VALUES ('alice@mac.com', 'Alice')

try db.run(users.insert(or: .replace, email <- "alice@mac.com", name <- "Alice B."))
// INSERT OR REPLACE INTO "users" ("email", "name") VALUES ('alice@mac.com', 'Alice B.')

do {
    let rowid = try db.run(users.insert(email <- "alice@mac.com"))
    print("inserted id: \(rowid)")
} catch {
    print("insertion failed: \(error)")
}
  • 如果insert()方法没有任何参数,全部字段都会以默认值录入数据库表,字段没有默认值的,会报错。

3.5.2 删除操作(删)

  • 使用delete()方法进行删除操作:
try db.run(users.delete())
// DELETE FROM "users"
  • 可以先使用filter()方法进行过滤操作,指定范围进行删除操作
let alice = users.filter(id == 1)
try db.run(alice.delete())
// DELETE FROM "users" WHERE ("id" = 1)    
  • 删除操作会返回被删除数据的行号
do {
    if try db.run(alice.delete()) > 0 {
        print("deleted alice")
    } else {
       print("alice not found")
    }
} catch {
    print("delete failed: \(error)")
}

3.5.3 更新操作(改)

  • 赋值方法:

在SQLite.swift中,可以直接使用 ‘<-’ 为字段赋值,由上文表达式一节可见端倪,同样,我们也可以在update,delete等语句中使用同样格式进行操作。比如,在更新语句中:try db.run(users.update(balance-=10)) 这条语句是指对表中全部数据的balance字段进行 -10 操作。

  • 使用update()方法进行更新操作:
try db.run(users.update(email <- "alice@me.com"))
// UPDATE "users" SET "email" = 'alice@me.com'    
  • 可以先使用filter()方法进行过滤操作,指定范围进行更新操作
let alice = users.filter(id == 1)
try db.run(alice.update(email <- "alice@me.com"))
// UPDATE "users" SET "email" = 'alice@me.com' WHERE ("id" = 1)
  • 更新操作会返回被更新数据的行号
do {
    if try db.run(alice.update(email <- "alice@me.com")) > 0 {
        print("updated alice")
    } else {
        print("alice not found")
    }    
} catch {
    print("update failed: \(error)")
}

3.5.4 查询操作(查)

  • 在SQLite.swift中,使用prepare()方法表示SELECT操作。此方法返回的是一组数据,我们可以使用forin循环从里面取出数据.
for user in try db.prepare(users) {
    print("id: \(user[id]), email: \(user[email]), name: \(user[name])")
}
// SELECT * FROM "users"
  • 在一条数据中的列下标将尝试中止错误的情况下执行,如果想处理这种情况,可以使用Row.get(_ column: Expression)
for user in try db.prepare(users) {
    do {
        print("name: \(try user.get(name))")
    } catch {
        // handle
    }
}    
  • 我们可以通过对数据库连接上的pluck方法的查询来获取第一行。
if let user = try db.pluck(users) { /* ... */ } // Row
// SELECT * FROM "users" LIMIT 1
  • 将查询结果封装成一个数组也很简单,我们可以这样处理:
let all = Array(try db.prepare(users))
// SELECT * FROM "users"
  • 上面的是指一些很简单的查询操作,实际操作中这些肯定满足不了我们的需求的,所以要用到复合查询操作。
let query = users.select(email)           // SELECT "email" FROM "users"
                 .filter(name != nil)                // WHERE "name" IS NOT NULL
                 .order(email.desc, name)   // ORDER BY "email" DESC, "name"
                 .limit(5, offset: 1)                 // LIMIT 5 OFFSET 1
  • 选择指定的字段
for user in try db.prepare(users.select(id, email)) {
   print("id: \(user[id]), email: \(user[email])")
    // id: 1, email: alice@mac.com
}
// SELECT "id", "email" FROM "users"
  • 数据表内联接,比如将posts表的user_id和users表的id作为连接条件,内联两个表
users.join(posts, on: user_id == users[id])
// SELECT * FROM "users" INNER JOIN "posts" ON ("user_id" = "users"."id")
  • 以上是表之间的连接,有时候涉及到表内自联,这时候就要用到数据表别名alias
let managers = users.alias("managers")
let query = users.join(managers, on: managers[id] == users[managerId])
// SELECT * FROM "users"
// INNER JOIN ("users") AS "managers" ON ("managers"."id" = "users"."manager_id")
  • 选择的条件:
users.filter(id == 1)
// SELECT * FROM "users" WHERE ("id" = 1)

users.filter([1, 2, 3, 4, 5].contains(id))
// SELECT * FROM "users" WHERE ("id" IN (1, 2, 3, 4, 5))

users.filter(email.like("%@mac.com"))
// SELECT * FROM "users" WHERE ("email" LIKE '%@mac.com')

users.filter(verified && name.lowercaseString == "alice")
// SELECT * FROM "users" WHERE ("verified" AND (lower("name") == 'alice'))

users.filter(verified || balance >= 10_000)
// SELECT * FROM "users" WHERE ("verified" OR ("balance" >= 10000.0))
  • 排序操作(ASC:升序,DESC:降序),根据email和name字段排序
users.order(email, name)
// SELECT * FROM "users" ORDER BY "email", "name"
  • email字段降序,name字段升序
users.order(email.desc, name.asc)
// SELECT * FROM "users" ORDER BY "email" DESC, "name" ASC
  • 分页操作,取前面5条数据
users.limit(5)
// SELECT * FROM "users" LIMIT 5
  • 分页操作, 偏移量为5,取偏移量后面5条数据
users.limit(5, offset: 5)
// SELECT * FROM "users" LIMIT 5 OFFSET 5
  • 聚合操作
let count = try db.scalar(users.count)
  // SELECT count(*) FROM "users"
let count = try db.scalar(users.filter(name != nil).count)
// SELECT count(*) FROM "users" WHERE "name" IS NOT NULL
let count = try db.scalar(users.select(name.count)) // -> Int
// SELECT count("name") FROM "users"
let max = try db.scalar(users.select(id.max)) // -> Int64?
// SELECT max("id") FROM "users"
let min = try db.scalar(users.select(id.min)) // -> Int64?
// SELECT min("id") FROM "users"
let average = try db.scalar(users.select(balance.average)) // -> Double?
// SELECT avg("balance") FROM "users"
let sum = try db.scalar(users.select(balance.sum)) // -> Double?
// SELECT sum("balance") FROM "users"
let total = try db.scalar(users.select(balance.total)) // -> Double
// SELECT total("balance") FROM "users"

3.6 错误处理

  • 你可以匹配上选择性地抓住SQLite的错误错误。例如,专门处理约束错误
do {
    try db.run(users.insert(email <- "alice@mac.com"))
    try db.run(users.insert(email <- "alice@mac.com"))
} catch let Result.error(message, code, statement) where code == SQLITE_CONSTRAINT {
    print("constraint failed: \(message), in \(statement)")
} catch let error {
    print("insertion failed: \(error)")
}
  • Result.error类型包含描述错误的英语文本(信息),错误代码(参见SQLite结果代码列表详情),产生错误的语句的一个可选的引用。

3.7

3.8

2014-06-15 10:39:00 cpongo4 阅读数 15

Cordova/PhoneGap 3.5.0不再支持iOS 5,3.6.0+将不再支持WP 7,以后的更新将通过npm管理。

\

PhoneGap 3.5.0构建于相同版本的Cordova,已经停止支持iOS 5。根据这个特性提升需求的说明,主要原因是Cordovas只支持当前和上一个iOS版本。这意味着不再支持iPad 1,因为它无法升级到iOS 6。

\

另一个变化是放弃支持iOS 6 arm64,因为苹果要求iOS 6的应用只能是32位版本。同时,Xcode 5.0.1和之后的版本为iOS 6生成32位,iOS 7生成32位和64位文件。

\

这是PhoneGap支持Windows Phone 7的最后一个版本。

\

PhoneGap推荐的安装方法不再是下载文件,而是通过npm安装。所有平台都已经有了顶层的package.json文件,并已经提交到npm。以后框架的升级将通过npm交付而不是git。

\

发布说明提供了这个新版本所有变更的详细信息。

\

查看英文原文:PhoneGap 3.5.0 No Longer Supports iOS 5 and Won’t Support WP 7

2017-06-01 14:58:21 zzl819954692 阅读数 451

由于公司自动化测试需要,在项目开发过程中需要给测试部门配置测试环境,第一次接触四处碰壁,好在自己坚持,最终实现模拟机和真机测试。先总结如下,便于以后使用。

安装环境

  • Mac电脑一台,系统版本10.12.5
  • Xcode软件,版本号8.3.1,对应模拟机系统10.3

安装步骤

  1. 安装nodejs
    为了后续安装软件,首先需要安装nodejs,下载MacOS installer(.pkg) ,点击按照向导完成即可。完成后打开终端,查看当前版本:输入npm -v,即可看到当前版本,我的是3.10.10.
  2. 安装appium
    在终端安装appium,npm install appium,此处注意,安装电脑需要翻墙或者使用VPN,否则不会成功,看到很多前辈使用替换镜像的方式,我尝试了几次失败了,最终多次执行这个方法等待了很长时间后终于成功了。另外,全程安装不要使用sudo 命令,遇到权限问题,在相应文件夹下sudo chmod -R fileUrl 修改对应权限即可。否则后续会有问题。

  3. 安装homebrew
    根据官方安装方法,终端执行下面代码即可安装成功

ruby -e"$(curl -fsSL   https://raw.githubusercontent.com/Homebrew/install/master/install)"
提示如下信息,表示安装成功==> Next steps:
- Run `brew help` to get started
- Further documentation: 
    http://docs.brew.sh

4.通过 homebrew 安装carthage

brew install carthage

5.安装 webpack

npm install -g webpack

此处注意,一定要保证安装成功,否则后面真机运行时会有很大的问题,此处安装不成功,真机不会成功。

6.安装 WebDriverAgent及依赖环境
进入目录:cd /usr/local/lib/node_modules/appium/node_modules/appium-xcuitest-driver/WebDriverAgent/

创建目录:mkdir -p Resources/WebDriverAgent.bundle

执行: ./Scripts/bootstrap.sh -d
执行成功后表示配置成功了。若以上任何一步有错,可能会导致测试失败。
以上步骤成功后配置好java配置文件,即可开始测试。

开始测试

配置内容如图所示
模拟机环境配置

iOS开发之AFN3.0发送请求数据

博文 来自: dengwt123
没有更多推荐了,返回首页