接入jpush-ios-3.0.8-release版本SDK之后抠刺,運行報錯:
did Fail To Register For Remote Notifications With Error: Error Domain=NSCocoaErrorDomain Code=3000 "未找到應(yīng)用程序的“aps-environment”的授權(quán)字符串" UserInfo={NSLocalizedDescription=未找到應(yīng)用程序的“aps-environment”的授權(quán)字符串}
Not get deviceToken yet.
?Maybe: your certificatenotconfigured APNs?
orcurrent network isnotso good so APNs registration failed?
orthere is no APNsregistercode? Please refer to JPush docs.
檢查證書之后發(fā)現(xiàn)塔淤,描述性文件失效 ?iOS Provisioning Profiles (Development)
原因:該app的iOS App ID是在接推送SDK之前生成的,原先不具備推送功能速妖,描述性文件也是原來生成的高蜂;創(chuàng)建推送證書之后,APP具備推送功能罕容,但是描述性文件失效了备恤,需要重新編輯一下挺举,下載安裝。
項目中選擇開啟Push Notifications烘跺,報錯:
原因:創(chuàng)建項目時,自動生成了bundled:ccc.CFJPush脂崔,但是修改時只修改了info.plist文件滤淳,導致項目的boudleId修改不徹底,在Build Settings里面搜索ccc.CFJPush砌左,找到后修改成當前正確的bundled
接入SDK后發(fā)現(xiàn)脖咐,雖然能接收到推送的消息,但是走不到JPUSHRegisterDelegate的回調(diào)方法(支持iOS10以上的設(shè)備)因為Xcode7不支持iOS10新特性汇歹,測試設(shè)備系統(tǒng)是iOS11.2.1
適配iOS10新特性屁擅,需要UserNotifications.framework庫,但是Xcode7項目中沒有這個庫产弹,于是天真地從Xcode9項目下拷貝過來使用派歌,但是發(fā)現(xiàn)不能用,會報錯:
ld: unexpected token: !tapi-tbd-v2 file '/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS9.3.sdk/System/Library/Frameworks//UserNotifications.framework/UserNotifications.tbd' for architecture arm64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
還是得升級Xcode痰哨,才能使用推送通知的iOS10新特性胶果。
最后決定將Xcode7創(chuàng)建的項目挪到另一臺電腦的Xcode9下運行。
運行報錯:compiling IB documents for earlier than ios 7 is no longer supported
解決方案:
將所有的xib 和 storyboard文件逐個修改斤斧,選中View早抠,builds for 改成 iOS7.1 and Later
之后運行又遇到一個證書問題,但是項目中配置的證書是正確的:
/Users/用戶名/Library/Developer/Xcode/DerivedData/CFJPush-gkytxdwouevpihashhckqnieucve/Build/Products/Debug-iphoneos/CFJPush.app: unknown error -1=ffffffffffffffff
Command /usr/bin/codesign failed with exit code 1
但是撬讽,電腦上原本就安裝好了證書蕊连,重新將Xcode7電腦上導出的.p12證書,運行安裝到鑰匙串發(fā)現(xiàn)出錯:
解決方案:選中登錄游昼,將鑰匙串鎖定后甘苍,再打開。
證書順利導入到鑰匙串烘豌,編譯項目不再報錯羊赵,Xcode9能順利讀取鑰匙串中的證書,證書問題其實是個意外扇谣。
運行到真機又一個意外昧捷,Xcode9不支持iOS11.2.1(15C153):
This iPhone 6 is running iOS 11.2.1 (15C153), which may not be supported by this version of Xcode.
直接下載Xcode9.2下的iOS11.2(15C107):https://pan.baidu.com/s/1qZvudUc? 密碼:3122
打開應(yīng)用程序-選中Xcode9-右鍵顯示包內(nèi)容-查找下列目錄Contents/Developer/Platforms/iPhoneOS.platform/DeviceSupport,將新的測試包替換此目錄下原來的測試包 - 重啟Xcode9-成功運行到真機
解決JPush角標顯示的問題
收到推送之后罐寨,角標默認顯示1靡挥,不做處理情況下(即使已經(jīng)讀取推送內(nèi)容)不會自動消失,不會自動增長
1. 讓角標消失鸯绿,可以在程序進入前臺時處理:只需兩行代碼
找到AppDelegate.m文件中 -?(void)applicationWillResignActive:(UIApplication?*)application 方法
-?(void)applicationWillResignActive:(UIApplication?*)application?{
//1---重置JPush服務(wù)器上面的badge值
//如果下次服務(wù)端推送badge傳"+1",則會在你當時JPush服務(wù)器上該設(shè)備的badge值的基礎(chǔ)上+1跋破;
[JPUSHService?setBadge:0];
//2---apple自己的接口簸淀,變更應(yīng)用本地(icon)的badge值;
[[UIApplication?sharedApplication]?setApplicationIconBadgeNumber:0];
}
2. 讓角標自增毒返,在JPush服務(wù)器發(fā)送通知時租幕,點開可選設(shè)置,注意?badge傳"+1"拧簸,默認狀態(tài)下是1
JPush推送消息可以有“發(fā)送通知”和“自定義消息”兩種形式
“發(fā)送通知”形式發(fā)送劲绪,當設(shè)備處于鎖屏、App被殺死或者App處于后臺時盆赤,都能正常收到推送的消息贾富;當App處于前臺時,雖然Jpush服務(wù)器顯示收到消息牺六,但消息不會以橫幅颤枪、聲音形式展示
如何在APP處于活躍狀態(tài)時,讓用戶明確收到推送消息淑际?如下兩種方式
自己封裝的收到遠程消息后的處理邏輯
-?(void)dealNotificationWithUserInfo:(NSDictionary?*)userInfo{
self.notificationCount?++;
NSLog(@"self.notificationCount:%ld",self.notificationCount);
[UIApplication?sharedApplication].applicationIconBadgeNumber?=?self.notificationCount;
//??遠程推送畏纲,只能服務(wù)器來修改badge的值
//?在JPush平臺發(fā)送通知時的可選設(shè)置中?+1,則正常顯示春缕,默認為1 上報badge
[JPUSHService?setBadge:+1];
//?==============================================================
// 1 --?應(yīng)用處于前臺收到推送的時候轉(zhuǎn)成本地通知霍骄,效果跟其他狀態(tài)下一致
//?==============================================================
if?([UIApplication?sharedApplication].applicationState?==?UIApplicationStateActive)?{
UILocalNotification?*notification?=?[[UILocalNotification?alloc]?init];
notification.userInfo?=?userInfo;
[[UIApplication?sharedApplication]?presentLocalNotificationNow:notification];
}
//?==============================================================
//?2 -- 在程序活躍狀態(tài)下,程序設(shè)置彈出提示框淡溯,但推送不會以橫幅读整、聲音形式展示
// ==============================================================
//????if?([UIApplication?sharedApplication].applicationState?==?UIApplicationStateActive)?{
//????????NSString?*body?=?userInfo[@"aps"][@"alert"][@"body"];
//????//????NSString?*subtitle?=?userInfo[@"aps"][@"alert"][@"subtitle"];
//????????NSString?*title?=?userInfo[@"aps"][@"alert"][@"title"];
//????????UIAlertView?*alertView?=?[[UIAlertView?alloc]?initWithTitle:title
//????????????????????????????????????????????????????????????message:body
//????????????????????????????????????????????????????????delegate:nil
//??????????????????????????????????????????????????cancelButtonTitle:@"OK"
//??????????????????????????????????????????????????otherButtonTitles:nil];
//????????[alertView?show];
//????}
}
“自定義消息”形式發(fā)送,當App處于活躍狀態(tài)(前臺)時咱娶,設(shè)備能收到的遠程消息米间,需要注冊kJPFNetworkDidReceiveMessageNotification?通知
//? 自己封裝的注冊通知方法,在初始化APNs和JPush之后調(diào)用即可
-?(void)registNotification{
//?注冊通知?收到消息(非APNS)
NSNotificationCenter?*defaultCenter?=?[NSNotificationCenter?defaultCenter];
[defaultCenter?addObserver:self?selector:@selector(networkDidReceiveMessage:)?name:kJPFNetworkDidReceiveMessageNotification?object:nil];
}
// 自定義消息處理邏輯
-?(void)networkDidReceiveMessage:(NSNotification?*)notification?{
NSDictionary?*?userInfo?=?[notification?userInfo];
NSString?*content?=?[userInfo?valueForKey:@"content"];
NSDictionary?*extras?=?[userInfo?valueForKey:@"extras"];? ?//Jpush服務(wù)端傳遞的Extras附加字段膘侮,key是自己定義的
// 代碼在程序活躍狀態(tài)下屈糊,以彈框形式展示消息內(nèi)容
UIAlertView?*alertView?=?[[UIAlertView?alloc]?initWithTitle:@"前端自定義消息"
message:content
delegate:nil
cancelButtonTitle:@"OK"
otherButtonTitles:nil];
[alertView?show];
}
下面說一下 cocos2-x-2.2.6項目,接入上述JPush sdk相關(guān)代碼琼了,使用Xcode9.0運行逻锐,遇到的問題?
Main Thread Checker: UI API called on a background thread: -[UIApplication applicationState]
PID: 294, TID: 15778, Thread name: (none), Queue name: com.apple.root.default-qos.overcommit, QoS: 21
Backtrace: ? .......
解決方案:選中Xcode-Product-Scheme-Edit Scheme-去掉 Main Thread Checker 前的對號
運行時,HttpClient.cpp文件中?curl_easy_cleanup(m_curl); 一行報錯
解決方案:修改HttpClient.cpp 和?HttpResponse.h文件中一些?int類型雕薪、int32_t類型 為long類型昧诱,具體修改內(nèi)容如下:
HttpClient.cpp文件中
HttpResponse.h文件中
CCDataVisitor.h文件 報錯:#include<string> ? ? ? ? ? ? ? ? ? 'string' file ?not found
原因C++與OC混編,自定義的JPushHelper類的頭文件JPushHelper.h被AppController.mm引用所袁,而JPushHelper.m文件后綴未修改盏档。
解決方案:將JPushHelper.m改為JPushHelper.mm
報錯:
duplicate symbol __sisHostDomains in:
? ? /Users/用戶名/Desktop/cocos2d-x-2.2.6/projects/項目名/proj.ios/JPush/jpush-extension-ios-1.1.0.a(JPushExtensionSession.o)
? ? /Users/用戶名/Desktop/cocos2d-x-2.2.6/projects/項目名/proj.ios/JPush/jcore-ios-1.1.7.a(JPUSHAddressController.o)
ld: 1 duplicate symbol for architecture armv7
clang: error: linker command failed with exit code 1 (use -v to see invocation)
開始以為跟上面的警告 xxx was built for newer iOS version(10.0)than being linked(7.0)有關(guān)
修改 項目名下 ?Deployment Target ?6.0? 為??8.0
和 cocos2dx.xcodeproj 下的 iOS Deployment Target iOS 6.0 為 iOS 8.0
無效!T镆蜈亩!
并且會報警告:xxx was built for newer iOS version(10.0)than being linked(8.0)
上述錯誤跟警告無關(guān)懦窘。
后來發(fā)現(xiàn)JPush 版本更新文檔描述中說,需要去掉-ObjC稚配,由于原項目接其他SDK時有加-ObjC畅涂,并且之前接的其他的SDK已經(jīng)不再使用。
解決方案:選中 Build Settings ?~ 搜索 Other Link Flags ~ 刪掉-ObjC
在?Deployment Target 8.0下道川,使用usleep(1000)會報錯:Use of undeclared identifier 'usleep'
解決方案:引入頭文件?#include "unistd.h"
運行安裝到真機時報錯:Could not launch “項目名”
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? iPhone has denied the launch request.
解決方案:重啟Xcode午衰,運行
接收的遠程推送消息中的應(yīng)用名稱顯示錯誤
原因是之前將接入JPush的Demo安裝到手機中,手機接收消息有緩存愤惰,到運行正式項目時,名稱(ICON也可能錯誤)顯示為原來的Demo中的名稱
解決方案:重啟手機赘理,運行