我正在尝试使用与iOS Contacts应用程序集成的消息传递应用程序,以便用户可以直接从"联系人"通过应用程序发起消息.这在WWDC 2016会议240中有所涉及,但显然省略了一些细节.
在WWDC示例之后,我有:
将活动类型添加到应用程序Info.plist:
<key>NSUserActivityTypes</key>
<array>
<string>INSendMessageIntent</string>
</array>
Run Code Online (Sandbox Code Playgroud)实现application(_:continue:restorationHandler:)我的应用程序委托.
创建并捐赠了一种互动
let activity = NSUserActivity(activityType: "com.example.message")
activity.title = "Send CB Test Message"
activity.expirationDate = Date.distantFuture
let recipient = INPerson( /* recipient with an email address in my Contacts database */ )
let sender = INPerson( /* me */ )
let intent = INSendMessageIntent(recipients: [recipient], content: nil, groupName: nil, serviceName: "CB Test Chat", sender: sender)
let response = INSendMessageIntentResponse(code: .success, userActivity: activity)
let interaction = …Run Code Online (Sandbox Code Playgroud)我的应用程序播放流式音频AVPlayer,并用于MPNowPlayingInfoCenter在设备锁定屏幕上显示有关流的信息.
这在音频实际播放时工作正常,但如果流因网络减速(即我收到AVPlayerItemPlaybackStalledNotification)而停止,则信息会从锁定屏幕消失.但是如果流恢复播放,它会重新出现.
这是令人困惑的,因为当现在播放的信息从锁定屏幕消失时,它给出了应用程序已停止播放的外观.但是当锁定屏幕UI似乎表明这不会发生时,它会恢复播放.
有什么我可以做的事情来确保现在播放的信息在流应该播放时仍然可见,但目前不是由于网络速度问题?似乎保持一致的锁屏UI的唯一方法是在网络连接停止时实际终止它,这有点愚蠢但至少不会混淆.
如果更多细节会有所帮助:
MPNowPlayingInfoCenter当有一个当前程序时,应用程序永远不会清除,因此只要该流应该正在播放,就应该显示非空数据.在Apple的NSPersistentContainer文档中,该方法具有以下描述:
func loadPersistentStores(completionHandler block: @escaping (NSPersistentStoreDescription, Error?) -> Void)
block: Once the loading of the persistent stores has completed, this block will be executed on the calling thread.
Run Code Online (Sandbox Code Playgroud)
但经过多次调试堆栈跟踪,我很确定completionHandler是同步执行的.如果我在调用loadPersistentStores后放置一个print语句,它总是在执行completionHandler之后打印.
那么,我应该考虑何时loadPersistentStores返回,NSPersistentContainer已经加载(无论是否成功)?
我们的应用似乎是半随机挂在psynch_mutexwait.它似乎与更新存储在CoreData中的大量数据的后台进程有关 - 但我完全无法弄清楚是谁锁定导致死锁的原因.
以下是lldb给我的完整堆栈跟踪 - 这显然是不完整的,并且线程1的最后一帧是伪造的.在那之前,我在该方法中有一个断点,它从未被击中过.
是否有任何方法可以确定正在等待什么锁?(或者甚至获得正确的堆栈跟踪?)当然,涉及很多代码,这使得随机NSLog语句成为一项艰巨的任务.
(lldb) bt all
* thread #1: tid = 0x2503, 0x39da20fc libsystem_kernel.dylib`__psynch_mutexwait + 24, stop reason = signal SIGSTOP
frame #0: 0x39da20fc libsystem_kernel.dylib`__psynch_mutexwait + 24
frame #1: 0x39ceb128 libsystem_c.dylib`pthread_mutex_lock + 392
frame #2: 0x00022068 OnDeck`-[AttendanceWorkoutsController buildTable](self=0x00000003, _cmd=0x00000000) + 508 at AttendanceWorkoutsController.m:100
thread #2: tid = 0x2803, 0x39d92648 libsystem_kernel.dylib`kevent64 + 24
frame #0: 0x39d92648 libsystem_kernel.dylib`kevent64 + 24
frame #1: 0x39ccb4f0 libdispatch.dylib`_dispatch_mgr_invoke + 796
thread #5: tid = 0x2b03, 0x39d91eb4 libsystem_kernel.dylib`mach_msg_trap + 20
frame #0: 0x39d91eb4 …Run Code Online (Sandbox Code Playgroud) 我正在尝试为文件包创建文档范围安全范围的书签.也就是说,目录哪里NSURLIsPackageKey是YES.我知道你通常不应该能够为目录创建文档范围的书签,但我本来希望软件包可以免除它(毕竟,我可以使用NSOpenPanel不允许选择目录的方式访问它们,但那里没有问题).
我已经使用com.apple.security.files.bookmarks.document-scope= 设置了我的权利true,并且我正在使用我刚收到的文件URL进行基本书签创建调用NSOpenPanel(因此我有权访问):
NSError *bookmarkError = nil;
NSData *bookmark = [fileURL
bookmarkDataWithOptions:NSURLBookmarkCreationWithSecurityScope
includingResourceValuesForKeys:nil
relativeToURL:[self fileURL]
error:&bookmarkError];
Run Code Online (Sandbox Code Playgroud)
这个电话后,虽然,这两个bookmark和bookmarkError的nil.
即使我有基于文档的应用程序,我是否只需要放弃并创建应用程序范围的书签?这似乎不合适,但我没有看到另一种解决方法.
我正在测试通过CloudKit请求可发现性的代码:
CKContainer.defaultContainer().requestApplicationPermission(CKApplicationPermissions.PermissionUserDiscoverability, completionHandler: { (status:CKApplicationPermissionStatus, error:NSError!) -> Void in
if status == CKApplicationPermissionStatus.Granted {
...
} else if status == CKApplicationPermissionStatus.Denied {
....
} else {
println("Request result: \(status)")
}
})
Run Code Online (Sandbox Code Playgroud)
但是如何重置结果呢?即使我删除并重新安装应用程序,我也会被问到一次,再也不会被问到.如果我再次运行此代码,我会立即进入完成块,结果与上次相同.
我在Apple的旧论坛上看到了另一个问题和帖子(需要登录),说可以通过设置 - > iCloud - > iCloud Drive - >通过电子邮件查找我来重置.但是,这样做并没有给我任何选择:
我确定我可以通过设置 - >常规 - >重置 - >重置所有设置(或者可能重置网络设置)来重置它[[但请参阅此处的其他信息],但必须有一些方法可以重置CloudKit权限,无需进行大量不相关的设置.如果用户拒绝许可但后来改变主意怎么办?
更新:一些额外的信息:
以上引导我怀疑它是服务器端设置.所以我尝试使用我正在使用的帐户登录iCloud.com,然后转到设置 - >数据和安全 - >通过电子邮件查找我.在iOS设备和模拟器上,没有任何选择可以做任何事情:
那么,有没有什么方法可以重置这个,或者它是固定在石头上并且不可改变,直到太阳膨胀并摧毁地球?
我有一个非常简单的Swift应用程序,它有一个名为的模型类DemoNote.DemoNote通过键控归档读取/写入实例数组.这个工作正常,但DemoNote包含在应用程序中.
但后来我转移DemoNote.swift到一个名为的新自定义框架DemoSharedCode.除了确保Xcode在app目标中使用框架之外,我确保
DemoNote及其变量和方法,public因此它们在框架之外可见import DemoSharedCode到任何想要使用的类DemoNote所以现在编译器很高兴.但在运行时,unarchiving失败并出现此错误:
2015-02-17 12:12:53.417 DemoNotesSwift[70800:16504104] *** Terminating app due to
uncaught exception 'NSInvalidUnarchiveOperationException', reason:
'*** -[NSKeyedUnarchiver decodeObjectForKey:]: cannot decode object of class
(DemoNotesSwift.DemoNote)'
Run Code Online (Sandbox Code Playgroud)
在上面,DemoNotesSwift是app名称,DemoNote是类名,并且代码行试图从NSDatablob中取消归档对象:
let savedObjects = NSKeyedUnarchiver.unarchiveObjectWithData(savedData) as? [(DemoNote)]
Run Code Online (Sandbox Code Playgroud)
我猜测移动DemoNote到框架意味着它的模块名称已经改变,这打破了unarchiving,但我不确定.我也不知道该怎么做 - 也许我需要打电话+setClass:forClassName:给unarchiver,但如果是这样的话,我不知道论证会是什么.
我有一个UITextField弹出键盘的Shift键被禁用的地方.键盘类型设置为UIKeyboardTypeNamePhonePad,似乎应该允许大写字母.
如果我将键盘类型更改为"默认"但仅保留其他设置,则该Shift键处于活动状态.其他设置是:
我正在运行iPhone OS 2.2.
有没有人见过这个?我不明白为什么"名称电话簿"类型会禁用该Shift键.
我正在开发一个应用程序,我想在应用程序的主屏幕中使用cocos2d,但不能在其他地方使用(在其他地方,标准UIKit的东西更合适).所以,我已经将我的EAGLView设置为UINavigationController中的根视图,当用户点击正确的位置时,我将新的视图控制器推送到导航控制器上.
到目前为止,这工作得很好.家庭视图中的cocos2d/chipmunk工作效果很好,推动新的视图控制器按预期工作.
但是当我回到主视图时,没有任何东西存在.我只看到窗口背景和导航栏.
我在根视图控制器的-viewDidAppear中设置了一个断点:看看弹出后发生了什么,到目前为止一切正常(或至少与推送前相同).
推动只是沼泽标准的导航控制器推动.我没有看到任何类型的记忆警告.有人想知道发生了什么事吗?
有一个简单的演示项目,在http://cl.ly/1Q050s0h2k47032K1Y1N上显示了这种行为
这是基于cocos2d + chipmunk项目模板.点击Grossini,新的视图控制器被推入堆栈.点击后退按钮,Grossini消失了.
只是为了让它变得有趣,这个问题只存在于iOS设备上(我正在运行4.1),而不是在模拟器中.
我正在考虑在 iOS 应用中使用 Firebase。从功能上看,它看起来不错,但是有什么方法可以确保用户数据对开发人员保密?
我知道我可以要求身份验证并确保用户只能在应用程序中看到他们自己的数据。我也知道它使用 HTTPS。我担心的是,当我登录 Firebase 控制台时,我可以看到所有内容。我希望能够诚实地对用户说,他们的私有数据实际上是私有的,不仅来自其他用户,而且来自我和将来从事该项目的任何其他开发人员。
我不一定需要加密,但如果这是唯一的选择,那么我会考虑它。但我也不认为“私人”数据实际上是私人的,如果在应用程序上工作的任何人都可以随时浏览它。