小编fis*_*ear的帖子

iOS8:退出应用后不久出现蓝色条"正在使用您的位置"

我想在后台跟踪时获得蓝色条,但不是时候.

我的应用程序在活动时始终使用位置服务,因此在iOS8中我使用requestWhenInUseAuthorizationon CLLocationManager.通常情况下,应用会在您关闭时停止跟踪您的位置,但用户可以选择让应用跟踪其在后台的位置的选项.因此,我有location对选项UIBackgroundModes中的Info.plist文件.这非常有效:当切换到后台时,应用程序会不断获取位置更新,并显示一个蓝色条,提醒应用程序正在使用位置服务.一切都很完美

但问题是,当用户未选择在后台跟踪时,蓝色条也会出现.在这种情况下,我只需在进入后台时停止AppDelegate的位置更新:

- (void) applicationDidEnterBackground:(UIApplication *)application
{
    if (!trackingInBackground) {
        [theLocationManager stopUpdatingLocation];
    }
}
Run Code Online (Sandbox Code Playgroud)

蓝色条在关闭应用程序后仅显示一秒钟,但它仍然看起来很刺激.

我知道使用requestAlwaysAuthorization而不是requestWhenInUseAuthorization将解决问题,但后来我根本不会得到任何蓝色条,也不会在后台跟踪时实际开启.

我已经尝试过stopUpdatingLocation已经在applicationWillResignActive:方法中,但这没有任何区别.

有没有人知道如何在后台跟踪时获得蓝条,但不是在没有时?

objective-c core-location ios

38
推荐指数
1
解决办法
9124
查看次数

点对点Android和iOS与Wifi直接(多重连接?)

好吧,我正在研究这个应用程序在Android和iOS之间发送数据,我让它在iOS设备与Apple的Multipeer Connectivity框架之间工作,但我目前想知道你是如何在两个平台之间实现它的?即使你愿意从头开始写它.

为什么Firechat能够做到这一点?我记得,您可以使用他们的应用程序在两个平台之间交换数据.

编辑:https://www.opengarden.com/meshkit.html似乎Firechat中使用的MeshKit SDK现在可用(适用于大型组织).

android ios multipeer-connectivity

22
推荐指数
2
解决办法
2万
查看次数

openSSL rsautl和dgst之间的区别

以下命令为输入文件生成签名:

openssl dgst -sha1 -sign privateKey.pem -out signature1 someInputFile
Run Code Online (Sandbox Code Playgroud)

以下命令还会为输入文件生成签名:

openssl dgst -binary -sha1 someInputFile > digest
openssl rsautl -sign -in digest -inkey privateKey.pem -out signature2
Run Code Online (Sandbox Code Playgroud)

据我所知,他们都应该创建文件的SHA1摘要的RSA签名.但它们不会生成相同的签名.

结果,用方法2生成的签名也不能通过openssl dgst -verify调用来验证.

有人知道区别是什么,以及如何克服这种差异?

openssl digital-signature

21
推荐指数
1
解决办法
2万
查看次数

关闭UIScrollView下的模式视图更改

我必须在这里找到一些基本的东西.我打开了一个UIScrollView,它由客户UIScrollViewController(称为DataController)控制.在某个时间点,需要用户输入,所以我从DataController打开一个模态UIViewController:

ElementSelectController *viewController = [[ElementSelectController alloc] initWithNibName:@"ElementSelectController" bundle:nil];
viewController.modalTransitionStyle = UIModalTransitionStyleCoverVertical;
viewController.theDelegate = self;
[self presentModalViewController:viewController animated:YES];
Run Code Online (Sandbox Code Playgroud)

一旦用户准备好模态视图,它将再次被解除.这也发生在DataController中:

[self dismissModalViewControllerAnimated:YES];
Run Code Online (Sandbox Code Playgroud)

一切正常.但是当模态视图消失时,事实证明底层的UIScrollView被调整为全屏,并滚动到位置(0,0).即使是简单的模态视图也是如此,除了被忽略之外什么都不做.显然,我希望UIScrollView保持与模态视图出现之前相同的状态和大小.

我有什么想法我做错了吗?

我在设置UIScrollView框架时检查了堆栈跟踪(通过自定义UIScrollView的setFrame中的断点),看起来它是从以下位置调用的:

