我想在后台跟踪时获得蓝色条,但不是时候.
我的应用程序在活动时始终使用位置服务,因此在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:方法中,但这没有任何区别.
有没有人知道如何在后台跟踪时获得蓝条,但不是在没有时?
好吧,我正在研究这个应用程序在Android和iOS之间发送数据,我让它在iOS设备与Apple的Multipeer Connectivity框架之间工作,但我目前想知道你是如何在两个平台之间实现它的?即使你愿意从头开始写它.
为什么Firechat能够做到这一点?我记得,您可以使用他们的应用程序在两个平台之间交换数据.
编辑:https://www.opengarden.com/meshkit.html似乎Firechat中使用的MeshKit SDK现在可用(适用于大型组织).
以下命令为输入文件生成签名:
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调用来验证.
有人知道区别是什么,以及如何克服这种差异?
我必须在这里找到一些基本的东西.我打开了一个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.
当用户手动滚动浏览我的UIScrollView时,我的委托的scrollViewDidScroll方法会在动画期间重复调用,并使用contentOffset的新更新值.当我调用"[scrollView setContentOffset:320 animated:YES"时,则以相同的方式调用委托方法.我认为正常滚动速度对于用户体验来说太快了,所以在"animatedWithDuration:"块中包含了一个"[scrollView setContentOffset:320]",就像Apple在UIView类引用中推荐的那样.
但是......现在我的scrollViewDidScroll方法只在动画开始时被调用一次,带有最终值,而不再是动画期间.当我使用旧的"beginAnimations:"方法时,我得到相同的效果.
那么......有谁知道如何解决这个问题?
顺便说一句,UIScrollView的"setContentOffset"方法显示相同的行为.它曾经在动画中被调用,现在只被调用一次.
我的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 ......
希望有一些明显的东西让我失踪......
我在我的应用程序中使用了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) 如果我在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) 我正在尝试分析客户发送给我的崩溃日志,但我无法用它来表示系统库调用.它确实象征着对我自己的方法的调用.分析出现问题并不是很实际.我已经运行'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) 我有一个关于如何处理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吗?
我是IOS开发新手,想使用该Swift语言而不是Objective-C.
我知道的概念很少Cocoa touch,我想知道:可以Swift做所有Objective-C可以做的事情吗?
我试图让我的应用程序能够打开 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“不允许操作”}}
我正在将我的项目转换为使用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
ios ×9
objective-c ×5
iphone ×3
uiscrollview ×3
cocoa-touch ×2
android ×1
animation ×1
armv7 ×1
cgimageref ×1
drawing ×1
icloud-drive ×1
ios5 ×1
modal-dialog ×1
nsnumber ×1
nsstring ×1
openssl ×1
retain ×1
retaincount ×1
scroll ×1
swift ×1
symbolicate ×1
xcode ×1
zero ×1
zoom ×1