Vik*_*kko 5 iphone delegates rhomobile cllocationmanager ios
我试图使用rhomobile框架让iphone的指南针工作.我已经完成了rhomobile部分,创建了一个在iphone上调用本机方法的工作包装器,但是我无法让事件发挥作用.
Locationmanager.h
#import <UIKit/UIKit.h>
#import <CoreLocation/CoreLocation.h>
@interface locationController : NSObject <CLLocationManagerDelegate>
{
CLLocationManager *locationManager;
}
@property (strong, nonatomic) CLLocationManager *locationManager;
- (id)init;
- (void)dealloc;
@end
Run Code Online (Sandbox Code Playgroud)
Locationmanager.m
#import "Locationmanager.h"
#include "ruby/ext/rho/rhoruby.h"
//store the values
double gx, gy, gz, gth;
//init location
locationController *lc;
@implementation locationController
@synthesize locationManager;
- (id)init {
if (self = [super init]) {
self.locationManager = [[CLLocationManager alloc] init];
NSLog(@"%@", [CLLocationManager headingAvailable]? @"\n\nHeading available!\n" : @"\n\nNo heading..\n");
NSLog(@"%@", [CLLocationManager locationServicesEnabled]? @"\n\nLocation available!\n" : @"\n\nNo location..\n");
// check if the hardware has a compass
if ([CLLocationManager headingAvailable] == NO) {
// No compass is available. This application cannot function without a compass,
// so a dialog will be displayed and no magnetic data will be measured.
locationManager = nil;
UIAlertView *noCompassAlert = [[UIAlertView alloc] initWithTitle:@"No Compass!" message:@"This device does not have the ability to measure magnetic fields." delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil];
[noCompassAlert show];
[noCompassAlert release];
NSLog(@"\n***** ERROR *****\n No compass found !!!");
} else {
// setup delegate callbacks
locationManager.delegate = self;
// heading service configuration
locationManager.headingFilter = kCLHeadingFilterNone;
// location service configuration
locationManager.distanceFilter = kCLDistanceFilterNone;
locationManager.desiredAccuracy = kCLLocationAccuracyNearestTenMeters;
//start location services
[locationManager startUpdatingLocation];
// start the compass
[locationManager startUpdatingHeading];
}
return self;
}
}
- (void)dealloc {
[super dealloc];
// Stop the compass
[locationManager stopUpdatingHeading];
[locationManager release];
}
// This delegate method is invoked when the location manager has heading data.
- (void)locationManager:(CLLocationManager *)manager didUpdateHeading:(CLHeading *)heading {
NSLog(@"\n\n***** New magnetic heading *****\n %f\n", heading.magneticHeading);
NSLog(@"\n\n***** New true heading *****\n %f\n", heading.trueHeading);
gx = heading.x;
gy = heading.y;
gz = heading.z;
gth = heading.trueHeading;
}
// This delegate method is invoked when the location managed encounters an error condition.
- (void)locationManager:(CLLocationManager *)manager didFailWithError:(NSError *)error {
if ([error code] == kCLErrorDenied) {
// This error indicates that the user has denied the application's request to use location services.
NSLog(@"\n ***** ERROR *****\n Location not allowed!");
[locationManager stopUpdatingHeading];
} else if ([error code] == kCLErrorHeadingFailure) {
NSLog(@"\n ***** ERROR *****\n Magnetic interference or something!");
}
}
@end
//ruby wrappers
void locationmanager_init(void) {
// make sure we can only start this method once
static bool started = false;
if(!started) {
// Initialize the Objective C accelerometer class.
lc = [[locationController alloc] init];
started = true;
}
}
void locationmanager_get_heading(double *x, double *y, double *z, double *th) {
NSLog(@"\n ***** DEBUGGER *****\n Getting heading x: %f, y: %f, z: %f, heading: %f", gx, gy, gz, gth);
*x = gx;
*y = gy;
*z = gz;
*th = gth;
}
Run Code Online (Sandbox Code Playgroud)
我在带有iOS 5.1的iphone 4上运行代码,在控制台中我可以看到init的调试消息,但我从未看到didUpdateHeading委托的调试消息.有人知道我错过了什么吗?
UPDATE
我想我需要在后台线程中运行我的代码才能使其正常工作.目前,locationmanager_init初始化+离开代码,因此它不活动,并且不会触发事件.任何人都有一个简单的解决方案在后台初始化它以保持活动状态?
更新2
返回id,使用self = [super init],仍然没有修复:(
GitHub代码 使用locationmanager_init初始化,使用locationmanager_get_heading检索数据
小智 14
你必须CLLocationManager在主线程上初始化,在这里检查这个SO ,或者从具有活动运行循环的线程运行它,在这里检查这个,来自Apple文档:
Configuration of your location manager object must always occur on a thread with
an active run loop, such as your application’s main thread.
Run Code Online (Sandbox Code Playgroud)
确保您locationController和CCLocationManager它的内部在初始化后仍然存在,请在此处查看.我可能在这里错了,但是根据你的Github代码,似乎*lc变量在自动释放池中被释放了.尝试额外保留.
lc = [[[locationController alloc] init] retain];
Run Code Online (Sandbox Code Playgroud)
我猜这是你问题的原因.如果对象被释放,您将不会得到任何更新.
与问题无关但是:
你应该拨打[super dealloc]最后但不是第一个,在这里查看这个
将return语句放在最后一个括号之前的init方法中,而不是在倒数第二个之前.
...
// start the compass
[locationManager startUpdatingHeading];
}
}
return self;
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
5415 次 |
| 最近记录: |