我最近一直在构建一个应用程序,[NSUserDefaults standartdUserDefaults]用于存储本地各种信息(关于会话,用户首选项等).
现在我将我的项目的子部分导出为iOS框架(目标是制作SDK).
我正在生成一个MyKit.framework和MyKit.bundle,以便在第三方应用程序中导入(该软件包包含Storyboards,Localizable.strings和.xcassets).
目前,我确保MyKit.framework使用的资源是从MyKit.bundle范围加载的,而不是[NSBundle mainBundle],以避免与第三方应用程序中的资源冲突.
现在,NSUserDefault如果在框架和目标应用程序之间共享某些键,也会导致冲突.
是- initWithSuiteName:围绕着相应的工作?我可以给一个范围NSUserDefaults吗?我应该创建一个包装器来访问自定义NSUserDefaults域吗?
我目前正在研究有很多(10+)目标的项目.这是一个白色品牌的应用程序,每个目标专用于客户,所有目标共享完全相同的代码,但编译不同的资源(特别是.xcsassets).
我想将Apple Watch集成到我的项目中,只是为了在手表上启用通知.它需要添加2个目标,Watchkit Extension和App.(注意:WatchKit App目标将链接到相同的.xcassets,而不是相关的iPhone App来继承AppIcon).
虽然只有少数目标的项目是可以的,但在我的情况下这实际上并不实用.在我的subversion文件夹中创建了很多新文件,.plist,并使目标列表非常庞大.
是否可以向所有客户分享这2个额外目标?也许通过使用脚本使WatchKit应用程序/扩展目标自动匹配(更新目标名称,包ID等)可能会构建方案/ iOs目标?
任何想法都会受到欢迎.
目前我有自定义UITableViewCells的新闻源,例如:
NewsCell.m
NewsCell.xib
NewsCell_Friends.m
NewsCell_Friends.xib
NewsCell_CheckinPhoto.m
NewsCell_CheckinPhoto.xib
Run Code Online (Sandbox Code Playgroud)
[...]
NewsCell_Friends和NewsCell_Checkin继承了NewsCell(所有子类共享的方法和元素,如titleLabel,dateLabel)
目前,我从未使用过NewsCell类本身,只使用子类,因为每种新闻都有一个非常独特的布局(Xib).
现在让我们说,我希望在我的新闻源的UI方面有一个简单的实现,其中所有单元格具有相同的外观,相同的高度,相同的内容:titleLabel和dateLabel.(例如实际上是通知提要).
我想要做的是重新使用NewsCell.xib作为每种类型新闻的独立消息,例如下面:
NewsCell_CheckinPhoto *cell = [tableView dequeueReusableCellWithIdentifier:@"CheckinPhoto"];
if (!cell){
UIViewController *c = [[UIViewController alloc] initWithNibName:@"NewsCell" bundle:nil];
cell = (NewsCell_CheckinPhoto *)c.view;
cell.parent = self;
}
[cell configureCell:indexPath withNews:news];
return cell;
Run Code Online (Sandbox Code Playgroud)
在cellForRowAtIndexPath委托方法中.
请注意,我在此控制器中使用的是NewsCell xib而不是NewsCell_CheckinPhoto xib.
但它不起作用:nib文件加载良好,NewsCell.xib的内容很好地显示在单元格中,但标签的配置(例如,titleLabel.text = @"Robert拍了一张照片")在NewsCell_CheckinPhoto中阶级既不工作也不称呼.
它仅在我在NewsCell.xib文件中指定类类型*NewsCell_CheckinPhoto*时才有效,但这不允许我重复使用NewsCell.xib来呈现具有样本和唯一表示的NewsCell的每个子类.
我知道这个的主要目的
-(void)locationManager:(CLLocationManager*)manager
didRangeBeacons:(NSArray*)beacons
inRegion:(CLBeaconRegion*)region
Run Code Online (Sandbox Code Playgroud)
是应用程序在前台工作.
在后台,
- (void)locationManager:(CLLocationManager*)manager didEnterRegion:(CLRegion *)region
Run Code Online (Sandbox Code Playgroud)
用于检测信标但没有所需的信息(来自CLBeacons的次要和主要ID以提供上下文信息).
我知道CLLocationManager中的委托方法允许在后台运行简短的代码.
是否有可能做到这样的事情: - 在进入区域时开始在背景中简短地开始范围信标 - 根据次要/主要ID在后台调用web服务 - 调度使用webservice的返回结果配置的UILocalNotification
- (void)locationManager:(CLLocationManager*)manager didEnterRegion:(CLRegion *)region
{
if (![region isKindOfClass:[CLBeaconRegion class]]) return;
[locationManager startRangingBeaconsInRegion:(CLBeaconRegion*)region];
}
Run Code Online (Sandbox Code Playgroud)
然后 :
-(void)locationManager:(CLLocationManager*)manager
didRangeBeacons:(NSArray*)beacons
inRegion:(CLBeaconRegion*)region
{
if (beacons.count == 0) return;
CLBeacon *foundBeacon = [sortedBeacons firstObject];
// DO STUFF IN BACKGROUND
if ([[UIApplication sharedApplication] applicationState] != UIApplicationStateActive){
//Call for a webservice according to minor /major
//Dispatch contextual notification
// ^success(...)
UILocalNotification * theNotification = [[UILocalNotification alloc] init];
theNotification.alertBody …Run Code Online (Sandbox Code Playgroud) 在iOS上将其上载到服务器之前优化图像权重的最佳做法是什么?
图像可以来自用户的图像库,也可以直接用于UIPicker - 相机模式.
我确实有一些要求:最低上传分辨率和希望的最大上传大小.
假设kMaxUploadSize = 50 kB且kMinUploadResolution = 1136*640
我现在做的是:
while (UIImageJPEGRepresentation(img,1.0).length > MAX_UPLOAD_SIZE){
img = [self scaleDown:img withFactor:0.1];
}
NSData *imageData = UIImageJPEGRepresentation(img,1.0);
-(UIImage*)scaleDown:(UIImage*)img withFactor:(float)f{
CGSize newSize = CGSizeMake(img.size.width*f, img.size.height*f);
UIGraphicsBeginImageContextWithOptions(newSize, YES, 0.0);
[img drawInRect:CGRectMake(0,0,newSize.width,newSize.height)];
UIImage* scaledImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
return scaledImage;
Run Code Online (Sandbox Code Playgroud)
}
每个循环中花费的时间非常多,几秒钟,这导致在将图像有效地发送到服务器之前有很长的延迟.
任何方法/想法/策略?
非常感谢 !
我使用ZXing作为应用程序,这主要是与ZXing原始代码相同的代码,除了我允许连续扫描几次(即,一旦检测到某些东西,ZXingWidgetController就不会被解雇).
当我按下调用的关闭按钮时,我会经历长时间的长时间冻结(有时它永远不会结束)
- (void)cancelled {
// if (!self.isStatusBarHidden) {
// [[UIApplication sharedApplication] setStatusBarHidden:NO];
// }
[self stopCapture];
wasCancelled = YES;
if (delegate != nil) {
[delegate zxingControllerDidCancel:self];
}
}
Run Code Online (Sandbox Code Playgroud)
同
- (void)stopCapture {
decoding = NO;
#if HAS_AVFF
if([captureSession isRunning])[captureSession stopRunning];
AVCaptureInput* input = [captureSession.inputs objectAtIndex:0];
[captureSession removeInput:input];
AVCaptureVideoDataOutput* output = (AVCaptureVideoDataOutput*)[captureSession.outputs objectAtIndex:0];
[captureSession removeOutput:output];
[self.prevLayer removeFromSuperlayer];
/*
// heebee jeebees here ... is iOS still writing into the layer?
if (self.prevLayer) {
layer.session = nil;
AVCaptureVideoPreviewLayer* layer = prevLayer; …Run Code Online (Sandbox Code Playgroud) 根据我的理解,信标中的次要和主要ID用于分段(例如,主要用于实体店,而次要用于给定商店内的不同位置).
然后,由于信标不能提供丰富的有效载荷,我想这些ID将被利用来为用户提供足够的信息 - 并且可能通过web服务.
最后,据说UUID适用于整个舰队.根据我的理解,应用程序(例如零售商店)可能只注册一个或几个UUID(通常是一个,更多用于复杂的架构或服务过载).
在应用程序级别,您可以(1)当应用程序是前景时的信标范围(具有次要/主要ID的捕获功能),以及(2)monitoringForRegion:在后台+ 检测区域退出/进入()时提供UILocalNotification以唤醒app(回到(1)).
现在让我们来处理最终用户.我认为我们可以假设平均不会通过手中的应用程序通过整个零售商店,并且更有可能让它在后台运行.因此,情况(2)将是最常见的情况.但是,由于所有发射器将共享相同的UUID,并且在后台运行的地理定位管理器正在监视链接到UUID的区域,因此根据发射器的范围/配置,didEnter和didExit区域委托方法存在风险,无法智能触发.最后,并非所有想要向您的客户广播的室内基于位置的广告都将被接收和捕获.实际上,我担心只有客户到达商店位置时才会系统地建议(在后台模式环境中).
我错过了什么吗?
ios ×7
iphone ×3
ibeacon ×2
objective-c ×2
apple-watch ×1
background ×1
bluetooth ×1
frameworks ×1
image ×1
performance ×1
sdk ×1
target ×1
uitableview ×1
upload ×1
watchkit ×1
xcode-6.2 ×1
zxing ×1