小编Nic*_*ari的帖子

Swift中的SecAccessControlCreateWithFlags()

我试图从快速代码中调用Security.framework中的函数.忘记"错误输出"(最后)参数一秒,如果我调用这样的函数:

let accessControlRef = SecAccessControlCreateFlags(
            kCFAllocatorDefault,
            kSecAttrAccessibleWhenUnlockedThisDeviceOnly,
            SecAccessControlCreateFlags.UserPresence,
            nil
        )
Run Code Online (Sandbox Code Playgroud)

我发现以下错误:

找不到类型为'SecAccessControlCreateFlags'的初始值设定项,它接受类型'(CFAllocator!,CFStringRef,SecAccessControlCreateFlags,nil)'的参数列表

...但是,如果我将代码重新格式化为以下内容:

let allocator:CFAllocatorRef! = kCFAllocatorDefault

let protection:AnyObject!     = kSecAttrAccessibleWhenUnlockedThisDeviceOnly

let flags:SecAccessControlCreateFlags = SecAccessControlCreateFlags.UserPresence


let accessControlRef = SecAccessControlCreateWithFlags(
    allocator,
    protection,
    flags,
    nil
)
Run Code Online (Sandbox Code Playgroud)

(特定类型-eg,CFAllocatorRef- 取自Xcode自动完成时的函数原型)...它编译没有问题.这是怎么回事?

接下来是错误参数.我应该通过什么?迁移我的Objective-C代码,我很想传递以下变量(&当然是前缀):

var accessControlError:CFErrorRef! = nil
Run Code Online (Sandbox Code Playgroud)

...给出了错误:

无法使用类型'(CFAllocatorRef!,AnyObject!,SecAccessControlCreateFlags,inout CFErrorRef!)的参数列表调用'SecAccessControlCreateWithFlags'

相反,如果我传递了以下变量(再次使用address-of运算符):

var accessControlError:UnsafeMutablePointer<Unmanaged<CFError>?>
Run Code Online (Sandbox Code Playgroud)

(与原型自动完成建议的类型相同),我得到:

无法使用类型'(CFAllocatorRef!,AnyObject!,SecAccessControlCreateFlags,inout UnsafeMutablePointer?>)的参数列表调用'SecAccessControlCreateWithFlags'

......那么,是什么给出的?

编辑:忘记错误参数.我好像在拿地址两次(即指向指针的指针).相反,我应该这样做:

var accessControlError:UnsafeMutablePointer<Unmanaged<CFError>?> = nil
// ^ Already a 'pointer'

let allocator:CFAllocatorRef!         = kCFAllocatorDefault
let protection:AnyObject!             = kSecAttrAccessibleWhenUnlockedThisDeviceOnly
let flags:SecAccessControlCreateFlags = …
Run Code Online (Sandbox Code Playgroud)

security-framework core-foundation ios swift

5
推荐指数
1
解决办法
2608
查看次数

Swift Sprite Kit开始触摸功能

我正在搞乱一个xcode项目,当我触摸它时,我正试图让一个红色的球SKShapeNode四处移动.触摸我自己的源代码开始上课并没有做到.我的代码有什么缺陷,我需要做些什么来修复它.

import SpriteKit

class GameScene: SKScene {

    //Rectangle Skeletions
    var leftWallRect = CGRect(x: 0, y: 0, width: 40, height: 1000)

    var ball = SKShapeNode(circleOfRadius: 25);


