在以下json上执行NSJSONSerialization有时会给我NSCFString*,有时在字符串值上给我NSTaggedPointerString*.有谁知道为什么会这样,NSJSONSerialization用什么来确定它返回哪种类型?
jsonData = [NSJSONSerialization JSONObjectWithData:data
options:kNilOptions
error:&parseError];
{
"UserPermissionsService": {
"ServiceHeader": {},
"UserApplicationPermissions": {
"ApplicationPermissions": {
"ApplicationID": "TEST",
"Permission": [
{
"Locations": [
"00000"
],
"PermissionID": "LOGIN"
},
{
"Locations": [
"00000"
],
"PermissionID": "SALES_REPORT_VIEW"
}
]
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
"LOGIN"以NSTaggedPointerString*的形式返回."SALES_REPORT_VIEW"返回的是一个NSCFString*.这对我正在使用和投射值的下游产生影响.
UPDATE
这是我学到的......
"当整个值可以保存在指针本身而不分配任何数据时,会产生NSTaggedPointerString."
这里有一个详细的解释......
https://www.mikeash.com/pyblog/friday-qa-2015-07-31-tagged-pointer-strings.html
由于NSTaggedPointerString是NSString的子类,因此显示引号/不显示引号对我来说永远不会成为问题,因为使用了数据.
感谢所有评论的人.我很自在地理解NSJSONSerialization在做什么.
在两个具有WatchKit应用程序扩展的应用程序中,我error在启动时在设备日志中收到以下十次以上的内容.
secTaskDiagnoseEntitlements MISSING keychain entitlements: no stored taskRef found
Run Code Online (Sandbox Code Playgroud)
人们Apple Developer forums也报道了这一点.线程在这里......
https://forums.developer.apple.com/thread/20193
但是,没有人找到任何解决方案.
有人有主意吗?
该应用程序确实启动并运行良好,但我担心这些消息/错误可能会减慢启动和/或表明我没有正确配置项目.
我有一个iOS应用程序,它在外部显示器上显示大部分数据(通过Airplay或物理电缆连接).是否可以在外接显示器上显示设备的状态栏?这是我正在初始化外部显示器的方式:
func checkForExistingScreenAndInitializeIfPresent() -> UIViewController? {
if UIScreen.screens.count > 1 {
if let secondScreen = UIScreen.screens.last {
return initializeSecondScreen(with: secondScreen)
}
}
return nil
}
func initializeSecondScreen(with secondScreen: UIScreen) -> UIViewController? {
let screenBounds = secondScreen.bounds
secondWindow = UIWindow(frame: screenBounds)
secondWindow?.screen = secondScreen
secondWindow?.isHidden = false
secondWindow?.rootViewController = UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "homeViewController")
return secondWindow?.rootViewController
}
Run Code Online (Sandbox Code Playgroud)
我在HomeViewController中有以下代码.
override var prefersStatusBarHidden: Bool {
return false
}
override var preferredStatusBarStyle: UIStatusBarStyle {
return .default
}
Run Code Online (Sandbox Code Playgroud)
状态栏在HomeViewController的iOS应用程序中显示正常,但在HomeViewController显示在外部显示器上时从不显示.
我的Swift iOS应用程序中有公钥密码,效果很好.
我现在正致力于构建单元测试,测试公钥密码,而无需网络连接/真实直播服务器.我有这个几乎工作,但我无法弄清楚如何以编程方式创建一个具有非零服务器信任的URLAuthenticationChallenge?所有Apple文档都声明,如果您的身份验证方法是NSURLAuthenticationMethodServerTrust,那么这应该是非零的.我正在使用从本地计算机生成的p12和cer文件来构建下面示例中的URLCredential.无论我做什么,challenge.protectionSpace.serverTrust总是回来零.
let protectionSpace = URLProtectionSpace(host: "mockSession",
port: 0,
protocol: "https",
realm: nil,
authenticationMethod: NSURLAuthenticationMethodServerTrust)
var urlCredential:URLCredential?
if let p12Data = try? Data(contentsOf: URL(fileURLWithPath: Bundle.init(for: type(of: self)).path(forResource: "cm7justindomnit", ofType: "p12") ?? "")),
let cerData = try? Data(contentsOf: URL(fileURLWithPath: Bundle.init(for: type(of: self)).path(forResource: "cm7justindomnit", ofType: "cer") ?? "")){
let options: NSDictionary = [kSecImportExportPassphrase:"password"]
var items: CFArray?
let _ = SecPKCS12Import(p12Data as CFData, options, &items)
if let items = items {
let objectsData = Data.init(from: CFArrayGetValueAtIndex(items, 0))
let objects = objectsData.toArray(type: CFDictionary.self).first …Run Code Online (Sandbox Code Playgroud) 我正在从Google Analytics(分析)过渡到Firebase Analytics。与Google Analytics(分析)不同,Firebase会自动跟踪屏幕视图,这很棒!但是,它没有跟踪屏幕,而是连续尝试跟踪UINavigationController。每次导航到其他视图控制器时,都会两次收到以下错误日志。
[Firebase / Analytics] [I-ACS031006]视图控制器已被跟踪。类,ID:UINavigationController,-1770652405567491888
拥有导航控制器时是否需要一些配置?在这种情况下如何获得自动屏幕跟踪?
更新:我还没有找到解决方案,但是至少我找到了问题的原因。如果您的初始视图控制器是“标签栏控制器”,则Firebase似乎无法理解您的视图控制器层次结构。我主要故事板上的初始视图控制器是Tab Bar Controller。如果将其删除,我的应用程序将获得良好的屏幕跟踪报告。
更新: 看来我已经找到了解决方案,但是我仍然想知道是否有人有更好的主意。由于Firebase将我的“标签栏”控制器下的所有视图控制器视为相同的UINavigationController,因此我可以在viewDidAppear中为所有它们手动调用setScreenName。
Analytics.setScreenName(screenName, screenClass: screenClass)
Run Code Online (Sandbox Code Playgroud)
可以,因为它并不比Google Analyics差,但也不是很理想,因为系统仍然尝试为每个视图控制器两次跟踪UINavigationController,而且我也没有从自动屏幕跟踪中受益。我曾尝试尝试从Firebase中删除选项卡栏控制器,就像某些人似乎所做的那样,但是看起来这些方法已从当前(v4.0.0)版本的Firebase SDK中删除。
在watchOS 4.0(Xcode 9.0 beta 6)中执行后台任务时,我收到类似于下面的错误消息.它们似乎没有引起任何问题,但我不确定.有没有人知道是什么导致这些错误被记录,如果有修复或方法来抑制它们?
2017年8月24日09:03:40.130009-0400 cfanow关注应用信息[6906:377766] [bg_app_refresh] - [WKRefreshBackgroundTask cleanupStorage] _block_invoke:213:错误试图到达文件:///用户/ justindomnitz /库/开发/ CoreSimulator /设备/ 264AA014-FD6C-426A-88DF-64E502393BAF /数据/容器/数据/ PluginKitPlugin/107681EE-B30E-49CD-9416-8F030D1CA0BF /库/ com.apple.watchkit/bktasksnapshot_(空):错误域= NSCocoaErrorDomain代码= 260"无法打开文件"bktasksnapshot_(null)",因为没有这样的文件." 的UserInfo = {NSURL =文件:///用户/ justindomnitz /库/开发商/ CoreSimulator /设备/ 264AA014-FD6C-426A-88DF-64E502393BAF /数据/容器/数据/ PluginKitPlugin/107681EE-B30E-49CD-9416-8F030D1CA0BF /库/ com.apple.watchkit/bktasksnapshot_(空),NSFilePath = /用户/ justindomnitz /库/开发商/ CoreSimulator /设备/ 264AA014-FD6C-426A-88DF-64E502393BAF /数据/容器/数据/ PluginKitPlugin/107681EE-B30E- 49CD-9416-8F030D1CA0BF /库/ com.apple.watchkit/bktasksnapshot_(空),NSUnderlyingError = 0x79f3f3c0 {错误域= NSPOSIXErrorDomain代码= 2 "没有这样的文件或目录"}}
我继承了一些swift代码,它在从核心数据中获取后立即执行refreshObject.被提取的对象与另一个表有关系.fetch和refreshObject位于performBlockAndWait中.代码如下.崩溃似乎始于iOS9.
获取后立即执行refreshObject的目的是什么?该表只包含几行.这有必要吗?将所有这些一起移除的任何缺点?
context.performBlockAndWait {
let className = self.className()
let fetchRequest = NSFetchRequest(entityName: className)
groups = (try? context.executeFetchRequest(fetchRequest)) as? [FavoriteLocationGroup]
if groups != nil {
groups!.sortInPlace { $0.name < $1.name }
for group in groups! {
context.refreshObject(group, mergeChanges: false) <<< crashes here
}
}
}
Run Code Online (Sandbox Code Playgroud)提前感谢您提供的任何帮助!