我对iOS编程很新,现在想要实现定期后台同步,以便将我的服务器数据与客户端数据同步.我想要实现的是与Androids相当的SyncAdapter
,您可以在其中定义时间间隔(例如每30分钟),系统将在后台自动触发定义的任务.
到目前为止,我找不到Swift 3.0的这种机制,所以我需要问一下somone是否有经验或一些暗示我如何实现这一目标.
我想做的事听起来很简单:
当应用程序首次启动时,应用程序应设置同步管理器,该管理器每30分钟自动触发一次后台任务.后台任务负责同步服务器和客户端数据(使用Alamofire).
我怎样才能做到这一点?
我有一个简单的类使用URLSession发送HTTP POST请求(到Neo4j服务器,但这没关系),以及测试它成功的集成测试.
通过Xcode,通过iOS模拟器,我可以运行这个测试一百万次 - 每次都成功.
但是,当我swift test
在Ubuntu Linux上运行时(我使用IBM提供的docker镜像),我经常会遇到测试失败,说我收到了401响应.
通过容器中的cURL复制它根本不会失败,所以我不认为这是我的容器的问题.
我添加了一个数据包转储(我通过Charles Proxy检查),其中15个测试运行,7个测试运行(因此7个请求)失败.所有失败的请求都抱怨没有提供身份验证标头.从转储中,这是正确的,转储不包含那些失败的请求的身份验证标头.但为什么不呢?实际上,所有标头标志都是不同的:成功运行具有以下标头:
POST /db/data/cypher HTTP/1.1
Host: 192.168.0.18:7474
Accept-Encoding: deflate, gzip
Authorization: Basic bmVvNGo6c3RhY2swdmVyRmxvdw==
Content-Type: application/json; charset=utf-8
Accept: application/json; charset=utf-8
Connection: keep-alive
User-Agent: urlsessionTestPackageTests.xctest (unknown version) curl/7.35.0
Content-Length: 135
Run Code Online (Sandbox Code Playgroud)
而一个不成功的人有这些:
POST /db/data/cypher HTTP/1.1
Host: 192.168.0.18:7474
Accept: */*
Accept-Encoding: deflate, gzip
Connection: keep-alive
User-Agent: urlsessionTestPackageTests.xctest (unknown version) curl/7.35.0
Content-Length: 135
Run Code Online (Sandbox Code Playgroud)
所有200个结果都具有相同的标题,并且所有401结果具有相同的标题.你能在我的代码中看到任何应该保证这样随机请求的内容吗?
根据developer.yahoo.com/mail/和IMAP回复:
* OK [CAPABILITY IMAP4rev1 ID MOVE NAMESPACE X-ID-ACLID UIDPLUS LITERAL+ CHILDREN XAPPLEPUSHSERVICE XYMHIGHESTMODSEQ AUTH=PLAIN AUTH=LOGIN AUTH=XOAUTH2 AUTH=XYMCOOKIE AUTH=XYMECOOKIE AUTH=XYMCOOKIEB64 AUTH=XYMPKI] IMAP4rev1 imapgate-1.8.1_01.20166 imap1009.mail.ne1.yahoo.com
Run Code Online (Sandbox Code Playgroud)
IMAP可以使用OAuth(2)身份验证访问Yahoo Mail.
我在https://developer.yahoo.com/apps/上注册了我的应用程序,因此我获得了客户端ID和客户端密钥.我没有找到任何与Mail相关的范围(API权限).不过,我选择了在注册我的应用程序时显示的所有API权限.
我试图实现OAuth和OAuth2.
OAuth2:我无法获取范围"mail-r"的授权码.当我生成URL(https://api.login.yahoo.com/oauth2/request_auth?client_id=CLIENT_ID&redirect_uri=oob&scope=mail-r&response_type=code)并在浏览器中打开它时,带有文本的页面"开发者:请从注册范围并再次提交." 被展示.它适用于其他范围.例如,我可以获取"sdct-r"的授权码
OAuth:我能够获得访问令牌.但是当我使用AUTHENTICATE XOAUTH2命令发送它时,我得到"NO [AUTHENTICATIONFAILED](#AUTH007)Bad scope"响应.
那么问题是应该设置哪些范围来使用IMAP和OAuth(2)访问Yahoo Mail?
嗨,我遇到以下代码的问题.具体来说,if let语句将Cast转换NSPeristentStoreResult
为不相关类型[Item]始终失败警告.我正在使用Swift 3.01.
看起来这应该很简单.我正在关注的这本书是使用早期版本的Swift编写的.谢谢你的放纵.
func demo(){
let request = NSFetchRequest<Item>(entityName: "Item")
do {
if let items = try CDHelper.shared.context.execute(request) as? [Item] {
for item in items {
if let name = item.name {
print("Fetched Managed Object = '\(name)'")
}
}
}
} catch {
print("Error executing a fetch request: \(error)")
}
}
Run Code Online (Sandbox Code Playgroud) 我想为我的Core Data应用程序添加单元测试,但我确定如何重置测试之间的上下文.
这是我的CoreDataStack
目标:
public final class CoreDataStack {
var storeType: StoreType!
public init(storeType: StoreType) {
self.storeType = storeType
}
lazy var persistentContainer: NSPersistentContainer = {
let container = NSPersistentContainer(name: "Transaction")
container.loadPersistentStores(completionHandler: { (description, error) in
if let error = error {
fatalError("Unresolved error \(error), \(error.localizedDescription)")
} else {
description.type = self.storeType.type
}
})
return container
}()
public var context: NSManagedObjectContext {
return persistentContainer.viewContext
}
}
Run Code Online (Sandbox Code Playgroud)
这就是我在测试中使用它的方式:
class PaymentTests: XCTestCase {
var context: NSManagedObjectContext!
override func setUp() {
super.setUp() …
Run Code Online (Sandbox Code Playgroud) 我有两个UIBezierPath
s,一个代表图像部分的多边形,另一个是要在其上绘制的路径.
我需要找到它们之间的交点,以便只有该交叉区域内的点才会被着色.
有没有一种方法UIBezierPath
可以在两条路径之间找到交叉点或新路径?
我无法弄清楚如何在数组中找到对象的索引.例如,我有这个数据结构:
class Person {
var name: String
var age: Int
init(name personName: String, age personAge: Int) {
self.name = personName
self.age = personAge
}
}
let person1 = Person(name: "person1", age: 34)
let person2 = Person(name: "person2", age: 30)
...
var personsArray = [person1, person2, ...]
Run Code Online (Sandbox Code Playgroud)
我尝试使用,personsArray.index(where: ....)
但我不明白如何使用它.index(of: ...)
不起作用.我认为因为personsArray
不符合Equatable
协议......
我有一个objc基类:
@protocol BaseClassDelegate;
@interface BaseClass : NSObject
@property (nonatomic, weak) id <BaseClassDelegate> delegate;
@end
@protocol BaseClassDelegate <NSObject>
-(void)baseDelegateMethod;
@end
Run Code Online (Sandbox Code Playgroud)
我正在创建一个快速的子类,我想在其中扩展我的代理...
protocol SubClassDelegate : BaseClassDelegate {
func additionalSubClassDelegateMethod();
}
class SubClass: BaseClass {
@IBAction func onDoSomething(sender: AnyObject) {
delegate?.additionalSubClassDelegateMethod(); <--- No such method in 'delegate'
}
}
Run Code Online (Sandbox Code Playgroud)
现在,当我创建我的子类时,我可以说它符合SubClassDelegate并设置委托.问题是(当然),这个子类中不存在'委托'.有没有办法告诉编译器将我的委托"扩展"到我的子类中?(或者我在这里疯了,错过了一些明显的东西)
我有这个代码
import UIKit
class CardView: UIView {
@IBOutlet var imageView: UIImageView!
init(imageView: UIImageView) {
self.imageView = imageView
super.init(frame: CGRect(x: 0, y:0, width: self.frame.size.width, height: self.frame.size.height))
}
required init?(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
}
Run Code Online (Sandbox Code Playgroud)
我在行上收到错误:
super.init(frame: CGRect(x: 0, y:0, width: self.frame.size.width, height: self.frame.size.height))
Run Code Online (Sandbox Code Playgroud)
错误说 Use of 'self' in property access 'frame' before super.init initializes self
我不知道如何解决这个问题.
请记住,我来自客观 - C背景,最近开始学习迅捷.
我们有一个复杂的 Xcode 工作区,其中包含大量依赖项和依赖项的依赖项。构建它们的顺序很重要,Xcode <13 永远无法使用 Xcode 方案的“Parallelize Build”设置找出正确的顺序,因此这个选项对我们来说是无效的。
现在,在 Xcode 13 中,方案选项已更改为“依赖顺序”和“手动顺序”。由于上述原因,我们使用后者。
构建这个时,Xcode 会向我们发出以下警告:
不推荐以手动顺序构建目标 - 请在方案设置中选择“依赖顺序”,或在当前方案的任何目标中设置 DISABLE_MANUAL_TARGET_ORDER_BUILD_WARNING 以抑制此警告。
但我们找不到在哪里设置它。
问题:我们必须在 Xcode 中的哪个位置设置 DISABLE_MANUAL_TARGET_ORDER_BUILD_WARNING 来抑制此警告。
ios ×7
swift ×7
swift3 ×6
core-data ×2
arrays ×1
casting ×1
delegates ×1
extend ×1
imap ×1
oauth ×1
oauth-2.0 ×1
objective-c ×1
server-side ×1
uibezierpath ×1
urlrequest ×1
xcode ×1
xcode13 ×1
xctest ×1
yahoo-mail ×1
yahoo-oauth ×1