    override func didMoveToView(view: SKView) {

        // Declare the Sprites in your scene
        var ball = SKShapeNode(circleOfRadius: 25);
        let leftWall = SKShapeNode(rect: leftWallRect);
        let rightWall = SKShapeNode(rect: leftWallRect);
        let pin = SKSpriteNode(imageNamed: "pin");

        // Ball Properties
        ball.strokeColor = UIColor.blackColor()
        ball.fillColor = UIColor.redColor()
        ball.position = CGPointMake(self.frame.width / 2 , self.frame.height / 4 - 100 )
        self.addChild(ball)

        // …
Run Code Online (Sandbox Code Playgroud)

touchesmoved touchesbegan sprite-kit swift

5
推荐指数
1
解决办法
351
查看次数

如何防止可能失败的属性的初始化

我的类有一个NSURL从字符串初始化的类型属性.该字符串在编译时已知.

要使类正常运行,必须在初始化(不是更晚)时将其设置为其预期值,因此将它定义为可选(隐式展开或其他方式)没有意义:

class TestClass: NSObject {

    private let myURL:NSURL

    ...
Run Code Online (Sandbox Code Playgroud)

假设NSURL(string:)(返回NSURL?)如果传递了编译时已知的有效URL字符串,则永远不会失败,我可以这样做:

    override init() {

        myURL = NSURL(string: "http://www.google.com")!

        super.init()
    }
Run Code Online (Sandbox Code Playgroud)

但是,我在某种程度上对强制解包感到不舒服,并希望以某种方式保护URL初始化.如果我试试这个:

    guard myURL = NSURL(string: "http://www.google.com") else {
        fatalError()
    }
Run Code Online (Sandbox Code Playgroud)

可选类型'NSURL?'的值 没有打开; 你的意思是用'!' 要么 '?'?

(注意:没有办法在上面的代码中添加!?修复错误的任何地方.条件解包只发生guard let... guard var...,并且myURL已经定义)

我明白为什么失败:即使成功调用NSURL(string:)的返回(有效的)NSURL 包裹内的可选NSURL?,所以我还需要以某种方式分配给前解开它myURL(这是不可选的,因此不转让兼容原样).

我可以通过使用中间变量解决这个问题:

    guard let theURL = NSURL(string: "http://www.google.com") else …
Run Code Online (Sandbox Code Playgroud)

optional swift

5
推荐指数
1
解决办法
2899
查看次数

在初始化第一个视图控制器之前运行代码(基于故事板的应用程序)

我的应用程序需要执行一些清理任务 - 删除本地存储的旧数据 - 每次启动时,在显示初始视图控制器之前。

这是因为初始视图控制器在初始化时加载现有数据,并将其显示在表视图中。

我设置了几个断点,并发现初始视图控制器的初始化程序 ( init?(coder aDecoder: NSCoder)) 运行之前 application(_:didFinishLaunchingWithOptions)- 甚至之前application(_:**will**FinishLaunchingWithOptions),准确地说。

可以将清理代码放在视图控制器初始值设定项的最顶部,但我想将清理逻辑与任何特定屏幕分离。有一天,那个视图控制器可能最终不会成为最初的视图控制器。

覆盖应用程序委托的init()方法并将我的清理代码放在那里确实可以完成工作,但是......

题:

没有更好/更优雅的方式吗?


注:供参考,相关方法的执行顺序如下:

  1. AppDelegate.init()
  2. 视图控制器.init()
  3. AppDelegate.application(_:willFinishLaunchingWithOptions:)
  4. AppDelegate.application(_:didFinishLaunchingWithOptions:)
  5. ViewController.viewDidLoad()

澄清:

清理任务不冗长,也不需要异步运行:相反,我宁愿如果我的初始视图控制器甚至没有实例化,直到它完成(我清楚,如果它需要的系统会杀了我的应用程序启动时间很长。但是,它只是删除了一些本地文件,没什么大不了的。)。

我问这个问题主要是因为,在故事板出现之前,应用程序启动代码如下所示:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
    // Override point for customization after application launch.
    self.window.backgroundColor = [UIColor whiteColor];

    // INITIAL VIEW CONTROLLER GETS INSTANTIATED HERE 
    // (NOT BEFORE):
    MyViewController* controller = …
Run Code Online (Sandbox Code Playgroud)

uiviewcontroller ios uistoryboard appdelegate

5
推荐指数
1
解决办法
2466
查看次数

iTunesConnect - 如何检索现有应用程序的1024x1024图标?

我注意到,自iOS 11以来,目录中App的"App Icon"资产必须包含1024x1024大小的版本才能提交到App Store.

我知道之前已经将1024x1024图标直接添加到iTunesConnect应用页面,但我似乎无法获得任何链接或以完整大小显示该图标以从iTunesConnect页面获取它.

如何检索已发布的应用程序的现有1024x1024图标?我没有原始图标的PSD文件.

亲爱的开发者,

我们发现了您最近为[App]发送的一个或多个问题.您的投放成功,但您可能希望在下次投放时更正以下问题:

缺少营销图标 - iOS应用程序必须包含PNG格式的1024x1024px营销图标.不包含营销图标的应用无法提交给App Review或Beta App Review.

纠正问题后,您可以使用Xcode或Application Loader将新二进制文件上传到iTunes Connect.

问候,

App Store团队

app-store appstore-approval asset-catalog ios11 xcode9

5
推荐指数
1
解决办法
1630
查看次数

IBDesignable不适用于大型Xcode项目,适用于概念验证

我正在一个包含100多个源文件的项目中。我决定实现一个可重用的自定义视图,我可以在Interface Builder上预览其布局,如本问题和许多其他文章中所述。

但是,我无法让Interface Builder刷新(渲染)我的视图。

像往常一样,我将UIView对象库中的库存放入Interface Builder中的视图层次结构中,然后在Identity Inspector中将其类更改为我自己的类。字段“ Desginables”(在“从目标继承模块”下的右侧)显示为“最新”。

但是,自定义视图的内部布局无法预览。(它包含文本字段,标签和自定义背景色)。


从主菜单中选择“ 编辑器”>“刷新所有视图 ”会触发构建,并立即更改为“ Designables更新”,但是构建完成后,我的自定义视图仍为空白。

我尝试创建一个新的最小项目(通过Sinlge View Application项目模板),然后将我的.xib和自定义类源文件完整地移植了下来放心,将其放置在xib或情节提要板中时,可以按预期进行预览。


我知道这可能是一个远景,但这是大型项目Xcode的已知问题吗?

还是我应该在现有项目中寻找其他可能干扰可设计元素呈现的其他设置?

xcode interface-builder ios ibdesignable

5
推荐指数
0
解决办法
723
查看次数

验证iOS 6和7中的购买收据

我正在使用以下代码验证应用内购买收据:

- (void) completeTransaction:(SKPaymentTransaction*) transaction
{   
    NSData* receipt = nil;

    // 1. Attempt <app receipt> first (iOS 7.x)

    NSBundle* mainBundle = [NSBundle mainBundle];

    if ([mainBundle respondsToSelector:@selector(appStoreReceiptURL)]) {

        NSURL* appStoreReceiptURL = [mainBundle appStoreReceiptURL]; // <- CRASH

        receipt = [NSData dataWithContentsOfURL:appStoreReceiptURL];
    }

    // 2. Fallback to <transaction receipt> (iOS < 7.0)
    if (!receipt) {    
        receipt = [transaction transactionReceipt];
    }

    // 3. Have server verify it with iTunes:    
    [self verifyReceipt:receipt forTransaction:transaction];
}
Run Code Online (Sandbox Code Playgroud)

在iOS 6设备上,执行在该行停止NSURL* appStoreReceiptURL = [mainBundle appStoreReceiptURL];并且控制台吐出:

-[NSBundle appStoreReceiptURL]: unrecognized …

in-app-purchase ios6 ios7

4
推荐指数
1
解决办法
2039
查看次数

从NSDictionary存储和检索int64_t:NSNumber vs NSString

我正在开发一款具有Game Center功能的游戏.在内部,我的游戏保留了类型变量的所有分数int64_t,因为这是通过GameKitAPI 报告分数所需的类型(我假设这是为了避免32位和64位平台之间的歧义).

到现在为止还挺好.

接下来,我希望将用户的hiscore存储在本地(例如,in NSUserDefaults.但是.plist是等效的),因为当没有经过身份验证的Game Center播放器时,还要通过iCloud键值与用户拥有的其他设备同步.

我可以像这样存储他的核心int64_t:

// (int64_t) _hiscore is an ivar.
// (NSString) _playerID is the authenticated player ID, or else 
//  "AnonymousUser" when GKLocalPlayer is not authenticated.

[playerData setObject:@(_hiscore) forKey:@"HiScore"];
[[NSUserDefaults standardUserDefaults] setObject:playerData forKey:_playerID];
[[NSUserDefaults standardUserDefaults] synchronize];
Run Code Online (Sandbox Code Playgroud)

...(假设"@()"运算符将在所有情况下都要小心 - 不确定这个......),但是NSNumber我应该使用哪种方法来检索值而不会冒整数溢出的风险?

所有-*value类的方法(例如-intValue,-longValue,-unsignedIntegerValue等)的返回类型是平台相关的(不像的int64_t,它具有显式字节大小).这篇文章提供了关于每个平台上所有数据类型的精彩信息,但它对NSNumber... 没有帮助

我可以对每个平台的区分类型的大小进行运行时检查(例如,查看是否sizeof(unsigned long)等于4或8,并在每种情况下使用不同的方法),但这看起来并不优雅.并不是说新架​​构会很快出现,但......

我还可以将号码存储为一个字符串,如在这个岗位,但手头上有字典友好的NSNumber,感觉傻... …

objective-c 32bit-64bit ios game-center icloud

4
推荐指数
1
解决办法
2077
查看次数

PDF格式的新标签栏图标...创建自定义的指南?

我注意到在最新版本的Xcode中,"选项卡式应用程序"的项目模板创建了一个项目,其中实际存储了标签栏图标图像(称为"第一个"和"第二个",对于默认的两个选项卡/视图控制器可用).pdf格式,而不是.png,并显示在Assets.xcassets文件夹中,分辨率为"全部",用作"通用"(而非-say-分辨率"@ 3x"用作"iPhone应用程序iOS 7" -8",就像应用程序图标一样).

我假设这是为了提供一个基于矢量图形的资源,它真正独立于分辨率,因此支持各种设备.

我的问题是:以这种格式创建自定义资源的准则什么?我想它应该首先在Adobe Illustrator中创建自定义大纲并以pdf格式导出,但是,我应该使用什么尺寸和单位?还有其他需要注意的事项吗?我没有在官方Apple文档中找到任何内容,并且"ios tab bar icon pdf"的网络搜索仅提供指向剪贴画等的网站的链接.

注意:我曾想过是在这里或在平面设计堆栈交换网站上发布这个问题,但它仍然与Xcode IDE和开发iOS应用程序有关,所以我在这里下注.如果您不这么认为,请随意投票支持关闭.

pdf xcode uitabbarcontroller ios xcasset

4
推荐指数
1
解决办法
4873
查看次数

无法在 SK3DNode 上方显示精灵

我在 SpriteKit 场景中显示一些基本的 3D 几何体,使用 SK3DNode 的实例来显示 SceneKit 场景的内容,如Apple 的文章中所述。

我已经能够使用 SceneKit 节点变换和 SK3DNode 的位置/视口大小来根据需要定位节点和 3D 内容。

接下来,我想在 SpriteKit 场景中显示一些其他精灵,覆盖在 3D 内容之上,但我无法这样做:SK3DNode 的内容始终绘制在顶部。

我尝试指定zPositionSK3DNode 和 SKSpriteNode 的属性,但无济于事。

来自 Apple 关于 SK3DNode 的文档:

使用 SK3DNode 对象将 3D SceneKit 内容合并到基于 SpriteKit 的游戏中。当 SpriteKit 渲染节点时,SceneKit 场景首先被动画化并渲染。然后将此渲染图像合成到 SpriteKit 场景中。使用 scnScene 属性指定要渲染的 SceneKit 场景。

(强调我的)

关于 z 顺序有点含糊(它似乎只提到渲染发生的时间顺序)。

我在 GitHub 上整理了一个最小的演示项目;相关代码是:

1.SceneKit场景

import SceneKit
class SceneKitScene: SCNScene {

    override init() {
        super.init()

        let box …
Run Code Online (Sandbox Code Playgroud)

ios scenekit sprite-kit

4
推荐指数
1
解决办法
337
查看次数