-[UITransitionView transition:fromView:toView:]
Run Code Online (Sandbox Code Playgroud)

通过dismissModalViewControllerAnimated调用来调用via.

iphone modal-dialog uiscrollview ios

9
推荐指数
1
解决办法
1590
查看次数

如何使UIScrollView在动画期间发送scrollViewDidScroll消息

当用户手动滚动浏览我的UIScrollView时,我的委托的scrollViewDidScroll方法会在动画期间重复调用,并使用contentOffset的新更新值.当我调用"[scrollView setContentOffset:320 animated:YES"时,则以相同的方式调用委托方法.我认为正常滚动速度对于用户体验来说太快了,所以在"animatedWithDuration:"块中包含了一个"[scrollView setContentOffset:320]",就像Apple在UIView类引用中推荐的那样.

但是......现在我的scrollViewDidScroll方法只在动画开始时被调用一次,带有最终值,而不再是动画期间.当我使用旧的"beginAnimations:"方法时,我得到相同的效果.

那么......有谁知道如何解决这个问题?

顺便说一句,UIScrollView的"setContentOffset"方法显示相同的行为.它曾经在动画中被调用,现在只被调用一次.

iphone animation uiscrollview ios

6
推荐指数
1
解决办法
6511
查看次数

初始缩放后,UIScrollView滚动太远

我的UIScrollView填充了大量内容,然后使用"setZoomScale:animated"进行缩放,使其适合滚动视图框架.视图显示正确缩小,并正确定位在滚动视图中.但是,用户可以在内容之外滚动(滚动视图背景颜色显示).看起来他可以滚动到原始内容大小(就好像内容没有缩小).奇怪的是,在用户第一次手动缩放后,一切正常,滚动视图再次受限于内容大小.

我搜索过网络,浏览了Apple文档和示例,但找不到任何人遇到同样的问题.Apple的例子似乎和我一样.

我的内容是一个自定义视图,它源自UIView,其CALayer被CATiledLayer取代(如Apple示例中所示).我在drawLayer中做的绘图:inContext:.

以下是MyScrollViewController的代码片段:

- (void)loadView {
    CGRect frame = [UIScreen mainScreen].applicationFrame;
    UIScrollView *scrollView = [[UIScrollView alloc] initWithFrame:frame];
    scrollView.maximumZoomScale=1.0;
    scrollView.delegate = self;

    ... setup theContentView ...

    scrollView.contentSize = theContentView.bounds.size;
    scrollView.contentInset = UIEdgeInsetsMake(20, 20, 20, 20);
    [scrollView addSubview:theContentView];
    self.view = scrollView;

    double zoomScale = 0.5; // hardcoded for testing
    [scrollView setZoomScale:zoomScale animated:NO];
NSLog(@"zoomscale=%g contentview=%@ contentsize=%@", zoomScale, NSStringFromCGSize(theContentView.bounds.size), NSStringFromCGSize(scrollView.contentSize));

    [scrollView release];
}

- (UIView *)viewForZoomingInScrollView:(UIScrollView *)scrollView
{
    return theContentView;
}
Run Code Online (Sandbox Code Playgroud)

NSLog语句显示正确设置的contentSize和zoomscale ......

希望有一些明显的东西让我失踪......

iphone scroll zoom uiscrollview ios

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

在drawLayer:inContext期间调用setNeedsDisplayInRect:

我在我的应用程序中使用了CATiledLayer,因此,该图层的绘制是在后台线程中完成的.也就是说,我的委托的drawLayer:inContext:方法是从后台线程调用的.用于使CATiledLayer的部分无效的setNeedsDisplayInRect总是从主线程调用.

因为它们是独立的线程,所以有时候会调用setNeedsDisplayInRect而后台​​线程在drawLayer:inContext方法中.我注意到在那种情况下会忽略setNeedsDisplayInRect(不再调用drawLayer:inContext).

我已经向Apple记录了一个错误,因为我认为这是不正确的.但我很难弄清楚如何解决这种情况.你有好主意吗?

编辑:

我使用以下代码测试了Stanislaw的答案:

- (void) setNeedsDisplayInRect:(CGRect)rect
{
    NSLog(@"setNeedsDisplayInRect:%@", NSStringFromCGRect(rect));
    [super setNeedsDisplayInRect:rect];
}

