我正在为 ios 使用 facebook sdk 3.0.8。当我尝试使用 Facebook 登录时,它工作正常,但有时当我在注销后尝试登录时,应用程序崩溃了。
这里是异常消息
*** Assertion failure in -[FBSession close], /Users/jacl/src/ship/ios-sdk/src/FBSession.m:342
你能告诉我哪里错了吗?
这是 AppDelegate 中的代码
- (BOOL)application:(UIApplication *)application
openURL:(NSURL *)url
sourceApplication:(NSString *)sourceApplication
annotation:(id)annotation {
// attempt to extract a token from the url
return [FBSession.activeSession handleOpenURL:url];
}
- (void)applicationWillTerminate:(UIApplication *)application {
[self.session close];
}
#pragma mark Template generated code
// FBSample logic
// It is possible for the user to switch back to your application, from the native Facebook application,
// when the user is part-way through a login; You can check for the FBSessionStateCreatedOpenening
// state in applicationDidBecomeActive, to identify this situation and close the session; a more sophisticated
// application may choose to notify the user that they switched away from the Facebook application without
// completely logging in
- (void)applicationDidBecomeActive:(UIApplication *)application {
/*
Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface.
*/
// FBSample logic
// this means the user switched back to this app without completing a login in Safari/Facebook App
if (self.session.state == FBSessionStateCreatedOpening) {
// BUG: for the iOS 6 preview we comment this line out to compensate for a race-condition in our
// state transition handling for integrated Facebook Login; production code should close a
// session in the opening state on transition back to the application; this line will again be
// active in the next production rev
//[self.session close]; // so we close our session and start over
}
}
代码在 View Controller 中
-(IBAction)connectWithFacebook{
DemoAppDelegate *appDelegate = (TotallyCuteAppDelegate *) [[UIApplication sharedApplication]delegate];
if (!appDelegate.session.isOpen && (appDelegate.session.state != FBSessionStateCreated))
{
appDelegate.session = [[FBSession alloc] init];
}
NSArray *permissions = [[NSArray alloc] initWithObjects:
@"publish_actions",
@"email",
nil];
//app crashes here
[FBSession openActiveSessionWithPermissions:permissions allowLoginUI:YES
completionHandler:^(FBSession *session, FBSessionState status, NSError *error) {
if (session.isOpen)
{
NSLog(@"LoginVC->Session is open");
appDelegate.session=session;
[userDefaults setObject:appDelegate.session.accessToken forKey:@"facebook_token"];
[userDefaults setObject:paramFBId forKey:@"facebook_id"];
}
else
{
NSLog(@"LoginVC->Session is not open");
}
}//end completionHandler
];
}
-(IBAction)logout:(id)sender{
DemoAppDelegate *appDelegate = (TotallyCuteAppDelegate *) [[UIApplication sharedApplication]delegate];
if (appDelegate.session.isOpen) {
[appDelegate.session closeAndClearTokenInformation];
[[NSUserDefaults userDefaults] removeObjectForKey:@"facebook_id"];
[[NSUserDefaults userDefaults] removeObjectForKey:@"facebook_token"];
}
}
编辑:
删除了以下代码,现在可以正常工作了
if (!appDelegate.session.isOpen && (appDelegate.session.state != FBSessionStateCreated))
{
appDelegate.session = [[FBSession alloc] init];
}
这里是更新的代码
-(IBAction)connectWithFacebook{
if ([InternetChecker isConnected])
{
DemoAppDelegate *appDelegate = (TotallyCuteAppDelegate *) [[UIApplication sharedApplication]delegate];
/* Removed following if block
if (!appDelegate.session.isOpen && (appDelegate.session.state != FBSessionStateCreated))
{
appDelegate.session = [[FBSession alloc] init];
}
*/
NSArray *permissions = [[NSArray alloc] initWithObjects:
@"publish_actions",
@"email",
nil];
[FBSession openActiveSessionWithPermissions:permissions allowLoginUI:YES
completionHandler:^(FBSession *session, FBSessionState status, NSError *error) {
if (session.isOpen)
{
NSLog(@"LoginVC->Session is open");
appDelegate.session=session;
[userDefaults setObject:appDelegate.session.accessToken forKey:@"facebook_token"];
[userDefaults setObject:paramFBId forKey:@"facebook_id"];
}
else
{
NSLog(@"LoginVC->Session is not open);
}
}//end completionHandler
];
}
}
最佳答案
查看FBSession.m,close中的断言如下:
NSAssert(self.affinitizedThread == [NSThread currentThread], @"FBSession: should only be used from a single thread");
您是否从创建 session 的线程以外的线程调用 -close?
进一步研究。你在滥用 API。你正在创造
appDelegate.session = [[FBSession alloc] init];
但是你在打电话
[FBSession openActiveSessionWithPermissions ...
这会创建一个全新的 session 。这意味着您从未打开过 appDelegate.session,因此您不应尝试关闭它。你应该做的是:
[FBSession openActiveSessionWithPermissions ...
appDelegate.session = [FBSession activeSession];
另一种选择是:
appDelegate.session = [[FBSession alloc] init];
[appDelegate.session openWithCompletionHandler: ...
关于ios - Facebook iOS SDK,针对 FBSession 的异常,*** 断言失败 -[FBSession 关闭],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13228372/
我正在学习Rails,并阅读了关于乐观锁的内容。我已将类型为integer的lock_version列添加到我的articles表中。但现在每当我第一次尝试更新记录时,我都会收到StaleObjectError异常。这是我的迁移:classAddLockVersionToArticle当我尝试通过Rails控制台更新文章时:article=Article.first=>#我这样做:article.title="newtitle"article.save我明白了:(0.3ms)begintransaction(0.3ms)UPDATE"articles"SET"title"='dwdwd
我已经构建了一些serverspec代码来在多个主机上运行一组测试。问题是当任何测试失败时,测试会在当前主机停止。即使测试失败,我也希望它继续在所有主机上运行。Rakefile:namespace:specdotask:all=>hosts.map{|h|'spec:'+h.split('.')[0]}hosts.eachdo|host|begindesc"Runserverspecto#{host}"RSpec::Core::RakeTask.new(host)do|t|ENV['TARGET_HOST']=hostt.pattern="spec/cfengine3/*_spec.r
在Cooper的书BeginningRuby中,第166页有一个我无法重现的示例。classSongincludeComparableattr_accessor:lengthdef(other)@lengthother.lengthenddefinitialize(song_name,length)@song_name=song_name@length=lengthendenda=Song.new('Rockaroundtheclock',143)b=Song.new('BohemianRhapsody',544)c=Song.new('MinuteWaltz',60)a.betwee
这里有一个很好的答案解释了如何在Ruby中下载文件而不将其加载到内存中:https://stackoverflow.com/a/29743394/4852737require'open-uri'download=open('http://example.com/image.png')IO.copy_stream(download,'~/image.png')我如何验证下载文件的IO.copy_stream调用是否真的成功——这意味着下载的文件与我打算下载的文件完全相同,而不是下载一半的损坏文件?documentation说IO.copy_stream返回它复制的字节数,但是当我还没有下
我正在尝试解析一个文本文件,该文件每行包含可变数量的单词和数字,如下所示:foo4.500bar3.001.33foobar如何读取由空格而不是换行符分隔的文件?有什么方法可以设置File("file.txt").foreach方法以使用空格而不是换行符作为分隔符? 最佳答案 接受的答案将slurp文件,这可能是大文本文件的问题。更好的解决方案是IO.foreach.它是惯用的,将按字符流式传输文件:File.foreach(filename,""){|string|putsstring}包含“thisisanexample”结果的
我早就知道Ruby中的“常量”(即大写的变量名)不是真正常量。与其他编程语言一样,对对象的引用是唯一存储在变量/常量中的东西。(侧边栏:Ruby确实具有“卡住”引用对象不被修改的功能,据我所知,许多其他语言都没有提供这种功能。)所以这是我的问题:当您将一个值重新分配给常量时,您会收到如下警告:>>FOO='bar'=>"bar">>FOO='baz'(irb):2:warning:alreadyinitializedconstantFOO=>"baz"有没有办法强制Ruby抛出异常而不是打印警告?很难弄清楚为什么有时会发生重新分配。 最佳答案
下面的代码在我第一次运行它时就可以正常工作:require'rubygems'require'spreadsheet'book=Spreadsheet.open'/Users/me/myruby/Mywks.xls'sheet=book.worksheet0row=sheet.row(1)putsrow[1]book.write'/Users/me/myruby/Mywks.xls'当我再次运行它时,我会收到更多消息,例如:/Library/Ruby/Gems/1.8/gems/spreadsheet-0.6.5.9/lib/spreadsheet/excel/reader.rb:11
1.错误信息:Errorresponsefromdaemon:Gethttps://registry-1.docker.io/v2/:net/http:requestcanceledwhilewaitingforconnection(Client.Timeoutexceededwhileawaitingheaders)或者:Errorresponsefromdaemon:Gethttps://registry-1.docker.io/v2/:net/http:TLShandshaketimeout2.报错原因:docker使用的镜像网址默认为国外,下载容易超时,需要修改成国内镜像地址(首先阿里
我正在尝试在Rails上安装ruby,到目前为止一切都已安装,但是当我尝试使用rakedb:create创建数据库时,我收到一个奇怪的错误:dyld:lazysymbolbindingfailed:Symbolnotfound:_mysql_get_client_infoReferencedfrom:/Library/Ruby/Gems/1.8/gems/mysql2-0.3.11/lib/mysql2/mysql2.bundleExpectedin:flatnamespacedyld:Symbolnotfound:_mysql_get_client_infoReferencedf
SPI接收数据左移一位问题目录SPI接收数据左移一位问题一、问题描述二、问题分析三、探究原理四、经验总结最近在工作在学习调试SPI的过程中遇到一个问题——接收数据整体向左移了一位(1bit)。SPI数据收发是数据交换,因此接收数据时从第二个字节开始才是有效数据,也就是数据整体向右移一个字节(1byte)。请教前辈之后也没有得到解决,通过在网上查阅前人经验终于解决问题,所以写一个避坑经验总结。实际背景:MCU与一款芯片使用spi通信,MCU作为主机,芯片作为从机。这款芯片采用的是它规定的六线SPI,多了两根线:RDY和INT,这样从机就可以主动请求主机给主机发送数据了。一、问题描述根据从机芯片手