- (void) drawLayer:(CALayer *)layer inContext:(CGContextRef)gc
{
    CGRect bounds = CGContextGetClipBoundingBox(gc);
    NSLog(@"drawLayer:inContext: bounds=%@", NSStringFromCGRect(bounds));

    dispatch_async(dispatch_get_current_queue(), ^{
        [self setNeedsDisplayInRect:bounds];
    });

    CGContextSetFillColorWithColor(gc, testColor.CGColor);
    CGContextFillRect(gc, bounds);
    sleep(0.2); // simulate the time it takes to draw complicated graphics
    NSLog(@"end drawLayer:inContext: bounds=%@", NSStringFromCGRect(bounds));
}
Run Code Online (Sandbox Code Playgroud)

如上所述,代码确实会导致绘图无限重复,但有时在setNeedsDisplayInRect:和相应的drawLayer:inContext:之间会有5秒的延迟,其中没有其他任何事情发生.请参阅下面的日志作为示例.注意不规则行为:在第一秒中,一些图块被重绘多次,其他图块只重绘一次.然后暂停5秒,循环再次开始.

这是在IOS6.0的模拟器上测试的(我选择那个版本,因为早期版本有另一个在6.0中修复的错误:它们有时会绘制两次相同的图块).

2012-10-27 15:51:38.771 TiledLayerTest[39934:15a13] drawLayer:inContext: bounds={{0, 300}, {300, 180}}
2012-10-27 15:51:38.774 TiledLayerTest[39934:15a13] end drawLayer:inContext: bounds={{0, 300}, {300, 180}}
2012-10-27 15:51:38.774 TiledLayerTest[39934:1570f] drawLayer:inContext: bounds={{300, …
Run Code Online (Sandbox Code Playgroud)

cocoa-touch drawing setneedsdisplayinrect ios

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

防止小负数打印为"-0"

如果我在Objective-C中执行以下操作:

NSString *result = [NSString stringWithFormat:@"%1.1f", -0.01];
Run Code Online (Sandbox Code Playgroud)

它会给出结果 @"-0.0"

@"0.0"在这种情况下,有人知道如何强制结果(没有" - ")吗?

编辑:我尝试使用NSNumberFormatter,但它有同样的问题.以下还产生@"-0.0":

double value = -0.01;
NSNumberFormatter *numberFormatter = [[NSNumberFormatter alloc] init];
[numberFormatter setNumberStyle:NSNumberFormatterDecimalStyle];
[numberFormatter setMaximumFractionDigits:1];
[numberFormatter setMinimumFractionDigits:1];
NSString *result = [numberFormatter stringFromNumber:[NSNumber numberWithDouble:value]];
Run Code Online (Sandbox Code Playgroud)

objective-c zero nsnumber nsstring nsnumberformatter

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

崩溃日志不象征系统库armv7s

我正在尝试分析客户发送给我的崩溃日志,但我无法用它来表示系统库调用.它确实象征着对我自己的方法的调用.分析出现问题并不是很实际.我已经运行'symbolicatecrash -v',看看是什么原因导致缺乏符号化.可能的原因是:

## /Users/baraupp/Library/Developer/Xcode/iOS DeviceSupport/6.1.3 (10B329)/Symbols/usr/lib/system/libsystem_kernel.dylib doesn't contain armv7s slice
Run Code Online (Sandbox Code Playgroud)

我用'lipo'检查了上面提到的库,它说它们包含'armv7'但没有'armv7s'.在搜索网络后,发现这是iPhone 4和iPhone 5之间的区别.正常的解决方案似乎是插入iPhone 5设备并从那里下载库.但我没有iPhone 5.

谁知道怎么解决这个问题?

为了让您了解符号的外观:

Thread 0 Crashed:
0   libsystem_kernel.dylib          0x3bab0350 0x3ba9f000 + 70480
1   libsystem_c.dylib               0x3ba26fb2 0x3b9f8000 + 192434
2   libsystem_c.dylib               0x3ba63366 0x3b9f8000 + 439142
3   libc++abi.dylib                 0x3b00bdda 0x3b008000 + 15834
4   libc++abi.dylib                 0x3b009094 0x3b008000 + 4244
5   libobjc.A.dylib                 0x3b5bca58 0x3b5b4000 + 35416
6   libc++abi.dylib                 0x3b009118 0x3b008000 + 4376
7   libc++abi.dylib                 0x3b0091b0 0x3b008000 + 4528
8   libc++abi.dylib                 0x3b00a626 0x3b008000 + 9766
9   libobjc.A.dylib                 0x3b5bc9b0 0x3b5b4000 …
Run Code Online (Sandbox Code Playgroud)

xcode symbolicate symbolicatecrash armv7 ios

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

CGImageRef属性保留或不保留

我有一个关于如何处理CGImageRef作为类的综合属性的问题.如果我定义CGImageRef

@property (nonatomic, retain) CGImageRef image;
Run Code Online (Sandbox Code Playgroud)

然后编译器抱怨这里不能使用"retain".如果我省略保留,那么我假设使用"assign",我需要在设置属性时自行保留:

self.image = CGImageRetain ( cgimage );
Run Code Online (Sandbox Code Playgroud)

然后我在运行Analyze时收到"潜在泄漏"警告.我能安全地忽略这个警告吗?或者,即使在属性定义中没有指定"retain",合成代码仍会执行隐式CGRetain吗?

objective-c retain ios cgimageref

3
推荐指数
1
解决办法
3383
查看次数

Swift 能做 Objective-C 能做的一切吗?

我是IOS开发新手,想使用该Swift语言而不是Objective-C.

我知道的概念很少Cocoa touch,我想知道:可以Swift做所有Objective-C可以做的事情吗?

objective-c swift

3
推荐指数
1
解决办法
721
查看次数

无权读取 iCloud Drive 文件

我试图让我的应用程序能够打开 iCloud Drive 文件,当用户点击 Apple“文件”应用程序中的文件并选择我的应用程序以查看它时。一切都设置得很好,这样应用程序被打开,并在用户点击文件时通知。但是无法打开该文件,错误是该应用程序无权这样做。

我的应用程序将“支持打开文档到位”Info.plist设置为“是”。这意味着 URL 指向应用程序外部的 iCloud 目录,这可能是问题的原因。如果我将其设置为 NO,则 URL 是应用程序内文件的副本,并且一切正常。但该应用程序需要该设置为 YES。

我已经验证过,该文件实际上存在于手机上。

有谁知道如何使这项工作?

我的openURL:方法目前看起来像:

- (BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary<UIApplicationOpenURLOptionsKey,id> *)options
{
    NSLog(@"path=%@", url);
    NSError *error = nil;
    NSData *data = [[NSData alloc] initWithContentsOfURL:url options:0 error:&error];
    NSLog(@"error=%@", error);
}
Run Code Online (Sandbox Code Playgroud)

给出的错误是:

错误域=NSCocoaErrorDomain 代码=257“无法打开文件“Kili.gpx”,因为您没有查看它的权限。UserInfo={NSFilePath=/private/var/mobile/Library/Mobile Documents/com~apple~CloudDocs/Kili.gpx, NSUnderlyingError=0x283ac83f0 {Error Domain=NSPOSIXErrorDomain Code=1“不允许操作”}}

ios icloud-drive

3
推荐指数
1
解决办法
946
查看次数

自动引用计数(ARC)和retainCount

我正在将我的项目转换为使用ARC,并遇到了一个特殊问题.我有一个类来管理从网络下载的文件缓存.每个文件都存储在iPhone文件系统中,相关对象保存在我的管理器类中.其他想要使用文件的对象,请求我的经理获取缓存对象,并在需要该文件时保留该文件.

但偶尔,经理会清理缓存,删除旧文件.当然,它不应该删除当时正在使用的文件.在ARC之前,我通过使用关联对象的retainCount检测到:

// if retainCount is 1 then only the cache has a reference to it
if( obj.retainCount <= 1 ) {
    [obj deleteFile];
    [cache removeObject:obj];
}
Run Code Online (Sandbox Code Playgroud)

这完全有效[是的,我知道有关retainCount不可靠的警告,但根据我的经验,如果retainCount> 1,你肯定知道不止一个对象保留了它]

但是,使用ARC时,不允许再使用retainCount.我可以引入自己的保留计数机制,并要求所有使用文件的对象明确保留和释放文件对象.但那是错误的,而且这正是ARC应该解决的问题.

你知道更好的方法来实现同样的目标吗?

cocoa-touch objective-c retaincount ios5 automatic-ref-counting

2
推荐指数
1
解决办法
2610
查看次数